@@ -75,28 +75,25 @@ impl<'c> Translation<'c> {
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 {
@@ -233,15 +202,15 @@ impl<'c> Translation<'c> {
233
202
let intrinsic_name = ( || {
234
203
Some ( match ( order, order_fail) {
235
204
( _, 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 " ,
205
+ ( SeqCst , SeqCst ) => "_seqcst_seqcst " ,
206
+ ( SeqCst , Acquire ) => "_seqcst_acquire " ,
207
+ ( SeqCst , Relaxed ) => "_seqcst_relaxed " ,
208
+ ( AcqRel , Acquire ) => "_acqrel_acquire " ,
209
+ ( AcqRel , Relaxed ) => "_acqrel_relaxed " ,
210
+ ( Release , Relaxed ) => "_release_relaxed " ,
211
+ ( Acquire , Acquire ) => "_acquire_acquire " ,
212
+ ( Acquire , Relaxed ) => "_acquire_relaxed " ,
213
+ ( Relaxed , Relaxed ) => "_relaxed_relaxed " ,
245
214
( SeqCst | AcqRel | Release | Acquire | Relaxed , _) => {
246
215
return None
247
216
}
@@ -320,16 +289,8 @@ impl<'c> Translation<'c> {
320
289
"atomic_and"
321
290
} ;
322
291
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}" ) ;
292
+ let intrinsic_suffix = order_name ( static_order ( order) ) ;
293
+ let intrinsic_name = format ! ( "{intrinsic_name}_{intrinsic_suffix}" ) ;
333
294
334
295
let fetch_first = name. starts_with ( "__atomic_fetch" ) ;
335
296
let val = val1. expect ( "__atomic arithmetic operations must have a val argument" ) ;
0 commit comments