Browse Source

* AArch64: fix spilling integer registers to stack offsets that cannot be
encoded directly into the spilling instructions (second part of
mantis #38053)

git-svn-id: trunk@49207 -

Jonas Maebe 4 years ago
parent
commit
bb977b398d
3 changed files with 75 additions and 3 deletions
  1. 1 0
      .gitattributes
  2. 5 3
      compiler/aarch64/rgcpu.pas
  3. 69 0
      tests/webtbs/tw38053.pp

+ 1 - 0
.gitattributes

@@ -18733,6 +18733,7 @@ tests/webtbs/tw38012.pp svneol=native#text/pascal
 tests/webtbs/tw38022.pp svneol=native#text/pascal
 tests/webtbs/tw3805.pp svneol=native#text/plain
 tests/webtbs/tw38051.pp svneol=native#text/pascal
+tests/webtbs/tw38053.pp svneol=native#text/plain
 tests/webtbs/tw38054.pp svneol=native#text/plain
 tests/webtbs/tw38058.pp svneol=native#text/pascal
 tests/webtbs/tw38069.pp svneol=native#text/pascal

+ 5 - 3
compiler/aarch64/rgcpu.pas

@@ -1,7 +1,7 @@
 {
     Copyright (c) 1998-2002 by Florian Klaempfl
 
-    This unit implements the SPARC specific class for the register
+    This unit implements the AArch64 specific class for the register
     allocator
 
     This program is free software; you can redistribute it and/or modify
@@ -87,8 +87,8 @@ implementation
           begin
             helplist:=TAsmList.create;
 
-            if getregtype(tempreg)=R_INTREGISTER then
-              hreg:=tempreg
+            if (getregtype(tempreg)=R_INTREGISTER) then
+              hreg:=getregisterinline(helplist,[R_SUBWHOLE])
             else
               hreg:=cg.getaddressregister(helplist);
 
@@ -100,6 +100,8 @@ implementation
             else
               helpins:=spilling_create_store(tempreg,tmpref);
             helplist.concat(helpins);
+            if (getregtype(tempreg)=R_INTREGISTER) then
+              ungetregisterinline(helplist,hreg);
             add_cpu_interferences(helpins);
             list.insertlistafter(pos,helplist);
             helplist.free;

+ 69 - 0
tests/webtbs/tw38053.pp

@@ -0,0 +1,69 @@
+{ %opt=-Sg }
+
+program fsz;
+// fpc -OoREGVAR az.pas; ./az
+// fpc -OoNoREGVAR az.pas; ./az
+
+// {$mode delphi}
+{$mode objfpc}
+
+Type
+  ByteRA0 = array [0..0] of byte;
+  Bytep0 = ^ByteRA0;
+TNIFTIhdr =  record //Next: analyze Format Header structure
+   HdrSz : longint; //MUST BE 348
+end;
+
+function readTiff(fnm: string; nhdr: TNIFTIhdr; img: byteP0): string;
+label
+  555;
+type
+  TTIFFhdr =  record
+        Compression, ImageHeight, ImageWidth,
+        NewSubfileType: uint32;
+  end;
+const
+  kMaxIFD = 2200;
+  kVal = 1050090;
+var
+  fsz, i, ok1: integer{int64};
+  jj,w, nTag, nIFD: uint32 {uint64};
+  hdr: array[1..kMaxIFD] of TTIFFhdr;
+begin
+	result := '';
+	fsz := kVal;
+	ok1 := kVal;
+        jj  := kVal;
+        w := kVal;
+        i := kVal;
+        nTag := kVal;
+        nIFD := kVal;
+	writeln('Value ', fsz,' ',ok1,' ',jj,' ',w,' ',i,' ',nTag,' ',nIFD,' -- ', kVal);
+        if fsz <> kVal then
+          halt(1);
+        if ok1 <> kVal then
+          halt(2);
+        if jj <> kVal then
+          halt(3);
+        if w <> kVal then
+          halt(4);
+        if i <> kVal then
+          halt(5);
+        if nTag <> kVal then
+          halt(6);
+        if nIFD <> kVal then
+          halt(7);
+	555:
+end;
+
+procedure ReportTiff();
+var
+	img: byteP0;
+    nhdr: TNIFTIhdr;
+begin
+  readTiff('xxx', nhdr, img);
+end;
+
+begin
+	ReportTiff();
+end.