luaur_code_gen/methods/
assembly_builder_a_64_place_bm.rs1use 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}