blob: 850f376a4a44bbf05d164930a18080bff3da0499 [file] [log] [blame]
Tom Stellard967bf582014-02-13 23:34:15 +00001; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck --check-prefix=EG-CHECK --check-prefix=FUNC %s
Tom Stellard49f8bfd2015-01-06 18:00:21 +00002; RUN: llc < %s -march=amdgcn -mcpu=verde -verify-machineinstrs | FileCheck --check-prefix=SI-CHECK --check-prefix=FUNC %s
Marek Olsak75170772015-01-27 17:27:15 +00003; RUN: llc < %s -march=amdgcn -mcpu=tonga -verify-machineinstrs | FileCheck --check-prefix=SI-CHECK --check-prefix=FUNC %s
Tom Stellard75aadc22012-12-11 21:25:42 +00004
Tom Stellard79243d92014-10-01 17:15:17 +00005;FUNC-LABEL: {{^}}test1:
Matt Arsenault44138782013-10-11 21:03:41 +00006;EG-CHECK: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
7
Tom Stellard326d6ec2014-11-05 14:50:53 +00008;SI-CHECK: v_add_i32_e32 [[REG:v[0-9]+]], {{v[0-9]+, v[0-9]+}}
Matt Arsenault44138782013-10-11 21:03:41 +00009;SI-CHECK-NOT: [[REG]]
Tom Stellard326d6ec2014-11-05 14:50:53 +000010;SI-CHECK: buffer_store_dword [[REG]],
Matt Arsenault44138782013-10-11 21:03:41 +000011define void @test1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
12 %b_ptr = getelementptr i32 addrspace(1)* %in, i32 1
13 %a = load i32 addrspace(1)* %in
14 %b = load i32 addrspace(1)* %b_ptr
15 %result = add i32 %a, %b
16 store i32 %result, i32 addrspace(1)* %out
17 ret void
18}
19
Tom Stellard79243d92014-10-01 17:15:17 +000020;FUNC-LABEL: {{^}}test2:
Tom Stellard1e803092013-07-23 01:48:18 +000021;EG-CHECK: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
22;EG-CHECK: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
Tom Stellard75aadc22012-12-11 21:25:42 +000023
Tom Stellard326d6ec2014-11-05 14:50:53 +000024;SI-CHECK: v_add_i32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}}
25;SI-CHECK: v_add_i32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}}
Tom Stellard043795e2013-06-20 21:55:30 +000026
27define void @test2(<2 x i32> addrspace(1)* %out, <2 x i32> addrspace(1)* %in) {
28 %b_ptr = getelementptr <2 x i32> addrspace(1)* %in, i32 1
Matt Arsenaultc15b8572013-10-11 21:03:39 +000029 %a = load <2 x i32> addrspace(1)* %in
30 %b = load <2 x i32> addrspace(1)* %b_ptr
Tom Stellard043795e2013-06-20 21:55:30 +000031 %result = add <2 x i32> %a, %b
32 store <2 x i32> %result, <2 x i32> addrspace(1)* %out
33 ret void
34}
35
Tom Stellard79243d92014-10-01 17:15:17 +000036;FUNC-LABEL: {{^}}test4:
Tom Stellard1e803092013-07-23 01:48:18 +000037;EG-CHECK: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
38;EG-CHECK: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
39;EG-CHECK: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
40;EG-CHECK: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
Tom Stellard043795e2013-06-20 21:55:30 +000041
Tom Stellard326d6ec2014-11-05 14:50:53 +000042;SI-CHECK: v_add_i32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}}
43;SI-CHECK: v_add_i32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}}
44;SI-CHECK: v_add_i32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}}
45;SI-CHECK: v_add_i32_e32 v{{[0-9]+, v[0-9]+, v[0-9]+}}
Tom Stellard043795e2013-06-20 21:55:30 +000046
47define void @test4(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) {
Tom Stellard75aadc22012-12-11 21:25:42 +000048 %b_ptr = getelementptr <4 x i32> addrspace(1)* %in, i32 1
Matt Arsenaultc15b8572013-10-11 21:03:39 +000049 %a = load <4 x i32> addrspace(1)* %in
50 %b = load <4 x i32> addrspace(1)* %b_ptr
Tom Stellard75aadc22012-12-11 21:25:42 +000051 %result = add <4 x i32> %a, %b
52 store <4 x i32> %result, <4 x i32> addrspace(1)* %out
53 ret void
54}
Tom Stellard967bf582014-02-13 23:34:15 +000055
Tom Stellard79243d92014-10-01 17:15:17 +000056; FUNC-LABEL: {{^}}test8:
Tom Stellard967bf582014-02-13 23:34:15 +000057; EG-CHECK: ADD_INT
58; EG-CHECK: ADD_INT
59; EG-CHECK: ADD_INT
60; EG-CHECK: ADD_INT
61; EG-CHECK: ADD_INT
62; EG-CHECK: ADD_INT
63; EG-CHECK: ADD_INT
64; EG-CHECK: ADD_INT
Tom Stellard326d6ec2014-11-05 14:50:53 +000065; SI-CHECK: s_add_i32
66; SI-CHECK: s_add_i32
67; SI-CHECK: s_add_i32
68; SI-CHECK: s_add_i32
69; SI-CHECK: s_add_i32
70; SI-CHECK: s_add_i32
71; SI-CHECK: s_add_i32
72; SI-CHECK: s_add_i32
Tom Stellard967bf582014-02-13 23:34:15 +000073define void @test8(<8 x i32> addrspace(1)* %out, <8 x i32> %a, <8 x i32> %b) {
74entry:
75 %0 = add <8 x i32> %a, %b
76 store <8 x i32> %0, <8 x i32> addrspace(1)* %out
77 ret void
78}
Tom Stellard1f15bff2014-02-25 21:36:18 +000079
Tom Stellard79243d92014-10-01 17:15:17 +000080; FUNC-LABEL: {{^}}test16:
Tom Stellardd61a1c32014-02-28 21:36:37 +000081; EG-CHECK: ADD_INT
82; EG-CHECK: ADD_INT
83; EG-CHECK: ADD_INT
84; EG-CHECK: ADD_INT
85; EG-CHECK: ADD_INT
86; EG-CHECK: ADD_INT
87; EG-CHECK: ADD_INT
88; EG-CHECK: ADD_INT
89; EG-CHECK: ADD_INT
90; EG-CHECK: ADD_INT
91; EG-CHECK: ADD_INT
92; EG-CHECK: ADD_INT
93; EG-CHECK: ADD_INT
94; EG-CHECK: ADD_INT
95; EG-CHECK: ADD_INT
96; EG-CHECK: ADD_INT
Tom Stellard326d6ec2014-11-05 14:50:53 +000097; SI-CHECK: s_add_i32
98; SI-CHECK: s_add_i32
99; SI-CHECK: s_add_i32
100; SI-CHECK: s_add_i32
101; SI-CHECK: s_add_i32
102; SI-CHECK: s_add_i32
103; SI-CHECK: s_add_i32
104; SI-CHECK: s_add_i32
105; SI-CHECK: s_add_i32
106; SI-CHECK: s_add_i32
107; SI-CHECK: s_add_i32
108; SI-CHECK: s_add_i32
109; SI-CHECK: s_add_i32
110; SI-CHECK: s_add_i32
111; SI-CHECK: s_add_i32
112; SI-CHECK: s_add_i32
Tom Stellardd61a1c32014-02-28 21:36:37 +0000113define void @test16(<16 x i32> addrspace(1)* %out, <16 x i32> %a, <16 x i32> %b) {
114entry:
115 %0 = add <16 x i32> %a, %b
116 store <16 x i32> %0, <16 x i32> addrspace(1)* %out
117 ret void
118}
119
Tom Stellard79243d92014-10-01 17:15:17 +0000120; FUNC-LABEL: {{^}}add64:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000121; SI-CHECK: s_add_u32
122; SI-CHECK: s_addc_u32
Tom Stellard1f15bff2014-02-25 21:36:18 +0000123define void @add64(i64 addrspace(1)* %out, i64 %a, i64 %b) {
124entry:
125 %0 = add i64 %a, %b
126 store i64 %0, i64 addrspace(1)* %out
127 ret void
128}
Tom Stellarde28859f2014-03-07 20:12:39 +0000129
Tom Stellard326d6ec2014-11-05 14:50:53 +0000130; The v_addc_u32 and v_add_i32 instruction can't read SGPRs, because they
Tom Stellarde28859f2014-03-07 20:12:39 +0000131; use VCC. The test is designed so that %a will be stored in an SGPR and
132; %0 will be stored in a VGPR, so the comiler will be forced to copy %a
133; to a VGPR before doing the add.
134
Tom Stellard79243d92014-10-01 17:15:17 +0000135; FUNC-LABEL: {{^}}add64_sgpr_vgpr:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000136; SI-CHECK-NOT: v_addc_u32_e32 s
Tom Stellarde28859f2014-03-07 20:12:39 +0000137define void @add64_sgpr_vgpr(i64 addrspace(1)* %out, i64 %a, i64 addrspace(1)* %in) {
138entry:
139 %0 = load i64 addrspace(1)* %in
140 %1 = add i64 %a, %0
141 store i64 %1, i64 addrspace(1)* %out
142 ret void
143}
Tom Stellard73b98ed2014-05-15 14:41:54 +0000144
Tom Stellard744b99b2014-09-24 01:33:28 +0000145; Test i64 add inside a branch.
Tom Stellard79243d92014-10-01 17:15:17 +0000146; FUNC-LABEL: {{^}}add64_in_branch:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000147; SI-CHECK: s_add_u32
148; SI-CHECK: s_addc_u32
Tom Stellard73b98ed2014-05-15 14:41:54 +0000149define void @add64_in_branch(i64 addrspace(1)* %out, i64 addrspace(1)* %in, i64 %a, i64 %b, i64 %c) {
150entry:
151 %0 = icmp eq i64 %a, 0
152 br i1 %0, label %if, label %else
153
154if:
155 %1 = load i64 addrspace(1)* %in
156 br label %endif
157
158else:
159 %2 = add i64 %a, %b
160 br label %endif
161
162endif:
163 %3 = phi i64 [%1, %if], [%2, %else]
164 store i64 %3, i64 addrspace(1)* %out
165 ret void
166}