PCSX2 Documentation/PS2 VU (Vector Unit) Documentation Part 1: Difference between revisions
PCSX2 Documentation/PS2 VU (Vector Unit) Documentation Part 1 (view source)
Revision as of 19:02, 19 July 2015
, 19 July 2015no edit summary
No edit summary |
No edit summary |
||
Line 49: | Line 49: | ||
The situation becomes complex however when a VI reg is read AND written to in a sequence of instructions. | The situation becomes complex however when a VI reg is read AND written to in a sequence of instructions. | ||
<source lang="asm"> | |||
IADDIU vi05, vi00, 100 | IADDIU vi05, vi00, 100 | ||
IADDIU vi05, vi05, 100 | IADDIU vi05, vi05, 100 | ||
Line 55: | Line 55: | ||
IADDIU vi05, vi05, 100 | IADDIU vi05, vi05, 100 | ||
IBNE vi05, vi00 <---- vi05's value is before any 100 value was added. (the value before the first IADDIU) | IBNE vi05, vi00 <---- vi05's value is before any 100 value was added. (the value before the first IADDIU) | ||
</source> | |||
When a VI reg is first written to, a 'chain' starts, and then if the next instruction reads AND writes to the same VI reg, the chain continues. It does this for a maximum of 4 instructions (the example above is the maximum). Then when the branch comes, the value that should be read is the value before the chain! | When a VI reg is first written to, a 'chain' starts, and then if the next instruction reads AND writes to the same VI reg, the chain continues. It does this for a maximum of 4 instructions (the example above is the maximum). Then when the branch comes, the value that should be read is the value before the chain! | ||
Line 64: | Line 65: | ||
It does: | It does: | ||
<source lang="asm"> | |||
[08b0] (000002ff) NOP | [08b0] (000002ff) NOP | ||
[08b0] (100310fb) IADDIU vi03, vi02, 251 | [08b0] (100310fb) IADDIU vi03, vi02, 251 | ||
Line 77: | Line 78: | ||
[08d8] (000002ff) NOP | [08d8] (000002ff) NOP | ||
[08d8] (81e2bb7d) SQI.xyzw vf23, vi02++ | [08d8] (81e2bb7d) SQI.xyzw vf23, vi02++ | ||
</source> | |||
The first time the above block of code is run, the IBNE value for vi02 is the same value as it's value at [08b0] (before the chain starts). | The first time the above block of code is run, the IBNE value for vi02 is the same value as it's value at [08b0] (before the chain starts). | ||
Line 97: | Line 99: | ||
Example: | Example: | ||
<source lang="asm"> | |||
MAX vf02.x, vf00.x, vf01.x | MAX vf02.x, vf00.x, vf01.x | ||
</source> | |||
Assuming vf01.x holds a positive denormal, the result in vf02.x will be that same denormal. | Assuming vf01.x holds a positive denormal, the result in vf02.x will be that same denormal. |