瀏覽代碼

+ Aarch64: trgcpu.get_spill_subreg: return MM sub register correctly, resolves #37393

git-svn-id: trunk@45814 -
florian 5 年之前
父節點
當前提交
13cb57b2c3
共有 3 個文件被更改,包括 25 次插入0 次删除
  1. 1 0
      .gitattributes
  2. 10 0
      compiler/aarch64/rgcpu.pas
  3. 14 0
      tests/webtbs/tw37393.pp

+ 1 - 0
.gitattributes

@@ -18379,6 +18379,7 @@ tests/webtbs/tw37301.pp svneol=native#text/pascal
 tests/webtbs/tw37322.pp svneol=native#text/pascal
 tests/webtbs/tw37323.pp svneol=native#text/pascal
 tests/webtbs/tw37339.pp svneol=native#text/pascal
+tests/webtbs/tw37393.pp svneol=native#text/pascal
 tests/webtbs/tw3742.pp svneol=native#text/plain
 tests/webtbs/tw3751.pp svneol=native#text/plain
 tests/webtbs/tw3758.pp svneol=native#text/plain

+ 10 - 0
compiler/aarch64/rgcpu.pas

@@ -36,6 +36,7 @@ unit rgcpu;
       trgcpu=class(trgobj)
         procedure do_spill_read(list: TAsmList; pos: tai; const spilltemp: treference; tempreg: tregister; orgsupreg: tsuperregister); override;
         procedure do_spill_written(list: TAsmList; pos: tai; const spilltemp: treference; tempreg: tregister; orgsupreg: tsuperregister); override;
+        function get_spill_subreg(r: tregister): tsubregister; override;
        protected
         procedure do_spill_op(list: tasmlist; op: tasmop; pos: tai; const spilltemp: treference; tempreg: tregister; orgsupreg: tsuperregister);
       end;
@@ -51,6 +52,15 @@ implementation
       verbose,cutils,
       cgobj;
 
+    function  trgcpu.get_spill_subreg(r:tregister) : tsubregister;
+      begin
+        if (getregtype(r)<>R_MMREGISTER) then
+          result:=defaultsub
+        else
+          result:=getsubreg(r);
+      end;
+
+
     procedure trgcpu.do_spill_read(list: TAsmList; pos: tai; const spilltemp: treference; tempreg: tregister; orgsupreg: tsuperregister);
       begin
         do_spill_op(list,A_LDR,pos,spilltemp,tempreg,orgsupreg);

+ 14 - 0
tests/webtbs/tw37393.pp

@@ -0,0 +1,14 @@
+{ %OPT=-O2 }
+program fx;
+procedure rep9(a,b,c,d, e,f,g,h, i,j,k,l: single);
+begin
+	writeln(a, ' ', b, ' ', c, ' ', d);
+	writeln(e, ' ', f, ' ', g, ' ', h);
+	writeln(i, ' ', j, ' ', k, ' ', l);
+    if (i<>9) or (j<>10) or (k<>11) or (l<>12) then
+       halt(1);
+end;
+begin
+	rep9(1,2,3,4,5,6,7,8,9,10,11,12);
+    writeln('ok');
+end.