Skip to main content

luaur_code_gen/methods/
assembly_builder_a_64_sdiv.rs

1use crate::enums::kind_a_64::KindA64;
2use crate::macros::codegen_assert::CODEGEN_ASSERT;
3use crate::records::assembly_builder_a_64::AssemblyBuilderA64;
4use crate::records::register_a_64::RegisterA64;
5
6impl AssemblyBuilderA64 {
7    pub fn sdiv(&mut self, dst: RegisterA64, src1: RegisterA64, src2: RegisterA64) {
8        if self.log_text {
9            self.log_c_char_register_a_64_register_a_64_register_a_64_i32(
10                c"sdiv".as_ptr(),
11                dst,
12                src1,
13                src2,
14                0,
15            );
16        }
17
18        assert!(dst.kind() == KindA64::w || dst.kind() == KindA64::x);
19        assert!(dst.kind() == src1.kind() && dst.kind() == src2.kind());
20
21        let sf: u32 = if dst.kind() == KindA64::x {
22            0x80000000
23        } else {
24            0
25        };
26
27        self.place(
28            (dst.index() as u32)
29                | ((src1.index() as u32) << 5)
30                | (0b000011 << 10)
31                | ((src2.index() as u32) << 16)
32                | (0b0011010110u32 << 21)
33                | sf,
34        );
35        self.commit();
36    }
37}