diff --git a/Cargo.lock b/Cargo.lock index 4ef8b80..584bd32 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -276,6 +276,44 @@ dependencies = [ "indexmap", ] +[[package]] +name = "phf" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928c6535de93548188ef63bb7c4036bd415cd8f36ad25af44b9789b2ee72a48c" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_codegen" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56ac890c5e3ca598bbdeaa99964edb5b0258a583a9eb6ef4e89fc85d9224770" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1181c94580fa345f50f19d738aaa39c0ed30a600d95cb2d3e23f94266f14fbf" +dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_shared" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fb5f6f826b772a8d4c0394209441e7d37cbbb967ae9c7e0e8134365c9ee676" +dependencies = [ + "siphasher", +] + [[package]] name = "ppc750cl" version = "0.2.0" @@ -284,6 +322,13 @@ dependencies = [ "serde", ] +[[package]] +name = "ppc750cl-asm" +version = "0.1.0" +dependencies = [ + "phf", +] + [[package]] name = "ppc750cl-flow-graph" version = "0.2.0" @@ -310,6 +355,9 @@ name = "ppc750cl-genisa" version = "0.2.0" dependencies = [ "itertools", + "phf", + "phf_codegen", + "pratt", "proc-macro2", "quote", "serde", @@ -340,6 +388,12 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" +[[package]] +name = "pratt" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17e0a4425d076f0718b820673a38fbf3747080c61017eeb0dd79bc7e472b8bb8" + [[package]] name = "proc-macro2" version = "1.0.37" @@ -511,6 +565,12 @@ dependencies = [ "rand_core", ] +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + [[package]] name = "smallvec" version = "1.8.0" diff --git a/Cargo.toml b/Cargo.toml index 71aa117..20008f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,6 @@ [workspace] members = [ + "asm", "disasm", "disasm-py", "dol", diff --git a/asm/Cargo.toml b/asm/Cargo.toml new file mode 100644 index 0000000..e30f5ba --- /dev/null +++ b/asm/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "ppc750cl-asm" +version = "0.1.0" +edition = "2021" +authors = ["Luke Street "] +license = "GPL-3.0-or-later" +description = "Assembler for PowerPC 750CL" +keywords = ["powerpc", "wii", "gamecube"] +repository = "https://github.com/encounter/ppc750cl" + +[dependencies] +phf = "0.11.1" diff --git a/asm/src/generated.rs b/asm/src/generated.rs new file mode 100644 index 0000000..9a246eb --- /dev/null +++ b/asm/src/generated.rs @@ -0,0 +1,3618 @@ +use crate::prelude::*; +pub enum Field { + Simm, + Uimm, + Offset, + PsOffset, + BO, + BI, + BH, + BD, + LI, + SH, + MB, + ME, + RS, + RD, + RA, + RA_Nz, + RB, + RC, + Sr, + Spr, + FrS, + FrD, + FrA, + FrB, + FrC, + CrbD, + CrbA, + CrbB, + CrfD, + CrfS, + Crm, + PsI, + PsIX, + PsW, + PsWX, + NB, + Tbr, + MtfsfFM, + MtfsfIMM, + SprSPRG, + SprBAT, + TO, + L, +} +pub const fn apply_field(code: u32, field: Field, value: i32) -> u32 { + match field { + Field::Simm => code | (value as u32 & 0xffff), + Field::Uimm => code | (value as u32 & 0xffff), + Field::Offset => code | (value as u32 & 0xffff), + Field::PsOffset => code | (value as u32 & 0xfff), + Field::BO => code | ((value as u32 & 0x1f) << 21u8), + Field::BI => code | ((value as u32 & 0x1f) << 16u8), + Field::BH => code | ((value as u32 & 0x3) << 11u8), + Field::BD => code | (((value as u32 >> 2u8) & 0x3fff) << 2u8), + Field::LI => code | (((value as u32 >> 2u8) & 0xffffff) << 2u8), + Field::SH => code | ((value as u32 & 0x1f) << 11u8), + Field::MB => code | ((value as u32 & 0x1f) << 6u8), + Field::ME => code | ((value as u32 & 0x1f) << 1u8), + Field::RS => code | ((value as u32 & 0x1f) << 21u8), + Field::RD => code | ((value as u32 & 0x1f) << 21u8), + Field::RA => code | ((value as u32 & 0x1f) << 16u8), + Field::RA_Nz => code | ((value as u32 & 0x1f) << 16u8), + Field::RB => code | ((value as u32 & 0x1f) << 11u8), + Field::RC => code | ((value as u32 & 0x1f) << 6u8), + Field::Sr => code | ((value as u32 & 0xf) << 16u8), + Field::Spr => { + code | (((((value as u32 & 0b11111_00000u32) >> 5u32) + | ((value as u32 & 0b00000_11111u32) << 5u32)) as u32 + & 0x3ff) + << 11u8) + } + Field::FrS => code | ((value as u32 & 0x1f) << 21u8), + Field::FrD => code | ((value as u32 & 0x1f) << 21u8), + Field::FrA => code | ((value as u32 & 0x1f) << 16u8), + Field::FrB => code | ((value as u32 & 0x1f) << 11u8), + Field::FrC => code | ((value as u32 & 0x1f) << 6u8), + Field::CrbD => code | ((value as u32 & 0x1f) << 21u8), + Field::CrbA => code | ((value as u32 & 0x1f) << 16u8), + Field::CrbB => code | ((value as u32 & 0x1f) << 11u8), + Field::CrfD => code | ((value as u32 & 0x7) << 23u8), + Field::CrfS => code | ((value as u32 & 0x7) << 18u8), + Field::Crm => code | ((value as u32 & 0xff) << 12u8), + Field::PsI => code | ((value as u32 & 0x7) << 12u8), + Field::PsIX => code | ((value as u32 & 0x7) << 7u8), + Field::PsW => code | ((value as u32 & 0x1) << 15u8), + Field::PsWX => code | ((value as u32 & 0x1) << 10u8), + Field::NB => code | ((value as u32 & 0x1f) << 11u8), + Field::Tbr => { + code | (((((value as u32 & 0b11111_00000u32) >> 5u32) + | ((value as u32 & 0b00000_11111u32) << 5u32)) as u32 + & 0x3ff) + << 11u8) + } + Field::MtfsfFM => code | ((value as u32 & 0xff) << 17u8), + Field::MtfsfIMM => code | ((value as u32 & 0xf) << 12u8), + Field::SprSPRG => code | ((value as u32 & 0x3) << 16u8), + Field::SprBAT => code | ((value as u32 & 0x3) << 17u8), + Field::TO => code | ((value as u32 & 0x1f) << 21u8), + Field::L => code | ((value as u32 & 0x1) << 21u8), + } +} +struct OpcodeInfo { + code: u32, + args: &'static [Field], +} +static OPCODES: phf::Map<&'static str, &'static [Option]> = ::phf::Map { + key: 12913932095322966823, + disps: &[ + (0, 10), + (1, 31), + (0, 3), + (0, 91), + (0, 71), + (0, 151), + (0, 1), + (1, 0), + (0, 3), + (1, 410), + (0, 41), + (0, 22), + (0, 10), + (0, 35), + (0, 1), + (0, 392), + (0, 436), + (0, 258), + (0, 3), + (0, 538), + (0, 55), + (0, 0), + (0, 3), + (0, 25), + (0, 129), + (0, 9), + (0, 24), + (0, 317), + (0, 14), + (0, 1), + (0, 8), + (0, 254), + (0, 0), + (0, 55), + (0, 78), + (0, 3), + (1, 112), + (0, 8), + (0, 184), + (0, 88), + (0, 0), + (0, 21), + (0, 327), + (0, 0), + (0, 3), + (0, 42), + (0, 3), + (0, 114), + (0, 2), + (0, 8), + (0, 2), + (0, 7), + (0, 102), + (10, 498), + (2, 149), + (0, 64), + (0, 136), + (0, 7), + (0, 164), + (0, 568), + (2, 203), + (0, 11), + (2, 485), + (0, 0), + (0, 77), + (0, 192), + (0, 59), + (0, 352), + (2, 413), + (0, 28), + (0, 189), + (1, 1), + (0, 500), + (0, 48), + (1, 217), + (0, 78), + (3, 371), + (0, 39), + (0, 143), + (0, 12), + (1, 432), + (0, 26), + (0, 492), + (0, 276), + (0, 7), + (0, 5), + (0, 451), + (0, 26), + (0, 14), + (3, 21), + (1, 209), + (0, 60), + (7, 589), + (0, 598), + (16, 484), + (0, 347), + (2, 187), + (7, 113), + (2, 72), + (3, 268), + (0, 173), + (0, 55), + (0, 490), + (0, 20), + (0, 385), + (2, 418), + (0, 107), + (9, 167), + (5, 547), + (0, 7), + (1, 127), + (0, 1), + (0, 20), + (0, 0), + (0, 7), + (27, 422), + (0, 191), + (0, 11), + (0, 237), + (0, 19), + (42, 620), + (0, 0), + (0, 296), + (12, 509), + (1, 142), + (0, 2), + (1, 206), + (0, 5), + (0, 125), + (36, 311), + (0, 23), + (0, 222), + (0, 47), + (0, 171), + ], + entries: &[ + ("beqa-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("nop", &[Some(OpcodeInfo { code: 0x60000000, args: &[] })]), + ("bnsa+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bgtlr+", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("andi.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x70000000, args: &[Field::RA, Field::RS, Field::Uimm] }), + ]), + ("bge", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("addeo", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000114, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("fadd.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xfc00002a, args: &[Field::FrD, Field::FrA, Field::FrB] }), + ]), + ("clrlslwi", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x54000000, + args: &[Field::RA, Field::RS, Field::MB, Field::SH], + }), + ]), + ("fmsub.", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xfc000038, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("bdnzfla-", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("fmuls", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xec000032, args: &[Field::FrD, Field::FrA, Field::FrC] }), + ]), + ("ps_nmadd", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x1000003e, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("stfdu", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xdc000000, args: &[Field::FrS, Field::Offset, Field::RA] }), + ]), + ("bdnztl-", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("mfdar", &[None, Some(OpcodeInfo { code: 0x7c0002a6, args: &[Field::RD] })]), + ("bdnzla", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("bsola+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bdzflr+", &[None, Some(OpcodeInfo { code: 0x4c000020, args: &[Field::BI] })]), + ("icbi", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0007ac, args: &[Field::RA, Field::RB] }), + ]), + ("mtxer", &[None, Some(OpcodeInfo { code: 0x7c0003a6, args: &[Field::RS] })]), + ("fres", &[ + None, + None, + Some(OpcodeInfo { code: 0xec000030, args: &[Field::FrD, Field::FrB] }), + ]), + ("ble-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("stwux", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c00016e, args: &[Field::RS, Field::RA, Field::RB] }), + ]), + ("lhaux", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0002ee, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("bdzla-", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("bnela+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bdz-", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("bgt-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("frsp.", &[ + None, + None, + Some(OpcodeInfo { code: 0xfc000018, args: &[Field::FrD, Field::FrB] }), + ]), + ("cmpw", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c000000, args: &[Field::RA, Field::RB] }), + Some(OpcodeInfo { code: 0x7c000000, args: &[Field::CrfD, Field::RA, Field::RB] }), + ]), + ("cmpld", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c000040, args: &[Field::RA, Field::RB] }), + Some(OpcodeInfo { code: 0x7c000040, args: &[Field::CrfD, Field::RA, Field::RB] }), + ]), + ("bctrl", &[Some(OpcodeInfo { code: 0x4c000420, args: &[] })]), + ("sraw.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000630, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("bclrl", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::BO, Field::BI, Field::BH] }), + ]), + ("cntlzw.", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c000034, args: &[Field::RA, Field::RS] }), + ]), + ("bdnz", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("bgectr", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("lhzx", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c00022e, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("andc.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000078, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("fsel.", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xfc00002e, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("stfd", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xd8000000, args: &[Field::FrS, Field::Offset, Field::RA] }), + ]), + ("bsoctr", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("xor", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000278, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("subfc", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000010, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("oris", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x64000000, args: &[Field::RA, Field::RS, Field::Uimm] }), + ]), + ("tlbie", &[None, Some(OpcodeInfo { code: 0x7c000264, args: &[Field::RB] })]), + ("cmpldi", &[ + None, + None, + Some(OpcodeInfo { code: 0x28000000, args: &[Field::RA, Field::Uimm] }), + Some(OpcodeInfo { code: 0x28000000, args: &[Field::CrfD, Field::RA, Field::Uimm] }), + ]), + ("dcbf", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0000ac, args: &[Field::RA, Field::RB] }), + ]), + ("ps_merge11", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x100004e0, args: &[Field::FrD, Field::FrA, Field::FrB] }), + ]), + ("bcctrl", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::BO, Field::BI, Field::BH] }), + ]), + ("dcbst", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c00006c, args: &[Field::RA, Field::RB] }), + ]), + ("addmeo", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0001d4, args: &[Field::RD, Field::RA] }), + ]), + ("crnand", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x4c0001c2, args: &[Field::CrbD, Field::CrbA, Field::CrbB] }), + ]), + ("bdnzta+", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("addco.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000014, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("bgel-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bnel+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("divwo.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0003d6, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("bdnzfl-", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("stb", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x98000000, args: &[Field::RS, Field::Offset, Field::RA] }), + ]), + ("bdzt-", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("and", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000038, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("bsoctr+", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("bclrl+", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::BO, Field::BI, Field::BH] }), + ]), + ("subfo", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000050, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("bdnzl+", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("mfsrr0", &[None, Some(OpcodeInfo { code: 0x7c0002a6, args: &[Field::RD] })]), + ("mtlr", &[None, Some(OpcodeInfo { code: 0x7c0003a6, args: &[Field::RS] })]), + ("lwzux", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c00006e, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("blel+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("lwzx", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c00002e, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("bdnzta-", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("bdnzflrl+", &[None, Some(OpcodeInfo { code: 0x4c000020, args: &[Field::BI] })]), + ("stmw", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xbc000000, args: &[Field::RS, Field::Offset, Field::RA] }), + ]), + ("bdnzla-", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("bnsctr", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("fmr.", &[ + None, + None, + Some(OpcodeInfo { code: 0xfc000090, args: &[Field::FrD, Field::FrB] }), + ]), + ("mtdsisr", &[None, Some(OpcodeInfo { code: 0x7c0003a6, args: &[Field::RS] })]), + ("cntlzw", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c000034, args: &[Field::RA, Field::RS] }), + ]), + ("adde", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000114, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("bdztl+", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("subfmeo", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0001d0, args: &[Field::RD, Field::RA] }), + ]), + ("bnsl-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bdnza", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("addi", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x38000000, args: &[Field::RD, Field::RA, Field::Simm] }), + ]), + ("stbux", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0001ee, args: &[Field::RS, Field::RA, Field::RB] }), + ]), + ("bca", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BO, Field::BI, Field::BD] }), + ]), + ("bltctr", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("extrwi.", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x54000000, + args: &[Field::RA, Field::RS, Field::MB, Field::SH], + }), + ]), + ("bgela+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("cmpd", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c000000, args: &[Field::RA, Field::RB] }), + Some(OpcodeInfo { code: 0x7c000000, args: &[Field::CrfD, Field::RA, Field::RB] }), + ]), + ("blrl", &[Some(OpcodeInfo { code: 0x4c000020, args: &[] })]), + ("rlwimi", &[ + None, + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x50000000, + args: &[Field::RA, Field::RS, Field::SH, Field::MB, Field::ME], + }), + ]), + ("bdnztla-", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("bgel+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bgtctrl+", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("extsb", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c000774, args: &[Field::RA, Field::RS] }), + ]), + ("mtfsfi", &[ + None, + None, + Some(OpcodeInfo { code: 0xfc00010c, args: &[Field::CrfD, Field::MtfsfIMM] }), + ]), + ("ps_sel", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x1000002e, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("crclr", &[None, Some(OpcodeInfo { code: 0x4c000182, args: &[Field::CrbD] })]), + ("bgt", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bne", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bca-", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BO, Field::BI, Field::BD] }), + ]), + ("srwi.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x54000000, args: &[Field::RA, Field::RS, Field::MB] }), + ]), + ("srw", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000430, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("bdnzt-", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("bnsa-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("nand.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0003b8, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("rfi", &[Some(OpcodeInfo { code: 0x4c000000, args: &[] })]), + ("ps_cmpo0", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x10000040, args: &[Field::CrfD, Field::FrA, Field::FrB] }), + ]), + ("xori", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x68000000, args: &[Field::RA, Field::RS, Field::Uimm] }), + ]), + ("bdzta+", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("divwu.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000396, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("fnabs", &[ + None, + None, + Some(OpcodeInfo { code: 0xfc000110, args: &[Field::FrD, Field::FrB] }), + ]), + ("bdzlr+", &[Some(OpcodeInfo { code: 0x4c000020, args: &[] })]), + ("crxor", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x4c000182, args: &[Field::CrbD, Field::CrbA, Field::CrbB] }), + ]), + ("bnela-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("cmpdi", &[ + None, + None, + Some(OpcodeInfo { code: 0x2c000000, args: &[Field::RA, Field::Simm] }), + Some(OpcodeInfo { code: 0x2c000000, args: &[Field::CrfD, Field::RA, Field::Simm] }), + ]), + ("lfdux", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0004ee, args: &[Field::FrD, Field::RA, Field::RB] }), + ]), + ("lwbrx", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c00042c, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("fdiv", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xfc000024, args: &[Field::FrD, Field::FrA, Field::FrB] }), + ]), + ("fnmsub", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xfc00003c, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("bgtctr+", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("bge+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("ble+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("addco", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000014, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("subf", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000050, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("addo", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000214, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("lis", &[ + None, + None, + Some(OpcodeInfo { code: 0x3c000000, args: &[Field::RD, Field::Uimm] }), + ]), + ("bgectr+", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("bc", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BO, Field::BI, Field::BD] }), + ]), + ("blt-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("stwcx.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c00012d, args: &[Field::RS, Field::RA, Field::RB] }), + ]), + ("subfc.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000010, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("isync", &[Some(OpcodeInfo { code: 0x4c00012c, args: &[] })]), + ("bdnztlr", &[None, Some(OpcodeInfo { code: 0x4c000020, args: &[Field::BI] })]), + ("fmsubs", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xec000038, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("mtsprg", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0003a6, args: &[Field::SprSPRG, Field::RS] }), + ]), + ("andis.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x74000000, args: &[Field::RA, Field::RS, Field::Uimm] }), + ]), + ("tlbsync", &[Some(OpcodeInfo { code: 0x7c00046c, args: &[] })]), + ("bdzf", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("subfco.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000010, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("addzeo.", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c000194, args: &[Field::RD, Field::RA] }), + ]), + ("bdza-", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("divw.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0003d6, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("bdzfa+", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("bdza", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("ps_div", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x10000024, args: &[Field::FrD, Field::FrA, Field::FrB] }), + ]), + ("bsola-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("beqlrl+", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("srw.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000430, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("frsqrte.", &[ + None, + None, + Some(OpcodeInfo { code: 0xfc000034, args: &[Field::FrD, Field::FrB] }), + ]), + ("blta+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bdnzfl", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("bltlr+", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("rlwimi.", &[ + None, + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x50000000, + args: &[Field::RA, Field::RS, Field::SH, Field::MB, Field::ME], + }), + ]), + ("mtfsb0.", &[None, Some(OpcodeInfo { code: 0xfc00008c, args: &[Field::CrbD] })]), + ("dcbt", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c00022c, args: &[Field::RA, Field::RB] }), + ]), + ("fdiv.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xfc000024, args: &[Field::FrD, Field::FrA, Field::FrB] }), + ]), + ("bdnzl", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("mfctr", &[None, Some(OpcodeInfo { code: 0x7c0002a6, args: &[Field::RD] })]), + ("lhbrx", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c00062c, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("bnslrl+", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("mfdsisr", &[None, Some(OpcodeInfo { code: 0x7c0002a6, args: &[Field::RD] })]), + ("bdztl", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("bltla", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bcl", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BO, Field::BI, Field::BD] }), + ]), + ("bdzfla-", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("lhax", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0002ae, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("bgtl-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("fctiw.", &[ + None, + None, + Some(OpcodeInfo { code: 0xfc00001c, args: &[Field::FrD, Field::FrB] }), + ]), + ("blea", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("ps_mul", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x10000032, args: &[Field::FrD, Field::FrA, Field::FrC] }), + ]), + ("crnor", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x4c000042, args: &[Field::CrbD, Field::CrbA, Field::CrbB] }), + ]), + ("beqctr+", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("bdnzf-", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("clrrwi", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x54000000, args: &[Field::RA, Field::RS, Field::ME] }), + ]), + ("bdztla", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("bsola", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("lha", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xa8000000, args: &[Field::RD, Field::Offset, Field::RA] }), + ]), + ("extrwi", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x54000000, + args: &[Field::RA, Field::RS, Field::MB, Field::SH], + }), + ]), + ("ps_madd", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x1000003a, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("bdnztl", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("bgela-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("fmuls.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xec000032, args: &[Field::FrD, Field::FrA, Field::FrC] }), + ]), + ("bgtla+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("mullw.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0001d6, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("fsub", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xfc000028, args: &[Field::FrD, Field::FrA, Field::FrB] }), + ]), + ("bltlr", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("mfcr", &[None, Some(OpcodeInfo { code: 0x7c000026, args: &[Field::RD] })]), + ("bdnz+", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("cror", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x4c000382, args: &[Field::CrbD, Field::CrbA, Field::CrbB] }), + ]), + ("twgti", &[ + None, + None, + Some(OpcodeInfo { code: 0xc0000000, args: &[Field::RA, Field::Simm] }), + ]), + ("crset", &[None, Some(OpcodeInfo { code: 0x4c000242, args: &[Field::CrbD] })]), + ("bgectrl+", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("bnectrl+", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("bgtl", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("subfme", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0001d0, args: &[Field::RD, Field::RA] }), + ]), + ("stw", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x90000000, args: &[Field::RS, Field::Offset, Field::RA] }), + ]), + ("bnea-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("beqctrl", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("fnmadd.", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xfc00003e, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("mfdbatu", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0002a6, args: &[Field::RD, Field::SprBAT] }), + ]), + ("bdzla+", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("bc+", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BO, Field::BI, Field::BD] }), + ]), + ("bdzlrl+", &[Some(OpcodeInfo { code: 0x4c000020, args: &[] })]), + ("bdztlrl+", &[None, Some(OpcodeInfo { code: 0x4c000020, args: &[Field::BI] })]), + ("bns", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("mtear", &[None, Some(OpcodeInfo { code: 0x7c0003a6, args: &[Field::RS] })]), + ("ps_abs", &[ + None, + None, + Some(OpcodeInfo { code: 0x10000210, args: &[Field::FrD, Field::FrB] }), + ]), + ("ps_neg", &[ + None, + None, + Some(OpcodeInfo { code: 0x10000050, args: &[Field::FrD, Field::FrB] }), + ]), + ("bdnzlr", &[Some(OpcodeInfo { code: 0x4c000020, args: &[] })]), + ("fmsub", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xfc000038, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("bns+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bnsl+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("beqctr", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("bgectrl", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("bgelr+", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("lwzu", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x84000000, args: &[Field::RD, Field::Offset, Field::RA] }), + ]), + ("srawi", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000670, args: &[Field::RA, Field::RS, Field::SH] }), + ]), + ("ecowx", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c00036c, args: &[Field::RS, Field::RA, Field::RB] }), + ]), + ("blelr", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("mtdar", &[None, Some(OpcodeInfo { code: 0x7c0003a6, args: &[Field::RS] })]), + ("divwo", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0003d6, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("orc.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000338, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("bdnztla+", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("mtcrf", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c000120, args: &[Field::Crm, Field::RS] }), + ]), + ("subfmeo.", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0001d0, args: &[Field::RD, Field::RA] }), + ]), + ("addis", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x3c000000, args: &[Field::RD, Field::RA, Field::Uimm] }), + ]), + ("bgea+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("mtspr", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0003a6, args: &[Field::Spr, Field::RS] }), + ]), + ("lswi", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0004aa, args: &[Field::RD, Field::RA, Field::NB] }), + ]), + ("frsqrte", &[ + None, + None, + Some(OpcodeInfo { code: 0xfc000034, args: &[Field::FrD, Field::FrB] }), + ]), + ("bdzflrl+", &[None, Some(OpcodeInfo { code: 0x4c000020, args: &[Field::BI] })]), + ("subfze", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c000190, args: &[Field::RD, Field::RA] }), + ]), + ("beql", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("cmpl", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x7c000040, + args: &[Field::CrfD, Field::L, Field::RA, Field::RB], + }), + ]), + ("frsp", &[ + None, + None, + Some(OpcodeInfo { code: 0xfc000018, args: &[Field::FrD, Field::FrB] }), + ]), + ("bnelr+", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("xor.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000278, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("bltl+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("blectr", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("bsol", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bdnzf+", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("bdnzf", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("bdnzt", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("ps_msub", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x10000038, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("fnabs.", &[ + None, + None, + Some(OpcodeInfo { code: 0xfc000110, args: &[Field::FrD, Field::FrB] }), + ]), + ("bdza+", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("ps_rsqrte", &[ + None, + None, + Some(OpcodeInfo { code: 0x10000034, args: &[Field::FrD, Field::FrB] }), + ]), + ("bgtla", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("mcrf", &[ + None, + None, + Some(OpcodeInfo { code: 0x4c000000, args: &[Field::CrfD, Field::CrfS] }), + ]), + ("andc", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000078, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("bnectr+", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("ps_cmpu1", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x10000080, args: &[Field::CrfD, Field::FrA, Field::FrB] }), + ]), + ("bclr", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::BO, Field::BI, Field::BH] }), + ]), + ("bgelrl+", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("bltlrl", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("bgelr", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("blel", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("eciwx", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c00026c, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("bgta", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("blt+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("extsb.", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c000774, args: &[Field::RA, Field::RS] }), + ]), + ("psq_lx", &[ + None, + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x1000000c, + args: &[Field::FrD, Field::RA, Field::RB, Field::PsWX, Field::PsIX], + }), + ]), + ("clrlwi.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x54000000, args: &[Field::RA, Field::RS, Field::MB] }), + ]), + ("ps_muls0", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x10000018, args: &[Field::FrD, Field::FrA, Field::FrC] }), + ]), + ("dcbi", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0003ac, args: &[Field::RA, Field::RB] }), + ]), + ("stwu", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x94000000, args: &[Field::RS, Field::Offset, Field::RA] }), + ]), + ("orc", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000338, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("fmadds", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xec00003a, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("nor", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0000f8, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("mr", &[None, None, Some(OpcodeInfo { code: 0x7c000378, args: &[Field::RA, Field::RS] })]), + ("nego", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0000d0, args: &[Field::RD, Field::RA] }), + ]), + ("fmadd.", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xfc00003a, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("beq", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bdnzlrl", &[Some(OpcodeInfo { code: 0x4c000020, args: &[] })]), + ("blela", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("twllei", &[ + None, + None, + Some(OpcodeInfo { code: 0xc0000000, args: &[Field::RA, Field::Simm] }), + ]), + ("mtsr", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0001a4, args: &[Field::Sr, Field::RS] }), + ]), + ("bdzl-", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("bne+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bnsctr+", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("stfs", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xd0000000, args: &[Field::FrS, Field::Offset, Field::RA] }), + ]), + ("fctiwz", &[ + None, + None, + Some(OpcodeInfo { code: 0xfc00001e, args: &[Field::FrD, Field::FrB] }), + ]), + ("fnmsubs", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xec00003c, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("fmsubs.", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xec000038, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("bsolrl", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("lfdu", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xcc000000, args: &[Field::FrD, Field::Offset, Field::RA] }), + ]), + ("lmw", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xb8000000, args: &[Field::RD, Field::Offset, Field::RA] }), + ]), + ("beql-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("mfear", &[None, Some(OpcodeInfo { code: 0x7c0002a6, args: &[Field::RD] })]), + ("fcmpu", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xfc000000, args: &[Field::CrfD, Field::FrA, Field::FrB] }), + ]), + ("bdnzta", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("bdnza+", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("fdivs.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xec000024, args: &[Field::FrD, Field::FrA, Field::FrB] }), + ]), + ("bdzta", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("mulhwu.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000016, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("mfibatu", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0002a6, args: &[Field::RD, Field::SprBAT] }), + ]), + ("beqla+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bdzl+", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("bdnzfla", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("ps_cmpu0", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x10000000, args: &[Field::CrfD, Field::FrA, Field::FrB] }), + ]), + ("ps_merge01", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x10000460, args: &[Field::FrD, Field::FrA, Field::FrB] }), + ]), + ("beqa+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("ps_sum0", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x10000014, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("beqlr+", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("fsub.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xfc000028, args: &[Field::FrD, Field::FrA, Field::FrB] }), + ]), + ("bdzfla", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("mtdec", &[None, Some(OpcodeInfo { code: 0x7c0003a6, args: &[Field::RS] })]), + ("bdnzt+", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("subfme.", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0001d0, args: &[Field::RD, Field::RA] }), + ]), + ("cmplwi", &[ + None, + None, + Some(OpcodeInfo { code: 0x28000000, args: &[Field::RA, Field::Uimm] }), + Some(OpcodeInfo { code: 0x28000000, args: &[Field::CrfD, Field::RA, Field::Uimm] }), + ]), + ("neg.", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0000d0, args: &[Field::RD, Field::RA] }), + ]), + ("mfsdr1", &[None, Some(OpcodeInfo { code: 0x7c0002a6, args: &[Field::RD] })]), + ("bdzta-", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("clrlwi", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x54000000, args: &[Field::RA, Field::RS, Field::MB] }), + ]), + ("beqla", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("mulhwu", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000016, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("bdnzflr", &[None, Some(OpcodeInfo { code: 0x4c000020, args: &[Field::BI] })]), + ("stbu", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x9c000000, args: &[Field::RS, Field::Offset, Field::RA] }), + ]), + ("bsoctrl+", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("bge-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("rotlwi", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x54000000, args: &[Field::RA, Field::RS, Field::SH] }), + ]), + ("fsel", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xfc00002e, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("mcrxr", &[None, Some(OpcodeInfo { code: 0x7c000400, args: &[Field::CrfD] })]), + ("stswi", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0005aa, args: &[Field::RS, Field::RA, Field::NB] }), + ]), + ("srwi", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x54000000, args: &[Field::RA, Field::RS, Field::MB] }), + ]), + ("cmpi", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x2c000000, + args: &[Field::CrfD, Field::L, Field::RA, Field::Simm], + }), + ]), + ("ps_merge10", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x100004a0, args: &[Field::FrD, Field::FrA, Field::FrB] }), + ]), + ("ps_add", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x1000002a, args: &[Field::FrD, Field::FrA, Field::FrB] }), + ]), + ("bsolr+", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("psq_stx", &[ + None, + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x1000000e, + args: &[Field::FrS, Field::RA, Field::RB, Field::PsWX, Field::PsIX], + }), + ]), + ("bso+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("crmove", &[ + None, + None, + Some(OpcodeInfo { code: 0x4c000382, args: &[Field::CrbD, Field::CrbA] }), + ]), + ("nor.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0000f8, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("subfeo", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000110, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("bltla+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("mulhw", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000096, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("rlwnm", &[ + None, + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x5c000000, + args: &[Field::RA, Field::RS, Field::RB, Field::MB, Field::ME], + }), + ]), + ("fmr", &[ + None, + None, + Some(OpcodeInfo { code: 0xfc000090, args: &[Field::FrD, Field::FrB] }), + ]), + ("subfeo.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000110, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("fadds.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xec00002a, args: &[Field::FrD, Field::FrA, Field::FrB] }), + ]), + ("and.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000038, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("add.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000214, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("subfic", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x20000000, args: &[Field::RD, Field::RA, Field::Simm] }), + ]), + ("fmadd", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xfc00003a, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("stswx", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c00052a, args: &[Field::RS, Field::RA, Field::RB] }), + ]), + ("mtsdr1", &[None, Some(OpcodeInfo { code: 0x7c0003a6, args: &[Field::RS] })]), + ("cmplw", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c000040, args: &[Field::RA, Field::RB] }), + Some(OpcodeInfo { code: 0x7c000040, args: &[Field::CrfD, Field::RA, Field::RB] }), + ]), + ("bdnztlrl", &[None, Some(OpcodeInfo { code: 0x4c000020, args: &[Field::BI] })]), + ("blta", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("rotlw.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x5c000000, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("bnelr", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("subfe.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000110, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("mullw", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0001d6, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("bnel", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("sth", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xb0000000, args: &[Field::RS, Field::Offset, Field::RA] }), + ]), + ("bdnzlrl+", &[Some(OpcodeInfo { code: 0x4c000020, args: &[] })]), + ("crnot", &[ + None, + None, + Some(OpcodeInfo { code: 0x4c000042, args: &[Field::CrbD, Field::CrbA] }), + ]), + ("bnsla", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bgtctr", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("srawi.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000670, args: &[Field::RA, Field::RS, Field::SH] }), + ]), + ("cmp", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x7c000000, + args: &[Field::CrfD, Field::L, Field::RA, Field::RB], + }), + ]), + ("divw", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0003d6, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("bnel-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("divwuo.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000396, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("subfe", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000110, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("bcctrl+", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::BO, Field::BI, Field::BH] }), + ]), + ("fadds", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xec00002a, args: &[Field::FrD, Field::FrA, Field::FrB] }), + ]), + ("ps_nabs", &[ + None, + None, + Some(OpcodeInfo { code: 0x10000110, args: &[Field::FrD, Field::FrB] }), + ]), + ("icbi.", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0007ac, args: &[Field::RA, Field::RB] }), + ]), + ("bdztlr+", &[None, Some(OpcodeInfo { code: 0x4c000020, args: &[Field::BI] })]), + ("rlwinm", &[ + None, + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x54000000, + args: &[Field::RA, Field::RS, Field::SH, Field::MB, Field::ME], + }), + ]), + ("mfdbatl", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0002a6, args: &[Field::RD, Field::SprBAT] }), + ]), + ("mfsprg", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0002a6, args: &[Field::RD, Field::SprSPRG] }), + ]), + ("blt", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bdztlrl", &[None, Some(OpcodeInfo { code: 0x4c000020, args: &[Field::BI] })]), + ("stfsux", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c00056e, args: &[Field::FrS, Field::RA, Field::RB] }), + ]), + ("or", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000378, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("bdnzflr+", &[None, Some(OpcodeInfo { code: 0x4c000020, args: &[Field::BI] })]), + ("mulli", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x1c000000, args: &[Field::RD, Field::RA, Field::Simm] }), + ]), + ("bdzflr", &[None, Some(OpcodeInfo { code: 0x4c000020, args: &[Field::BI] })]), + ("crand", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x4c000202, args: &[Field::CrbD, Field::CrbA, Field::CrbB] }), + ]), + ("crandc", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x4c000102, args: &[Field::CrbD, Field::CrbA, Field::CrbB] }), + ]), + ("clrrwi.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x54000000, args: &[Field::RA, Field::RS, Field::ME] }), + ]), + ("mtfsb0", &[None, Some(OpcodeInfo { code: 0xfc00008c, args: &[Field::CrbD] })]), + ("addo.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000214, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("lhzu", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xa4000000, args: &[Field::RD, Field::Offset, Field::RA] }), + ]), + ("lbz", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x88000000, args: &[Field::RD, Field::Offset, Field::RA] }), + ]), + ("addmeo.", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0001d4, args: &[Field::RD, Field::RA] }), + ]), + ("bdzf-", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("bdzlrl", &[Some(OpcodeInfo { code: 0x4c000020, args: &[] })]), + ("bdztl-", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("bdz+", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("bnea+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bnela", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("lfsx", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c00042e, args: &[Field::FrD, Field::RA, Field::RB] }), + ]), + ("mfibatl", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0002a6, args: &[Field::RD, Field::SprBAT] }), + ]), + ("bgtctrl", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("fneg.", &[ + None, + None, + Some(OpcodeInfo { code: 0xfc000050, args: &[Field::FrD, Field::FrB] }), + ]), + ("bdzfl", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("bdnza-", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("dcbz", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0007ec, args: &[Field::RA, Field::RB] }), + ]), + ("bnsla+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("mfsr", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0004a6, args: &[Field::RD, Field::Sr] }), + ]), + ("mtctr", &[None, Some(OpcodeInfo { code: 0x7c0003a6, args: &[Field::RS] })]), + ("twi", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xc0000000, args: &[Field::TO, Field::RA, Field::Simm] }), + ]), + ("blelrl+", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("blelr+", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("bnelrl", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("bdzl", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("bdnztl+", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("rotlw", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x5c000000, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("bnectr", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("eqv", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000238, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("slwi.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x54000000, args: &[Field::RA, Field::RS, Field::SH] }), + ]), + ("addze.", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c000194, args: &[Field::RD, Field::RA] }), + ]), + ("bdzla", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("mr.", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c000378, args: &[Field::RA, Field::RS] }), + ]), + ("bdzfl-", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("bdztla-", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("bdnzl-", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("clrlslwi.", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x54000000, + args: &[Field::RA, Field::RS, Field::MB, Field::SH], + }), + ]), + ("addic.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x34000000, args: &[Field::RD, Field::RA, Field::Simm] }), + ]), + ("bdnzfa-", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("fadd", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xfc00002a, args: &[Field::FrD, Field::FrA, Field::FrB] }), + ]), + ("bltl", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("beqctrl+", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("tw", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000008, args: &[Field::TO, Field::RA, Field::RB] }), + ]), + ("beqla-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bla", &[None, Some(OpcodeInfo { code: 0x48000000, args: &[Field::LI] })]), + ("lbzu", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x8c000000, args: &[Field::RD, Field::Offset, Field::RA] }), + ]), + ("ps_nmsub", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x1000003c, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("addc.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000014, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("psq_lu", &[ + None, + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xe4000000, + args: &[Field::FrD, Field::PsOffset, Field::RA, Field::PsW, Field::PsI], + }), + ]), + ("bgela", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bgtlr", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("bnsla-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("blela-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("creqv", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x4c000242, args: &[Field::CrbD, Field::CrbA, Field::CrbB] }), + ]), + ("ori", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x60000000, args: &[Field::RA, Field::RS, Field::Uimm] }), + ]), + ("ps_sum1", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x10000016, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("lbzx", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0000ae, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("bgta+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("blr", &[Some(OpcodeInfo { code: 0x4c000020, args: &[] })]), + ("rotrwi", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x54000000, args: &[Field::RA, Field::RS, Field::SH] }), + ]), + ("fneg", &[ + None, + None, + Some(OpcodeInfo { code: 0xfc000050, args: &[Field::FrD, Field::FrB] }), + ]), + ("add", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000214, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("mttbu", &[None, Some(OpcodeInfo { code: 0x7c0003a6, args: &[Field::RS] })]), + ("mfxer", &[None, Some(OpcodeInfo { code: 0x7c0002a6, args: &[Field::RD] })]), + ("mullwo.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0001d6, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("psq_stux", &[ + None, + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x1000004e, + args: &[Field::FrS, Field::RA, Field::RB, Field::PsWX, Field::PsIX], + }), + ]), + ("fabs.", &[ + None, + None, + Some(OpcodeInfo { code: 0xfc000210, args: &[Field::FrD, Field::FrB] }), + ]), + ("bltla-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("lfsux", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c00046e, args: &[Field::FrD, Field::RA, Field::RB] }), + ]), + ("bcctr", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::BO, Field::BI, Field::BH] }), + ]), + ("mtfsf.", &[ + None, + None, + Some(OpcodeInfo { code: 0xfc00058e, args: &[Field::MtfsfFM, Field::FrB] }), + ]), + ("stfsu", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xd4000000, args: &[Field::FrS, Field::Offset, Field::RA] }), + ]), + ("bdztlr", &[None, Some(OpcodeInfo { code: 0x4c000020, args: &[Field::BI] })]), + ("subfco", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000010, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("b", &[None, Some(OpcodeInfo { code: 0x48000000, args: &[Field::LI] })]), + ("stfiwx", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0007ae, args: &[Field::FrS, Field::RA, Field::RB] }), + ]), + ("mtfsb1.", &[None, Some(OpcodeInfo { code: 0xfc00004c, args: &[Field::CrbD] })]), + ("mcrfs", &[ + None, + None, + Some(OpcodeInfo { code: 0xfc000080, args: &[Field::CrfD, Field::CrfS] }), + ]), + ("ps_muls1", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x1000001a, args: &[Field::FrD, Field::FrA, Field::FrC] }), + ]), + ("bcctr+", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::BO, Field::BI, Field::BH] }), + ]), + ("ps_merge00", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x10000420, args: &[Field::FrD, Field::FrA, Field::FrB] }), + ]), + ("bso-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("lhz", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xa0000000, args: &[Field::RD, Field::Offset, Field::RA] }), + ]), + ("lhau", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xac000000, args: &[Field::RD, Field::Offset, Field::RA] }), + ]), + ("blelrl", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("subfzeo.", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c000190, args: &[Field::RD, Field::RA] }), + ]), + ("bdz", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("blel-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("crorc", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x4c000342, args: &[Field::CrbD, Field::CrbA, Field::CrbB] }), + ]), + ("fctiwz.", &[ + None, + None, + Some(OpcodeInfo { code: 0xfc00001e, args: &[Field::FrD, Field::FrB] }), + ]), + ("bgel", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("twui", &[ + None, + None, + Some(OpcodeInfo { code: 0xc0000000, args: &[Field::RA, Field::Simm] }), + ]), + ("bnea", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("sraw", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000630, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("bdnzla+", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("ps_madds1", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x1000001e, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("bgelrl", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("stwx", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c00012e, args: &[Field::RS, Field::RA, Field::RB] }), + ]), + ("blea-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("mfsrr1", &[None, Some(OpcodeInfo { code: 0x7c0002a6, args: &[Field::RD] })]), + ("bltctrl", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("blea+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bgta-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("mflr", &[None, Some(OpcodeInfo { code: 0x7c0002a6, args: &[Field::RD] })]), + ("blectrl+", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("mtmsr", &[None, Some(OpcodeInfo { code: 0x7c000124, args: &[Field::RS] })]), + ("eqv.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000238, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("addze", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c000194, args: &[Field::RD, Field::RA] }), + ]), + ("ps_madds0", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x1000001c, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("rotlwi.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x54000000, args: &[Field::RA, Field::RS, Field::SH] }), + ]), + ("bdnztlr+", &[None, Some(OpcodeInfo { code: 0x4c000020, args: &[Field::BI] })]), + ("addeo.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000114, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("dcbtst", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0001ec, args: &[Field::RA, Field::RB] }), + ]), + ("bgea-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("blta-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("slw", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000030, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("mttbl", &[None, Some(OpcodeInfo { code: 0x7c0003a6, args: &[Field::RS] })]), + ("lwz", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x80000000, args: &[Field::RD, Field::Offset, Field::RA] }), + ]), + ("beqlrl", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("sthx", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c00032e, args: &[Field::RS, Field::RA, Field::RB] }), + ]), + ("bsoa+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("mfdec", &[None, Some(OpcodeInfo { code: 0x7c0002a6, args: &[Field::RD] })]), + ("extlwi", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x54000000, + args: &[Field::RA, Field::RS, Field::ME, Field::SH], + }), + ]), + ("lfd", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xc8000000, args: &[Field::FrD, Field::Offset, Field::RA] }), + ]), + ("lfsu", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xc4000000, args: &[Field::FrD, Field::Offset, Field::RA] }), + ]), + ("divwu", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000396, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("fnmsubs.", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xec00003c, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("mullwo", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0001d6, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("mtsrin", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0001e4, args: &[Field::RS, Field::RB] }), + ]), + ("stfdux", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0005ee, args: &[Field::FrS, Field::RA, Field::RB] }), + ]), + ("extsh.", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c000734, args: &[Field::RA, Field::RS] }), + ]), + ("bgtla-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bctr", &[Some(OpcodeInfo { code: 0x4c000420, args: &[] })]), + ("bcl-", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BO, Field::BI, Field::BD] }), + ]), + ("fmul.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xfc000032, args: &[Field::FrD, Field::FrA, Field::FrC] }), + ]), + ("bltl-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("blectrl", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("stwbrx", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c00052c, args: &[Field::RS, Field::RA, Field::RB] }), + ]), + ("bltctrl+", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("addzeo", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c000194, args: &[Field::RD, Field::RA] }), + ]), + ("bnslrl", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("mtibatl", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0003a6, args: &[Field::SprBAT, Field::RS] }), + ]), + ("or.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000378, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("fnmsub.", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xfc00003c, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("lfs", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xc0000000, args: &[Field::FrD, Field::Offset, Field::RA] }), + ]), + ("bnsa", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bgtl+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bcla", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BO, Field::BI, Field::BD] }), + ]), + ("bsol+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("mtfsf", &[ + None, + None, + Some(OpcodeInfo { code: 0xfc00058e, args: &[Field::MtfsfFM, Field::FrB] }), + ]), + ("fsubs", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xec000028, args: &[Field::FrD, Field::FrA, Field::FrB] }), + ]), + ("fnmadd", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xfc00003e, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("blela+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("lswx", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c00042a, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("fnmadds.", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xec00003e, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("sync", &[Some(OpcodeInfo { code: 0x7c0004ac, args: &[] })]), + ("bc-", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BO, Field::BI, Field::BD] }), + ]), + ("mfsrin", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c000526, args: &[Field::RD, Field::RB] }), + ]), + ("mtdbatu", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0003a6, args: &[Field::SprBAT, Field::RS] }), + ]), + ("mtsrr0", &[None, Some(OpcodeInfo { code: 0x7c0003a6, args: &[Field::RS] })]), + ("bdnzfa+", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("ps_res", &[ + None, + None, + Some(OpcodeInfo { code: 0x10000030, args: &[Field::FrD, Field::FrB] }), + ]), + ("bdnzfa", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("lbzux", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0000ee, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("bsoa-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bdnzflrl", &[None, Some(OpcodeInfo { code: 0x4c000020, args: &[Field::BI] })]), + ("psq_stu", &[ + None, + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xf4000000, + args: &[Field::FrS, Field::PsOffset, Field::RA, Field::PsW, Field::PsI], + }), + ]), + ("slw.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000030, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("sc", &[Some(OpcodeInfo { code: 0x44000002, args: &[] })]), + ("bnslr+", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("bdzfla+", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("mtdbatl", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0003a6, args: &[Field::SprBAT, Field::RS] }), + ]), + ("bdnztlrl+", &[None, Some(OpcodeInfo { code: 0x4c000020, args: &[Field::BI] })]), + ("slwi", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x54000000, args: &[Field::RA, Field::RS, Field::SH] }), + ]), + ("xoris", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x6c000000, args: &[Field::RA, Field::RS, Field::Uimm] }), + ]), + ("bsolr", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("fmul", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xfc000032, args: &[Field::FrD, Field::FrA, Field::FrC] }), + ]), + ("fabs", &[ + None, + None, + Some(OpcodeInfo { code: 0xfc000210, args: &[Field::FrD, Field::FrB] }), + ]), + ("beq-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("dcbz_l", &[ + None, + None, + Some(OpcodeInfo { code: 0x100007ec, args: &[Field::RA, Field::RB] }), + ]), + ("fdivs", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xec000024, args: &[Field::FrD, Field::FrA, Field::FrB] }), + ]), + ("stbx", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0001ae, args: &[Field::RS, Field::RA, Field::RB] }), + ]), + ("bso", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bdnzfl+", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("bdnztla", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("sthu", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xb4000000, args: &[Field::RS, Field::Offset, Field::RA] }), + ]), + ("ble", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("mffs", &[None, Some(OpcodeInfo { code: 0xfc00048e, args: &[Field::FrD] })]), + ("ps_sub", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x10000028, args: &[Field::FrD, Field::FrA, Field::FrB] }), + ]), + ("bdzfa", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("addme", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0001d4, args: &[Field::RD, Field::RA] }), + ]), + ("bnectrl", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("beq+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("beqlr", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("adde.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000114, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("lhzux", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c00026e, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("cmpwi", &[ + None, + None, + Some(OpcodeInfo { code: 0x2c000000, args: &[Field::RA, Field::Simm] }), + Some(OpcodeInfo { code: 0x2c000000, args: &[Field::CrfD, Field::RA, Field::Simm] }), + ]), + ("eieio", &[Some(OpcodeInfo { code: 0x7c0006ac, args: &[] })]), + ("ba", &[None, Some(OpcodeInfo { code: 0x48000000, args: &[Field::LI] })]), + ("bns-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("beql+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bdzt+", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("bdnz-", &[None, Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] })]), + ("bdzflrl", &[None, Some(OpcodeInfo { code: 0x4c000020, args: &[Field::BI] })]), + ("sthbrx", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c00072c, args: &[Field::RS, Field::RA, Field::RB] }), + ]), + ("extlwi.", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x54000000, + args: &[Field::RA, Field::RS, Field::ME, Field::SH], + }), + ]), + ("bgt+", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bnsl", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bl", &[None, Some(OpcodeInfo { code: 0x48000000, args: &[Field::LI] })]), + ("bcla+", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BO, Field::BI, Field::BD] }), + ]), + ("fsubs.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xec000028, args: &[Field::FrD, Field::FrA, Field::FrB] }), + ]), + ("subf.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000050, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("bca+", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BO, Field::BI, Field::BD] }), + ]), + ("bdztla+", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("bnelrl+", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("cmpli", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x28000000, + args: &[Field::CrfD, Field::L, Field::RA, Field::Uimm], + }), + ]), + ("fctiw", &[ + None, + None, + Some(OpcodeInfo { code: 0xfc00001c, args: &[Field::FrD, Field::FrB] }), + ]), + ("mtibatu", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0003a6, args: &[Field::SprBAT, Field::RS] }), + ]), + ("bgtlrl+", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("bclr+", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::BO, Field::BI, Field::BH] }), + ]), + ("subfze.", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c000190, args: &[Field::RD, Field::RA] }), + ]), + ("lfdx", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0004ae, args: &[Field::FrD, Field::RA, Field::RB] }), + ]), + ("ps_mr", &[ + None, + None, + Some(OpcodeInfo { code: 0x10000090, args: &[Field::FrD, Field::FrB] }), + ]), + ("bdzfa-", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("bnsctrl+", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("mfmsr", &[None, Some(OpcodeInfo { code: 0x7c0000a6, args: &[Field::RD] })]), + ("bcla-", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BO, Field::BI, Field::BD] }), + ]), + ("bdnzlr+", &[Some(OpcodeInfo { code: 0x4c000020, args: &[] })]), + ("bdzfl+", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("addc", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000014, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("bdzlr", &[Some(OpcodeInfo { code: 0x4c000020, args: &[] })]), + ("li", &[ + None, + None, + Some(OpcodeInfo { code: 0x38000000, args: &[Field::RD, Field::Simm] }), + ]), + ("bsol-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bnsctrl", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("beqa", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("mtsrr1", &[None, Some(OpcodeInfo { code: 0x7c0003a6, args: &[Field::RS] })]), + ("fnmadds", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xec00003e, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("bne-", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("bcl+", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BO, Field::BI, Field::BD] }), + ]), + ("extsh", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c000734, args: &[Field::RA, Field::RS] }), + ]), + ("nand", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0003b8, args: &[Field::RA, Field::RS, Field::RB] }), + ]), + ("psq_lux", &[ + None, + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x1000004c, + args: &[Field::FrD, Field::RA, Field::RB, Field::PsWX, Field::PsIX], + }), + ]), + ("mftb", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0002e6, args: &[Field::RD, Field::Tbr] }), + ]), + ("fcmpo", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0xfc000040, args: &[Field::CrfD, Field::FrA, Field::FrB] }), + ]), + ("bgtlrl", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("bsoa", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("fmadds.", &[ + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xec00003a, + args: &[Field::FrD, Field::FrA, Field::FrC, Field::FrB], + }), + ]), + ("bgea", &[ + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BD] }), + Some(OpcodeInfo { code: 0x40000000, args: &[Field::CrfS, Field::BD] }), + ]), + ("psq_st", &[ + None, + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xf0000000, + args: &[Field::FrS, Field::PsOffset, Field::RA, Field::PsW, Field::PsI], + }), + ]), + ("addic", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x30000000, args: &[Field::RD, Field::RA, Field::Simm] }), + ]), + ("mtfsb1", &[None, Some(OpcodeInfo { code: 0xfc00004c, args: &[Field::CrbD] })]), + ("rlwnm.", &[ + None, + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x5c000000, + args: &[Field::RA, Field::RS, Field::RB, Field::MB, Field::ME], + }), + ]), + ("mulhw.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000096, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("mfspr", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0002a6, args: &[Field::RD, Field::Spr] }), + ]), + ("rlwinm.", &[ + None, + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0x54000000, + args: &[Field::RA, Field::RS, Field::SH, Field::MB, Field::ME], + }), + ]), + ("rotrwi.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x54000000, args: &[Field::RA, Field::RS, Field::SH] }), + ]), + ("blectr+", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("ps_cmpo1", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x100000c0, args: &[Field::CrfD, Field::FrA, Field::FrB] }), + ]), + ("stfsx", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c00052e, args: &[Field::FrS, Field::RA, Field::RB] }), + ]), + ("neg", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0000d0, args: &[Field::RD, Field::RA] }), + ]), + ("bdnzfla+", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("psq_l", &[ + None, + None, + None, + None, + None, + Some(OpcodeInfo { + code: 0xe0000000, + args: &[Field::FrD, Field::PsOffset, Field::RA, Field::PsW, Field::PsI], + }), + ]), + ("addme.", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0001d4, args: &[Field::RD, Field::RA] }), + ]), + ("bsolrl+", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("bdzt", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("fres.", &[ + None, + None, + Some(OpcodeInfo { code: 0xec000030, args: &[Field::FrD, Field::FrB] }), + ]), + ("bdzf+", &[ + None, + None, + Some(OpcodeInfo { code: 0x40000000, args: &[Field::BI, Field::BD] }), + ]), + ("subfo.", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000050, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("bltlrl+", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("stfdx", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c0005ae, args: &[Field::FrS, Field::RA, Field::RB] }), + ]), + ("nego.", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c0000d0, args: &[Field::RD, Field::RA] }), + ]), + ("bnslr", &[ + Some(OpcodeInfo { code: 0x4c000020, args: &[] }), + Some(OpcodeInfo { code: 0x4c000020, args: &[Field::CrfS] }), + ]), + ("bsoctrl", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("mtfsfi.", &[ + None, + None, + Some(OpcodeInfo { code: 0xfc00010c, args: &[Field::CrfD, Field::MtfsfIMM] }), + ]), + ("sthux", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c00036e, args: &[Field::RS, Field::RA, Field::RB] }), + ]), + ("lwarx", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000028, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("bltctr+", &[ + Some(OpcodeInfo { code: 0x4c000420, args: &[] }), + Some(OpcodeInfo { code: 0x4c000420, args: &[Field::CrfS] }), + ]), + ("divwuo", &[ + None, + None, + None, + Some(OpcodeInfo { code: 0x7c000396, args: &[Field::RD, Field::RA, Field::RB] }), + ]), + ("subfzeo", &[ + None, + None, + Some(OpcodeInfo { code: 0x7c000190, args: &[Field::RD, Field::RA] }), + ]), + ], +}; +fn opcode_from_str(str: &str) -> Option<&'static [Option]> { + OPCODES.get(str).map(|x| *x) +} diff --git a/asm/src/lib.rs b/asm/src/lib.rs new file mode 100644 index 0000000..91f601e --- /dev/null +++ b/asm/src/lib.rs @@ -0,0 +1,8 @@ +mod generated; + +pub mod prelude {} + +#[cfg(test)] +mod tests { + use super::*; +} diff --git a/genisa/Cargo.toml b/genisa/Cargo.toml index 625e8b8..bc19dfc 100644 --- a/genisa/Cargo.toml +++ b/genisa/Cargo.toml @@ -15,3 +15,7 @@ quote = "1.0" syn = "1.0" serde = { version = "1.0", features = ["derive"] } serde_yaml = "0.8" +phf = "0.11.1" +phf_codegen = "0.11.1" +pratt = "0.4.0" + diff --git a/genisa/src/asm.rs b/genisa/src/asm.rs new file mode 100644 index 0000000..977186a --- /dev/null +++ b/genisa/src/asm.rs @@ -0,0 +1,483 @@ +use std::{ + collections::{hash_map::Entry, HashMap}, + fs::File, + io::Write, + str::FromStr, +}; + +use pratt::{Affix, Associativity, PrattParser, Precedence, Result as PrattResult}; +use proc_macro2::{token_stream, Ident, Literal, Spacing, Span, TokenStream, TokenTree}; +use quote::{__private::ext::RepToTokensExt, quote, ToTokens}; +use syn::{parse::Parser, LitInt}; + +use crate::{load_isa, rustfmt, to_rust_variant, Field, Isa, Modifier, Opcode}; + +type Error = Box; +type Result = std::result::Result; + +macro_rules! token_stream { + ($stream:ident) => { + TokenStream::from_iter($stream.into_iter()) + }; +} + +pub(crate) fn asm_main() -> Result<()> { + let isa = load_isa()?; + + let mut unformatted_code = Vec::::new(); + writeln!(&mut unformatted_code, "{}", quote! { + use crate::prelude::*; + })?; + writeln!(&mut unformatted_code, "{}", gen_fields(&isa)?)?; + writeln!(&mut unformatted_code, "{}", gen_opcode_from_str(&isa)?)?; + + let formatted_code = rustfmt(unformatted_code); + File::create("./asm/src/generated.rs")?.write_all(&formatted_code)?; + + Ok(()) +} + +fn gen_apply_field(field: &Field) -> Result { + let mut val = quote! { value as u32 }; + + let val_shift = field.shift_left; + if field.shift_left > 0 { + val = quote!((#val >> #val_shift)); + } + + // https://graphics.stanford.edu/~seander/bithacks.html#VariableSignExtend + if field.signed { + // let mask2 = 1u32 << (self.bits.0.len() - 1); + // let mask2 = LitInt::new(&format!("0x{:x}", mask2), Span::call_site()); + // val = quote!((((#val ^ #mask2).wrapping_sub(#mask2)) as i32)) + } else { + // val = quote! { #val }; + } + + if field.split { + val = quote!((((#val & 0b11111_00000u32) >> 5u32) | ((#val & 0b00000_11111u32) << 5u32)) as u32); + } + + let mask = (1u32 << field.bits.0.len()) - 1; + if mask != 0xFFFF_FFFF { + let mask = LitInt::new(&format!("0x{:x}", mask), Span::call_site()); + val = quote!((#val & #mask)); + } + + let shift = 32 - field.bits.0.end; + if shift > 0 { + val = quote!((#val << #shift)); + } + + let ident = to_rust_variant(&field.name)?; + Ok(quote! { + Field::#ident => code | #val, + }) +} + +fn gen_fields(isa: &Isa) -> Result { + let fields = TokenStream::from_iter( + isa.fields + .iter() + .filter(|field| !field.bits.0.is_empty()) + .map(|field| -> Result { + let ident = to_rust_variant(field.name.as_str())?; + Ok(quote! { #ident, }) + }) + .try_collect::()?, + ); + let field_match = TokenStream::from_iter( + isa.fields + .iter() + .filter(|field| !field.bits.0.is_empty()) + .map(|field| gen_apply_field(field)) + .try_collect::()?, + ); + return Ok(quote! { + pub enum Field { + #fields + } + pub const fn apply_field(code: u32, field: Field, value: i32) -> u32 { + match field { + #field_match + } + } + }); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_parse_gpr() { + assert_eq!(parse_gpr("r0").unwrap(), (0, "")); + assert_eq!(parse_gpr("r31").unwrap(), (31, "")); + assert_eq!(parse_gpr("1234").unwrap(), (1234, "")); + } +} + +struct OpcodeInfo { + code: u32, + args: Vec, +} + +fn gen_opcode_from_str(isa: &Isa) -> Result { + let mut map_builder = phf_codegen::Map::::new(); + let mut opcode_map = HashMap::>>::new(); + for opcode in &isa.opcodes { + let mut modifiers = Vec::::with_capacity(opcode.modifiers.len()); + for modifier_name in &opcode.modifiers { + modifiers.push(match isa.modifiers.iter().find(|m| m.name == *modifier_name) { + Some(modifier) => modifier.clone(), + None => return Err(Error::from(format!("Modifier {} not found", modifier_name))), + }); + } + 'outer: for bits in 0..(1 << modifiers.len()) { + let mut suffix = String::new(); + let mut set_bits = 0u32; + for (idx, modifier) in modifiers.iter().enumerate() { + if bits & (1 << idx) != 0 { + if set_bits & (1 << modifier.bit) != 0 { + // Incompatible combination + continue 'outer; + } + set_bits |= 1 << modifier.bit; + suffix.push(modifier.suffix); + } + } + let name = format!("{}{}", opcode.name, suffix); + let info = OpcodeInfo { code: opcode.pattern, args: opcode.args.clone() }; + match opcode_map.entry(name) { + Entry::Occupied(mut entry) => { + let vec = entry.get_mut(); + if vec.len() < opcode.args.len() + 1 { + vec.resize_with(opcode.args.len() + 1, || None); + } + vec[opcode.args.len()] = Some(info); + } + Entry::Vacant(entry) => { + let mut vec = Vec::>::new(); + vec.resize_with(opcode.args.len() + 1, || None); + vec[opcode.args.len()] = Some(info); + entry.insert(vec); + } + } + // println!("Adding opcode {}", name); + // let quoted_name = format!("\"{}\"", name); + // map_builder.entry(name, quoted_name.as_str()); + } + } + for mnemonic in &isa.mnemonics { + let opcode = isa.opcodes.iter().find(|o| o.name == mnemonic.opcode).ok_or_else(|| { + Error::from(format!("Opcode {} not found for {}", mnemonic.opcode, mnemonic.name)) + })?; + let modifier_names = mnemonic.modifiers.as_ref().unwrap_or(&opcode.modifiers); + let mut modifiers = Vec::::with_capacity(modifier_names.len()); + for modifier_name in modifier_names { + modifiers.push(match isa.modifiers.iter().find(|m| m.name == *modifier_name) { + Some(modifier) => modifier.clone(), + None => return Err(Error::from(format!("Modifier {} not found", modifier_name))), + }); + } + 'outer: for bits in 0..(1 << modifiers.len()) { + let mut suffix = String::new(); + let mut set_bits = 0u32; + for (idx, modifier) in modifiers.iter().enumerate() { + if bits & (1 << idx) != 0 { + if set_bits & (1 << modifier.bit) != 0 { + // Incompatible combination + continue 'outer; + } + set_bits |= 1 << modifier.bit; + suffix.push(modifier.suffix); + } + } + let name = format!("{}{}", mnemonic.name, suffix); + let mut code = opcode.pattern; + { + let tokens: TokenStream = mnemonic.condition.parse()?; + let mut iter = tokens.into_iter(); + let mut vec = Vec::::new(); + loop { + match parse_token(&mut iter) { + Some(token) => vec.push(token), + None => break, + } + } + let expr = ExprParser.parse(vec.into_iter()).unwrap(); + match apply_expr(code, expr, isa)? { + ExprResult::Int(out) => { + code = out; + } + _ => unreachable!(), + } + } + // for arg in mnemonic.args { + // code = apply_field(code, ) + // } + let info = OpcodeInfo { code, args: mnemonic.args.clone() }; + match opcode_map.entry(name) { + Entry::Occupied(mut entry) => { + let vec = entry.get_mut(); + if vec.len() < mnemonic.args.len() + 1 { + vec.resize_with(mnemonic.args.len() + 1, || None); + } + vec[mnemonic.args.len()] = Some(info); + } + Entry::Vacant(entry) => { + let mut vec = Vec::>::new(); + vec.resize_with(mnemonic.args.len() + 1, || None); + vec[mnemonic.args.len()] = Some(info); + entry.insert(vec); + } + } + // println!("Adding mnemonic {}", name); + // let quoted_name = format!("\"{}\"", name); + // map_builder.entry(name, quoted_name.as_str()); + } + } + for (name, infos) in opcode_map { + let opcodes = TokenStream::from_iter(infos.iter().map(|info| { + if let Some(info) = info { + let code = LitInt::new(&format!("0x{:x}", info.code), Span::call_site()); + let args = TokenStream::from_iter(info.args.iter().map(|arg| { + let arg_s = arg.split_once('=').map(|(first, _)| first).unwrap_or(arg); + let ident = to_rust_variant(arg_s).unwrap(); + quote! { Field::#ident, } + })); + quote! { + Some(OpcodeInfo { + code: #code, + args: &[ #args ], + }), + } + } else { + quote! { None, } + } + })); + map_builder.entry(name, quote! { &[#opcodes] }.to_string().as_str()); + } + let map: TokenStream = map_builder.build().to_string().parse()?; + return Ok(quote! { + struct OpcodeInfo { + code: u32, + args: &'static [Field], + } + static OPCODES: phf::Map<&'static str, &'static [Option]> = #map; + fn opcode_from_str(str: &str) -> Option<&'static [Option]> { + OPCODES.get(str).map(|x| *x) + } + }); +} + +fn apply_field(code: u32, field: &Field, value: i32) -> u32 { + let mut val = value as u32; + + let val_shift = field.shift_left; + if field.shift_left > 0 { + val = val >> val_shift; + } + + // https://graphics.stanford.edu/~seander/bithacks.html#VariableSignExtend + if field.signed { + // let mask2 = 1u32 << (self.bits.0.len() - 1); + // let mask2 = LitInt::new(&format!("0x{:x}", mask2), Span::call_site()); + // val = quote!((((#val ^ #mask2).wrapping_sub(#mask2)) as i32)) + } else { + // val = quote! { #val }; + } + + if field.split { + val = (((val & 0b11111_00000u32) >> 5u32) | ((val & 0b00000_11111u32) << 5u32)) as u32; + } + + let mask = (1u32 << field.bits.0.len()) - 1; + if mask != 0xFFFF_FFFF { + val = val & mask; + } + + let shift = 32 - field.bits.0.end; + if shift > 0 { + val = val << shift; + } + + code | val +} + +#[derive(Debug, PartialEq)] +enum Operator { + BitAnd, + LogicalAnd, + Equal, +} + +#[derive(Debug)] +enum ParsedToken { + Ident(Ident), + Group(Vec), + Literal(Literal), + Operator(Operator), +} + +#[derive(Debug)] +pub enum Expr { + BinOp(Box, BinOpKind, Box), + // UnOp(UnOpKind, Box), + Literal(Literal), + Ident(Ident), +} + +#[derive(Debug)] +pub enum BinOpKind { + // & + BitAnd, + // && + LogicalAnd, + // == + Eq, +} + +#[derive(Debug)] +pub enum UnOp {} + +fn parse_token(iter: &mut token_stream::IntoIter) -> Option { + match iter.next() { + Some(TokenTree::Group(group)) => { + let mut iter = group.stream().into_iter(); + let mut vec = Vec::::new(); + loop { + match parse_token(&mut iter) { + Some(token) => vec.push(token), + None => break, + } + } + Some(ParsedToken::Group(vec)) + } + Some(TokenTree::Punct(mut punct)) => { + let mut str = String::new(); + str.push(punct.as_char()); + while punct.spacing() == Spacing::Joint { + match iter.next() { + Some(TokenTree::Punct(new_punct)) => { + punct = new_punct; + } + token => panic!("unexpected token {:?}", token), + } + str.push(punct.as_char()); + } + Some(ParsedToken::Operator(match str.as_str() { + "&" => Operator::BitAnd, + "&&" => Operator::LogicalAnd, + "==" => Operator::Equal, + op => todo!("operator {}", op), + })) + } + Some(TokenTree::Ident(ident)) => Some(ParsedToken::Ident(ident)), + Some(TokenTree::Literal(literal)) => Some(ParsedToken::Literal(literal)), + None => None, + } +} + +struct ExprParser; + +impl PrattParser for ExprParser +where I: Iterator +{ + type Error = pratt::NoError; + type Input = ParsedToken; + type Output = Expr; + + fn query(&mut self, tree: &ParsedToken) -> PrattResult { + let affix = match tree { + ParsedToken::Operator(Operator::BitAnd) => { + Affix::Infix(Precedence(3), Associativity::Left) + } + ParsedToken::Operator(Operator::Equal) => { + Affix::Infix(Precedence(2), Associativity::Left) + } + ParsedToken::Operator(Operator::LogicalAnd) => { + Affix::Infix(Precedence(1), Associativity::Left) + } + ParsedToken::Group(_) | ParsedToken::Literal(_) | ParsedToken::Ident(_) => { + Affix::Nilfix + } + }; + Ok(affix) + } + + // Construct a primary expression, e.g. a number + fn primary(&mut self, tree: ParsedToken) -> PrattResult { + let expr = match tree { + ParsedToken::Ident(num) => Expr::Ident(num), + ParsedToken::Literal(literal) => Expr::Literal(literal), + ParsedToken::Group(group) => self.parse(&mut group.into_iter()).unwrap(), + _ => unreachable!(), + }; + Ok(expr) + } + + // Construct a binary infix expression, e.g. 1+1 + fn infix(&mut self, lhs: Expr, tree: ParsedToken, rhs: Expr) -> PrattResult { + let op = match tree { + ParsedToken::Operator(Operator::BitAnd) => BinOpKind::BitAnd, + ParsedToken::Operator(Operator::LogicalAnd) => BinOpKind::LogicalAnd, + ParsedToken::Operator(Operator::Equal) => BinOpKind::Eq, + _ => unreachable!(), + }; + Ok(Expr::BinOp(Box::new(lhs), op, Box::new(rhs))) + } + + fn prefix(&mut self, _tree: ParsedToken, _rhs: Expr) -> PrattResult { unreachable!() } + + fn postfix(&mut self, _lhs: Expr, _tree: ParsedToken) -> PrattResult { unreachable!() } +} + +#[derive(Debug)] +enum ExprResult { + Int(u32), + Ident(String), +} + +fn apply_expr(mut code: u32, expr: Expr, isa: &Isa) -> Result { + match expr { + Expr::BinOp(lhs, kind, rhs) => match kind { + BinOpKind::BitAnd => match *lhs { + // ignoring rhs + Expr::Ident(ident) => Ok(ExprResult::Ident(ident.to_string())), + other => todo!("BitAnd {:?}", other), + }, + BinOpKind::LogicalAnd => { + code = match apply_expr(code, *lhs, isa)? { + ExprResult::Int(code) => code, + _ => unreachable!(), + }; + code = match apply_expr(code, *rhs, isa)? { + ExprResult::Int(code) => code, + _ => unreachable!(), + }; + Ok(ExprResult::Int(code)) + } + BinOpKind::Eq => { + let field_name = match apply_expr(code, *lhs, isa)? { + ExprResult::Ident(ident) => ident, + other => todo!("eq lhs {:?}", other), + }; + let field = isa + .fields + .iter() + .find(|field| field.name == field_name) + .ok_or_else(|| Error::from(format!("Field {} not found", field_name)))?; + let value = match apply_expr(code, *rhs, isa)? { + ExprResult::Int(value) => value, + // other => todo!("eq rhs {:?}", other), + _ => return Ok(ExprResult::Int(code)) + }; + code = apply_field(code, field, value as i32); + Ok(ExprResult::Int(code)) + } + }, + Expr::Literal(lit) => Ok(ExprResult::Int(LitInt::from(lit).base10_parse()?)), + Expr::Ident(id) => Ok(ExprResult::Ident(id.to_string())), + } +} diff --git a/genisa/src/main.rs b/genisa/src/main.rs index 6ca34cd..d7e9222 100644 --- a/genisa/src/main.rs +++ b/genisa/src/main.rs @@ -1,3 +1,7 @@ +#![feature(iterator_try_collect)] + +mod asm; + use std::collections::HashMap; use std::fs::File; use std::io::Write; @@ -10,6 +14,7 @@ use proc_macro2::{Group, Ident, Literal, Span, TokenStream, TokenTree}; use quote::quote; use serde::{Deserialize, Deserializer}; use syn::{LitChar, LitInt, LitStr}; +use crate::asm::asm_main; macro_rules! token_stream { ($stream:ident) => { @@ -22,6 +27,10 @@ fn main() { eprintln!("{}", err); std::process::exit(1); } + // if let Err(err) = asm_main() { + // eprintln!("{}", err); + // std::process::exit(1); + // } } type Error = Box; @@ -238,7 +247,7 @@ pub(crate) struct Mnemonic { condition: String, } -#[derive(Deserialize, Default)] +#[derive(Deserialize, Default, Clone)] #[serde(default)] pub(crate) struct Modifier { name: String, @@ -660,7 +669,7 @@ impl Isa { } /// Converts the given key into an identifier. -fn to_rust_ident(prefix: &str, key: &str) -> TokenTree { +pub(crate) fn to_rust_ident(prefix: &str, key: &str) -> TokenTree { TokenTree::Ident(Ident::new( &(prefix.to_owned() + &key.replace('.', "_")), Span::call_site(), @@ -668,7 +677,7 @@ fn to_rust_ident(prefix: &str, key: &str) -> TokenTree { } /// Converts the given key into an enum variant key. -fn to_rust_variant(key: &str) -> Result { +pub(crate) fn to_rust_variant(key: &str) -> Result { Ok(TokenTree::Ident(Ident::new( &to_rust_variant_str(key)?, Span::call_site(),