ppc750cl/isa.yaml

2339 lines
51 KiB
YAML

fields:
# Immediates
- name: "simm"
arg: "Simm"
bits: "16..32"
signed: true
- name: "uimm"
arg: "Uimm"
bits: "16..32"
- name: "offset"
arg: "Offset"
bits: "16..32"
signed: true
# Branch fields
- name: "BO"
arg: "OpaqueU"
bits: "6..11"
- name: "BI"
arg: "OpaqueU"
bits: "11..16"
- name: "BD"
arg: "BranchDest"
bits: "16..30"
shift_left: 2
- name: "LI"
arg: "BranchDest"
bits: "6..30"
shift_left: 2
# Shift/rotate type fields
- name: "SH"
arg: "OpaqueU"
desc: "Shift"
bits: "16..21"
- name: "MB"
arg: "OpaqueU"
desc: "Mask start"
bits: "21..26"
- name: "ME"
arg: "OpaqueU"
desc: "Mask stop"
bits: "26..31"
# Registers
- name: "rS"
arg: "GPR"
bits: "6..11"
- name: "rD"
arg: "GPR"
bits: "6..11"
- name: "rA"
arg: "GPR"
bits: "11..16"
- name: "rA.nz"
arg: "GPR"
bits: "11..16"
- name: "rB"
arg: "GPR"
bits: "16..21"
- name: "rC"
arg: "GPR"
bits: "21..26"
- name: "sr"
arg: "SR"
bits: "12..16"
- name: "spr"
arg: "SPR"
bits: "11..21"
split: true
# Floating-point registers
- name: "frS"
arg: "FPR"
bits: "6..11"
- name: "frD"
arg: "FPR"
bits: "6..11"
- name: "frA"
arg: "FPR"
bits: "11..16"
- name: "frB"
arg: "FPR"
bits: "16..21"
- name: "frC"
arg: "FPR"
bits: "21..26"
# Condition registers
# TODO This looks swapped the wrong way around
- name: "crbD"
arg: "CRField"
bits: "6..11"
- name: "crbA"
arg: "CRField"
bits: "11..16"
- name: "crbB"
arg: "CRField"
bits: "16..21"
# Condition register fields
- name: "crfD"
arg: "CRBit"
bits: "6..9"
- name: "crfS"
arg: "CRBit"
bits: "11..14"
# Condition register misc
- name: "crm"
arg: "OpaqueU"
bits: "12..20"
# Paired single fields
- name: "ps_l"
arg: "GQR"
bits: "17..20"
- name: "ps_W"
arg: "OpaqueU"
bits: "16"
# Misc
- name: "NB"
arg: "OpaqueU"
bits: "16..21"
- name: "tbr"
arg: "OpaqueU"
desc: "Time Base"
bits: "11..21"
split: true
- name: "mtfsf_FM"
arg: "OpaqueU"
desc: "Field Mask for mtfsf"
bits: "7..15"
- name: "mtfsf_IMM"
arg: "OpaqueU"
desc: "Immediate for mtfsfi"
bits: "16..20"
- name: "tw_TO"
arg: "OpaqueU"
desc: "Bitset for tw and twi"
bits: "6..11"
- name: "xer"
- name: "ctr"
- name: "lr"
# TODO Add defs/uses for modifiers.
modifiers:
- name: "OE"
suffix: "o"
- name: "Rc"
suffix: "."
- name: "LK"
suffix: "l"
- name: "AA"
suffix: "a"
opcodes:
- name: "add"
desc: "Add"
bitmask: 0xfc0007fe
pattern: 0x7c000214
modifiers: [ "OE", "Rc" ]
args: [ "rD", "rA", "rB" ]
defs: [ "rD" ]
uses: [ "rA", "rB" ]
- name: "addc"
desc: "Add Carrying"
bitmask: 0xfc0007fe
pattern: 0x7c000014
modifiers: [ "OE", "Rc" ]
args: [ "rD", "rA", "rB" ]
defs: [ "rD" ]
uses: [ "rA", "rB" ]
- name: "adde"
desc: "Add Extended"
bitmask: 0xfc0007fe
pattern: 0x7c000114
modifiers: [ "OE", "Rc" ]
args: [ "rD", "rA", "rB" ]
defs: [ "rD" ]
uses: [ "rA", "rB" ]
- name: "addi"
desc: "Add Immediate"
bitmask: 0xfc000000
pattern: 0x38000000
args: [ "rD", "rA", "simm" ]
defs: [ "rD" ]
uses: [ "rA.nz" ]
- name: "addic"
desc: "Add Immediate Carrying"
bitmask: 0xfc000000
pattern: 0x30000000
args: [ "rD", "rA", "simm" ]
defs: [ "rD" ]
uses: [ "rA" ]
- name: "addic."
desc: "Add Immediate Carrying and Record"
bitmask: 0xfc000000
pattern: 0x34000000
args: [ "rD", "rA", "simm" ]
side_effects: [ "Rc" ]
defs: [ "rD" ]
uses: [ "rA" ]
- name: "addis"
desc: "Add Immediate Shifted"
bitmask: 0xfc000000
pattern: 0x3c000000
args: [ "rD", "rA", "uimm" ]
defs: [ "rD" ]
uses: [ "rA.nz" ]
- name: "addme"
desc: "Add to Minus One Extended"
bitmask: 0xfc00fbfe
pattern: 0x7c0001d4
modifiers: [ "OE", "Rc" ]
args: [ "rD", "rA" ]
defs: [ "rD" ]
uses: [ "rA" ]
- name: "addze"
desc: "Add to Zero Extended"
bitmask: 0xfc00fbfe
pattern: 0x7c000194
modifiers: [ "OE", "Rc" ]
args: [ "rD", "rA" ]
defs: [ "rD" ]
uses: [ "rA" ]
- name: "and"
desc: "AND"
bitmask: 0xfc0007fe
pattern: 0x7c000038
modifiers: [ "Rc" ]
args: [ "rA", "rS", "rB" ]
defs: [ "rA" ]
uses: [ "rS", "rB" ]
- name: "andc"
desc: "AND with Complement"
bitmask: 0xfc0007fe
pattern: 0x7c000078
modifiers: [ "Rc" ]
args: [ "rA", "rS", "rB" ]
defs: [ "rA" ]
uses: [ "rS", "rB" ]
- name: "andi."
desc: "AND Immediate"
bitmask: 0xfc000000
pattern: 0x70000000
side_effects: [ "Rc" ]
args: [ "rA", "rS", "uimm" ]
defs: [ "rA" ]
uses: [ "rB" ]
- name: "andis."
desc: "AND Immediate Shifted"
bitmask: 0xfc000000
pattern: 0x74000000
side_effects: [ "Rc" ]
args: [ "rA", "rS", "uimm" ]
defs: [ "rA" ]
uses: [ "rB" ]
- name: "b"
desc: "Branch"
bitmask: 0xfc000000
pattern: 0x48000000
modifiers: [ "AA", "LK" ]
args: [ "LI" ]
- name: "bc"
desc: "Branch Conditional"
bitmask: 0xfc000000
pattern: 0x40000000
modifiers: [ "AA", "LK" ]
args: [ "BO", "BI", "BD" ]
- name: "bcctr"
desc: "Branch Conditional to Count Register"
bitmask: 0xfc00ffff
pattern: 0x4c000210
modifiers: [ "LK" ]
args: [ "BO", "BI" ]
uses: [ "ctr" ]
- name: "bclr"
desc: "Branch Conditional to Link Register"
bitmask: 0xfc00fffe
pattern: 0x4c000020
modifiers: [ "LK" ]
args: [ "BO", "BI" ]
uses: [ "lr" ]
- name: "cmp"
desc: "Compare"
bitmask: 0xfc4007ff
pattern: 0x7c000000
args: [ "crfD", "rA", "rB" ]
defs: [ "crfD" ]
uses: [ "rA", "rB" ]
- name: "cmpi"
desc: "Compare Immediate"
bitmask: 0xfc400000
pattern: 0x2c000000
args: [ "crfD", "rA", "simm" ]
defs: [ "crfD" ]
uses: [ "rA" ]
- name: "cmpl"
desc: "Compare Logical"
bitmask: 0xfc4007ff
pattern: 0x7c000040
args: [ "crfD", "rA", "rB" ]
defs: [ "crfD" ]
uses: [ "rA", "rB" ]
- name: "cmpli"
desc: "Compare Logical Immediate"
bitmask: 0xfc400000
pattern: 0x28000000
args: [ "crfD", "rA", "uimm" ]
defs: [ "crfD" ]
uses: [ "rA" ]
- name: "cntlzw"
desc: "Count Leading Zeros Word"
bitmask: 0xfc00fffe
pattern: 0x7c000034
modifiers: [ "Rc" ]
args: [ "rA", "rS" ]
defs: [ "rA" ]
uses: [ "rS" ]
- name: "crand"
desc: "Condition Register AND"
bitmask: 0xfc0007ff
pattern: 0x4c000202
args: [ "crbD", "crbA", "crbB" ]
defs: [ "crbD" ]
uses: [ "crbA", "crbB" ]
- name: "crandc"
desc: "Condition Register AND with Complement"
bitmask: 0xfc0007ff
pattern: 0x4c000102
args: [ "crbD", "crbA", "crbB" ]
defs: [ "crbD" ]
uses: [ "crbA", "crbB" ]
- name: "creqv"
desc: "Condition Register Equivalent"
bitmask: 0xfc0007ff
pattern: 0x4c000242
args: [ "crbD", "crbA", "crbB" ]
defs: [ "crbD" ]
uses: [ "crbA", "crbB" ]
- name: "crnand"
desc: "Condition Register NAND"
bitmask: 0xfc0007ff
pattern: 0x4c0001c2
args: [ "crbD", "crbA", "crbB" ]
defs: [ "crbD" ]
uses: [ "crbA", "crbB" ]
- name: "crnor"
desc: "Condition Register NOR"
bitmask: 0xfc0007ff
pattern: 0x4c000042
args: [ "crbD", "crbA", "crbB" ]
defs: [ "crbD" ]
uses: [ "crbA", "crbB" ]
- name: "cror"
desc: "Condition Register OR"
bitmask: 0xfc0007ff
pattern: 0x4c000382
args: [ "crbD", "crbA", "crbB" ]
defs: [ "crbD" ]
uses: [ "crbA", "crbB" ]
- name: "crorc"
desc: "Condition Register OR with Complement"
bitmask: 0xfc0007ff
pattern: 0x4c000342
args: [ "crbD", "crbA", "crbB" ]
defs: [ "crbD" ]
uses: [ "crbA", "crbB" ]
- name: "crxor"
desc: "Condition Register XOR"
bitmask: 0xfc0007ff
pattern: 0x4c000182
args: [ "crbD", "crbA", "crbB" ]
defs: [ "crbD" ]
uses: [ "crbA", "crbB" ]
- name: "dcbf"
desc: "Data Cache Block Flush"
bitmask: 0xffe007ff
pattern: 0x7c0000ac
args: [ "rA", "rB" ]
uses: [ "rA.nz", "rB" ]
- name: "dcbi"
desc: "Data Cache Block Invalidate"
bitmask: 0xffe007ff
pattern: 0x7c0003ac
args: [ "rA", "rB" ]
uses: [ "rA.nz", "rB" ]
- name: "dcbst"
desc: "Data Cache Block Store"
bitmask: 0xffe007ff
pattern: 0x7c00006c
args: [ "rA", "rB" ]
uses: [ "rA.nz", "rB" ]
- name: "dcbt"
desc: "Data Cache Block Touch"
bitmask: 0xffe007ff
pattern: 0x7c00022c
args: [ "rA", "rB" ]
uses: [ "rA.nz", "rB" ]
- name: "dcbtst"
desc: "Data Cache Block Touch for Store"
bitmask: 0xffe007ff
pattern: 0x7c0001ec
args: [ "rA", "rB" ]
uses: [ "rA.nz", "rB" ]
- name: "dcbz"
desc: "Data Cache Block Clear to Zero"
bitmask: 0xffe007ff
pattern: 0x7c0007ec
args: [ "rA", "rB" ]
uses: [ "rA.nz", "rB" ]
- name: "dcbz_l"
desc: "Data Cache Block Set to Zero Locked"
bitmask: 0xffe007ff
pattern: 0x100007ec
args: [ "rA", "rB" ]
uses: [ "rA.nz", "rB" ]
- name: "divw"
desc: "Divide Word"
bitmask: 0xfc0003fe
pattern: 0x7c0003d6
modifiers: [ "OE", "Rc" ]
args: [ "rD", "rA", "rB" ]
defs: [ "rD" ]
uses: [ "rA", "rB" ]
- name: "divwu"
desc: "Divide Word Unsigned"
bitmask: 0xfc0003fe
pattern: 0x7c000396
modifiers: [ "OE", "Rc" ]
args: [ "rD", "rA", "rB" ]
defs: [ "rD" ]
uses: [ "rA", "rB" ]
- name: "eciwx"
desc: "External Control In Word Indexed"
bitmask: 0xfc0003ff
pattern: 0x7c00026c
args: [ "rD", "rA", "rB" ]
defs: [ "rD" ]
uses: [ "rA.nz", "rB" ]
- name: "ecowx"
desc: "External Control Out Word Indexed"
bitmask: 0xfc0003ff
pattern: 0x7c00036c
args: [ "rS", "rA", "rB" ]
uses: [ "rS", "rA.nz", "rB" ]
- name: "eieio"
desc: "Enforce In-Order Execution of I/O"
bitmask: 0xffffffff
pattern: 0x7c0006ac
- name: "eqv"
desc: "Equivalent"
bitmask: 0xfc0003fe
pattern: 0x7c000238
modifiers: [ "Rc" ]
args: [ "rA", "rS", "rB" ]
defs: [ "rA" ]
uses: [ "rS", "rB" ]
- name: "extsb"
desc: "Extend Sign Byte"
bitmask: 0xfc00fffe
pattern: 0x7c000774
modifiers: [ "Rc" ]
args: [ "rA", "rS" ]
defs: [ "rA" ]
uses: [ "rS" ]
- name: "extsh"
desc: "Extend Sign Half Word"
bitmask: 0xfc00fffe
pattern: 0x7c000734
modifiers: [ "Rc" ]
args: [ "rA", "rS" ]
defs: [ "rA" ]
uses: [ "rS" ]
- name: "fabs"
desc: "Floating Absolute Value"
bitmask: 0xfc1f07fe
pattern: 0xfc000210
modifiers: [ "Rc" ]
args: [ "frD", "frB" ]
defs: [ "frD" ]
uses: [ "frB" ]
- name: "fadd"
desc: "Floating Add (Double-Precision)"
bitmask: 0xfc0007fe
pattern: 0xfc00002a
modifiers: [ "Rc" ]
args: [ "frD", "frA", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frB" ]
- name: "fadds"
desc: "Floating Add (Single-Precision)"
bitmask: 0xfc0007fe
pattern: 0xec00002a
modifiers: [ "Rc" ]
args: [ "frD", "frA", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frB" ]
- name: "fcmpo"
desc: "Floating Compare Ordered"
bitmask: 0xfc6007ff
pattern: 0xfc000040
args: [ "crfD", "frA", "frB" ]
defs: [ "crfD" ]
uses: [ "frA", "frB" ]
- name: "fcmpu"
desc: "Floating Compare Unordered"
bitmask: 0xfc6007ff
pattern: 0xfc000000
args: [ "crfD", "frA", "frB" ]
defs: [ "crfD" ]
uses: [ "frA", "frB" ]
- name: "fctiw"
desc: "Floating Convert to Integer Word"
bitmask: 0xfc1f07fe
pattern: 0xfc00001c
modifiers: [ "Rc" ]
args: [ "frD", "frB" ]
defs: [ "frD" ]
uses: [ "frB" ]
- name: "fctiwz"
desc: "Floating Convert to Integer Word with Round toward Zero"
bitmask: 0xfc1f07fe
pattern: 0xfc00001e
modifiers: [ "Rc" ]
args: [ "frD", "frB" ]
defs: [ "frD" ]
uses: [ "frB" ]
- name: "fdiv"
desc: "Floating Divide (Double-Precision)"
bitmask: 0xfc0007fe
pattern: 0xfc000024
modifiers: [ "Rc" ]
args: [ "frD", "frA", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frB" ]
- name: "fdivs"
desc: "Floating Divide (Single-Precision)"
bitmask: 0xfc0007fe
pattern: 0xec000024
modifiers: [ "Rc" ]
args: [ "frD", "frA", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frB" ]
- name: "fmadd"
desc: "Floating Multiply-Add (Double-Precision)"
bitmask: 0xfc00003e
pattern: 0xfc00003a
modifiers: [ "Rc" ]
args: [ "frD", "frA", "frC", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frC", "frB" ]
- name: "fmadds"
desc: "Floating Multiply-Add (Single-Precision)"
bitmask: 0xfc00003e
pattern: 0xec00003a
modifiers: [ "Rc" ]
args: [ "frD", "frA", "frC", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frC", "frB" ]
- name: "fmr"
desc: "Floating Move Register (Double-Precision)"
bitmask: 0xfc1f07fe
pattern: 0xfc000090
modifiers: [ "Rc" ]
args: [ "frD", "frB" ]
defs: [ "frD" ]
uses: [ "frB" ]
- name: "fmsub"
desc: "Floating Multiply-Subtract (Double-Precision)"
bitmask: 0xfc00003e
pattern: 0xfc000038
modifiers: [ "Rc" ]
args: [ "frD", "frA", "frC", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frC", "frB" ]
- name: "fmsubs"
desc: "Floating Multiply-Subtract (Single-Precision)"
bitmask: 0xfc00003e
pattern: 0xec000038
modifiers: [ "Rc" ]
args: [ "frD", "frA", "frC", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frC", "frB" ]
- name: "fmul"
desc: "Floating Multiply (Double-Precision)"
bitmask: 0xfc00f83e
pattern: 0xfc000032
modifiers: [ "Rc" ]
args: [ "frD", "frA", "frC" ]
defs: [ "frD" ]
uses: [ "frA", "frC" ]
- name: "fmuls"
desc: "Floating Multiply (Single-Precision)"
bitmask: 0xfc00f83e
pattern: 0xec000032
modifiers: [ "Rc" ]
args: [ "frD", "frA", "frC" ]
defs: [ "frD" ]
uses: [ "frA", "frC" ]
- name: "fnabs"
desc: "Floating Negative Absolute Value"
bitmask: 0xfc1f07fe
pattern: 0xfc000110
modifiers: [ "Rc" ]
args: [ "frD", "frB" ]
defs: [ "frD" ]
uses: [ "frB" ]
- name: "fneg"
desc: "Floating Negate"
bitmask: 0xfc1f07fe
pattern: 0xfc000050
modifiers: [ "Rc" ]
args: [ "frD", "frB" ]
defs: [ "frD" ]
uses: [ "frB" ]
- name: "fnmadd"
desc: "Floating Negative Multiply-Add (Double-Precision)"
bitmask: 0xfc00003e
pattern: 0xfc00003e
modifiers: [ "Rc" ]
args: [ "frD", "frA", "frC", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frC", "frB" ]
- name: "fnmadds"
desc: "Floating Negative Multiply-Add (Single-Precision)"
bitmask: 0xfc00003e
pattern: 0xec00003e
modifiers: [ "Rc" ]
args: [ "frD", "frA", "frC", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frC", "frB" ]
- name: "fnmsub"
desc: "Floating Negative Multiply-Subtract (Double-Precision)"
bitmask: 0xfc00003e
pattern: 0xfc00003c
modifiers: [ "Rc" ]
args: [ "frD", "frA", "frC", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frC", "frB" ]
- name: "fnmsubs"
desc: "Floating Negative Multiply-Subtract (Single-Precision)"
bitmask: 0xfc00003e
pattern: 0xec00003c
modifiers: [ "Rc" ]
args: [ "frD", "frA", "frC", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frC", "frB" ]
- name: "fres"
desc: "Floating Reciprocal Estimate Single"
bitmask: 0xfc1f07fe
pattern: 0xec000030
modifiers: [ "Rc" ]
args: [ "frD", "frB" ]
defs: [ "frD" ]
uses: [ "frB" ]
- name: "frsp"
desc: "Floating Round to Single"
bitmask: 0xfc1f07fe
pattern: 0xfc000018
modifiers: [ "Rc" ]
args: [ "frD", "frB" ]
defs: [ "frD" ]
uses: [ "frB" ]
- name: "frsqrte"
desc: "Floating Reciprocal Square Root Estimate"
bitmask: 0xfc1f07fe
pattern: 0xfc000034
modifiers: [ "Rc" ]
args: [ "frD", "frB" ]
defs: [ "frD" ]
uses: [ "frB" ]
- name: "fsel"
desc: "Floating Select"
bitmask: 0xfc00003e
pattern: 0xfc00002e
modifiers: [ "Rc" ]
args: [ "frD", "frA", "frC", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frC", "frB" ]
- name: "fsub"
desc: "Floating Subtract (Double-Precision)"
bitmask: 0xfc0007fe
pattern: 0xfc000028
modifiers: [ "Rc" ]
args: [ "frD", "frA", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frB" ]
- name: "fsubs"
desc: "Floating Subtract (Single-Precision)"
bitmask: 0xfc0007fe
pattern: 0xec000028
modifiers: [ "Rc" ]
args: [ "frD", "frA", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frB" ]
- name: "icbi"
desc: "Instruction Cache Block Invalidate"
bitmask: 0xffe007ff
pattern: 0x7c0007ac
modifiers: [ "Rc" ]
args: [ "rA", "rB" ]
uses: [ "rA.nz", "rB" ]
- name: "isync"
desc: "Instruction Synchronize"
bitmask: 0xffffffff
pattern: 0x4c00012c
- name: "lbz"
desc: "Load Byte and Zero"
bitmask: 0xfc000000
pattern: 0x88000000
args: [ "rD", "offset", "rA" ]
defs: [ "rD" ]
uses: [ "offset", "rA.nz" ]
- name: "lbzu"
desc: "Load Byte and Zero with Update"
bitmask: 0xfc000000
pattern: 0x8c000000
args: [ "rD", "offset", "rA" ]
defs: [ "rD", "rA" ]
uses: [ "offset", "rA" ]
- name: "lbzux"
desc: "Load Byte and Zero with Update Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c0000ee
args: [ "rD", "rA", "rB" ]
defs: [ "rD", "rA" ]
uses: [ "rA", "rB" ]
- name: "lbzx"
desc: "Load Byte and Zero Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c0000ae
args: [ "rD", "rA", "rB" ]
defs: [ "rD" ]
uses: [ "rA.nz", "rB" ]
- name: "lfd"
desc: "Load Floating-Point Double"
bitmask: 0xfc000000
pattern: 0xc8000000
args: [ "frD", "offset", "rA" ]
defs: [ "frD" ]
uses: [ "offset", "rA.nz" ]
- name: "lfdu"
desc: "Load Floating-Point Double with Update"
bitmask: 0xfc000000
pattern: 0xcc000000
args: [ "frD", "offset", "rA" ]
defs: [ "frD", "rA" ]
uses: [ "offset", "rA" ]
- name: "lfdux"
desc: "Load Floating-Point Double with Update Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c0004ee
args: [ "frD", "rA", "rB" ]
defs: [ "frD", "rA" ]
uses: [ "rA", "rB" ]
- name: "lfdx"
desc: "Load Floating-Point Double Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c0004ae
args: [ "frD", "rA", "rB" ]
defs: [ "frD" ]
uses: [ "rA.nz", "rB" ]
- name: "lfs"
desc: "Load Floating-Point Single"
bitmask: 0xfc000000
pattern: 0xc0000000
args: [ "frD", "offset", "rA" ]
defs: [ "frD" ]
uses: [ "offset", "rA.nz" ]
- name: "lfsu"
desc: "Load Floating-Point Single with Update"
bitmask: 0xfc000000
pattern: 0xc4000000
args: [ "frD", "offset", "rA" ]
defs: [ "frD", "rA" ]
uses: [ "offset", "rA" ]
- name: "lfsux"
desc: "Load Floating-Point Single with Update Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c00046e
args: [ "frD", "rA", "rB" ]
defs: [ "frD", "rA" ]
uses: [ "rA", "rB" ]
- name: "lfsx"
desc: "Load Floating-Point Single Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c00042e
args: [ "frD", "rA", "rB" ]
defs: [ "frD" ]
uses: [ "rA.nz", "rB" ]
- name: "lha"
desc: "Load Half Word Algebraic"
bitmask: 0xfc000000
pattern: 0xa8000000
args: [ "rD", "offset", "rA" ]
defs: [ "rD" ]
uses: [ "offset", "rA.nz" ]
- name: "lhau"
desc: "Load Half Word Algebraic with Update"
bitmask: 0xfc000000
pattern: 0xac000000
args: [ "rD", "offset", "rA" ]
defs: [ "rD", "rA" ]
uses: [ "offset", "rA" ]
- name: "lhaux"
desc: "Load Half Word Algebraic with Update Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c0002ee
args: [ "rD", "rA", "rB" ]
defs: [ "rD", "rA" ]
uses: [ "rA", "rB" ]
- name: "lhax"
desc: "Load Half Word Algebraic Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c0002ae
args: [ "rD", "rA", "rB" ]
defs: [ "rD" ]
uses: [ "rA.nz", "rB" ]
- name: "lhbrx"
desc: "Load Half Word Byte-Reverse Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c00062c
args: [ "rD", "rA", "rB" ]
defs: [ "rD" ]
uses: [ "rA.nz", "rB" ]
- name: "lhz"
desc: "Load Half Word and Zero"
bitmask: 0xfc000000
pattern: 0xa0000000
args: [ "rD", "offset", "rA" ]
defs: [ "rD" ]
uses: [ "offset", "rA.nz" ]
- name: "lhzu"
desc: "Load Half Word and Zero with Update"
bitmask: 0xfc000000
pattern: 0xa4000000
args: [ "rD", "offset", "rA" ]
defs: [ "rD", "rA" ]
uses: [ "offset", "rA" ]
- name: "lhzux"
desc: "Load Half Word and Zero with Update Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c00026e
args: [ "rD", "rA", "rB" ]
defs: [ "rD", "rA" ]
uses: [ "rA", "rB" ]
- name: "lhzx"
desc: "Load Half Word and Zero Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c00022e
args: [ "rD", "rA", "rB" ]
defs: [ "rD" ]
uses: [ "rA.nz", "rB" ]
# TODO lmw has much more defs
- name: "lmw"
desc: "Load Multiple Word"
bitmask: 0xfc000000
pattern: 0xb8000000
args: [ "rD", "offset", "rA" ]
defs: [ "rD" ]
uses: [ "offset", "rA.nz" ]
- name: "lswi"
desc: "Load String Word Immediate"
bitmask: 0xfc0007ff
pattern: 0x7c0004aa
args: [ "rD", "rA", "NB" ]
defs: [ "rD" ]
uses: [ "rA.nz" ]
- name: "lswx"
desc: "Load String Word Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c00042a
args: [ "rD", "rA", "rB" ]
defs: [ "rD" ]
uses: [ "rA.nz", "rB" ]
- name: "lwarx"
desc: "Load String Word and Reverse Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c000028
args: [ "rD", "rA", "rB" ]
defs: [ "rD" ]
uses: [ "rA.nz", "rB" ]
- name: "lwbrx"
desc: "Load String Word and Byte-Reverse Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c00042c
args: [ "rD", "rA", "rB" ]
defs: [ "rD" ]
uses: [ "rA.nz", "rB" ]
- name: "lwz"
desc: "Load Word and Zero"
bitmask: 0xfc000000
pattern: 0x80000000
args: [ "rD", "offset", "rA" ]
defs: [ "rD" ]
uses: [ "offset", "rA.nz" ]
- name: "lwzu"
desc: "Load Word and Zero with Update"
bitmask: 0xfc000000
pattern: 0x84000000
args: [ "rD", "offset", "rA" ]
defs: [ "rD", "rA" ]
uses: [ "offset", "rA" ]
- name: "lwzux"
desc: "Load Word and Zero with Update Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c00006e
args: [ "rD", "rA", "rB" ]
defs: [ "rD", "rA" ]
uses: [ "rA", "rB" ]
- name: "lwzx"
desc: "Load Word and Zero Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c00002e
args: [ "rD", "rA", "rB" ]
defs: [ "rD" ]
uses: [ "rA.nz", "rB" ]
- name: "mcrf"
desc: "Move Condition Register Field"
bitmask: 0xfc300fff
pattern: 0x4c000000
args: [ "crfD", "crfS" ]
defs: [ "crfD" ]
uses: [ "crfS" ]
- name: "mcrfs"
desc: "Move to Condition Register from FPSCR"
bitmask: 0xfc30ffff
pattern: 0xfc000080
args: [ "crfD", "crfS" ]
defs: [ "crfD" ]
uses: [ "crfS" ]
- name: "mcrxr"
desc: "Move to Condition Register from XER"
bitmask: 0xfc30ffff
pattern: 0x7c000400
args: [ "crfD" ]
defs: [ "crfD", "xer" ]
- name: "mfcr"
desc: "Move from Condition Register"
bitmask: 0xfc1fffff
pattern: 0x7c000026
args: [ "crfD" ]
defs: [ "crfD" ]
- name: "mffs"
desc: "Move from FPSCR"
bitmask: 0xfc1ffffe
pattern: 0xfc00048e
modifier: [ "Rc" ]
args: [ "crfD" ]
defs: [ "crfD" ]
- name: "mfmsr"
desc: "Move from Machine State Register"
bitmask: 0xfc1fffff
pattern: 0x7c0000a6
args: [ "rD" ]
defs: [ "rD" ]
- name: "mfspr"
desc: "Move from Special-Purpose Register"
bitmask: 0xfc0007ff
pattern: 0x7c0002a6
args: [ "rD", "spr" ]
defs: [ "rD" ]
- name: "mfsr"
desc: "Move from Segment Register"
bitmask: 0xfc10ffff
pattern: 0x7c0004a6
args: [ "rD", "sr" ]
defs: [ "rD" ]
- name: "mfsrin"
desc: "Move from Segment Register Indirect"
bitmask: 0xfc1f07ff
pattern: 0x7c000526
args: [ "rD", "rB" ]
defs: [ "rD" ]
uses: [ "rB" ]
- name: "mftb"
desc: "Move from Time Base"
bitmask: 0xfc0007ff
pattern: 0x7c0002e6
args: [ "rD", "tbr" ]
defs: [ "rD" ]
- name: "mtcrf"
desc: "Move to Condition Register Fields"
bitmask: 0xfc100fff
pattern: 0x7c000120
args: [ "crm", "rS" ]
uses: [ "rS" ]
- name: "mtfsb0"
desc: "Move to FPSCR Bit 0"
bitmask: 0xfc1ffffe
pattern: 0xfc00008c
modifier: [ "Rc" ]
args: [ "crbD" ]
defs: [ "crbD" ]
- name: "mtfsb1"
desc: "Move to FPSCR Bit 1"
bitmask: 0xfc1ffffe
pattern: 0xfc00004c
modifier: [ "Rc" ]
args: [ "crbD" ]
defs: [ "crbD" ]
- name: "mtfsf"
desc: "Move to FPSCR Fields"
bitmask: 0xfe0107fe
pattern: 0xfc00058e
modifier: [ "Rc" ]
args: [ "mtfsf_FM", "frB" ]
uses: [ "frB" ]
- name: "mtfsfi"
desc: "Move to FPSCR Field Immediate"
bitmask: 0xfc7f0ffe
pattern: 0xfc00010c
modifier: [ "Rc" ]
args: [ "crfD", "mtfsf_IMM" ]
defs: [ "crfD" ]
- name: "mtmsr"
desc: "Move to Machine State Register"
bitmask: 0xfc1fffff
pattern: 0x7c000124
args: [ "rS" ]
uses: [ "rS" ]
- name: "mtspr"
desc: "Move to Special-Purpose Register"
bitmask: 0xfc0007ff
pattern: 0x7c0003a6
args: [ "spr", "rS" ]
uses: [ "rS" ]
- name: "mtsr"
desc: "Move to Segment Register"
bitmask: 0xfc10ffff
pattern: 0x7c0001a4
args: [ "sr", "rS" ]
uses: [ "rS" ]
- name: "mtsrin"
desc: "Move to Segment Register Indirect"
bitmask: 0xfc1f07ff
pattern: 0x7c0001e4
args: [ "rS", "rB" ]
uses: [ "rS", "rB" ]
- name: "mulhw"
desc: "Multiply High Word"
bitmask: 0xfc0007fe
pattern: 0x7c000096
modifier: [ "Rc" ]
args: [ "rD", "rA", "rB" ]
defs: [ "rD" ]
uses: [ "rA", "rB" ]
- name: "mulhwu"
desc: "Multiply High Word Unsigned"
bitmask: 0xfc0007fe
pattern: 0x7c000016
modifier: [ "Rc" ]
args: [ "rD", "rA", "rB" ]
defs: [ "rD" ]
uses: [ "rA", "rB" ]
- name: "mulli"
desc: "Multiply Low Immediate"
bitmask: 0xfc000000
pattern: 0x1c000000
modifier: [ "Rc" ]
args: [ "rD", "rA", "simm" ]
defs: [ "rD" ]
uses: [ "rA" ]
- name: "mullw"
desc: "Multiply Low Word"
bitmask: 0xfc0003fe
pattern: 0x7c0001d6
modifier: [ "OE", "Rc" ]
args: [ "rD", "rA", "rB" ]
defs: [ "rD" ]
uses: [ "rA", "rB" ]
- name: "nand"
desc: "NAND"
bitmask: 0xfc0007fe
pattern: 0x7c0003b8
modifier: [ "Rc" ]
args: [ "rA", "rS", "rB" ]
defs: [ "rA" ]
uses: [ "rS", "rB" ]
- name: "neg"
desc: "Negate"
bitmask: 0xfc00fffe
pattern: 0x7c0000d0
modifier: [ "OE", "Rc" ]
args: [ "rD", "rA" ]
defs: [ "rD" ]
uses: [ "rA" ]
- name: "nor"
desc: "NOR"
bitmask: 0xfc0007fe
pattern: 0x7c0000f8
modifier: [ "Rc" ]
args: [ "rA", "rS", "rB" ]
defs: [ "rA" ]
uses: [ "rS", "rB" ]
- name: "or"
desc: "OR"
bitmask: 0xfc0007fe
pattern: 0x7c000378
modifier: [ "Rc" ]
args: [ "rA", "rS", "rB" ]
defs: [ "rA" ]
uses: [ "rS", "rB" ]
- name: "orc"
desc: "OR with Complement"
bitmask: 0xfc0007fe
pattern: 0x7c000338
modifier: [ "Rc" ]
args: [ "rA", "rS", "rB" ]
defs: [ "rA" ]
uses: [ "rS", "rB" ]
- name: "ori"
desc: "OR Immediate"
bitmask: 0xfc000000
pattern: 0x60000000
args: [ "rA", "rS", "uimm" ]
defs: [ "rA" ]
uses: [ "rS" ]
- name: "oris"
desc: "OR Immediate Shifted"
bitmask: 0xfc000000
pattern: 0x64000000
args: [ "rA", "rS", "uimm" ]
defs: [ "rA" ]
uses: [ "rS" ]
- name: "psq_l"
desc: "Paired Single Quantized Load"
bitmask: 0xfc000000
pattern: 0xe0000000
args: [ "frD", "offset", "rA", "ps_W", "ps_l" ]
defs: [ "frD" ]
uses: [ "rA.nz" ]
- name: "psq_lu"
desc: "Paired Single Quantized Load with Update"
bitmask: 0xfc000000
pattern: 0xe4000000
args: [ "frD", "offset", "rA", "ps_W", "ps_l" ]
defs: [ "frD", "rA" ]
uses: [ "rA" ]
- name: "psq_lux"
desc: "Paired Single Quantized Load with Update Indexed"
bitmask: 0xfc00007f
pattern: 0x1000004c
args: [ "frD", "rA", "rB", "ps_W", "ps_l" ]
defs: [ "frD", "rA" ]
uses: [ "rA", "rB" ]
- name: "psq_lx"
desc: "Paired Single Quantized Load Indexed"
bitmask: 0xfc00007f
pattern: 0x1000000c
args: [ "frD", "rA", "rB", "ps_W", "ps_l" ]
defs: [ "frD" ]
uses: [ "rA.nz", "rB" ]
- name: "psq_st"
desc: "Paired Single Quantized Store"
bitmask: 0xfc000000
pattern: 0xf0000000
args: [ "frS", "offset", "rA", "ps_W", "ps_l" ]
uses: [ "frS", "rA.nz" ]
- name: "psq_stu"
desc: "Paired Single Quantized Store with Update"
bitmask: 0xfc000000
pattern: 0xf4000000
args: [ "frS", "offset", "rA", "ps_W", "ps_l" ]
defs: [ "rA" ]
uses: [ "frS", "rA" ]
- name: "psq_stux"
desc: "Paired Single Quantized Store with Update Indexed"
bitmask: 0xfc00007f
pattern: 0x1000004e
args: [ "frS", "rA", "rB", "ps_W", "ps_l" ]
defs: [ "rA" ]
uses: [ "frS", "rA", "rB" ]
- name: "psq_stx"
desc: "Paired Single Quantized Store Indexed"
bitmask: 0xfc00007f
pattern: 0x1000000e
args: [ "frS", "rA", "rB", "ps_W", "ps_l" ]
uses: [ "frS", "rA.nz", "rB" ]
- name: "ps_abs"
desc: "Paired Single Absolute Value"
bitmask: 0xfc1f07fe
pattern: 0x10000210
modifier: [ "Rc" ]
args: [ "frD", "frA", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frB" ]
- name: "ps_add"
desc: "Paired Single Add"
bitmask: 0xfc0007fe
pattern: 0x1000002a
modifier: [ "Rc" ]
args: [ "frD", "frA", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frB" ]
- name: "ps_cmpo0"
desc: "Paired Singles Compare Ordered High"
bitmask: 0xfc6007ff
pattern: 0x10000040
args: [ "crfD", "frA", "frB" ]
defs: [ "crfD" ]
uses: [ "frA.nz", "frB" ]
- name: "ps_cmpo1"
desc: "Paired Singles Compare Ordered Low"
bitmask: 0xfc6007ff
pattern: 0x100000c0
args: [ "crfD", "frA", "frB" ]
defs: [ "crfD" ]
uses: [ "frA.nz", "frB" ]
- name: "ps_cmpu0"
desc: "Paired Singles Compare Unordered High"
bitmask: 0xfc6007ff
pattern: 0x10000000
args: [ "crfD", "frA", "frB" ]
defs: [ "crfD" ]
uses: [ "frA.nz", "frB" ]
- name: "ps_cmpu1"
desc: "Paired Singles Compare Unordered Low"
bitmask: 0xfc6007ff
pattern: 0x10000080
args: [ "crfD", "frA", "frB" ]
defs: [ "crfD" ]
uses: [ "frA.nz", "frB" ]
- name: "ps_div"
desc: "Paired Single Divide"
bitmask: 0xfc0007fe
pattern: 0x10000024
modifier: [ "Rc" ]
args: [ "frD", "frA", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frB" ]
- name: "ps_madd"
desc: "Paired Single Multiply-Add"
bitmask: 0xfc00003e
pattern: 0x1000003a
modifier: [ "Rc" ]
args: [ "frD", "frA", "frC", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frC", "frB" ]
- name: "ps_madds0"
desc: "Paired Single Multiply-Add Scalar high"
bitmask: 0xfc00003e
pattern: 0x1000001c
modifier: [ "Rc" ]
args: [ "frD", "frA", "frC", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frC", "frB" ]
- name: "ps_madds1"
desc: "Paired Single Multiply-Add Scalar low"
bitmask: 0xfc00003e
pattern: 0x1000001e
modifier: [ "Rc" ]
args: [ "frD", "frA", "frC", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frC", "frB" ]
- name: "ps_merge00"
desc: "Paired Single MERGE high"
bitmask: 0xfc0007fe
pattern: 0x10000420
modifier: [ "Rc" ]
args: [ "frD", "frA", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frB" ]
- name: "ps_merge01"
desc: "Paired Single MERGE direct"
bitmask: 0xfc0007fe
pattern: 0x10000460
modifier: [ "Rc" ]
args: [ "frD", "frA", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frB" ]
- name: "ps_merge10"
desc: "Paired Single MERGE swapped"
bitmask: 0xfc0007fe
pattern: 0x100004a0
modifier: [ "Rc" ]
args: [ "frD", "frA", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frB" ]
- name: "ps_merge11"
desc: "Paired Single MERGE low"
bitmask: 0xfc0007fe
pattern: 0x100004e0
modifier: [ "Rc" ]
args: [ "frD", "frA", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frB" ]
- name: "ps_mr"
desc: "Paired Single Move Register"
bitmask: 0xfc1f07fe
pattern: 0x10000090
modifier: [ "Rc" ]
args: [ "frD", "frA", "frB" ]
defs: [ "frD" ]
uses: [ "frB" ]
- name: "ps_msub"
desc: "Paired Single Multiply-Subtract"
bitmask: 0xfc00003e
pattern: 0x10000038
modifier: [ "Rc" ]
args: [ "frD", "frA", "frC", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frC", "frB" ]
- name: "ps_mul"
desc: "Paired Single Multiply"
bitmask: 0xfc00f83e
pattern: 0x10000032
modifier: [ "Rc" ]
args: [ "frD", "frA", "frC" ]
defs: [ "frD" ]
uses: [ "frA", "frC" ]
- name: "ps_muls0"
desc: "Paired Single Multiply Scalar high"
bitmask: 0xfc00f83e
pattern: 0x10000018
modifier: [ "Rc" ]
args: [ "frD", "frA", "frC" ]
defs: [ "frD" ]
uses: [ "frA", "frC" ]
- name: "ps_muls1"
desc: "Paired Single Multiply Scalar low"
bitmask: 0xfc00f83e
pattern: 0x1000001a
modifier: [ "Rc" ]
args: [ "frD", "frA", "frC" ]
defs: [ "frD" ]
uses: [ "frA", "frC" ]
- name: "ps_nabs"
desc: "Paired Single Negative Absolute Value"
bitmask: 0xfc1f07fe
pattern: 0x10000110
modifier: [ "Rc" ]
args: [ "frD", "frB" ]
defs: [ "frD" ]
uses: [ "frB" ]
- name: "ps_neg"
desc: "Paired Single Negate"
bitmask: 0xfc1f07fe
pattern: 0x10000050
modifier: [ "Rc" ]
args: [ "frD", "frB" ]
defs: [ "frD" ]
uses: [ "frB" ]
- name: "ps_nmadd"
desc: "Paired Single Negative Multiply-Add"
bitmask: 0xfc00003e
pattern: 0x1000003e
modifier: [ "Rc" ]
args: [ "frD", "frA", "frC", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frC", "frB" ]
- name: "ps_nmsub"
desc: "Paired Single Negative Multiply-Subtract"
bitmask: 0xfc00003e
pattern: 0x1000003c
modifier: [ "Rc" ]
args: [ "frD", "frA", "frC", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frC", "frB" ]
- name: "ps_res"
desc: "Paired Single Reciprocal Estimate"
bitmask: 0xfc1f07fe
pattern: 0x10000030
modifier: [ "Rc" ]
args: [ "frD", "frB" ]
defs: [ "frD" ]
uses: [ "frB" ]
- name: "ps_rsqrte"
desc: "Paired Single Reciprocal Square Root Estimate"
bitmask: 0xfc1f07fe
pattern: 0x10000034
modifier: [ "Rc" ]
args: [ "frD", "frB" ]
defs: [ "frD" ]
uses: [ "frB" ]
- name: "ps_sel"
desc: "Paired Single Select"
bitmask: 0xfc00003e
pattern: 0x1000002e
modifier: [ "Rc" ]
args: [ "frD", "frA", "frC", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frC", "frB" ]
- name: "ps_sub"
desc: "Paired Single Subtract"
bitmask: 0xfc0007fe
pattern: 0x10000028
modifier: [ "Rc" ]
args: [ "frD", "frA", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frB" ]
- name: "ps_sum0"
desc: "Paired Single vector SUM high"
bitmask: 0xfc00003e
pattern: 0x10000014
modifier: [ "Rc" ]
args: [ "frD", "frA", "frC", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frC", "frB" ]
- name: "ps_sum1"
desc: "Paired Single vector SUM low"
bitmask: 0xfc00003e
pattern: 0x10000016
modifier: [ "Rc" ]
args: [ "frD", "frA", "frC", "frB" ]
defs: [ "frD" ]
uses: [ "frA", "frC", "frB" ]
- name: "rfi"
desc: "Return from Interrupt"
bitmask: 0xfffff801
pattern: 0x4c000000
- name: "rlwimi"
desc: "Rotate Left Word Immediate then Mask Insert"
bitmask: 0xfc000000
pattern: 0x50000000
modifier: [ "Rc" ]
args: [ "rA", "rS", "SH", "MB", "ME" ]
defs: [ "rA" ]
uses: [ "rA", "rS", "SH" ]
- name: "rlwinm"
desc: "Rotate Left Word Immediate then AND with Mask"
bitmask: 0xfc000000
pattern: 0x54000000
modifier: [ "Rc" ]
args: [ "rA", "rS", "SH", "MB", "ME" ]
defs: [ "rA" ]
uses: [ "rS", "SH" ]
- name: "rlwnm"
desc: "Rotate Left Word then AND with Mask"
bitmask: 0xfc000000
pattern: 0x5c000000
modifier: [ "Rc" ]
args: [ "rA", "rS", "rB", "MB", "ME" ]
defs: [ "rA" ]
uses: [ "rS", "rB" ]
- name: "sc"
desc: "System Call"
bitmask: 0xffffffff
pattern: 0x44000002
- name: "slw"
desc: "Shift Left Word"
bitmask: 0xfc0007fe
pattern: 0x7c000030
modifier: [ "Rc" ]
args: [ "rA", "rS", "rB" ]
defs: [ "rA" ]
uses: [ "rS", "rB" ]
- name: "sraw"
desc: "Shift Right Algebraic Word"
bitmask: 0xfc0007fe
pattern: 0x7c000630
modifier: [ "Rc" ]
args: [ "rA", "rS", "rB" ]
defs: [ "rA" ]
uses: [ "rS", "rB" ]
- name: "srawi"
desc: "Shift Right Algebraic Word Immediate"
bitmask: 0xfc0007fe
pattern: 0x7c000670
modifier: [ "Rc" ]
args: [ "rA", "rS", "SH" ]
defs: [ "rA" ]
uses: [ "rS" ]
- name: "srw"
desc: "Shift Right Word"
bitmask: 0xfc0007fe
pattern: 0x7c000430
modifier: [ "Rc" ]
args: [ "rS", "rA", "rB" ]
defs: [ "rA" ]
uses: [ "rA", "rB" ]
- name: "stb"
desc: "Store Byte"
bitmask: 0xfc000000
pattern: 0x98000000
args: [ "rS", "offset", "rA" ]
uses: [ "rS", "rA.nz" ]
- name: "stbu"
desc: "Store Byte with Update"
bitmask: 0xfc000000
pattern: 0x9c000000
args: [ "rS", "offset", "rA" ]
defs: [ "rA" ]
uses: [ "rS", "rA" ]
- name: "stbux"
desc: "Store Byte with Update Indexed"
bitmask: 0xfc0003ff
pattern: 0x7c0001ee
args: [ "rS", "rA", "rB" ]
defs: [ "rA" ]
uses: [ "rS", "rA", "rB" ]
- name: "stbx"
desc: "Store Byte Indexed"
bitmask: 0xfc0003ff
pattern: 0x7c0001ae
args: [ "rS", "rA", "rB" ]
uses: [ "rS", "rA.nz", "rB" ]
- name: "stfd"
desc: "Store Floating-Point Double"
bitmask: 0xfc000000
pattern: 0xd8000000
args: [ "rS", "offset", "rA" ]
uses: [ "rS", "rA.nz" ]
- name: "stfdu"
desc: "Store Floating-Point Double with Update"
bitmask: 0xfc000000
pattern: 0xdc000000
args: [ "rS", "offset", "rA" ]
defs: [ "rA" ]
uses: [ "rS", "rA" ]
- name: "stfdux"
desc: "Store Floating-Point Double with Update Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c0005ee
args: [ "frS", "rA", "rB" ]
defs: [ "rA" ]
uses: [ "frS", "rA", "rB" ]
- name: "stfdx"
desc: "Store Floating-Point Double Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c0005ae
args: [ "frS", "rA", "rB" ]
uses: [ "frS", "rA.nz", "rB" ]
- name: "stfiwx"
desc: "Store Floating-Point as Integer Word Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c0007ae
args: [ "frS", "rA", "rB" ]
uses: [ "frS", "rA.nz", "rB" ]
- name: "stfs"
desc: "Store Floating-Point Single"
bitmask: 0xfc000000
pattern: 0xd0000000
args: [ "rS", "offset", "rA" ]
uses: [ "rS", "rA.nz" ]
- name: "stfsu"
desc: "Store Floating-Point Single with Update"
bitmask: 0xfc000000
pattern: 0xd4000000
args: [ "rS", "offset", "rA" ]
defs: [ "rA" ]
uses: [ "rS", "rA" ]
- name: "stfsux"
desc: "Store Floating-Point Single with Update Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c00056e
args: [ "frS", "rA", "rB" ]
defs: [ "rA" ]
uses: [ "frS", "rA", "rB" ]
- name: "stfsx"
desc: "Store Floating-Point Single Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c00052e
args: [ "frS", "rA", "rB" ]
uses: [ "frS", "rA.nz", "rB" ]
- name: "sth"
desc: "Store Half Word"
bitmask: 0xfc000000
pattern: 0xb0000000
args: [ "rS", "offset", "rA" ]
uses: [ "rS", "rA.nz" ]
- name: "sthbrx"
desc: "Store Half Word Byte-Reverse Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c00072c
args: [ "rS", "rA", "rB" ]
uses: [ "rS", "rA.nz", "rB" ]
- name: "sthu"
desc: "Store Half Word with Update"
bitmask: 0xfc000000
pattern: 0xb4000000
args: [ "rS", "offset", "rA" ]
defs: [ "rA" ]
uses: [ "rS", "rA" ]
- name: "sthux"
desc: "Store Half Word with Update Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c00036e
args: [ "rS", "rA", "rB" ]
defs: [ "rA" ]
uses: [ "rS", "rA", "rB" ]
- name: "sthx"
desc: "Store Half Word Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c00032e
args: [ "rS", "rA", "rB" ]
uses: [ "rS", "rA.nz", "rB" ]
- name: "stmw"
desc: "Store Multiple Word"
bitmask: 0xfc000000
pattern: 0xbc000000
args: [ "rS", "offset", "rA" ]
uses: [ "rS", "rA.nz" ]
- name: "stswi"
desc: "Store String Word Immediate"
bitmask: 0xfc0007ff
pattern: 0x7c0005aa
args: [ "rS", "rA", "NB" ]
uses: [ "rS", "rA.nz" ]
- name: "stswx"
desc: "Store String Word Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c00052a
args: [ "rS", "rA", "rB" ]
uses: [ "rS", "rA.nz", "rB" ]
- name: "stw"
desc: "Store Word"
bitmask: 0xfc000000
pattern: 0x90000000
args: [ "rS", "offset", "rA" ]
uses: [ "rS", "rA.nz" ]
- name: "stwbrx"
desc: "Store Word Byte-Reverse Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c00052c
args: [ "rS", "rA", "rB" ]
uses: [ "rS", "rA.nz", "rB" ]
- name: "stwcx."
desc: "Store Word Conditional Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c00012d
args: [ "rS", "rA", "rB" ]
uses: [ "rS", "rA.nz", "rB" ]
- name: "stwu"
desc: "Store Word with Update"
bitmask: 0xfc000000
pattern: 0x94000000
args: [ "rS", "offset", "rA" ]
defs: [ "rA" ]
uses: [ "rS", "rA" ]
- name: "stwux"
desc: "Store Word Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c00016e
args: [ "rS", "rA", "rB" ]
defs: [ "rA" ]
uses: [ "rS", "rA", "rB" ]
- name: "stwx"
desc: "Store Word Indexed"
bitmask: 0xfc0007ff
pattern: 0x7c00012e
args: [ "rS", "rA", "rB" ]
uses: [ "rS", "rA.nz", "rB" ]
- name: "subf"
desc: "Subtract From Carrying"
bitmask: 0xfc0003fe
pattern: 0x7c000050
modifier: [ "OE", "Rc" ]
args: [ "rD", "rA", "rB" ]
defs: [ "rD" ]
uses: [ "rA", "rB" ]
- name: "subfc"
desc: "Subtract from Carrying"
bitmask: 0xfc0003fe
pattern: 0x7c000010
modifier: [ "OE", "Rc" ]
args: [ "rD", "rA", "rB" ]
defs: [ "rD" ]
uses: [ "rA", "rB" ]
- name: "subfe"
desc: "Subtract from Extended"
bitmask: 0xfc0003fe
pattern: 0x7c000110
modifier: [ "OE", "Rc" ]
args: [ "rD", "rA", "rB" ]
defs: [ "rD" ]
uses: [ "rA", "rB" ]
- name: "subfic"
desc: "Subtract from Immediate Carrying"
bitmask: 0xfc000000
pattern: 0x20000000
args: [ "rD", "rA", "simm" ]
defs: [ "rD" ]
uses: [ "rA" ]
- name: "subfme"
desc: "Subtract from Minus One Extended"
bitmask: 0xfc00fbfe
pattern: 0x7c0001d0
modifier: [ "OE", "Rc" ]
args: [ "rD", "rA" ]
defs: [ "rD" ]
uses: [ "rA" ]
- name: "subfze"
desc: "Subtract from Zero Extended"
bitmask: 0xfc00fbfe
pattern: 0x7c000190
modifier: [ "OE", "Rc" ]
args: [ "rD", "rA" ]
defs: [ "rD" ]
uses: [ "rA" ]
- name: "sync"
desc: "Synchronize"
bitmask: 0xffffffff
pattern: 0x7c0004ac
- name: "tlbie"
desc: "Translation Lookaside Buffer Invalidate Entry"
bitmask: 0xffff07ff
pattern: 0x7c000264
args: [ "rB" ]
uses: [ "rB" ]
- name: "tlbsync"
desc: "TLB Synchronize"
bitmask: 0xffffffff
pattern: 0x7c00046c
- name: "tw"
desc: "Trap Word"
bitmask: 0xfc0007ff
pattern: 0x7c000008
args: [ "tw_TO", "rA", "rB" ]
uses: [ "rA", "rB" ]
- name: "twi"
desc: "Trap Word Immediate"
bitmask: 0xfc000000
pattern: 0xc0000000
args: [ "tw_TO", "rA", "simm" ]
uses: [ "rA" ]
- name: "xor"
desc: "XOR"
bitmask: 0xfc0007fe
pattern: 0x7c000278
args: [ "rA", "rS", "rB" ]
defs: [ "rA" ]
uses: [ "rS", "rB" ]
- name: "xori"
desc: "XOR Immediate"
bitmask: 0xfc000000
pattern: 0x68000000
args: [ "rA", "rS", "uimm" ]
defs: [ "rA" ]
uses: [ "rS" ]
- name: "xoris"
desc: "XOR Immediate Shifted"
bitmask: 0xfc000000
pattern: 0x6c000000
args: [ "rA", "rS", "uimm" ]
defs: [ "rA" ]
uses: [ "rS" ]
mnemonics:
# Arithmetic
- name: "lis"
opcode: "addis"
args: [ "rD", "uimm" ]
match:
- arg: rA
value: 0
- name: "li"
opcode: "addi"
args: [ "rD", "simm" ]
match:
- arg: rA
value: 0
- name: "mr"
opcode: "or"
args: [ "rA", "rS" ]
condition: "S == B"
- name: "nop"
opcode: "ori"
match:
- arg: "rA"
value: 0
- arg: "rS"
value: 0
- arg: "uimm"
value: 0
# Rotates/Shifts
- name: "clrlwi"
opcode: "rlwinm"
args: [ "rA", "rS", "MB" ]
condition: "SH == 0 && ME == 31"
- name: "rotlwi"
opcode: "rlwinm"
args: [ "rA", "rS", "SH" ]
condition: "MB == 0 && ME == 31"
- name: "slwi"
opcode: "rlwinm"
args: [ "rA", "rS", "ME" ]
condition: "MB == 0 && 31 - SH == ME"
- name: "srwi"
opcode: "rlwinm"
args: [ "rA", "rS", "MB" ]
condition: "ME == 31 && 32 - MB == SH"
# Compares
- name: "cmpw"
opcode: "cmp"
args: [ "rA", "rB" ]
match:
- arg: "crfD"
value: 0
- name: "cmpw"
opcode: "cmp"
args: [ "crfD", "rA", "rB" ]
- name: "cmplw"
opcode: "cmpl"
args: [ "rA", "rB" ]
match:
- arg: "crfD"
value: 0
- name: "cmplw"
opcode: "cmpl"
args: [ "crfD", "rA", "rB" ]
- name: "cmpwi"
opcode: "cmpi"
args: [ "rA", "simm" ]
match:
- arg: "crfD"
value: 0
- name: "cmpwi"
opcode: "cmpi"
args: [ "crfD", "rA", "simm" ]
match:
- arg: "crfD"
value: 0
- name: "cmplwi"
opcode: "cmpli"
args: [ "rA", "uimm" ]
match:
- arg: "crfD"
value: 0
- name: "cmplwi"
opcode: "cmpli"
args: [ "crfD", "rA", "uimm" ]
match:
- arg: "crfD"
value: 0
# Misc
- name: "twgti"
opcode: "twi"
args: [ "rA", "simm" ]
match:
- arg: TO
value: 8
- name: "twllei"
opcode: "twi"
args: [ "rA", "simm" ]
match:
- arg: TO
value: 6
- name: "twui"
args: [ "rA", "simm" ]
match:
- arg: TO
value: 31
# Branches
- name: "blr"
opcode: "bclr"
match:
- arg: BO
value: 20
- arg: BI
value: 0
# Move to special-purpose register
- name: "mtxer"
opcode: "mtspr"
args: [ "rS" ]
match:
- arg: "spr"
value: 1
- name: "mtlr"
opcode: "mtspr"
args: [ "rS" ]
match:
- arg: "spr"
value: 8
- name: "mtctr"
opcode: "mtspr"
args: [ "rS" ]
match:
- arg: "spr"
value: 9
- name: "mtdsisr"
opcode: "mtspr"
args: [ "rS" ]
match:
- arg: "spr"
value: 18
- name: "mtdbatu"
opcode: "mtspr"
args: [ "rS" ]
match:
- arg: "spr"
value: 397
- name: "mttdu"
opcode: "mtspr"
args: [ "rS" ]
match:
- arg: "spr"
value: 571
# Move from special-purpose register
- name: "mfxer"
opcode: "mfspr"
args: [ "rD" ]
match:
- arg: "spr"
value: 1
- name: "mflr"
opcode: "mfspr"
args: [ "rD" ]
match:
- arg: "spr"
value: 8
- name: "mfctr"
opcode: "mfspr"
args: [ "rD" ]
match:
- arg: "spr"
value: 9
- name: "mfdsisr"
opcode: "mfspr"
args: [ "rD" ]
match:
- arg: "spr"
value: 18
- name: "mfdbatu"
opcode: "mfspr"
args: [ "rD" ]
match:
- arg: "spr"
value: 397
- name: "mftdu"
opcode: "mfspr"
args: [ "rD" ]
match:
- arg: "spr"
value: 571
# Branch Conditional
- name: "blt"
opcode: "bc"
modifiers: [ "AA", "LK" ]
args: [ "crS.LT", "BD" ]
match:
- arg: BO
value: 12
- name: "ble"
opcode: "bc"
modifiers: [ "AA", "LK" ]
args: [ "crS.GT", "BD" ]
match:
- arg: BO
value: 4
- name: "beq"
opcode: "bc"
modifiers: [ "AA", "LK" ]
args: [ "crS.EQ", "BD" ]
match:
- arg: BO
value: 12
- name: "bge"
opcode: "bc"
modifiers: [ "AA", "LK" ]
args: [ "crS.LT", "BD" ]
match:
- arg: BO
value: 4
- name: "bgt"
opcode: "bc"
modifiers: [ "AA", "LK" ]
args: [ "crS.GT", "BD" ]
match:
- arg: BO
value: 12
- name: "bne"
opcode: "bc"
modifiers: [ "AA", "LK" ]
args: [ "crS.EQ", "BD" ]
match:
- arg: BO
value: 4
- name: "bso"
opcode: "bc"
modifiers: [ "AA", "LK" ]
args: [ "crS.SO", "BD" ]
match:
- arg: BO
value: 12
- name: "bns"
opcode: "bc"
modifiers: [ "AA", "LK" ]
args: [ "crS.SO", "BD" ]
match:
- arg: BO
value: 4
- name: "bdnz"
opcode: "bc"
modifiers: [ "AA", "LK" ]
args: [ "BD" ]
match:
- arg: BO
value: 16
- arg: BI
value: 0
- name: "bdz"
opcode: "bc"
modifiers: [ "AA", "LK" ]
args: [ "BD" ]
match:
- arg: BO
value: 18
- arg: BI
value: 0
# TODO support conditional bd...
# Branch Conditional to Count Register
- name: "bltctr"
opcode: "bcctr"
modifiers: [ "LK" ]
args: [ "crS.LT", "BD" ]
match:
- arg: BO
value: 12
- name: "blectr"
opcode: "bcctr"
modifiers: [ "LK" ]
args: [ "crS.GT", "BD" ]
match:
- arg: BO
value: 4
- name: "beqctr"
opcode: "bcctr"
modifiers: [ "LK" ]
args: [ "crS.EQ", "BD" ]
match:
- arg: BO
value: 12
- name: "bgectr"
opcode: "bcctr"
modifiers: [ "LK" ]
args: [ "crS.LT", "BD" ]
match:
- arg: BO
value: 4
- name: "bgtctr"
opcode: "bcctr"
modifiers: [ "LK" ]
args: [ "crS.GT", "BD" ]
match:
- arg: BO
value: 12
- name: "bnectr"
opcode: "bcctr"
modifiers: [ "LK" ]
args: [ "crS.EQ", "BD" ]
match:
- arg: BO
value: 4
- name: "bsoctr"
opcode: "bcctr"
modifiers: [ "LK" ]
args: [ "crS.SO", "BD" ]
match:
- arg: BO
value: 12
- name: "bnsctr"
opcode: "bcctr"
modifiers: [ "LK" ]
args: [ "crS.SO", "BD" ]
match:
- arg: BO
value: 4
# Branch Conditional to Link Register
- name: "bltlr"
opcode: "bclr"
modifiers: [ "LK" ]
args: [ "crS.LT", "BD" ]
match:
- arg: BO
value: 12
- name: "blelr"
opcode: "bclr"
modifiers: [ "LK" ]
args: [ "crS.GT", "BD" ]
match:
- arg: BO
value: 4
- name: "beqlr"
opcode: "bclr"
modifiers: [ "LK" ]
args: [ "crS.EQ", "BD" ]
match:
- arg: BO
value: 12
- name: "bgelr"
opcode: "bclr"
modifiers: [ "LK" ]
args: [ "crS.LT", "BD" ]
match:
- arg: BO
value: 4
- name: "bgtlr"
opcode: "bclr"
modifiers: [ "LK" ]
args: [ "crS.GT", "BD" ]
match:
- arg: BO
value: 12
- name: "bnelr"
opcode: "bclr"
modifiers: [ "LK" ]
args: [ "crS.EQ", "BD" ]
match:
- arg: BO
value: 4
- name: "bsolr"
opcode: "bclr"
modifiers: [ "LK" ]
args: [ "crS.SO", "BD" ]
match:
- arg: BO
value: 12
- name: "bnslr"
opcode: "bclr"
modifiers: [ "LK" ]
args: [ "crS.SO", "BD" ]
match:
- arg: BO
value: 4