luaur_code_gen/methods/
assembly_builder_x_64_i_64.rs1use 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}