Also I just raised an internal error on the trunk:

program m128test;

type
  UnalignedArray = array[0..1] of Double;

function Test3(V1, V2: UnalignedArray): UnalignedArray; vectorcall;
begin
  Test3[1] := V1[1] + V2[1];
end;

begin
end.

Compiler fails with "m128.pp(7,1) Fatal: Internal error 200410108" under x86_64-win64 (location (7,1) is the "begin" keyword).  I'll be making a bug report of this as a reminder that I need to fix it.  In this situation, the error does not occur if 'vectorcall' is omitted, and the correct behaviour is that the result and parameters aren't vectorised because they aren't aligned to a 16-byte boundary.

(On a side note, I'd ask if it's permissible to add support for "align 16" and the like for regular types and not just records. For example, "type UnalignedArray = array[0..1] of Double align 16;", which is essentially __m128d).

Gareth aka. Kit

On 08/04/2022 18:57, J. Gareth Moreton via fpc-devel wrote:
It looks like support for writing to arrays that are wholly stored in registers is a little limited and buggy - while it writes to temporary memory when modifying an individual element, the compiler sometimes doesn't write back the final result into the original register.  I'm seeing if I can fix it.

Gareth aka. Kit



--
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to