GP-4030: Fix MIPS base and eabi 32/64-bit cspecs

GP-4029: Update base PowerPC 32/64-bit cspecs
This commit is contained in:
ghintern
2025-02-25 20:50:19 +00:00
committed by James
parent 12ac4660a1
commit d91aebe74e
26 changed files with 1234 additions and 488 deletions

View File

@@ -12,7 +12,7 @@
<description>MIPS32 32-bit addresses, big endian, with mips16e</description>
<compiler name="default" spec="mips32be.cspec" id="default"/>
<compiler name="Visual Studio" spec="mips32be.cspec" id="windows"/>
<compiler name="eabi" spec="mips32be_eabi.cspec" id="eabi"/>
<compiler name="eabi" spec="mips32_eabi.cspec" id="eabi"/>
<external_name tool="gnu" name="mips:3000"/>
<external_name tool="gnu" name="mips:4000"/>
<external_name tool="IDA-PRO" name="mipsb"/>
@@ -32,7 +32,7 @@
<description>MIPS32 32-bit addresses, little endian, with mips16e</description>
<compiler name="default" spec="mips32le.cspec" id="default"/>
<compiler name="Visual Studio" spec="mips32le.cspec" id="windows"/>
<compiler name="eabi" spec="mips32le_eabi.cspec" id="eabi"/>
<compiler name="eabi" spec="mips32_eabi.cspec" id="eabi"/>
<external_name tool="gnu" name="mips:3000"/>
<external_name tool="gnu" name="mips:4000"/>
<external_name tool="IDA-PRO" name="mipsl"/>
@@ -82,7 +82,7 @@
manualindexfile="../manuals/mipsM16.idx"
id="MIPS:BE:64:default">
<description>MIPS64 64-bit addresses, big endian, with mips16e</description>
<compiler name="default" spec="mips64.cspec" id="default"/>
<compiler name="default" spec="mips64be.cspec" id="default"/>
<external_name tool="gnu" name="mips:5000"/>
<external_name tool="IDA-PRO" name="mipsb"/>
<external_name tool="IDA-PRO" name="r5900r"/>
@@ -100,8 +100,8 @@
manualindexfile="../manuals/mipsM16.idx"
id="MIPS:LE:64:default">
<description>MIPS64 64-bit addreses, little endian, with mips16e</description>
<compiler name="default" spec="mips64.cspec" id="default"/>
<compiler name="Visual Studio" spec="mips64.cspec" id="windows"/>
<compiler name="default" spec="mips64le.cspec" id="default"/>
<compiler name="Visual Studio" spec="mips64le.cspec" id="windows"/>
<external_name tool="gnu" name="mips:5000"/>
<external_name tool="IDA-PRO" name="mipsl"/>
<external_name tool="IDA-PRO" name="r5900l"/>
@@ -119,7 +119,7 @@
manualindexfile="../manuals/mipsMic.idx"
id="MIPS:BE:64:micro">
<description>MIPS64 64-bit addresses, big endian, with microMIPS</description>
<compiler name="default" spec="mips64.cspec" id="default"/>
<compiler name="default" spec="mips64be.cspec" id="default"/>
<external_name tool="IDA-PRO" name="mipsb"/>
<external_name tool="IDA-PRO" name="r5900r"/>
<external_name tool="DWARF.register.mapping.file" name="mips.dwarf"/>
@@ -134,8 +134,8 @@
manualindexfile="../manuals/mipsMic.idx"
id="MIPS:LE:64:micro">
<description>MIPS64 64-bit addresses, little endian, with microMIPS</description>
<compiler name="default" spec="mips64.cspec" id="default"/>
<compiler name="Visual Studio" spec="mips64.cspec" id="windows"/>
<compiler name="default" spec="mips64le.cspec" id="default"/>
<compiler name="Visual Studio" spec="mips64le.cspec" id="windows"/>
<external_name tool="IDA-PRO" name="mipsl"/>
<external_name tool="IDA-PRO" name="r5900l"/>
<external_name tool="DWARF.register.mapping.file" name="mips.dwarf"/>
@@ -150,7 +150,7 @@
manualindexfile="../manuals/mipsMic.idx"
id="MIPS:BE:64:R6">
<description>MIPS64 Release-6 64-bit addresses, big endian, with microMIPS</description>
<compiler name="default" spec="mips64.cspec" id="default"/>
<compiler name="default" spec="mips64be.cspec" id="default"/>
<external_name tool="IDA-PRO" name="mipsb"/>
<external_name tool="IDA-PRO" name="r5900r"/>
<external_name tool="DWARF.register.mapping.file" name="mips.dwarf"/>
@@ -167,8 +167,8 @@
manualindexfile="../manuals/mipsMic.idx"
id="MIPS:LE:64:R6">
<description>MIPS64 Release-6 64-bit addresses, little endian, with microMIPS</description>
<compiler name="default" spec="mips64.cspec" id="default"/>
<compiler name="Visual Studio" spec="mips64.cspec" id="windows"/>
<compiler name="default" spec="mips64le.cspec" id="default"/>
<compiler name="Visual Studio" spec="mips64le.cspec" id="windows"/>
<external_name tool="IDA-PRO" name="mipsl"/>
<external_name tool="IDA-PRO" name="r5900l"/>
<external_name tool="DWARF.register.mapping.file" name="mips.dwarf"/>

