Simplify CPlaceInner::Addr branch of write_cvalue_maybe_transmute
This commit is contained in:
parent
d169ee3457
commit
ece98a4b41
1 changed files with 28 additions and 18 deletions
|
@ -162,6 +162,7 @@ impl<'tcx> CValue<'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Load a value with layout.abi of scalar
|
/// Load a value with layout.abi of scalar
|
||||||
|
#[track_caller]
|
||||||
pub(crate) fn load_scalar(self, fx: &mut FunctionCx<'_, '_, 'tcx>) -> Value {
|
pub(crate) fn load_scalar(self, fx: &mut FunctionCx<'_, '_, 'tcx>) -> Value {
|
||||||
let layout = self.1;
|
let layout = self.1;
|
||||||
match self.0 {
|
match self.0 {
|
||||||
|
@ -184,6 +185,7 @@ impl<'tcx> CValue<'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Load a value pair with layout.abi of scalar pair
|
/// Load a value pair with layout.abi of scalar pair
|
||||||
|
#[track_caller]
|
||||||
pub(crate) fn load_scalar_pair(self, fx: &mut FunctionCx<'_, '_, 'tcx>) -> (Value, Value) {
|
pub(crate) fn load_scalar_pair(self, fx: &mut FunctionCx<'_, '_, 'tcx>) -> (Value, Value) {
|
||||||
let layout = self.1;
|
let layout = self.1;
|
||||||
match self.0 {
|
match self.0 {
|
||||||
|
@ -609,6 +611,21 @@ impl<'tcx> CPlace<'tcx> {
|
||||||
|
|
||||||
let mut flags = MemFlags::new();
|
let mut flags = MemFlags::new();
|
||||||
flags.set_notrap();
|
flags.set_notrap();
|
||||||
|
|
||||||
|
match from.0 {
|
||||||
|
CValueInner::ByVal(val) => {
|
||||||
|
to_ptr.store(fx, val, flags);
|
||||||
|
}
|
||||||
|
CValueInner::ByValPair(val1, val2) => match from.layout().abi {
|
||||||
|
Abi::ScalarPair(a_scalar, b_scalar) => {
|
||||||
|
let b_offset =
|
||||||
|
scalar_pair_calculate_b_offset(fx.tcx, a_scalar, b_scalar);
|
||||||
|
to_ptr.store(fx, val1, flags);
|
||||||
|
to_ptr.offset(fx, b_offset).store(fx, val2, flags);
|
||||||
|
}
|
||||||
|
_ => bug!("Non ScalarPair abi {:?} for ByValPair CValue", dst_layout.abi),
|
||||||
|
},
|
||||||
|
CValueInner::ByRef(from_ptr, None) => {
|
||||||
match from.layout().abi {
|
match from.layout().abi {
|
||||||
Abi::Scalar(_) => {
|
Abi::Scalar(_) => {
|
||||||
let val = from.load_scalar(fx);
|
let val = from.load_scalar(fx);
|
||||||
|
@ -616,23 +633,16 @@ impl<'tcx> CPlace<'tcx> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Abi::ScalarPair(a_scalar, b_scalar) => {
|
Abi::ScalarPair(a_scalar, b_scalar) => {
|
||||||
let (value, extra) = from.load_scalar_pair(fx);
|
let b_offset =
|
||||||
let b_offset = scalar_pair_calculate_b_offset(fx.tcx, a_scalar, b_scalar);
|
scalar_pair_calculate_b_offset(fx.tcx, a_scalar, b_scalar);
|
||||||
to_ptr.store(fx, value, flags);
|
let (val1, val2) = from.load_scalar_pair(fx);
|
||||||
to_ptr.offset(fx, b_offset).store(fx, extra, flags);
|
to_ptr.store(fx, val1, flags);
|
||||||
|
to_ptr.offset(fx, b_offset).store(fx, val2, flags);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
match from.0 {
|
|
||||||
CValueInner::ByVal(val) => {
|
|
||||||
to_ptr.store(fx, val, flags);
|
|
||||||
}
|
|
||||||
CValueInner::ByValPair(_, _) => {
|
|
||||||
bug!("Non ScalarPair abi {:?} for ByValPair CValue", dst_layout.abi);
|
|
||||||
}
|
|
||||||
CValueInner::ByRef(from_ptr, None) => {
|
|
||||||
let from_addr = from_ptr.get_addr(fx);
|
let from_addr = from_ptr.get_addr(fx);
|
||||||
let to_addr = to_ptr.get_addr(fx);
|
let to_addr = to_ptr.get_addr(fx);
|
||||||
let src_layout = from.1;
|
let src_layout = from.1;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue