PCSX2 Documentation/PS2 VU (Vector Unit) Documentation Part 1: Difference between revisions

Jump to navigation Jump to search
no edit summary
No edit summary
No edit summary
 
(One intermediate revision by the same user not shown)
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.


Code:
<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 &lt;---- vi05's value is before any 100 value was added. (the value before the first IADDIU)
IBNE vi05, vi00 &lt;---- 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:


Code:
<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:


Code:
<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.
Using SSE with DaZ however will just make the result '0' in that case (which is incorrect).
Using SSE with DaZ however will just make the result '0' in that case (which is incorrect).


Some games rely on this correct behavior for MAX/MINI or else have graphical problems Smile
Some games rely on this correct behavior for MAX/MINI or else have graphical problems :)




ninja
782

edits

Navigation menu