psx.wiki

Load Delay Slot Collisions: Difference between revisions

Revision as of 05:41, 23 October 2026
RemmyLee
(Hardware tests: See also links back from 37 existing pages to the new ones)
Revision as of 05:49, 23 October 2026
RemmyLee
(Hardware tests: the last 15 test pages (timers, SPU, CPU, GPU, DMA, CD-ROM, GTE), See also links both ways; uncited clock claim removed)
Line 1:Line 1:
+---
+title: Load Delay Slot Collisions
+type: test
+summary: Measures the time a counted loop takes when the instruction in a load's delay slot, or the one after it, writes, reads or loads the load's destination register, by load width, data region and code segment.
+category: Hardware tests
+info: Machine = SCPH-5501
+info: Program = col1
+---
+
+## Overview
+
+The program is a set of 2,016 small programs, each timed whole for 16 passes of a counted loop and called eight times; the first call is cold. Each pass is a lui of the address, a load L into t1, an instruction N, and j NOPs. N sits in the load's delay slot ("slot") or one word later after a NOP ("late"). Each line's name gives L, N, the data region, the code segment, j and the position, and the line gives the eight times twice, as run1 and run2.[^run]
+
+Table: The parts of a name
+
+| Part | Values |
+| --- | --- |
+| L | lw, lh, lhu, lb, lbu, lwl, lwr |
+| N | wd (addiu t1: writes t1 only), wds (or t1 from another register), rd (or t1 from t1), lw (a second load into t1), mfhi (into t1), ctl (addiu into another register) |
+| Data | k0, k1 and ku (RAM through KSEG0, KSEG1 and KUSEG), spad (the scratchpad) |
+| Code | k0 (cached), k1 (uncached) |
+| j | 0, 1 or 3 NOPs after N |
+| Position | slot or late |
+
+See also:
+
+- [Load Landing and Device Loads](/tests/load-landing/)
+
+## Results
+
+In all 2,016 lines run1 and run2 hold the same eight times. The control ctl, which writes another register, is the time of the loop without a collision, and the times below are the median of calls 2 to 8.[^run]
+
+With RAM data and cached code, any N that wrote t1, read it or moved HI into it in the delay slot took 47 to 49 counts more than the control over the 16 passes, which is about 3 a pass. A second load into t1 took 112 to 116 counts more. With N one word later the cost was 64 to 66 counts, and 129 for the second load. With scratchpad data none of the N cost anything over the control.[^run]
+
+Table: Counts for 16 passes of lw with j 0 and RAM through KSEG0
+
+| Code | Position | ctl | wd | wds | rd | lw | mfhi |
+| --- | --- | --- | --- | --- | --- | --- | --- |
+| Cached | Slot | 150 | 197 | 197 | 197 | 266 | 197 |
+| Cached | Late | 149 | 215 | 213 | 215 | 278 | 213 |
+| Uncached | Slot | 661 | 698 | 696 | 694 | 762 | 696 |
+| Uncached | Late | 762 | 794 | 762 | 792 | 858 | 762 |
+
+From uncached code with N one word later, wd and rd still cost 30 to 32 counts, but wds and mfhi cost nothing. In the delay slot from uncached code every N cost 27 to 37 counts and the second load 97 to 101.[^run]
+
+The load width changed these costs by at most 8 counts. RAM data through KSEG0, KSEG1 or KUSEG gave times within 5 counts of each other in every program.[^run]
+
+Table: Counts for 16 passes of lw with scratchpad data
+
+| Code | Position | ctl | wd | wds | rd | lw | mfhi |
+| --- | --- | --- | --- | --- | --- | --- | --- |
+| Cached | Slot | 101 | 101 | 101 | 101 | 101 | 101 |
+| Cached | Late | 117 | 117 | 117 | 117 | 117 | 117 |
+| Uncached | Slot | 596 | 596 | 596 | 598 | 596 | 596 |
+| Uncached | Late | 698 | 696 | 698 | 698 | 698 | 698 |
+
+## Runs
+
+### 9 October 2026
+
+[col1/COL1.txt](/tests/raw/20261009T0000Z-5501a-fuzz-col1/col1/COL1.txt)
+
+## References
+
+[^run]: SCPH-5501 output: [col1/COL1.txt](/tests/raw/20261009T0000Z-5501a-fuzz-col1/col1/COL1.txt)