Skip to main content

luaur_code_gen/methods/
assembly_builder_a_64_dup_4_s.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 dup_4s(&mut self, dst: RegisterA64, src: RegisterA64, index: u8) {
8        if dst.kind() == KindA64::s {
9            CODEGEN_ASSERT!(src.kind() == KindA64::q);
10            CODEGEN_ASSERT!(index < 4);
11
12            if self.log_text {
13                self.log_append(format_args!(
14                    " {:<12}s{},v{}.s[{}]\n",
15                    "dup",
16                    dst.index(),
17                    src.index(),
18                    index
19                ));
20            }
21
22            let op: u32 = 0b01_0_11110000_00100_0_0000_1;
23            self.place(
24                dst.index() as u32 | (src.index() as u32) << 5 | op << 10 | (index as u32) << 19,
25            );
26        } else {
27            CODEGEN_ASSERT!(src.kind() == KindA64::q);
28            CODEGEN_ASSERT!(index < 4);
29
30            if self.log_text {
31                self.log_append(format_args!(
32                    " {:<12}v{}.4s,v{}.s[{}]\n",
33                    "dup",
34                    dst.index(),
35                    src.index(),
36                    index
37                ));
38            }
39
40            let op: u32 = 0b010_01110000_00100_0_0000_1;
41            self.place(
42                dst.index() as u32 | (src.index() as u32) << 5 | op << 10 | (index as u32) << 19,
43            );
44        }
45
46        self.commit();
47    }
48}