pub struct Mem { /* private fields */ }Expand description
A memory reference: [base + index * scale + disp], each part optional.
The access width comes from the instruction (mov64 reads eight bytes).
Base and index are registers of the target’s address class. A stack slot
is its own operand, Operand::Slot, because its address is only known
once the frame is laid out.
§Examples
use backend_lang::mir::{Mem, Scale};
use backend_lang::x86_64::{RDI, RSI};
let m = Mem::base(RDI.into()).with_index(RSI.into(), Scale::X8).with_disp(16);
assert_eq!(m.base_reg(), Some(RDI.into()));
assert_eq!(m.index_reg(), Some((RSI.into(), Scale::X8)));
assert_eq!(m.disp(), 16);Implementations§
Source§impl Mem
impl Mem
Sourcepub fn base(base: Reg) -> Mem
pub fn base(base: Reg) -> Mem
[base].
§Examples
use backend_lang::mir::Mem;
use backend_lang::x86_64::RBX;
assert_eq!(Mem::base(RBX.into()).disp(), 0);Sourcepub const fn absolute(disp: i32) -> Mem
pub const fn absolute(disp: i32) -> Mem
[disp]: an absolute address, with no registers.
§Examples
use backend_lang::mir::Mem;
let m = Mem::absolute(0x1000);
assert_eq!(m.base_reg(), None);
assert_eq!(m.disp(), 0x1000);Sourcepub fn with_index(self, index: Reg, scale: Scale) -> Mem
pub fn with_index(self, index: Reg, scale: Scale) -> Mem
The same reference with an index register.
§Examples
use backend_lang::mir::{Mem, Scale};
use backend_lang::x86_64::{RAX, RCX};
let m = Mem::base(RAX.into()).with_index(RCX.into(), Scale::X4);
assert_eq!(m.index_reg(), Some((RCX.into(), Scale::X4)));Sourcepub const fn with_disp(self, disp: i32) -> Mem
pub const fn with_disp(self, disp: i32) -> Mem
The same reference with displacement disp.
§Examples
use backend_lang::mir::Mem;
use backend_lang::x86_64::RAX;
assert_eq!(Mem::base(RAX.into()).with_disp(-8).disp(), -8);Sourcepub fn base_reg(&self) -> Option<Reg>
pub fn base_reg(&self) -> Option<Reg>
The base register, if any.
§Examples
use backend_lang::mir::Mem;
assert_eq!(Mem::absolute(0).base_reg(), None);Trait Implementations§
impl Copy for Mem
impl Eq for Mem
impl StructuralPartialEq for Mem
Auto Trait Implementations§
impl Freeze for Mem
impl RefUnwindSafe for Mem
impl Send for Mem
impl Sync for Mem
impl Unpin for Mem
impl UnsafeUnpin for Mem
impl UnwindSafe for Mem
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more