mirror of
https://github.com/glest/glest-source.git
synced 2025-08-20 15:11:20 +02:00
- attempt to add streflop to win64 build
- CRAZY attempt to add x64 (win64) support to streflop via some new asm code!
This commit is contained in:
@@ -133,15 +133,37 @@ enum FPU_RoundMode {
|
||||
|
||||
// plan for portability
|
||||
#if defined(_MSC_VER)
|
||||
|
||||
#if _WIN64
|
||||
|
||||
/* No fldcw intrinsics on Windows x64, punt to external asm */
|
||||
extern "C" { void streflop_winx64_fldcw(unsigned int mode); }
|
||||
extern "C" { unsigned int streflop_winx64_fstcw(); }
|
||||
extern "C" { void streflop_winx64_fclex(void); }
|
||||
extern "C" { void streflop_winx64_stmxcsr(unsigned int mode); }
|
||||
extern "C" { void streflop_winx64_ldmxcsr(unsigned int mode); }
|
||||
|
||||
#define STREFLOP_FSTCW(cw) do { int tmp = 0; tmp = streflop_winx64_fstcw(); (cw) = tmp; } while (0)
|
||||
#define STREFLOP_FLDCW(cw) do { int tmp = (cw); streflop_winx64_fldcw(tmp); } while (0)
|
||||
#define STREFLOP_STMXCSR(cw) do { int tmp = 0; streflop_winx64_stmxcsr(tmp); (cw) = tmp; } while (0)
|
||||
#define STREFLOP_LDMXCSR(cw) do { int tmp = (cw); streflop_winx64_ldmxcsr(tmp); } while (0)
|
||||
|
||||
#else
|
||||
|
||||
#define STREFLOP_FSTCW(cw) do { short tmp; __asm { fstcw tmp }; (cw) = tmp; } while (0)
|
||||
#define STREFLOP_FLDCW(cw) do { short tmp = (cw); __asm { fclex }; __asm { fldcw tmp }; } while (0)
|
||||
#define STREFLOP_STMXCSR(cw) do { int tmp; __asm { stmxcsr tmp }; (cw) = tmp; } while (0)
|
||||
#define STREFLOP_LDMXCSR(cw) do { int tmp = (cw); __asm { ldmxcsr tmp }; } while (0)
|
||||
|
||||
#endif
|
||||
|
||||
#else // defined(_MSC_VER)
|
||||
|
||||
#define STREFLOP_FSTCW(cw) do { asm volatile ("fstcw %0" : "=m" (cw) : ); } while (0)
|
||||
#define STREFLOP_FLDCW(cw) do { asm volatile ("fclex \n fldcw %0" : : "m" (cw)); } while (0)
|
||||
#define STREFLOP_STMXCSR(cw) do { asm volatile ("stmxcsr %0" : "=m" (cw) : ); } while (0)
|
||||
#define STREFLOP_LDMXCSR(cw) do { asm volatile ("ldmxcsr %0" : : "m" (cw) ); } while (0)
|
||||
|
||||
#endif // defined(_MSC_VER)
|
||||
|
||||
// Subset of all C99 functions
|
||||
|
64
source/shared_lib/sources/streflop/FPUSettings.asm
Normal file
64
source/shared_lib/sources/streflop/FPUSettings.asm
Normal file
@@ -0,0 +1,64 @@
|
||||
;
|
||||
; Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
|
||||
;
|
||||
; Use of this source code is governed by a BSD-style license
|
||||
; that can be found in the LICENSE file in the root of the source
|
||||
; tree. An additional intellectual property rights grant can be found
|
||||
; in the file PATENTS. All contributing project authors may
|
||||
; be found in the AUTHORS file in the root of the source tree.
|
||||
;
|
||||
|
||||
|
||||
_text SEGMENT
|
||||
; %ifidn __OUTPUT_FORMAT__,x64
|
||||
; %ifdef _WIN64
|
||||
|
||||
streflop_winx64_fclex PROC FRAME
|
||||
|
||||
fclex
|
||||
.endprolog
|
||||
ret
|
||||
streflop_winx64_fclex ENDP
|
||||
|
||||
streflop_winx64_fldcw PROC FRAME
|
||||
|
||||
fclex
|
||||
mov qword ptr [rsp + 8], rcx
|
||||
.ENDPROLOG
|
||||
ldmxcsr [rsp + 8]
|
||||
ret
|
||||
streflop_winx64_fldcw ENDP
|
||||
|
||||
streflop_winx64_fstcw PROC FRAME
|
||||
|
||||
sub rsp, 8
|
||||
.ENDPROLOG
|
||||
stmxcsr [rsp]
|
||||
mov rax, [rsp]
|
||||
add rsp, 8
|
||||
ret
|
||||
streflop_winx64_fstcw ENDP
|
||||
|
||||
streflop_winx64_stmxcsr PROC FRAME
|
||||
|
||||
sub rsp, 8
|
||||
.ENDPROLOG
|
||||
stmxcsr [rsp]
|
||||
mov rax, [rsp]
|
||||
add rsp, 8
|
||||
ret
|
||||
streflop_winx64_stmxcsr ENDP
|
||||
|
||||
streflop_winx64_ldmxcsr PROC FRAME
|
||||
|
||||
sub rsp, 8
|
||||
.ENDPROLOG
|
||||
ldmxcsr [rsp]
|
||||
mov rax, [rsp]
|
||||
add rsp, 8
|
||||
ret
|
||||
streflop_winx64_ldmxcsr ENDP
|
||||
|
||||
;%endif
|
||||
|
||||
end
|
Reference in New Issue
Block a user