mirror of
https://github.com/UberGames/lilium-voyager.git
synced 2024-12-13 21:51:09 +00:00
2e3312676e
Make QVM convertion of float to long use round to nearest instead of round toward zero. This fixes EF's SnapVector. Though native libs will still need to fix SnapVector in the game code itself. Side note: this changes rounding in the renderer too.
111 lines
2.3 KiB
NASM
111 lines
2.3 KiB
NASM
; ===========================================================================
|
|
; Copyright (C) 2011 Thilo Schulz <thilo@tjps.eu>
|
|
;
|
|
; This file is part of Quake III Arena source code.
|
|
;
|
|
; Quake III Arena source code is free software; you can redistribute it
|
|
; and/or modify it under the terms of the GNU General Public License as
|
|
; published by the Free Software Foundation; either version 2 of the License,
|
|
; or (at your option) any later version.
|
|
;
|
|
; Quake III Arena source code is distributed in the hope that it will be
|
|
; useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
; GNU General Public License for more details.
|
|
;
|
|
; You should have received a copy of the GNU General Public License
|
|
; along with Quake III Arena source code; if not, write to the Free Software
|
|
; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
; ===========================================================================
|
|
|
|
; MASM ftol conversion functions using SSE or FPU
|
|
; assume __cdecl calling convention is being used for x86, __fastcall for x64
|
|
|
|
; Make Elite Force use round to nearest instead of round toward zero
|
|
|
|
IFNDEF idx64
|
|
.686p
|
|
.xmm
|
|
.model flat, c
|
|
ENDIF
|
|
|
|
.data
|
|
|
|
ifndef idx64
|
|
IFDEF ELITEFORCE
|
|
fpucw WORD 007Fh
|
|
ELSE
|
|
fpucw WORD 0F7Fh
|
|
ENDIF
|
|
endif
|
|
|
|
.code
|
|
|
|
IFDEF idx64
|
|
; qftol using SSE
|
|
|
|
qftolsse PROC
|
|
IFDEF ELITEFORCE
|
|
cvtss2si eax, xmm0
|
|
ELSE
|
|
cvttss2si eax, xmm0
|
|
ENDIF
|
|
ret
|
|
qftolsse ENDP
|
|
|
|
qvmftolsse PROC
|
|
movss xmm0, dword ptr [rdi + rbx * 4]
|
|
IFDEF ELITEFORCE
|
|
cvtss2si eax, xmm0
|
|
ELSE
|
|
cvttss2si eax, xmm0
|
|
ENDIF
|
|
ret
|
|
qvmftolsse ENDP
|
|
|
|
ELSE
|
|
; qftol using FPU
|
|
|
|
qftolx87m macro src
|
|
sub esp, 2
|
|
fnstcw word ptr [esp]
|
|
fldcw fpucw
|
|
fld dword ptr src
|
|
fistp dword ptr src
|
|
fldcw [esp]
|
|
mov eax, src
|
|
add esp, 2
|
|
ret
|
|
endm
|
|
|
|
qftolx87 PROC
|
|
qftolx87m [esp + 6]
|
|
qftolx87 ENDP
|
|
|
|
qvmftolx87 PROC
|
|
qftolx87m [edi + ebx * 4]
|
|
qvmftolx87 ENDP
|
|
|
|
; qftol using SSE
|
|
qftolsse PROC
|
|
movss xmm0, dword ptr [esp + 4]
|
|
IFDEF ELITEFORCE
|
|
cvtss2si eax, xmm0
|
|
ELSE
|
|
cvttss2si eax, xmm0
|
|
ENDIF
|
|
ret
|
|
qftolsse ENDP
|
|
|
|
qvmftolsse PROC
|
|
movss xmm0, dword ptr [edi + ebx * 4]
|
|
IFDEF ELITEFORCE
|
|
cvtss2si eax, xmm0
|
|
ELSE
|
|
cvttss2si eax, xmm0
|
|
ENDIF
|
|
ret
|
|
qvmftolsse ENDP
|
|
ENDIF
|
|
|
|
end
|