Skip to main content

luaur_code_gen/methods/
assembly_builder_a_64_patch_offset.rs

1use crate::enums::kind::Kind;
2use crate::records::assembly_builder_a_64::AssemblyBuilderA64;
3
4impl AssemblyBuilderA64 {
5    pub fn patch_offset(&mut self, location: u32, value: i32, kind: Kind) {
6        let offset = if kind == Kind::Imm26 { 0 } else { 5 };
7        let range = match kind {
8            Kind::Imm19 => 1 << 19,
9            Kind::Imm26 => 1 << 26,
10            Kind::Imm14 => 1 << 14,
11        };
12
13        debug_assert!((self.code[location as usize] & (((range - 1) as u32) << offset)) == 0);
14
15        if value > -(range >> 1) && value < (range >> 1) {
16            self.code[location as usize] |= ((value as u32) & (range - 1) as u32) << offset;
17        } else {
18            self.overflowed = true;
19        }
20    }
21}