luaur_code_gen/methods/
assembly_builder_a_64_patch_offset.rs1use 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}