Merge remote-tracking branch

'origin/GP-5192_ghintern_aarch64_aapcs_fixes--SQUASHED' (Closes #8016)
This commit is contained in:
Ryan Kurtz 2025-05-08 12:34:13 -04:00
commit 32abab0a3d
2 changed files with 132 additions and 20 deletions

View file

@ -125,11 +125,20 @@
<rule> <rule>
<datatype name="homogeneous-float-aggregate"/> <datatype name="homogeneous-float-aggregate"/>
<join_per_primitive storage="float"/> <join_per_primitive storage="float"/>
</rule>
<rule>
<datatype name="homogeneous-float-aggregate"/>
<goto_stack/> <!-- Don't consume general purpose registers -->
<consume_extra storage="float"/> <!-- Once the stack has been used, don't go back to registers -->
</rule> </rule>
<rule> <rule>
<datatype name="struct" minsize="17"/> <datatype name="struct" minsize="17"/>
<convert_to_ptr/> <convert_to_ptr/>
</rule> </rule>
<rule>
<datatype name="union" minsize="17"/>
<convert_to_ptr/>
</rule>
<rule> <rule>
<datatype name="float"/> <datatype name="float"/>
<consume storage="float"/> <consume storage="float"/>
@ -147,16 +156,37 @@
<pentry minsize="1" maxsize="16" storage="float"> <pentry minsize="1" maxsize="16" storage="float">
<register name="q0"/> <register name="q0"/>
</pentry> </pentry>
<pentry minsize="1" maxsize="16" storage="float">
<register name="q1"/>
</pentry>
<pentry minsize="1" maxsize="16" storage="float">
<register name="q2"/>
</pentry>
<pentry minsize="1" maxsize="16" storage="float">
<register name="q3"/>
</pentry>
<pentry minsize="1" maxsize="8" extension="zero"> <pentry minsize="1" maxsize="8" extension="zero">
<register name="x0"/> <register name="x0"/>
</pentry> </pentry>
<pentry minsize="9" maxsize="16" extension="zero"> <pentry minsize="1" maxsize="8" extension="zero">
<addr space="join" piece1="x1" piece2="x0"/> <register name="x1"/>
</pentry> </pentry>
<rule>
<datatype name="homogeneous-float-aggregate"/>
<join_per_primitive storage="float"/>
</rule>
<rule>
<datatype name="float"/>
<consume storage="float"/>
</rule>
<rule> <rule>
<datatype name="any" minsize="17"/> <datatype name="any" minsize="17"/>
<hidden_return voidlock="true"/> <hidden_return voidlock="true"/>
</rule> </rule>
<rule>
<datatype name="any"/>
<join/>
</rule>
</output> </output>
<unaffected> <unaffected>
<register name="x19"/> <register name="x19"/>

View file

@ -74,29 +74,32 @@
<default_proto> <default_proto>
<prototype name="__cdecl" extrapop="0" stackshift="0"> <prototype name="__cdecl" extrapop="0" stackshift="0">
<input> <input>
<pentry minsize="1" maxsize="8" metatype="float"> <pentry minsize="8" maxsize="8" storage="hiddenret">
<register name="d0"/> <register name="x8"/>
</pentry> </pentry>
<pentry minsize="1" maxsize="8" metatype="float"> <pentry minsize="1" maxsize="16" storage="float">
<register name="d1"/> <register name="q0"/>
</pentry> </pentry>
<pentry minsize="1" maxsize="8" metatype="float"> <pentry minsize="1" maxsize="16" storage="float">
<register name="d2"/> <register name="q1"/>
</pentry> </pentry>
<pentry minsize="1" maxsize="8" metatype="float"> <pentry minsize="1" maxsize="16" storage="float">
<register name="d3"/> <register name="q2"/>
</pentry> </pentry>
<pentry minsize="1" maxsize="8" metatype="float"> <pentry minsize="1" maxsize="16" storage="float">
<register name="d4"/> <register name="q3"/>
</pentry> </pentry>
<pentry minsize="1" maxsize="8" metatype="float"> <pentry minsize="1" maxsize="16" storage="float">
<register name="d5"/> <register name="q4"/>
</pentry> </pentry>
<pentry minsize="1" maxsize="8" metatype="float"> <pentry minsize="1" maxsize="16" storage="float">
<register name="d6"/> <register name="q5"/>
</pentry> </pentry>
<pentry minsize="1" maxsize="8" metatype="float"> <pentry minsize="1" maxsize="16" storage="float">
<register name="d7"/> <register name="q6"/>
</pentry>
<pentry minsize="1" maxsize="16" storage="float">
<register name="q7"/>
</pentry> </pentry>
<pentry minsize="1" maxsize="8" extension="zero"> <pentry minsize="1" maxsize="8" extension="zero">
<register name="x0"/> <register name="x0"/>
@ -125,14 +128,93 @@
<pentry minsize="1" maxsize="500" align="8"> <pentry minsize="1" maxsize="500" align="8">
<addr offset="0" space="stack"/> <addr offset="0" space="stack"/>
</pentry> </pentry>
<!-- Variadic functions do not use floating-point registers -->
<rule>
<datatype name="float"/>
<varargs/>
<join align="true"/>
</rule>
<rule>
<datatype name="float"/>
<varargs/>
<goto_stack/>
</rule>
<!-- Homogeneous float aggregates become regular structs in variadic calls -->
<rule>
<datatype name="homogeneous-float-aggregate" maxsize="16"/>
<varargs/>
<join align="true"/>
</rule>
<rule>
<datatype name="homogeneous-float-aggregate" minsize="17"/>
<varargs/>
<convert_to_ptr/>
</rule>
<rule>
<datatype name="homogeneous-float-aggregate"/>
<join_per_primitive storage="float"/>
</rule>
<rule>
<datatype name="homogeneous-float-aggregate"/>
<goto_stack/> <!-- Don't consume general purpose registers -->
<consume_extra storage="float"/> <!-- Once the stack has been used, don't go back to registers -->
</rule>
<rule>
<datatype name="float"/>
<consume storage="float"/>
</rule>
<rule>
<datatype name="float"/>
<goto_stack/> <!-- Don't consume general purpose registers -->
</rule>
<rule>
<datatype name="struct" minsize="17"/>
<convert_to_ptr/>
</rule>
<rule>
<datatype name="union" minsize="17"/>
<convert_to_ptr/>
</rule>
<rule>
<datatype name="any"/>
<join align="true"/> <!-- Chunk from general purpose registers -->
</rule>
</input> </input>
<output> <output>
<pentry minsize="1" maxsize="8" metatype="float"> <pentry minsize="1" maxsize="16" storage="float">
<register name="d0"/> <register name="q0"/>
</pentry>
<pentry minsize="1" maxsize="16" storage="float">
<register name="q1"/>
</pentry>
<pentry minsize="1" maxsize="16" storage="float">
<register name="q2"/>
</pentry>
<pentry minsize="1" maxsize="16" storage="float">
<register name="q3"/>
</pentry> </pentry>
<pentry minsize="1" maxsize="8" extension="zero"> <pentry minsize="1" maxsize="8" extension="zero">
<register name="x0"/> <register name="x0"/>
</pentry> </pentry>
<pentry minsize="1" maxsize="8" extension="zero">
<register name="x1"/>
</pentry>
<rule>
<datatype name="homogeneous-float-aggregate"/>
<join_per_primitive storage="float"/>
</rule>
<rule>
<datatype name="float"/>
<consume storage="float"/>
</rule>
<rule>
<datatype name="any" minsize="17"/>
<hidden_return voidlock="true"/>
</rule>
<rule>
<datatype name="any"/>
<join/>
</rule>
</output> </output>
<unaffected> <unaffected>
<register name="x19"/> <register name="x19"/>