Skip to main content

luaur_code_gen/methods/
assembly_builder_x_64_f_32.rs

1use crate::enums::size_x_64::SizeX64;
2use crate::functions::writef_32::writef_32;
3use crate::records::assembly_builder_x_64::AssemblyBuilderX64;
4use crate::records::operand_x_64::OperandX64;
5use crate::records::register_x_64::RegisterX64;
6
7impl AssemblyBuilderX64 {
8    pub fn f32(&mut self, value: f32) -> OperandX64 {
9        let mut as32_bit_key: u32 = 0;
10        unsafe {
11            core::ptr::copy_nonoverlapping(
12                &value as *const f32 as *const u8,
13                &mut as32_bit_key as *mut u32 as *mut u8,
14                core::mem::size_of::<f32>(),
15            );
16        }
17
18        if as32_bit_key != !0u32 {
19            if let Some(prev) = self.const_cache_32.find(&as32_bit_key) {
20                return OperandX64::operand_x_64_size_x_64_register_x_64_u8_register_x_64_i32(
21                    SizeX64::dword,
22                    RegisterX64::noreg,
23                    1,
24                    RegisterX64::rip,
25                    *prev,
26                );
27            }
28        }
29
30        let pos = {
31            if self.data_pos < 4 {
32                let old_size = self.data.len();
33                self.data.resize(self.data.len() * 2, 0);
34
35                unsafe {
36                    core::ptr::copy_nonoverlapping(
37                        self.data.as_ptr(),
38                        self.data.as_mut_ptr().add(old_size),
39                        old_size,
40                    );
41                    core::ptr::write_bytes(self.data.as_mut_ptr(), 0, old_size);
42                }
43
44                self.data_pos += old_size;
45            }
46
47            self.data_pos = (self.data_pos - 4) & !(4 - 1);
48            self.data_pos
49        };
50
51        unsafe {
52            writef_32(self.data.as_mut_ptr().add(pos), value);
53        }
54        let offset = (pos as i32) - (self.data.len() as i32);
55
56        if as32_bit_key != !0u32 {
57            *self.const_cache_32.get_or_insert(as32_bit_key) = offset;
58        }
59
60        OperandX64::operand_x_64_size_x_64_register_x_64_u8_register_x_64_i32(
61            SizeX64::dword,
62            RegisterX64::noreg,
63            1,
64            RegisterX64::rip,
65            offset,
66        )
67    }
68}