mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-06 20:47:53 +02:00
68 lines
1.4 KiB
ObjectPascal
68 lines
1.4 KiB
ObjectPascal
{ %cpu=i386,x86_64 }
|
|
|
|
{$asmmode att}
|
|
{$ifdef cpui386}
|
|
{$warn 7104 off} //"Using -offset(%ebp) is not recommended"
|
|
procedure test_i386; assembler; nostackframe;
|
|
asm
|
|
vmovd %xmm0, -16(%ebp)
|
|
vmovd -16(%ebp), %xmm0
|
|
|
|
vmovq %xmm6, -16(%ebp)
|
|
vmovq -16(%ebp), %xmm6
|
|
vmovq %xmm0, %xmm2
|
|
end;
|
|
|
|
const
|
|
expected_i386: array[0..23] of byte = (
|
|
$C5,$F9,$7E,$45,$F0,
|
|
$C5,$F9,$6E,$45,$F0,
|
|
$C5,$F9,$D6,$75,$F0,
|
|
$C5,$FA,$7E,$75,$F0,
|
|
$C5,$FA,$7E,$D0
|
|
);
|
|
{$endif}
|
|
|
|
{$ifdef cpux86_64}
|
|
procedure test_x86_64; assembler; nostackframe;
|
|
asm
|
|
vmovq 0x12345678(%rip), %xmm0
|
|
vmovq %xmm0, 0x12345678(%rip)
|
|
vmovq %xmm1, %xmm0
|
|
vmovq %rax, %xmm0
|
|
vmovq %xmm0, %rax
|
|
end;
|
|
|
|
const
|
|
expected_x86_64: array[0..29] of byte = (
|
|
$C5,$FA,$7E,$05,$78,$56,$34,$12,
|
|
$C5,$F9,$D6,$05,$78,$56,$34,$12,
|
|
$C5,$FA,$7E,$C1,
|
|
$C4,$E1,$F9,$6E,$C0,
|
|
$C4,$E1,$F9,$7E,$C0
|
|
);
|
|
{$endif}
|
|
|
|
|
|
procedure check(const id: string; const expected: array of byte; p: pointer);
|
|
var
|
|
i : longint;
|
|
begin
|
|
for i:=0 to high(expected) do
|
|
if expected[i]<>pbyte(p)[i] then
|
|
begin
|
|
writeln(id, ' mismatch at offset $',hexstr(i,4), ', expected=$',hexstr(expected[i],2),' actual=$',hexstr(pbyte(p)[i],2));
|
|
halt(1);
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
{$ifdef cpux86_64}
|
|
check('x86_64',expected_x86_64,@test_x86_64);
|
|
{$endif}
|
|
{$ifdef cpui386}
|
|
check('i386',expected_i386,@test_i386);
|
|
{$endif}
|
|
writeln('ok');
|
|
end.
|