cranelift_assembler_x64/
xmm.rs1use crate::{AsReg, CodeSink, rex::encode_modrm};
4
5#[derive(Clone, Copy, Debug)]
7pub struct Xmm<R: AsReg = u8>(pub(crate) R);
8
9impl<R: AsReg> Xmm<R> {
10 pub fn new(reg: R) -> Self {
12 Self(reg)
13 }
14
15 pub fn enc(&self) -> u8 {
22 let enc = self.0.enc();
23 assert!(enc < 16, "invalid register: {enc}");
24 enc
25 }
26
27 pub fn to_string(&self) -> String {
29 self.0.to_string(None)
30 }
31
32 pub(crate) fn encode_modrm(&self, sink: &mut impl CodeSink, enc_reg: u8) {
34 sink.put1(encode_modrm(0b11, enc_reg & 0b111, self.enc() & 0b111));
35 }
36}
37
38impl<R: AsReg> AsRef<R> for Xmm<R> {
39 fn as_ref(&self) -> &R {
40 &self.0
41 }
42}
43
44impl<R: AsReg> AsMut<R> for Xmm<R> {
45 fn as_mut(&mut self) -> &mut R {
46 &mut self.0
47 }
48}
49
50impl<R: AsReg> From<R> for Xmm<R> {
51 fn from(reg: R) -> Xmm<R> {
52 Xmm(reg)
53 }
54}
55
56pub mod enc {
58 pub const XMM0: u8 = 0;
59 pub const XMM1: u8 = 1;
60 pub const XMM2: u8 = 2;
61 pub const XMM3: u8 = 3;
62 pub const XMM4: u8 = 4;
63 pub const XMM5: u8 = 5;
64 pub const XMM6: u8 = 6;
65 pub const XMM7: u8 = 7;
66 pub const XMM8: u8 = 8;
67 pub const XMM9: u8 = 9;
68 pub const XMM10: u8 = 10;
69 pub const XMM11: u8 = 11;
70 pub const XMM12: u8 = 12;
71 pub const XMM13: u8 = 13;
72 pub const XMM14: u8 = 14;
73 pub const XMM15: u8 = 15;
74
75 pub fn to_string(enc: u8) -> &'static str {
81 match enc {
82 XMM0 => "%xmm0",
83 XMM1 => "%xmm1",
84 XMM2 => "%xmm2",
85 XMM3 => "%xmm3",
86 XMM4 => "%xmm4",
87 XMM5 => "%xmm5",
88 XMM6 => "%xmm6",
89 XMM7 => "%xmm7",
90 XMM8 => "%xmm8",
91 XMM9 => "%xmm9",
92 XMM10 => "%xmm10",
93 XMM11 => "%xmm11",
94 XMM12 => "%xmm12",
95 XMM13 => "%xmm13",
96 XMM14 => "%xmm14",
97 XMM15 => "%xmm15",
98 _ => panic!("%invalid{enc}"),
99 }
100 }
101}