xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/add.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=verde -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker;FUNC-LABEL: {{^}}test1:
6*9880d681SAndroid Build Coastguard Worker;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker;SI: v_add_i32_e32 [[REG:v[0-9]+]], vcc, {{v[0-9]+, v[0-9]+}}
9*9880d681SAndroid Build Coastguard Worker;SI-NOT: [[REG]]
10*9880d681SAndroid Build Coastguard Worker;SI: buffer_store_dword [[REG]],
11*9880d681SAndroid Build Coastguard Workerdefine void @test1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
12*9880d681SAndroid Build Coastguard Worker  %b_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
13*9880d681SAndroid Build Coastguard Worker  %a = load i32, i32 addrspace(1)* %in
14*9880d681SAndroid Build Coastguard Worker  %b = load i32, i32 addrspace(1)* %b_ptr
15*9880d681SAndroid Build Coastguard Worker  %result = add i32 %a, %b
16*9880d681SAndroid Build Coastguard Worker  store i32 %result, i32 addrspace(1)* %out
17*9880d681SAndroid Build Coastguard Worker  ret void
18*9880d681SAndroid Build Coastguard Worker}
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker;FUNC-LABEL: {{^}}test2:
21*9880d681SAndroid Build Coastguard Worker;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
22*9880d681SAndroid Build Coastguard Worker;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker;SI: v_add_i32_e32 v{{[0-9]+, vcc, v[0-9]+, v[0-9]+}}
25*9880d681SAndroid Build Coastguard Worker;SI: v_add_i32_e32 v{{[0-9]+, vcc, v[0-9]+, v[0-9]+}}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerdefine void @test2(<2 x i32> addrspace(1)* %out, <2 x i32> addrspace(1)* %in) {
28*9880d681SAndroid Build Coastguard Worker  %b_ptr = getelementptr <2 x i32>, <2 x i32> addrspace(1)* %in, i32 1
29*9880d681SAndroid Build Coastguard Worker  %a = load <2 x i32>, <2 x i32> addrspace(1)* %in
30*9880d681SAndroid Build Coastguard Worker  %b = load <2 x i32>, <2 x i32> addrspace(1)* %b_ptr
31*9880d681SAndroid Build Coastguard Worker  %result = add <2 x i32> %a, %b
32*9880d681SAndroid Build Coastguard Worker  store <2 x i32> %result, <2 x i32> addrspace(1)* %out
33*9880d681SAndroid Build Coastguard Worker  ret void
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker;FUNC-LABEL: {{^}}test4:
37*9880d681SAndroid Build Coastguard Worker;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
38*9880d681SAndroid Build Coastguard Worker;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
39*9880d681SAndroid Build Coastguard Worker;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
40*9880d681SAndroid Build Coastguard Worker;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker;SI: v_add_i32_e32 v{{[0-9]+, vcc, v[0-9]+, v[0-9]+}}
43*9880d681SAndroid Build Coastguard Worker;SI: v_add_i32_e32 v{{[0-9]+, vcc, v[0-9]+, v[0-9]+}}
44*9880d681SAndroid Build Coastguard Worker;SI: v_add_i32_e32 v{{[0-9]+, vcc, v[0-9]+, v[0-9]+}}
45*9880d681SAndroid Build Coastguard Worker;SI: v_add_i32_e32 v{{[0-9]+, vcc, v[0-9]+, v[0-9]+}}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdefine void @test4(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) {
48*9880d681SAndroid Build Coastguard Worker  %b_ptr = getelementptr <4 x i32>, <4 x i32> addrspace(1)* %in, i32 1
49*9880d681SAndroid Build Coastguard Worker  %a = load <4 x i32>, <4 x i32> addrspace(1)* %in
50*9880d681SAndroid Build Coastguard Worker  %b = load <4 x i32>, <4 x i32> addrspace(1)* %b_ptr
51*9880d681SAndroid Build Coastguard Worker  %result = add <4 x i32> %a, %b
52*9880d681SAndroid Build Coastguard Worker  store <4 x i32> %result, <4 x i32> addrspace(1)* %out
53*9880d681SAndroid Build Coastguard Worker  ret void
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test8:
57*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
58*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
59*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
60*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
61*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
62*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
63*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
64*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
67*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
68*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
69*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
70*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
71*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
72*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
73*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
74*9880d681SAndroid Build Coastguard Workerdefine void @test8(<8 x i32> addrspace(1)* %out, <8 x i32> %a, <8 x i32> %b) {
75*9880d681SAndroid Build Coastguard Workerentry:
76*9880d681SAndroid Build Coastguard Worker  %0 = add <8 x i32> %a, %b
77*9880d681SAndroid Build Coastguard Worker  store <8 x i32> %0, <8 x i32> addrspace(1)* %out
78*9880d681SAndroid Build Coastguard Worker  ret void
79*9880d681SAndroid Build Coastguard Worker}
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test16:
82*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
83*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
84*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
85*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
86*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
87*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
88*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
89*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
90*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
91*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
92*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
93*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
94*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
95*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
96*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
97*9880d681SAndroid Build Coastguard Worker; EG: ADD_INT
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
100*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
101*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
102*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
103*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
104*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
105*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
106*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
107*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
108*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
109*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
110*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
111*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
112*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
113*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
114*9880d681SAndroid Build Coastguard Worker; SI: s_add_i32
115*9880d681SAndroid Build Coastguard Workerdefine void @test16(<16 x i32> addrspace(1)* %out, <16 x i32> %a, <16 x i32> %b) {
116*9880d681SAndroid Build Coastguard Workerentry:
117*9880d681SAndroid Build Coastguard Worker  %0 = add <16 x i32> %a, %b
118*9880d681SAndroid Build Coastguard Worker  store <16 x i32> %0, <16 x i32> addrspace(1)* %out
119*9880d681SAndroid Build Coastguard Worker  ret void
120*9880d681SAndroid Build Coastguard Worker}
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}add64:
123*9880d681SAndroid Build Coastguard Worker; SI: s_add_u32
124*9880d681SAndroid Build Coastguard Worker; SI: s_addc_u32
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Worker; EG: MEM_RAT_CACHELESS STORE_RAW [[LO:T[0-9]+\.XY]]
127*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADD_INT {{[* ]*}}
128*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADDC_UINT
129*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADD_INT
130*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADD_INT {{[* ]*}}
131*9880d681SAndroid Build Coastguard Worker; EG-NOT: SUB
132*9880d681SAndroid Build Coastguard Workerdefine void @add64(i64 addrspace(1)* %out, i64 %a, i64 %b) {
133*9880d681SAndroid Build Coastguard Workerentry:
134*9880d681SAndroid Build Coastguard Worker  %0 = add i64 %a, %b
135*9880d681SAndroid Build Coastguard Worker  store i64 %0, i64 addrspace(1)* %out
136*9880d681SAndroid Build Coastguard Worker  ret void
137*9880d681SAndroid Build Coastguard Worker}
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Worker; The v_addc_u32 and v_add_i32 instruction can't read SGPRs, because they
140*9880d681SAndroid Build Coastguard Worker; use VCC.  The test is designed so that %a will be stored in an SGPR and
141*9880d681SAndroid Build Coastguard Worker; %0 will be stored in a VGPR, so the comiler will be forced to copy %a
142*9880d681SAndroid Build Coastguard Worker; to a VGPR before doing the add.
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}add64_sgpr_vgpr:
145*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_addc_u32_e32 s
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker; EG: MEM_RAT_CACHELESS STORE_RAW [[LO:T[0-9]+\.XY]]
148*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADD_INT {{[* ]*}}
149*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADDC_UINT
150*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADD_INT
151*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADD_INT {{[* ]*}}
152*9880d681SAndroid Build Coastguard Worker; EG-NOT: SUB
153*9880d681SAndroid Build Coastguard Workerdefine void @add64_sgpr_vgpr(i64 addrspace(1)* %out, i64 %a, i64 addrspace(1)* %in) {
154*9880d681SAndroid Build Coastguard Workerentry:
155*9880d681SAndroid Build Coastguard Worker  %0 = load i64, i64 addrspace(1)* %in
156*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, %0
157*9880d681SAndroid Build Coastguard Worker  store i64 %1, i64 addrspace(1)* %out
158*9880d681SAndroid Build Coastguard Worker  ret void
159*9880d681SAndroid Build Coastguard Worker}
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Worker; Test i64 add inside a branch.
162*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}add64_in_branch:
163*9880d681SAndroid Build Coastguard Worker; SI: s_add_u32
164*9880d681SAndroid Build Coastguard Worker; SI: s_addc_u32
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Worker; EG: MEM_RAT_CACHELESS STORE_RAW [[LO:T[0-9]+\.XY]]
167*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADD_INT {{[* ]*}}
168*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADDC_UINT
169*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADD_INT
170*9880d681SAndroid Build Coastguard Worker; EG-DAG: ADD_INT {{[* ]*}}
171*9880d681SAndroid Build Coastguard Worker; EG-NOT: SUB
172*9880d681SAndroid Build Coastguard Workerdefine void @add64_in_branch(i64 addrspace(1)* %out, i64 addrspace(1)* %in, i64 %a, i64 %b, i64 %c) {
173*9880d681SAndroid Build Coastguard Workerentry:
174*9880d681SAndroid Build Coastguard Worker  %0 = icmp eq i64 %a, 0
175*9880d681SAndroid Build Coastguard Worker  br i1 %0, label %if, label %else
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Workerif:
178*9880d681SAndroid Build Coastguard Worker  %1 = load i64, i64 addrspace(1)* %in
179*9880d681SAndroid Build Coastguard Worker  br label %endif
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard Workerelse:
182*9880d681SAndroid Build Coastguard Worker  %2 = add i64 %a, %b
183*9880d681SAndroid Build Coastguard Worker  br label %endif
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Workerendif:
186*9880d681SAndroid Build Coastguard Worker  %3 = phi i64 [%1, %if], [%2, %else]
187*9880d681SAndroid Build Coastguard Worker  store i64 %3, i64 addrspace(1)* %out
188*9880d681SAndroid Build Coastguard Worker  ret void
189*9880d681SAndroid Build Coastguard Worker}
190