Skip to content
This repository was archived by the owner on Sep 8, 2025. It is now read-only.

Commit 40aceb3

Browse files
authored
Merge pull request #202 from alexcrichton/merge
Merge with upstream
2 parents b0b72ca + e940b60 commit 40aceb3

43 files changed

Lines changed: 1190 additions & 345 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

cranelift/assembler-x64/meta/src/generate/format.rs

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -208,31 +208,41 @@ impl dsl::Format {
208208
rm: *rm,
209209
}
210210
}
211-
[Reg(reg_or_vvvv), RegMem(rm)] | [Reg(reg_or_vvvv), RegMem(rm), Imm(_)] => {
212-
match vex.unwrap_digit() {
213-
Some(digit) => {
214-
let vvvv = reg_or_vvvv;
215-
fmtln!(f, "let reg = {digit:#x};");
216-
fmtln!(f, "let vvvv = self.{vvvv}.enc();");
217-
fmtln!(f, "let rm = self.{rm}.encode_bx_regs();");
218-
fmtln!(f, "let vex = VexPrefix::three_op(reg, vvvv, rm, {bits});");
219-
ModRmStyle::RegMem {
220-
reg: ModRmReg::Digit(digit),
221-
rm: *rm,
222-
}
211+
[Reg(reg_or_vvvv), RegMem(rm)]
212+
| [RegMem(rm), Reg(reg_or_vvvv)]
213+
| [Reg(reg_or_vvvv), RegMem(rm), Imm(_)] => match vex.unwrap_digit() {
214+
Some(digit) => {
215+
let vvvv = reg_or_vvvv;
216+
fmtln!(f, "let reg = {digit:#x};");
217+
fmtln!(f, "let vvvv = self.{vvvv}.enc();");
218+
fmtln!(f, "let rm = self.{rm}.encode_bx_regs();");
219+
fmtln!(f, "let vex = VexPrefix::three_op(reg, vvvv, rm, {bits});");
220+
ModRmStyle::RegMem {
221+
reg: ModRmReg::Digit(digit),
222+
rm: *rm,
223223
}
224-
None => {
225-
let reg = reg_or_vvvv;
226-
fmtln!(f, "let reg = self.{reg}.enc();");
227-
fmtln!(f, "let vvvv = {};", "0b0");
228-
fmtln!(f, "let rm = self.{rm}.encode_bx_regs();");
229-
fmtln!(f, "let vex = VexPrefix::three_op(reg, vvvv, rm, {bits});");
230-
ModRmStyle::RegMem {
231-
reg: ModRmReg::Reg(*reg),
232-
rm: *rm,
233-
}
224+
}
225+
None => {
226+
let reg = reg_or_vvvv;
227+
fmtln!(f, "let reg = self.{reg}.enc();");
228+
fmtln!(f, "let vvvv = {};", "0b0");
229+
fmtln!(f, "let rm = self.{rm}.encode_bx_regs();");
230+
fmtln!(f, "let vex = VexPrefix::three_op(reg, vvvv, rm, {bits});");
231+
ModRmStyle::RegMem {
232+
reg: ModRmReg::Reg(*reg),
233+
rm: *rm,
234234
}
235235
}
236+
},
237+
[Reg(reg), Reg(rm)] => {
238+
fmtln!(f, "let reg = self.{reg}.enc();");
239+
fmtln!(f, "let vvvv = 0;");
240+
fmtln!(f, "let rm = (Some(self.{rm}.enc()), None);");
241+
fmtln!(f, "let vex = VexPrefix::three_op(reg, vvvv, rm, {bits});");
242+
ModRmStyle::Reg {
243+
reg: ModRmReg::Reg(*reg),
244+
rm: *rm,
245+
}
236246
}
237247
unknown => unimplemented!("unknown pattern: {unknown:?}"),
238248
};

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ pub fn list() -> Vec<Inst> {
2525
inst("movmskps", fmt("RM", [w(r32), r(xmm2)]), rex([0x0F, 0x50]).r(), _64b | compat | sse),
2626
inst("movmskpd", fmt("RM", [w(r32), r(xmm2)]), rex([0x66, 0x0F, 0x50]).r(), _64b | compat | sse2),
2727
inst("pmovmskb", fmt("RM", [w(r32), r(xmm2)]), rex([0x66, 0x0F, 0xD7]).r(), _64b | compat | sse2),
28+
inst("vmovmskps", fmt("RM", [w(r32), r(xmm2)]), vex(L128)._0f().op(0x50).r(), _64b | compat | avx),
29+
inst("vmovmskpd", fmt("RM", [w(r32), r(xmm2)]), vex(L128)._66()._0f().op(0x50).r(), _64b | compat | avx),
30+
inst("vpmovmskb", fmt("RM", [w(r32), r(xmm2)]), vex(L128)._66()._0f().op(0xD7).r(), _64b | compat | avx),
2831

2932
inst("vpinsrb", fmt("B", [w(xmm1), r(xmm2), r(r32m8), r(imm8)]), vex(L128)._66()._0f3a().w0().op(0x20).r().ib(), _64b | compat | avx),
3033
inst("vpinsrw", fmt("B", [w(xmm1), r(xmm2), r(r32m16), r(imm8)]), vex(L128)._66()._0f().w0().op(0xC4).r().ib(), _64b | compat | avx),

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
use crate::dsl::{Feature::*, Inst, Location::*};
2-
use crate::dsl::{align, fmt, inst, r, rex, rw, sxl, sxq, sxw, w};
1+
use crate::dsl::{Feature::*, Inst, Location::*, VexLength::*};
2+
use crate::dsl::{align, fmt, 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> {
@@ -56,6 +56,10 @@ pub fn list() -> Vec<Inst> {
5656
inst("movq", fmt("A", [w(xmm1), r(rm64)]), rex([0x66, 0x0F, 0x6E]).r().w(), _64b | sse2),
5757
inst("movd", fmt("B", [w(rm32), r(xmm2)]), rex([0x66, 0x0F, 0x7E]).r(), _64b | compat | sse2),
5858
inst("movq", fmt("B", [w(rm64), r(xmm2)]), rex([0x66, 0x0F, 0x7E]).r().w(), _64b | sse2),
59+
inst("vmovd", fmt("A", [w(xmm1), r(rm32)]), vex(L128)._66()._0f().w0().op(0x6E).r(), _64b | compat | avx),
60+
inst("vmovq", fmt("A", [w(xmm1), r(rm64)]), vex(L128)._66()._0f().w1().op(0x6E).r(), _64b | avx),
61+
inst("vmovd", fmt("B", [w(rm32), r(xmm2)]), vex(L128)._66()._0f().w0().op(0x7E).r(), _64b | compat | avx),
62+
inst("vmovq", fmt("B", [w(rm64), r(xmm2)]), vex(L128)._66()._0f().w1().op(0x7E).r(), _64b | avx),
5963

6064
// Move floating-point values to and from XMM locations. Some
6165
// memory-loading versions of `movs*` clear the upper bits of the XMM

cranelift/codegen/src/isa/x64/inst.isle

Lines changed: 7 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -194,20 +194,6 @@
194194
(dst WritableGpr)
195195
(imm u8))
196196

197-
;; XMM (scalar) unary op (from integer to float reg): vmovd, vmovq,
198-
;; vcvtsi2s{s,d}
199-
(GprToXmmVex (op AvxOpcode)
200-
(src GprMem)
201-
(dst WritableXmm)
202-
(src_size OperandSize))
203-
204-
;; XMM (scalar) unary op (from xmm to integer reg): vmovd, vmovq,
205-
;; vcvtts{s,d}2si
206-
(XmmToGprVex (op AvxOpcode)
207-
(src Xmm)
208-
(dst WritableGpr)
209-
(dst_size OperandSize))
210-
211197
;; Float comparisons/tests: cmp (b w l q) (reg addr imm) reg.
212198
(XmmCmpRmRVex (op AvxOpcode)
213199
(src1 Xmm)
@@ -1144,11 +1130,6 @@
11441130
Vpbroadcastw
11451131
Vpbroadcastd
11461132
Vbroadcastss
1147-
Vmovd
1148-
Vmovq
1149-
Vmovmskps
1150-
Vmovmskpd
1151-
Vpmovmskb
11521133
Vsqrtss
11531134
Vsqrtsd
11541135
Vroundss
@@ -1728,20 +1709,6 @@
17281709
(_ Unit (emit (MInst.XmmToGprImmVex op src dst imm))))
17291710
dst))
17301711

1731-
;; Helper for creating `MInst.GprToXmmVex` instructions.
1732-
(decl gpr_to_xmm_vex (AvxOpcode GprMem OperandSize) Xmm)
1733-
(rule (gpr_to_xmm_vex op src size)
1734-
(let ((dst WritableXmm (temp_writable_xmm))
1735-
(_ Unit (emit (MInst.GprToXmmVex op src dst size))))
1736-
dst))
1737-
1738-
;; Helper for creating `MInst.XmmToGprVex` instructions.
1739-
(decl xmm_to_gpr_vex (AvxOpcode Xmm OperandSize) Gpr)
1740-
(rule (xmm_to_gpr_vex op src size)
1741-
(let ((dst WritableGpr (temp_writable_gpr))
1742-
(_ Unit (emit (MInst.XmmToGprVex op src dst size))))
1743-
dst))
1744-
17451712
;; Helper for creating `xmm_min_max_seq` pseudo-instructions.
17461713
(decl xmm_min_max_seq (Type bool Xmm Xmm) Xmm)
17471714
(rule (xmm_min_max_seq ty is_min lhs rhs)
@@ -2126,28 +2093,28 @@
21262093
(rule (x64_movd_to_gpr from) (x64_movd_b from))
21272094
(rule 1 (x64_movd_to_gpr from)
21282095
(if-let true (use_avx))
2129-
(xmm_to_gpr_vex (AvxOpcode.Vmovd) from (OperandSize.Size32)))
2096+
(x64_vmovd_b from))
21302097

21312098
;; Helper for creating `movd` instructions.
21322099
(decl x64_movd_to_xmm (GprMem) Xmm)
21332100
(rule (x64_movd_to_xmm from) (x64_movd_a from))
21342101
(rule 1 (x64_movd_to_xmm from)
21352102
(if-let true (use_avx))
2136-
(gpr_to_xmm_vex (AvxOpcode.Vmovd) from (OperandSize.Size32)))
2103+
(x64_vmovd_a from))
21372104

21382105
;; Helper for creating `movq` instructions.
21392106
(decl x64_movq_to_xmm (GprMem) Xmm)
21402107
(rule (x64_movq_to_xmm src) (x64_movq_a src))
21412108
(rule 1 (x64_movq_to_xmm from)
21422109
(if-let true (use_avx))
2143-
(gpr_to_xmm_vex (AvxOpcode.Vmovq) from (OperandSize.Size64)))
2110+
(x64_vmovq_a from))
21442111

21452112
;; Helper for creating `movq` instructions.
21462113
(decl x64_movq_to_gpr (Xmm) Gpr)
21472114
(rule (x64_movq_to_gpr src) (x64_movq_b src))
21482115
(rule 1 (x64_movq_to_gpr from)
21492116
(if-let true (use_avx))
2150-
(xmm_to_gpr_vex (AvxOpcode.Vmovq) from (OperandSize.Size64)))
2117+
(x64_vmovq_b from))
21512118

21522119
(decl x64_movdqu_load (XmmMem) Xmm)
21532120
(rule (x64_movdqu_load from) (x64_movdqu_a from))
@@ -3986,21 +3953,21 @@
39863953
(rule (x64_pmovmskb src) (x64_pmovmskb_rm src))
39873954
(rule 1 (x64_pmovmskb src)
39883955
(if-let true (use_avx))
3989-
(xmm_to_gpr_vex (AvxOpcode.Vpmovmskb) src (OperandSize.Size32)))
3956+
(x64_vpmovmskb_rm src))
39903957

