|
@@ -72,6 +72,12 @@ asm
|
|
.Lg_a_null:
|
|
.Lg_a_null:
|
|
end ['RAX'];
|
|
end ['RAX'];
|
|
|
|
|
|
|
|
+// The following assembler procedures are disabled for FreeBSD due to
|
|
|
|
+// multiple issues with its old GNU assembler (Mantis #19188).
|
|
|
|
+// Even after fixing them, it can be enabled only for the trunk version,
|
|
|
|
+// otherwise bootstrapping won't be possible.
|
|
|
|
+{$ifndef freebsd}
|
|
|
|
+
|
|
{$ifndef FPC_SYSTEM_HAS_MOVE}
|
|
{$ifndef FPC_SYSTEM_HAS_MOVE}
|
|
{$define FPC_SYSTEM_HAS_MOVE}
|
|
{$define FPC_SYSTEM_HAS_MOVE}
|
|
procedure Move(const source;var dest;count:SizeInt);[public, alias: 'FPC_MOVE'];assembler;nostackframe;
|
|
procedure Move(const source;var dest;count:SizeInt);[public, alias: 'FPC_MOVE'];assembler;nostackframe;
|
|
@@ -195,23 +201,23 @@ asm
|
|
add $64, %rdx
|
|
add $64, %rdx
|
|
mov -64(%rcx,%rdx,1), %r9
|
|
mov -64(%rcx,%rdx,1), %r9
|
|
mov -56(%rcx,%rdx,1), %r10
|
|
mov -56(%rcx,%rdx,1), %r10
|
|
- movntiq %r9, -64(%rdx)
|
|
|
|
- movntiq %r10, -56(%rdx)
|
|
|
|
|
|
+ movnti %r9, -64(%rdx)
|
|
|
|
+ movnti %r10, -56(%rdx)
|
|
|
|
|
|
mov -48(%rcx,%rdx,1), %r9
|
|
mov -48(%rcx,%rdx,1), %r9
|
|
mov -40(%rcx,%rdx,1), %r10
|
|
mov -40(%rcx,%rdx,1), %r10
|
|
- movntiq %r9, -48(%rdx)
|
|
|
|
- movntiq %r10, -40(%rdx)
|
|
|
|
|
|
+ movnti %r9, -48(%rdx)
|
|
|
|
+ movnti %r10, -40(%rdx)
|
|
dec %eax
|
|
dec %eax
|
|
mov -32(%rcx,%rdx,1), %r9
|
|
mov -32(%rcx,%rdx,1), %r9
|
|
mov -24(%rcx,%rdx,1), %r10
|
|
mov -24(%rcx,%rdx,1), %r10
|
|
- movntiq %r9, -32(%rdx)
|
|
|
|
- movntiq %r10, -24(%rdx)
|
|
|
|
|
|
+ movnti %r9, -32(%rdx)
|
|
|
|
+ movnti %r10, -24(%rdx)
|
|
|
|
|
|
mov -16(%rcx,%rdx,1), %r9
|
|
mov -16(%rcx,%rdx,1), %r9
|
|
mov -8(%rcx,%rdx,1), %r10
|
|
mov -8(%rcx,%rdx,1), %r10
|
|
- movntiq %r9, -16(%rdx)
|
|
|
|
- movntiq %r10, -8(%rdx)
|
|
|
|
|
|
+ movnti %r9, -16(%rdx)
|
|
|
|
+ movnti %r10, -8(%rdx)
|
|
jne .Loop64
|
|
jne .Loop64
|
|
|
|
|
|
sub $0x1000, %r8
|
|
sub $0x1000, %r8
|
|
@@ -323,23 +329,23 @@ asm
|
|
sub $64, %rdx
|
|
sub $64, %rdx
|
|
mov 56(%rcx,%rdx,1), %r9
|
|
mov 56(%rcx,%rdx,1), %r9
|
|
mov 48(%rcx,%rdx,1), %r10
|
|
mov 48(%rcx,%rdx,1), %r10
|
|
- movntiq %r9, 56(%rdx)
|
|
|
|
- movntiq %r10, 48(%rdx)
|
|
|
|
|
|
+ movnti %r9, 56(%rdx)
|
|
|
|
+ movnti %r10, 48(%rdx)
|
|
|
|
|
|
mov 40(%rcx,%rdx,1), %r9
|
|
mov 40(%rcx,%rdx,1), %r9
|
|
mov 32(%rcx,%rdx,1), %r10
|
|
mov 32(%rcx,%rdx,1), %r10
|
|
- movntiq %r9, 40(%rdx)
|
|
|
|
- movntiq %r10, 32(%rdx)
|
|
|
|
|
|
+ movnti %r9, 40(%rdx)
|
|
|
|
+ movnti %r10, 32(%rdx)
|
|
dec %eax
|
|
dec %eax
|
|
mov 24(%rcx,%rdx,1), %r9
|
|
mov 24(%rcx,%rdx,1), %r9
|
|
mov 16(%rcx,%rdx,1), %r10
|
|
mov 16(%rcx,%rdx,1), %r10
|
|
- movntiq %r9, 24(%rdx)
|
|
|
|
- movntiq %r10, 16(%rdx)
|
|
|
|
|
|
+ movnti %r9, 24(%rdx)
|
|
|
|
+ movnti %r10, 16(%rdx)
|
|
|
|
|
|
mov 8(%rcx,%rdx,1), %r9
|
|
mov 8(%rcx,%rdx,1), %r9
|
|
mov (%rcx,%rdx,1), %r10
|
|
mov (%rcx,%rdx,1), %r10
|
|
- movntiq %r9, 8(%rdx)
|
|
|
|
- movntiq %r10, (%rdx)
|
|
|
|
|
|
+ movnti %r9, 8(%rdx)
|
|
|
|
+ movnti %r10, (%rdx)
|
|
jne .Lloop64b
|
|
jne .Lloop64b
|
|
|
|
|
|
sub $0x1000, %r8
|
|
sub $0x1000, %r8
|
|
@@ -451,15 +457,15 @@ Procedure FillChar(var x;count:SizeInt;value:byte);assembler;nostackframe;
|
|
.balign 16
|
|
.balign 16
|
|
.Lloop64nti:
|
|
.Lloop64nti:
|
|
add $64, %rcx
|
|
add $64, %rcx
|
|
- movntiq %r8, -64(%rcx)
|
|
|
|
- movntiq %r8, -56(%rcx)
|
|
|
|
- movntiq %r8, -48(%rcx)
|
|
|
|
- movntiq %r8, -40(%rcx)
|
|
|
|
|
|
+ movnti %r8, -64(%rcx)
|
|
|
|
+ movnti %r8, -56(%rcx)
|
|
|
|
+ movnti %r8, -48(%rcx)
|
|
|
|
+ movnti %r8, -40(%rcx)
|
|
dec %rax
|
|
dec %rax
|
|
- movntiq %r8, -32(%rcx)
|
|
|
|
- movntiq %r8, -24(%rcx)
|
|
|
|
- movntiq %r8, -16(%rcx)
|
|
|
|
- movntiq %r8, -8(%rcx)
|
|
|
|
|
|
+ movnti %r8, -32(%rcx)
|
|
|
|
+ movnti %r8, -24(%rcx)
|
|
|
|
+ movnti %r8, -16(%rcx)
|
|
|
|
+ movnti %r8, -8(%rcx)
|
|
jnz .Lloop64nti
|
|
jnz .Lloop64nti
|
|
mfence
|
|
mfence
|
|
jmp .Lless64
|
|
jmp .Lless64
|
|
@@ -627,6 +633,8 @@ asm
|
|
end;
|
|
end;
|
|
{$endif FPC_SYSTEM_HAS_INDEXWORD}
|
|
{$endif FPC_SYSTEM_HAS_INDEXWORD}
|
|
|
|
|
|
|
|
+{$endif freebsd}
|
|
|
|
+
|
|
{$asmmode att}
|
|
{$asmmode att}
|
|
{$define FPC_SYSTEM_HAS_DECLOCKED_LONGINT}
|
|
{$define FPC_SYSTEM_HAS_DECLOCKED_LONGINT}
|
|
{ does a thread save inc/dec }
|
|
{ does a thread save inc/dec }
|