diff options
author | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2015-03-14 18:35:38 +0000 |
---|---|---|
committer | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2015-03-14 18:35:38 +0000 |
commit | e8d79c84a26e282fe91409570365e897d4770793 (patch) | |
tree | 5b3257edacf1ffab3be2d6ef5e9f899ca646bfc8 /compiler/powerpc64/symcpu.pas | |
parent | 3a55b3a14dc8e2c6f859364a6934425187112a0f (diff) | |
download | fpc-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.pas | 48 |
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; |