blob: f8a54a61aac2211ac57e26202c886e0c25604f5f [file] [log] [blame]
Christian Konig2c8f6d52013-03-07 09:03:52 +00001//===---- AMDCallingConv.td - Calling Conventions for Radeon GPUs ---------===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Christian Konig2c8f6d52013-03-07 09:03:52 +00006//
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> {}
Matt Arsenault2b1f9aa2017-05-17 21:56:25 +000015class CCIfExtend<CCAction A>
16 : CCIf<"ArgFlags.isSExt() || ArgFlags.isZExt()", A>;
Christian Konig2c8f6d52013-03-07 09:03:52 +000017
18// Calling convention for SI
19def CC_SI : CallingConv<[
20
Matt Arsenault55ab9212018-08-01 19:57:34 +000021 CCIfInReg<CCIfType<[f32, i32, f16, v2i16, v2f16] , CCAssignToReg<[
Christian Konig2c8f6d52013-03-07 09:03:52 +000022 SGPR0, SGPR1, SGPR2, SGPR3, SGPR4, SGPR5, SGPR6, SGPR7,
Tom Stellardafcf12f2013-09-12 02:55:14 +000023 SGPR8, SGPR9, SGPR10, SGPR11, SGPR12, SGPR13, SGPR14, SGPR15,
Marek Olsak4e99b6e2016-01-13 11:46:48 +000024 SGPR16, SGPR17, SGPR18, SGPR19, SGPR20, SGPR21, SGPR22, SGPR23,
25 SGPR24, SGPR25, SGPR26, SGPR27, SGPR28, SGPR29, SGPR30, SGPR31,
Ryan Taylor29257eb2019-05-15 14:43:55 +000026 SGPR32, SGPR33, SGPR34, SGPR35, SGPR36, SGPR37, SGPR38, SGPR39,
Ryan Taylor3b1459e2019-08-28 15:00:45 +000027 SGPR40, SGPR41, SGPR42, SGPR43
Christian Konig2c8f6d52013-03-07 09:03:52 +000028 ]>>>,
29
Marek Olsak4e99b6e2016-01-13 11:46:48 +000030 // 32*4 + 4 is the minimum for a fetch shader consumer with 32 inputs.
Matt Arsenault55ab9212018-08-01 19:57:34 +000031 CCIfNotInReg<CCIfType<[f32, i32, f16, v2i16, v2f16] , CCAssignToReg<[
Christian Konig2c8f6d52013-03-07 09:03:52 +000032 VGPR0, VGPR1, VGPR2, VGPR3, VGPR4, VGPR5, VGPR6, VGPR7,
33 VGPR8, VGPR9, VGPR10, VGPR11, VGPR12, VGPR13, VGPR14, VGPR15,
34 VGPR16, VGPR17, VGPR18, VGPR19, VGPR20, VGPR21, VGPR22, VGPR23,
Marek Olsak4e99b6e2016-01-13 11:46:48 +000035 VGPR24, VGPR25, VGPR26, VGPR27, VGPR28, VGPR29, VGPR30, VGPR31,
36 VGPR32, VGPR33, VGPR34, VGPR35, VGPR36, VGPR37, VGPR38, VGPR39,
37 VGPR40, VGPR41, VGPR42, VGPR43, VGPR44, VGPR45, VGPR46, VGPR47,
38 VGPR48, VGPR49, VGPR50, VGPR51, VGPR52, VGPR53, VGPR54, VGPR55,
39 VGPR56, VGPR57, VGPR58, VGPR59, VGPR60, VGPR61, VGPR62, VGPR63,
40 VGPR64, VGPR65, VGPR66, VGPR67, VGPR68, VGPR69, VGPR70, VGPR71,
41 VGPR72, VGPR73, VGPR74, VGPR75, VGPR76, VGPR77, VGPR78, VGPR79,
42 VGPR80, VGPR81, VGPR82, VGPR83, VGPR84, VGPR85, VGPR86, VGPR87,
43 VGPR88, VGPR89, VGPR90, VGPR91, VGPR92, VGPR93, VGPR94, VGPR95,
44 VGPR96, VGPR97, VGPR98, VGPR99, VGPR100, VGPR101, VGPR102, VGPR103,
45 VGPR104, VGPR105, VGPR106, VGPR107, VGPR108, VGPR109, VGPR110, VGPR111,
46 VGPR112, VGPR113, VGPR114, VGPR115, VGPR116, VGPR117, VGPR118, VGPR119,
47 VGPR120, VGPR121, VGPR122, VGPR123, VGPR124, VGPR125, VGPR126, VGPR127,
48 VGPR128, VGPR129, VGPR130, VGPR131, VGPR132, VGPR133, VGPR134, VGPR135
Matt Arsenaultdd108842017-04-06 17:37:27 +000049 ]>>>
Tom Stellarded882c22013-06-03 17:40:11 +000050]>;
51
Matt Arsenault2b1f9aa2017-05-17 21:56:25 +000052def RetCC_SI_Shader : CallingConv<[
Marek Olsak8a0f3352016-01-13 17:23:04 +000053 CCIfType<[i32] , CCAssignToReg<[
54 SGPR0, SGPR1, SGPR2, SGPR3, SGPR4, SGPR5, SGPR6, SGPR7,
55 SGPR8, SGPR9, SGPR10, SGPR11, SGPR12, SGPR13, SGPR14, SGPR15,
56 SGPR16, SGPR17, SGPR18, SGPR19, SGPR20, SGPR21, SGPR22, SGPR23,
57 SGPR24, SGPR25, SGPR26, SGPR27, SGPR28, SGPR29, SGPR30, SGPR31,
Ryan Taylor29257eb2019-05-15 14:43:55 +000058 SGPR32, SGPR33, SGPR34, SGPR35, SGPR36, SGPR37, SGPR38, SGPR39,
Ryan Taylor3b1459e2019-08-28 15:00:45 +000059 SGPR40, SGPR41, SGPR42, SGPR43
Marek Olsak8a0f3352016-01-13 17:23:04 +000060 ]>>,
61
62 // 32*4 + 4 is the minimum for a fetch shader with 32 outputs.
Matt Arsenault55ab9212018-08-01 19:57:34 +000063 CCIfType<[f32, f16, v2f16] , CCAssignToReg<[
Marek Olsak8a0f3352016-01-13 17:23:04 +000064 VGPR0, VGPR1, VGPR2, VGPR3, VGPR4, VGPR5, VGPR6, VGPR7,
65 VGPR8, VGPR9, VGPR10, VGPR11, VGPR12, VGPR13, VGPR14, VGPR15,
66 VGPR16, VGPR17, VGPR18, VGPR19, VGPR20, VGPR21, VGPR22, VGPR23,
67 VGPR24, VGPR25, VGPR26, VGPR27, VGPR28, VGPR29, VGPR30, VGPR31,
68 VGPR32, VGPR33, VGPR34, VGPR35, VGPR36, VGPR37, VGPR38, VGPR39,
69 VGPR40, VGPR41, VGPR42, VGPR43, VGPR44, VGPR45, VGPR46, VGPR47,
70 VGPR48, VGPR49, VGPR50, VGPR51, VGPR52, VGPR53, VGPR54, VGPR55,
71 VGPR56, VGPR57, VGPR58, VGPR59, VGPR60, VGPR61, VGPR62, VGPR63,
72 VGPR64, VGPR65, VGPR66, VGPR67, VGPR68, VGPR69, VGPR70, VGPR71,
73 VGPR72, VGPR73, VGPR74, VGPR75, VGPR76, VGPR77, VGPR78, VGPR79,
74 VGPR80, VGPR81, VGPR82, VGPR83, VGPR84, VGPR85, VGPR86, VGPR87,
75 VGPR88, VGPR89, VGPR90, VGPR91, VGPR92, VGPR93, VGPR94, VGPR95,
76 VGPR96, VGPR97, VGPR98, VGPR99, VGPR100, VGPR101, VGPR102, VGPR103,
77 VGPR104, VGPR105, VGPR106, VGPR107, VGPR108, VGPR109, VGPR110, VGPR111,
78 VGPR112, VGPR113, VGPR114, VGPR115, VGPR116, VGPR117, VGPR118, VGPR119,
79 VGPR120, VGPR121, VGPR122, VGPR123, VGPR124, VGPR125, VGPR126, VGPR127,
80 VGPR128, VGPR129, VGPR130, VGPR131, VGPR132, VGPR133, VGPR134, VGPR135
81 ]>>
82]>;
83
Matt Arsenault2b1f9aa2017-05-17 21:56:25 +000084def CSR_AMDGPU_VGPRs_24_255 : CalleeSavedRegs<
85 (sequence "VGPR%u", 24, 255)
86>;
87
88def CSR_AMDGPU_VGPRs_32_255 : CalleeSavedRegs<
89 (sequence "VGPR%u", 32, 255)
90>;
91
Matt Arsenault60ba03e2019-05-21 23:23:05 +000092def CSR_AMDGPU_SGPRs_32_105 : CalleeSavedRegs<
93 (sequence "SGPR%u", 32, 105)
Matt Arsenault2b1f9aa2017-05-17 21:56:25 +000094>;
95
Matt Arsenault5b0922f2019-07-03 23:32:29 +000096// Just to get the regmask, not for calling convention purposes.
97def CSR_AMDGPU_AllVGPRs : CalleeSavedRegs<
98 (sequence "VGPR%u", 0, 255)
99>;
100
101// Just to get the regmask, not for calling convention purposes.
102def CSR_AMDGPU_AllAllocatableSRegs : CalleeSavedRegs<
103 (add (sequence "SGPR%u", 0, 105), VCC_LO, VCC_HI)
104>;
105
Matt Arsenault2b1f9aa2017-05-17 21:56:25 +0000106def CSR_AMDGPU_HighRegs : CalleeSavedRegs<
Matt Arsenault60ba03e2019-05-21 23:23:05 +0000107 (add CSR_AMDGPU_VGPRs_32_255, CSR_AMDGPU_SGPRs_32_105)
Matt Arsenault2b1f9aa2017-05-17 21:56:25 +0000108>;
109
110// Calling convention for leaf functions
111def CC_AMDGPU_Func : CallingConv<[
112 CCIfByVal<CCPassByVal<4, 4>>,
113 CCIfType<[i1], CCPromoteToType<i32>>,
114 CCIfType<[i1, i8, i16], CCIfExtend<CCPromoteToType<i32>>>,
115 CCIfType<[i32, f32, i16, f16, v2i16, v2f16, i1], CCAssignToReg<[
116 VGPR0, VGPR1, VGPR2, VGPR3, VGPR4, VGPR5, VGPR6, VGPR7,
117 VGPR8, VGPR9, VGPR10, VGPR11, VGPR12, VGPR13, VGPR14, VGPR15,
118 VGPR16, VGPR17, VGPR18, VGPR19, VGPR20, VGPR21, VGPR22, VGPR23,
119 VGPR24, VGPR25, VGPR26, VGPR27, VGPR28, VGPR29, VGPR30, VGPR31]>>,
Matt Arsenault2b1f9aa2017-05-17 21:56:25 +0000120 CCIfType<[i32, f32, v2i16, v2f16, i16, f16, i1], CCAssignToStack<4, 4>>,
121 CCIfType<[i64, f64, v2i32, v2f32], CCAssignToStack<8, 4>>,
Tim Renouf361b5b22019-03-21 12:01:21 +0000122 CCIfType<[v3i32, v3f32], CCAssignToStack<12, 4>>,
Matt Arsenault2b1f9aa2017-05-17 21:56:25 +0000123 CCIfType<[v4i32, v4f32, v2i64, v2f64], CCAssignToStack<16, 4>>,
Tim Renouf033f99a2019-03-22 10:11:21 +0000124 CCIfType<[v5i32, v5f32], CCAssignToStack<20, 4>>,
Matt Arsenault2b1f9aa2017-05-17 21:56:25 +0000125 CCIfType<[v8i32, v8f32], CCAssignToStack<32, 4>>,
126 CCIfType<[v16i32, v16f32], CCAssignToStack<64, 4>>
127]>;
128
129// Calling convention for leaf functions
130def RetCC_AMDGPU_Func : CallingConv<[
131 CCIfType<[i1], CCPromoteToType<i32>>,
132 CCIfType<[i1, i16], CCIfExtend<CCPromoteToType<i32>>>,
133 CCIfType<[i32, f32, i16, f16, v2i16, v2f16], CCAssignToReg<[
134 VGPR0, VGPR1, VGPR2, VGPR3, VGPR4, VGPR5, VGPR6, VGPR7,
135 VGPR8, VGPR9, VGPR10, VGPR11, VGPR12, VGPR13, VGPR14, VGPR15,
136 VGPR16, VGPR17, VGPR18, VGPR19, VGPR20, VGPR21, VGPR22, VGPR23,
137 VGPR24, VGPR25, VGPR26, VGPR27, VGPR28, VGPR29, VGPR30, VGPR31]>>,
Matt Arsenault2b1f9aa2017-05-17 21:56:25 +0000138]>;
139
Christian Konig2c8f6d52013-03-07 09:03:52 +0000140def CC_AMDGPU : CallingConv<[
Tom Stellard5bfbae52018-07-11 20:59:01 +0000141 CCIf<"static_cast<const GCNSubtarget&>"
Eric Christopherb5217502014-08-06 18:45:26 +0000142 "(State.getMachineFunction().getSubtarget()).getGeneration() >= "
143 "AMDGPUSubtarget::SOUTHERN_ISLANDS",
144 CCDelegateTo<CC_SI>>,
Tom Stellard5bfbae52018-07-11 20:59:01 +0000145 CCIf<"static_cast<const GCNSubtarget&>"
Matt Arsenaultb62a4eb2017-08-01 19:54:18 +0000146 "(State.getMachineFunction().getSubtarget()).getGeneration() >= "
147 "AMDGPUSubtarget::SOUTHERN_ISLANDS && State.getCallingConv() == CallingConv::C",
Tom Stellardc5a154d2018-06-28 23:47:12 +0000148 CCDelegateTo<CC_AMDGPU_Func>>
Christian Konig2c8f6d52013-03-07 09:03:52 +0000149]>;