luaur_code_gen/functions/
emit_exit_code_gen_a_64.rs1use 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}