[fpc-devel] Problems with MM types (__m128 etc).

Sven Barth pascaldragon at googlemail.com
Wed Apr 6 21:09:29 CEST 2022

Am 06.04.2022 um 20:32 schrieb J. Gareth Moreton via fpc-devel:
> Another problem... I've tried to declare an ADDPD intrinsic as follows:
> function x86_addpd(r0, r1: __m128d): __m128d; [INTERNPROC: 
> fpc_in_x86_addpd];
> I thought using __m128d instead of __m128 was fairly logical since 
> ADDPD works with Doubles, not Singles, but this can cause problems.  
> For example, with the following setup:
>     function Special(z1, z2 : __m128d): __m128d; vectorcall;
>       begin
>         Special := x86_addpd(z1, z2);
>       end;
> I get the following: Error: Incompatible types: got "__m128" expected 
> "__m128d" (the file location is between the closing bracket and the 
> semicolon of "Special := x86_addpd(z1, z2);" - it seems that it's 
> hard-coded to expect __m128 (error occurs even if vectorcall is not 
> specified).
> I know there's still some work to do and things to work out with the 
> vector types and intrinsics.  I will admit that personally I don't 
> like Microsoft Visual C++'s approach of forcing the use of the MM 
> types because it feels inflexible and unfriendly, especially as you 
> might, for example, want to declare and use something like the following?
> type TVector4 = packed record
>   X, Y, Z, W: Single;
> end align 16;

Pascal simply is a strongly typed language. Vector intrinsics are no 
reason to weaken this. Thus you need to declare operator overloads that 
hide the nitty, gritty details of assigning a TVector4 to a __m128, e.g.:

   TVector4 = packed record
     X, Y, Z, W: Single;
     class operator := (const aArg: TVector4): __m128;
     class operator := (const aArg: __m128): TVector4;


More information about the fpc-devel mailing list