summaryrefslogtreecommitdiff
path: root/compiler/powerpc64/symcpu.pas
diff options
context:
space:
mode:
authorjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2015-03-14 18:35:38 +0000
committerjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2015-03-14 18:35:38 +0000
commite8d79c84a26e282fe91409570365e897d4770793 (patch)
tree5b3257edacf1ffab3be2d6ef5e9f899ca646bfc8 /compiler/powerpc64/symcpu.pas
parent3a55b3a14dc8e2c6f859364a6934425187112a0f (diff)
downloadfpc-e8d79c84a26e282fe91409570365e897d4770793.tar.gz
* pass records that (recursively) only contain floating point values of the
same type (even in other records or in arrays), with 8 or less such values, as if those values were passed individually on ppc64/ELFv2 git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@30200 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/powerpc64/symcpu.pas')
-rw-r--r--compiler/powerpc64/symcpu.pas48
1 files changed, 48 insertions, 0 deletions
diff --git a/compiler/powerpc64/symcpu.pas b/compiler/powerpc64/symcpu.pas
index d252b9897a..12e14ca87f 100644
--- a/compiler/powerpc64/symcpu.pas
+++ b/compiler/powerpc64/symcpu.pas
@@ -59,6 +59,10 @@ type
tcpupointerdefclass = class of tcpupointerdef;
tcpurecorddef = class(trecorddef)
+ { returns whether the record's elements (including arrays) all have
+ the same floating point or vector type; returns that type in the "def"
+ parameter if so }
+ function has_single_type_elfv2(out def: tdef): boolean;
end;
tcpurecorddefclass = class of tcpurecorddef;
@@ -170,6 +174,50 @@ const
implementation
+ uses
+ symconst, defutil, defcmp;
+
+{ tcpurecorddef }
+
+ function tcpurecorddef.has_single_type_elfv2(out def: tdef): boolean;
+ var
+ i: longint;
+ checkdef, tmpdef: tdef;
+ begin
+ def:=nil;
+ tmpdef:=nil;
+ result:=false;
+ for i:=0 to symtable.SymList.Count-1 do
+ begin
+ if tsym(symtable.symlist[i]).typ=fieldvarsym then
+ begin
+ checkdef:=tfieldvarsym(symtable.symlist[i]).vardef;
+ repeat
+ case checkdef.typ of
+ floatdef:
+ ;
+ arraydef:
+ if not is_special_array(checkdef) then
+ checkdef:=tarraydef(checkdef).elementdef
+ else
+ exit;
+ recorddef:
+ if not tcpurecorddef(checkdef).has_single_type_elfv2(checkdef) then
+ exit;
+ else
+ exit;
+ end;
+ until checkdef.typ=floatdef;
+ if not assigned(def) then
+ def:=checkdef
+ else if not equal_defs(def,checkdef) then
+ exit;
+ end;
+ end;
+ if assigned(def) then
+ result:=true;
+ end;
+
begin
{ used tdef classes }
cfiledef:=tcpufiledef;