View File

@@ -2,7 +2,12 @@
<compiler_spec>
<data_organization>
<char_size value="1"/>
<short_size value="2"/>
<integer_size value="4"/>
<pointer_size value="4"/>
<long_size value="4"/>
<long_long_size value="8"/>
<float_size value="4" />
<double_size value="8" />
<long_double_size value="8" />
@@ -65,6 +70,34 @@
<pentry minsize="1" maxsize="500" align="4">
<addr offset="0" space="stack"/>
</pentry>
<rule>
<datatype name="homogeneous-float-aggregate" maxprimitives="1"/>
<join_per_primitive storage="float"/>
</rule>
<rule>
<datatype name="homogeneous-float-aggregate" maxprimitives="1"/>
<goto_stack/>
</rule>
<rule>
<datatype name="float"/>
<consume storage="float"/>
</rule>
<rule>
<datatype name="float"/>
<goto_stack/>
</rule>
<rule>
<datatype name="struct" minsize="5"/>
<convert_to_ptr/>
</rule>
<rule>
<datatype name="union" minsize="5"/>
<convert_to_ptr/>
</rule>
<rule>
<datatype name="any"/>
<join align="true"/>
</rule>
</input>
<output>
<pentry minsize="1" maxsize="8" metatype="float">
@@ -73,9 +106,21 @@
<pentry minsize="1" maxsize="4">
<register name="v0"/>
</pentry>
<pentry minsize="5" maxsize="8">
<addr space="join" piece1="v0" piece2="v1"/>
<pentry minsize="1" maxsize="4">
<register name="v1"/>
</pentry>
<rule>
<datatype name="homogeneous-float-aggregate" maxprimitives="1"/>
<join_per_primitive storage="float"/>
</rule>
<rule>
<datatype name="float"/>
<consume storage="float"/>
</rule>
<rule>
<datatype name="any"/>
<join/>
</rule>
</output>
<unaffected>
<register name="s0"/>
@@ -97,21 +142,11 @@
<register name="f30"/>
</unaffected>
<killedbycall>
<register name="at"/>
<register name="a0"/>
<register name="a1"/>
<register name="a2"/>
<register name="a3"/>
<register name="t0"/>
<register name="t1"/>
<register name="t2"/>
<register name="t3"/>
<register name="t4"/>
<register name="t5"/>
<register name="t6"/>
<register name="t7"/>
<register name="t8"/>
<register name="t9"/>
<register name="at"/>
<register name="v0"/>
<register name="v1"/>
<register name="f0"/>
<register name="f1"/>
</killedbycall>
<localrange>
<range space="stack" first="0xfff0bdc0" last="0xffffffff"/>

View File

