Skip to content

Commit 4b6ebc0

Browse files
authored
Merge pull request #1999 from bnjbvr/fix-aarch64-ishl-by-zero
machinst aarch64: fix encoding generation of left-shift by 0
2 parents f4f5eed + f316bef commit 4b6ebc0

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

cranelift/codegen/src/isa/aarch64/inst/emit.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -534,8 +534,16 @@ impl MachInstEmit for Inst {
534534
ALUOp::Lsr64 => (0b1101001101, u32::from(amt), 0b111111),
535535
ALUOp::Asr32 => (0b0001001100, u32::from(amt), 0b011111),
536536
ALUOp::Asr64 => (0b1001001101, u32::from(amt), 0b111111),
537-
ALUOp::Lsl32 => (0b0101001100, u32::from(32 - amt), u32::from(31 - amt)),
538-
ALUOp::Lsl64 => (0b1101001101, u32::from(64 - amt), u32::from(63 - amt)),
537+
ALUOp::Lsl32 => (
538+
0b0101001100,
539+
u32::from((32 - amt) % 32),
540+
u32::from(31 - amt),
541+
),
542+
ALUOp::Lsl64 => (
543+
0b1101001101,
544+
u32::from((64 - amt) % 64),
545+
u32::from(63 - amt),
546+
),
539547
_ => unimplemented!("{:?}", alu_op),
540548
};
541549
sink.put4(

cranelift/codegen/src/isa/aarch64/inst/emit_tests.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -934,6 +934,26 @@ fn test_aarch64_binemit() {
934934
"280141D3",
935935
"lsl x8, x9, #63",
936936
));
937+
insns.push((
938+
Inst::AluRRImmShift {
939+
alu_op: ALUOp::Lsl32,
940+
rd: writable_xreg(10),
941+
rn: xreg(11),
942+
immshift: ImmShift::maybe_from_u64(0).unwrap(),
943+
},
944+
"6A7D0053",
945+
"lsl w10, w11, #0",
946+
));
947+
insns.push((
948+
Inst::AluRRImmShift {
949+
alu_op: ALUOp::Lsl64,
950+
rd: writable_xreg(10),
951+
rn: xreg(11),
952+
immshift: ImmShift::maybe_from_u64(0).unwrap(),
953+
},
954+
"6AFD40D3",
955+
"lsl x10, x11, #0",
956+
));
937957

938958
insns.push((
939959
Inst::AluRRImmLogic {

0 commit comments

Comments
 (0)