let layout = self.1;
match self.0 {
CValueInner::ByRef(ptr) => {
- let scalar = match layout.abi {
- layout::Abi::Scalar(ref scalar) => scalar.clone(),
+ let clif_ty = match layout.abi {
+ layout::Abi::Scalar(ref scalar) => scalar_to_clif_type(fx.tcx, scalar.clone()),
+ layout::Abi::Vector { ref element, count } => {
+ scalar_to_clif_type(fx.tcx, element.clone())
+ .by(u16::try_from(count).unwrap()).unwrap()
+ }
_ => unreachable!(),
};
- let clif_ty = scalar_to_clif_type(fx.tcx, scalar);
ptr.load(fx, clif_ty, MemFlags::new())
}
CValueInner::ByVal(value) => value,
field: mir::Field,
) -> CValue<'tcx> {
let layout = self.1;
- let ptr = match self.0 {
- CValueInner::ByRef(ptr) => ptr,
+ match self.0 {
+ CValueInner::ByVal(val) => {
+ match layout.abi {
+ layout::Abi::Vector { element: _, count } => {
+ let count = u8::try_from(count).expect("SIMD type with more than 255 lanes???");
+ let field = u8::try_from(field.index()).unwrap();
+ assert!(field < count);
+ let lane = fx.bcx.ins().extractlane(val, field);
+ let field_layout = layout.field(&*fx, usize::from(field));
+ CValue::by_val(lane, field_layout)
+ }
+ _ => unreachable!("value_field for ByVal with abi {:?}", layout.abi),
+ }
+ }
+ CValueInner::ByRef(ptr) => {
+ let (field_ptr, field_layout) = codegen_field(fx, ptr, None, layout, field);
+ CValue::by_ref(field_ptr, field_layout)
+ }
_ => bug!("place_field for {:?}", self),
- };
-
- let (field_ptr, field_layout) = codegen_field(fx, ptr, None, layout, field);
- CValue::by_ref(field_ptr, field_layout)
+ }
}
pub fn unsize_value<'a>(self, fx: &mut FunctionCx<'_, 'tcx, impl Backend>, dest: CPlace<'tcx>) {
}
pub fn write_cvalue(self, fx: &mut FunctionCx<'_, 'tcx, impl Backend>, from: CValue<'tcx>) {
+ #[cfg(debug_assertions)]
+ {
+ use cranelift_codegen::cursor::{Cursor, CursorPosition};
+ let cur_ebb = match fx.bcx.cursor().position() {
+ CursorPosition::After(ebb) => ebb,
+ _ => unreachable!(),
+ };
+ fx.add_comment(
+ fx.bcx.func.layout.last_inst(cur_ebb).unwrap(),
+ format!("write_cvalue: {:?} <- {:?}",self, from),
+ );
+ }
+
let from_ty = from.layout().ty;
let to_ty = self.layout().ty;