@@ -25,6 +25,7 @@
</returnaddress>
<default_proto>
<prototype name="__stdcall" extrapop="0" stackshift="0">
<!-- This is based on the System V ABI -->
<input>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f12_13"/>
@@ -47,6 +48,52 @@
<pentry minsize="1" maxsize="500" align="4">
<addr offset="16" space="stack"/>
</pentry>
<!-- Parameters within the ellipses only use integer registers -->
<rule>
<datatype name="float"/>
<varargs first="0"/>
<consume storage="general"/>
</rule>
<!-- special case: first two args are float,double, which produces a 'hole' in the
second word of the argument space, which must be explicitly consumed -->
<rule>
<datatype name="float" minsize="1" maxsize="4"/>
<position index="0"/>
<datatype_at index="1">
<datatype name="float" minsize="5" maxsize="8"/>
</datatype_at>
<consume storage="float"/>
<consume_extra storage="general"/>
<consume_extra storage="general"/>
</rule>
<!-- Only leading floating-point parameters can use float registers -->
<rule>
<datatype name="float" minsize="1" maxsize="8"/> <!-- float parameter -->
<position index="0"/> <!-- as first input parameter -->
<consume storage="float"/> <!-- use f12_f13 -->
<consume_extra storage="general"/>
</rule>
<rule>
<datatype name="float" minsize="1" maxsize="8"/> <!-- float parameter -->
<position index="1"/> <!-- as second input parameter -->
<datatype_at index="0"> <!-- if the first input -->
<datatype name="float" minsize="1" maxsize="8"/> <!-- is a float parameter -->
</datatype_at>
<consume storage="float"/> <!-- use f14_f15 -->
<consume_extra storage="general"/>
</rule>
<rule>
<datatype name="struct"/>
<join align="true" reversejustify="true"/>
</rule>
<rule>
<datatype name="union"/>
<join align="true" reversejustify="true"/>
</rule>
<rule>
<datatype name="any"/> <!-- otherwise any parameter -->
<join align="true"/> <!-- should split across general purpose registers -->
</rule>
</input>
<output>
<pentry minsize="1" maxsize="8" metatype="float">
@@ -55,9 +102,25 @@
<pentry minsize="1" maxsize="4">
<register name="v0"/>
</pentry>
<pentry minsize="5" maxsize="8">
<addr space="join" piece1="v0" piece2="v1"/>
<pentry minsize="1" maxsize="4">
<register name="v1"/>
</pentry>
<rule>
<datatype name="float"/>
<consume storage="float"/>
</rule>
<rule>
<datatype name="struct"/>
<hidden_return/> <!-- structures always passed as hidden return parameter -->
</rule>
<rule>
<datatype name="union"/>
<hidden_return/> <!-- unions always passed as hidden return parameter -->
</rule>
<rule>
<datatype name="any"/>
<join/>
</rule>
</output>
<unaffected>
<register name="s0"/>
@@ -72,12 +135,24 @@
<register name="sp"/>
<register name="gp"/>
<register name="f20"/>
<register name="f21"/>
<register name="f22"/>
<register name="f23"/>
<register name="f24"/>
<register name="f25"/>
<register name="f26"/>
<register name="f27"/>
<register name="f28"/>
<register name="f29"/>
<register name="f30"/>
</unaffected>
<killedbycall>
<register name="at"/>
<register name="v0"/>
<register name="v1"/>
<register name="f0"/>
<register name="f1"/>
</killedbycall>
<internal_storage>
<register name="gp"/> <!-- Compilers may save gp to the stack before a call and restore it afterward -->
</internal_storage>

View File

@@ -47,6 +47,44 @@
<pentry minsize="1" maxsize="500" align="4">
<addr offset="16" space="stack"/>
</pentry>
<!-- Parameters within the ellipses only use integer registers -->
<rule>
<datatype name="float"/>
<varargs first="0"/>
<consume storage="general"/>
</rule>
<!-- special case: first two args are float,double, which produces a 'hole' in the
second word of the argument space, which must be explicitly consumed -->
<rule>
<datatype name="float" minsize="1" maxsize="4"/>
<position index="0"/>
<datatype_at index="1">
<datatype name="float" minsize="5" maxsize="8"/>
</datatype_at>
<consume storage="float"/>
<consume_extra storage="general"/>
<consume_extra storage="general"/>
</rule>
<!-- Only leading floating-point parameters can use float registers -->
<rule>
<datatype name="float" minsize="1" maxsize="8"/> <!-- float parameter -->
<position index="0"/> <!-- as first input parameter -->
<consume storage="float"/> <!-- use f12_f13 -->
<consume_extra storage="general"/>
</rule>
<rule>
<datatype name="float" minsize="1" maxsize="8"/> <!-- float parameter -->
<position index="1"/> <!-- as second input parameter -->
<datatype_at index="0"> <!-- if the first input -->
<datatype name="float" minsize="1" maxsize="8"/> <!-- is a float parameter -->
</datatype_at>
<consume storage="float"/> <!-- use f14_f15 -->
<consume_extra storage="general"/>
</rule>
<rule>
<datatype name="any"/> <!-- otherwise any parameter -->
<join align="true"/> <!-- should split across general purpose registers -->
</rule>
</input>
<output>
<pentry minsize="1" maxsize="8" metatype="float">
@@ -55,9 +93,25 @@
<pentry minsize="1" maxsize="4">
<register name="v0"/>
</pentry>
<pentry minsize="5" maxsize="8">
<addr space="join" piece1="v1" piece2="v0"/>
<pentry minsize="1" maxsize="4">
<register name="v1"/>
</pentry>
<rule>
<datatype name="float"/>
<consume storage="float"/>
</rule>
<rule>
<datatype name="struct"/>
<hidden_return/> <!-- structures always passed as hidden return parameter -->
</rule>
<rule>
<datatype name="union"/>
<hidden_return/> <!-- unions always passed as hidden return parameter -->
</rule>
<rule>
<datatype name="any"/>
<join/>
</rule>
</output>
<unaffected>
<register name="s0"/>
@@ -72,12 +126,24 @@
<register name="sp"/>
<register name="gp"/>
<register name="f20"/>
<register name="f21"/>
<register name="f22"/>
<register name="f23"/>
<register name="f24"/>
<register name="f25"/>
<register name="f26"/>
<register name="f27"/>
<register name="f28"/>
<register name="f29"/>
<register name="f30"/>
</unaffected>
<killedbycall>
<register name="at"/>
<register name="v0"/>
<register name="v1"/>
<register name="f0"/>
<register name="f1"/>
</killedbycall>
<internal_storage>
<register name="gp"/> <!-- Compilers may save gp to the stack before a call and restore it afterward -->
</internal_storage>

