Skip to content

Commit dfd7a3b

Browse files
authored
x64: Migrate EVEX instructions to the new assembler (#11303)
* x64: Migrate vpabsq to the new assembler * x64: Migrate vpopcntb to new assembler * x64: Migrate vpmullq to the new assembler * x64: Migrate vcvtudq2ps to the new assembler * x64: Migrate vpermi2b to new assembler * Fix test warnings
1 parent 02eccea commit dfd7a3b

File tree

21 files changed

+72
-1486
lines changed

21 files changed

+72
-1486
lines changed

cranelift/assembler-x64/meta/src/dsl/features.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ pub enum Feature {
8787
avx2,
8888
avx512f,
8989
avx512vl,
90+
avx512dq,
91+
avx512bitalg,
92+
avx512vbmi,
9093
cmpxchg16b,
9194
fma,
9295
}
@@ -115,6 +118,9 @@ pub const ALL_FEATURES: &[Feature] = &[
115118
Feature::avx2,
116119
Feature::avx512f,
117120
Feature::avx512vl,
121+
Feature::avx512dq,
122+
Feature::avx512bitalg,
123+
Feature::avx512vbmi,
118124
Feature::cmpxchg16b,
119125
Feature::fma,
120126
];
Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
1-
use crate::dsl::{Feature::*, Inst, Length::*, Location::*};
2-
use crate::dsl::{align, fmt, inst, r, rex, vex, w};
1+
use crate::dsl::{Feature::*, Inst, Length::*, Location::*, TupleType::*};
2+
use crate::dsl::{align, evex, fmt, inst, r, rex, vex, w};
33

44
#[rustfmt::skip] // Keeps instructions on a single line.
55
pub fn list() -> Vec<Inst> {
66
vec![
77
inst("pabsb", fmt("A", [w(xmm1), r(align(xmm_m128))]), rex([0x66, 0x0F, 0x38, 0x1C]), _64b | compat | ssse3).alt(avx, "vpabsb_a"),
88
inst("vpabsb", fmt("A", [w(xmm1), r(xmm_m128)]), vex(L128)._66()._0f38().op(0x1C), _64b | compat | avx),
9+
// FIXME: uncomment once the avx512bw feature is bound
10+
// inst("vpabsb", fmt("B", [w(xmm1), r(xmm_m128)]), evex(L128, FullMem)._66()._0f38().wig().op(0x1C).r(), _64b | compat | avx512vl | avx512bw),
911
inst("pabsw", fmt("A", [w(xmm1), r(align(xmm_m128))]), rex([0x66, 0x0F, 0x38, 0x1D]), _64b | compat | ssse3).alt(avx, "vpabsw_a"),
1012
inst("vpabsw", fmt("A", [w(xmm1), r(xmm_m128)]), vex(L128)._66()._0f38().op(0x1D), _64b | compat | avx),
13+
// FIXME: uncomment once the avx512bw feature is bound
14+
// inst("vpabsw", fmt("B", [w(xmm1), r(xmm_m128)]), evex(L128, FullMem)._66()._0f38().wig().op(0x1D).r(), _64b | compat | avx512vl | avx512bw),
1115
inst("pabsd", fmt("A", [w(xmm1), r(align(xmm_m128))]), rex([0x66, 0x0F, 0x38, 0x1E]), _64b | compat | ssse3).alt(avx, "vpabsd_a"),
1216
inst("vpabsd", fmt("A", [w(xmm1), r(xmm_m128)]), vex(L128)._66()._0f38().op(0x1E), _64b | compat | avx),
17+
inst("vpabsd", fmt("C", [w(xmm1), r(xmm_m128)]), evex(L128, Full)._66()._0f38().w0().op(0x1E).r(), _64b | compat | avx512vl | avx512f),
18+
inst("vpabsq", fmt("C", [w(xmm1), r(xmm_m128)]), evex(L128, Full)._66()._0f38().w1().op(0x1F).r(), _64b | compat | avx512vl | avx512f),
1319
]
1420
}

cranelift/assembler-x64/meta/src/instructions/bitmanip.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
use crate::dsl::{Eflags::*, Feature::*, Inst, Length::*, Location::*};
2-
use crate::dsl::{fmt, implicit, inst, r, rex, rw, vex, w};
1+
use crate::dsl::{Eflags::*, Feature::*, Inst, Length::*, Location::*, TupleType::*};
2+
use crate::dsl::{evex, fmt, implicit, inst, r, rex, rw, vex, w};
33

44
#[rustfmt::skip] // Keeps instructions on a single line.
55
pub fn list() -> Vec<Inst> {
@@ -61,5 +61,11 @@ pub fn list() -> Vec<Inst> {
6161
// BMI2 instructions
6262
inst("bzhil", fmt("RMV", [w(r32a), r(rm32), r(r32b)]), vex(LZ)._0f38().w0().op(0xF5), _64b | compat | bmi2),
6363
inst("bzhiq", fmt("RMV", [w(r64a), r(rm64), r(r64b)]), vex(LZ)._0f38().w1().op(0xF5), _64b | bmi2),
64+
65+
inst("vpopcntb", fmt("A", [w(xmm1), r(xmm_m128)]), evex(L128, FullMem)._66()._0f38().w0().op(0x54).r(), _64b | compat | avx512vl | avx512bitalg),
66+
inst("vpopcntw", fmt("A", [w(xmm1), r(xmm_m128)]), evex(L128, FullMem)._66()._0f38().w1().op(0x54).r(), _64b | compat | avx512vl | avx512bitalg),
67+
// FIXME: uncomment when avx512vpopcntdq is bound in cranelift
68+
// inst("vpopcntd", fmt("A", [w(xmm1), r(xmm_m128)]), evex(L128, Full)._66()._0f38().w0().op(0x55).r(), _64b | compat | avx512vl | avx512vpopcntdq),
69+
// inst("vpopcntq", fmt("A", [w(xmm1), r(xmm_m128)]), evex(L128, Full)._66()._0f38().w1().op(0x55).r(), _64b | compat | avx512vl | avx512vpopcntdq),
6470
]
6571
}

cranelift/assembler-x64/meta/src/instructions/cvt.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
use crate::dsl::{Customization::*, Feature::*, Inst, Length::*, Location::*};
2-
use crate::dsl::{align, fmt, inst, r, rex, rw, vex, w};
1+
use crate::dsl::{Customization::*, Feature::*, Inst, Length::*, Location::*, TupleType::*};
2+
use crate::dsl::{align, evex, fmt, inst, r, rex, rw, vex, w};
33

44
#[rustfmt::skip] // Keeps instructions on a single line.
55
pub fn list() -> Vec<Inst> {
@@ -64,5 +64,7 @@ pub fn list() -> Vec<Inst> {
6464
// * cvtps2pi
6565
// * cvttpd2pi
6666
// * cvttps2pi
67+
68+
inst("vcvtudq2ps", fmt("A", [w(xmm1), r(xmm_m128)]), evex(L128, Full)._f2()._0f().w0().op(0x7A).r(), _64b | avx512vl | avx512f),
6769
]
6870
}

cranelift/assembler-x64/meta/src/instructions/lanes.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
use crate::dsl::{Feature::*, Inst, Length::*, Location::*};
2-
use crate::dsl::{align, fmt, inst, r, rex, rw, vex, w};
1+
use crate::dsl::{Feature::*, Inst, Length::*, Location::*, TupleType::*};
2+
use crate::dsl::{align, evex, fmt, inst, r, rex, rw, vex, w};
33

44
#[rustfmt::skip] // Keeps instructions on a single line.
55
pub fn list() -> Vec<Inst> {
@@ -86,5 +86,8 @@ pub fn list() -> Vec<Inst> {
8686
inst("vpbroadcastw", fmt("A", [w(xmm1), r(xmm_m16)]), vex(L128)._66()._0f38().w0().op(0x79).r(), _64b | compat | avx2),
8787
inst("vpbroadcastd", fmt("A", [w(xmm1), r(xmm_m32)]), vex(L128)._66()._0f38().w0().op(0x58).r(), _64b | compat | avx2),
8888
inst("vpbroadcastq", fmt("A", [w(xmm1), r(xmm_m64)]), vex(L128)._66()._0f38().w0().op(0x59).r(), _64b | compat | avx2),
89+
90+
// AVX-512 permutations
91+
inst("vpermi2b", fmt("A", [rw(xmm1), r(xmm2), r(xmm_m128)]), evex(L128, FullMem)._66()._0f38().w0().op(0x75).r(), _64b | compat | avx512vl | avx512vbmi),
8992
]
9093
}

cranelift/assembler-x64/meta/src/instructions/mul.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
use crate::dsl::{Customization::*, Feature::*, Inst, Length::*, Location::*};
2-
use crate::dsl::{align, fmt, implicit, inst, r, rex, rw, sxl, sxq, sxw, vex, w};
1+
use crate::dsl::{Customization::*, Feature::*, Inst, Length::*, Location::*, TupleType::*};
2+
use crate::dsl::{align, evex, fmt, implicit, inst, r, rex, rw, sxl, sxq, sxw, vex, w};
33

44
#[rustfmt::skip] // Keeps instructions on a single line.
55
pub fn list() -> Vec<Inst> {
@@ -55,5 +55,8 @@ pub fn list() -> Vec<Inst> {
5555
inst("vpmulld", fmt("B", [w(xmm1), r(xmm2), r(xmm_m128)]), vex(L128)._66()._0f38().op(0x40), _64b | compat | avx),
5656
inst("vpmullw", fmt("B", [w(xmm1), r(xmm2), r(xmm_m128)]), vex(L128)._66()._0f().op(0xD5), _64b | compat | avx),
5757
inst("vpmuludq", fmt("B", [w(xmm1), r(xmm2), r(xmm_m128)]), vex(L128)._66()._0f().op(0xF4), _64b | compat | avx),
58+
59+
inst("vpmulld", fmt("C", [w(xmm1), r(xmm2), r(xmm_m128)]), evex(L128, Full)._66()._0f38().w0().op(0x40).r(), _64b | compat | avx512vl | avx512f),
60+
inst("vpmullq", fmt("C", [w(xmm1), r(xmm2), r(xmm_m128)]), evex(L128, Full)._66()._0f38().w1().op(0x40).r(), _64b | compat | avx512vl | avx512dq),
5861
]
5962
}

cranelift/assembler-x64/src/evex.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,19 @@ impl EvexPrefix {
6565
}
6666
}
6767

68+
/// Construct the [`EvexPrefix`] for an instruction.
69+
pub fn two_op(
70+
reg: u8,
71+
(b, x): (Option<u8>, Option<u8>),
72+
ll: u8,
73+
pp: u8,
74+
mmm: u8,
75+
w: bool,
76+
broadcast: bool,
77+
) -> Self {
78+
EvexPrefix::new(reg, 0, (b, x), ll, pp, mmm, w, broadcast)
79+
}
80+
6881
/// Construct the [`EvexPrefix`] for an instruction.
6982
pub fn three_op(
7083
reg: u8,

0 commit comments

Comments
 (0)