AArch64: Improve code generation for Extractlane + Sextend / Uextend
Copyright (c) 2020, Arm Limited.
This commit is contained in:
@@ -745,7 +745,7 @@ pub enum Inst {
|
||||
rn: Reg,
|
||||
},
|
||||
|
||||
/// Move to a GPR from a vector element.
|
||||
/// Unsigned move from a vector element to a GPR.
|
||||
MovFromVec {
|
||||
rd: Writable<Reg>,
|
||||
rn: Reg,
|
||||
@@ -753,6 +753,15 @@ pub enum Inst {
|
||||
size: VectorSize,
|
||||
},
|
||||
|
||||
/// Signed move from a vector element to a GPR.
|
||||
MovFromVecSigned {
|
||||
rd: Writable<Reg>,
|
||||
rn: Reg,
|
||||
idx: u8,
|
||||
size: VectorSize,
|
||||
scalar_size: OperandSize,
|
||||
},
|
||||
|
||||
/// Duplicate general-purpose register to vector.
|
||||
VecDup {
|
||||
rd: Writable<Reg>,
|
||||
@@ -1325,7 +1334,7 @@ fn aarch64_get_regs(inst: &Inst, collector: &mut RegUsageCollector) {
|
||||
collector.add_def(rd);
|
||||
collector.add_use(rn);
|
||||
}
|
||||
&Inst::MovFromVec { rd, rn, .. } => {
|
||||
&Inst::MovFromVec { rd, rn, .. } | &Inst::MovFromVecSigned { rd, rn, .. } => {
|
||||
collector.add_def(rd);
|
||||
collector.add_use(rn);
|
||||
}
|
||||
@@ -1905,6 +1914,11 @@ fn aarch64_map_regs<RUM: RegUsageMapper>(inst: &mut Inst, mapper: &RUM) {
|
||||
ref mut rd,
|
||||
ref mut rn,
|
||||
..
|
||||
}
|
||||
| &mut Inst::MovFromVecSigned {
|
||||
ref mut rd,
|
||||
ref mut rn,
|
||||
..
|
||||
} => {
|
||||
map_def(mapper, rd);
|
||||
map_use(mapper, rn);
|
||||
@@ -2738,6 +2752,17 @@ impl Inst {
|
||||
let rn = show_vreg_element(rn, mb_rru, idx, size);
|
||||
format!("{} {}, {}", op, rd, rn)
|
||||
}
|
||||
&Inst::MovFromVecSigned {
|
||||
rd,
|
||||
rn,
|
||||
idx,
|
||||
size,
|
||||
scalar_size,
|
||||
} => {
|
||||
let rd = show_ireg_sized(rd.to_reg(), mb_rru, scalar_size);
|
||||
let rn = show_vreg_element(rn, mb_rru, idx, size);
|
||||
format!("smov {}, {}", rd, rn)
|
||||
}
|
||||
&Inst::VecDup { rd, rn, size } => {
|
||||
let rd = show_vreg_vector(rd.to_reg(), mb_rru, size);
|
||||
let rn = show_ireg_sized(rn, mb_rru, size.operand_size());
|
||||
|
||||
Reference in New Issue
Block a user