39913958
;; Helper for creating `movmskps` instructions.
39923959
(decl x64_movmskps (Xmm) Gpr)
39933960
(rule (x64_movmskps src) (x64_movmskps_rm src))
39943961
(rule 1 (x64_movmskps src)
39953962
(if-let true (use_avx))
3996-
(xmm_to_gpr_vex (AvxOpcode.Vmovmskps) src (OperandSize.Size32)))
3963+
(x64_vmovmskps_rm src))
39973964

39983965
;; Helper for creating `movmskpd` instructions.
39993966
(decl x64_movmskpd (Xmm) Gpr)
40003967
(rule (x64_movmskpd src) (x64_movmskpd_rm src))
40013968
(rule 1 (x64_movmskpd src)
40023969
(if-let true (use_avx))
4003-
(xmm_to_gpr_vex (AvxOpcode.Vmovmskpd) src (OperandSize.Size32)))
3970+
(x64_vmovmskpd_rm src))
40043971

40053972
;; Helper for creating `not` instructions.
40063973
(decl x64_not (Type Gpr) Gpr)

cranelift/codegen/src/isa/x64/inst/args.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1129,11 +1129,6 @@ impl AvxOpcode {
11291129
| AvxOpcode::Vpextrq
11301130
| AvxOpcode::Vpblendw
11311131
| AvxOpcode::Vbroadcastss
1132-
| AvxOpcode::Vmovd
1133-
| AvxOpcode::Vmovq
1134-
| AvxOpcode::Vmovmskps
1135-
| AvxOpcode::Vmovmskpd
1136-
| AvxOpcode::Vpmovmskb
11371132
| AvxOpcode::Vsqrtss
11381133
| AvxOpcode::Vsqrtsd
11391134
| AvxOpcode::Vroundss

cranelift/codegen/src/isa/x64/inst/emit.rs

Lines changed: 0 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1996,82 +1996,6 @@ pub(crate) fn emit(
19961996
.encode(sink);
19971997
}
19981998

1999-
Inst::XmmToGprVex {
2000-
op,
2001-
src,
2002-
dst,
2003-
dst_size,
2004-
} => {
2005-
let src = src.to_reg();
2006-
let dst = dst.to_reg().to_reg();
2007-
2008-
let (prefix, map, opcode) = match op {
2009-
// vmovd/vmovq are differentiated by `w`
2010-
AvxOpcode::Vmovd | AvxOpcode::Vmovq => (LegacyPrefixes::_66, OpcodeMap::_0F, 0x7E),
2011-
AvxOpcode::Vmovmskps => (LegacyPrefixes::None, OpcodeMap::_0F, 0x50),
2012-
AvxOpcode::Vmovmskpd => (LegacyPrefixes::_66, OpcodeMap::_0F, 0x50),
2013-
AvxOpcode::Vpmovmskb => (LegacyPrefixes::_66, OpcodeMap::_0F, 0xD7),
2014-
_ => unimplemented!("Opcode {:?} not implemented", op),
2015-
};
2016-
let w = match dst_size {
2017-
OperandSize::Size64 => true,
2018-
_ => false,
2019-
};
2020-
let mut vex = VexInstruction::new()
2021-
.length(VexVectorLength::V128)
2022-
.w(w)
2023-
.prefix(prefix)
2024-
.map(map)
2025-
.opcode(opcode);
2026-
vex = match op {
2027-
// The `vmovq/vmovd` reverse the order of the destination/source
2028-
// relative to other opcodes using this shape of instruction.
2029-
AvxOpcode::Vmovd | AvxOpcode::Vmovq => vex
2030-
.rm(dst.to_real_reg().unwrap().hw_enc())
2031-
.reg(src.to_real_reg().unwrap().hw_enc()),
2032-
_ => vex
2033-
.rm(src.to_real_reg().unwrap().hw_enc())
2034-
.reg(dst.to_real_reg().unwrap().hw_enc()),
2035-
};
2036-
vex.encode(sink);
2037-
}
2038-
2039-
Inst::GprToXmmVex {
2040-
op,
2041-
src,
2042-
dst,
2043-
src_size,
2044-
} => {
2045-
let dst = dst.to_reg().to_reg();
2046-
let src = match src.clone().to_reg_mem().clone() {
2047-
RegMem::Reg { reg } => {
2048-
RegisterOrAmode::Register(reg.to_real_reg().unwrap().hw_enc().into())
2049-
}
2050-
RegMem::Mem { addr } => {
2051-
RegisterOrAmode::Amode(addr.finalize(state.frame_layout(), sink))
2052-
}
2053-
};
2054-
2055-
let (prefix, map, opcode) = match op {
2056-
// vmovd/vmovq are differentiated by `w`
2057-
AvxOpcode::Vmovd | AvxOpcode::Vmovq => (LegacyPrefixes::_66, OpcodeMap::_0F, 0x6E),
2058-
_ => unimplemented!("Opcode {:?} not implemented", op),
2059-
};
2060-
let w = match src_size {
2061-
OperandSize::Size64 => true,
2062-
_ => false,
2063-
};
2064-
VexInstruction::new()
2065-
.length(VexVectorLength::V128)
2066-
.w(w)
2067-
.prefix(prefix)
2068-
.map(map)
2069-
.opcode(opcode)
2070-
.rm(src)
2071-
.reg(dst.to_real_reg().unwrap().hw_enc())
2072-
.encode(sink);
2073-
}
2074-
20751999
Inst::XmmCmpRmRVex { op, src1, src2 } => {
20762000
let src1 = src1.to_reg();
20772001
let src2 = match src2.clone().to_reg_mem().clone() {

cranelift/codegen/src/isa/x64/inst/mod.rs

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,6 @@ impl Inst {
157157
| Inst::XmmMovRMVex { op, .. }
158158
| Inst::XmmMovRMImmVex { op, .. }
159159
| Inst::XmmToGprImmVex { op, .. }
160-
| Inst::XmmToGprVex { op, .. }
161-
| Inst::GprToXmmVex { op, .. }
162160
| Inst::XmmCmpRmRVex { op, .. } => op.available_from(),
163161

164162
Inst::External { inst } => {
@@ -876,38 +874,13 @@ impl PrettyPrint for Inst {
876874
format!("{op} {dst}")
877875
}
878876

879-
Inst::XmmToGprVex {
880-
op,
881-
src,
882-
dst,
883-
dst_size,
884-
} => {
885-
let dst_size = dst_size.to_bytes();
886-
let src = pretty_print_reg(src.to_reg(), 8);
887-
let dst = pretty_print_reg(dst.to_reg().to_reg(), dst_size);
888-
let op = ljustify(op.to_string());
889-
format!("{op} {src}, {dst}")
890-
}
891-
892877
Inst::XmmToGprImmVex { op, src, dst, imm } => {
893878
let src = pretty_print_reg(src.to_reg(), 8);
894879
let dst = pretty_print_reg(dst.to_reg().to_reg(), 8);
895880
let op = ljustify(op.to_string());
896881
format!("{op} ${imm}, {src}, {dst}")
897882
}
898883

899-
Inst::GprToXmmVex {
900-
op,
901-
src,
902-
src_size,
903-
dst,
904-
} => {
905-
let dst = pretty_print_reg(dst.to_reg().to_reg(), 8);
906-
let src = src.pretty_print(src_size.to_bytes());
907-
let op = ljustify(op.to_string());
908-
format!("{op} {src}, {dst}")
909-
}
910-
911884
Inst::XmmCmpRmR { op, src1, src2 } => {
912885
let src1 = pretty_print_reg(src1.to_reg(), 8);
913886
let src2 = src2.pretty_print(8);
@@ -1688,14 +1661,10 @@ fn x64_get_operands(inst: &mut Inst, collector: &mut impl OperandVisitor) {
16881661
collector.reg_use(src);
16891662
collector.reg_fixed_nonallocatable(*dst);
16901663
}
1691-
Inst::XmmToGprVex { src, dst, .. } | Inst::XmmToGprImmVex { src, dst, .. } => {
1664+
Inst::XmmToGprImmVex { src, dst, .. } => {
16921665
collector.reg_use(src);
16931666
collector.reg_def(dst);
16941667
}
1695-
Inst::GprToXmmVex { src, dst, .. } => {
1696-
collector.reg_def(dst);
1697-
src.get_operands(collector);
1698-
}
16991668
Inst::CvtUint64ToFloatSeq {
17001669
src,
17011670
dst,

cranelift/codegen/src/isa/x64/lower.isle

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1900,6 +1900,9 @@
19001900
(rule 1 (lower (trapz (icmp cc a b) code))
19011901
(side_effect (trap_if_icmp (emit_cmp (intcc_complement cc) a b) code)))
19021902

1903+
(rule 1 (lower (trapz (fcmp cc a b) code))
1904+
(side_effect (trap_if_fcmp (emit_fcmp (floatcc_complement cc) a b) code)))
1905+
19031906
;;;; Rules for `trapnz` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
19041907

19051908
(rule 0 (lower (trapnz val code))
@@ -1908,6 +1911,9 @@
19081911
(rule 1 (lower (trapnz (icmp cc a b) code))
19091912
(side_effect (trap_if_icmp (emit_cmp cc a b) code)))
19101913

1914+
(rule 1 (lower (trapnz (fcmp cc a b) code))
1915+
(side_effect (trap_if_fcmp (emit_fcmp cc a b) code)))
1916+
19111917
;;;; Rules for `uadd_overflow_trap` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
19121918

19131919
(rule (lower (has_type (fits_in_64 ty) (uadd_overflow_trap a b tc)))

0 commit comments

Comments
 (0)