luaur_code_gen/methods/
assembly_builder_x_64_align.rs1use crate::enums::alignment_data_x_64::AlignmentDataX64;
2use crate::macros::codegen_assert::CODEGEN_ASSERT;
3use crate::records::assembly_builder_x_64::AssemblyBuilderX64;
4
5impl AssemblyBuilderX64 {
6 pub fn align(&mut self, alignment: u32, data: AlignmentDataX64) {
7 if !((alignment & (alignment - 1)) == 0) {
8 luaur_common::LUAU_DEBUGBREAK!();
9 }
10
11 let size = self.get_code_size();
12 let pad = ((size + alignment - 1) & !(alignment - 1)) - size;
13
14 match data {
15 AlignmentDataX64::Nop => {
16 if self.log_text {
17 self.log_append(format_args!("; align {}\n", alignment));
18 }
19
20 self.nop(pad);
21 }
22 AlignmentDataX64::Int3 => {
23 if self.log_text {
24 self.log_append(format_args!("; align {} using int3\n", alignment));
25 }
26
27 while (self.code_pos as usize).wrapping_add(pad as usize) > self.code_end as usize {
28 self.extend();
29 }
30
31 for _ in 0..pad {
32 self.place(0xcc);
33 }
34
35 self.commit();
36 }
37 AlignmentDataX64::Ud2 => {
38 if self.log_text {
39 self.log_append(format_args!("; align {} using ud2\n", alignment));
40 }
41
42 while (self.code_pos as usize).wrapping_add(pad as usize) > self.code_end as usize {
43 self.extend();
44 }
45
46 let mut i: u32 = 0;
47
48 while i + 1 < pad {
49 self.place(0x0f);
50 self.place(0x0b);
51 i += 2;
52 }
53
54 if i < pad {
55 self.place(0xcc);
56 }
57
58 self.commit();
59 }
60 }
61 }
62}