Skip to main content

luaur_code_gen/methods/
assembly_builder_a_64_sbfx.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 sbfx_register_a_64_register_a_64_u8_u8(
8        &mut self,
9        dst: RegisterA64,
10        src: RegisterA64,
11        f: u8,
12        w: u8,
13    ) {
14        let size = if dst.kind() == KindA64::x { 64 } else { 32 };
15
16        CODEGEN_ASSERT!(w > 0 && (f as u32) + (w as u32) <= size);
17
18        // f * 100 + w is only used for disassembly printout; in the future we might replace it with two separate fields for readability
19        self.place_bfm(
20            b"sbfx".as_ptr() as *const core::ffi::c_char,
21            dst,
22            src,
23            (f as i32) * 100 + w as i32,
24            0b00_100110,
25            f as i32,
26            f as i32 + w as i32 - 1,
27        );
28    }
29}