Enable the spec::simd::simd_lane test for AArch64
Copyright (c) 2020, Arm Limited.
This commit is contained in:
@@ -819,12 +819,20 @@ pub enum Inst {
|
||||
rn: Reg,
|
||||
},
|
||||
|
||||
/// Move to a vector register from a GPR.
|
||||
MovToVec64 {
|
||||
/// Move from a GPR to a scalar FP register.
|
||||
MovToFpu {
|
||||
rd: Writable<Reg>,
|
||||
rn: Reg,
|
||||
},
|
||||
|
||||
/// Move to a vector element from a GPR.
|
||||
MovToVec {
|
||||
rd: Writable<Reg>,
|
||||
rn: Reg,
|
||||
idx: u8,
|
||||
size: VectorSize,
|
||||
},
|
||||
|
||||
/// Unsigned move from a vector element to a GPR.
|
||||
MovFromVec {
|
||||
rd: Writable<Reg>,
|
||||
@@ -863,6 +871,15 @@ pub enum Inst {
|
||||
rn: Reg,
|
||||
},
|
||||
|
||||
/// Move vector element to another vector element.
|
||||
VecMovElement {
|
||||
rd: Writable<Reg>,
|
||||
rn: Reg,
|
||||
idx1: u8,
|
||||
idx2: u8,
|
||||
size: VectorSize,
|
||||
},
|
||||
|
||||
/// A vector ALU op.
|
||||
VecRRR {
|
||||
alu_op: VecALUOp,
|
||||
@@ -888,6 +905,32 @@ pub enum Inst {
|
||||
size: VectorSize,
|
||||
},
|
||||
|
||||
/// Table vector lookup - single register table. The table consists of 8-bit elements and is
|
||||
/// stored in `rn`, while `rm` contains 8-bit element indices. `is_extension` specifies whether
|
||||
/// to emit a TBX or a TBL instruction, i.e. whether to leave the elements in the destination
|
||||
/// vector that correspond to out-of-range indices (greater than 15) unmodified or to set them
|
||||
/// to 0.
|
||||
VecTbl {
|
||||
rd: Writable<Reg>,
|
||||
rn: Reg,
|
||||
rm: Reg,
|
||||
is_extension: bool,
|
||||
},
|
||||
|
||||
/// Table vector lookup - two register table. The table consists of 8-bit elements and is
|
||||
/// stored in `rn` and `rn2`, while `rm` contains 8-bit element indices. `is_extension`
|
||||
/// specifies whether to emit a TBX or a TBL instruction, i.e. whether to leave the elements in
|
||||
/// the destination vector that correspond to out-of-range indices (greater than 31) unmodified
|
||||
/// or to set them to 0. The table registers `rn` and `rn2` must have consecutive numbers
|
||||
/// modulo 32, that is v31 and v0 (in that order) are consecutive registers.
|
||||
VecTbl2 {
|
||||
rd: Writable<Reg>,
|
||||
rn: Reg,
|
||||
rn2: Reg,
|
||||
rm: Reg,
|
||||
is_extension: bool,
|
||||
},
|
||||
|
||||
/// Move to the NZCV flags (actually a `MSR NZCV, Xn` insn).
|
||||
MovToNZCV {
|
||||
rn: Reg,
|
||||
@@ -1377,6 +1420,39 @@ fn aarch64_get_regs(inst: &Inst, collector: &mut RegUsageCollector) {
|
||||
collector.add_def(rd);
|
||||
collector.add_use(rn);
|
||||
}
|
||||
&Inst::VecTbl {
|
||||
rd,
|
||||
rn,
|
||||
rm,
|
||||
is_extension,
|
||||
} => {
|
||||
collector.add_use(rn);
|
||||
collector.add_use(rm);
|
||||
|
||||
if is_extension {
|
||||
collector.add_mod(rd);
|
||||
} else {
|
||||
collector.add_def(rd);
|
||||
}
|
||||
}
|
||||
&Inst::VecTbl2 {
|
||||
rd,
|
||||
rn,
|
||||
rn2,
|
||||
rm,
|
||||
is_extension,
|
||||
} => {
|
||||
collector.add_use(rn);
|
||||
collector.add_use(rn2);
|
||||
collector.add_use(rm);
|
||||
|
||||
if is_extension {
|
||||
collector.add_mod(rd);
|
||||
} else {
|
||||
collector.add_def(rd);
|
||||
}
|
||||
}
|
||||
|
||||
&Inst::FpuCmp32 { rn, rm } | &Inst::FpuCmp64 { rn, rm } => {
|
||||
collector.add_use(rn);
|
||||
collector.add_use(rm);
|
||||
@@ -1427,10 +1503,14 @@ fn aarch64_get_regs(inst: &Inst, collector: &mut RegUsageCollector) {
|
||||
collector.add_def(rd);
|
||||
collector.add_use(rn);
|
||||
}
|
||||
&Inst::MovToVec64 { rd, rn } => {
|
||||
&Inst::MovToFpu { rd, rn } => {
|
||||
collector.add_def(rd);
|
||||
collector.add_use(rn);
|
||||
}
|
||||
&Inst::MovToVec { rd, rn, .. } => {
|
||||
collector.add_mod(rd);
|
||||
collector.add_use(rn);
|
||||
}
|
||||
&Inst::MovFromVec { rd, rn, .. } | &Inst::MovFromVecSigned { rd, rn, .. } => {
|
||||
collector.add_def(rd);
|
||||
collector.add_use(rn);
|
||||
@@ -1447,6 +1527,10 @@ fn aarch64_get_regs(inst: &Inst, collector: &mut RegUsageCollector) {
|
||||
collector.add_def(rd);
|
||||
collector.add_use(rn);
|
||||
}
|
||||
&Inst::VecMovElement { rd, rn, .. } => {
|
||||
collector.add_mod(rd);
|
||||
collector.add_use(rn);
|
||||
}
|
||||
&Inst::VecRRR {
|
||||
alu_op, rd, rn, rm, ..
|
||||
} => {
|
||||
@@ -1905,6 +1989,38 @@ fn aarch64_map_regs<RUM: RegUsageMapper>(inst: &mut Inst, mapper: &RUM) {
|
||||
map_def(mapper, rd);
|
||||
map_use(mapper, rn);
|
||||
}
|
||||
&mut Inst::VecTbl {
|
||||
ref mut rd,
|
||||
ref mut rn,
|
||||
ref mut rm,
|
||||
is_extension,
|
||||
} => {
|
||||
map_use(mapper, rn);
|
||||
map_use(mapper, rm);
|
||||
|
||||
if is_extension {
|
||||
map_mod(mapper, rd);
|
||||
} else {
|
||||
map_def(mapper, rd);
|
||||
}
|
||||
}
|
||||
&mut Inst::VecTbl2 {
|
||||
ref mut rd,
|
||||
ref mut rn,
|
||||
ref mut rn2,
|
||||
ref mut rm,
|
||||
is_extension,
|
||||
} => {
|
||||
map_use(mapper, rn);
|
||||
map_use(mapper, rn2);
|
||||
map_use(mapper, rm);
|
||||
|
||||
if is_extension {
|
||||
map_mod(mapper, rd);
|
||||
} else {
|
||||
map_def(mapper, rd);
|
||||
}
|
||||
}
|
||||
&mut Inst::FpuCmp32 {
|
||||
ref mut rn,
|
||||
ref mut rm,
|
||||
@@ -2020,13 +2136,21 @@ fn aarch64_map_regs<RUM: RegUsageMapper>(inst: &mut Inst, mapper: &RUM) {
|
||||
map_def(mapper, rd);
|
||||
map_use(mapper, rn);
|
||||
}
|
||||
&mut Inst::MovToVec64 {
|
||||
&mut Inst::MovToFpu {
|
||||
ref mut rd,
|
||||
ref mut rn,
|
||||
} => {
|
||||
map_def(mapper, rd);
|
||||
map_use(mapper, rn);
|
||||
}
|
||||
&mut Inst::MovToVec {
|
||||
ref mut rd,
|
||||
ref mut rn,
|
||||
..
|
||||
} => {
|
||||
map_mod(mapper, rd);
|
||||
map_use(mapper, rn);
|
||||
}
|
||||
&mut Inst::MovFromVec {
|
||||
ref mut rd,
|
||||
ref mut rn,
|
||||
@@ -2064,6 +2188,14 @@ fn aarch64_map_regs<RUM: RegUsageMapper>(inst: &mut Inst, mapper: &RUM) {
|
||||
map_def(mapper, rd);
|
||||
map_use(mapper, rn);
|
||||
}
|
||||
&mut Inst::VecMovElement {
|
||||
ref mut rd,
|
||||
ref mut rn,
|
||||
..
|
||||
} => {
|
||||
map_mod(mapper, rd);
|
||||
map_use(mapper, rn);
|
||||
}
|
||||
&mut Inst::VecRRR {
|
||||
alu_op,
|
||||
ref mut rd,
|
||||
@@ -2871,10 +3003,15 @@ impl Inst {
|
||||
let rn = show_vreg_scalar(rn, mb_rru, size);
|
||||
format!("{} {}, {}", inst, rd, rn)
|
||||
}
|
||||
&Inst::MovToVec64 { rd, rn } => {
|
||||
let rd = rd.to_reg().show_rru(mb_rru);
|
||||
let rn = rn.show_rru(mb_rru);
|
||||
format!("mov {}.d[0], {}", rd, rn)
|
||||
&Inst::MovToFpu { rd, rn } => {
|
||||
let rd = show_vreg_scalar(rd.to_reg(), mb_rru, ScalarSize::Size64);
|
||||
let rn = show_ireg_sized(rn, mb_rru, OperandSize::Size64);
|
||||
format!("fmov {}, {}", rd, rn)
|
||||
}
|
||||
&Inst::MovToVec { rd, rn, idx, size } => {
|
||||
let rd = show_vreg_element(rd.to_reg(), mb_rru, idx, size);
|
||||
let rn = show_ireg_sized(rn, mb_rru, size.operand_size());
|
||||
format!("mov {}, {}", rd, rn)
|
||||
}
|
||||
&Inst::MovFromVec { rd, rn, idx, size } => {
|
||||
let op = match size {
|
||||
@@ -2922,6 +3059,17 @@ impl Inst {
|
||||
let rn = show_vreg_vector(rn, mb_rru, src);
|
||||
format!("{} {}, {}", op, rd, rn)
|
||||
}
|
||||
&Inst::VecMovElement {
|
||||
rd,
|
||||
rn,
|
||||
idx1,
|
||||
idx2,
|
||||
size,
|
||||
} => {
|
||||
let rd = show_vreg_element(rd.to_reg(), mb_rru, idx1, size);
|
||||
let rn = show_vreg_element(rn, mb_rru, idx2, size);
|
||||
format!("mov {}, {}", rd, rn)
|
||||
}
|
||||
&Inst::VecRRR {
|
||||
rd,
|
||||
rn,
|
||||
@@ -2992,6 +3140,32 @@ impl Inst {
|
||||
let rn = show_vreg_vector(rn, mb_rru, size);
|
||||
format!("{} {}, {}", op, rd, rn)
|
||||
}
|
||||
&Inst::VecTbl {
|
||||
rd,
|
||||
rn,
|
||||
rm,
|
||||
is_extension,
|
||||
} => {
|
||||
let op = if is_extension { "tbx" } else { "tbl" };
|
||||
let rd = show_vreg_vector(rd.to_reg(), mb_rru, VectorSize::Size8x16);
|
||||
let rn = show_vreg_vector(rn, mb_rru, VectorSize::Size8x16);
|
||||
let rm = show_vreg_vector(rm, mb_rru, VectorSize::Size8x16);
|
||||
format!("{} {}, {{ {} }}, {}", op, rd, rn, rm)
|
||||
}
|
||||
&Inst::VecTbl2 {
|
||||
rd,
|
||||
rn,
|
||||
rn2,
|
||||
rm,
|
||||
is_extension,
|
||||
} => {
|
||||
let op = if is_extension { "tbx" } else { "tbl" };
|
||||
let rd = show_vreg_vector(rd.to_reg(), mb_rru, VectorSize::Size8x16);
|
||||
let rn = show_vreg_vector(rn, mb_rru, VectorSize::Size8x16);
|
||||
let rn2 = show_vreg_vector(rn2, mb_rru, VectorSize::Size8x16);
|
||||
let rm = show_vreg_vector(rm, mb_rru, VectorSize::Size8x16);
|
||||
format!("{} {}, {{ {}, {} }}, {}", op, rd, rn, rn2, rm)
|
||||
}
|
||||
&Inst::MovToNZCV { rn } => {
|
||||
let rn = rn.show_rru(mb_rru);
|
||||
format!("msr nzcv, {}", rn)
|
||||
|
||||
Reference in New Issue
Block a user