Skip to main content

luaur_code_gen/methods/
assembly_builder_a_64_ccmp.rs

1use crate::enums::condition_a_64::ConditionA64;
2use crate::records::assembly_builder_a_64::AssemblyBuilderA64;
3use crate::records::register_a_64::RegisterA64;
4
5impl AssemblyBuilderA64 {
6    pub fn ccmp(&mut self, src1: RegisterA64, src2: RegisterA64, cond: ConditionA64, nzcv: u8) {
7        if self.log_text {
8            self.log_append(format_args!("{:<12}", "ccmp"));
9            self.log_register_a_64(src1);
10            self.text.push(',');
11            self.log_register_a_64(src2);
12            self.log_append(format_args!(",#{},{}", nzcv & 0x0F, cond as u32));
13        }
14
15        assert!(
16            src1.kind() == crate::enums::kind_a_64::KindA64::w
17                || src1.kind() == crate::enums::kind_a_64::KindA64::x
18        );
19        assert!(src2.kind() == src1.kind());
20
21        let sf: u32 = if src1.kind() == crate::enums::kind_a_64::KindA64::x {
22            0x8000_0000
23        } else {
24            0
25        };
26
27        let code_for_condition: u32 = match cond {
28            ConditionA64::Equal => 0,
29            ConditionA64::NotEqual => 1,
30            ConditionA64::CarrySet => 2,
31            ConditionA64::CarryClear => 3,
32            ConditionA64::Minus => 4,
33            ConditionA64::Plus => 5,
34            ConditionA64::Overflow => 6,
35            ConditionA64::NoOverflow => 7,
36            ConditionA64::UnsignedGreater => 8,
37            ConditionA64::UnsignedLessEqual => 9,
38            ConditionA64::GreaterEqual => 10,
39            ConditionA64::Less => 11,
40            ConditionA64::Greater => 12,
41            ConditionA64::LessEqual => 13,
42            ConditionA64::Always => 14,
43            _ => 15,
44        };
45
46        let word = (nzcv & 0x0F) as u32
47            | ((src1.index() as u32) << 5)
48            | ((code_for_condition as u32) << 12)
49            | ((src2.index() as u32) << 16)
50            | (0b1111010010u32 << 21)
51            | sf;
52
53        self.place(word);
54        self.commit();
55    }
56}