Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/cranelift/assembler-x64/meta/src/instructions/cvt.rs
1693 views
1
use crate::dsl::{Customization::*, Feature::*, Inst, Length::*, Location::*, TupleType::*};
2
use crate::dsl::{align, evex, fmt, inst, r, rex, rw, vex, w};
3
4
#[rustfmt::skip] // Keeps instructions on a single line.
5
pub fn list() -> Vec<Inst> {
6
vec![
7
// From 32-bit floating point.
8
inst("cvtps2pd", fmt("A", [w(xmm1), r(xmm_m64)]), rex([0x0F, 0x5A]).r(), (_64b | compat) & sse2),
9
inst("cvttps2dq", fmt("A", [w(xmm1), r(align(xmm_m128))]), rex([0xF3, 0x0F, 0x5B]).r(), (_64b | compat) & sse2),
10
inst("cvtss2sd", fmt("A", [rw(xmm1), r(xmm_m32)]), rex([0xF3, 0x0F, 0x5A]).r(), (_64b | compat) & sse2),
11
inst("cvtss2si", fmt("A", [w(r32), r(xmm_m32)]), rex([0xF3, 0x0F, 0x2D]).r(), (_64b | compat) & sse),
12
inst("cvtss2si", fmt("AQ", [w(r64), r(xmm_m32)]), rex([0xF3, 0x0F, 0x2D]).w().r(), _64b & sse),
13
inst("cvttss2si", fmt("A", [w(r32), r(xmm_m32)]), rex([0xF3, 0x0F, 0x2C]).r(), (_64b | compat) & sse),
14
inst("cvttss2si", fmt("AQ", [w(r64), r(xmm_m32)]), rex([0xF3, 0x0F, 0x2C]).w().r(), _64b & sse),
15
16
inst("vcvtps2pd", fmt("A", [w(xmm1), r(xmm_m64)]), vex(L128)._0f().op(0x5A).r(), (_64b | compat) & avx),
17
inst("vcvttps2dq", fmt("A", [w(xmm1), r(xmm_m128)]), vex(L128)._f3()._0f().op(0x5B).r(), (_64b | compat) & avx),
18
inst("vcvtss2sd", fmt("B", [w(xmm1), r(xmm2), r(xmm_m32)]), vex(LIG)._f3()._0f().op(0x5A).r(), (_64b | compat) & avx),
19
inst("vcvtss2si", fmt("A", [w(r32), r(xmm_m32)]), vex(LIG)._f3()._0f().w0().op(0x2D).r(), (_64b | compat) & avx),
20
inst("vcvtss2si", fmt("AQ", [w(r64), r(xmm_m32)]), vex(LIG)._f3()._0f().w1().op(0x2D).r(), _64b & avx),
21
inst("vcvttss2si", fmt("A", [w(r32), r(xmm_m32)]), vex(LIG)._f3()._0f().w0().op(0x2C).r(), (_64b | compat) & avx),
22
inst("vcvttss2si", fmt("AQ", [w(r64), r(xmm_m32)]), vex(LIG)._f3()._0f().w1().op(0x2C).r(), _64b & avx),
23
24
// From 64-bit floating point.
25
inst("cvtpd2ps", fmt("A", [w(xmm1), r(align(xmm_m128))]), rex([0x66, 0x0F, 0x5A]).r(), (_64b | compat) & sse2),
26
inst("cvttpd2dq", fmt("A", [w(xmm1), r(align(xmm_m128))]), rex([0x66, 0x0F, 0xE6]).r(), (_64b | compat) & sse2),
27
inst("cvtsd2ss", fmt("A", [rw(xmm1), r(xmm_m64)]), rex([0xF2, 0x0F, 0x5A]).r(), (_64b | compat) & sse2),
28
inst("cvtsd2si", fmt("A", [w(r32), r(xmm_m64)]), rex([0xF2, 0x0F, 0x2D]).r(), (_64b | compat) & sse2),
29
inst("cvtsd2si", fmt("AQ", [w(r64), r(xmm_m64)]), rex([0xF2, 0x0F, 0x2D]).w().r(), _64b & sse2),
30
inst("cvttsd2si", fmt("A", [w(r32), r(xmm_m64)]), rex([0xF2, 0x0F, 0x2C]).r(), (_64b | compat) & sse2),
31
inst("cvttsd2si", fmt("AQ", [w(r64), r(xmm_m64)]), rex([0xF2, 0x0F, 0x2C]).w().r(), _64b & sse2),
32
33
inst("vcvtpd2ps", fmt("A", [w(xmm1), r(xmm_m128)]), vex(L128)._66()._0f().op(0x5A).r(), (_64b | compat) & avx).custom(Mnemonic),
34
inst("vcvttpd2dq", fmt("A", [w(xmm1), r(xmm_m128)]), vex(L128)._66()._0f().op(0xE6).r(), (_64b | compat) & avx).custom(Mnemonic),
35
inst("vcvtsd2ss", fmt("B", [w(xmm1), r(xmm2), r(xmm_m64)]), vex(LIG)._f2()._0f().op(0x5A).r(), (_64b | compat) & avx),
36
inst("vcvtsd2si", fmt("A", [w(r32), r(xmm_m64)]), vex(LIG)._f2()._0f().w0().op(0x2D).r(), (_64b | compat) & avx),
37
inst("vcvtsd2si", fmt("AQ", [w(r64), r(xmm_m64)]), vex(LIG)._f2()._0f().w1().op(0x2D).r(), _64b & avx),
38
inst("vcvttsd2si", fmt("A", [w(r32), r(xmm_m64)]), vex(LIG)._f2()._0f().w0().op(0x2C).r(), (_64b | compat) & avx),
39
inst("vcvttsd2si", fmt("AQ", [w(r64), r(xmm_m64)]), vex(LIG)._f2()._0f().w1().op(0x2C).r(), _64b & avx),
40
41
// From signed 32-bit integer.
42
inst("cvtdq2ps", fmt("A", [w(xmm1), r(align(xmm_m128))]), rex([0x0F, 0x5B]).r(), (_64b | compat) & sse2),
43
inst("cvtdq2pd", fmt("A", [w(xmm1), r(xmm_m64)]), rex([0xF3, 0x0F, 0xE6]).r(), (_64b | compat) & sse2),
44
inst("cvtsi2ssl", fmt("A", [rw(xmm1), r(rm32)]), rex([0xF3, 0x0F, 0x2A]).r(), (_64b | compat) & sse),
45
inst("cvtsi2ssq", fmt("A", [rw(xmm1), r(rm64)]), rex([0xF3, 0x0F, 0x2A]).w().r(), _64b & sse),
46
inst("cvtsi2sdl", fmt("A", [rw(xmm1), r(rm32)]), rex([0xF2, 0x0F, 0x2A]).r(), (_64b | compat) & sse2),
47
inst("cvtsi2sdq", fmt("A", [rw(xmm1), r(rm64)]), rex([0xF2, 0x0F, 0x2A]).w().r(), _64b & sse2),
48
49
inst("vcvtdq2pd", fmt("A", [w(xmm1), r(xmm_m64)]), vex(L128)._f3()._0f().op(0xE6).r(), (_64b | compat) & avx),
50
inst("vcvtdq2ps", fmt("A", [w(xmm1), r(xmm_m128)]), vex(L128)._0f().op(0x5B).r(), (_64b | compat) & avx),
51
inst("vcvtsi2sdl", fmt("B", [w(xmm1), r(xmm2), r(rm32)]), vex(LIG)._f2()._0f().w0().op(0x2A).r(), (_64b | compat) & avx),
52
inst("vcvtsi2sdq", fmt("B", [w(xmm1), r(xmm2), r(rm64)]), vex(LIG)._f2()._0f().w1().op(0x2A).r(), _64b & avx),
53
inst("vcvtsi2ssl", fmt("B", [w(xmm1), r(xmm2), r(rm32)]), vex(LIG)._f3()._0f().w0().op(0x2A).r(), (_64b | compat) & avx),
54
inst("vcvtsi2ssq", fmt("B", [w(xmm1), r(xmm2), r(rm64)]), vex(LIG)._f3()._0f().w1().op(0x2A).r(), _64b & avx),
55
56
// Currently omitted as Cranelift doesn't need them but could be added
57
// in the future:
58
//
59
// * cvtpd2dq
60
// * cvtpd2pi
61
// * cvtpi2pd
62
// * cvtpi2ps
63
// * cvtps2dq
64
// * cvtps2pi
65
// * cvttpd2pi
66
// * cvttps2pi
67
68
inst("vcvtudq2ps", fmt("A", [w(xmm1), r(xmm_m128)]), evex(L128, Full)._f2()._0f().w0().op(0x7A).r(), _64b | avx512vl | avx512f),
69
]
70
}
71
72