Path: blob/main/cranelift/assembler-x64/src/xmm.rs
3081 views
//! Xmm register operands; see [`Xmm`].12use crate::{AsReg, CodeSink, rex::encode_modrm};34use alloc::string::String;56/// An x64 SSE register (e.g., `%xmm0`).7#[derive(Clone, Copy, Debug)]8pub struct Xmm<R: AsReg = u8>(pub(crate) R);910impl<R: AsReg> Xmm<R> {11/// Create a new [`Xmm`] register.12pub fn new(reg: R) -> Self {13Self(reg)14}1516/// Return the register's hardware encoding; the underlying type `R` _must_17/// be a real register at this point.18///19/// # Panics20///21/// Panics if the register is not a valid Xmm register.22pub fn enc(&self) -> u8 {23let enc = self.0.enc();24assert!(enc < 16, "invalid register: {enc}");25enc26}2728/// Return the register name.29pub fn to_string(&self) -> String {30self.0.to_string(None)31}3233/// Emit this register as the `r/m` field of a ModR/M byte.34pub(crate) fn encode_modrm(&self, sink: &mut impl CodeSink, enc_reg: u8) {35sink.put1(encode_modrm(0b11, enc_reg & 0b111, self.enc() & 0b111));36}3738/// Return the registers for encoding the `b` and `x` bits (e.g., in a VEX39/// prefix).40///41/// This is primarily used for `*Mem` variants (see42/// `XmmMem::encode_bx_regs`), but when used on a single `Xmm` register,43/// only the `b` bit is set by the topmost bit (the fourth bit) of this44/// register. We expect this register to be in the `rm` slot.45pub(crate) fn encode_bx_regs(&self) -> (Option<u8>, Option<u8>) {46(Some(self.enc()), None)47}48}4950impl<R: AsReg> AsRef<R> for Xmm<R> {51fn as_ref(&self) -> &R {52&self.053}54}5556impl<R: AsReg> AsMut<R> for Xmm<R> {57fn as_mut(&mut self) -> &mut R {58&mut self.059}60}6162impl<R: AsReg> From<R> for Xmm<R> {63fn from(reg: R) -> Xmm<R> {64Xmm(reg)65}66}6768/// Encode xmm registers.69pub mod enc {70pub const XMM0: u8 = 0;71pub const XMM1: u8 = 1;72pub const XMM2: u8 = 2;73pub const XMM3: u8 = 3;74pub const XMM4: u8 = 4;75pub const XMM5: u8 = 5;76pub const XMM6: u8 = 6;77pub const XMM7: u8 = 7;78pub const XMM8: u8 = 8;79pub const XMM9: u8 = 9;80pub const XMM10: u8 = 10;81pub const XMM11: u8 = 11;82pub const XMM12: u8 = 12;83pub const XMM13: u8 = 13;84pub const XMM14: u8 = 14;85pub const XMM15: u8 = 15;8687/// Return the name of a XMM encoding (`enc`).88///89/// # Panics90///91/// This function will panic if the encoding is not a valid x64 register.92pub fn to_string(enc: u8) -> &'static str {93match enc {94XMM0 => "%xmm0",95XMM1 => "%xmm1",96XMM2 => "%xmm2",97XMM3 => "%xmm3",98XMM4 => "%xmm4",99XMM5 => "%xmm5",100XMM6 => "%xmm6",101XMM7 => "%xmm7",102XMM8 => "%xmm8",103XMM9 => "%xmm9",104XMM10 => "%xmm10",105XMM11 => "%xmm11",106XMM12 => "%xmm12",107XMM13 => "%xmm13",108XMM14 => "%xmm14",109XMM15 => "%xmm15",110_ => panic!("%invalid{enc}"),111}112}113}114115116