@@ -68,35 +68,32 @@ impl<'c> Translation<'c> {
68
68
. transpose ( ) ?;
69
69
let weak = weak_id. and_then ( |x| self . convert_constant_bool ( x) ) ;
70
70
71
- fn static_order < T > ( order : Option < T > ) -> T {
71
+ fn static_order ( order : Option < Ordering > ) -> Ordering {
72
72
order. unwrap_or_else ( || {
73
73
// We have to select which intrinsic to use at runtime
74
74
unimplemented ! ( "Dynamic memory consistency arguments are not yet supported" ) ;
75
75
} )
76
76
}
77
77
78
+ fn order_name ( order : Ordering ) -> & ' static str {
79
+ use Ordering :: * ;
80
+ match order {
81
+ SeqCst => "seqcst" ,
82
+ AcqRel => "acqrel" ,
83
+ Acquire => "acquire" ,
84
+ Release => "release" ,
85
+ Relaxed => "relaxed" ,
86
+ _ => unreachable ! ( "Did we not handle a case above??" ) ,
87
+ }
88
+ }
89
+
78
90
match name {
79
91
"__atomic_load" | "__atomic_load_n" => ptr. and_then ( |ptr| {
80
- use Ordering :: * ;
81
- let intrinsic_name = match static_order ( order) {
82
- SeqCst => Some ( "atomic_load" ) ,
83
- AcqRel => None ,
84
- Acquire => Some ( "atomic_load_acq" ) ,
85
- Release => None ,
86
- Relaxed => Some ( "atomic_load_relaxed" ) ,
87
- _ => unreachable ! ( "Did we not handle a case above??" ) ,
88
- }
89
- . ok_or_else ( || {
90
- format_translation_err ! (
91
- self . ast_context
92
- . display_loc( & self . ast_context[ order_id] . loc) ,
93
- "Invalid memory ordering for __atomic_load" ,
94
- )
95
- } ) ?;
92
+ let intrinsic_name = "atomic_load_" . to_owned ( ) + order_name ( static_order ( order) ) ;
96
93
97
94
self . use_feature ( "core_intrinsics" ) ;
98
95
99
- let atomic_load = mk ( ) . abs_path_expr ( vec ! [ "core" , "intrinsics" , intrinsic_name] ) ;
96
+ let atomic_load = mk ( ) . abs_path_expr ( vec ! [ "core" , "intrinsics" , & intrinsic_name] ) ;
100
97
let call = mk ( ) . call_expr ( atomic_load, vec ! [ ptr] ) ;
101
98
if name == "__atomic_load" {
102
99
let ret = val1. expect ( "__atomic_load should have a ret argument" ) ;
@@ -124,27 +121,13 @@ impl<'c> Translation<'c> {
124
121
let val = val1. expect ( "__atomic_store must have a val argument" ) ;
125
122
ptr. and_then ( |ptr| {
126
123
val. and_then ( |val| {
127
- use Ordering :: * ;
128
- let intrinsic_name = match static_order ( order) {
129
- SeqCst => Some ( "atomic_store" ) ,
130
- AcqRel => None ,
131
- Acquire => None ,
132
- Release => Some ( "atomic_store_rel" ) ,
133
- Relaxed => Some ( "atomic_store_relaxed" ) ,
134
- _ => unreachable ! ( "Did we not handle a case above??" ) ,
135
- }
136
- . ok_or_else ( || {
137
- format_translation_err ! (
138
- self . ast_context
139
- . display_loc( & self . ast_context[ order_id] . loc) ,
140
- "Invalid memory ordering for __atomic_store" ,
141
- )
142
- } ) ?;
124
+ let intrinsic_name =
125
+ "atomic_store_" . to_owned ( ) + order_name ( static_order ( order) ) ;
143
126
144
127
self . use_feature ( "core_intrinsics" ) ;
145
128
146
129
let atomic_store =
147
- mk ( ) . abs_path_expr ( vec ! [ "core" , "intrinsics" , intrinsic_name] ) ;
130
+ mk ( ) . abs_path_expr ( vec ! [ "core" , "intrinsics" , & intrinsic_name] ) ;
148
131
let val = if name == "__atomic_store" {
149
132
mk ( ) . unary_expr ( UnOp :: Deref ( Default :: default ( ) ) , val)
150
133
} else {
@@ -164,27 +147,13 @@ impl<'c> Translation<'c> {
164
147
let val = val1. expect ( "__atomic_store must have a val argument" ) ;
165
148
ptr. and_then ( |ptr| {
166
149
val. and_then ( |val| {
167
- use Ordering :: * ;
168
- let intrinsic_name = match static_order ( order) {
169
- SeqCst => Some ( "atomic_xchg" ) ,
170
- AcqRel => Some ( "atomic_xchg_acqrel" ) ,
171
- Acquire => Some ( "atomic_xchg_acq" ) ,
172
- Release => Some ( "atomic_xchg_rel" ) ,
173
- Relaxed => Some ( "atomic_xchg_relaxed" ) ,
174
- _ => unreachable ! ( "Did we not handle a case above??" ) ,
175
- }
176
- . ok_or_else ( || {
177
- format_translation_err ! (
178
- self . ast_context
179
- . display_loc( & self . ast_context[ order_id] . loc) ,
180
- "Invalid memory ordering for __atomic_exchange" ,
181
- )
182
- } ) ?;
150
+ let intrinsic_name =
151
+ "atomic_xchg_" . to_owned ( ) + order_name ( static_order ( order) ) ;
183
152
184
153
self . use_feature ( "core_intrinsics" ) ;
185
154
186
155
let fn_path =
187
- mk ( ) . abs_path_expr ( vec ! [ "core" , "intrinsics" , intrinsic_name] ) ;
156
+ mk ( ) . abs_path_expr ( vec ! [ "core" , "intrinsics" , & intrinsic_name] ) ;
188
157
let val = if name == "__atomic_exchange" {
189
158
mk ( ) . unary_expr ( UnOp :: Deref ( Default :: default ( ) ) , val)
190
159
} else {
@@ -226,22 +195,25 @@ impl<'c> Translation<'c> {
226
195
ptr. and_then ( |ptr| {
227
196
expected. and_then ( |expected| {
228
197
desired. and_then ( |desired| {
229
- let weak = static_order ( weak) ;
198
+ // If this expect fails, we have to select which intrinsic to use at runtime
199
+ let weak = weak. expect (
200
+ "Dynamic memory consistency arguments are not yet supported" ,
201
+ ) ;
230
202
let order = static_order ( order) ;
231
203
let order_fail = static_order ( order_fail) ;
232
204
use Ordering :: * ;
233
205
let intrinsic_name = ( || {
234
206
Some ( match ( order, order_fail) {
235
207
( _, Release | AcqRel ) => return None ,
236
- ( SeqCst , SeqCst ) => "" ,
237
- ( SeqCst , Acquire ) => "_failacq " ,
238
- ( SeqCst , Relaxed ) => "_failrelaxed " ,
239
- ( AcqRel , Acquire ) => "_acqrel " ,
240
- ( AcqRel , Relaxed ) => "_acqrel_failrelaxed " ,
241
- ( Release , Relaxed ) => "_rel " ,
242
- ( Acquire , Acquire ) => "_acq " ,
243
- ( Acquire , Relaxed ) => "_acq_failrelaxed " ,
244
- ( Relaxed , Relaxed ) => "_relaxed " ,
208
+ ( SeqCst , SeqCst ) => "_seqcst_seqcst " ,
209
+ ( SeqCst , Acquire ) => "_seqcst_acquire " ,
210
+ ( SeqCst , Relaxed ) => "_seqcst_relaxed " ,
211
+ ( AcqRel , Acquire ) => "_acqrel_acquire " ,
212
+ ( AcqRel , Relaxed ) => "_acqrel_relaxed " ,
213
+ ( Release , Relaxed ) => "_release_relaxed " ,
214
+ ( Acquire , Acquire ) => "_acquire_acquire " ,
215
+ ( Acquire , Relaxed ) => "_acquire_relaxed " ,
216
+ ( Relaxed , Relaxed ) => "_relaxed_relaxed " ,
245
217
( SeqCst | AcqRel | Release | Acquire | Relaxed , _) => {
246
218
return None
247
219
}
@@ -320,16 +292,8 @@ impl<'c> Translation<'c> {
320
292
"atomic_and"
321
293
} ;
322
294
323
- use Ordering :: * ;
324
- let intrinsic_suffix = match static_order ( order) {
325
- SeqCst => "" ,
326
- AcqRel => "_acqrel" ,
327
- Acquire => "_acq" ,
328
- Release => "_rel" ,
329
- Relaxed => "_relaxed" ,
330
- _ => unreachable ! ( "Unknown memory ordering" ) ,
331
- } ;
332
- let intrinsic_name = format ! ( "{intrinsic_name}{intrinsic_suffix}" ) ;
295
+ let intrinsic_suffix = order_name ( static_order ( order) ) ;
296
+ let intrinsic_name = format ! ( "{intrinsic_name}_{intrinsic_suffix}" ) ;
333
297
334
298
let fetch_first = name. starts_with ( "__atomic_fetch" ) ;
335
299
let val = val1. expect ( "__atomic arithmetic operations must have a val argument" ) ;
0 commit comments