diff options
Diffstat (limited to 'llvm/lib/Target/Hexagon/HexagonCallingConv.td')
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonCallingConv.td | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonCallingConv.td b/llvm/lib/Target/Hexagon/HexagonCallingConv.td index 5c31a81a1e87..93e17e608dd1 100644 --- a/llvm/lib/Target/Hexagon/HexagonCallingConv.td +++ b/llvm/lib/Target/Hexagon/HexagonCallingConv.td @@ -18,7 +18,7 @@ def CC_HexagonStack: CallingConv<[ CCAssignToStack<8,8>> ]>; -def CC_Hexagon: CallingConv<[ +def CC_Hexagon_Legacy: CallingConv<[ CCIfType<[i1,i8,i16], CCPromoteToType<i32>>, CCIfType<[f32], @@ -48,6 +48,36 @@ def CC_Hexagon: CallingConv<[ CCDelegateTo<CC_HexagonStack> ]>; +def CC_Hexagon: CallingConv<[ + CCIfType<[i1,i8,i16], + CCPromoteToType<i32>>, + CCIfType<[f32], + CCBitConvertToType<i32>>, + CCIfType<[f64], + CCBitConvertToType<i64>>, + + CCIfByVal< + CCPassByVal<8,1>>, + CCIfArgIsVarArg< + CCDelegateTo<CC_HexagonStack>>, + + // Pass split values in pairs, allocate odd register if necessary. + CCIfType<[i32], + CCIfSplit< + CCCustom<"CC_SkipOdd">>>, + + CCIfType<[i32,v2i16,v4i8], + CCAssignToReg<[R0,R1,R2,R3,R4,R5]>>, + // Make sure to allocate any skipped 32-bit register, so it does not get + // allocated to a subsequent 32-bit value. + CCIfType<[i64,v2i32,v4i16,v8i8], + CCCustom<"CC_SkipOdd">>, + CCIfType<[i64,v2i32,v4i16,v8i8], + CCAssignToReg<[D0,D1,D2]>>, + + CCDelegateTo<CC_HexagonStack> +]>; + def RetCC_Hexagon: CallingConv<[ CCIfType<[i1,i8,i16], CCPromoteToType<i32>>, |