diff --git a/lib/src/lib.rs b/lib/src/lib.rs index 56e7ede..b2f398f 100644 --- a/lib/src/lib.rs +++ b/lib/src/lib.rs @@ -245,8 +245,8 @@ pub struct Ins { } #[inline(always)] -fn bit(x: u32, idx: usize) -> bool { - ((x >> (32 - idx - 1)) & 1) == 1 +fn bit(x: u32, idx: usize) -> u8 { + ((x >> (32 - idx - 1)) & 1) as u8 } #[inline(always)] @@ -275,7 +275,7 @@ macro_rules! disasm_unreachable { macro_rules! ins_bit { ($func:ident, $idx:expr) => { - fn $func(&self) -> bool { + fn $func(&self) -> u8 { bit(self.code, $idx) } }; @@ -384,13 +384,13 @@ impl Ins { 0b00011 => Opcode::PsCmpo1, _ => Opcode::Illegal, }; - if !zero_bits(x, 9..11) || bit(x, 31) { + if !zero_bits(x, 9..11) || bit(x, 31) == 1 { ins.op = Opcode::Illegal; } } // ABwi form 0b00110 | 0b00111 => { - if !bit(x, 25) { + if bit(x, 25) == 0 { ins.op = match key { 0b00110 => Opcode::PsqLx, 0b00111 => Opcode::PsqStx, @@ -403,7 +403,7 @@ impl Ins { _ => Opcode::Illegal, }; } - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } @@ -497,7 +497,7 @@ impl Ins { 0b000111 => Opcode::Mulli, 0b001000 => Opcode::Subfic, 0b001010 | 0b001011 => { - if bit(x, 9) { + if bit(x, 9) != 0 { Opcode::Illegal // reserved } else if key == 0b001010 { Opcode::Cmpli @@ -564,13 +564,13 @@ impl Ins { } 0b000011 => { ins.op = Opcode::Rfi; - if !zero_bits(x, 6..21) || bits::(x, 27..31) != 0b0010 || !bit(x, 31) { + if !zero_bits(x, 6..21) || bits::(x, 27..31) != 0b0010 || bit(x, 31) == 0 { ins.op = Opcode::Illegal; } } 0b001001 => { ins.op = Opcode::Isync; - if !zero_bits(x, 6..21) || bits::(x, 27..31) != 0b0110 || !bit(x, 31) { + if !zero_bits(x, 6..21) || bits::(x, 27..31) != 0b0110 || bit(x, 31) == 0 { ins.op = Opcode::Illegal; } } @@ -587,7 +587,7 @@ impl Ins { 0b011100 => Opcode::Cror, _ => Opcode::Illegal, }; - if key2 != 0b0001 || bit(x, 31) { + if key2 != 0b0001 || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } @@ -626,13 +626,13 @@ impl Ins { 0b00_0010_0000 => Opcode::Cmpl, _ => disasm_unreachable!(x), }; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b00_0000_0100 => { ins.op = Opcode::Tw; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } @@ -641,19 +641,19 @@ impl Ins { 0b00_0000_1011 => ins.op = Opcode::Mulhwu, 0b00_0001_0011 => { ins.op = Opcode::Mfcr; - if bits::(x, 16..21) != 0 || bits::(x, 21..26) != 0 || bit(x, 31) { + if bits::(x, 16..21) != 0 || bits::(x, 21..26) != 0 || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b00_0001_0100 => { ins.op = Opcode::Lwarx; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b00_0001_0111 => { ins.op = Opcode::Lwzx; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } @@ -668,13 +668,13 @@ impl Ins { 0b00_0010_1000 => ins.op = Opcode::Subf, 0b00_0011_0110 => { ins.op = Opcode::Dcbst; - if bits::(x, 11..16) != 0 || bit(x, 31) { + if bits::(x, 11..16) != 0 || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b00_0011_0111 => { ins.op = Opcode::Lwzux; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } @@ -682,19 +682,19 @@ impl Ins { 0b00_0100_1101 => ins.op = Opcode::Mulhw, 0b00_0101_0011 => { ins.op = Opcode::Mfmsr; - if bits::(x, 16..21) != 0 || bits::(x, 21..26) != 0 || bit(x, 31) { + if bits::(x, 16..21) != 0 || bits::(x, 21..26) != 0 || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b00_0101_0110 => { ins.op = Opcode::Dcbf; - if bits::(x, 11..16) != 0 || bit(x, 31) { + if bits::(x, 11..16) != 0 || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b00_0101_0111 => { ins.op = Opcode::Lbzx; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } @@ -706,7 +706,7 @@ impl Ins { } 0b00_0111_0111 => { ins.op = Opcode::Lbzux; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } @@ -715,31 +715,31 @@ impl Ins { 0b00_1000_1010 => ins.op = Opcode::Adde, 0b00_1001_0000 => { ins.op = Opcode::Mtcrf; - if bit(x, 11) || bit(x, 20) || bit(x, 31) { + if bit(x, 11) != 0 || bit(x, 20) != 0 || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b00_1001_0010 => { ins.op = Opcode::Mtmsr; - if bits::(x, 16..21) != 0 || bits::(x, 21..26) != 0 || bit(x, 31) { + if bits::(x, 16..21) != 0 || bits::(x, 21..26) != 0 || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b00_1001_0110 => { ins.op = Opcode::Stwcx_; - if !bit(x, 31) { + if bit(x, 31) == 0 { ins.op = Opcode::Illegal; } } 0b00_1001_0111 => { ins.op = Opcode::Stwx; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b00_1011_0111 => { ins.op = Opcode::Stwux; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } @@ -757,13 +757,13 @@ impl Ins { } 0b00_1101_0010 => { ins.op = Opcode::Mtsr; - if bit(x, 11) || bits::(x, 21..26) != 0 || bit(x, 31) { + if bit(x, 11) != 0 || bits::(x, 21..26) != 0 || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b00_1101_0111 => { ins.op = Opcode::Stbx; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } @@ -782,95 +782,95 @@ impl Ins { 0b00_1110_1011 => ins.op = Opcode::Mullw, 0b00_1111_0010 => { ins.op = Opcode::Mtsrin; - if bits::(x, 16..21) != 0 || bit(x, 31) { + if bits::(x, 16..21) != 0 || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b00_1111_0110 => { ins.op = Opcode::Dcbtst; - if bits::(x, 11..16) != 0 || bit(x, 31) { + if bits::(x, 11..16) != 0 || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b00_1111_0111 => { ins.op = Opcode::Stbux; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b01_0000_1010 => ins.op = Opcode::Add, 0b01_0000_0110 => { ins.op = Opcode::Dcbt; - if bits::(x, 11..16) != 0 || bit(x, 31) { + if bits::(x, 11..16) != 0 || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b01_0000_0111 => { ins.op = Opcode::Lhzx; - if bits::(x, 11..16) != 0 || bit(x, 31) { + if bits::(x, 11..16) != 0 || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b01_0001_1100 => ins.op = Opcode::Eqv, 0b01_0011_0010 => { ins.op = Opcode::Tlbie; - if bits::(x, 11..16) != 0 || bits::(x, 16..21) != 0 || bit(x, 31) { + if bits::(x, 11..16) != 0 || bits::(x, 16..21) != 0 || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b01_0011_0110 => { ins.op = Opcode::Eciwx; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b01_0011_0111 => { ins.op = Opcode::Lhzux; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b01_0011_1100 => ins.op = Opcode::Xor, 0b01_0101_0011 => { ins.op = Opcode::Mfspr; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b01_0101_0111 => { ins.op = Opcode::Lhax; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b01_0111_0011 => { ins.op = Opcode::Mftb; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b01_0111_0111 => { ins.op = Opcode::Lhaux; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b01_1001_0111 => { ins.op = Opcode::Sthx; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b01_1001_1100 => ins.op = Opcode::Orc, 0b01_1011_0110 => { ins.op = Opcode::Ecowx; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b01_1011_0111 => { ins.op = Opcode::Sthux; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } @@ -878,13 +878,13 @@ impl Ins { 0b01_1100_1011 => ins.op = Opcode::Divwu, 0b01_1101_0011 => { ins.op = Opcode::Mtspr; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b01_1101_0110 => { ins.op = Opcode::Dcbi; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } @@ -892,25 +892,25 @@ impl Ins { 0b01_1111_1011 => ins.op = Opcode::Divw, 0b10_0000_0000 => { ins.op = Opcode::Mcrxr; - if !zero_bits(x, 9..21) || bit(x, 31) { + if !zero_bits(x, 9..21) || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b10_0001_0101 => { ins.op = Opcode::Lswx; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b10_0001_0110 => { ins.op = Opcode::Lwbrx; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b10_0001_0111 => { ins.op = Opcode::Lfsx; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } @@ -920,26 +920,26 @@ impl Ins { if bits::(x, 11..16) != 0 || bits::(x, 16..21) != 0 || bits::(x, 21..26) != 0 - || bit(x, 31) + || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b10_0011_0111 => { ins.op = Opcode::Lfsux; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b10_0101_0011 => { ins.op = Opcode::Mfsr; - if bit(x, 11) || bits::(x, 21..26) != 0 || bit(x, 31) { + if bit(x, 11) != 0 || bits::(x, 21..26) != 0 || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b10_0101_0101 => { ins.op = Opcode::Lswi; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } @@ -948,74 +948,74 @@ impl Ins { if bits::(x, 11..16) != 0 || bits::(x, 16..21) != 0 || bits::(x, 21..26) != 0 - || bit(x, 31) + || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b10_0101_0111 => { ins.op = Opcode::Lfdx; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b10_0111_0111 => { ins.op = Opcode::Lfdux; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b10_1001_0011 => { ins.op = Opcode::Mfsrin; - if bits::(x, 16..21) != 0 || bit(x, 31) { + if bits::(x, 16..21) != 0 || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b10_1001_0101 => { ins.op = Opcode::Stswx; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b10_1001_0110 => { ins.op = Opcode::Stwbrx; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b10_1001_0111 => { ins.op = Opcode::Stfsx; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b10_1011_0111 => { ins.op = Opcode::Stfsux; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b10_1101_0101 => { ins.op = Opcode::Stswi; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b10_1101_0111 => { ins.op = Opcode::Stfdx; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b10_1111_0111 => { ins.op = Opcode::Stfdux; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b11_0001_0110 => { ins.op = Opcode::Lhbrx; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } @@ -1026,14 +1026,14 @@ impl Ins { if bits::(x, 16..21) != 0 || bits::(x, 21..26) != 0 || bits::(x, 26..31) != 0 - || bit(x, 31) + || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b11_1001_0110 => { ins.op = Opcode::Sthbrx; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } @@ -1051,19 +1051,19 @@ impl Ins { } 0b11_1101_0110 => { ins.op = Opcode::Icbi; - if bits::(x, 11..16) != 0 || bit(x, 31) { + if bits::(x, 11..16) != 0 || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b11_1101_0111 => { ins.op = Opcode::Stfiwx; - if bit(x, 31) { + if bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b11_1111_0110 => { ins.op = Opcode::Dcbz; - if bits::(x, 11..16) != 0 || bit(x, 31) { + if bits::(x, 11..16) != 0 || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } @@ -1168,19 +1168,19 @@ impl Ins { 0b00000 => match bits(x, 26..31) { 0b00 => { ins.op = Opcode::Fcmpu; - if !zero_bits(x, 9..11) || bit(x, 31) { + if !zero_bits(x, 9..11) || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b01 => { ins.op = Opcode::Fcmpo; - if !zero_bits(x, 9..11) || bit(x, 31) { + if !zero_bits(x, 9..11) || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } 0b10 => { ins.op = Opcode::Mcrfs; - if !zero_bits(x, 9..11) || !zero_bits(x, 14..16) || bit(x, 31) { + if !zero_bits(x, 9..11) || !zero_bits(x, 14..16) || bit(x, 31) != 0 { ins.op = Opcode::Illegal; } } @@ -1202,7 +1202,7 @@ impl Ins { } 0b100 => { ins.op = Opcode::Mtfsfi; - if !zero_bits(x, 9..16) || bit(x, 20) { + if !zero_bits(x, 9..16) || bit(x, 20) != 0 { ins.op = Opcode::Illegal; } } @@ -1218,7 +1218,7 @@ impl Ins { } 0b10110 => { ins.op = Opcode::Mtfsf; - if bit(x, 6) || bit(x, 16) { + if bit(x, 6) != 0 || bit(x, 16) != 0 { ins.op = Opcode::Illegal; } } @@ -1326,7 +1326,7 @@ impl Ins { } fn write_string_form_reg123_rc(&self, out: &mut String) -> std::fmt::Result { - let name_suffix = if self.rc() { "." } else { "" }; + let name_suffix = if self.rc() != 0 { "." } else { "" }; let name = match self.op { Opcode::And => "and", Opcode::Andc => "andc", @@ -1347,7 +1347,7 @@ impl Ins { } fn write_string_form_reg123_oe_rc(&self, out: &mut String) -> std::fmt::Result { - let name_suffix = match (self.oe(), self.rc()) { + let name_suffix = match (self.oe() != 0, self.rc() != 0) { (false, false) => "", (false, true) => ".", (true, false) => "o", @@ -1532,7 +1532,7 @@ impl Ins { } fn write_string_form_reg12_oe_rc(&self, out: &mut String) -> std::fmt::Result { - let name_suffix = match (self.oe(), self.rc()) { + let name_suffix = match (self.oe() != 0, self.rc() != 0) { (false, false) => "", (false, true) => ".", (true, false) => "o", @@ -1559,7 +1559,7 @@ impl Ins { } fn write_string_form_reg21_rc(&self, out: &mut String) -> std::fmt::Result { - let name_suffix = if self.rc() { "." } else { "" }; + let name_suffix = if self.rc() != 0 { "." } else { "" }; let name = match self.op { Opcode::Cntlzw => "cntlzw", Opcode::Extsb => "extsb", @@ -1571,7 +1571,7 @@ impl Ins { fn write_string_form_fr1(&self, out: &mut String) -> std::fmt::Result { let name = match self.op { - Opcode::Mffs => match self.rc() { + Opcode::Mffs => match self.rc() != 0 { false => "mffs", true => "mffs.", }, @@ -1581,7 +1581,7 @@ impl Ins { } fn write_string_form_fr13(&self, out: &mut String) -> std::fmt::Result { - let name_suffix = if self.rc() { "." } else { "" }; + let name_suffix = if self.rc() != 0 { "." } else { "" }; let name = match self.op { Opcode::Fabs => "fabs", Opcode::Fnabs => "fnabs", @@ -1611,7 +1611,7 @@ impl Ins { } fn write_string_form_fr123(&self, out: &mut String) -> std::fmt::Result { - let name_suffix = if self.rc() { "." } else { "" }; + let name_suffix = if self.rc() != 0 { "." } else { "" }; let name = match self.op { Opcode::Fadd => "fadd", Opcode::Fadds => "fadds", @@ -1640,7 +1640,7 @@ impl Ins { } fn write_string_form_fr1243(&self, out: &mut String) -> std::fmt::Result { - let name_suffix = if self.rc() { "." } else { "" }; + let name_suffix = if self.rc() != 0 { "." } else { "" }; let name = match self.op { Opcode::Fmadd => "fmadd", Opcode::Fmadds => "fmadds", @@ -1675,7 +1675,7 @@ impl Ins { } fn write_string_form_fr124(&self, out: &mut String) -> std::fmt::Result { - let name_suffix = if self.rc() { "." } else { "" }; + let name_suffix = if self.rc() != 0 { "." } else { "" }; let name = match self.op { Opcode::Fmul => "fmul", Opcode::Fmuls => "fmuls", @@ -1716,7 +1716,7 @@ impl Ins { } fn write_string_form_condreg1_fr13_rc(&self, out: &mut String) -> std::fmt::Result { - let name_suffix = if self.rc() { "." } else { "" }; + let name_suffix = if self.rc() != 0 { "." } else { "" }; let name = match self.op { Opcode::Fctiw => "fctiw", Opcode::Fctiwz => "fctiwz", @@ -1734,7 +1734,7 @@ impl Ins { } fn write_string_b(&self, out: &mut String) -> std::fmt::Result { - let name = match (self.aa(), self.lk()) { + let name = match (self.aa() != 0, self.lk() != 0) { (false, false) => "b", (false, true) => "bl", (true, false) => "ba", @@ -1745,7 +1745,7 @@ impl Ins { } fn write_string_bc(&self, out: &mut String) -> std::fmt::Result { - let name = match (self.aa(), self.lk()) { + let name = match (self.aa() != 0, self.lk() != 0) { (false, false) => "bc", (false, true) => "bcl", (true, false) => "bca", @@ -1764,11 +1764,11 @@ impl Ins { fn write_string_branch_cond_to_reg(&self, out: &mut String) -> std::fmt::Result { let name = match self.op { - Opcode::Bcctr => match self.lk() { + Opcode::Bcctr => match self.lk() != 0 { false => "bcctr", true => "bcctrl", }, - Opcode::Bclr => match self.lk() { + Opcode::Bclr => match self.lk() != 0 { false => "bclr", true => "bclrl", }, @@ -1823,11 +1823,11 @@ impl Ins { fn write_string_form_condreg1(&self, out: &mut String) -> std::fmt::Result { let name = match self.op { Opcode::Mcrxr => "mcrxr", - Opcode::Mtfsb0 => match self.rc() { + Opcode::Mtfsb0 => match self.rc() != 0 { false => "mtfsb0", true => "mtfsb0.", }, - Opcode::Mtfsb1 => match self.rc() { + Opcode::Mtfsb1 => match self.rc() != 0 { false => "mtfsb1", true => "mtfsb1.", }, @@ -1883,7 +1883,7 @@ impl Ins { } fn write_string_form_reg213(&self, out: &mut String) -> std::fmt::Result { - let name_suffix = if self.rc() { "." } else { "" }; + let name_suffix = if self.rc() != 0 { "." } else { "" }; let name = match self.op { Opcode::Eqv => "eqv", Opcode::Nand => "nand", @@ -1907,7 +1907,7 @@ impl Ins { } fn write_string_rlw_imm(&self, out: &mut String) -> std::fmt::Result { - let name_prefix = if self.rc() { "." } else { "" }; + let name_prefix = if self.rc() != 0 { "." } else { "" }; let name = match self.op { Opcode::Rlwimi => "rlwimi", Opcode::Rlwinm => "rlwinm", @@ -1928,7 +1928,7 @@ impl Ins { fn write_string_rlw_reg(&self, out: &mut String) -> std::fmt::Result { assert_eq!(self.op, Opcode::Rlwnm); - let name_prefix = if self.rc() { "." } else { "" }; + let name_prefix = if self.rc() != 0 { "." } else { "" }; write!( out, "rlwnm{} r{}, r{}, r{}, {}, {}", @@ -1990,7 +1990,7 @@ impl Ins { fn write_string_srawi(&self, out: &mut String) -> std::fmt::Result { assert_eq!(self.op, Opcode::Srawi); - let name_suffix = if self.rc() { "." } else { "" }; + let name_suffix = if self.rc() != 0 { "." } else { "" }; write!( out, "srawi{} r{}, r{}, {}", @@ -2021,7 +2021,7 @@ impl Ins { }; write!( out, - "{} fr{}, {}(r{}), {}, {}", + "{} fr{}, {}(r{}), {}, qr{}", name, self.d(), self.ps_d(), @@ -2300,7 +2300,7 @@ mod tests { bits::(0b00000101100000000000000000000000u32, 5..9), 0b1011u32 ); - assert_eq!(bit(0b00000101100000000000000000000000u32, 5), true); + assert_eq!(bit(0b00000101100000000000000000000000u32, 5), 1); } #[test] fn test_opcodes() { @@ -2337,5 +2337,39 @@ mod tests { assert_asm!(0x10000014, "ps_sum0 fr0, fr0, fr0, fr0"); assert_asm!(0x10000032, "ps_mul fr0, fr0, fr0"); assert_asm!(0x7c00052a, "stswx r0, r0, r0"); + assert_asm!(0x9421ffc0, "stwu r1, -64(r1)"); + // assert_asm!(0x7C0802A6, "mflr r0"); + assert_asm!(0x90010044, "stw r0, 68(r1)"); + assert_asm!(0xDBE10030, "stfd fr31, 48(r1)"); + assert_asm!(0xF3E10038, "psq_st fr31, 56(r1), 0, qr0"); + assert_asm!(0xDBC10020, "stfd fr30, 32(r1)"); + assert_asm!(0xF3C10028, "psq_st fr30, 40(r1), 0, qr0"); + assert_asm!(0xDBA10010, "stfd fr29, 16(r1)"); + assert_asm!(0xF3A10018, "psq_st fr29, 24(r1), 0, qr0"); + assert_asm!(0x93E1000C, "stw r31, 12(r1)"); + // assert_asm!(0xFFE01890, "fmr fr31, fr3"); + // assert_asm!(0x7C7F1B78, "mr r31, r3"); + assert_asm!(0x7C7F1B78, "or r31, r3, r3"); + // assert_asm!(0xFFA00890, "fmr fr29, fr1"); + // assert_asm!(0xFFC01090, "fmr fr30, fr2"); + // assert_asm!(0xFC20F890, "fmr fr1, fr31"); + // assert_asm!(0xEC3D0072, "fmuls fr1, f29, fr1"); + // assert_asm!(0xEC1D0772, "fmuls fr0, fr29, fr29"); + // assert_asm!(0xEC5E0828, "fsubs fr2, fr30, fr1"); + assert_asm!(0xEC21007A, "fmadds fr1, fr1, fr1, fr0"); + assert_asm!(0xD05F0000, "stfs fr2, 0(r31)"); + assert_asm!(0xD03F0004, "stfs fr1, 4(r31)"); + assert_asm!(0xD3FF0008, "stfs fr31, 8(r31)"); + assert_asm!(0xE3E10038, "psq_l fr31, 56(r1), 0, qr0"); + assert_asm!(0xCBE10030, "lfd fr31, 48(r1)"); + assert_asm!(0xE3C10028, "psq_l fr30, 40(r1), 0, qr0"); + assert_asm!(0xCBC10020, "lfd fr30, 32(r1)"); + assert_asm!(0xE3A10018, "psq_l fr29, 24(r1), 0, qr0"); + assert_asm!(0xCBA10010, "lfd fr29, 16(r1)"); + assert_asm!(0x80010044, "lwz r0, 68(r1)"); + assert_asm!(0x83E1000C, "lwz r31, 12(r1)"); + // assert_asm!(0x7C0803A6, "mtlr r0"); + assert_asm!(0x38210040, "addi r1, r1, 64"); + // assert_asm!(0x4E800020, "blr"); } }