mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-16 12:39:24 +02:00
* cleaned up and fixed (from mftq75) sse unit initialization, fixes #7268
git-svn-id: trunk@4501 -
This commit is contained in:
parent
2b3250aac0
commit
0ade2e487d
@ -59,7 +59,7 @@ function sse_support : boolean;
|
|||||||
movl $1,%eax
|
movl $1,%eax
|
||||||
cpuid
|
cpuid
|
||||||
movl %edx,_edx
|
movl %edx,_edx
|
||||||
popl %ebx
|
popl %ebx
|
||||||
end;
|
end;
|
||||||
sse_support:=((_edx and $2000000)<>0) and os_supports_sse;
|
sse_support:=((_edx and $2000000)<>0) and os_supports_sse;
|
||||||
end
|
end
|
||||||
@ -83,7 +83,7 @@ function mmx_support : boolean;
|
|||||||
movl $1,%eax
|
movl $1,%eax
|
||||||
cpuid
|
cpuid
|
||||||
movl %edx,_edx
|
movl %edx,_edx
|
||||||
popl %ebx
|
popl %ebx
|
||||||
end;
|
end;
|
||||||
mmx_support:=(_edx and $800000)<>0;
|
mmx_support:=(_edx and $800000)<>0;
|
||||||
end
|
end
|
||||||
@ -626,7 +626,7 @@ asm
|
|||||||
movl buf2,%esi { Load params}
|
movl buf2,%esi { Load params}
|
||||||
movl buf1,%edi
|
movl buf1,%edi
|
||||||
{$endif}
|
{$endif}
|
||||||
testl %ecx,%ecx
|
testl %ecx,%ecx
|
||||||
je .LCmpDwordExit
|
je .LCmpDwordExit
|
||||||
xorl %eax,%eax
|
xorl %eax,%eax
|
||||||
rep { Compare entire DWords}
|
rep { Compare entire DWords}
|
||||||
@ -1167,7 +1167,6 @@ end;
|
|||||||
****************************************************************************}
|
****************************************************************************}
|
||||||
|
|
||||||
const
|
const
|
||||||
fpucw : word = $1332;
|
|
||||||
{ Internal constants for use in system unit }
|
{ Internal constants for use in system unit }
|
||||||
FPU_Invalid = 1;
|
FPU_Invalid = 1;
|
||||||
FPU_Denormal = 2;
|
FPU_Denormal = 2;
|
||||||
@ -1178,13 +1177,31 @@ const
|
|||||||
FPU_StackOverflow = $40;
|
FPU_StackOverflow = $40;
|
||||||
FPU_ExceptionMask = $ff;
|
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}
|
{$define FPC_SYSTEM_HAS_SYSRESETFPU}
|
||||||
Procedure SysResetFPU;assembler;{$ifdef SYSTEMINLINE}inline;{$endif}
|
Procedure SysResetFPU;{$ifdef SYSTEMINLINE}inline;{$endif}
|
||||||
asm
|
begin
|
||||||
fninit
|
asm
|
||||||
fldcw fpucw
|
fninit
|
||||||
fwait
|
fldcw fpucw
|
||||||
end;
|
fwait
|
||||||
|
end;
|
||||||
|
if has_sse_support then
|
||||||
|
asm
|
||||||
|
{ setup sse exceptions }
|
||||||
|
ldmxcsr mxcsr
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
{$ifndef darwin}
|
{$ifndef darwin}
|
||||||
|
@ -93,7 +93,7 @@ var
|
|||||||
begin
|
begin
|
||||||
CtlWord:=Get8087CW;
|
CtlWord:=Get8087CW;
|
||||||
Set8087CW((CtlWord and $FFC0) or Byte(Longint(Mask)));
|
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;
|
Result:=GetExceptionMask;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -106,4 +106,3 @@ asm
|
|||||||
.Lclear:
|
.Lclear:
|
||||||
fnclex
|
fnclex
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -569,16 +569,6 @@ end;
|
|||||||
****************************************************************************}
|
****************************************************************************}
|
||||||
|
|
||||||
const
|
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 }
|
{ Internal constants for use in system unit }
|
||||||
FPU_Invalid = 1;
|
FPU_Invalid = 1;
|
||||||
FPU_Denormal = 2;
|
FPU_Denormal = 2;
|
||||||
@ -589,6 +579,17 @@ const
|
|||||||
FPU_StackOverflow = $40;
|
FPU_StackOverflow = $40;
|
||||||
FPU_ExceptionMask = $ff;
|
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}
|
{$define FPC_SYSTEM_HAS_SYSRESETFPU}
|
||||||
Procedure SysResetFPU;assembler;{$ifdef SYSTEMINLINE}inline;{$endif}
|
Procedure SysResetFPU;assembler;{$ifdef SYSTEMINLINE}inline;{$endif}
|
||||||
asm
|
asm
|
||||||
|
Loading…
Reference in New Issue
Block a user