luaur_code_gen/functions/
emit_add_offset.rs1use crate::macros::codegen_assert::CODEGEN_ASSERT;
2use crate::records::assembly_builder_a_64::AssemblyBuilderA64;
3use crate::records::register_a_64::RegisterA64;
4
5pub fn emit_add_offset(
6 build: &mut AssemblyBuilderA64,
7 dst: RegisterA64,
8 src: RegisterA64,
9 offset: usize,
10) {
11 CODEGEN_ASSERT!(dst != src);
12 CODEGEN_ASSERT!(offset <= i32::MAX as usize);
13
14 const K_MAX_IMMEDIATE: u16 = 4095;
15
16 if offset as u16 <= K_MAX_IMMEDIATE {
17 build.add_register_a_64_register_a_64_u16(dst, src, offset as u16);
18 } else {
19 build.mov_register_a_64_i32(dst, offset as i32);
20 build.add_register_a_64_register_a_64_register_a_64_i32(dst, dst, src, 0);
21 }
22}