Fix a floatround bug (#376)
* Fix floatround overflow floatround would overflow for floats greater than 2^30 because internally it would double the number (therefore anything greater than 2^30 results in something greater than 2^31 which would cause overflow of course) floatround behaviour is left exactly identical otherwise (although I find it very weird and wrong to deliberately avoid banker's rounding, it would be a bad idea to change this behaviour due to compatibility) Remember to reassemble amxexecn and amxjitsn * Update the compiled object files
This commit is contained in:
committed by
Vincent Herbet
parent
a53e7905db
commit
b9997eb628
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1492,22 +1492,20 @@ OP_FLOAT_ROUND:
|
|||||||
;set the bits
|
;set the bits
|
||||||
or ah,dl ;set bits 15,14 of FCW to rounding method
|
or ah,dl ;set bits 15,14 of FCW to rounding method
|
||||||
or ah,3 ;set precision to 64bit
|
or ah,3 ;set precision to 64bit
|
||||||
mov [ebp], eax
|
|
||||||
fldcw [ebp]
|
|
||||||
;calculate
|
;calculate
|
||||||
sub esp,4
|
sub esp,4
|
||||||
fld dword [edi+ecx+4]
|
fld dword [edi+ecx+4]
|
||||||
test edx,edx
|
test edx,edx
|
||||||
jz .correct
|
jnz .skip_correct
|
||||||
jmp .skip_correct
|
;nearest mode
|
||||||
.correct:
|
;correct so as to AVOID bankers rounding
|
||||||
fadd st0
|
or ah, 4 ;set rounding mode to floor
|
||||||
fadd dword [g_round_nearest]
|
fadd dword [g_round_nearest]
|
||||||
fistp dword [esp]
|
|
||||||
pop eax
|
|
||||||
sar eax,1
|
|
||||||
jmp .done
|
|
||||||
.skip_correct:
|
.skip_correct:
|
||||||
|
mov [ebp], eax
|
||||||
|
fldcw [ebp]
|
||||||
frndint
|
frndint
|
||||||
fistp dword [esp]
|
fistp dword [esp]
|
||||||
pop eax
|
pop eax
|
||||||
|
@ -1979,22 +1979,20 @@ OP_FLOAT_ROUND:
|
|||||||
;set the bits
|
;set the bits
|
||||||
or ah,dl ;set bits 15,14 of FCW to rounding method
|
or ah,dl ;set bits 15,14 of FCW to rounding method
|
||||||
or ah,3 ;set precision to 64bit
|
or ah,3 ;set precision to 64bit
|
||||||
mov [ebp], eax
|
|
||||||
fldcw [ebp]
|
|
||||||
;calculate
|
;calculate
|
||||||
sub esp,4
|
sub esp,4
|
||||||
fld dword [esi+4]
|
fld dword [esi+4]
|
||||||
test edx,edx
|
test edx,edx
|
||||||
jz .correct
|
jnz .skip_correct
|
||||||
jmp .skip_correct
|
;nearest mode
|
||||||
.correct:
|
;correct so as to AVOID bankers rounding
|
||||||
fadd st0
|
or ah, 4 ;set rounding mode to floor
|
||||||
fadd dword [g_round_nearest]
|
fadd dword [g_round_nearest]
|
||||||
fistp dword [esp]
|
|
||||||
pop eax
|
|
||||||
sar eax,1
|
|
||||||
jmp .done
|
|
||||||
.skip_correct:
|
.skip_correct:
|
||||||
|
mov [ebp], eax
|
||||||
|
fldcw [ebp]
|
||||||
frndint
|
frndint
|
||||||
fistp dword [esp]
|
fistp dword [esp]
|
||||||
pop eax
|
pop eax
|
||||||
|
Reference in New Issue
Block a user