Path: blob/main/cranelift/assembler-x64/src/xmm.rs
1692 views
//! Xmm register operands; see [`Xmm`].12use crate::{AsReg, CodeSink, rex::encode_modrm};34/// An x64 SSE register (e.g., `%xmm0`).5#[derive(Clone, Copy, Debug)]6pub struct Xmm<R: AsReg = u8>(pub(crate) R);78impl<R: AsReg> Xmm<R> {9/// Create a new [`Xmm`] register.10pub fn new(reg: R) -> Self {11Self(reg)12}1314/// Return the register's hardware encoding; the underlying type `R` _must_15/// be a real register at this point.16///17/// # Panics18///19/// Panics if the register is not a valid Xmm register.20pub fn enc(&self) -> u8 {21let enc = self.0.enc();22assert!(enc < 16, "invalid register: {enc}");23enc24}2526/// Return the register name.27pub fn to_string(&self) -> String {28self.0.to_string(None)29}3031/// Emit this register as the `r/m` field of a ModR/M byte.32pub(crate) fn encode_modrm(&self, sink: &mut impl CodeSink, enc_reg: u8) {33sink.put1(encode_modrm(0b11, enc_reg & 0b111, self.enc() & 0b111));34}3536/// Return the registers for encoding the `b` and `x` bits (e.g., in a VEX37/// prefix).38///39/// This is primarily used for `*Mem` variants (see40/// `XmmMem::encode_bx_regs`), but when used on a single `Xmm` register,41/// only the `b` bit is set by the topmost bit (the fourth bit) of this42/// register. We expect this register to be in the `rm` slot.43pub(crate) fn encode_bx_regs(&self) -> (Option<u8>, Option<u8>) {44(Some(self.enc()), None)45}46}4748impl<R: AsReg> AsRef<R> for Xmm<R> {49fn as_ref(&self) -> &R {50&self.051}52}5354impl<R: AsReg> AsMut<R> for Xmm<R> {55fn as_mut(&mut self) -> &mut R {56&mut self.057}58}5960impl<R: AsReg> From<R> for Xmm<R> {61fn from(reg: R) -> Xmm<R> {62Xmm(reg)63}64}6566/// Encode xmm registers.67pub mod enc {68pub const XMM0: u8 = 0;69pub const XMM1: u8 = 1;70pub const XMM2: u8 = 2;71pub const XMM3: u8 = 3;72pub const XMM4: u8 = 4;73pub const XMM5: u8 = 5;74pub const XMM6: u8 = 6;75pub const XMM7: u8 = 7;76pub const XMM8: u8 = 8;77pub const XMM9: u8 = 9;78pub const XMM10: u8 = 10;79pub const XMM11: u8 = 11;80pub const XMM12: u8 = 12;81pub const XMM13: u8 = 13;82pub const XMM14: u8 = 14;83pub const XMM15: u8 = 15;8485/// Return the name of a XMM encoding (`enc`).86///87/// # Panics88///89/// This function will panic if the encoding is not a valid x64 register.90pub fn to_string(enc: u8) -> &'static str {91match enc {92XMM0 => "%xmm0",93XMM1 => "%xmm1",94XMM2 => "%xmm2",95XMM3 => "%xmm3",96XMM4 => "%xmm4",97XMM5 => "%xmm5",98XMM6 => "%xmm6",99XMM7 => "%xmm7",100XMM8 => "%xmm8",101XMM9 => "%xmm9",102XMM10 => "%xmm10",103XMM11 => "%xmm11",104XMM12 => "%xmm12",105XMM13 => "%xmm13",106XMM14 => "%xmm14",107XMM15 => "%xmm15",108_ => panic!("%invalid{enc}"),109}110}111}112113114