View File

@@ -1,123 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<compiler_spec>
<data_organization>
<pointer_size value="4"/>
<float_size value="4" />
<double_size value="8" />
<long_double_size value="8" />
<size_alignment_map>
<entry size="1" alignment="1" />
<entry size="2" alignment="2" />
<entry size="4" alignment="4" />
<entry size="8" alignment="8" />
</size_alignment_map>
</data_organization>
<stackpointer register="sp" space="ram"/>
<funcptr align="2"/>
<global>
<range space="ram"/>
<range space="register" first="0x2000" last="0x2fff"/>
</global>
<returnaddress>
<register name="ra"/>
</returnaddress>
<default_proto>
<prototype name="__stdcall" extrapop="0" stackshift="0">
<input>
<pentry minsize="4" maxsize="8" metatype="float">
<register name="f12_13"/>
</pentry>
<pentry minsize="4" maxsize="8" metatype="float">
<register name="f14_15"/>
</pentry>
<pentry minsize="4" maxsize="8" metatype="float">
<register name="f16_17"/>
</pentry>
<pentry minsize="4" maxsize="8" metatype="float">
<register name="f18_19"/>
</pentry>
<pentry minsize="1" maxsize="4">
<register name="a0"/>
</pentry>
<pentry minsize="1" maxsize="4">
<register name="a1"/>
</pentry>
<pentry minsize="1" maxsize="4">
<register name="a2"/>
</pentry>
<pentry minsize="1" maxsize="4">
<register name="a3"/>
</pentry>
<pentry minsize="1" maxsize="4">
<register name="t0"/>
</pentry>
<pentry minsize="1" maxsize="4">
<register name="t1"/>
</pentry>
<pentry minsize="1" maxsize="4">
<register name="t2"/>
</pentry>
<pentry minsize="1" maxsize="4">
<register name="t3"/>
</pentry>
<pentry minsize="1" maxsize="500" align="4">
<addr offset="0" space="stack"/>
</pentry>
</input>
<output>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f0_1"/>
</pentry>
<pentry minsize="1" maxsize="4">
<register name="v0"/>
</pentry>
<pentry minsize="5" maxsize="8">
<addr space="join" piece1="v1" piece2="v0"/>
</pentry>
</output>
<unaffected>
<register name="s0"/>
<register name="s1"/>
<register name="s2"/>
<register name="s3"/>
<register name="s4"/>
<register name="s5"/>
<register name="s6"/>
<register name="s7"/>
<register name="s8"/>
<register name="sp"/>
<register name="gp"/>
<register name="f20"/>
<register name="f22"/>
<register name="f24"/>
<register name="f26"/>
<register name="f28"/>
<register name="f30"/>
</unaffected>
<killedbycall>
<register name="at"/>
<register name="a0"/>
<register name="a1"/>
<register name="a2"/>
<register name="a3"/>
<register name="t0"/>
<register name="t1"/>
<register name="t2"/>
<register name="t3"/>
<register name="t4"/>
<register name="t5"/>
<register name="t6"/>
<register name="t7"/>
<register name="t8"/>
<register name="t9"/>
</killedbycall>
<localrange>
<range space="stack" first="0xfff0bdc0" last="0xffffffff"/>
<range space="stack" first="0" last="15"/> <!-- This is backup storage space for register params, but we treat as locals -->
</localrange>
</prototype>
</default_proto>
</compiler_spec>

