Skip to main content

luaur_code_gen/methods/
assembly_builder_x_64_i_32.rs

1use crate::enums::size_x_64::SizeX64;
2use crate::functions::writeu_32::writeu_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 i32(&mut self, value: i32) -> OperandX64 {
9        let as_32_bit_key = value as u32;
10
11        if as_32_bit_key != !0u32 {
12            if let Some(prev) = self.const_cache_32.find(&as_32_bit_key) {
13                return OperandX64::operand_x_64_size_x_64_register_x_64_u8_register_x_64_i32(
14                    SizeX64::dword,
15                    RegisterX64::noreg,
16                    1,
17                    RegisterX64::rip,
18                    *prev,
19                );
20            }
21        }
22
23        let pos = {
24            if self.data_pos < 4 {
25                let old_size = self.data.len();
26                self.data.resize(self.data.len() * 2, 0);
27
28                unsafe {
29                    core::ptr::copy_nonoverlapping(
30                        self.data.as_ptr(),
31                        self.data.as_mut_ptr().add(old_size),
32                        old_size,
33                    );
34                    core::ptr::write_bytes(self.data.as_mut_ptr(), 0, old_size);
35                }
36
37                self.data_pos += old_size;
38            }
39
40            self.data_pos = (self.data_pos - 4) & !(4 - 1);
41            self.data_pos
42        };
43
44        unsafe {
45            writeu_32(self.data.as_mut_ptr().add(pos), value as u32);
46        }
47        let offset = (pos as isize - self.data.len() as isize) as i32;
48
49        if as_32_bit_key != !0u32 {
50            self.const_cache_32.try_insert(as_32_bit_key, offset);
51        }
52
53        OperandX64::operand_x_64_size_x_64_register_x_64_u8_register_x_64_i32(
54            SizeX64::dword,
55            RegisterX64::noreg,
56            1,
57            RegisterX64::rip,
58            offset,
59        )
60    }
61}