<?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="1" maxsize="8" metatype="float">
          <register name="f12_13"/>
        </pentry>
        <pentry minsize="1" maxsize="8" metatype="float">
          <register name="f14_15"/>
        </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="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">
          <register name="f0_1"/>
        </pentry>
        <pentry minsize="1" maxsize="4">
          <register name="v0"/>
        </pentry>
		<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"/>
        <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="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>
      <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>
  <prototype name="processEntry" extrapop="0" stackshift="0"> 
      <input pointermax="4"> 
        <pentry minsize="1" maxsize="4"> 
          <register name="v0"/> 
        </pentry> 
        <pentry minsize="1" maxsize="500" align="4"> 
          <addr offset="0" space="stack"/> 
        </pentry> 
      </input> 
      <output killedbycall="true"> 
        <pentry minsize="1" maxsize="4"> 
          <register name="v0"/> 
        </pentry> 
      </output> 
      <unaffected>
        <register name="sp"/>
      </unaffected>
      <internal_storage>
        <register name="gp"/>  <!-- Compilers may save gp to the stack before a call and restore it afterward -->
      </internal_storage>
  </prototype> 
    
</compiler_spec>
