luaur_code_gen/methods/
assembly_builder_x_64_f_64.rs1use crate::enums::size_x_64::SizeX64;
2use crate::functions::writef_64::writef_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 f64(&mut self, value: f64) -> OperandX64 {
9 let mut as64_bit_key: u64 = 0;
10 unsafe {
11 core::ptr::copy_nonoverlapping(
12 &value as *const f64 as *const u8,
13 &mut as64_bit_key as *mut u64 as *mut u8,
14 core::mem::size_of::<f64>(),
15 );
16 }
17
18 if as64_bit_key != !0u64 {
19 if let Some(prev) = self.const_cache_64.find(&as64_bit_key) {
20 return OperandX64::operand_x_64_size_x_64_register_x_64_u8_register_x_64_i32(
21 SizeX64::qword,
22 RegisterX64::noreg,
23 1,
24 RegisterX64::rip,
25 *prev,
26 );
27 }
28 }
29
30 let pos = {
31 if self.data_pos < 8 {
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 - 8) & !(8 - 1);
48 self.data_pos
49 };
50
51 unsafe {
52 writef_64(self.data.as_mut_ptr().add(pos), value);
53 }
54 let offset = (pos as i32) - (self.data.len() as i32);
55
56 if as64_bit_key != !0u64 {
57 *self.const_cache_64.get_or_insert(as64_bit_key) = offset;
58 }
59
60 OperandX64::operand_x_64_size_x_64_register_x_64_u8_register_x_64_i32(
61 SizeX64::qword,
62 RegisterX64::noreg,
63 1,
64 RegisterX64::rip,
65 offset,
66 )
67 }
68}