#[inline]
pub fn adrp(rd: u8, page_delta: i32) -> u32 {
let imm = (page_delta as u32) & 0x1F_FFFF;
0x9000_0000u32 | ((imm & 0x3) << 29) | (((imm >> 2) & 0x7_FFFF) << 5) | (rd as u32)
}
#[inline]
pub fn add_imm12(rd: u8, rn: u8, imm12: u32) -> u32 {
0x9100_0000u32 | ((imm12 & 0xFFF) << 10) | ((rn as u32) << 5) | (rd as u32)
}
#[inline]
pub fn ldr64_unsigned(rt: u8, rn: u8, byte_offset: u32) -> u32 {
let imm12 = byte_offset / 8;
0xF940_0000u32 | ((imm12 & 0xFFF) << 10) | ((rn as u32) << 5) | (rt as u32)
}
#[inline]
pub fn br(rn: u8) -> u32 {
0xD61F_0000u32 | ((rn as u32) << 5)
}
#[inline]
pub fn ret() -> u32 {
0xD65F_03C0u32
}
#[inline]
pub fn decode_rd(insn: u32) -> u8 {
(insn & 0x1F) as u8
}
#[inline]
pub fn decode_rn(insn: u32) -> u8 {
((insn >> 5) & 0x1F) as u8
}
pub fn patch_branch26(insn: u32, delta: i32) -> u32 {
(insn & 0xFC00_0000) | ((delta as u32) & 0x03FF_FFFF)
}
pub fn patch_adrp(insn: u32, page_delta: i32) -> u32 {
let imm = (page_delta as u32) & 0x1F_FFFF;
(insn & 0x9F00_001F) | ((imm & 0x3) << 29) | (((imm >> 2) & 0x7_FFFF) << 5)
}
pub fn patch_add_pageoff(insn: u32, page_offset: u32) -> u32 {
(insn & 0xFFC0_03FF) | ((page_offset & 0xFFF) << 10)
}
pub fn patch_ldr_pageoff(insn: u32, page_offset: u32) -> u32 {
let size_shift = (insn >> 30) & 0x3; let scaled = page_offset >> size_shift;
(insn & 0xFFC0_03FF) | ((scaled & 0xFFF) << 10)
}
#[inline]
pub fn is_add_imm(insn: u32) -> bool {
(insn >> 24) == 0x91
}