mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-14 04:19:28 +02:00
62 lines
1.0 KiB
ObjectPascal
62 lines
1.0 KiB
ObjectPascal
{ %cpu=x86_64 }
|
|
{ %skiptarget=android }
|
|
{ %opt=-Cg- }
|
|
|
|
|
|
var
|
|
f1, f2, f3: int64;
|
|
begin
|
|
{$asmmode att}
|
|
asm
|
|
// set alignment check flag so at least one flag in the upper 16 bits
|
|
// is set
|
|
pushfq
|
|
popq %rax
|
|
orq $(1 << 18), %rax
|
|
pushq %rax
|
|
popfq
|
|
|
|
// should be same as pushfq in AT&T mode
|
|
xorq %rax, %rax
|
|
pushfw
|
|
popw %ax
|
|
movq %rax, f1(%rip)
|
|
pushf
|
|
popq %rax
|
|
movq %rax, f2(%rip)
|
|
pushfq
|
|
popq %rax
|
|
movq %rax, f3(%rip)
|
|
end;
|
|
if (f1 > high(word)) then
|
|
halt(1);
|
|
if (f2 < high(word)) or
|
|
((f2 and high(word))<>f1) then
|
|
halt(2);
|
|
if (f3 <> f2) then
|
|
halt(3);
|
|
f1:=0;
|
|
f2:=0;
|
|
{$asmmode intel}
|
|
asm
|
|
// should be same as pushfw in Intel mode
|
|
xor rax, rax
|
|
pushf
|
|
pop ax
|
|
mov [f1 + rip], rax
|
|
pushfq
|
|
pop rax
|
|
mov [f2 + rip], rax
|
|
|
|
// clear alignment check flag again to be safe
|
|
and rax, not(1 shl 18)
|
|
push rax
|
|
popfq
|
|
end;
|
|
if (f1 > high(word)) then
|
|
halt(4);
|
|
if (f2 < high(word)) or
|
|
((f2 and high(word))<>f1) then
|
|
halt(5);
|
|
end.
|