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