Skip to main content

luaur_code_gen/methods/
assembly_builder_a_64_ubfx.rs

1use crate::macros::codegen_assert::CODEGEN_ASSERT;
2use crate::records::assembly_builder_a_64::AssemblyBuilderA64;
3use crate::records::register_a_64::RegisterA64;
4
5impl AssemblyBuilderA64 {
6    pub fn ubfx(&mut self, dst: RegisterA64, src: RegisterA64, f: u8, w: u8) {
7        let size = if dst.kind() == crate::enums::kind_a_64::KindA64::x {
8            64
9        } else {
10            32
11        };
12
13        CODEGEN_ASSERT!(w > 0 && f as i32 + w as i32 <= size);
14
15        // f * 100 + w is only used for disassembly printout; in the future we might replace it with two separate fields for readability
16        self.place_bfm(
17            c"ubfx".as_ptr(),
18            dst,
19            src,
20            (f as i32) * 100 + (w as i32),
21            0b10_100110,
22            f as i32,
23            f as i32 + w as i32 - 1,
24        );
25    }
26}