blob: ad5df39f5505e45e052184792d5e1695a0dfa0fd [file] [log] [blame]
Tom Stellard49f8bfd2015-01-06 18:00:21 +00001; RUN: llc -march=amdgcn -mcpu=SI < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
Marek Olsak75170772015-01-27 17:27:15 +00002; RUN: llc -march=amdgcn -mcpu=tonga < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
Jan Vesely4a33bc62014-08-12 17:31:17 +00003; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
4
Tom Stellard79243d92014-10-01 17:15:17 +00005; FUNC-LABEL: {{^}}sdiv24_i8:
Tom Stellard326d6ec2014-11-05 14:50:53 +00006; SI: v_cvt_f32_i32
7; SI: v_cvt_f32_i32
8; SI: v_rcp_f32
9; SI: v_cvt_i32_f32
Jan Vesely4a33bc62014-08-12 17:31:17 +000010
11; EG: INT_TO_FLT
12; EG-DAG: INT_TO_FLT
13; EG-DAG: RECIP_IEEE
14; EG: FLT_TO_INT
15define void @sdiv24_i8(i8 addrspace(1)* %out, i8 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +000016 %den_ptr = getelementptr i8, i8 addrspace(1)* %in, i8 1
David Blaikiea79ac142015-02-27 21:17:42 +000017 %num = load i8, i8 addrspace(1) * %in
18 %den = load i8, i8 addrspace(1) * %den_ptr
Jan Vesely4a33bc62014-08-12 17:31:17 +000019 %result = sdiv i8 %num, %den
20 store i8 %result, i8 addrspace(1)* %out
21 ret void
22}
23
Tom Stellard79243d92014-10-01 17:15:17 +000024; FUNC-LABEL: {{^}}sdiv24_i16:
Tom Stellard326d6ec2014-11-05 14:50:53 +000025; SI: v_cvt_f32_i32
26; SI: v_cvt_f32_i32
27; SI: v_rcp_f32
28; SI: v_cvt_i32_f32
Jan Vesely4a33bc62014-08-12 17:31:17 +000029
30; EG: INT_TO_FLT
31; EG-DAG: INT_TO_FLT
32; EG-DAG: RECIP_IEEE
33; EG: FLT_TO_INT
34define void @sdiv24_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +000035 %den_ptr = getelementptr i16, i16 addrspace(1)* %in, i16 1
David Blaikiea79ac142015-02-27 21:17:42 +000036 %num = load i16, i16 addrspace(1) * %in, align 2
37 %den = load i16, i16 addrspace(1) * %den_ptr, align 2
Jan Vesely4a33bc62014-08-12 17:31:17 +000038 %result = sdiv i16 %num, %den
39 store i16 %result, i16 addrspace(1)* %out, align 2
40 ret void
41}
42
Tom Stellard79243d92014-10-01 17:15:17 +000043; FUNC-LABEL: {{^}}sdiv24_i32:
Tom Stellard326d6ec2014-11-05 14:50:53 +000044; SI: v_cvt_f32_i32
45; SI: v_cvt_f32_i32
46; SI: v_rcp_f32
47; SI: v_cvt_i32_f32
Jan Vesely4a33bc62014-08-12 17:31:17 +000048
49; EG: INT_TO_FLT
50; EG-DAG: INT_TO_FLT
51; EG-DAG: RECIP_IEEE
52; EG: FLT_TO_INT
53define void @sdiv24_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +000054 %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +000055 %num = load i32, i32 addrspace(1) * %in, align 4
56 %den = load i32, i32 addrspace(1) * %den_ptr, align 4
Jan Vesely4a33bc62014-08-12 17:31:17 +000057 %num.i24.0 = shl i32 %num, 8
58 %den.i24.0 = shl i32 %den, 8
59 %num.i24 = ashr i32 %num.i24.0, 8
60 %den.i24 = ashr i32 %den.i24.0, 8
61 %result = sdiv i32 %num.i24, %den.i24
62 store i32 %result, i32 addrspace(1)* %out, align 4
63 ret void
64}
65
Tom Stellard79243d92014-10-01 17:15:17 +000066; FUNC-LABEL: {{^}}sdiv25_i32:
Tom Stellard326d6ec2014-11-05 14:50:53 +000067; SI-NOT: v_cvt_f32_i32
68; SI-NOT: v_rcp_f32
Jan Vesely4a33bc62014-08-12 17:31:17 +000069
70; EG-NOT: INT_TO_FLT
71; EG-NOT: RECIP_IEEE
72define void @sdiv25_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +000073 %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +000074 %num = load i32, i32 addrspace(1) * %in, align 4
75 %den = load i32, i32 addrspace(1) * %den_ptr, align 4
Jan Vesely4a33bc62014-08-12 17:31:17 +000076 %num.i24.0 = shl i32 %num, 7
77 %den.i24.0 = shl i32 %den, 7
78 %num.i24 = ashr i32 %num.i24.0, 7
79 %den.i24 = ashr i32 %den.i24.0, 7
80 %result = sdiv i32 %num.i24, %den.i24
81 store i32 %result, i32 addrspace(1)* %out, align 4
82 ret void
83}
84
Tom Stellard79243d92014-10-01 17:15:17 +000085; FUNC-LABEL: {{^}}test_no_sdiv24_i32_1:
Tom Stellard326d6ec2014-11-05 14:50:53 +000086; SI-NOT: v_cvt_f32_i32
87; SI-NOT: v_rcp_f32
Jan Vesely4a33bc62014-08-12 17:31:17 +000088
89; EG-NOT: INT_TO_FLT
90; EG-NOT: RECIP_IEEE
91define void @test_no_sdiv24_i32_1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +000092 %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +000093 %num = load i32, i32 addrspace(1) * %in, align 4
94 %den = load i32, i32 addrspace(1) * %den_ptr, align 4
Jan Vesely4a33bc62014-08-12 17:31:17 +000095 %num.i24.0 = shl i32 %num, 8
96 %den.i24.0 = shl i32 %den, 7
97 %num.i24 = ashr i32 %num.i24.0, 8
98 %den.i24 = ashr i32 %den.i24.0, 7
99 %result = sdiv i32 %num.i24, %den.i24
100 store i32 %result, i32 addrspace(1)* %out, align 4
101 ret void
102}
103
Tom Stellard79243d92014-10-01 17:15:17 +0000104; FUNC-LABEL: {{^}}test_no_sdiv24_i32_2:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000105; SI-NOT: v_cvt_f32_i32
106; SI-NOT: v_rcp_f32
Jan Vesely4a33bc62014-08-12 17:31:17 +0000107
108; EG-NOT: INT_TO_FLT
109; EG-NOT: RECIP_IEEE
110define void @test_no_sdiv24_i32_2(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +0000111 %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +0000112 %num = load i32, i32 addrspace(1) * %in, align 4
113 %den = load i32, i32 addrspace(1) * %den_ptr, align 4
Jan Vesely4a33bc62014-08-12 17:31:17 +0000114 %num.i24.0 = shl i32 %num, 7
115 %den.i24.0 = shl i32 %den, 8
116 %num.i24 = ashr i32 %num.i24.0, 7
117 %den.i24 = ashr i32 %den.i24.0, 8
118 %result = sdiv i32 %num.i24, %den.i24
119 store i32 %result, i32 addrspace(1)* %out, align 4
120 ret void
121}
122
Tom Stellard79243d92014-10-01 17:15:17 +0000123; FUNC-LABEL: {{^}}srem24_i8:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000124; SI: v_cvt_f32_i32
125; SI: v_cvt_f32_i32
126; SI: v_rcp_f32
127; SI: v_cvt_i32_f32
Jan Vesely4a33bc62014-08-12 17:31:17 +0000128
129; EG: INT_TO_FLT
130; EG-DAG: INT_TO_FLT
131; EG-DAG: RECIP_IEEE
132; EG: FLT_TO_INT
133define void @srem24_i8(i8 addrspace(1)* %out, i8 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +0000134 %den_ptr = getelementptr i8, i8 addrspace(1)* %in, i8 1
David Blaikiea79ac142015-02-27 21:17:42 +0000135 %num = load i8, i8 addrspace(1) * %in
136 %den = load i8, i8 addrspace(1) * %den_ptr
Jan Vesely4a33bc62014-08-12 17:31:17 +0000137 %result = srem i8 %num, %den
138 store i8 %result, i8 addrspace(1)* %out
139 ret void
140}
141
Tom Stellard79243d92014-10-01 17:15:17 +0000142; FUNC-LABEL: {{^}}srem24_i16:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000143; SI: v_cvt_f32_i32
144; SI: v_cvt_f32_i32
145; SI: v_rcp_f32
146; SI: v_cvt_i32_f32
Jan Vesely4a33bc62014-08-12 17:31:17 +0000147
148; EG: INT_TO_FLT
149; EG-DAG: INT_TO_FLT
150; EG-DAG: RECIP_IEEE
151; EG: FLT_TO_INT
152define void @srem24_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +0000153 %den_ptr = getelementptr i16, i16 addrspace(1)* %in, i16 1
David Blaikiea79ac142015-02-27 21:17:42 +0000154 %num = load i16, i16 addrspace(1) * %in, align 2
155 %den = load i16, i16 addrspace(1) * %den_ptr, align 2
Jan Vesely4a33bc62014-08-12 17:31:17 +0000156 %result = srem i16 %num, %den
157 store i16 %result, i16 addrspace(1)* %out, align 2
158 ret void
159}
160
Tom Stellard79243d92014-10-01 17:15:17 +0000161; FUNC-LABEL: {{^}}srem24_i32:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000162; SI: v_cvt_f32_i32
163; SI: v_cvt_f32_i32
164; SI: v_rcp_f32
165; SI: v_cvt_i32_f32
Jan Vesely4a33bc62014-08-12 17:31:17 +0000166
167; EG: INT_TO_FLT
168; EG-DAG: INT_TO_FLT
169; EG-DAG: RECIP_IEEE
170; EG: FLT_TO_INT
171define void @srem24_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +0000172 %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +0000173 %num = load i32, i32 addrspace(1) * %in, align 4
174 %den = load i32, i32 addrspace(1) * %den_ptr, align 4
Jan Vesely4a33bc62014-08-12 17:31:17 +0000175 %num.i24.0 = shl i32 %num, 8
176 %den.i24.0 = shl i32 %den, 8
177 %num.i24 = ashr i32 %num.i24.0, 8
178 %den.i24 = ashr i32 %den.i24.0, 8
179 %result = srem i32 %num.i24, %den.i24
180 store i32 %result, i32 addrspace(1)* %out, align 4
181 ret void
182}
183
Tom Stellard79243d92014-10-01 17:15:17 +0000184; FUNC-LABEL: {{^}}srem25_i32:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000185; SI-NOT: v_cvt_f32_i32
186; SI-NOT: v_rcp_f32
Jan Vesely4a33bc62014-08-12 17:31:17 +0000187
188; EG-NOT: INT_TO_FLT
189; EG-NOT: RECIP_IEEE
190define void @srem25_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +0000191 %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +0000192 %num = load i32, i32 addrspace(1) * %in, align 4
193 %den = load i32, i32 addrspace(1) * %den_ptr, align 4
Jan Vesely4a33bc62014-08-12 17:31:17 +0000194 %num.i24.0 = shl i32 %num, 7
195 %den.i24.0 = shl i32 %den, 7
196 %num.i24 = ashr i32 %num.i24.0, 7
197 %den.i24 = ashr i32 %den.i24.0, 7
198 %result = srem i32 %num.i24, %den.i24
199 store i32 %result, i32 addrspace(1)* %out, align 4
200 ret void
201}
202
Tom Stellard79243d92014-10-01 17:15:17 +0000203; FUNC-LABEL: {{^}}test_no_srem24_i32_1:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000204; SI-NOT: v_cvt_f32_i32
205; SI-NOT: v_rcp_f32
Jan Vesely4a33bc62014-08-12 17:31:17 +0000206
207; EG-NOT: INT_TO_FLT
208; EG-NOT: RECIP_IEEE
209define void @test_no_srem24_i32_1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +0000210 %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +0000211 %num = load i32, i32 addrspace(1) * %in, align 4
212 %den = load i32, i32 addrspace(1) * %den_ptr, align 4
Jan Vesely4a33bc62014-08-12 17:31:17 +0000213 %num.i24.0 = shl i32 %num, 8
214 %den.i24.0 = shl i32 %den, 7
215 %num.i24 = ashr i32 %num.i24.0, 8
216 %den.i24 = ashr i32 %den.i24.0, 7
217 %result = srem i32 %num.i24, %den.i24
218 store i32 %result, i32 addrspace(1)* %out, align 4
219 ret void
220}
221
Tom Stellard79243d92014-10-01 17:15:17 +0000222; FUNC-LABEL: {{^}}test_no_srem24_i32_2:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000223; SI-NOT: v_cvt_f32_i32
224; SI-NOT: v_rcp_f32
Jan Vesely4a33bc62014-08-12 17:31:17 +0000225
226; EG-NOT: INT_TO_FLT
227; EG-NOT: RECIP_IEEE
228define void @test_no_srem24_i32_2(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +0000229 %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +0000230 %num = load i32, i32 addrspace(1) * %in, align 4
231 %den = load i32, i32 addrspace(1) * %den_ptr, align 4
Jan Vesely4a33bc62014-08-12 17:31:17 +0000232 %num.i24.0 = shl i32 %num, 7
233 %den.i24.0 = shl i32 %den, 8
234 %num.i24 = ashr i32 %num.i24.0, 7
235 %den.i24 = ashr i32 %den.i24.0, 8
236 %result = srem i32 %num.i24, %den.i24
237 store i32 %result, i32 addrspace(1)* %out, align 4
238 ret void
239}