Files
Sylpheed/tools/ppc-manual/branch/tdi.md
sim 21161154d1
All checks were successful
CI / Native — linux (pull_request) Successful in 2h2m48s
CI / WASM — Web (pull_request) Successful in 29m51s
CI / Formatting (pull_request) Successful in 1m36s
fix(ppc-manual): 543 dead links, from two generator bugs and wrong relative paths
- 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>
2026-09-16 22:37:12 +02:00

6.7 KiB
Raw Blame History

tdi — Trap Doubleword Immediate

Category: Branch & System · Form: D · Opcode: 0x08000000

Assembler Mnemonics

Mnemonic XML entry Flags Description
tdi tdi Trap Doubleword Immediate

Syntax

tdi [TO], [RA], [SIMM]

Encoding

tdi — form D

  • Opcode word: 0x08000000
  • Primary opcode (bits 05): 2
  • Extended opcode:
  • Synchronising: no
Bits Field Meaning
05 OPCD primary opcode
610 RT destination GPR (or RS when storing)
1115 RA source GPR (0 ⇒ literal 0 for RA0 forms)
1631 D/SI/UI 16-bit signed or unsigned immediate

Operands

Field Role Description
TO tdi: read Trap-on condition mask (5 bits) — LT, GT, EQ, LGT, LLT bits.
RA tdi: read Source GPR (r0r31).
SIMM tdi: read 16-bit signed immediate. Sign-extended to 64 bits before use.

Register Effects

tdi

  • Reads (always): TO, RA, SIMM
  • Reads (conditional): none
  • Writes (always): none
  • Writes (conditional): none

Status-Register Effects

No condition-register or status-register effects.

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

tdi

Canary emitter (frozen snapshot @ f21ebd49e9)
int InstrEmit_tdi(PPCHIRBuilder& f, const InstrData& i) {
  if (cvars::ignore_trap_instructions) {
    return 0;
  }
  // a <- (RA)
  // if (a < EXTS(SI)) & TO[0] then TRAP
  // if (a > EXTS(SI)) & TO[1] then TRAP
  // if (a = EXTS(SI)) & TO[2] then TRAP
  // if (a <u EXTS(SI)) & TO[3] then TRAP
  // if (a >u EXTS(SI)) & TO[4] then TRAP
  Value* ra = f.LoadGPR(i.D.RA);
  Value* rb = f.LoadConstantInt64(XEEXTS16(i.D.DS));
  return InstrEmit_trap(f, i, ra, rb, i.D.RT);
}

Special Cases & Edge Conditions

  • Immediate is sign-extended. SIMM is treated as a 16-bit signed value, then sign-extended to 64 bits before comparison. To trap against a small unsigned constant, the same encoding works because both signed and unsigned interpretations agree for SIMM ∈ [0, 0x7FFF].
  • TO mask. Identical bit layout to td: bit 0 = signed LT, 1 = signed GT, 2 = EQ, 3 = unsigned LT (LGT), 4 = unsigned GT (LLT). Trap fires if any selected bit's condition is true.
  • TO = 31 is unconditional. tdi 31, 0, 0 is a debugger / assert trap. Compilers sometimes use it as a "should not reach" marker.
  • 64-bit comparison only. Unlike twi, tdi always compares the full 64-bit GPR — it has no PPC32 analogue. The Xenon's PPC64 mode makes this meaningful.
  • No register effects. Pure side effect on success: Program interrupt → vector 0x700 with SRR1[TRAP]=1.
  • Canary evaluates the condition. Canary evaluates TO properly: it compares the operands for each set bit and emits a conditional trap (TrapTrue), and TO = 0 emits nothing. So tdi 0, r0, 0 falls through, as on hardware.
  • Reserved bits. Bits 610 carry the TO field; there is no Rc / OE on D-form trap immediates.
  • td — register-register doubleword trap (X-form).
  • twi / tw — 32-bit-comparison siblings.
  • sc — kernel-entry counterpart via system call exception.
  • mtmsrd (control category) — kernel rfid-style return path after handling.

Simplified Mnemonics

Simplified Expansion Triggered when
tdi RA, value tdi 31, RA, value unconditional trap
tdeqi RA, value tdi 4, RA, value RA == EXTS(value)
tdnei RA, value tdi 24, RA, value RA != EXTS(value)
tdlti RA, value tdi 16, RA, value signed less than
tdlei RA, value tdi 20, RA, value signed less or equal
tdgti RA, value tdi 8, RA, value signed greater than
tdgei RA, value tdi 12, RA, value signed greater or equal
tdllti RA, value tdi 2, RA, value unsigned less than
tdlgei RA, value tdi 5, RA, value unsigned greater or equal
tdlgti RA, value tdi 1, RA, value unsigned greater than
tdllei RA, value tdi 6, RA, value unsigned less or equal

IBM Reference