}
}
+fn load_scalar<'a, 'tcx: 'a>(
+ fx: &mut FunctionCx<'a, 'tcx, impl Backend>,
+ clif_ty: Type,
+ addr: Value,
+ offset: i32,
+) -> Value {
+ if clif_ty == types::I128 {
+ let a = fx.bcx.ins().load(clif_ty, MemFlags::new(), addr, offset);
+ let b = fx.bcx.ins().load(clif_ty, MemFlags::new(), addr, offset + 8);
+ fx.bcx.ins().iconcat(a, b)
+ } else {
+ fx.bcx.ins().load(clif_ty, MemFlags::new(), addr, offset)
+ }
+}
+
impl<'tcx> CValue<'tcx> {
pub fn by_ref(value: Value, layout: TyLayout<'tcx>) -> CValue<'tcx> {
CValue(CValueInner::ByRef(value), layout)
_ => unreachable!(),
};
let clif_ty = scalar_to_clif_type(fx.tcx, scalar);
- fx.bcx.ins().load(clif_ty, MemFlags::new(), addr, 0)
+ load_scalar(fx, clif_ty, addr, 0)
}
CValueInner::ByVal(value) => value,
CValueInner::ByValPair(_, _) => bug!("Please use load_scalar_pair for ByValPair"),
let b_offset = scalar_pair_calculate_b_offset(fx.tcx, a_scalar, b_scalar);
let clif_ty1 = scalar_to_clif_type(fx.tcx, a_scalar.clone());
let clif_ty2 = scalar_to_clif_type(fx.tcx, b_scalar.clone());
- let val1 = fx.bcx.ins().load(clif_ty1, MemFlags::new(), addr, 0);
- let val2 = fx.bcx.ins().load(
+ let val1 = load_scalar(fx, clif_ty1, addr, 0);
+ let val2 = load_scalar(
+ fx,
clif_ty2,
- MemFlags::new(),
addr,
b_offset,
);