@@ -147,8 +147,8 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
147147 debug ! ( "Operand::immediate_or_packed_pair: packing {:?} into {:?}" , self , llty) ;
148148 // Reconstruct the immediate aggregate.
149149 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) ;
152152 llpair = bx. insert_value ( llpair, imm_a, 0 ) ;
153153 llpair = bx. insert_value ( llpair, imm_b, 1 ) ;
154154 llpair
@@ -168,9 +168,9 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
168168
169169 // Deconstruct the immediate aggregate.
170170 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) ;
172172 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) ;
174174 OperandValue :: Pair ( a_llval, b_llval)
175175 } else {
176176 OperandValue :: Immediate ( llval)
@@ -220,29 +220,21 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
220220 _ => bug ! ( "OperandRef::extract_field({:?}): not applicable" , self ) ,
221221 } ;
222222
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) ) ;
232229 }
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 ) ) ;
244235 }
245- OperandValue :: Ref ( ..) => bug ! ( ) ,
236+ ( OperandValue :: Pair ( ..) , _) => bug ! ( ) ,
237+ ( OperandValue :: Ref ( ..) , _) => bug ! ( ) ,
246238 }
247239
248240 OperandRef { val, layout : field }
@@ -302,7 +294,7 @@ impl<'a, 'tcx, V: CodegenObject> OperandValue<V> {
302294 bug ! ( "cannot directly store unsized values" ) ;
303295 }
304296 OperandValue :: Immediate ( s) => {
305- let val = base :: from_immediate ( bx , s) ;
297+ let val = bx . from_immediate ( s) ;
306298 bx. store_with_flags ( val, dest. llval , dest. align , flags) ;
307299 }
308300 OperandValue :: Pair ( a, b) => {
@@ -313,12 +305,12 @@ impl<'a, 'tcx, V: CodegenObject> OperandValue<V> {
313305 let b_offset = a_scalar. value . size ( bx) . align_to ( b_scalar. value . align ( bx) . abi ) ;
314306
315307 let llptr = bx. struct_gep ( dest. llval , 0 ) ;
316- let val = base :: from_immediate ( bx , a) ;
308+ let val = bx . from_immediate ( a) ;
317309 let align = dest. align ;
318310 bx. store_with_flags ( val, llptr, align, flags) ;
319311
320312 let llptr = bx. struct_gep ( dest. llval , 1 ) ;
321- let val = base :: from_immediate ( bx , b) ;
313+ let val = bx . from_immediate ( b) ;
322314 let align = dest. align . restrict_for_offset ( b_offset) ;
323315 bx. store_with_flags ( val, llptr, align, flags) ;
324316 }
0 commit comments