rebase and ran cargo fmt
Copyright (c) 2021, Arm Limited.
This commit is contained in:
@@ -287,13 +287,21 @@ fn enc_vec_rrr(top11: u32, rm: Reg, bit15_10: u32, rn: Reg, rd: Writable<Reg>) -
|
||||
| machreg_to_vec(rd.to_reg())
|
||||
}
|
||||
|
||||
fn enc_vec_rrr_long(q: u32, u: u32, size: u32, bit14: u32, rm: Reg, rn: Reg, rd: Writable<Reg>) -> u32 {
|
||||
debug_assert_eq!(q & 0b1, q);
|
||||
debug_assert_eq!(u & 0b1, u);
|
||||
debug_assert_eq!(size & 0b11, size);
|
||||
debug_assert_eq!(bit14 & 0b1, bit14);
|
||||
fn enc_vec_rrr_long(
|
||||
q: u32,
|
||||
u: u32,
|
||||
size: u32,
|
||||
bit14: u32,
|
||||
rm: Reg,
|
||||
rn: Reg,
|
||||
rd: Writable<Reg>,
|
||||
) -> u32 {
|
||||
debug_assert_eq!(q & 0b1, q);
|
||||
debug_assert_eq!(u & 0b1, u);
|
||||
debug_assert_eq!(size & 0b11, size);
|
||||
debug_assert_eq!(bit14 & 0b1, bit14);
|
||||
|
||||
0b0_0_0_01110_00_1_00000_100000_00000_00000
|
||||
0b0_0_0_01110_00_1_00000_100000_00000_00000
|
||||
| q << 30
|
||||
| u << 29
|
||||
| size << 22
|
||||
@@ -2207,7 +2215,15 @@ impl MachInstEmit for Inst {
|
||||
VecRRRLongOp::Umlal16 => (0b1, 0b01, 0b0),
|
||||
VecRRRLongOp::Umlal32 => (0b1, 0b10, 0b0),
|
||||
};
|
||||
sink.put4(enc_vec_rrr_long(high_half as u32, u, size, bit14, rm, rn, rd));
|
||||
sink.put4(enc_vec_rrr_long(
|
||||
high_half as u32,
|
||||
u,
|
||||
size,
|
||||
bit14,
|
||||
rm,
|
||||
rn,
|
||||
rd,
|
||||
));
|
||||
}
|
||||
&Inst::VecRRR {
|
||||
rd,
|
||||
@@ -2289,9 +2305,9 @@ impl MachInstEmit for Inst {
|
||||
}
|
||||
};
|
||||
let top11 = if is_float {
|
||||
top11 | enc_float_size << 1
|
||||
top11 | enc_float_size << 1
|
||||
} else {
|
||||
top11
|
||||
top11
|
||||
};
|
||||
sink.put4(enc_vec_rrr(top11 | q << 9, rm, bit15_10, rn, rd));
|
||||
}
|
||||
|
||||
@@ -3705,7 +3705,7 @@ fn test_aarch64_binemit() {
|
||||
rd: writable_vreg(16),
|
||||
rn: vreg(12),
|
||||
rm: vreg(1),
|
||||
high_half: false
|
||||
high_half: false,
|
||||
},
|
||||
"90C1210E",
|
||||
"smull v16.8h, v12.8b, v1.8b",
|
||||
@@ -3717,7 +3717,7 @@ fn test_aarch64_binemit() {
|
||||
rd: writable_vreg(15),
|
||||
rn: vreg(11),
|
||||
rm: vreg(2),
|
||||
high_half: false
|
||||
high_half: false,
|
||||
},
|
||||
"6FC1222E",
|
||||
"umull v15.8h, v11.8b, v2.8b",
|
||||
@@ -3729,7 +3729,7 @@ fn test_aarch64_binemit() {
|
||||
rd: writable_vreg(4),
|
||||
rn: vreg(8),
|
||||
rm: vreg(16),
|
||||
high_half: false
|
||||
high_half: false,
|
||||
},
|
||||
"0481302E",
|
||||
"umlal v4.8h, v8.8b, v16.8b",
|
||||
|
||||
@@ -412,7 +412,6 @@ pub enum VecRRRLongOp {
|
||||
Umlal32,
|
||||
}
|
||||
|
||||
|
||||
/// A vector operation on a pair of elements with one register.
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
|
||||
pub enum VecPairOp {
|
||||
@@ -2159,9 +2158,9 @@ fn aarch64_get_regs(inst: &Inst, collector: &mut RegUsageCollector) {
|
||||
alu_op, rd, rn, rm, ..
|
||||
} => {
|
||||
match alu_op {
|
||||
VecRRRLongOp::Umlal8
|
||||
| VecRRRLongOp::Umlal16
|
||||
| VecRRRLongOp::Umlal32 => collector.add_mod(rd),
|
||||
VecRRRLongOp::Umlal8 | VecRRRLongOp::Umlal16 | VecRRRLongOp::Umlal32 => {
|
||||
collector.add_mod(rd)
|
||||
}
|
||||
_ => collector.add_def(rd),
|
||||
};
|
||||
collector.add_use(rn);
|
||||
@@ -2985,9 +2984,9 @@ fn aarch64_map_regs<RUM: RegUsageMapper>(inst: &mut Inst, mapper: &RUM) {
|
||||
..
|
||||
} => {
|
||||
match alu_op {
|
||||
VecRRRLongOp::Umlal8
|
||||
| VecRRRLongOp::Umlal16
|
||||
| VecRRRLongOp::Umlal32 => map_mod(mapper, rd),
|
||||
VecRRRLongOp::Umlal8 | VecRRRLongOp::Umlal16 | VecRRRLongOp::Umlal32 => {
|
||||
map_mod(mapper, rd)
|
||||
}
|
||||
_ => map_def(mapper, rd),
|
||||
};
|
||||
map_use(mapper, rn);
|
||||
@@ -4212,42 +4211,60 @@ impl Inst {
|
||||
high_half,
|
||||
} => {
|
||||
let (op, dest_size, src_size) = match (alu_op, high_half) {
|
||||
(VecRRRLongOp::Smull8, false) =>
|
||||
("smull", VectorSize::Size16x8, VectorSize::Size8x8),
|
||||
(VecRRRLongOp::Smull8, true) =>
|
||||
("smull2", VectorSize::Size16x8, VectorSize::Size8x16),
|
||||
(VecRRRLongOp::Smull16, false) =>
|
||||
("smull", VectorSize::Size32x4, VectorSize::Size16x4),
|
||||
(VecRRRLongOp::Smull16, true) =>
|
||||
("smull2", VectorSize::Size32x4, VectorSize::Size16x8),
|
||||
(VecRRRLongOp::Smull32, false) =>
|
||||
("smull", VectorSize::Size64x2, VectorSize::Size32x2),
|
||||
(VecRRRLongOp::Smull32, true) =>
|
||||
("smull2", VectorSize::Size64x2, VectorSize::Size32x4),
|
||||
(VecRRRLongOp::Umull8, false) =>
|
||||
("umull", VectorSize::Size16x8, VectorSize::Size8x8),
|
||||
(VecRRRLongOp::Umull8, true) =>
|
||||
("umull2", VectorSize::Size16x8, VectorSize::Size8x16),
|
||||
(VecRRRLongOp::Umull16, false) =>
|
||||
("umull", VectorSize::Size32x4, VectorSize::Size16x4),
|
||||
(VecRRRLongOp::Umull16, true) =>
|
||||
("umull2", VectorSize::Size32x4, VectorSize::Size16x8),
|
||||
(VecRRRLongOp::Umull32, false) =>
|
||||
("umull", VectorSize::Size64x2, VectorSize::Size32x2),
|
||||
(VecRRRLongOp::Umull32, true) =>
|
||||
("umull2", VectorSize::Size64x2, VectorSize::Size32x4),
|
||||
(VecRRRLongOp::Umlal8, false) =>
|
||||
("umlal", VectorSize::Size16x8, VectorSize::Size8x8),
|
||||
(VecRRRLongOp::Umlal8, true) =>
|
||||
("umlal2", VectorSize::Size16x8, VectorSize::Size8x16),
|
||||
(VecRRRLongOp::Umlal16, false) =>
|
||||
("umlal", VectorSize::Size32x4, VectorSize::Size16x4),
|
||||
(VecRRRLongOp::Umlal16, true) =>
|
||||
("umlal2", VectorSize::Size32x4, VectorSize::Size16x8),
|
||||
(VecRRRLongOp::Umlal32, false) =>
|
||||
("umlal", VectorSize::Size64x2, VectorSize::Size32x2),
|
||||
(VecRRRLongOp::Umlal32, true) =>
|
||||
("umlal2", VectorSize::Size64x2, VectorSize::Size32x4),
|
||||
(VecRRRLongOp::Smull8, false) => {
|
||||
("smull", VectorSize::Size16x8, VectorSize::Size8x8)
|
||||
}
|
||||
(VecRRRLongOp::Smull8, true) => {
|
||||
("smull2", VectorSize::Size16x8, VectorSize::Size8x16)
|
||||
}
|
||||
(VecRRRLongOp::Smull16, false) => {
|
||||
("smull", VectorSize::Size32x4, VectorSize::Size16x4)
|
||||
}
|
||||
(VecRRRLongOp::Smull16, true) => {
|
||||
("smull2", VectorSize::Size32x4, VectorSize::Size16x8)
|
||||
}
|
||||
(VecRRRLongOp::Smull32, false) => {
|
||||
("smull", VectorSize::Size64x2, VectorSize::Size32x2)
|
||||
}
|
||||
(VecRRRLongOp::Smull32, true) => {
|
||||
("smull2", VectorSize::Size64x2, VectorSize::Size32x4)
|
||||
}
|
||||
(VecRRRLongOp::Umull8, false) => {
|
||||
("umull", VectorSize::Size16x8, VectorSize::Size8x8)
|
||||
}
|
||||
(VecRRRLongOp::Umull8, true) => {
|
||||
("umull2", VectorSize::Size16x8, VectorSize::Size8x16)
|
||||
}
|
||||
(VecRRRLongOp::Umull16, false) => {
|
||||
("umull", VectorSize::Size32x4, VectorSize::Size16x4)
|
||||
}
|
||||
(VecRRRLongOp::Umull16, true) => {
|
||||
("umull2", VectorSize::Size32x4, VectorSize::Size16x8)
|
||||
}
|
||||
(VecRRRLongOp::Umull32, false) => {
|
||||
("umull", VectorSize::Size64x2, VectorSize::Size32x2)
|
||||
}
|
||||
(VecRRRLongOp::Umull32, true) => {
|
||||
("umull2", VectorSize::Size64x2, VectorSize::Size32x4)
|
||||
}
|
||||
(VecRRRLongOp::Umlal8, false) => {
|
||||
("umlal", VectorSize::Size16x8, VectorSize::Size8x8)
|
||||
}
|
||||
(VecRRRLongOp::Umlal8, true) => {
|
||||
("umlal2", VectorSize::Size16x8, VectorSize::Size8x16)
|
||||
}
|
||||
(VecRRRLongOp::Umlal16, false) => {
|
||||
("umlal", VectorSize::Size32x4, VectorSize::Size16x4)
|
||||
}
|
||||
(VecRRRLongOp::Umlal16, true) => {
|
||||
("umlal2", VectorSize::Size32x4, VectorSize::Size16x8)
|
||||
}
|
||||
(VecRRRLongOp::Umlal32, false) => {
|
||||
("umlal", VectorSize::Size64x2, VectorSize::Size32x2)
|
||||
}
|
||||
(VecRRRLongOp::Umlal32, true) => {
|
||||
("umlal2", VectorSize::Size64x2, VectorSize::Size32x4)
|
||||
}
|
||||
};
|
||||
let rd = show_vreg_vector(rd.to_reg(), mb_rru, dest_size);
|
||||
let rn = show_vreg_vector(rn, mb_rru, src_size);
|
||||
|
||||
Reference in New Issue
Block a user