@@ -147,8 +147,8 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
147
147
debug ! ( "Operand::immediate_or_packed_pair: packing {:?} into {:?}" , self , llty) ;
148
148
// Reconstruct the immediate aggregate.
149
149
let mut llpair = bx. cx ( ) . const_undef ( llty) ;
150
- let imm_a = base :: from_immediate ( bx , a) ;
151
- let imm_b = base :: from_immediate ( bx , b) ;
150
+ let imm_a = bx . from_immediate ( a) ;
151
+ let imm_b = bx . from_immediate ( b) ;
152
152
llpair = bx. insert_value ( llpair, imm_a, 0 ) ;
153
153
llpair = bx. insert_value ( llpair, imm_b, 1 ) ;
154
154
llpair
@@ -168,9 +168,9 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
168
168
169
169
// Deconstruct the immediate aggregate.
170
170
let a_llval = bx. extract_value ( llval, 0 ) ;
171
- let a_llval = base :: to_immediate_scalar ( bx , a_llval, a) ;
171
+ let a_llval = bx . to_immediate_scalar ( a_llval, a) ;
172
172
let b_llval = bx. extract_value ( llval, 1 ) ;
173
- let b_llval = base :: to_immediate_scalar ( bx , b_llval, b) ;
173
+ let b_llval = bx . to_immediate_scalar ( b_llval, b) ;
174
174
OperandValue :: Pair ( a_llval, b_llval)
175
175
} else {
176
176
OperandValue :: Immediate ( llval)
@@ -220,29 +220,21 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
220
220
_ => bug ! ( "OperandRef::extract_field({:?}): not applicable" , self ) ,
221
221
} ;
222
222
223
- // HACK(eddyb) have to bitcast pointers until LLVM removes pointee types.
224
- // Bools in union fields needs to be truncated.
225
- let to_immediate_or_cast = |bx : & mut Bx , val, ty| {
226
- if ty == bx. cx ( ) . type_i1 ( ) { bx. trunc ( val, ty) } else { bx. bitcast ( val, ty) }
227
- } ;
228
-
229
- match val {
230
- OperandValue :: Immediate ( ref mut llval) => {
231
- * llval = to_immediate_or_cast ( bx, * llval, bx. cx ( ) . immediate_backend_type ( field) ) ;
223
+ match ( & mut val, & self . layout . abi ) {
224
+ ( OperandValue :: Immediate ( llval) , _) => {
225
+ // Bools in union fields needs to be truncated.
226
+ * llval = bx. to_immediate ( * llval, field) ;
227
+ // HACK(eddyb) have to bitcast pointers until LLVM removes pointee types.
228
+ * llval = bx. bitcast ( * llval, bx. cx ( ) . immediate_backend_type ( field) ) ;
232
229
}
233
- OperandValue :: Pair ( ref mut a, ref mut b) => {
234
- * a = to_immediate_or_cast (
235
- bx,
236
- * a,
237
- bx. cx ( ) . scalar_pair_element_backend_type ( field, 0 , true ) ,
238
- ) ;
239
- * b = to_immediate_or_cast (
240
- bx,
241
- * b,
242
- bx. cx ( ) . scalar_pair_element_backend_type ( field, 1 , true ) ,
243
- ) ;
230
+ ( OperandValue :: Pair ( a, b) , Abi :: ScalarPair ( a_abi, b_abi) ) => {
231
+ * a = bx. to_immediate_scalar ( * a, a_abi) ;
232
+ * a = bx. bitcast ( * a, bx. cx ( ) . scalar_pair_element_backend_type ( field, 0 , true ) ) ;
233
+ * b = bx. to_immediate_scalar ( * b, b_abi) ;
234
+ * b = bx. bitcast ( * b, bx. cx ( ) . scalar_pair_element_backend_type ( field, 1 , true ) ) ;
244
235
}
245
- OperandValue :: Ref ( ..) => bug ! ( ) ,
236
+ ( OperandValue :: Pair ( ..) , _) => bug ! ( ) ,
237
+ ( OperandValue :: Ref ( ..) , _) => bug ! ( ) ,
246
238
}
247
239
248
240
OperandRef { val, layout : field }
@@ -302,7 +294,7 @@ impl<'a, 'tcx, V: CodegenObject> OperandValue<V> {
302
294
bug ! ( "cannot directly store unsized values" ) ;
303
295
}
304
296
OperandValue :: Immediate ( s) => {
305
- let val = base :: from_immediate ( bx , s) ;
297
+ let val = bx . from_immediate ( s) ;
306
298
bx. store_with_flags ( val, dest. llval , dest. align , flags) ;
307
299
}
308
300
OperandValue :: Pair ( a, b) => {
@@ -313,12 +305,12 @@ impl<'a, 'tcx, V: CodegenObject> OperandValue<V> {
313
305
let b_offset = a_scalar. value . size ( bx) . align_to ( b_scalar. value . align ( bx) . abi ) ;
314
306
315
307
let llptr = bx. struct_gep ( dest. llval , 0 ) ;
316
- let val = base :: from_immediate ( bx , a) ;
308
+ let val = bx . from_immediate ( a) ;
317
309
let align = dest. align ;
318
310
bx. store_with_flags ( val, llptr, align, flags) ;
319
311
320
312
let llptr = bx. struct_gep ( dest. llval , 1 ) ;
321
- let val = base :: from_immediate ( bx , b) ;
313
+ let val = bx . from_immediate ( b) ;
322
314
let align = dest. align . restrict_for_offset ( b_offset) ;
323
315
bx. store_with_flags ( val, llptr, align, flags) ;
324
316
}
0 commit comments