Path: blob/main/cranelift/assembler-x64/meta/src/generate/operand.rs
1693 views
use crate::dsl;12impl dsl::Operand {3#[must_use]4pub fn generate_type(&self) -> String {5use dsl::Location::*;6let mut_ = self.mutability.generate_camel_case();7match self.location {8imm8 | imm16 | imm32 | imm64 => {9let bits = self.location.bits();10if self.extension.is_sign_extended() {11format!("Simm{bits}")12} else {13format!("Imm{bits}")14}15}16al | ax | eax | rax | rbx | cl | rcx | dx | edx | rdx => {17let enc = match self.location {18al | ax | eax | rax => "{ gpr::enc::RAX }",19rbx => "{ gpr::enc::RBX }",20cl | rcx => "{ gpr::enc::RCX }",21dx | edx | rdx => "{ gpr::enc::RDX }",22_ => unreachable!(),23};24format!("Fixed<R::{mut_}Gpr, {enc}>")25}26r8 | r16 | r32 | r32a | r32b | r64 | r64a | r64b => format!("Gpr<R::{mut_}Gpr>"),27rm8 | rm16 | rm32 | rm64 => format!("GprMem<R::{mut_}Gpr, R::ReadGpr>"),28xmm1 | xmm2 | xmm3 => {29format!("Xmm<R::{mut_}Xmm>")30}31xmm_m8 | xmm_m16 | xmm_m32 | xmm_m64 | xmm_m128 => {32format!("XmmMem<R::{mut_}Xmm, R::ReadGpr>")33}34m8 | m16 | m32 | m64 | m128 => format!("Amode<R::ReadGpr>"),35xmm0 => format!("Fixed<R::{mut_}Xmm, {{ xmm::enc::XMM0 }}>"),36}37}38}3940impl dsl::Location {41/// `self.<operand>.to_string(...)`42#[must_use]43pub fn generate_to_string(&self, extension: dsl::Extension) -> String {44use dsl::Location::*;45match self {46imm8 | imm16 | imm32 | imm64 => {47if extension.is_sign_extended() {48let variant = extension.generate_variant();49format!("self.{self}.to_string({variant})")50} else {51format!("self.{self}.to_string()")52}53}54r8 | r16 | r32 | r32a | r32b | r64 | r64a | r64b | rm8 | rm16 | rm32 | rm64 => {55match self.generate_size() {56Some(size) => format!("self.{self}.to_string({size})"),57None => unreachable!(),58}59}60al | ax | eax | rax | rbx | cl | rcx | dx | edx | rdx | xmm0 => {61match self.generate_size() {62Some(size) => format!("self.{self}.to_string(Some({size}))"),63None => format!("self.{self}.to_string(None)"),64}65}66xmm1 | xmm2 | xmm3 | xmm_m8 | xmm_m16 | xmm_m32 | xmm_m64 | xmm_m128 | m8 | m1667| m32 | m64 | m128 => {68format!("self.{self}.to_string()")69}70}71}7273/// `Size::<operand size>`74#[must_use]75fn generate_size(&self) -> Option<&str> {76use dsl::Location::*;77match self {78imm8 | imm16 | imm32 | imm64 => None,79al | cl | r8 | rm8 => Some("Size::Byte"),80ax | dx | r16 | rm16 => Some("Size::Word"),81eax | edx | r32 | r32a | r32b | rm32 => Some("Size::Doubleword"),82rax | rbx | rcx | rdx | r64 | r64a | r64b | rm64 => Some("Size::Quadword"),83m8 | m16 | m32 | m64 | m128 => {84panic!("no need to generate a size for memory-only access")85}86xmm1 | xmm2 | xmm3 | xmm_m8 | xmm_m16 | xmm_m32 | xmm_m64 | xmm_m128 | xmm0 => None,87}88}89}9091impl dsl::Mutability {92#[must_use]93pub fn generate_camel_case(&self) -> &str {94match self {95dsl::Mutability::Read => "Read",96dsl::Mutability::ReadWrite => "ReadWrite",97dsl::Mutability::Write => "Write",98}99}100101#[must_use]102pub fn generate_snake_case(&self) -> &str {103match self {104dsl::Mutability::Read => "read",105dsl::Mutability::ReadWrite => "read_write",106dsl::Mutability::Write => "write",107}108}109}110111impl dsl::Extension {112/// `Extension::...`113#[must_use]114pub fn generate_variant(&self) -> &str {115use dsl::Extension::*;116match self {117None => "Extension::None",118SignExtendWord => "Extension::SignExtendWord",119SignExtendLong => "Extension::SignExtendLong",120SignExtendQuad => "Extension::SignExtendQuad",121}122}123}124125126