Просмотр исходного кода

* Aarch64: allow differently size arangement specifiers, resolves #41468

florian 1 месяц назад
Родитель
Сommit
e833e5b7c6
2 измененных файлов с 23 добавлено и 6 удалено
  1. 15 6
      compiler/aarch64/racpugas.pas
  2. 8 0
      tests/webtbs/tw41468.pp

+ 15 - 6
compiler/aarch64/racpugas.pas

@@ -793,13 +793,22 @@ Unit racpugas;
             begin
               subreg:=ParseArrangementSpecifier(upper(actasmpattern));
               if (subreg<>R_SUBNONE) and
-                 (getregtype(result)=R_MMREGISTER) and
-                 ((actinsmmsubreg=R_SUBNONE) or
-                  (actinsmmsubreg=subreg)) then
+                (getregtype(result)=R_MMREGISTER) then
                 begin
-                  setsubreg(result,subreg);
-                  { they all have to be the same }
-                  actinsmmsubreg:=subreg;
+                  if ((actinsmmsubreg=R_SUBNONE) or
+                    (actinsmmsubreg=subreg)) then
+                    begin
+                      setsubreg(result,subreg);
+                      { they all have to be the same }
+                      actinsmmsubreg:=subreg;
+                    end
+                  else if (actopcode=A_SHRN) or (actopcode=A_SHRN2) then
+                    begin
+                      { shrn, shrn2 allow combinations of different sizes ]}
+                      setsubreg(result,subreg);
+                    end
+                  else
+                    Message1(asmr_e_invalid_arrangement,actasmpattern);
                 end
               else
                 Message1(asmr_e_invalid_arrangement,actasmpattern);

+ 8 - 0
tests/webtbs/tw41468.pp

@@ -0,0 +1,8 @@
+{ %cpu=aarch64 }
+procedure Foo;assembler;
+asm
+  shrn v3.8b,v2.8h,#4 //Invalid arrangement specifier ".8h"
+end;
+
+begin
+end.