Complete formal arguments for the SPARC v9 64-bit ABI.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Sat, 6 Apr 2013 18:32:12 +0000 (18:32 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Sat, 6 Apr 2013 18:32:12 +0000 (18:32 +0000)
commit1c9a95ab2a6c21f870ff5439b5075f0adc17adbc
tree88b5c15296246764dd453552caf344e4b5de6b5a
parentbef3f8619fa6ac40fa23ba6bc339b21fafa2da14
Complete formal arguments for the SPARC v9 64-bit ABI.

All arguments are formally assigned to stack positions and then promoted
to floating point and integer registers. Since there are more floating
point registers than integer registers, this can cause situations where
floating point arguments are assigned to registers after integer
arguments that where assigned to the stack.

Use the inreg flag to indicate 32-bit fragments of structs containing
both float and int members.

The three-way shadowing between stack, integer, and floating point
registers requires custom argument lowering. The good news is that
return values are passed in the exact same way, and we can share the
code.

Still missing:

 - Update LowerReturn to handle structs returned in registers.
 - LowerCall.
 - Variadic functions.

llvm-svn: 178958
llvm/lib/Target/Sparc/SparcCallingConv.td
llvm/lib/Target/Sparc/SparcISelLowering.cpp
llvm/test/CodeGen/SPARC/64abi.ll [new file with mode: 0644]