winch_codegen/isa/x64/
address.rs

1//! x64 addressing mode.
2
3use crate::reg::Reg;
4use cranelift_codegen::ir::Constant;
5
6/// Memory address representation.
7#[derive(Debug, Copy, Clone)]
8pub(crate) enum Address {
9    /// Base register with an immediate offset.
10    Offset { base: Reg, offset: u32 },
11    /// Address to identify a constant.
12    Const(Constant),
13    /// Address at `(base + index * 2^shift) + simm32`
14    ImmRegRegShift {
15        simm32: i32,
16        base: Reg,
17        index: Reg,
18        shift: u8,
19    },
20}
21
22impl Address {
23    /// Create an offset.
24    pub fn offset(base: Reg, offset: u32) -> Self {
25        Self::Offset { base, offset }
26    }
27
28    /// Create an address for a constant.
29    pub fn constant(data: Constant) -> Self {
30        Self::Const(data)
31    }
32
33    /// Check if the address is a made made of a base and offset.
34    pub fn is_offset(&self) -> bool {
35        match self {
36            Self::Offset { .. } => true,
37            _ => false,
38        }
39    }
40}