luaur_code_gen/methods/
assembly_builder_x_64_bytes.rs1use crate::enums::size_x_64::SizeX64;
2use crate::records::assembly_builder_x_64::AssemblyBuilderX64;
3use crate::records::operand_x_64::OperandX64;
4use crate::records::register_x_64::RegisterX64;
5
6impl AssemblyBuilderX64 {
7 pub fn bytes(
8 &mut self,
9 ptr: *const core::ffi::c_void,
10 size: usize,
11 align: usize,
12 ) -> OperandX64 {
13 let pos = {
14 if self.data_pos < size {
18 let old_size = self.data.len();
19 self.data.resize(self.data.len() * 2, 0);
20
21 unsafe {
22 core::ptr::copy_nonoverlapping(
23 self.data.as_ptr(),
24 self.data.as_mut_ptr().add(old_size),
25 old_size,
26 );
27 core::ptr::write_bytes(self.data.as_mut_ptr(), 0, old_size);
28 }
29
30 self.data_pos += old_size;
31 }
32
33 self.data_pos = (self.data_pos - size) & !(align - 1);
34 self.data_pos
35 };
36
37 unsafe {
38 core::ptr::copy_nonoverlapping(ptr as *const u8, self.data.as_mut_ptr().add(pos), size);
39 }
40
41 OperandX64::operand_x_64_size_x_64_register_x_64_u8_register_x_64_i32(
42 SizeX64::none,
43 RegisterX64::noreg,
44 1,
45 RegisterX64::rip,
46 (pos as i32) - (self.data.len() as i32),
47 )
48 }
49}