View File

@@ -1,111 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<compiler_spec>
<data_organization>
<pointer_size value="8"/>
<float_size value="4" />
<double_size value="8" />
<long_double_size value="16" />
<size_alignment_map>
<entry size="1" alignment="1" />
<entry size="2" alignment="2" />
<entry size="4" alignment="4" />
<entry size="8" alignment="8" />
</size_alignment_map>
</data_organization>
<stackpointer register="sp" space="ram"/>
<funcptr align="2"/>
<global>
<range space="ram"/>
<range space="register" first="0x2000" last="0x2fff"/>
</global>
<aggressivetrim signext="true"/> <!-- Aggressively try to eliminate sign extensions -->
<default_proto>
<prototype name="__stdcall" extrapop="0" stackshift="0">
<input killedbycall="true">
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f12"/>
</pentry>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f13"/>
</pentry>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f14"/>
</pentry>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f15"/>
</pentry>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f16"/>
</pentry>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f17"/>
</pentry>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f18"/>
</pentry>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f19"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="a0"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="a1"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="a2"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="a3"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="t0"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="t1"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="t2"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="t3"/>
</pentry>
<pentry minsize="1" maxsize="500" align="8">
<addr offset="0" space="stack"/>
</pentry>
</input>
<output>
<pentry minsize="4" maxsize="8" metatype="float">
<register name="f0"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="v0"/>
</pentry>
<pentry minsize="9" maxsize="16">
<addr space="join" piece1="v0" piece2="v1"/>
</pentry>
</output>
<unaffected>
<register name="s0"/>
<register name="s1"/>
<register name="s2"/>
<register name="s3"/>
<register name="s4"/>
<register name="s5"/>
<register name="s6"/>
<register name="s7"/>
<register name="s8"/>
<register name="sp"/>
<register name="gp"/>
<register name="f24"/>
<register name="f25"/>
<register name="f26"/>
<register name="f27"/>
<register name="f28"/>
<register name="f29"/>
<register name="f30"/>
<register name="f31"/>
</unaffected>
</prototype>
</default_proto>
</compiler_spec>

View File

@@ -0,0 +1,189 @@
<?xml version="1.0" encoding="UTF-8"?>
<compiler_spec>
<data_organization>
<pointer_size value="8"/>
<integer_size value="4" />
<long_size value="8" />
<float_size value="4" />
<double_size value="8" />
<long_double_size value="16" />
<size_alignment_map>
<entry size="1" alignment="1" />
<entry size="2" alignment="2" />
<entry size="4" alignment="4" />
<entry size="8" alignment="8" />
</size_alignment_map>
</data_organization>
<stackpointer register="sp" space="ram"/>
<funcptr align="2"/>
<global>
<range space="ram"/>
<range space="register" first="0x2000" last="0x2fff"/>
</global>
<aggressivetrim signext="true"/> <!-- Aggressively try to eliminate sign extensions -->
<default_proto>
<prototype name="__stdcall" extrapop="0" stackshift="0">
<input>
<group>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f12"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="a0"/>
</pentry>
</group>
<group>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f13"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="a1"/>
</pentry>
</group>
<group>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f14"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="a2"/>
</pentry>
</group>
<group>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f15"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="a3"/>
</pentry>
</group>
<group>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f16"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="t0"/>
</pentry>
</group>
<group>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f17"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="t1"/>
</pentry>
</group>
<group>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f18"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="t2"/>
</pentry>
</group>
<group>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f19"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="t3"/>
</pentry>
</group>
<pentry minsize="1" maxsize="500" align="8">
<addr offset="0" space="stack"/>
</pentry>
<rule>
<datatype name="float"/>
<varargs first="0"/>
<join reversejustify="true"/>
</rule>
<rule>
<datatype name="struct"/>
<varargs first="0"/>
<join reversejustify="true"/>
</rule>
<rule>
<datatype name="float"/>
<consume storage="float"/>
</rule>
<rule>
<datatype name="float"/>
<join reversejustify="true"/>
</rule>
<rule>
<datatype name="struct"/>
<join_dual_class stackspill="true" fillalternate="true" reversejustify="true"/>
</rule>
<rule>
<datatype name="union"/>
<join reversejustify="true"/>
</rule>
<rule>
<datatype name="any"/>
<join/>
</rule>
</input>
<output>
<pentry minsize="4" maxsize="8" metatype="float">
<register name="f0"/>
</pentry>
<pentry minsize="4" maxsize="8" metatype="float">
<register name="f2"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="v0"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="v1"/>
</pentry>
<rule>
<datatype name="homogeneous-float-aggregate"/>
<join_per_primitive storage="float"/>
</rule>
<rule>
<datatype name="float"/>
<consume storage="float"/>
</rule>
<rule>
<datatype name="struct"/>
<join reversejustify="true"/>
</rule>
<rule>
<datatype name="union"/>
<join reversejustify="true"/>
</rule>
<rule>
<datatype name="any"/>
<join/>
</rule>
</output>
<unaffected>
<register name="s0"/>
<register name="s1"/>
<register name="s2"/>
<register name="s3"/>
<register name="s4"/>
<register name="s5"/>
<register name="s6"/>
<register name="s7"/>
<register name="s8"/>
<register name="sp"/>
<register name="gp"/>
<register name="f24"/>
<register name="f25"/>
<register name="f26"/>
<register name="f27"/>
<register name="f28"/>
<register name="f29"/>
<register name="f30"/>
<register name="f31"/>
</unaffected>
<killedbycall>
<register name="at"/>
<register name="v0"/>
<register name="v1"/>
<register name="f0"/>
<register name="f2"/>
</killedbycall>
</prototype>
</default_proto>
</compiler_spec>

