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