1//===---- AMDCallingConv.td - Calling Conventions for Radeon GPUs ---------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This describes the calling conventions for the AMD Radeon GPUs.
10//
11//===----------------------------------------------------------------------===//
12
13// Inversion of CCIfInReg
14class CCIfNotInReg<CCAction A> : CCIf<"!ArgFlags.isInReg()", A> {}
15class CCIfExtend<CCAction A>
16  : CCIf<"ArgFlags.isSExt() || ArgFlags.isZExt()", A>;
17
18// Calling convention for SI
19def CC_SI_Gfx : CallingConv<[
20  // 0-3 are reserved for the stack buffer descriptor
21  // 30-31 are reserved for the return address
22  // 32 is reserved for the stack pointer
23  CCIfInReg<CCIfType<[f32, i32, f16, i16, v2i16, v2f16] , CCAssignToReg<[
24    SGPR4, SGPR5, SGPR6, SGPR7,
25    SGPR8, SGPR9, SGPR10, SGPR11, SGPR12, SGPR13, SGPR14, SGPR15,
26    SGPR16, SGPR17, SGPR18, SGPR19, SGPR20, SGPR21, SGPR22, SGPR23,
27    SGPR24, SGPR25, SGPR26, SGPR27, SGPR28, SGPR29,
28  ]>>>,
29
30  CCIfNotInReg<CCIfType<[f32, i32, f16, i16, v2i16, v2f16] , CCAssignToReg<[
31    VGPR0, VGPR1, VGPR2, VGPR3, VGPR4, VGPR5, VGPR6, VGPR7,
32    VGPR8, VGPR9, VGPR10, VGPR11, VGPR12, VGPR13, VGPR14, VGPR15,
33    VGPR16, VGPR17, VGPR18, VGPR19, VGPR20, VGPR21, VGPR22, VGPR23,
34    VGPR24, VGPR25, VGPR26, VGPR27, VGPR28, VGPR29, VGPR30, VGPR31
35  ]>>>,
36
37  CCIfType<[i32, f32, v2i16, v2f16, i16, f16, i1], CCAssignToStack<4, 4>>
38]>;
39
40def RetCC_SI_Gfx : CallingConv<[
41  // 0-3 are reserved for the stack buffer descriptor
42  // 32 is reserved for the stack pointer
43  CCIfInReg<CCIfType<[f32, i32, f16, i16, v2i16, v2f16] , CCAssignToReg<[
44    SGPR4, SGPR5, SGPR6, SGPR7,
45    SGPR8, SGPR9, SGPR10, SGPR11, SGPR12, SGPR13, SGPR14, SGPR15,
46    SGPR16, SGPR17, SGPR18, SGPR19, SGPR20, SGPR21, SGPR22, SGPR23,
47    SGPR24, SGPR25, SGPR26, SGPR27, SGPR28, SGPR29, SGPR30, SGPR31,
48    SGPR33, SGPR34, SGPR35, SGPR36, SGPR37, SGPR38, SGPR39,
49    SGPR40, SGPR41, SGPR42, SGPR43
50  ]>>>,
51
52  CCIfNotInReg<CCIfType<[f32, i32, f16, i16, v2i16, v2f16] , CCAssignToReg<[
53    VGPR0, VGPR1, VGPR2, VGPR3, VGPR4, VGPR5, VGPR6, VGPR7,
54    VGPR8, VGPR9, VGPR10, VGPR11, VGPR12, VGPR13, VGPR14, VGPR15,
55    VGPR16, VGPR17, VGPR18, VGPR19, VGPR20, VGPR21, VGPR22, VGPR23,
56    VGPR24, VGPR25, VGPR26, VGPR27, VGPR28, VGPR29, VGPR30, VGPR31,
57    VGPR32, VGPR33, VGPR34, VGPR35, VGPR36, VGPR37, VGPR38, VGPR39,
58    VGPR40, VGPR41, VGPR42, VGPR43, VGPR44, VGPR45, VGPR46, VGPR47,
59    VGPR48, VGPR49, VGPR50, VGPR51, VGPR52, VGPR53, VGPR54, VGPR55,
60    VGPR56, VGPR57, VGPR58, VGPR59, VGPR60, VGPR61, VGPR62, VGPR63,
61    VGPR64, VGPR65, VGPR66, VGPR67, VGPR68, VGPR69, VGPR70, VGPR71,
62    VGPR72, VGPR73, VGPR74, VGPR75, VGPR76, VGPR77, VGPR78, VGPR79,
63    VGPR80, VGPR81, VGPR82, VGPR83, VGPR84, VGPR85, VGPR86, VGPR87,
64    VGPR88, VGPR89, VGPR90, VGPR91, VGPR92, VGPR93, VGPR94, VGPR95,
65    VGPR96, VGPR97, VGPR98, VGPR99, VGPR100, VGPR101, VGPR102, VGPR103,
66    VGPR104, VGPR105, VGPR106, VGPR107, VGPR108, VGPR109, VGPR110, VGPR111,
67    VGPR112, VGPR113, VGPR114, VGPR115, VGPR116, VGPR117, VGPR118, VGPR119,
68    VGPR120, VGPR121, VGPR122, VGPR123, VGPR124, VGPR125, VGPR126, VGPR127,
69    VGPR128, VGPR129, VGPR130, VGPR131, VGPR132, VGPR133, VGPR134, VGPR135
70  ]>>>,
71
72  CCIfType<[i32, f32, v2i16, v2f16, i16, f16, i1], CCAssignToStack<4, 4>>
73]>;
74
75def CC_SI_SHADER : CallingConv<[
76
77  CCIfInReg<CCIfType<[f32, i32, f16, i16, v2i16, v2f16] , CCAssignToReg<[
78    SGPR0, SGPR1, SGPR2, SGPR3, SGPR4, SGPR5, SGPR6, SGPR7,
79    SGPR8, SGPR9, SGPR10, SGPR11, SGPR12, SGPR13, SGPR14, SGPR15,
80    SGPR16, SGPR17, SGPR18, SGPR19, SGPR20, SGPR21, SGPR22, SGPR23,
81    SGPR24, SGPR25, SGPR26, SGPR27, SGPR28, SGPR29, SGPR30, SGPR31,
82    SGPR32, SGPR33, SGPR34, SGPR35, SGPR36, SGPR37, SGPR38, SGPR39,
83    SGPR40, SGPR41, SGPR42, SGPR43
84  ]>>>,
85
86  // 32*4 + 4 is the minimum for a fetch shader consumer with 32 inputs.
87  CCIfNotInReg<CCIfType<[f32, i32, f16, i16, v2i16, v2f16] , CCAssignToReg<[
88    VGPR0, VGPR1, VGPR2, VGPR3, VGPR4, VGPR5, VGPR6, VGPR7,
89    VGPR8, VGPR9, VGPR10, VGPR11, VGPR12, VGPR13, VGPR14, VGPR15,
90    VGPR16, VGPR17, VGPR18, VGPR19, VGPR20, VGPR21, VGPR22, VGPR23,
91    VGPR24, VGPR25, VGPR26, VGPR27, VGPR28, VGPR29, VGPR30, VGPR31,
92    VGPR32, VGPR33, VGPR34, VGPR35, VGPR36, VGPR37, VGPR38, VGPR39,
93    VGPR40, VGPR41, VGPR42, VGPR43, VGPR44, VGPR45, VGPR46, VGPR47,
94    VGPR48, VGPR49, VGPR50, VGPR51, VGPR52, VGPR53, VGPR54, VGPR55,
95    VGPR56, VGPR57, VGPR58, VGPR59, VGPR60, VGPR61, VGPR62, VGPR63,
96    VGPR64, VGPR65, VGPR66, VGPR67, VGPR68, VGPR69, VGPR70, VGPR71,
97    VGPR72, VGPR73, VGPR74, VGPR75, VGPR76, VGPR77, VGPR78, VGPR79,
98    VGPR80, VGPR81, VGPR82, VGPR83, VGPR84, VGPR85, VGPR86, VGPR87,
99    VGPR88, VGPR89, VGPR90, VGPR91, VGPR92, VGPR93, VGPR94, VGPR95,
100    VGPR96, VGPR97, VGPR98, VGPR99, VGPR100, VGPR101, VGPR102, VGPR103,
101    VGPR104, VGPR105, VGPR106, VGPR107, VGPR108, VGPR109, VGPR110, VGPR111,
102    VGPR112, VGPR113, VGPR114, VGPR115, VGPR116, VGPR117, VGPR118, VGPR119,
103    VGPR120, VGPR121, VGPR122, VGPR123, VGPR124, VGPR125, VGPR126, VGPR127,
104    VGPR128, VGPR129, VGPR130, VGPR131, VGPR132, VGPR133, VGPR134, VGPR135
105  ]>>>
106]>;
107
108def RetCC_SI_Shader : CallingConv<[
109  CCIfType<[i32, i16] , CCAssignToReg<[
110    SGPR0, SGPR1, SGPR2, SGPR3, SGPR4, SGPR5, SGPR6, SGPR7,
111    SGPR8, SGPR9, SGPR10, SGPR11, SGPR12, SGPR13, SGPR14, SGPR15,
112    SGPR16, SGPR17, SGPR18, SGPR19, SGPR20, SGPR21, SGPR22, SGPR23,
113    SGPR24, SGPR25, SGPR26, SGPR27, SGPR28, SGPR29, SGPR30, SGPR31,
114    SGPR32, SGPR33, SGPR34, SGPR35, SGPR36, SGPR37, SGPR38, SGPR39,
115    SGPR40, SGPR41, SGPR42, SGPR43
116  ]>>,
117
118  // 32*4 + 4 is the minimum for a fetch shader with 32 outputs.
119  CCIfType<[f32, f16, v2f16] , CCAssignToReg<[
120    VGPR0, VGPR1, VGPR2, VGPR3, VGPR4, VGPR5, VGPR6, VGPR7,
121    VGPR8, VGPR9, VGPR10, VGPR11, VGPR12, VGPR13, VGPR14, VGPR15,
122    VGPR16, VGPR17, VGPR18, VGPR19, VGPR20, VGPR21, VGPR22, VGPR23,
123    VGPR24, VGPR25, VGPR26, VGPR27, VGPR28, VGPR29, VGPR30, VGPR31,
124    VGPR32, VGPR33, VGPR34, VGPR35, VGPR36, VGPR37, VGPR38, VGPR39,
125    VGPR40, VGPR41, VGPR42, VGPR43, VGPR44, VGPR45, VGPR46, VGPR47,
126    VGPR48, VGPR49, VGPR50, VGPR51, VGPR52, VGPR53, VGPR54, VGPR55,
127    VGPR56, VGPR57, VGPR58, VGPR59, VGPR60, VGPR61, VGPR62, VGPR63,
128    VGPR64, VGPR65, VGPR66, VGPR67, VGPR68, VGPR69, VGPR70, VGPR71,
129    VGPR72, VGPR73, VGPR74, VGPR75, VGPR76, VGPR77, VGPR78, VGPR79,
130    VGPR80, VGPR81, VGPR82, VGPR83, VGPR84, VGPR85, VGPR86, VGPR87,
131    VGPR88, VGPR89, VGPR90, VGPR91, VGPR92, VGPR93, VGPR94, VGPR95,
132    VGPR96, VGPR97, VGPR98, VGPR99, VGPR100, VGPR101, VGPR102, VGPR103,
133    VGPR104, VGPR105, VGPR106, VGPR107, VGPR108, VGPR109, VGPR110, VGPR111,
134    VGPR112, VGPR113, VGPR114, VGPR115, VGPR116, VGPR117, VGPR118, VGPR119,
135    VGPR120, VGPR121, VGPR122, VGPR123, VGPR124, VGPR125, VGPR126, VGPR127,
136    VGPR128, VGPR129, VGPR130, VGPR131, VGPR132, VGPR133, VGPR134, VGPR135
137  ]>>
138]>;
139
140def CSR_AMDGPU_VGPRs_24_255 : CalleeSavedRegs<
141  (sequence "VGPR%u", 24, 255)
142>;
143
144def CSR_AMDGPU_VGPRs_32_255 : CalleeSavedRegs<
145  (sequence "VGPR%u", 32, 255)
146>;
147
148def CSR_AMDGPU_VGPRs : CalleeSavedRegs<
149  // The CSRs & scratch-registers are interleaved at a split boundary of 8.
150  (add (sequence "VGPR%u", 40, 47),
151    (sequence "VGPR%u", 56, 63),
152    (sequence "VGPR%u", 72, 79),
153    (sequence "VGPR%u", 88, 95),
154    (sequence "VGPR%u", 104, 111),
155    (sequence "VGPR%u", 120, 127),
156    (sequence "VGPR%u", 136, 143),
157    (sequence "VGPR%u", 152, 159),
158    (sequence "VGPR%u", 168, 175),
159    (sequence "VGPR%u", 184, 191),
160    (sequence "VGPR%u", 200, 207),
161    (sequence "VGPR%u", 216, 223),
162    (sequence "VGPR%u", 232, 239),
163    (sequence "VGPR%u", 248, 255))
164>;
165
166def CSR_AMDGPU_AGPRs_32_255 : CalleeSavedRegs<
167  (sequence "AGPR%u", 32, 255)
168>;
169
170def CSR_AMDGPU_SGPRs_32_105 : CalleeSavedRegs<
171  (sequence "SGPR%u", 32, 105)
172>;
173
174// Just to get the regmask, not for calling convention purposes.
175def CSR_AMDGPU_AllVGPRs : CalleeSavedRegs<
176  (sequence "VGPR%u", 0, 255)
177>;
178
179def CSR_AMDGPU_AllAGPRs : CalleeSavedRegs<
180  (sequence "AGPR%u", 0, 255)
181>;
182def CSR_AMDGPU_AllVectorRegs : CalleeSavedRegs<
183  (add CSR_AMDGPU_AllVGPRs, CSR_AMDGPU_AllAGPRs)
184>;
185
186// Just to get the regmask, not for calling convention purposes.
187def CSR_AMDGPU_AllAllocatableSRegs : CalleeSavedRegs<
188  (add (sequence "SGPR%u", 0, 105), VCC_LO, VCC_HI)
189>;
190
191def CSR_AMDGPU_HighRegs : CalleeSavedRegs<
192  (add CSR_AMDGPU_VGPRs, CSR_AMDGPU_SGPRs_32_105)
193>;
194
195def CSR_AMDGPU_HighRegs_With_AGPRs : CalleeSavedRegs<
196  (add CSR_AMDGPU_HighRegs, CSR_AMDGPU_AGPRs_32_255)
197>;
198
199def CSR_AMDGPU_NoRegs : CalleeSavedRegs<(add)>;
200
201// Calling convention for leaf functions
202def CC_AMDGPU_Func : CallingConv<[
203  CCIfByVal<CCPassByVal<4, 4>>,
204  CCIfType<[i1], CCPromoteToType<i32>>,
205  CCIfType<[i8, i16], CCIfExtend<CCPromoteToType<i32>>>,
206  CCIfType<[i32, f32, i16, f16, v2i16, v2f16, i1], CCAssignToReg<[
207    VGPR0, VGPR1, VGPR2, VGPR3, VGPR4, VGPR5, VGPR6, VGPR7,
208    VGPR8, VGPR9, VGPR10, VGPR11, VGPR12, VGPR13, VGPR14, VGPR15,
209    VGPR16, VGPR17, VGPR18, VGPR19, VGPR20, VGPR21, VGPR22, VGPR23,
210    VGPR24, VGPR25, VGPR26, VGPR27, VGPR28, VGPR29, VGPR30, VGPR31]>>,
211  CCIfType<[i32, f32, v2i16, v2f16, i16, f16, i1], CCAssignToStack<4, 4>>
212]>;
213
214// Calling convention for leaf functions
215def RetCC_AMDGPU_Func : CallingConv<[
216  CCIfType<[i1], CCPromoteToType<i32>>,
217  CCIfType<[i1, i16], CCIfExtend<CCPromoteToType<i32>>>,
218  CCIfType<[i32, f32, i16, f16, v2i16, v2f16], CCAssignToReg<[
219    VGPR0, VGPR1, VGPR2, VGPR3, VGPR4, VGPR5, VGPR6, VGPR7,
220    VGPR8, VGPR9, VGPR10, VGPR11, VGPR12, VGPR13, VGPR14, VGPR15,
221    VGPR16, VGPR17, VGPR18, VGPR19, VGPR20, VGPR21, VGPR22, VGPR23,
222    VGPR24, VGPR25, VGPR26, VGPR27, VGPR28, VGPR29, VGPR30, VGPR31]>>,
223]>;
224
225def CC_AMDGPU : CallingConv<[
226   CCIf<"static_cast<const GCNSubtarget&>"
227         "(State.getMachineFunction().getSubtarget()).getGeneration() >= "
228           "AMDGPUSubtarget::SOUTHERN_ISLANDS",
229        CCDelegateTo<CC_SI_SHADER>>,
230   CCIf<"static_cast<const GCNSubtarget&>"
231         "(State.getMachineFunction().getSubtarget()).getGeneration() >= "
232           "AMDGPUSubtarget::SOUTHERN_ISLANDS && State.getCallingConv() == CallingConv::C",
233        CCDelegateTo<CC_AMDGPU_Func>>
234]>;
235