Skip to main content

luaur_code_gen/methods/
assembly_builder_x_64_vpextrd.rs

1use crate::records::assembly_builder_x_64::AssemblyBuilderX64;
2use crate::records::register_x_64::RegisterX64;
3
4impl AssemblyBuilderX64 {
5    pub fn vpextrd(&mut self, dst: RegisterX64, src: RegisterX64, offset: u8) {
6        // 'placeAvx' wrapper doesn't have an overload for this archetype (opcode r/m, reg, imm8)
7        if self.log_text {
8            // C++: log("vpextrd", dst, src, offset)
9            self.log_c_char_operand_x_64_operand_x_64_operand_x_64(
10                b"vpextrd\0".as_ptr() as *const core::ffi::c_char,
11                dst.into(),
12                src.into(),
13                crate::records::operand_x_64::OperandX64::from(offset as i32),
14            );
15        }
16
17        // C++: placeVex(src, noreg, dst, false, AVX_0F3A, AVX_66);
18        // opcode map is AVX_0F3A (0x3A -> 0b00011), not 0x10.
19        self.place_vex(
20            src.into(),
21            crate::records::operand_x_64::OperandX64::reg(RegisterX64::noreg),
22            dst.into(),
23            false,
24            0x3A,
25            0x66,
26        );
27        self.place(0x16);
28        self.place_reg_and_mod_reg_mem(src.into(), dst.into(), 1);
29        self.place_imm_8(offset as i32);
30
31        self.commit();
32    }
33}