cranelift: remove load_complex and store_complex (#3976)
This change removes all variants of `load*_complex` and `store*_complex` from Cranelift; this is a breaking change to the instructions exposed by CLIF. The complete list of instructions removed is: `load_complex`, `store_complex`, `uload8_complex`, `sload8_complex`, `istore8_complex`, `sload8_complex`, `uload16_complex`, `sload16_complex`, `istore16_complex`, `uload32_complex`, `sload32_complex`, `istore32_complex`, `uload8x8_complex`, `sload8x8_complex`, `sload16x4_complex`, `uload16x4_complex`, `uload32x2_complex`, `sload32x2_complex`. The rationale for this removal is that the Cranelift backend now has the ability to pattern-match multiple upstream additions in order to calculate the address to access. Previously, this was not possible so the `*_complex` instructions were needed. Over time, these instructions have fallen out of use in this repository, making the additional overhead of maintaining them a chore.
This commit is contained in:
@@ -662,8 +662,8 @@ pub(crate) fn lower_address<C: LowerCtx<I = Inst>>(
|
||||
roots: &[InsnInput],
|
||||
offset: i32,
|
||||
) -> AMode {
|
||||
// TODO: support base_reg + scale * index_reg. For this, we would need to pattern-match shl or
|
||||
// mul instructions (Load/StoreComplex don't include scale factors).
|
||||
// TODO: support base_reg + scale * index_reg. For this, we would need to
|
||||
// pattern-match shl or mul instructions.
|
||||
|
||||
// Collect addends through an arbitrary tree of 32-to-64-bit sign/zero
|
||||
// extends and addition ops. We update these as we consume address
|
||||
@@ -1510,25 +1510,13 @@ pub(crate) fn emit_atomic_load<C: LowerCtx<I = Inst>>(
|
||||
|
||||
fn load_op_to_ty(op: Opcode) -> Option<Type> {
|
||||
match op {
|
||||
Opcode::Sload8 | Opcode::Uload8 | Opcode::Sload8Complex | Opcode::Uload8Complex => Some(I8),
|
||||
Opcode::Sload16 | Opcode::Uload16 | Opcode::Sload16Complex | Opcode::Uload16Complex => {
|
||||
Some(I16)
|
||||
}
|
||||
Opcode::Sload32 | Opcode::Uload32 | Opcode::Sload32Complex | Opcode::Uload32Complex => {
|
||||
Some(I32)
|
||||
}
|
||||
Opcode::Load | Opcode::LoadComplex => None,
|
||||
Opcode::Sload8x8 | Opcode::Uload8x8 | Opcode::Sload8x8Complex | Opcode::Uload8x8Complex => {
|
||||
Some(I8X8)
|
||||
}
|
||||
Opcode::Sload16x4
|
||||
| Opcode::Uload16x4
|
||||
| Opcode::Sload16x4Complex
|
||||
| Opcode::Uload16x4Complex => Some(I16X4),
|
||||
Opcode::Sload32x2
|
||||
| Opcode::Uload32x2
|
||||
| Opcode::Sload32x2Complex
|
||||
| Opcode::Uload32x2Complex => Some(I32X2),
|
||||
Opcode::Sload8 | Opcode::Uload8 => Some(I8),
|
||||
Opcode::Sload16 | Opcode::Uload16 => Some(I16),
|
||||
Opcode::Sload32 | Opcode::Uload32 => Some(I32),
|
||||
Opcode::Load => None,
|
||||
Opcode::Sload8x8 | Opcode::Uload8x8 => Some(I8X8),
|
||||
Opcode::Sload16x4 | Opcode::Uload16x4 => Some(I16X4),
|
||||
Opcode::Sload32x2 | Opcode::Uload32x2 => Some(I32X2),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
src/clif.isle 9ea75a6f790b5c03
|
||||
src/clif.isle 443b34b797fc8ace
|
||||
src/prelude.isle 74d9514ac948e163
|
||||
src/isa/aarch64/inst.isle 19ccefb6a496d392
|
||||
src/isa/aarch64/lower.isle d88b62dd6b40622
|
||||
|
||||
@@ -98,32 +98,14 @@ pub(crate) fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
|
||||
| Opcode::Sload16
|
||||
| Opcode::Uload32
|
||||
| Opcode::Sload32
|
||||
| Opcode::LoadComplex
|
||||
| Opcode::Uload8Complex
|
||||
| Opcode::Sload8Complex
|
||||
| Opcode::Uload16Complex
|
||||
| Opcode::Sload16Complex
|
||||
| Opcode::Uload32Complex
|
||||
| Opcode::Sload32Complex
|
||||
| Opcode::Sload8x8
|
||||
| Opcode::Uload8x8
|
||||
| Opcode::Sload16x4
|
||||
| Opcode::Uload16x4
|
||||
| Opcode::Sload32x2
|
||||
| Opcode::Uload32x2
|
||||
| Opcode::Uload8x8Complex
|
||||
| Opcode::Sload8x8Complex
|
||||
| Opcode::Uload16x4Complex
|
||||
| Opcode::Sload16x4Complex
|
||||
| Opcode::Uload32x2Complex
|
||||
| Opcode::Sload32x2Complex => {
|
||||
| Opcode::Uload32x2 => {
|
||||
let sign_extend = match op {
|
||||
Opcode::Sload8
|
||||
| Opcode::Sload8Complex
|
||||
| Opcode::Sload16
|
||||
| Opcode::Sload16Complex
|
||||
| Opcode::Sload32
|
||||
| Opcode::Sload32Complex => true,
|
||||
Opcode::Sload8 | Opcode::Sload16 | Opcode::Sload32 => true,
|
||||
_ => false,
|
||||
};
|
||||
let flags = ctx
|
||||
@@ -174,17 +156,11 @@ pub(crate) fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
|
||||
|
||||
let vec_extend = match op {
|
||||
Opcode::Sload8x8 => Some(VecExtendOp::Sxtl8),
|
||||
Opcode::Sload8x8Complex => Some(VecExtendOp::Sxtl8),
|
||||
Opcode::Uload8x8 => Some(VecExtendOp::Uxtl8),
|
||||
Opcode::Uload8x8Complex => Some(VecExtendOp::Uxtl8),
|
||||
Opcode::Sload16x4 => Some(VecExtendOp::Sxtl16),
|
||||
Opcode::Sload16x4Complex => Some(VecExtendOp::Sxtl16),
|
||||
Opcode::Uload16x4 => Some(VecExtendOp::Uxtl16),
|
||||
Opcode::Uload16x4Complex => Some(VecExtendOp::Uxtl16),
|
||||
Opcode::Sload32x2 => Some(VecExtendOp::Sxtl32),
|
||||
Opcode::Sload32x2Complex => Some(VecExtendOp::Sxtl32),
|
||||
Opcode::Uload32x2 => Some(VecExtendOp::Uxtl32),
|
||||
Opcode::Uload32x2Complex => Some(VecExtendOp::Uxtl32),
|
||||
_ => None,
|
||||
};
|
||||
|
||||
@@ -204,20 +180,13 @@ pub(crate) fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
|
||||
}
|
||||
}
|
||||
|
||||
Opcode::Store
|
||||
| Opcode::Istore8
|
||||
| Opcode::Istore16
|
||||
| Opcode::Istore32
|
||||
| Opcode::StoreComplex
|
||||
| Opcode::Istore8Complex
|
||||
| Opcode::Istore16Complex
|
||||
| Opcode::Istore32Complex => {
|
||||
Opcode::Store | Opcode::Istore8 | Opcode::Istore16 | Opcode::Istore32 => {
|
||||
let off = ctx.data(insn).load_store_offset().unwrap();
|
||||
let elem_ty = match op {
|
||||
Opcode::Istore8 | Opcode::Istore8Complex => I8,
|
||||
Opcode::Istore16 | Opcode::Istore16Complex => I16,
|
||||
Opcode::Istore32 | Opcode::Istore32Complex => I32,
|
||||
Opcode::Store | Opcode::StoreComplex => ctx.input_ty(insn, 0),
|
||||
Opcode::Istore8 => I8,
|
||||
Opcode::Istore16 => I16,
|
||||
Opcode::Istore32 => I32,
|
||||
Opcode::Store => ctx.input_ty(insn, 0),
|
||||
_ => unreachable!(),
|
||||
};
|
||||
let is_float = ty_has_float_or_vec_representation(elem_ty);
|
||||
|
||||
@@ -291,17 +291,11 @@ fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
|
||||
| Opcode::FminPseudo
|
||||
| Opcode::FmaxPseudo
|
||||
| Opcode::Uload8x8
|
||||
| Opcode::Uload8x8Complex
|
||||
| Opcode::Sload8x8
|
||||
| Opcode::Sload8x8Complex
|
||||
| Opcode::Uload16x4
|
||||
| Opcode::Uload16x4Complex
|
||||
| Opcode::Sload16x4
|
||||
| Opcode::Sload16x4Complex
|
||||
| Opcode::Uload32x2
|
||||
| Opcode::Uload32x2Complex
|
||||
| Opcode::Sload32x2
|
||||
| Opcode::Sload32x2Complex
|
||||
| Opcode::Vconst
|
||||
| Opcode::Shuffle
|
||||
| Opcode::Vsplit
|
||||
@@ -333,20 +327,6 @@ fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
|
||||
panic!("Unused opcode should not be encountered.");
|
||||
}
|
||||
|
||||
Opcode::LoadComplex
|
||||
| Opcode::Uload8Complex
|
||||
| Opcode::Sload8Complex
|
||||
| Opcode::Uload16Complex
|
||||
| Opcode::Sload16Complex
|
||||
| Opcode::Uload32Complex
|
||||
| Opcode::Sload32Complex
|
||||
| Opcode::StoreComplex
|
||||
| Opcode::Istore8Complex
|
||||
| Opcode::Istore16Complex
|
||||
| Opcode::Istore32Complex => {
|
||||
panic!("Load/store complex opcode should not be encountered.");
|
||||
}
|
||||
|
||||
Opcode::Ifcmp
|
||||
| Opcode::Ffcmp
|
||||
| Opcode::Trapff
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
src/clif.isle 9ea75a6f790b5c03
|
||||
src/clif.isle 443b34b797fc8ace
|
||||
src/prelude.isle 74d9514ac948e163
|
||||
src/isa/s390x/inst.isle d91a16074ab186a8
|
||||
src/isa/s390x/lower.isle 1cc5a12adc8c75f9
|
||||
|
||||
@@ -2173,13 +2173,6 @@ fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
|
||||
| Opcode::Sload16
|
||||
| Opcode::Uload32
|
||||
| Opcode::Sload32
|
||||
| Opcode::LoadComplex
|
||||
| Opcode::Uload8Complex
|
||||
| Opcode::Sload8Complex
|
||||
| Opcode::Uload16Complex
|
||||
| Opcode::Sload16Complex
|
||||
| Opcode::Uload32Complex
|
||||
| Opcode::Sload32Complex
|
||||
| Opcode::Sload8x8
|
||||
| Opcode::Uload8x8
|
||||
| Opcode::Sload16x4
|
||||
@@ -2189,30 +2182,13 @@ fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
|
||||
let offset = ctx.data(insn).load_store_offset().unwrap();
|
||||
|
||||
let elem_ty = match op {
|
||||
Opcode::Sload8 | Opcode::Uload8 | Opcode::Sload8Complex | Opcode::Uload8Complex => {
|
||||
types::I8
|
||||
}
|
||||
Opcode::Sload16
|
||||
| Opcode::Uload16
|
||||
| Opcode::Sload16Complex
|
||||
| Opcode::Uload16Complex => types::I16,
|
||||
Opcode::Sload32
|
||||
| Opcode::Uload32
|
||||
| Opcode::Sload32Complex
|
||||
| Opcode::Uload32Complex => types::I32,
|
||||
Opcode::Sload8x8
|
||||
| Opcode::Uload8x8
|
||||
| Opcode::Sload8x8Complex
|
||||
| Opcode::Uload8x8Complex => types::I8X8,
|
||||
Opcode::Sload16x4
|
||||
| Opcode::Uload16x4
|
||||
| Opcode::Sload16x4Complex
|
||||
| Opcode::Uload16x4Complex => types::I16X4,
|
||||
Opcode::Sload32x2
|
||||
| Opcode::Uload32x2
|
||||
| Opcode::Sload32x2Complex
|
||||
| Opcode::Uload32x2Complex => types::I32X2,
|
||||
Opcode::Load | Opcode::LoadComplex => ctx.output_ty(insn, 0),
|
||||
Opcode::Sload8 | Opcode::Uload8 => types::I8,
|
||||
Opcode::Sload16 | Opcode::Uload16 => types::I16,
|
||||
Opcode::Sload32 | Opcode::Uload32 => types::I32,
|
||||
Opcode::Sload8x8 | Opcode::Uload8x8 => types::I8X8,
|
||||
Opcode::Sload16x4 | Opcode::Uload16x4 => types::I16X4,
|
||||
Opcode::Sload32x2 | Opcode::Uload32x2 => types::I32X2,
|
||||
Opcode::Load => ctx.output_ty(insn, 0),
|
||||
_ => unimplemented!(),
|
||||
};
|
||||
|
||||
@@ -2220,17 +2196,11 @@ fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
|
||||
|
||||
let sign_extend = match op {
|
||||
Opcode::Sload8
|
||||
| Opcode::Sload8Complex
|
||||
| Opcode::Sload16
|
||||
| Opcode::Sload16Complex
|
||||
| Opcode::Sload32
|
||||
| Opcode::Sload32Complex
|
||||
| Opcode::Sload8x8
|
||||
| Opcode::Sload8x8Complex
|
||||
| Opcode::Sload16x4
|
||||
| Opcode::Sload16x4Complex
|
||||
| Opcode::Sload32x2
|
||||
| Opcode::Sload32x2Complex => true,
|
||||
| Opcode::Sload32x2 => true,
|
||||
_ => false,
|
||||
};
|
||||
|
||||
@@ -2251,37 +2221,6 @@ fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
|
||||
assert_eq!(inputs.len(), 1, "only one input for load operands");
|
||||
lower_to_amode(ctx, inputs[0], offset)
|
||||
}
|
||||
|
||||
Opcode::LoadComplex
|
||||
| Opcode::Uload8Complex
|
||||
| Opcode::Sload8Complex
|
||||
| Opcode::Uload16Complex
|
||||
| Opcode::Sload16Complex
|
||||
| Opcode::Uload32Complex
|
||||
| Opcode::Sload32Complex
|
||||
| Opcode::Sload8x8Complex
|
||||
| Opcode::Uload8x8Complex
|
||||
| Opcode::Sload16x4Complex
|
||||
| Opcode::Uload16x4Complex
|
||||
| Opcode::Sload32x2Complex
|
||||
| Opcode::Uload32x2Complex => {
|
||||
assert_eq!(
|
||||
inputs.len(),
|
||||
2,
|
||||
"can't handle more than two inputs in complex load"
|
||||
);
|
||||
let base = put_input_in_reg(ctx, inputs[0]);
|
||||
let index = put_input_in_reg(ctx, inputs[1]);
|
||||
let shift = 0;
|
||||
let flags = ctx.memflags(insn).expect("load should have memflags");
|
||||
Amode::imm_reg_reg_shift(
|
||||
offset as u32,
|
||||
Gpr::new(base).unwrap(),
|
||||
Gpr::new(index).unwrap(),
|
||||
shift,
|
||||
)
|
||||
.with_flags(flags)
|
||||
}
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
@@ -2347,21 +2286,14 @@ fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
|
||||
}
|
||||
}
|
||||
|
||||
Opcode::Store
|
||||
| Opcode::Istore8
|
||||
| Opcode::Istore16
|
||||
| Opcode::Istore32
|
||||
| Opcode::StoreComplex
|
||||
| Opcode::Istore8Complex
|
||||
| Opcode::Istore16Complex
|
||||
| Opcode::Istore32Complex => {
|
||||
Opcode::Store | Opcode::Istore8 | Opcode::Istore16 | Opcode::Istore32 => {
|
||||
let offset = ctx.data(insn).load_store_offset().unwrap();
|
||||
|
||||
let elem_ty = match op {
|
||||
Opcode::Istore8 | Opcode::Istore8Complex => types::I8,
|
||||
Opcode::Istore16 | Opcode::Istore16Complex => types::I16,
|
||||
Opcode::Istore32 | Opcode::Istore32Complex => types::I32,
|
||||
Opcode::Store | Opcode::StoreComplex => ctx.input_ty(insn, 0),
|
||||
Opcode::Istore8 => types::I8,
|
||||
Opcode::Istore16 => types::I16,
|
||||
Opcode::Istore32 => types::I32,
|
||||
Opcode::Store => ctx.input_ty(insn, 0),
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
@@ -2370,29 +2302,6 @@ fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
|
||||
assert_eq!(inputs.len(), 2, "only one input for store memory operands");
|
||||
lower_to_amode(ctx, inputs[1], offset)
|
||||
}
|
||||
|
||||
Opcode::StoreComplex
|
||||
| Opcode::Istore8Complex
|
||||
| Opcode::Istore16Complex
|
||||
| Opcode::Istore32Complex => {
|
||||
assert_eq!(
|
||||
inputs.len(),
|
||||
3,
|
||||
"can't handle more than two inputs in complex store"
|
||||
);
|
||||
let base = put_input_in_reg(ctx, inputs[1]);
|
||||
let index = put_input_in_reg(ctx, inputs[2]);
|
||||
let shift = 0;
|
||||
let flags = ctx.memflags(insn).expect("store should have memflags");
|
||||
Amode::imm_reg_reg_shift(
|
||||
offset as u32,
|
||||
Gpr::new(base).unwrap(),
|
||||
Gpr::new(index).unwrap(),
|
||||
shift,
|
||||
)
|
||||
.with_flags(flags)
|
||||
}
|
||||
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
@@ -3293,15 +3202,6 @@ fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
|
||||
// Unimplemented opcodes below. These are not currently used by Wasm
|
||||
// lowering or other known embeddings, but should be either supported or
|
||||
// removed eventually.
|
||||
Opcode::Uload8x8Complex
|
||||
| Opcode::Sload8x8Complex
|
||||
| Opcode::Uload16x4Complex
|
||||
| Opcode::Sload16x4Complex
|
||||
| Opcode::Uload32x2Complex
|
||||
| Opcode::Sload32x2Complex => {
|
||||
unimplemented!("Vector load {:?} not implemented", op);
|
||||
}
|
||||
|
||||
Opcode::Cls => unimplemented!("Cls not supported"),
|
||||
|
||||
Opcode::Fma => unimplemented!("Fma not supported"),
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
src/clif.isle 9ea75a6f790b5c03
|
||||
src/clif.isle 443b34b797fc8ace
|
||||
src/prelude.isle 74d9514ac948e163
|
||||
src/isa/x64/inst.isle a002d62dcfce285
|
||||
src/isa/x64/lower.isle 8f3e1ed2929fd07e
|
||||
|
||||
Reference in New Issue
Block a user