video_core/shader: Document sanitized MUL operation
This commit is contained in:
		| @@ -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); | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user