mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-06 23:28:28 +02:00
78 lines
1.4 KiB
ObjectPascal
78 lines
1.4 KiB
ObjectPascal
{ %cpu=i386,x86_64 }
|
|
{ %opt=-Sew -vw }
|
|
{$mode objfpc}
|
|
uses cpu;
|
|
|
|
{$asmmode att}
|
|
procedure test1; assembler;
|
|
var
|
|
s: single;
|
|
asm
|
|
vmovss s, %xmm6
|
|
vmovss %xmm6, s
|
|
{$ifdef cpui386}
|
|
vmovss (%eax, %edx), %xmm7
|
|
vmovss %xmm7, (%eax, %edx)
|
|
{$endif}
|
|
{$ifdef cpux86_64}
|
|
vmovss (%rax, %rdx), %xmm7
|
|
vmovss %xmm7, (%rax, %rdx)
|
|
{$endif}
|
|
end;
|
|
|
|
{$asmmode intel}
|
|
procedure test2; assembler;
|
|
var
|
|
s: single;
|
|
asm
|
|
vmovss [s], xmm6
|
|
vmovss xmm6, [s]
|
|
{$ifdef cpui386}
|
|
vmovss [eax+edx], xmm7
|
|
vmovss xmm7, [eax+edx]
|
|
{$endif}
|
|
{$ifdef cpux86_64}
|
|
vmovss [rax+rdx], xmm7
|
|
vmovss xmm7, [rax+rdx]
|
|
{$endif}
|
|
end;
|
|
|
|
|
|
type
|
|
TVector4 = packed record
|
|
X, Y, Z, W: Single;
|
|
end;
|
|
|
|
function _VectorDotProductAVX(Vector1, Vector2: TVector4): Single; assembler;
|
|
asm
|
|
{$if defined(cpux86_64) and not(defined(win64))}
|
|
VMOVLHPS XMM0,XMM0,XMM1
|
|
VMOVLHPS XMM1,XMM2,XMM3
|
|
{$else defined(cpux86_64) and not(defined(win64))}
|
|
VMOVUPS XMM0, [Vector1]
|
|
VMOVUPS XMM1, [Vector2]
|
|
{$endif defined(cpux86_64) and not(defined(win64))}
|
|
VDPPS XMM0, XMM0, XMM1, $71 { Only perform calculations on the X, Y and Z coordinates; only store result in the first element }
|
|
VMOVSS Result, XMM0 { Store result - first element of XMM0 }
|
|
end;
|
|
|
|
var
|
|
v: tvector4;
|
|
r: single;
|
|
begin
|
|
v.x:=1;
|
|
v.y:=1;
|
|
v.z:=1;
|
|
v.w:=1;
|
|
if AVXSupport then
|
|
begin
|
|
r:=_vectordotproductavx(v,v);
|
|
if r<>3 then
|
|
halt(1);
|
|
writeln('ok');
|
|
end
|
|
else
|
|
writeln('No AVX support');
|
|
end.
|
|
|