View File

@@ -0,0 +1,173 @@
<?xml version="1.0" encoding="UTF-8"?>
<compiler_spec>
<data_organization>
<pointer_size value="8"/>
<integer_size value="4" />
<long_size value="8" />
<float_size value="4" />
<double_size value="8" />
<long_double_size value="16" />
<size_alignment_map>
<entry size="1" alignment="1" />
<entry size="2" alignment="2" />
<entry size="4" alignment="4" />
<entry size="8" alignment="8" />
</size_alignment_map>
</data_organization>
<stackpointer register="sp" space="ram"/>
<funcptr align="2"/>
<global>
<range space="ram"/>
<range space="register" first="0x2000" last="0x2fff"/>
</global>
<aggressivetrim signext="true"/> <!-- Aggressively try to eliminate sign extensions -->
<default_proto>
<prototype name="__stdcall" extrapop="0" stackshift="0">
<input>
<group>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f12"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="a0"/>
</pentry>
</group>
<group>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f13"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="a1"/>
</pentry>
</group>
<group>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f14"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="a2"/>
</pentry>
</group>
<group>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f15"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="a3"/>
</pentry>
</group>
<group>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f16"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="t0"/>
</pentry>
</group>
<group>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f17"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="t1"/>
</pentry>
</group>
<group>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f18"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="t2"/>
</pentry>
</group>
<group>
<pentry minsize="1" maxsize="8" metatype="float">
<register name="f19"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="t3"/>
</pentry>
</group>
<pentry minsize="1" maxsize="500" align="8">
<addr offset="0" space="stack"/>
</pentry>
<rule>
<datatype name="float"/>
<varargs first="0"/>
<consume storage="general"/>
</rule>
<rule>
<datatype name="struct"/>
<varargs first="0"/>
<join/>
</rule>
<rule>
<datatype name="float"/>
<consume storage="float"/>
</rule>
<rule>
<datatype name="struct"/>
<join_dual_class stackspill="true" fillalternate="true"/>
</rule>
<rule>
<datatype name="any"/>
<join/>
</rule>
</input>
<output>
<pentry minsize="4" maxsize="8" metatype="float">
<register name="f0"/>
</pentry>
<pentry minsize="4" maxsize="8" metatype="float">
<register name="f2"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="v0"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="v1"/>
</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"/>
<join/>
</rule>
</output>
<unaffected>
<register name="s0"/>
<register name="s1"/>
<register name="s2"/>
<register name="s3"/>
<register name="s4"/>
<register name="s5"/>
<register name="s6"/>
<register name="s7"/>
<register name="s8"/>
<register name="sp"/>
<register name="gp"/>
<register name="f24"/>
<register name="f25"/>
<register name="f26"/>
<register name="f27"/>
<register name="f28"/>
<register name="f29"/>
<register name="f30"/>
<register name="f31"/>
</unaffected>
<killedbycall>
<register name="at"/>
<register name="v0"/>
<register name="v1"/>
<register name="f0"/>
<register name="f2"/>
</killedbycall>
</prototype>
</default_proto>
</compiler_spec>