Skip to main content

luaur_code_gen/functions/
emit_exit_code_gen_a_64.rs

1use crate::enums::address_kind_a_64::AddressKindA64;
2use crate::enums::kind_a_64::KindA64;
3use crate::records::address_a_64::AddressA64;
4use crate::records::assembly_builder_a_64::AssemblyBuilderA64;
5use crate::records::native_context::NativeContext;
6use crate::records::register_a_64::RegisterA64;
7
8const fn reg(kind: KindA64, index: u8) -> RegisterA64 {
9    RegisterA64 {
10        bits: kind as u8 | (index << 3),
11    }
12}
13
14const X0: RegisterA64 = reg(KindA64::x, 0);
15const X1: RegisterA64 = reg(KindA64::x, 1);
16const R_NATIVE_CONTEXT: RegisterA64 = reg(KindA64::x, 20);
17
18fn mem(base: RegisterA64, data: i32) -> AddressA64 {
19    AddressA64 {
20        kind: AddressKindA64::imm,
21        base,
22        offset: RegisterA64::noreg,
23        data,
24    }
25}
26
27pub fn emit_exit_assembly_builder_a_64_bool(build: &mut AssemblyBuilderA64, continue_in_vm: bool) {
28    build.mov_register_a_64_i32(X0, continue_in_vm as i32);
29    build.ldr(
30        X1,
31        mem(
32            R_NATIVE_CONTEXT,
33            core::mem::offset_of!(NativeContext, gateExit) as i32,
34        ),
35    );
36    build.br(X1);
37}