- Category pages linked each family as `<slug>.md`, relative to categories/, where no family page lives. They now link `../<category>/<slug>.md`. - Form pages linked a member into its *own* category directory, so every VMX128 sibling (`vsldoi128`) pointed at vmx128/ although its family page is under vmx/. They now link into the family's directory. - Hand-written "Related" and sibling mentions linked other categories' pages as if they were in the same directory. 109 are retargeted through the page index; 29 that pointed a family page at itself (`vrefp128` on vrefp.md) and 6 naming instructions the manual has no page for are plain text now. Regenerated at the existing Canary pin (f21ebd49e): upstream has moved on, and re-pinning belongs in its own change. The generator reports 0 family pages changed and is idempotent; the only dead links left are TEMPLATE.md's placeholders. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
6.5 KiB
6.5 KiB
fcmpo — Floating Compare Ordered
Category: Floating-Point · Form: X · Opcode:
0xfc000040
Assembler Mnemonics
| Mnemonic | XML entry | Flags | Description |
|---|---|---|---|
fcmpo |
fcmpo |
— | Floating Compare Ordered |
Syntax
fcmpo [CRFD], [FA], [FB]
Encoding
fcmpo — form X
- Opcode word:
0xfc000040 - Primary opcode (bits 0–5):
63 - Extended opcode:
32 - 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 |
|---|---|---|
FA |
fcmpo: read | Source A floating-point register (fr0–fr31). |
FB |
fcmpo: read | Source B floating-point register. |
CRFD |
fcmpo: write | CR destination field (crf, 0–7). |
FPSCR |
fcmpo: write | Floating-Point Status and Control Register. |
Register Effects
fcmpo
- Reads (always):
FA,FB - Reads (conditional): none
- Writes (always):
CRFD,FPSCR - Writes (conditional): none
Status-Register Effects
fcmpo: FPSCR updated per IEEE-754 flags (FX, FEX, FPRF, FR, FI, exceptions).
Operation (pseudocode)
; No hand-written pseudocode for this instruction yet.
; The authoritative semantics are the Canary emitter snapshot under
; Implementation References; about half of Canary's emitters open
; with the PPC-style definition as a comment (`RD <- (RA) + (RB)`).
; Every side effect is also enumerated in the Register Effects and
; Status-Register Effects tables above.
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
fcmpo
- Canary XML:
tools/ppc-instructions.xml— search formnem="fcmpo" - Canary emitter:
src/xenia/cpu/ppc/ppc_emit_fpu.cc:362 - Sylpheed opcode:
crates/sylpheed-ppc/src/opcode.rs:68 - Sylpheed decoder:
crates/sylpheed-ppc/src/decoder.rs:1016
Canary emitter (frozen snapshot @ f21ebd49e9)
int InstrEmit_fcmpo(PPCHIRBuilder& f, const InstrData& i) {
return InstrEmit_fcmpx_(f, i, true);
}
// ── delegates to (src/xenia/cpu/ppc/ppc_emit_fpu.cc:329) ──
int InstrEmit_fcmpx_(PPCHIRBuilder& f, const InstrData& i, bool ordered) {
// if (FRA) is a NaN or (FRB) is a NaN then
// c <- 0b0001
// else if (FRA) < (FRB) then
// c <- 0b1000
// else if (FRA) > (FRB) then
// c <- 0b0100
// else {
// c <- 0b0010
// }
// FPCC <- c
// CR[4*BF:4*BF+3] <- c
// if (FRA) is an SNaN or (FRB) is an SNaN then
// VXSNAN <- 1
// TODO(benvanik): update FPCC for mffsx/etc
// TODO(benvanik): update VXSNAN
const uint32_t crf = i.X.RT >> 2;
Value* ra = f.LoadFPR(i.X.RA);
Value* rb = f.LoadFPR(i.X.RB);
Value* nan = f.Or(f.IsNan(ra), f.IsNan(rb));
f.StoreContext(offsetof(PPCContext, cr0) + (4 * crf) + 3, nan);
Value* not_nan = f.Xor(nan, f.LoadConstantInt8(0x01));
Value* lt = f.And(not_nan, f.CompareSLT(ra, rb));
f.StoreContext(offsetof(PPCContext, cr0) + (4 * crf) + 0, lt);
Value* gt = f.And(not_nan, f.CompareSGT(ra, rb));
f.StoreContext(offsetof(PPCContext, cr0) + (4 * crf) + 1, gt);
Value* eq = f.And(not_nan, f.CompareEQ(ra, rb));
f.StoreContext(offsetof(PPCContext, cr0) + (4 * crf) + 2, eq);
return 0;
}
Special Cases & Edge Conditions
- Ordered compare. Same CR-field semantics as
fcmpu(LT/GT/EQ/SO), but NaN inputs raise additional FPSCR exceptions:- Either operand NaN →
FPSCR[VXVC] = 1(invalid-operation: compare on QNaN/SNaN). - Either operand signalling NaN → also
FPSCR[VXSNAN] = 1. - All NaN cases also set
FX = 1andVX = 1.
- Either operand NaN →
- Canary's
fcmpoisfcmpu. Both callInstrEmit_fcmpx_, which ignores itsorderedparameter: the FPSCR exception bits (VXVC,VXSNAN) andFPCCare not modelled. Title code that polls FPSCR for compare-class invalid-operation will not observe it. - CR field bits.
LT(bit 0) —FRA < FRBGT(bit 1) —FRA > FRBEQ(bit 2) —FRA == FRBSO(bit 3) — unordered (NaN involved)
+0and-0compare equal.- No
Rcbit. - FPSCR side effects. Hardware updates
FPSCR[FPCC],FX,VX, and (on NaN)VXVC/VXSNAN. Canary only updates the CR field. - Use case. Ordered compares are required by C/C++ semantics for
<,>,<=,>=(which must signal on NaN per IEEE-754).fcmpucorresponds to the C==/!=semantics (which do not signal). - Encoding. X-form, primary 63, XO 32.
Related Instructions
fcmpux— unordered compare; identical CR result, noVXVC.mcrf,mcrfs,mfcr— fan-out CR fields after compare.bc,bclr,bcctr— conditional branches consumeLT/GT/EQ/SO.fselx— branch-free alternative for single-key compares.mcrfs,mffsx— move FPSCR/CR.
IBM Reference
- AIX 7.3 —
fcmpo(Floating Compare Ordered) - PowerISA v2.07B, Book I, Chapter 4 — Floating-Point Processor (
fcmporaisesVXVCon QNaN; both raiseVXSNANon SNaN).