luaur-code-gen 0.1.3

Native (A64/X64) code generation for Luau (Rust).
Documentation
use crate::enums::size_x_64::SizeX64;
use crate::functions::writef_32::writef_32;
use crate::records::assembly_builder_x_64::AssemblyBuilderX64;
use crate::records::operand_x_64::OperandX64;
use crate::records::register_x_64::RegisterX64;

impl AssemblyBuilderX64 {
    pub fn f32(&mut self, value: f32) -> OperandX64 {
        let mut as32_bit_key: u32 = 0;
        unsafe {
            core::ptr::copy_nonoverlapping(
                &value as *const f32 as *const u8,
                &mut as32_bit_key as *mut u32 as *mut u8,
                core::mem::size_of::<f32>(),
            );
        }

        if as32_bit_key != !0u32 {
            if let Some(prev) = self.const_cache_32.find(&as32_bit_key) {
                return OperandX64::operand_x_64_size_x_64_register_x_64_u8_register_x_64_i32(
                    SizeX64::dword,
                    RegisterX64::noreg,
                    1,
                    RegisterX64::rip,
                    *prev,
                );
            }
        }

        let pos = {
            if self.data_pos < 4 {
                let old_size = self.data.len();
                self.data.resize(self.data.len() * 2, 0);

                unsafe {
                    core::ptr::copy_nonoverlapping(
                        self.data.as_ptr(),
                        self.data.as_mut_ptr().add(old_size),
                        old_size,
                    );
                    core::ptr::write_bytes(self.data.as_mut_ptr(), 0, old_size);
                }

                self.data_pos += old_size;
            }

            self.data_pos = (self.data_pos - 4) & !(4 - 1);
            self.data_pos
        };

        unsafe {
            writef_32(self.data.as_mut_ptr().add(pos), value);
        }
        let offset = (pos as i32) - (self.data.len() as i32);

        if as32_bit_key != !0u32 {
            *self.const_cache_32.get_or_insert(as32_bit_key) = offset;
        }

        OperandX64::operand_x_64_size_x_64_register_x_64_u8_register_x_64_i32(
            SizeX64::dword,
            RegisterX64::noreg,
            1,
            RegisterX64::rip,
            offset,
        )
    }
}