Skip to main content

luaur_code_gen/methods/
assembly_builder_x_64_align.rs

1use 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}