1;RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck --check-prefix=SI --check-prefix=GCN --check-prefix=FUNC %s
2;RUN: llc -march=amdgcn -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck --check-prefix=VI --check-prefix=GCN --check-prefix=FUNC %s
3;RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck --check-prefix=EG --check-prefix=FUNC %s
4
5;FUNC-LABEL: {{^}}s_test_sdiv:
6;EG: RECIP_UINT
7;EG: LSHL {{.*}}, 1,
8;EG: BFE_UINT
9;EG: BFE_UINT
10;EG: BFE_UINT
11;EG: BFE_UINT
12;EG: BFE_UINT
13;EG: BFE_UINT
14;EG: BFE_UINT
15;EG: BFE_UINT
16;EG: BFE_UINT
17;EG: BFE_UINT
18;EG: BFE_UINT
19;EG: BFE_UINT
20;EG: BFE_UINT
21;EG: BFE_UINT
22;EG: BFE_UINT
23;EG: BFE_UINT
24;EG: BFE_UINT
25;EG: BFE_UINT
26;EG: BFE_UINT
27;EG: BFE_UINT
28;EG: BFE_UINT
29;EG: BFE_UINT
30;EG: BFE_UINT
31;EG: BFE_UINT
32;EG: BFE_UINT
33;EG: BFE_UINT
34;EG: BFE_UINT
35;EG: BFE_UINT
36;EG: BFE_UINT
37;EG: BFE_UINT
38
39;GCN: v_mac_f32_e32 v{{[0-9]+}}, 0x4f800000,
40;GCN: v_rcp_f32_e32
41;GCN: v_mul_f32_e32 v{{[0-9]+}}, 0x5f7ffffc
42;GCN: v_mul_f32_e32 v{{[0-9]+}}, 0x2f800000
43;GCN: v_trunc_f32_e32
44;GCN: v_mac_f32_e32 v{{[0-9]+}}, 0xcf800000
45;GCN: s_endpgm
46define amdgpu_kernel void @s_test_sdiv(i64 addrspace(1)* %out, i64 %x, i64 %y) {
47  %result = sdiv i64 %x, %y
48  store i64 %result, i64 addrspace(1)* %out
49  ret void
50}
51
52;FUNC-LABEL: {{^}}s_test_srem:
53;EG: RECIP_UINT
54;EG: BFE_UINT
55;EG: BFE_UINT
56;EG: BFE_UINT
57;EG: BFE_UINT
58;EG: BFE_UINT
59;EG: BFE_UINT
60;EG: BFE_UINT
61;EG: BFE_UINT
62;EG: BFE_UINT
63;EG: BFE_UINT
64;EG: BFE_UINT
65;EG: BFE_UINT
66;EG: BFE_UINT
67;EG: BFE_UINT
68;EG: BFE_UINT
69;EG: BFE_UINT
70;EG: BFE_UINT
71;EG: BFE_UINT
72;EG: BFE_UINT
73;EG: BFE_UINT
74;EG: BFE_UINT
75;EG: BFE_UINT
76;EG: BFE_UINT
77;EG: BFE_UINT
78;EG: BFE_UINT
79;EG: BFE_UINT
80;EG: BFE_UINT
81;EG: BFE_UINT
82;EG: BFE_UINT
83;EG: BFE_UINT
84;EG: AND_INT {{.*}}, 1,
85
86;GCN: v_mac_f32_e32 v{{[0-9]+}}, 0x4f800000,
87;GCN: v_rcp_f32_e32
88;GCN: v_mul_f32_e32 v{{[0-9]+}}, 0x5f7ffffc
89;GCN: v_mul_f32_e32 v{{[0-9]+}}, 0x2f800000
90;GCN: v_trunc_f32_e32
91;GCN: v_mac_f32_e32 v{{[0-9]+}}, 0xcf800000
92;GCN: s_endpgm
93define amdgpu_kernel void @s_test_srem(i64 addrspace(1)* %out, i64 %x, i64 %y) {
94  %result = urem i64 %x, %y
95  store i64 %result, i64 addrspace(1)* %out
96  ret void
97}
98
99;FUNC-LABEL: {{^}}test_sdiv3264:
100;EG: RECIP_UINT
101;EG-NOT: BFE_UINT
102
103;GCN-NOT: s_bfe_u32
104;GCN-NOT: v_mad_f32
105;SI-NOT: v_lshr_b64
106;VI-NOT: v_lshrrev_b64
107;GCN: s_endpgm
108define amdgpu_kernel void @test_sdiv3264(i64 addrspace(1)* %out, i64 %x, i64 %y) {
109  %1 = ashr i64 %x, 33
110  %2 = ashr i64 %y, 33
111  %result = sdiv i64 %1, %2
112  store i64 %result, i64 addrspace(1)* %out
113  ret void
114}
115
116;FUNC-LABEL: {{^}}test_srem3264:
117;EG: RECIP_UINT
118;EG-NOT: BFE_UINT
119
120;GCN-NOT: s_bfe_u32
121;GCN-NOT: v_mad_f32
122;SI-NOT: v_lshr_b64
123;VI-NOT: v_lshrrev_b64
124;GCN: s_endpgm
125define amdgpu_kernel void @test_srem3264(i64 addrspace(1)* %out, i64 %x, i64 %y) {
126  %1 = ashr i64 %x, 33
127  %2 = ashr i64 %y, 33
128  %result = srem i64 %1, %2
129  store i64 %result, i64 addrspace(1)* %out
130  ret void
131}
132
133;FUNC-LABEL: {{^}}test_sdiv2464:
134;EG: INT_TO_FLT
135;EG: INT_TO_FLT
136;EG: FLT_TO_INT
137;EG-NOT: RECIP_UINT
138;EG-NOT: BFE_UINT
139
140;GCN-NOT: s_bfe_u32
141;GCN: v_mad_f32
142;SI-NOT: v_lshr_b64
143;VI-NOT: v_lshrrev_b64
144;GCN: s_endpgm
145define amdgpu_kernel void @test_sdiv2464(i64 addrspace(1)* %out, i64 %x, i64 %y) {
146  %1 = ashr i64 %x, 40
147  %2 = ashr i64 %y, 40
148  %result = sdiv i64 %1, %2
149  store i64 %result, i64 addrspace(1)* %out
150  ret void
151}
152
153;FUNC-LABEL: {{^}}test_srem2464:
154;EG: INT_TO_FLT
155;EG: INT_TO_FLT
156;EG: FLT_TO_INT
157;EG-NOT: RECIP_UINT
158;EG-NOT: BFE_UINT
159
160;GCN-NOT: s_bfe_u32
161;GCN: v_mad_f32
162;SI-NOT: v_lshr_b64
163;VI-NOT: v_lshrrev_b64
164;GCN: s_endpgm
165define amdgpu_kernel void @test_srem2464(i64 addrspace(1)* %out, i64 %x, i64 %y) {
166  %1 = ashr i64 %x, 40
167  %2 = ashr i64 %y, 40
168  %result = srem i64 %1, %2
169  store i64 %result, i64 addrspace(1)* %out
170  ret void
171}
172