xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/Hexagon/HexagonCallingConv.td (revision 04eeddc0aa8e0a417a16eaf9d7d095207f4a8623)
10b57cec5SDimitry Andric//===- HexagonCallingConv.td ----------------------------------------------===//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric
90b57cec5SDimitry Andricclass CCIfArgIsVarArg<CCAction A>
100b57cec5SDimitry Andric  : CCIf<"State.isVarArg() && "
110b57cec5SDimitry Andric         "ValNo >= static_cast<HexagonCCState&>(State)"
120b57cec5SDimitry Andric         ".getNumNamedVarArgParams()", A>;
130b57cec5SDimitry Andric
140b57cec5SDimitry Andricdef CC_HexagonStack: CallingConv<[
150b57cec5SDimitry Andric  CCIfType<[i32,v2i16,v4i8],
160b57cec5SDimitry Andric    CCAssignToStack<4,4>>,
170b57cec5SDimitry Andric  CCIfType<[i64,v2i32,v4i16,v8i8],
180b57cec5SDimitry Andric    CCAssignToStack<8,8>>
190b57cec5SDimitry Andric]>;
200b57cec5SDimitry Andric
215ffd83dbSDimitry Andricdef CC_Hexagon_Legacy: CallingConv<[
220b57cec5SDimitry Andric  CCIfType<[i1,i8,i16],
230b57cec5SDimitry Andric    CCPromoteToType<i32>>,
240b57cec5SDimitry Andric  CCIfType<[f32],
250b57cec5SDimitry Andric    CCBitConvertToType<i32>>,
260b57cec5SDimitry Andric  CCIfType<[f64],
270b57cec5SDimitry Andric    CCBitConvertToType<i64>>,
280b57cec5SDimitry Andric
290b57cec5SDimitry Andric  CCIfByVal<
300b57cec5SDimitry Andric    CCPassByVal<8,8>>,
310b57cec5SDimitry Andric  CCIfArgIsVarArg<
320b57cec5SDimitry Andric    CCDelegateTo<CC_HexagonStack>>,
330b57cec5SDimitry Andric
340b57cec5SDimitry Andric  // Pass split values in pairs, allocate odd register if necessary.
350b57cec5SDimitry Andric  CCIfType<[i32],
360b57cec5SDimitry Andric    CCIfSplit<
370b57cec5SDimitry Andric      CCCustom<"CC_SkipOdd">>>,
380b57cec5SDimitry Andric
390b57cec5SDimitry Andric  CCIfType<[i32,v2i16,v4i8],
400b57cec5SDimitry Andric    CCAssignToReg<[R0,R1,R2,R3,R4,R5]>>,
410b57cec5SDimitry Andric  // Make sure to allocate any skipped 32-bit register, so it does not get
420b57cec5SDimitry Andric  // allocated to a subsequent 32-bit value.
430b57cec5SDimitry Andric  CCIfType<[i64,v2i32,v4i16,v8i8],
440b57cec5SDimitry Andric    CCCustom<"CC_SkipOdd">>,
450b57cec5SDimitry Andric  CCIfType<[i64,v2i32,v4i16,v8i8],
460b57cec5SDimitry Andric    CCAssignToReg<[D0,D1,D2]>>,
470b57cec5SDimitry Andric
480b57cec5SDimitry Andric  CCDelegateTo<CC_HexagonStack>
490b57cec5SDimitry Andric]>;
500b57cec5SDimitry Andric
515ffd83dbSDimitry Andricdef CC_Hexagon: CallingConv<[
525ffd83dbSDimitry Andric  CCIfType<[i1,i8,i16],
535ffd83dbSDimitry Andric    CCPromoteToType<i32>>,
545ffd83dbSDimitry Andric  CCIfType<[f32],
555ffd83dbSDimitry Andric    CCBitConvertToType<i32>>,
565ffd83dbSDimitry Andric  CCIfType<[f64],
575ffd83dbSDimitry Andric    CCBitConvertToType<i64>>,
585ffd83dbSDimitry Andric
595ffd83dbSDimitry Andric  CCIfByVal<
605ffd83dbSDimitry Andric    CCPassByVal<8,1>>,
615ffd83dbSDimitry Andric  CCIfArgIsVarArg<
625ffd83dbSDimitry Andric    CCDelegateTo<CC_HexagonStack>>,
635ffd83dbSDimitry Andric
645ffd83dbSDimitry Andric  // Pass split values in pairs, allocate odd register if necessary.
655ffd83dbSDimitry Andric  CCIfType<[i32],
665ffd83dbSDimitry Andric    CCIfSplit<
675ffd83dbSDimitry Andric      CCCustom<"CC_SkipOdd">>>,
685ffd83dbSDimitry Andric
695ffd83dbSDimitry Andric  CCIfType<[i32,v2i16,v4i8],
705ffd83dbSDimitry Andric    CCAssignToReg<[R0,R1,R2,R3,R4,R5]>>,
715ffd83dbSDimitry Andric  // Make sure to allocate any skipped 32-bit register, so it does not get
725ffd83dbSDimitry Andric  // allocated to a subsequent 32-bit value.
735ffd83dbSDimitry Andric  CCIfType<[i64,v2i32,v4i16,v8i8],
745ffd83dbSDimitry Andric    CCCustom<"CC_SkipOdd">>,
755ffd83dbSDimitry Andric  CCIfType<[i64,v2i32,v4i16,v8i8],
765ffd83dbSDimitry Andric    CCAssignToReg<[D0,D1,D2]>>,
775ffd83dbSDimitry Andric
785ffd83dbSDimitry Andric  CCDelegateTo<CC_HexagonStack>
795ffd83dbSDimitry Andric]>;
805ffd83dbSDimitry Andric
810b57cec5SDimitry Andricdef RetCC_Hexagon: CallingConv<[
820b57cec5SDimitry Andric  CCIfType<[i1,i8,i16],
830b57cec5SDimitry Andric    CCPromoteToType<i32>>,
840b57cec5SDimitry Andric  CCIfType<[f32],
850b57cec5SDimitry Andric    CCBitConvertToType<i32>>,
860b57cec5SDimitry Andric  CCIfType<[f64],
870b57cec5SDimitry Andric    CCBitConvertToType<i64>>,
880b57cec5SDimitry Andric
890b57cec5SDimitry Andric  // Small structures are returned in a pair of registers, (which is
900b57cec5SDimitry Andric  // always r1:0). In such case, what is returned are two i32 values
910b57cec5SDimitry Andric  // without any additional information (in ArgFlags) stating that
920b57cec5SDimitry Andric  // they are parts of a structure. Because of that there is no way
930b57cec5SDimitry Andric  // to differentiate that situation from an attempt to return two
940b57cec5SDimitry Andric  // values, so always assign R0 and R1.
950b57cec5SDimitry Andric  CCIfSplit<
960b57cec5SDimitry Andric    CCAssignToReg<[R0,R1]>>,
970b57cec5SDimitry Andric  CCIfType<[i32,v2i16,v4i8],
980b57cec5SDimitry Andric    CCAssignToReg<[R0,R1]>>,
990b57cec5SDimitry Andric  CCIfType<[i64,v2i32,v4i16,v8i8],
1000b57cec5SDimitry Andric    CCAssignToReg<[D0]>>
1010b57cec5SDimitry Andric]>;
1020b57cec5SDimitry Andric
1030b57cec5SDimitry Andric
1040b57cec5SDimitry Andricclass CCIfHvx64<CCAction A>
1050b57cec5SDimitry Andric  : CCIf<"State.getMachineFunction().getSubtarget<HexagonSubtarget>()"
1060b57cec5SDimitry Andric         ".useHVX64BOps()", A>;
1070b57cec5SDimitry Andric
1080b57cec5SDimitry Andricclass CCIfHvx128<CCAction A>
1090b57cec5SDimitry Andric  : CCIf<"State.getMachineFunction().getSubtarget<HexagonSubtarget>()"
1100b57cec5SDimitry Andric         ".useHVX128BOps()", A>;
1110b57cec5SDimitry Andric
1120b57cec5SDimitry Andricdef CC_Hexagon_HVX: CallingConv<[
1130b57cec5SDimitry Andric  // HVX 64-byte mode
1140b57cec5SDimitry Andric  CCIfHvx64<
1150b57cec5SDimitry Andric    CCIfType<[v16i32,v32i16,v64i8],
1160b57cec5SDimitry Andric      CCAssignToReg<[V0,V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12,V13,V14,V15]>>>,
1170b57cec5SDimitry Andric  CCIfHvx64<
1180b57cec5SDimitry Andric    CCIfType<[v32i32,v64i16,v128i8],
1190b57cec5SDimitry Andric      CCAssignToReg<[W0,W1,W2,W3,W4,W5,W6,W7]>>>,
1200b57cec5SDimitry Andric  CCIfHvx64<
1210b57cec5SDimitry Andric    CCIfType<[v16i32,v32i16,v64i8],
1220b57cec5SDimitry Andric      CCAssignToStack<64,64>>>,
1230b57cec5SDimitry Andric  CCIfHvx64<
1240b57cec5SDimitry Andric    CCIfType<[v32i32,v64i16,v128i8],
1250b57cec5SDimitry Andric      CCAssignToStack<128,64>>>,
1260b57cec5SDimitry Andric
1270b57cec5SDimitry Andric  // HVX 128-byte mode
1280b57cec5SDimitry Andric  CCIfHvx128<
129*04eeddc0SDimitry Andric    CCIfType<[v32i32,v64i16,v128i8,v32f32,v64f16],
1300b57cec5SDimitry Andric      CCAssignToReg<[V0,V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12,V13,V14,V15]>>>,
1310b57cec5SDimitry Andric  CCIfHvx128<
132*04eeddc0SDimitry Andric    CCIfType<[v64i32,v128i16,v256i8,v64f32,v128f16],
1330b57cec5SDimitry Andric      CCAssignToReg<[W0,W1,W2,W3,W4,W5,W6,W7]>>>,
1340b57cec5SDimitry Andric  CCIfHvx128<
135*04eeddc0SDimitry Andric    CCIfType<[v32i32,v64i16,v128i8,v32f32,v64f16],
1360b57cec5SDimitry Andric      CCAssignToStack<128,128>>>,
1370b57cec5SDimitry Andric  CCIfHvx128<
138*04eeddc0SDimitry Andric    CCIfType<[v64i32,v128i16,v256i8,v64f32,v128f16],
1390b57cec5SDimitry Andric      CCAssignToStack<256,128>>>,
1400b57cec5SDimitry Andric
1410b57cec5SDimitry Andric  CCDelegateTo<CC_Hexagon>
1420b57cec5SDimitry Andric]>;
1430b57cec5SDimitry Andric
1440b57cec5SDimitry Andricdef RetCC_Hexagon_HVX: CallingConv<[
1450b57cec5SDimitry Andric  // HVX 64-byte mode
1460b57cec5SDimitry Andric  CCIfHvx64<
1470b57cec5SDimitry Andric    CCIfType<[v16i32,v32i16,v64i8],
1480b57cec5SDimitry Andric      CCAssignToReg<[V0]>>>,
1490b57cec5SDimitry Andric  CCIfHvx64<
1500b57cec5SDimitry Andric    CCIfType<[v32i32,v64i16,v128i8],
1510b57cec5SDimitry Andric      CCAssignToReg<[W0]>>>,
1520b57cec5SDimitry Andric
1530b57cec5SDimitry Andric  // HVX 128-byte mode
1540b57cec5SDimitry Andric  CCIfHvx128<
155*04eeddc0SDimitry Andric    CCIfType<[v32i32,v64i16,v128i8,v32f32,v64f16],
1560b57cec5SDimitry Andric      CCAssignToReg<[V0]>>>,
1570b57cec5SDimitry Andric  CCIfHvx128<
158*04eeddc0SDimitry Andric    CCIfType<[v64i32,v128i16,v256i8,v64f32,v128f16],
1590b57cec5SDimitry Andric      CCAssignToReg<[W0]>>>,
1600b57cec5SDimitry Andric
1610b57cec5SDimitry Andric  CCDelegateTo<RetCC_Hexagon>
1620b57cec5SDimitry Andric]>;
1630b57cec5SDimitry Andric
164