Port Shuffle to ISLE (AArch64) (#4596)
* Port `Shuffle` to ISLE (AArch64) Ported the existing implementation of `Shuffle` for AArch64 to ISLE. Copyright (c) 2022 Arm Limited * Cleanup by shadowing `rn`, `rn2`, and `_` Copyright (c) 2022 Arm Limited
This commit is contained in:
@@ -1074,34 +1074,7 @@ pub(crate) fn lower_insn_to_regs<C: LowerCtx<I = Inst>>(
|
||||
}
|
||||
}
|
||||
|
||||
Opcode::Shuffle => {
|
||||
let mask = const_param_to_u128(ctx, insn).expect("Invalid immediate mask bytes");
|
||||
let rd = get_output_reg(ctx, outputs[0]).only_reg().unwrap();
|
||||
let rn = put_input_in_reg(ctx, inputs[0], NarrowValueMode::None);
|
||||
let rn2 = put_input_in_reg(ctx, inputs[1], NarrowValueMode::None);
|
||||
// 2 register table vector lookups require consecutive table registers;
|
||||
// we satisfy this constraint by hardcoding the usage of v29 and v30.
|
||||
let temp = writable_vreg(29);
|
||||
let temp2 = writable_vreg(30);
|
||||
let input_ty = ctx.input_ty(insn, 0);
|
||||
assert_eq!(input_ty, ctx.input_ty(insn, 1));
|
||||
// Make sure that both inputs are in virtual registers, since it is
|
||||
// not guaranteed that we can get them safely to the temporaries if
|
||||
// either is in a real register.
|
||||
let rn = ctx.ensure_in_vreg(rn, input_ty);
|
||||
let rn2 = ctx.ensure_in_vreg(rn2, input_ty);
|
||||
|
||||
lower_constant_f128(ctx, rd, mask);
|
||||
ctx.emit(Inst::gen_move(temp, rn, input_ty));
|
||||
ctx.emit(Inst::gen_move(temp2, rn2, input_ty));
|
||||
ctx.emit(Inst::VecTbl2 {
|
||||
rd,
|
||||
rn: temp.to_reg(),
|
||||
rn2: temp2.to_reg(),
|
||||
rm: rd.to_reg(),
|
||||
is_extension: false,
|
||||
});
|
||||
}
|
||||
Opcode::Shuffle => implemented_in_isle(ctx),
|
||||
|
||||
Opcode::Swizzle => implemented_in_isle(ctx),
|
||||
|
||||
|
||||
Reference in New Issue
Block a user