luaur-code-gen 0.1.0

Native (A64/X64) code generation for Luau (Rust).
Documentation
use crate::functions::writeu_8::writeu_8 as writeu8;
use crate::functions::writeuleb_128::writeuleb_128 as writeuleb128;

const DW_CFA_offset: u8 = 0x80;
const DW_CFA_offset_extended: u8 = 0x05;
const kDataAlignFactor: u32 = 8;

pub unsafe fn define_saved_register_location(
    mut pos: *mut u8,
    dw_reg: i32,
    stack_offset: u32,
) -> *mut u8 {
    assert!(
        stack_offset % kDataAlignFactor == 0,
        "stack offsets have to be measured in kDataAlignFactor units"
    );

    if dw_reg <= 0x3f {
        pos = writeu8(pos, DW_CFA_offset + dw_reg as u8);
    } else {
        pos = writeu8(pos, DW_CFA_offset_extended);
        pos = writeuleb128(pos, dw_reg as u64);
    }

    pos = writeuleb128(pos, (stack_offset / kDataAlignFactor) as u64);
    pos
}