Path: blob/main/cranelift/codegen/src/isa/s390x/inst/imms.rs
3088 views
//! S390x ISA definitions: immediate constants.12use crate::machinst::PrettyPrint;3use alloc::string::String;45/// An unsigned 12-bit immediate.6#[derive(Clone, Copy, Debug)]7pub struct UImm12 {8/// The value.9value: u16,10}1112impl UImm12 {13pub fn maybe_from_u64(value: u64) -> Option<UImm12> {14if value < 4096 {15Some(UImm12 {16value: value as u16,17})18} else {19None20}21}2223pub fn maybe_from_simm20(value: SImm20) -> Option<UImm12> {24let SImm20 { value } = value;25if value >= 0 {26Self::maybe_from_u64(value as u64)27} else {28None29}30}3132/// Create a zero immediate of this format.33pub fn zero() -> UImm12 {34UImm12 { value: 0 }35}3637/// Bits for encoding.38pub fn bits(&self) -> u32 {39u32::from(self.value)40}41}4243/// A signed 20-bit immediate.44#[derive(Clone, Copy, Debug)]45pub struct SImm20 {46/// The value.47value: i32,48}4950impl SImm20 {51pub fn maybe_from_i64(value: i64) -> Option<SImm20> {52if value >= -524288 && value < 524288 {53Some(SImm20 {54value: value as i32,55})56} else {57None58}59}6061pub fn from_uimm12(value: UImm12) -> SImm20 {62SImm20 {63value: value.bits() as i32,64}65}6667/// Bits for encoding.68pub fn bits(&self) -> u32 {69let encoded: u32 = self.value as u32;70encoded & 0xfffff71}72}7374/// A 16-bit immediate with a {0,16,32,48}-bit shift.75#[derive(Clone, Copy, Debug)]76pub struct UImm16Shifted {77/// The value.78pub bits: u16,79/// Result is `bits` shifted 16*shift bits to the left.80pub shift: u8,81}8283impl UImm16Shifted {84/// Construct a UImm16Shifted from an arbitrary 64-bit constant if possible.85pub fn maybe_from_u64(value: u64) -> Option<UImm16Shifted> {86let mask0 = 0x0000_0000_0000_ffffu64;87let mask1 = 0x0000_0000_ffff_0000u64;88let mask2 = 0x0000_ffff_0000_0000u64;89let mask3 = 0xffff_0000_0000_0000u64;9091if value == (value & mask0) {92return Some(UImm16Shifted {93bits: (value & mask0) as u16,94shift: 0,95});96}97if value == (value & mask1) {98return Some(UImm16Shifted {99bits: ((value >> 16) & mask0) as u16,100shift: 1,101});102}103if value == (value & mask2) {104return Some(UImm16Shifted {105bits: ((value >> 32) & mask0) as u16,106shift: 2,107});108}109if value == (value & mask3) {110return Some(UImm16Shifted {111bits: ((value >> 48) & mask0) as u16,112shift: 3,113});114}115None116}117118pub fn maybe_with_shift(imm: u16, shift: u8) -> Option<UImm16Shifted> {119let shift_enc = shift / 16;120if shift_enc > 3 {121None122} else {123Some(UImm16Shifted {124bits: imm,125shift: shift_enc,126})127}128}129130pub fn negate_bits(&self) -> UImm16Shifted {131UImm16Shifted {132bits: !self.bits,133shift: self.shift,134}135}136}137138/// A 32-bit immediate with a {0,32}-bit shift.139#[derive(Clone, Copy, Debug)]140pub struct UImm32Shifted {141/// The value.142pub bits: u32,143/// Result is `bits` shifted 32*shift bits to the left.144pub shift: u8,145}146147impl UImm32Shifted {148/// Construct a UImm32Shifted from an arbitrary 64-bit constant if possible.149pub fn maybe_from_u64(value: u64) -> Option<UImm32Shifted> {150let mask0 = 0x0000_0000_ffff_ffffu64;151let mask1 = 0xffff_ffff_0000_0000u64;152153if value == (value & mask0) {154return Some(UImm32Shifted {155bits: (value & mask0) as u32,156shift: 0,157});158}159if value == (value & mask1) {160return Some(UImm32Shifted {161bits: ((value >> 32) & mask0) as u32,162shift: 1,163});164}165None166}167168pub fn maybe_with_shift(imm: u32, shift: u8) -> Option<UImm32Shifted> {169let shift_enc = shift / 32;170if shift_enc > 3 {171None172} else {173Some(UImm32Shifted {174bits: imm,175shift: shift_enc,176})177}178}179180pub fn negate_bits(&self) -> UImm32Shifted {181UImm32Shifted {182bits: !self.bits,183shift: self.shift,184}185}186}187188impl PrettyPrint for UImm12 {189fn pretty_print(&self, _: u8) -> String {190format!("{}", self.value)191}192}193194impl PrettyPrint for SImm20 {195fn pretty_print(&self, _: u8) -> String {196format!("{}", self.value)197}198}199200impl PrettyPrint for UImm16Shifted {201fn pretty_print(&self, _: u8) -> String {202format!("{}", self.bits)203}204}205206impl PrettyPrint for UImm32Shifted {207fn pretty_print(&self, _: u8) -> String {208format!("{}", self.bits)209}210}211212213