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