mirror of
https://github.com/Lime3DS/Lime3DS
synced 2024-12-28 18:12:44 -06:00
video_core/shader: Document sanitized MUL operation
This commit is contained in:
parent
443bb3d522
commit
e10b11a5d0
1 changed files with 8 additions and 0 deletions
|
@ -295,14 +295,22 @@ void JitShader::Compile_DestEnable(Instruction instr, Xmm src) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void JitShader::Compile_SanitizedMul(Xmm src1, Xmm src2, Xmm scratch) {
|
void JitShader::Compile_SanitizedMul(Xmm src1, Xmm src2, Xmm scratch) {
|
||||||
|
// 0 * inf and inf * 0 in the PICA should return 0 instead of NaN. This can be implemented by
|
||||||
|
// checking for NaNs before and after the multiplication. If the multiplication result is NaN
|
||||||
|
// where neither source was, this NaN was generated by a 0 * inf multiplication, and so the
|
||||||
|
// result should be transformed to 0 to match PICA fp rules.
|
||||||
|
|
||||||
|
// Set scratch to mask of (src1 != NaN and src2 != NaN)
|
||||||
movaps(scratch, src1);
|
movaps(scratch, src1);
|
||||||
cmpordps(scratch, src2);
|
cmpordps(scratch, src2);
|
||||||
|
|
||||||
mulps(src1, src2);
|
mulps(src1, src2);
|
||||||
|
|
||||||
|
// Set src2 to mask of (result == NaN)
|
||||||
movaps(src2, src1);
|
movaps(src2, src1);
|
||||||
cmpunordps(src2, src2);
|
cmpunordps(src2, src2);
|
||||||
|
|
||||||
|
// Clear components where scratch != src2 (i.e. if result is NaN where neither source was NaN)
|
||||||
xorps(scratch, src2);
|
xorps(scratch, src2);
|
||||||
andps(src1, scratch);
|
andps(src1, scratch);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue