Skip to main content

luaur_code_gen/functions/
emit_add_offset.rs

1use 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}