Hi to all i want to update my vector math lib here :
https://github.com/jdelauney/SIMD-VectorMath-UnitTest for FPC 3.0.4 to fpc 3.1.x min and up.
Actually i have Lazarus 2.1 with fpc 3.3.1 SVN Rev 61197 installed
So. Actually i'm declaring my record for 2D Integer vector, as is (same way for 2D Single, Double Vector, 4D Single,.....
Type
TBZVector2iType = packed array[0..1] of Integer; //< Tableau aligné pour les vecteurs 2D Integer
{ TBZVector2i : Vecteur 2D Integer }
TBZVector2i = record
{ Initialisation des valeurs X et Y value }
procedure Create(aX, aY:Integer); overload;
{ Retourne une chaine de caractères formaté représentant le vecteur : '(x, y)' }
function ToString : String;
{ Ajoute deux vecteurs TBZVector2i
Exemple (V1, V2 et resultat sont des variables de type TBZVector2i :
Resultat := V1 + V2;}
class operator +(constref A, B: TBZVector2i): TBZVector2i; overload;
{ Ajoute un vecteurs TBZVector2i avec une variable de type Integer
Exemple (V12 et resultat sont des variables de type TBZVector2i, I est de type Integer :
Resultat := V1 + I ;}
class operator +(constref A: TBZVector2i; constref B:Integer): TBZVector2i; overload;
{ Ajoute une variable de type Single a un vecteurs TBZVector2i avec
Exemple (V12 et resultat sont des variables de type TBZVector2i, I est de type Single :
Resultat := V1 div I ;}
class operator +(constref A: TBZVector2i; constref B:Single): TBZVector2i; overload;
.....
function Abs:TBZVector2i;overload;
case Byte of
0: (V: TBZVector2iType);
1: (X, Y : Integer);
2: (Width, Height : Integer);
end;
and currently, with FPC 3.0.4 I have the following implementation :
class operator TBZVector2i.+(constref A, B: TBZVector2i): TBZVector2i;assembler; nostackframe;register;
asm
movq xmm0, [A]
movq xmm1, [B]
paddd xmm0, xmm1
movq RAX, {%H-}xmm0
end;
class operator TBZVector2i.+(constref A: TBZVector2i; constref B:Single): TBZVector2i; assembler; nostackframe; register;
asm
movq xmm0, [A]
movq xmm1, [B]
pshufd xmm1, xmm1, $00
paddd xmm0, xmm1
movq RAX, {%H-}xmm0
end;
class operator TBZVector2i.+(constref A: TBZVector2i; constref B:Integer): TBZVector2i; assembler; nostackframe; register;
asm
movq xmm0, [A]
movq xmm1, [B]
pshufd xmm1, xmm1, $00
paddd xmm0, xmm1
movq RAX, {%H-}xmm0
end;
With FPC 3.3.1 i would like to implement
VectorCallso i did this
{$IF fpc_fullversion >= 030100}
{$DEFINE USE_VECTORCALL}
{$ENDIF}
class operator TBZVector2i.+(constref A, B: TBZVector2i): TBZVector2i; {$ifdef USE_VECTORCALL} vectorcall {$else} register; {$endif} assembler; nostackframe;
asm
{$ifndef USE_VECTORCALL}
movq xmm0, [A]
movq xmm1, [B]
{$endif}
paddd xmm0, xmm1
movq RAX, {%H-}xmm0
end;
class operator TBZVector2i.+(constref A: TBZVector2i; constref B:Single): TBZVector2i; {$ifdef USE_VECTORCALL} vectorcall {$else} register; {$endif} assembler; nostackframe;
asm
{$ifndef USE_VECTORCALL}
movq xmm0, [A]
movq xmm1, [B]
{$endif}
pshufd xmm1, xmm1, $00
paddd xmm0, xmm1
{.$ifndef USE_VECTORCALL}
movq RAX, {%H-}xmm0
{.$endif}
end;
class operator TBZVector2i.+(constref A: TBZVector2i; constref B:Integer): TBZVector2i; {$ifdef USE_VECTORCALL} vectorcall {$else} register; {$endif} assembler; nostackframe;
asm
{$ifndef USE_VECTORCALL}
movq xmm0, [A]
movq xmm1, [B]
{$endif}
pshufd xmm1, xmm1, $00
paddd xmm0, xmm1
movq RAX, {%H-}xmm0
end;
FPC say
vectormath_vector2i_win64_sse_imp.inc(3,28) Error: Calling convention doesn't match forward
BZVectorMath.pas(233,20) Error: Found declaration: operator +(constref TBZVector2i;constref TBZVector2i):<record type>; Static;
BZVectorMath.pas(263,20) Error: Found declaration: operator +(constref TBZVector2i;constref LongInt):<record type>; Static;
BZVectorMath.pas(269,20) Error: Found declaration: operator +(constref TBZVector2i;constref Single):<record type>; Static;
vectormath_vector2i_win64_sse_imp.inc(49,28) Error: Calling convention doesn't match forward
vectormath_vector2i_win64_sse_imp.inc(3,28) Error: Found declaration: operator +(constref TBZVector2i;constref TBZVector2i):<record type>; Register; Static;
BZVectorMath.pas(263,20) Error: Found declaration: operator +(constref TBZVector2i;constref LongInt):<record type>; Static;
BZVectorMath.pas(269,20) Error: Found declaration: operator +(constref TBZVector2i;constref Single):<record type>; Static;
vectormath_vector2i_win64_sse_imp.inc(62,28) Error: Calling convention doesn't match forward
vectormath_vector2i_win64_sse_imp.inc(3,28) Error: Found declaration: operator +(constref TBZVector2i;constref TBZVector2i):<record type>; Register; Static;
BZVectorMath.pas(263,20) Error: Found declaration: operator +(constref TBZVector2i;constref LongInt):<record type>; Static;
vectormath_vector2i_win64_sse_imp.inc(49,28) Error: Found declaration: operator +(constref TBZVector2i;constref Single):<record type>; Register; Static;
So what the correct declaration in interface ?
And for 2D Double vector, I have also this error
class operator TBZVector2d.*(constref A: TBZVector2d; constref B : TBZVector2i): TBZVector2d; assembler; nostackframe; register;
asm
movapd xmm0, [A]
cvtdq2pd xmm2, [B]
mulpd xmm0, xmm2
movapd [Result], xmm0
end;
With FPC 3.3.1
cvtdq2pd xmm2, FPC return
"vectormath_vector2d_win64_sse_imp.inc(30,3) Error: Asm: [cvtdq2pd reg??,mem128] invalid combination of opcode and operands" (Work well with FPC 3.0.4)
Thanks in advance
Best regards