From 0ade2e487d0885f2c10899703aabd1c1875f3451 Mon Sep 17 00:00:00 2001 From: florian Date: Thu, 24 Aug 2006 20:00:06 +0000 Subject: [PATCH] * cleaned up and fixed (from mftq75) sse unit initialization, fixes #7268 git-svn-id: trunk@4501 - --- rtl/i386/i386.inc | 37 +++++++++++++++++++++++++++---------- rtl/x86_64/mathu.inc | 3 +-- rtl/x86_64/x86_64.inc | 21 +++++++++++---------- 3 files changed, 39 insertions(+), 22 deletions(-) diff --git a/rtl/i386/i386.inc b/rtl/i386/i386.inc index 96992b76bc..acd864f410 100644 --- a/rtl/i386/i386.inc +++ b/rtl/i386/i386.inc @@ -59,7 +59,7 @@ function sse_support : boolean; movl $1,%eax cpuid movl %edx,_edx - popl %ebx + popl %ebx end; sse_support:=((_edx and $2000000)<>0) and os_supports_sse; end @@ -83,7 +83,7 @@ function mmx_support : boolean; movl $1,%eax cpuid movl %edx,_edx - popl %ebx + popl %ebx end; mmx_support:=(_edx and $800000)<>0; end @@ -626,7 +626,7 @@ asm movl buf2,%esi { Load params} movl buf1,%edi {$endif} - testl %ecx,%ecx + testl %ecx,%ecx je .LCmpDwordExit xorl %eax,%eax rep { Compare entire DWords} @@ -1167,7 +1167,6 @@ end; ****************************************************************************} const - fpucw : word = $1332; { Internal constants for use in system unit } FPU_Invalid = 1; FPU_Denormal = 2; @@ -1178,13 +1177,31 @@ const FPU_StackOverflow = $40; FPU_ExceptionMask = $ff; + fpucw : word = $1300 or FPU_StackUnderflow or FPU_Underflow or FPU_Denormal; + + MM_MaskInvalidOp = %0000000010000000; + MM_MaskDenorm = %0000000100000000; + MM_MaskDivZero = %0000001000000000; + MM_MaskOverflow = %0000010000000000; + MM_MaskUnderflow = %0000100000000000; + MM_MaskPrecision = %0001000000000000; + + mxcsr : dword = MM_MaskUnderflow or MM_MaskPrecision or MM_MaskDenorm; + {$define FPC_SYSTEM_HAS_SYSRESETFPU} -Procedure SysResetFPU;assembler;{$ifdef SYSTEMINLINE}inline;{$endif} -asm - fninit - fldcw fpucw - fwait -end; +Procedure SysResetFPU;{$ifdef SYSTEMINLINE}inline;{$endif} + begin + asm + fninit + fldcw fpucw + fwait + end; + if has_sse_support then + asm + { setup sse exceptions } + ldmxcsr mxcsr + end; + end; {$ifndef darwin} diff --git a/rtl/x86_64/mathu.inc b/rtl/x86_64/mathu.inc index 9bb863a902..c082aab7cc 100644 --- a/rtl/x86_64/mathu.inc +++ b/rtl/x86_64/mathu.inc @@ -93,7 +93,7 @@ var begin CtlWord:=Get8087CW; Set8087CW((CtlWord and $FFC0) or Byte(Longint(Mask))); - SetSSECSR((((GetSSECSR shr 7) and $ffffffe0) or dword(Mask)) shl 7); + SetSSECSR((((GetSSECSR shr 7) and $ffffffc0) or dword(Mask)) shl 7); Result:=GetExceptionMask; end; @@ -106,4 +106,3 @@ asm .Lclear: fnclex end; - diff --git a/rtl/x86_64/x86_64.inc b/rtl/x86_64/x86_64.inc index 276ba3996d..09e6a5aeea 100644 --- a/rtl/x86_64/x86_64.inc +++ b/rtl/x86_64/x86_64.inc @@ -569,16 +569,6 @@ end; ****************************************************************************} const - fpucw : word = $1332; - - MM_MaskInvalidOp = %0000000010000000; - MM_MaskDenorm = %0000000100000000; - MM_MaskDivZero = %0000001000000000; - MM_MaskOverflow = %0000010000000000; - MM_MaskUnderflow = %0000100000000000; - MM_MaskPrecision = %0001000000000000; - mxcsr : dword = MM_MaskOverflow or MM_MaskUnderflow or MM_MaskPrecision; - { Internal constants for use in system unit } FPU_Invalid = 1; FPU_Denormal = 2; @@ -589,6 +579,17 @@ const FPU_StackOverflow = $40; FPU_ExceptionMask = $ff; + fpucw : word = $1300 or FPU_StackUnderflow or FPU_Underflow or FPU_Denormal; + + MM_MaskInvalidOp = %0000000010000000; + MM_MaskDenorm = %0000000100000000; + MM_MaskDivZero = %0000001000000000; + MM_MaskOverflow = %0000010000000000; + MM_MaskUnderflow = %0000100000000000; + MM_MaskPrecision = %0001000000000000; + + mxcsr : dword = MM_MaskUnderflow or MM_MaskPrecision or MM_MaskDenorm; + {$define FPC_SYSTEM_HAS_SYSRESETFPU} Procedure SysResetFPU;assembler;{$ifdef SYSTEMINLINE}inline;{$endif} asm