blob: 6dcd7c234dc6d6d54c0f36f6db52ad5a6eb83154 [file] [log] [blame]
Matt Arsenault6689abe2016-05-05 20:07:37 +00001; RUN: llc -march=amdgcn -mcpu=verde -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
Matt Arsenault7aad8fd2017-01-24 22:02:15 +00002; RUN: llc -march=amdgcn -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
Matt Arsenault6689abe2016-05-05 20:07:37 +00003; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
Tom Stellard75aadc22012-12-11 21:25:42 +00004
Tom Stellard79243d92014-10-01 17:15:17 +00005;FUNC-LABEL: {{^}}test1:
Marek Olsak37cd4d02015-02-03 21:53:27 +00006;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
Matt Arsenault44138782013-10-11 21:03:41 +00007
Alexander Timofeev982aee62017-07-04 17:32:00 +00008;SI: s_add_i32 s[[REG:[0-9]+]], {{s[0-9]+, s[0-9]+}}
9;SI: v_mov_b32_e32 v[[REG]], s[[REG]]
10;SI: buffer_store_dword v[[REG]],
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000011define amdgpu_kernel void @test1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +000012 %b_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +000013 %a = load i32, i32 addrspace(1)* %in
14 %b = load i32, i32 addrspace(1)* %b_ptr
Matt Arsenault44138782013-10-11 21:03:41 +000015 %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:
Marek Olsak37cd4d02015-02-03 21:53:27 +000021;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
22;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
Tom Stellard75aadc22012-12-11 21:25:42 +000023
Alexander Timofeev982aee62017-07-04 17:32:00 +000024;SI: s_add_i32 s{{[0-9]+, s[0-9]+, s[0-9]+}}
25;SI: s_add_i32 s{{[0-9]+, s[0-9]+, s[0-9]+}}
Tom Stellard043795e2013-06-20 21:55:30 +000026
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000027define amdgpu_kernel void @test2(<2 x i32> addrspace(1)* %out, <2 x i32> addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +000028 %b_ptr = getelementptr <2 x i32>, <2 x i32> addrspace(1)* %in, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +000029 %a = load <2 x i32>, <2 x i32> addrspace(1)* %in
30 %b = load <2 x i32>, <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:
Marek Olsak37cd4d02015-02-03 21:53:27 +000037;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
38;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
39;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
40;EG: ADD_INT {{[* ]*}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}
Tom Stellard043795e2013-06-20 21:55:30 +000041
Alexander Timofeev982aee62017-07-04 17:32:00 +000042;SI: s_add_i32 s{{[0-9]+, s[0-9]+, s[0-9]+}}
43;SI: s_add_i32 s{{[0-9]+, s[0-9]+, s[0-9]+}}
44;SI: s_add_i32 s{{[0-9]+, s[0-9]+, s[0-9]+}}
45;SI: s_add_i32 s{{[0-9]+, s[0-9]+, s[0-9]+}}
Tom Stellard043795e2013-06-20 21:55:30 +000046
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000047define amdgpu_kernel void @test4(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +000048 %b_ptr = getelementptr <4 x i32>, <4 x i32> addrspace(1)* %in, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +000049 %a = load <4 x i32>, <4 x i32> addrspace(1)* %in
50 %b = load <4 x i32>, <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:
Marek Olsak37cd4d02015-02-03 21:53:27 +000057; EG: ADD_INT
58; EG: ADD_INT
59; EG: ADD_INT
60; EG: ADD_INT
61; EG: ADD_INT
62; EG: ADD_INT
63; EG: ADD_INT
64; EG: ADD_INT
Jan Vesely808fff52015-04-30 17:15:56 +000065
Marek Olsak37cd4d02015-02-03 21:53:27 +000066; SI: s_add_i32
67; SI: s_add_i32
68; SI: s_add_i32
69; SI: s_add_i32
70; SI: s_add_i32
71; SI: s_add_i32
72; SI: s_add_i32
73; SI: s_add_i32
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000074define amdgpu_kernel void @test8(<8 x i32> addrspace(1)* %out, <8 x i32> %a, <8 x i32> %b) {
Tom Stellard967bf582014-02-13 23:34:15 +000075entry:
76 %0 = add <8 x i32> %a, %b
77 store <8 x i32> %0, <8 x i32> addrspace(1)* %out
78 ret void
79}
Tom Stellard1f15bff2014-02-25 21:36:18 +000080
Tom Stellard79243d92014-10-01 17:15:17 +000081; FUNC-LABEL: {{^}}test16:
Marek Olsak37cd4d02015-02-03 21:53:27 +000082; EG: ADD_INT
83; EG: ADD_INT
84; EG: ADD_INT
85; EG: ADD_INT
86; EG: ADD_INT
87; EG: ADD_INT
88; EG: ADD_INT
89; EG: ADD_INT
90; EG: ADD_INT
91; EG: ADD_INT
92; EG: ADD_INT
93; EG: ADD_INT
94; EG: ADD_INT
95; EG: ADD_INT
96; EG: ADD_INT
97; EG: ADD_INT
Jan Vesely808fff52015-04-30 17:15:56 +000098
Marek Olsak37cd4d02015-02-03 21:53:27 +000099; SI: s_add_i32
100; SI: s_add_i32
101; SI: s_add_i32
102; SI: s_add_i32
103; SI: s_add_i32
104; SI: s_add_i32
105; SI: s_add_i32
106; SI: s_add_i32
107; SI: s_add_i32
108; SI: s_add_i32
109; SI: s_add_i32
110; SI: s_add_i32
111; SI: s_add_i32
112; SI: s_add_i32
113; SI: s_add_i32
114; SI: s_add_i32
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000115define amdgpu_kernel void @test16(<16 x i32> addrspace(1)* %out, <16 x i32> %a, <16 x i32> %b) {
Tom Stellardd61a1c32014-02-28 21:36:37 +0000116entry:
117 %0 = add <16 x i32> %a, %b
118 store <16 x i32> %0, <16 x i32> addrspace(1)* %out
119 ret void
120}
121
Tom Stellard79243d92014-10-01 17:15:17 +0000122; FUNC-LABEL: {{^}}add64:
Marek Olsak37cd4d02015-02-03 21:53:27 +0000123; SI: s_add_u32
124; SI: s_addc_u32
Jan Vesely808fff52015-04-30 17:15:56 +0000125
Matt Arsenault327bb5a2016-07-01 22:47:50 +0000126; EG: MEM_RAT_CACHELESS STORE_RAW [[LO:T[0-9]+\.XY]]
127; EG-DAG: ADD_INT {{[* ]*}}
Jan Vesely808fff52015-04-30 17:15:56 +0000128; EG-DAG: ADDC_UINT
129; EG-DAG: ADD_INT
Matt Arsenault327bb5a2016-07-01 22:47:50 +0000130; EG-DAG: ADD_INT {{[* ]*}}
Jan Vesely808fff52015-04-30 17:15:56 +0000131; EG-NOT: SUB
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000132define amdgpu_kernel void @add64(i64 addrspace(1)* %out, i64 %a, i64 %b) {
Tom Stellard1f15bff2014-02-25 21:36:18 +0000133entry:
134 %0 = add i64 %a, %b
135 store i64 %0, i64 addrspace(1)* %out
136 ret void
137}
Tom Stellarde28859f2014-03-07 20:12:39 +0000138
Tom Stellard326d6ec2014-11-05 14:50:53 +0000139; The v_addc_u32 and v_add_i32 instruction can't read SGPRs, because they
Tom Stellarde28859f2014-03-07 20:12:39 +0000140; use VCC. The test is designed so that %a will be stored in an SGPR and
141; %0 will be stored in a VGPR, so the comiler will be forced to copy %a
142; to a VGPR before doing the add.
143
Tom Stellard79243d92014-10-01 17:15:17 +0000144; FUNC-LABEL: {{^}}add64_sgpr_vgpr:
Marek Olsak37cd4d02015-02-03 21:53:27 +0000145; SI-NOT: v_addc_u32_e32 s
Jan Vesely808fff52015-04-30 17:15:56 +0000146
Matt Arsenault327bb5a2016-07-01 22:47:50 +0000147; EG: MEM_RAT_CACHELESS STORE_RAW [[LO:T[0-9]+\.XY]]
148; EG-DAG: ADD_INT {{[* ]*}}
Jan Vesely808fff52015-04-30 17:15:56 +0000149; EG-DAG: ADDC_UINT
150; EG-DAG: ADD_INT
Matt Arsenault327bb5a2016-07-01 22:47:50 +0000151; EG-DAG: ADD_INT {{[* ]*}}
Jan Vesely808fff52015-04-30 17:15:56 +0000152; EG-NOT: SUB
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000153define amdgpu_kernel void @add64_sgpr_vgpr(i64 addrspace(1)* %out, i64 %a, i64 addrspace(1)* %in) {
Tom Stellarde28859f2014-03-07 20:12:39 +0000154entry:
David Blaikiea79ac142015-02-27 21:17:42 +0000155 %0 = load i64, i64 addrspace(1)* %in
Tom Stellarde28859f2014-03-07 20:12:39 +0000156 %1 = add i64 %a, %0
157 store i64 %1, i64 addrspace(1)* %out
158 ret void
159}
Tom Stellard73b98ed2014-05-15 14:41:54 +0000160
Tom Stellard744b99b2014-09-24 01:33:28 +0000161; Test i64 add inside a branch.
Tom Stellard79243d92014-10-01 17:15:17 +0000162; FUNC-LABEL: {{^}}add64_in_branch:
Marek Olsak37cd4d02015-02-03 21:53:27 +0000163; SI: s_add_u32
164; SI: s_addc_u32
Jan Vesely808fff52015-04-30 17:15:56 +0000165
Matt Arsenault327bb5a2016-07-01 22:47:50 +0000166; EG: MEM_RAT_CACHELESS STORE_RAW [[LO:T[0-9]+\.XY]]
167; EG-DAG: ADD_INT {{[* ]*}}
Jan Vesely808fff52015-04-30 17:15:56 +0000168; EG-DAG: ADDC_UINT
169; EG-DAG: ADD_INT
Matt Arsenault327bb5a2016-07-01 22:47:50 +0000170; EG-DAG: ADD_INT {{[* ]*}}
Jan Vesely808fff52015-04-30 17:15:56 +0000171; EG-NOT: SUB
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000172define amdgpu_kernel void @add64_in_branch(i64 addrspace(1)* %out, i64 addrspace(1)* %in, i64 %a, i64 %b, i64 %c) {
Tom Stellard73b98ed2014-05-15 14:41:54 +0000173entry:
174 %0 = icmp eq i64 %a, 0
175 br i1 %0, label %if, label %else
176
177if:
David Blaikiea79ac142015-02-27 21:17:42 +0000178 %1 = load i64, i64 addrspace(1)* %in
Tom Stellard73b98ed2014-05-15 14:41:54 +0000179 br label %endif
180
181else:
182 %2 = add i64 %a, %b
183 br label %endif
184
185endif:
186 %3 = phi i64 [%1, %if], [%2, %else]
187 store i64 %3, i64 addrspace(1)* %out
188 ret void
189}