powerpc

(Previously ppc750cl
)
Rust disassembler and assembler for the PowerPC ISA.
Supported Extensions
- PowerPC 64-bit
- Paired Singles
- PowerPC 750CXe "Gekko" (Nintendo GameCube)
- PowerPC 750CL "Broadway" (Nintendo Wii)
- AltiVec
- VMX128
- PowerPC "Xenon" (Xbox 360)
If you need support for other extensions, please open an issue.
Usage
In Cargo.toml:
[]
= "0.4" # disassembler
= "0.4" # assembler
Disassembling and printing instructions:
use ;
let ins = new;
assert_eq!;
// Basic form
let parsed = ins.basic;
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!;
// Simplified form
let parsed = ins.simplified;
assert_eq!;
Assembling instructions:
use ;
let args: Arguments = ;
let code = assemble.expect;
assert_eq!; // addi r5, r0, 0x0
Building
cargo run --package powerpc-genisa
cargo test
isa.yaml
The file isa.yaml contains a definition of the PowerPC instruction set.
Similarly to LLVM TableGen, the program powerpc-genisa
generates Rust files implementing core functionality
for the disassembler and assembler.
Safety & Correctness
- The disassembler has been fuzzed over all ~4.29 billion possible instructions (via
powerpc-fuzz
). - It is safe to run the disassembler over untrusted byte arrays.
- However, no guarantees on correctness are made (yet). Expect bugs.
Performance
With a single thread on Ryzen 9 3900X:
- Disassembling & printing: ~12M insn/s (~50 MB/s)
- Disassembling only: ~275M insn/s (~1 GB/s)