xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUCallingConv.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric//===---- AMDCallingConv.td - Calling Conventions for Radeon GPUs ---------===//
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 Andric// This describes the calling conventions for the AMD Radeon GPUs.
100b57cec5SDimitry Andric//
110b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric// Inversion of CCIfInReg
140b57cec5SDimitry Andricclass CCIfNotInReg<CCAction A> : CCIf<"!ArgFlags.isInReg()", A> {}
150b57cec5SDimitry Andricclass CCIfExtend<CCAction A>
160b57cec5SDimitry Andric  : CCIf<"ArgFlags.isSExt() || ArgFlags.isZExt()", A>;
170b57cec5SDimitry Andric
180b57cec5SDimitry Andric// Calling convention for SI
19e8d8bef9SDimitry Andricdef CC_SI_Gfx : CallingConv<[
20e8d8bef9SDimitry Andric  // 0-3 are reserved for the stack buffer descriptor
21e8d8bef9SDimitry Andric  // 30-31 are reserved for the return address
22e8d8bef9SDimitry Andric  // 32 is reserved for the stack pointer
23349cc55cSDimitry Andric  // 33 is reserved for the frame pointer
24349cc55cSDimitry Andric  // 34 is reserved for the base pointer
251db9f3b2SDimitry Andric  CCIfInReg<CCIfType<[f32, i32, f16, i16, v2i16, v2f16, bf16, v2bf16] , CCAssignToReg<[
26e8d8bef9SDimitry Andric    SGPR4, SGPR5, SGPR6, SGPR7,
27e8d8bef9SDimitry Andric    SGPR8, SGPR9, SGPR10, SGPR11, SGPR12, SGPR13, SGPR14, SGPR15,
28e8d8bef9SDimitry Andric    SGPR16, SGPR17, SGPR18, SGPR19, SGPR20, SGPR21, SGPR22, SGPR23,
29349cc55cSDimitry Andric    SGPR24, SGPR25, SGPR26, SGPR27, SGPR28, SGPR29
30e8d8bef9SDimitry Andric  ]>>>,
31e8d8bef9SDimitry Andric
321db9f3b2SDimitry Andric  CCIfNotInReg<CCIfType<[f32, i32, f16, i16, v2i16, v2f16, bf16, v2bf16] , CCAssignToReg<[
33e8d8bef9SDimitry Andric    VGPR0, VGPR1, VGPR2, VGPR3, VGPR4, VGPR5, VGPR6, VGPR7,
34e8d8bef9SDimitry Andric    VGPR8, VGPR9, VGPR10, VGPR11, VGPR12, VGPR13, VGPR14, VGPR15,
35e8d8bef9SDimitry Andric    VGPR16, VGPR17, VGPR18, VGPR19, VGPR20, VGPR21, VGPR22, VGPR23,
36e8d8bef9SDimitry Andric    VGPR24, VGPR25, VGPR26, VGPR27, VGPR28, VGPR29, VGPR30, VGPR31
37e8d8bef9SDimitry Andric  ]>>>,
38e8d8bef9SDimitry Andric
391db9f3b2SDimitry Andric  CCIfType<[i32, f32, v2i16, v2f16, i16, f16, i1, bf16, v2bf16], CCAssignToStack<4, 4>>
40e8d8bef9SDimitry Andric]>;
41e8d8bef9SDimitry Andric
42e8d8bef9SDimitry Andricdef RetCC_SI_Gfx : CallingConv<[
43fe6060f1SDimitry Andric  CCIfType<[i1], CCPromoteToType<i32>>,
44fe6060f1SDimitry Andric  CCIfType<[i1, i16], CCIfExtend<CCPromoteToType<i32>>>,
45fe6060f1SDimitry Andric
461db9f3b2SDimitry Andric  CCIfNotInReg<CCIfType<[f32, i32, f16, i16, v2i16, v2f16, bf16, v2bf16] , CCAssignToReg<[
47e8d8bef9SDimitry Andric    VGPR0, VGPR1, VGPR2, VGPR3, VGPR4, VGPR5, VGPR6, VGPR7,
48e8d8bef9SDimitry Andric    VGPR8, VGPR9, VGPR10, VGPR11, VGPR12, VGPR13, VGPR14, VGPR15,
49e8d8bef9SDimitry Andric    VGPR16, VGPR17, VGPR18, VGPR19, VGPR20, VGPR21, VGPR22, VGPR23,
50e8d8bef9SDimitry Andric    VGPR24, VGPR25, VGPR26, VGPR27, VGPR28, VGPR29, VGPR30, VGPR31,
51e8d8bef9SDimitry Andric    VGPR32, VGPR33, VGPR34, VGPR35, VGPR36, VGPR37, VGPR38, VGPR39,
52e8d8bef9SDimitry Andric    VGPR40, VGPR41, VGPR42, VGPR43, VGPR44, VGPR45, VGPR46, VGPR47,
53e8d8bef9SDimitry Andric    VGPR48, VGPR49, VGPR50, VGPR51, VGPR52, VGPR53, VGPR54, VGPR55,
54e8d8bef9SDimitry Andric    VGPR56, VGPR57, VGPR58, VGPR59, VGPR60, VGPR61, VGPR62, VGPR63,
55e8d8bef9SDimitry Andric    VGPR64, VGPR65, VGPR66, VGPR67, VGPR68, VGPR69, VGPR70, VGPR71,
56e8d8bef9SDimitry Andric    VGPR72, VGPR73, VGPR74, VGPR75, VGPR76, VGPR77, VGPR78, VGPR79,
57e8d8bef9SDimitry Andric    VGPR80, VGPR81, VGPR82, VGPR83, VGPR84, VGPR85, VGPR86, VGPR87,
58e8d8bef9SDimitry Andric    VGPR88, VGPR89, VGPR90, VGPR91, VGPR92, VGPR93, VGPR94, VGPR95,
59e8d8bef9SDimitry Andric    VGPR96, VGPR97, VGPR98, VGPR99, VGPR100, VGPR101, VGPR102, VGPR103,
60e8d8bef9SDimitry Andric    VGPR104, VGPR105, VGPR106, VGPR107, VGPR108, VGPR109, VGPR110, VGPR111,
61e8d8bef9SDimitry Andric    VGPR112, VGPR113, VGPR114, VGPR115, VGPR116, VGPR117, VGPR118, VGPR119,
62e8d8bef9SDimitry Andric    VGPR120, VGPR121, VGPR122, VGPR123, VGPR124, VGPR125, VGPR126, VGPR127,
63e8d8bef9SDimitry Andric    VGPR128, VGPR129, VGPR130, VGPR131, VGPR132, VGPR133, VGPR134, VGPR135
64e8d8bef9SDimitry Andric  ]>>>,
65e8d8bef9SDimitry Andric]>;
66e8d8bef9SDimitry Andric
67e8d8bef9SDimitry Andricdef CC_SI_SHADER : CallingConv<[
680b57cec5SDimitry Andric
69*0fca6ea1SDimitry Andric  CCIfType<[i1], CCPromoteToType<i32>>,
70*0fca6ea1SDimitry Andric
711db9f3b2SDimitry Andric  CCIfInReg<CCIfType<[f32, i32, f16, i16, v2i16, v2f16, bf16, v2bf16] , CCAssignToReg<[
720b57cec5SDimitry Andric    SGPR0, SGPR1, SGPR2, SGPR3, SGPR4, SGPR5, SGPR6, SGPR7,
730b57cec5SDimitry Andric    SGPR8, SGPR9, SGPR10, SGPR11, SGPR12, SGPR13, SGPR14, SGPR15,
740b57cec5SDimitry Andric    SGPR16, SGPR17, SGPR18, SGPR19, SGPR20, SGPR21, SGPR22, SGPR23,
750b57cec5SDimitry Andric    SGPR24, SGPR25, SGPR26, SGPR27, SGPR28, SGPR29, SGPR30, SGPR31,
760b57cec5SDimitry Andric    SGPR32, SGPR33, SGPR34, SGPR35, SGPR36, SGPR37, SGPR38, SGPR39,
778bcb0991SDimitry Andric    SGPR40, SGPR41, SGPR42, SGPR43
780b57cec5SDimitry Andric  ]>>>,
790b57cec5SDimitry Andric
800b57cec5SDimitry Andric  // 32*4 + 4 is the minimum for a fetch shader consumer with 32 inputs.
811db9f3b2SDimitry Andric  CCIfNotInReg<CCIfType<[f32, i32, f16, i16, v2i16, v2f16, bf16, v2bf16] , CCAssignToReg<[
820b57cec5SDimitry Andric    VGPR0, VGPR1, VGPR2, VGPR3, VGPR4, VGPR5, VGPR6, VGPR7,
830b57cec5SDimitry Andric    VGPR8, VGPR9, VGPR10, VGPR11, VGPR12, VGPR13, VGPR14, VGPR15,
840b57cec5SDimitry Andric    VGPR16, VGPR17, VGPR18, VGPR19, VGPR20, VGPR21, VGPR22, VGPR23,
850b57cec5SDimitry Andric    VGPR24, VGPR25, VGPR26, VGPR27, VGPR28, VGPR29, VGPR30, VGPR31,
860b57cec5SDimitry Andric    VGPR32, VGPR33, VGPR34, VGPR35, VGPR36, VGPR37, VGPR38, VGPR39,
870b57cec5SDimitry Andric    VGPR40, VGPR41, VGPR42, VGPR43, VGPR44, VGPR45, VGPR46, VGPR47,
880b57cec5SDimitry Andric    VGPR48, VGPR49, VGPR50, VGPR51, VGPR52, VGPR53, VGPR54, VGPR55,
890b57cec5SDimitry Andric    VGPR56, VGPR57, VGPR58, VGPR59, VGPR60, VGPR61, VGPR62, VGPR63,
900b57cec5SDimitry Andric    VGPR64, VGPR65, VGPR66, VGPR67, VGPR68, VGPR69, VGPR70, VGPR71,
910b57cec5SDimitry Andric    VGPR72, VGPR73, VGPR74, VGPR75, VGPR76, VGPR77, VGPR78, VGPR79,
920b57cec5SDimitry Andric    VGPR80, VGPR81, VGPR82, VGPR83, VGPR84, VGPR85, VGPR86, VGPR87,
930b57cec5SDimitry Andric    VGPR88, VGPR89, VGPR90, VGPR91, VGPR92, VGPR93, VGPR94, VGPR95,
940b57cec5SDimitry Andric    VGPR96, VGPR97, VGPR98, VGPR99, VGPR100, VGPR101, VGPR102, VGPR103,
950b57cec5SDimitry Andric    VGPR104, VGPR105, VGPR106, VGPR107, VGPR108, VGPR109, VGPR110, VGPR111,
960b57cec5SDimitry Andric    VGPR112, VGPR113, VGPR114, VGPR115, VGPR116, VGPR117, VGPR118, VGPR119,
970b57cec5SDimitry Andric    VGPR120, VGPR121, VGPR122, VGPR123, VGPR124, VGPR125, VGPR126, VGPR127,
980b57cec5SDimitry Andric    VGPR128, VGPR129, VGPR130, VGPR131, VGPR132, VGPR133, VGPR134, VGPR135
990b57cec5SDimitry Andric  ]>>>
1000b57cec5SDimitry Andric]>;
1010b57cec5SDimitry Andric
1020b57cec5SDimitry Andricdef RetCC_SI_Shader : CallingConv<[
103fe6060f1SDimitry Andric  CCIfType<[i1, i16], CCIfExtend<CCPromoteToType<i32>>>,
104bdd1243dSDimitry Andric  CCIfType<[i32, i16, v2i16] , CCAssignToReg<[
1050b57cec5SDimitry Andric    SGPR0, SGPR1, SGPR2, SGPR3, SGPR4, SGPR5, SGPR6, SGPR7,
1060b57cec5SDimitry Andric    SGPR8, SGPR9, SGPR10, SGPR11, SGPR12, SGPR13, SGPR14, SGPR15,
1070b57cec5SDimitry Andric    SGPR16, SGPR17, SGPR18, SGPR19, SGPR20, SGPR21, SGPR22, SGPR23,
1080b57cec5SDimitry Andric    SGPR24, SGPR25, SGPR26, SGPR27, SGPR28, SGPR29, SGPR30, SGPR31,
1090b57cec5SDimitry Andric    SGPR32, SGPR33, SGPR34, SGPR35, SGPR36, SGPR37, SGPR38, SGPR39,
1108bcb0991SDimitry Andric    SGPR40, SGPR41, SGPR42, SGPR43
1110b57cec5SDimitry Andric  ]>>,
1120b57cec5SDimitry Andric
1130b57cec5SDimitry Andric  // 32*4 + 4 is the minimum for a fetch shader with 32 outputs.
1141db9f3b2SDimitry Andric  CCIfType<[f32, f16, v2f16, bf16, v2bf16] , CCAssignToReg<[
1150b57cec5SDimitry Andric    VGPR0, VGPR1, VGPR2, VGPR3, VGPR4, VGPR5, VGPR6, VGPR7,
1160b57cec5SDimitry Andric    VGPR8, VGPR9, VGPR10, VGPR11, VGPR12, VGPR13, VGPR14, VGPR15,
1170b57cec5SDimitry Andric    VGPR16, VGPR17, VGPR18, VGPR19, VGPR20, VGPR21, VGPR22, VGPR23,
1180b57cec5SDimitry Andric    VGPR24, VGPR25, VGPR26, VGPR27, VGPR28, VGPR29, VGPR30, VGPR31,
1190b57cec5SDimitry Andric    VGPR32, VGPR33, VGPR34, VGPR35, VGPR36, VGPR37, VGPR38, VGPR39,
1200b57cec5SDimitry Andric    VGPR40, VGPR41, VGPR42, VGPR43, VGPR44, VGPR45, VGPR46, VGPR47,
1210b57cec5SDimitry Andric    VGPR48, VGPR49, VGPR50, VGPR51, VGPR52, VGPR53, VGPR54, VGPR55,
1220b57cec5SDimitry Andric    VGPR56, VGPR57, VGPR58, VGPR59, VGPR60, VGPR61, VGPR62, VGPR63,
1230b57cec5SDimitry Andric    VGPR64, VGPR65, VGPR66, VGPR67, VGPR68, VGPR69, VGPR70, VGPR71,
1240b57cec5SDimitry Andric    VGPR72, VGPR73, VGPR74, VGPR75, VGPR76, VGPR77, VGPR78, VGPR79,
1250b57cec5SDimitry Andric    VGPR80, VGPR81, VGPR82, VGPR83, VGPR84, VGPR85, VGPR86, VGPR87,
1260b57cec5SDimitry Andric    VGPR88, VGPR89, VGPR90, VGPR91, VGPR92, VGPR93, VGPR94, VGPR95,
1270b57cec5SDimitry Andric    VGPR96, VGPR97, VGPR98, VGPR99, VGPR100, VGPR101, VGPR102, VGPR103,
1280b57cec5SDimitry Andric    VGPR104, VGPR105, VGPR106, VGPR107, VGPR108, VGPR109, VGPR110, VGPR111,
1290b57cec5SDimitry Andric    VGPR112, VGPR113, VGPR114, VGPR115, VGPR116, VGPR117, VGPR118, VGPR119,
1300b57cec5SDimitry Andric    VGPR120, VGPR121, VGPR122, VGPR123, VGPR124, VGPR125, VGPR126, VGPR127,
1310b57cec5SDimitry Andric    VGPR128, VGPR129, VGPR130, VGPR131, VGPR132, VGPR133, VGPR134, VGPR135
1320b57cec5SDimitry Andric  ]>>
1330b57cec5SDimitry Andric]>;
1340b57cec5SDimitry Andric
1355ffd83dbSDimitry Andricdef CSR_AMDGPU_VGPRs : CalleeSavedRegs<
1365ffd83dbSDimitry Andric  // The CSRs & scratch-registers are interleaved at a split boundary of 8.
1375ffd83dbSDimitry Andric  (add (sequence "VGPR%u", 40, 47),
1385ffd83dbSDimitry Andric    (sequence "VGPR%u", 56, 63),
1395ffd83dbSDimitry Andric    (sequence "VGPR%u", 72, 79),
1405ffd83dbSDimitry Andric    (sequence "VGPR%u", 88, 95),
1415ffd83dbSDimitry Andric    (sequence "VGPR%u", 104, 111),
1425ffd83dbSDimitry Andric    (sequence "VGPR%u", 120, 127),
1435ffd83dbSDimitry Andric    (sequence "VGPR%u", 136, 143),
1445ffd83dbSDimitry Andric    (sequence "VGPR%u", 152, 159),
1455ffd83dbSDimitry Andric    (sequence "VGPR%u", 168, 175),
1465ffd83dbSDimitry Andric    (sequence "VGPR%u", 184, 191),
1475ffd83dbSDimitry Andric    (sequence "VGPR%u", 200, 207),
1485ffd83dbSDimitry Andric    (sequence "VGPR%u", 216, 223),
1495ffd83dbSDimitry Andric    (sequence "VGPR%u", 232, 239),
1505ffd83dbSDimitry Andric    (sequence "VGPR%u", 248, 255))
1515ffd83dbSDimitry Andric>;
1525ffd83dbSDimitry Andric
15381ad6265SDimitry Andricdef CSR_AMDGPU_AGPRs : CalleeSavedRegs<
154fe6060f1SDimitry Andric  (sequence "AGPR%u", 32, 255)
155fe6060f1SDimitry Andric>;
156fe6060f1SDimitry Andric
15781ad6265SDimitry Andricdef CSR_AMDGPU_SGPRs : CalleeSavedRegs<
15881ad6265SDimitry Andric  (sequence "SGPR%u", 30, 105)
1590b57cec5SDimitry Andric>;
1600b57cec5SDimitry Andric
16181ad6265SDimitry Andricdef CSR_AMDGPU_SI_Gfx_SGPRs : CalleeSavedRegs<
16281ad6265SDimitry Andric  (add (sequence "SGPR%u", 4, 31), (sequence "SGPR%u", 64, 105))
163349cc55cSDimitry Andric>;
164349cc55cSDimitry Andric
16581ad6265SDimitry Andricdef CSR_AMDGPU : CalleeSavedRegs<
16681ad6265SDimitry Andric  (add CSR_AMDGPU_VGPRs, CSR_AMDGPU_SGPRs)
167349cc55cSDimitry Andric>;
168349cc55cSDimitry Andric
16981ad6265SDimitry Andricdef CSR_AMDGPU_GFX90AInsts : CalleeSavedRegs<
17081ad6265SDimitry Andric  (add CSR_AMDGPU, CSR_AMDGPU_AGPRs)
171fe6060f1SDimitry Andric>;
172fe6060f1SDimitry Andric
173349cc55cSDimitry Andricdef CSR_AMDGPU_SI_Gfx : CalleeSavedRegs<
17481ad6265SDimitry Andric  (add CSR_AMDGPU_VGPRs, CSR_AMDGPU_SI_Gfx_SGPRs)
175349cc55cSDimitry Andric>;
176349cc55cSDimitry Andric
17781ad6265SDimitry Andricdef CSR_AMDGPU_SI_Gfx_GFX90AInsts : CalleeSavedRegs<
17881ad6265SDimitry Andric  (add CSR_AMDGPU_SI_Gfx, CSR_AMDGPU_AGPRs)
179349cc55cSDimitry Andric>;
180349cc55cSDimitry Andric
1815f757f3fSDimitry Andricdef CSR_AMDGPU_CS_ChainPreserve : CalleeSavedRegs<
1825f757f3fSDimitry Andric  (sequence "VGPR%u", 8, 255)
1835f757f3fSDimitry Andric>;
1845f757f3fSDimitry Andric
185e8d8bef9SDimitry Andricdef CSR_AMDGPU_NoRegs : CalleeSavedRegs<(add)>;
186e8d8bef9SDimitry Andric
1870b57cec5SDimitry Andric// Calling convention for leaf functions
1880b57cec5SDimitry Andricdef CC_AMDGPU_Func : CallingConv<[
1890b57cec5SDimitry Andric  CCIfByVal<CCPassByVal<4, 4>>,
1900b57cec5SDimitry Andric  CCIfType<[i1], CCPromoteToType<i32>>,
191e8d8bef9SDimitry Andric  CCIfType<[i8, i16], CCIfExtend<CCPromoteToType<i32>>>,
1925f757f3fSDimitry Andric
1931db9f3b2SDimitry Andric  CCIfInReg<CCIfType<[f32, i32, f16, i16, v2i16, v2f16, bf16, v2bf16] , CCAssignToReg<
1945f757f3fSDimitry Andric    !foreach(i, !range(0, 30), !cast<Register>("SGPR"#i))  // SGPR0-29
1955f757f3fSDimitry Andric  >>>,
1965f757f3fSDimitry Andric
1971db9f3b2SDimitry Andric  CCIfType<[i32, f32, i16, f16, v2i16, v2f16, i1, bf16, v2bf16], CCAssignToReg<[
1980b57cec5SDimitry Andric    VGPR0, VGPR1, VGPR2, VGPR3, VGPR4, VGPR5, VGPR6, VGPR7,
1990b57cec5SDimitry Andric    VGPR8, VGPR9, VGPR10, VGPR11, VGPR12, VGPR13, VGPR14, VGPR15,
2000b57cec5SDimitry Andric    VGPR16, VGPR17, VGPR18, VGPR19, VGPR20, VGPR21, VGPR22, VGPR23,
2010b57cec5SDimitry Andric    VGPR24, VGPR25, VGPR26, VGPR27, VGPR28, VGPR29, VGPR30, VGPR31]>>,
2021db9f3b2SDimitry Andric  CCIfType<[i32, f32, v2i16, v2f16, i16, f16, i1, bf16, v2bf16], CCAssignToStack<4, 4>>
2030b57cec5SDimitry Andric]>;
2040b57cec5SDimitry Andric
2050b57cec5SDimitry Andric// Calling convention for leaf functions
2060b57cec5SDimitry Andricdef RetCC_AMDGPU_Func : CallingConv<[
2070b57cec5SDimitry Andric  CCIfType<[i1], CCPromoteToType<i32>>,
2080b57cec5SDimitry Andric  CCIfType<[i1, i16], CCIfExtend<CCPromoteToType<i32>>>,
2091db9f3b2SDimitry Andric  CCIfType<[i32, f32, i16, f16, v2i16, v2f16, bf16, v2bf16], CCAssignToReg<[
2100b57cec5SDimitry Andric    VGPR0, VGPR1, VGPR2, VGPR3, VGPR4, VGPR5, VGPR6, VGPR7,
2110b57cec5SDimitry Andric    VGPR8, VGPR9, VGPR10, VGPR11, VGPR12, VGPR13, VGPR14, VGPR15,
2120b57cec5SDimitry Andric    VGPR16, VGPR17, VGPR18, VGPR19, VGPR20, VGPR21, VGPR22, VGPR23,
2130b57cec5SDimitry Andric    VGPR24, VGPR25, VGPR26, VGPR27, VGPR28, VGPR29, VGPR30, VGPR31]>>,
2140b57cec5SDimitry Andric]>;
2150b57cec5SDimitry Andric
2160b57cec5SDimitry Andricdef CC_AMDGPU : CallingConv<[
2170b57cec5SDimitry Andric   CCIf<"static_cast<const GCNSubtarget&>"
2180b57cec5SDimitry Andric         "(State.getMachineFunction().getSubtarget()).getGeneration() >= "
2190b57cec5SDimitry Andric           "AMDGPUSubtarget::SOUTHERN_ISLANDS",
220e8d8bef9SDimitry Andric        CCDelegateTo<CC_SI_SHADER>>,
2210b57cec5SDimitry Andric   CCIf<"static_cast<const GCNSubtarget&>"
2220b57cec5SDimitry Andric         "(State.getMachineFunction().getSubtarget()).getGeneration() >= "
2230b57cec5SDimitry Andric           "AMDGPUSubtarget::SOUTHERN_ISLANDS && State.getCallingConv() == CallingConv::C",
2240b57cec5SDimitry Andric        CCDelegateTo<CC_AMDGPU_Func>>
2250b57cec5SDimitry Andric]>;
22681ad6265SDimitry Andric
2275f757f3fSDimitry Andricdef CC_AMDGPU_CS_CHAIN : CallingConv<[
2281db9f3b2SDimitry Andric  CCIfInReg<CCIfType<[f32, i32, f16, i16, v2i16, v2f16, bf16, v2bf16] , CCAssignToReg<
2295f757f3fSDimitry Andric    !foreach(i, !range(105), !cast<Register>("SGPR"#i))
2305f757f3fSDimitry Andric  >>>,
2315f757f3fSDimitry Andric
2321db9f3b2SDimitry Andric  CCIfNotInReg<CCIfType<[f32, i32, f16, i16, v2i16, v2f16, bf16, v2bf16] , CCAssignToReg<
2335f757f3fSDimitry Andric    !foreach(i, !range(8, 255), !cast<Register>("VGPR"#i))
2345f757f3fSDimitry Andric  >>>
2355f757f3fSDimitry Andric]>;
2365f757f3fSDimitry Andric
23781ad6265SDimitry Andric// Trivial class to denote when a def is used only to get a RegMask, i.e.
23881ad6265SDimitry Andric// SaveList is ignored and the def is not used as part of any calling
23981ad6265SDimitry Andric// convention.
24081ad6265SDimitry Andricclass RegMask<dag mask> : CalleeSavedRegs<mask>;
24181ad6265SDimitry Andric
24281ad6265SDimitry Andricdef AMDGPU_AllVGPRs : RegMask<
24381ad6265SDimitry Andric  (sequence "VGPR%u", 0, 255)
24481ad6265SDimitry Andric>;
24581ad6265SDimitry Andric
24681ad6265SDimitry Andricdef AMDGPU_AllAGPRs : RegMask<
24781ad6265SDimitry Andric  (sequence "AGPR%u", 0, 255)
24881ad6265SDimitry Andric>;
24981ad6265SDimitry Andric
25081ad6265SDimitry Andricdef AMDGPU_AllVectorRegs : RegMask<
25181ad6265SDimitry Andric  (add AMDGPU_AllVGPRs, AMDGPU_AllAGPRs)
25281ad6265SDimitry Andric>;
25381ad6265SDimitry Andric
25481ad6265SDimitry Andricdef AMDGPU_AllAllocatableSRegs : RegMask<
25581ad6265SDimitry Andric  (add (sequence "SGPR%u", 0, 105), VCC_LO, VCC_HI)
25681ad6265SDimitry Andric>;
257