The hand-written parts of the manual still described how the retired xenia-rs interpreter behaved: its snapshots, Rust casts and helpers. Each of those 490 statements is now either restated as what Canary's emitters and x64 backend actually do (at the pinned canary_experimental commit), or dropped where it only made sense for xenia-rs. Checking them turned up claims that were wrong, not just outdated: - VSCR[SAT] is never modelled in Canary (DID_SATURATE is a stub and mfvscr cannot see it); the pages said saturating ops set it stickily. - Canary does not implement lswi/lswx/stswi/stswx, dcbi, mtfsb0/mtfsb1, vmsum*, vmhaddshs, vupkhpx/vupklpx, and most SPRs; pages described them as working. - Traps evaluate TO in Canary; stvebx/stvehx/stvewx store one element, not 16 bytes; mtmsrd writes only EE; fres/frsqrte/vrsqrtefp precision claims and the stfs "rounds under RN / sets FPSCR" claim contradicted the spec. - Reservations are a 64 KiB block bitmap plus a value compare, not per-address tracking. Claims that neither Canary's source nor a public spec settles are marked unverified (NI at boot, vmaddcfp128 operand order, estimate bit-exactness). Generated regions are untouched; re-running the generator changes nothing. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
4.5 KiB
4.5 KiB
eqvx — Equivalent
Category: Integer ALU · Form: X · Opcode:
0x7c000238
Assembler Mnemonics
| Mnemonic | XML entry | Flags | Description |
|---|---|---|---|
eqv |
eqvx |
— | Equivalent |
eqv. |
eqvx |
Rc=1 | Equivalent |
Syntax
eqv[Rc] [RA], [RS], [RB]
Encoding
eqvx — form X
- Opcode word:
0x7c000238 - Primary opcode (bits 0–5):
31 - Extended opcode:
284 - Synchronising: no
| Bits | Field | Meaning |
|---|---|---|
| 0–5 | OPCD |
primary opcode |
| 6–10 | RT/FRT/VRT |
destination |
| 11–15 | RA/FRA/VRA |
source A |
| 16–20 | RB/FRB/VRB |
source B |
| 21–30 | XO |
extended opcode (10 bits) |
| 31 | Rc |
record-form flag |
Operands
| Field | Role | Description |
|---|---|---|
RS |
eqvx: read | Source GPR (alias for RD in some stores). |
RB |
eqvx: read | Source GPR. |
RA |
eqvx: write | Source GPR (r0–r31). |
CR |
eqvx: write (conditional) | Condition-register update. When Rc=1, CR field 0 (or CR6 for vector compares, CR1 for FPU) is updated from the result. |
Register Effects
eqvx
- Reads (always):
RS,RB - Reads (conditional): none
- Writes (always):
RA - Writes (conditional):
CR
Status-Register Effects
eqvx: CR0 ← signed-compare(result, 0) withSO ← XER[SO], whenRc=1.
Operation (pseudocode)
RA <- ~((RS) ^ (RB))
C Translation Example
/* No hand-written C yet. Translate the Canary emitter snapshot */
/* under Implementation References; its HIR maps directly: */
/* f.LoadGPR(n) / f.StoreGPR(n, v) -> r[n] / r[n] = v */
/* f.LoadFPR / StoreFPR, f.LoadVR / StoreVR -> f[n], v[n] */
/* f.Load(ea, T), f.Store(ea, v) -> raw read / write; emitters */
/* wrap them in f.ByteSwap for the big-endian guest value */
/* f.UpdateCR(n, v) -> CR field n from v's LOW 32 BITS vs 0 */
/* f.LoadCA / f.StoreCA -> xer.CA; f.StoreSAT -> vscr.SAT */
/* i.XO.RA, i.D.DS, ... -> the bit-fields listed under Operands */
/* The Register Effects and Status-Register Effects tables above */
/* enumerate every side effect a faithful translation must emit. */
Implementation References
eqvx
- Canary XML:
tools/ppc-instructions.xml— search formnem="eqvx" - Canary emitter:
src/xenia/cpu/ppc/ppc_emit_alu.cc:704 - Sylpheed opcode:
crates/sylpheed-ppc/src/opcode.rs:59 - Sylpheed decoder:
crates/sylpheed-ppc/src/decoder.rs:911
Canary emitter (frozen snapshot @ f21ebd49e9)
int InstrEmit_eqvx(PPCHIRBuilder& f, const InstrData& i) {
// RA <- (RS) == (RB)
Value* ra = f.Not(f.Xor(f.LoadGPR(i.X.RT), f.LoadGPR(i.X.RB)));
f.StoreGPR(i.X.RA, ra);
if (i.X.Rc) {
f.UpdateCR(0, ra);
}
return 0;
}
Special Cases & Edge Conditions
- NXOR / equivalence.
RA ← ~(RS XOR RB). A bit inRAis 1 iff the corresponding bits ofRSandRBare equal. Useful as a per-bit equality test feeding into acntlzwfor run-length analysis. - Idiom:
eqv RA, RS, RSsets every bit to 1 — a one-instructionRA = -1. Cheaper thanli RA, -1followed byoris/orifor full 64-bit-1. - Operand convention is X-form (
RAis destination;RS,RBare sources). - 64-bit operation on Xenon;
~is full 64-bit onu64. - No
OE, noXERside effects. OnlyRc=1updatesCR0. - 64-bit CR update on Xenon, 32-bit in Canary.
f.UpdateCR(0, v)compares only the low 32 bits, so spec and Canary disagree whenever the high word decides the sign, or the low word is zero while the high word is not.
Related Instructions
xorx— base XOR (eqvisxorthennot).andx,orx,nandx,norx,andcx,orcx— full logical family.xori,xoris— immediate XOR (no immediateeqvexists).