[AArch64] Refactor ALUOp3 (#3950)
As well as adding generic pattern for msub along with runtests for madd and msub. Copyright (c) 2022, Arm Limited.
This commit is contained in:
@@ -758,6 +758,7 @@ impl MachInstEmit for Inst {
|
||||
}
|
||||
&Inst::AluRRRR {
|
||||
alu_op,
|
||||
size,
|
||||
rd,
|
||||
rm,
|
||||
rn,
|
||||
@@ -769,11 +770,10 @@ impl MachInstEmit for Inst {
|
||||
let ra = allocs.next(ra);
|
||||
|
||||
let (top11, bit15) = match alu_op {
|
||||
ALUOp3::MAdd32 => (0b0_00_11011_000, 0),
|
||||
ALUOp3::MSub32 => (0b0_00_11011_000, 1),
|
||||
ALUOp3::MAdd64 => (0b1_00_11011_000, 0),
|
||||
ALUOp3::MSub64 => (0b1_00_11011_000, 1),
|
||||
ALUOp3::MAdd => (0b0_00_11011_000, 0),
|
||||
ALUOp3::MSub => (0b0_00_11011_000, 1),
|
||||
};
|
||||
let top11 = top11 | size.sf_bit() << 10;
|
||||
sink.put4(enc_arith_rrrr(top11, rm, bit15, ra, rn, rd));
|
||||
}
|
||||
&Inst::AluRRImm12 {
|
||||
|
||||
@@ -995,7 +995,8 @@ fn test_aarch64_binemit() {
|
||||
|
||||
insns.push((
|
||||
Inst::AluRRRR {
|
||||
alu_op: ALUOp3::MAdd32,
|
||||
alu_op: ALUOp3::MAdd,
|
||||
size: OperandSize::Size32,
|
||||
rd: writable_xreg(1),
|
||||
rn: xreg(2),
|
||||
rm: xreg(3),
|
||||
@@ -1006,7 +1007,8 @@ fn test_aarch64_binemit() {
|
||||
));
|
||||
insns.push((
|
||||
Inst::AluRRRR {
|
||||
alu_op: ALUOp3::MAdd64,
|
||||
alu_op: ALUOp3::MAdd,
|
||||
size: OperandSize::Size64,
|
||||
rd: writable_xreg(1),
|
||||
rn: xreg(2),
|
||||
rm: xreg(3),
|
||||
@@ -1017,7 +1019,8 @@ fn test_aarch64_binemit() {
|
||||
));
|
||||
insns.push((
|
||||
Inst::AluRRRR {
|
||||
alu_op: ALUOp3::MSub32,
|
||||
alu_op: ALUOp3::MSub,
|
||||
size: OperandSize::Size32,
|
||||
rd: writable_xreg(1),
|
||||
rn: xreg(2),
|
||||
rm: xreg(3),
|
||||
@@ -1028,7 +1031,8 @@ fn test_aarch64_binemit() {
|
||||
));
|
||||
insns.push((
|
||||
Inst::AluRRRR {
|
||||
alu_op: ALUOp3::MSub64,
|
||||
alu_op: ALUOp3::MSub,
|
||||
size: OperandSize::Size64,
|
||||
rd: writable_xreg(1),
|
||||
rn: xreg(2),
|
||||
rm: xreg(3),
|
||||
|
||||
@@ -1288,16 +1288,15 @@ impl Inst {
|
||||
}
|
||||
&Inst::AluRRRR {
|
||||
alu_op,
|
||||
size,
|
||||
rd,
|
||||
rn,
|
||||
rm,
|
||||
ra,
|
||||
} => {
|
||||
let (op, size) = match alu_op {
|
||||
ALUOp3::MAdd32 => ("madd", OperandSize::Size32),
|
||||
ALUOp3::MAdd64 => ("madd", OperandSize::Size64),
|
||||
ALUOp3::MSub32 => ("msub", OperandSize::Size32),
|
||||
ALUOp3::MSub64 => ("msub", OperandSize::Size64),
|
||||
let op = match alu_op {
|
||||
ALUOp3::MAdd => "madd",
|
||||
ALUOp3::MSub => "msub",
|
||||
};
|
||||
let rd = pretty_print_ireg(rd.to_reg(), size, allocs);
|
||||
let rn = pretty_print_ireg(rn, size, allocs);
|
||||
|
||||
Reference in New Issue
Block a user