@@ -68,35 +68,31 @@ 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
+ match order {
80
+ SeqCst => "seqcst" ,
81
+ AcqRel => "acqrel" ,
82
+ Acquire => "acquire" ,
83
+ Release => "release" ,
84
+ Relaxed => "relaxed" ,
85
+ _ => unreachable ! ( "Did we not handle a case above??" ) ,
86
+ }
87
+ }
88
+
78
89
match name {
79
90
"__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
- } ) ?;
91
+ let intrinsic_name = "atomic_load_" . to_owned ( ) + order_name ( static_order ( order) ) ;
96
92
97
93
self . use_feature ( "core_intrinsics" ) ;
98
94
99
- let atomic_load = mk ( ) . abs_path_expr ( vec ! [ "core" , "intrinsics" , intrinsic_name] ) ;
95
+ let atomic_load = mk ( ) . abs_path_expr ( vec ! [ "core" , "intrinsics" , & intrinsic_name] ) ;
100
96
let call = mk ( ) . call_expr ( atomic_load, vec ! [ ptr] ) ;
101
97
if name == "__atomic_load" {
102
98
let ret = val1. expect ( "__atomic_load should have a ret argument" ) ;
@@ -124,27 +120,13 @@ impl<'c> Translation<'c> {
124
120
let val = val1. expect ( "__atomic_store must have a val argument" ) ;
125
121
ptr. and_then ( |ptr| {
126
122
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
- } ) ?;
123
+ let intrinsic_name =
124
+ "atomic_store_" . to_owned ( ) + order_name ( static_order ( order) ) ;
143
125
144
126
self . use_feature ( "core_intrinsics" ) ;
145
127
146
128
let atomic_store =
147
- mk ( ) . abs_path_expr ( vec ! [ "core" , "intrinsics" , intrinsic_name] ) ;
129
+ mk ( ) . abs_path_expr ( vec ! [ "core" , "intrinsics" , & intrinsic_name] ) ;
148
130
let val = if name == "__atomic_store" {
149
131
mk ( ) . unary_expr ( UnOp :: Deref ( Default :: default ( ) ) , val)
150
132
} else {
@@ -164,27 +146,13 @@ impl<'c> Translation<'c> {
164
146
let val = val1. expect ( "__atomic_store must have a val argument" ) ;
165
147
ptr. and_then ( |ptr| {
166
148
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
- } ) ?;
149
+ let intrinsic_name =
150
+ "atomic_xchg_" . to_owned ( ) + order_name ( static_order ( order) ) ;
183
151
184
152
self . use_feature ( "core_intrinsics" ) ;
185
153
186
154
let fn_path =
187
- mk ( ) . abs_path_expr ( vec ! [ "core" , "intrinsics" , intrinsic_name] ) ;
155
+ mk ( ) . abs_path_expr ( vec ! [ "core" , "intrinsics" , & intrinsic_name] ) ;
188
156
let val = if name == "__atomic_exchange" {
189
157
mk ( ) . unary_expr ( UnOp :: Deref ( Default :: default ( ) ) , val)
190
158
} else {
@@ -226,22 +194,25 @@ impl<'c> Translation<'c> {
226
194
ptr. and_then ( |ptr| {
227
195
expected. and_then ( |expected| {
228
196
desired. and_then ( |desired| {
229
- let weak = static_order ( weak) ;
197
+ // If this expect fails, we have to select which intrinsic to use at runtime
198
+ let weak = weak. expect (
199
+ "Dynamic memory consistency arguments are not yet supported" ,
200
+ ) ;
230
201
let order = static_order ( order) ;
231
202
let order_fail = static_order ( order_fail) ;
232
203
use Ordering :: * ;
233
204
let intrinsic_name = ( || {
234
205
Some ( match ( order, order_fail) {
235
206
( _, 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 " ,
207
+ ( SeqCst , SeqCst ) => "_seqcst_seqcst " ,
208
+ ( SeqCst , Acquire ) => "_seqcst_acquire " ,
209
+ ( SeqCst , Relaxed ) => "_seqcst_relaxed " ,
210
+ ( AcqRel , Acquire ) => "_acqrel_acquire " ,
211
+ ( AcqRel , Relaxed ) => "_acqrel_relaxed " ,
212
+ ( Release , Relaxed ) => "_release_relaxed " ,
213
+ ( Acquire , Acquire ) => "_acquire_acquire " ,
214
+ ( Acquire , Relaxed ) => "_acquire_relaxed " ,
215
+ ( Relaxed , Relaxed ) => "_relaxed_relaxed " ,
245
216
( SeqCst | AcqRel | Release | Acquire | Relaxed , _) => {
246
217
return None
247
218
}
@@ -320,16 +291,8 @@ impl<'c> Translation<'c> {
320
291
"atomic_and"
321
292
} ;
322
293
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}" ) ;
294
+ let intrinsic_suffix = order_name ( static_order ( order) ) ;
295
+ let intrinsic_name = format ! ( "{intrinsic_name}_{intrinsic_suffix}" ) ;
333
296
334
297
let fetch_first = name. starts_with ( "__atomic_fetch" ) ;
335
298
let val = val1. expect ( "__atomic arithmetic operations must have a val argument" ) ;
0 commit comments