Skip to main content

luaur_code_gen/methods/
assembly_builder_x_64_i_64.rs

1use crate::enums::size_x_64::SizeX64;
2use crate::functions::writeu_64::writeu_64;
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 i64(&mut self, value: i64) -> OperandX64 {
9        let as_64_bit_key = value as u64;
10
11        if as_64_bit_key != !0u64 {
12            if let Some(prev) = self.const_cache_64.find(&as_64_bit_key) {
13                return OperandX64::operand_x_64_size_x_64_register_x_64_u8_register_x_64_i32(
14                    SizeX64::qword,
15                    RegisterX64::noreg,
16                    1,
17                    RegisterX64::rip,
18                    *prev,
19                );
20            }
21        }
22
23        let pos = {
24            if self.data_pos < 8 {
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 - 8) & !(8 - 1);
41            self.data_pos
42        };
43
44        unsafe {
45            writeu_64(self.data.as_mut_ptr().add(pos), as_64_bit_key);
46        }
47        let offset = (pos as isize - self.data.len() as isize) as i32;
48
49        if as_64_bit_key != !0u64 {
50            self.const_cache_64.try_insert(as_64_bit_key, offset);
51        }
52
53        OperandX64::operand_x_64_size_x_64_register_x_64_u8_register_x_64_i32(
54            SizeX64::qword,
55            RegisterX64::noreg,
56            1,
57            RegisterX64::rip,
58            offset,
59        )
60    }
61}