blob: 4de881b66f103371c43cdbdad4f90160298fdc36 [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 Veselye5ca27d2014-08-12 17:31:20 +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: {{^}}udiv24_i8:
Tom Stellard326d6ec2014-11-05 14:50:53 +00006; SI: v_cvt_f32_ubyte
7; SI: v_cvt_f32_ubyte
8; SI: v_rcp_f32
9; SI: v_cvt_u32_f32
Jan Veselye5ca27d2014-08-12 17:31:20 +000010
11; EG: UINT_TO_FLT
12; EG-DAG: UINT_TO_FLT
13; EG-DAG: RECIP_IEEE
14; EG: FLT_TO_UINT
15define void @udiv24_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 Veselye5ca27d2014-08-12 17:31:20 +000019 %result = udiv 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: {{^}}udiv24_i16:
Tom Stellard326d6ec2014-11-05 14:50:53 +000025; SI: v_cvt_f32_u32
26; SI: v_cvt_f32_u32
27; SI: v_rcp_f32
28; SI: v_cvt_u32_f32
Jan Veselye5ca27d2014-08-12 17:31:20 +000029
30; EG: UINT_TO_FLT
31; EG-DAG: UINT_TO_FLT
32; EG-DAG: RECIP_IEEE
33; EG: FLT_TO_UINT
34define void @udiv24_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 Veselye5ca27d2014-08-12 17:31:20 +000038 %result = udiv 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: {{^}}udiv24_i32:
Tom Stellard326d6ec2014-11-05 14:50:53 +000044; SI: v_cvt_f32_u32
45; SI-DAG: v_cvt_f32_u32
46; SI-DAG: v_rcp_f32
47; SI: v_cvt_u32_f32
Jan Veselye5ca27d2014-08-12 17:31:20 +000048
49; EG: UINT_TO_FLT
50; EG-DAG: UINT_TO_FLT
51; EG-DAG: RECIP_IEEE
52; EG: FLT_TO_UINT
53define void @udiv24_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 Veselye5ca27d2014-08-12 17:31:20 +000057 %num.i24.0 = shl i32 %num, 8
58 %den.i24.0 = shl i32 %den, 8
59 %num.i24 = lshr i32 %num.i24.0, 8
60 %den.i24 = lshr i32 %den.i24.0, 8
61 %result = udiv 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: {{^}}udiv25_i32:
Jan Veselye5ca27d2014-08-12 17:31:20 +000067; RCP_IFLAG is for URECIP in the full 32b alg
Tom Stellard326d6ec2014-11-05 14:50:53 +000068; SI: v_rcp_iflag
69; SI-NOT: v_rcp_f32
Jan Veselye5ca27d2014-08-12 17:31:20 +000070
71; EG-NOT: UINT_TO_FLT
72; EG-NOT: RECIP_IEEE
73define void @udiv25_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +000074 %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +000075 %num = load i32, i32 addrspace(1) * %in, align 4
76 %den = load i32, i32 addrspace(1) * %den_ptr, align 4
Jan Veselye5ca27d2014-08-12 17:31:20 +000077 %num.i24.0 = shl i32 %num, 7
78 %den.i24.0 = shl i32 %den, 7
79 %num.i24 = lshr i32 %num.i24.0, 7
80 %den.i24 = lshr i32 %den.i24.0, 7
81 %result = udiv i32 %num.i24, %den.i24
82 store i32 %result, i32 addrspace(1)* %out, align 4
83 ret void
84}
85
Tom Stellard79243d92014-10-01 17:15:17 +000086; FUNC-LABEL: {{^}}test_no_udiv24_i32_1:
Jan Veselye5ca27d2014-08-12 17:31:20 +000087; RCP_IFLAG is for URECIP in the full 32b alg
Tom Stellard326d6ec2014-11-05 14:50:53 +000088; SI: v_rcp_iflag
89; SI-NOT: v_rcp_f32
Jan Veselye5ca27d2014-08-12 17:31:20 +000090
91; EG-NOT: UINT_TO_FLT
92; EG-NOT: RECIP_IEEE
93define void @test_no_udiv24_i32_1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +000094 %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +000095 %num = load i32, i32 addrspace(1) * %in, align 4
96 %den = load i32, i32 addrspace(1) * %den_ptr, align 4
Jan Veselye5ca27d2014-08-12 17:31:20 +000097 %num.i24.0 = shl i32 %num, 8
98 %den.i24.0 = shl i32 %den, 7
99 %num.i24 = lshr i32 %num.i24.0, 8
100 %den.i24 = lshr i32 %den.i24.0, 7
101 %result = udiv i32 %num.i24, %den.i24
102 store i32 %result, i32 addrspace(1)* %out, align 4
103 ret void
104}
105
Tom Stellard79243d92014-10-01 17:15:17 +0000106; FUNC-LABEL: {{^}}test_no_udiv24_i32_2:
Jan Veselye5ca27d2014-08-12 17:31:20 +0000107; RCP_IFLAG is for URECIP in the full 32b alg
Tom Stellard326d6ec2014-11-05 14:50:53 +0000108; SI: v_rcp_iflag
109; SI-NOT: v_rcp_f32
Jan Veselye5ca27d2014-08-12 17:31:20 +0000110
111; EG-NOT: UINT_TO_FLT
112; EG-NOT: RECIP_IEEE
113define void @test_no_udiv24_i32_2(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +0000114 %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +0000115 %num = load i32, i32 addrspace(1) * %in, align 4
116 %den = load i32, i32 addrspace(1) * %den_ptr, align 4
Jan Veselye5ca27d2014-08-12 17:31:20 +0000117 %num.i24.0 = shl i32 %num, 7
118 %den.i24.0 = shl i32 %den, 8
119 %num.i24 = lshr i32 %num.i24.0, 7
120 %den.i24 = lshr i32 %den.i24.0, 8
121 %result = udiv i32 %num.i24, %den.i24
122 store i32 %result, i32 addrspace(1)* %out, align 4
123 ret void
124}
125
Tom Stellard79243d92014-10-01 17:15:17 +0000126; FUNC-LABEL: {{^}}urem24_i8:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000127; SI: v_cvt_f32_ubyte
128; SI: v_cvt_f32_ubyte
129; SI: v_rcp_f32
130; SI: v_cvt_u32_f32
Jan Veselye5ca27d2014-08-12 17:31:20 +0000131
132; EG: UINT_TO_FLT
133; EG-DAG: UINT_TO_FLT
134; EG-DAG: RECIP_IEEE
135; EG: FLT_TO_UINT
136define void @urem24_i8(i8 addrspace(1)* %out, i8 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +0000137 %den_ptr = getelementptr i8, i8 addrspace(1)* %in, i8 1
David Blaikiea79ac142015-02-27 21:17:42 +0000138 %num = load i8, i8 addrspace(1) * %in
139 %den = load i8, i8 addrspace(1) * %den_ptr
Jan Veselye5ca27d2014-08-12 17:31:20 +0000140 %result = urem i8 %num, %den
141 store i8 %result, i8 addrspace(1)* %out
142 ret void
143}
144
Tom Stellard79243d92014-10-01 17:15:17 +0000145; FUNC-LABEL: {{^}}urem24_i16:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000146; SI: v_cvt_f32_u32
147; SI: v_cvt_f32_u32
148; SI: v_rcp_f32
149; SI: v_cvt_u32_f32
Jan Veselye5ca27d2014-08-12 17:31:20 +0000150
151; EG: UINT_TO_FLT
152; EG-DAG: UINT_TO_FLT
153; EG-DAG: RECIP_IEEE
154; EG: FLT_TO_UINT
155define void @urem24_i16(i16 addrspace(1)* %out, i16 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +0000156 %den_ptr = getelementptr i16, i16 addrspace(1)* %in, i16 1
David Blaikiea79ac142015-02-27 21:17:42 +0000157 %num = load i16, i16 addrspace(1) * %in, align 2
158 %den = load i16, i16 addrspace(1) * %den_ptr, align 2
Jan Veselye5ca27d2014-08-12 17:31:20 +0000159 %result = urem i16 %num, %den
160 store i16 %result, i16 addrspace(1)* %out, align 2
161 ret void
162}
163
Tom Stellard79243d92014-10-01 17:15:17 +0000164; FUNC-LABEL: {{^}}urem24_i32:
Tom Stellard326d6ec2014-11-05 14:50:53 +0000165; SI: v_cvt_f32_u32
166; SI: v_cvt_f32_u32
167; SI: v_rcp_f32
168; SI: v_cvt_u32_f32
Jan Veselye5ca27d2014-08-12 17:31:20 +0000169
170; EG: UINT_TO_FLT
171; EG-DAG: UINT_TO_FLT
172; EG-DAG: RECIP_IEEE
173; EG: FLT_TO_UINT
174define void @urem24_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +0000175 %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +0000176 %num = load i32, i32 addrspace(1) * %in, align 4
177 %den = load i32, i32 addrspace(1) * %den_ptr, align 4
Jan Veselye5ca27d2014-08-12 17:31:20 +0000178 %num.i24.0 = shl i32 %num, 8
179 %den.i24.0 = shl i32 %den, 8
180 %num.i24 = lshr i32 %num.i24.0, 8
181 %den.i24 = lshr i32 %den.i24.0, 8
182 %result = urem i32 %num.i24, %den.i24
183 store i32 %result, i32 addrspace(1)* %out, align 4
184 ret void
185}
186
Tom Stellard79243d92014-10-01 17:15:17 +0000187; FUNC-LABEL: {{^}}urem25_i32:
Jan Veselye5ca27d2014-08-12 17:31:20 +0000188; RCP_IFLAG is for URECIP in the full 32b alg
Tom Stellard326d6ec2014-11-05 14:50:53 +0000189; SI: v_rcp_iflag
190; SI-NOT: v_rcp_f32
Jan Veselye5ca27d2014-08-12 17:31:20 +0000191
192; EG-NOT: UINT_TO_FLT
193; EG-NOT: RECIP_IEEE
194define void @urem25_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +0000195 %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +0000196 %num = load i32, i32 addrspace(1) * %in, align 4
197 %den = load i32, i32 addrspace(1) * %den_ptr, align 4
Jan Veselye5ca27d2014-08-12 17:31:20 +0000198 %num.i24.0 = shl i32 %num, 7
199 %den.i24.0 = shl i32 %den, 7
200 %num.i24 = lshr i32 %num.i24.0, 7
201 %den.i24 = lshr i32 %den.i24.0, 7
202 %result = urem i32 %num.i24, %den.i24
203 store i32 %result, i32 addrspace(1)* %out, align 4
204 ret void
205}
206
Tom Stellard79243d92014-10-01 17:15:17 +0000207; FUNC-LABEL: {{^}}test_no_urem24_i32_1:
Jan Veselye5ca27d2014-08-12 17:31:20 +0000208; RCP_IFLAG is for URECIP in the full 32b alg
Tom Stellard326d6ec2014-11-05 14:50:53 +0000209; SI: v_rcp_iflag
210; SI-NOT: v_rcp_f32
Jan Veselye5ca27d2014-08-12 17:31:20 +0000211
212; EG-NOT: UINT_TO_FLT
213; EG-NOT: RECIP_IEEE
214define void @test_no_urem24_i32_1(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +0000215 %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +0000216 %num = load i32, i32 addrspace(1) * %in, align 4
217 %den = load i32, i32 addrspace(1) * %den_ptr, align 4
Jan Veselye5ca27d2014-08-12 17:31:20 +0000218 %num.i24.0 = shl i32 %num, 8
219 %den.i24.0 = shl i32 %den, 7
220 %num.i24 = lshr i32 %num.i24.0, 8
221 %den.i24 = lshr i32 %den.i24.0, 7
222 %result = urem i32 %num.i24, %den.i24
223 store i32 %result, i32 addrspace(1)* %out, align 4
224 ret void
225}
226
Tom Stellard79243d92014-10-01 17:15:17 +0000227; FUNC-LABEL: {{^}}test_no_urem24_i32_2:
Jan Veselye5ca27d2014-08-12 17:31:20 +0000228; RCP_IFLAG is for URECIP in the full 32b alg
Tom Stellard326d6ec2014-11-05 14:50:53 +0000229; SI: v_rcp_iflag
230; SI-NOT: v_rcp_f32
Jan Veselye5ca27d2014-08-12 17:31:20 +0000231
232; EG-NOT: UINT_TO_FLT
233; EG-NOT: RECIP_IEEE
234define void @test_no_urem24_i32_2(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
David Blaikie79e6c742015-02-27 19:29:02 +0000235 %den_ptr = getelementptr i32, i32 addrspace(1)* %in, i32 1
David Blaikiea79ac142015-02-27 21:17:42 +0000236 %num = load i32, i32 addrspace(1) * %in, align 4
237 %den = load i32, i32 addrspace(1) * %den_ptr, align 4
Jan Veselye5ca27d2014-08-12 17:31:20 +0000238 %num.i24.0 = shl i32 %num, 7
239 %den.i24.0 = shl i32 %den, 8
240 %num.i24 = lshr i32 %num.i24.0, 7
241 %den.i24 = lshr i32 %den.i24.0, 8
242 %result = urem i32 %num.i24, %den.i24
243 store i32 %result, i32 addrspace(1)* %out, align 4
244 ret void
245}