luaur-code-gen 0.1.3

Native (A64/X64) code generation for Luau (Rust).
Documentation
use crate::enums::alignment_data_x_64::AlignmentDataX64;
use crate::macros::codegen_assert::CODEGEN_ASSERT;
use crate::records::assembly_builder_x_64::AssemblyBuilderX64;

impl AssemblyBuilderX64 {
    pub fn align(&mut self, alignment: u32, data: AlignmentDataX64) {
        if !((alignment & (alignment - 1)) == 0) {
            luaur_common::LUAU_DEBUGBREAK!();
        }

        let size = self.get_code_size();
        let pad = ((size + alignment - 1) & !(alignment - 1)) - size;

        match data {
            AlignmentDataX64::Nop => {
                if self.log_text {
                    self.log_append(format_args!("; align {}\n", alignment));
                }

                self.nop(pad);
            }
            AlignmentDataX64::Int3 => {
                if self.log_text {
                    self.log_append(format_args!("; align {} using int3\n", alignment));
                }

                while (self.code_pos as usize).wrapping_add(pad as usize) > self.code_end as usize {
                    self.extend();
                }

                for _ in 0..pad {
                    self.place(0xcc);
                }

                self.commit();
            }
            AlignmentDataX64::Ud2 => {
                if self.log_text {
                    self.log_append(format_args!("; align {} using ud2\n", alignment));
                }

                while (self.code_pos as usize).wrapping_add(pad as usize) > self.code_end as usize {
                    self.extend();
                }

                let mut i: u32 = 0;

                while i + 1 < pad {
                    self.place(0x0f);
                    self.place(0x0b);
                    i += 2;
                }

                if i < pad {
                    self.place(0xcc);
                }

                self.commit();
            }
        }
    }
}