Skip to main content

luaur_code_gen/methods/
assembly_builder_a_64_place_bm.rs

1use crate::enums::kind_a_64::KindA64;
2use crate::functions::countlz_bit_utils::countlz;
3use crate::functions::countrz_bit_utils::countrz;
4use crate::macros::codegen_assert::CODEGEN_ASSERT;
5use crate::records::assembly_builder_a_64::AssemblyBuilderA64;
6use crate::records::register_a_64::RegisterA64;
7
8impl AssemblyBuilderA64 {
9    pub fn place_bm(
10        &mut self,
11        name: *const core::ffi::c_char,
12        dst: RegisterA64,
13        src1: RegisterA64,
14        src2: u32,
15        op: u8,
16    ) {
17        if self.log_text {
18            self.log_c_char_register_a_64_register_a_64_i32(name, dst, src1, src2 as i32);
19        }
20
21        assert!(dst.kind() == KindA64::w || dst.kind() == KindA64::x);
22        assert!(dst.kind() == src1.kind());
23        assert!(Self::is_mask_supported(self, src2));
24
25        let sf = if dst.kind() == KindA64::x {
26            0x80000000
27        } else {
28            0
29        };
30
31        let lz = countlz(src2);
32        let rz = countrz(src2);
33
34        let imms = 31 - lz - rz;
35        let immr = (32 - rz) & 31;
36
37        self.place(
38            (dst.index() as u32)
39                | ((src1.index() as u32) << 5)
40                | ((imms as u32) << 10)
41                | ((immr as u32) << 16)
42                | ((op as u32) << 23)
43                | sf,
44        );
45        self.commit();
46    }
47}