1 ; Test 64-bit signed division and remainder when the divisor is
2 ; a signed-extended i32.
4 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
6 ; Test register division. The result is in the second of the two registers.
7 define void @f1(i64 %dummy, i64 %a, i32 %b, i64 *%dest) {
9 ; CHECK-NOT: {{%r[234]}}
10 ; CHECK: dsgfr %r2, %r4
11 ; CHECK: stg %r3, 0(%r5)
13 %bext = sext i32 %b to i64
14 %div = sdiv i64 %a, %bext
15 store i64 %div, i64 *%dest
19 ; Test register remainder. The result is in the first of the two registers.
20 define void @f2(i64 %dummy, i64 %a, i32 %b, i64 *%dest) {
22 ; CHECK-NOT: {{%r[234]}}
23 ; CHECK: dsgfr %r2, %r4
24 ; CHECK: stg %r2, 0(%r5)
26 %bext = sext i32 %b to i64
27 %rem = srem i64 %a, %bext
28 store i64 %rem, i64 *%dest
32 ; Test that division and remainder use a single instruction.
33 define i64 @f3(i64 %dummy, i64 %a, i32 %b) {
35 ; CHECK-NOT: {{%r[234]}}
36 ; CHECK: dsgfr %r2, %r4
39 %bext = sext i32 %b to i64
40 %div = sdiv i64 %a, %bext
41 %rem = srem i64 %a, %bext
42 %or = or i64 %rem, %div
46 ; Test register division when the dividend is zero rather than sign extended.
47 ; We can't use dsgfr here
48 define void @f4(i64 %dummy, i64 %a, i32 %b, i64 *%dest) {
52 %bext = zext i32 %b to i64
53 %div = sdiv i64 %a, %bext
54 store i64 %div, i64 *%dest
58 ; ...likewise remainder.
59 define void @f5(i64 %dummy, i64 %a, i32 %b, i64 *%dest) {
63 %bext = zext i32 %b to i64
64 %rem = srem i64 %a, %bext
65 store i64 %rem, i64 *%dest
69 ; Test memory division with no displacement.
70 define void @f6(i64 %dummy, i64 %a, i32 *%src, i64 *%dest) {
72 ; CHECK-NOT: {{%r[234]}}
73 ; CHECK: dsgf %r2, 0(%r4)
74 ; CHECK: stg %r3, 0(%r5)
77 %bext = sext i32 %b to i64
78 %div = sdiv i64 %a, %bext
79 store i64 %div, i64 *%dest
83 ; Test memory remainder with no displacement.
84 define void @f7(i64 %dummy, i64 %a, i32 *%src, i64 *%dest) {
86 ; CHECK-NOT: {{%r[234]}}
87 ; CHECK: dsgf %r2, 0(%r4)
88 ; CHECK: stg %r2, 0(%r5)
91 %bext = sext i32 %b to i64
92 %rem = srem i64 %a, %bext
93 store i64 %rem, i64 *%dest
97 ; Test both memory division and memory remainder.
98 define i64 @f8(i64 %dummy, i64 %a, i32 *%src) {
100 ; CHECK-NOT: {{%r[234]}}
101 ; CHECK: dsgf %r2, 0(%r4)
102 ; CHECK-NOT: {{dsgf|dsgfr}}
103 ; CHECK: ogr %r2, %r3
106 %bext = sext i32 %b to i64
107 %div = sdiv i64 %a, %bext
108 %rem = srem i64 %a, %bext
109 %or = or i64 %rem, %div
113 ; Check the high end of the DSGF range.
114 define i64 @f9(i64 %dummy, i64 %a, i32 *%src) {
116 ; CHECK: dsgf %r2, 524284(%r4)
118 %ptr = getelementptr i32 *%src, i64 131071
120 %bext = sext i32 %b to i64
121 %rem = srem i64 %a, %bext
125 ; Check the next word up, which needs separate address logic.
126 ; Other sequences besides this one would be OK.
127 define i64 @f10(i64 %dummy, i64 %a, i32 *%src) {
129 ; CHECK: agfi %r4, 524288
130 ; CHECK: dsgf %r2, 0(%r4)
132 %ptr = getelementptr i32 *%src, i64 131072
134 %bext = sext i32 %b to i64
135 %rem = srem i64 %a, %bext
139 ; Check the high end of the negative aligned DSGF range.
140 define i64 @f11(i64 %dummy, i64 %a, i32 *%src) {
142 ; CHECK: dsgf %r2, -4(%r4)
144 %ptr = getelementptr i32 *%src, i64 -1
146 %bext = sext i32 %b to i64
147 %rem = srem i64 %a, %bext
151 ; Check the low end of the DSGF range.
152 define i64 @f12(i64 %dummy, i64 %a, i32 *%src) {
154 ; CHECK: dsgf %r2, -524288(%r4)
156 %ptr = getelementptr i32 *%src, i64 -131072
158 %bext = sext i32 %b to i64
159 %rem = srem i64 %a, %bext
163 ; Check the next word down, which needs separate address logic.
164 ; Other sequences besides this one would be OK.
165 define i64 @f13(i64 %dummy, i64 %a, i32 *%src) {
167 ; CHECK: agfi %r4, -524292
168 ; CHECK: dsgf %r2, 0(%r4)
170 %ptr = getelementptr i32 *%src, i64 -131073
172 %bext = sext i32 %b to i64
173 %rem = srem i64 %a, %bext
177 ; Check that DSGF allows an index.
178 define i64 @f14(i64 %dummy, i64 %a, i64 %src, i64 %index) {
180 ; CHECK: dsgf %r2, 524287(%r5,%r4)
182 %add1 = add i64 %src, %index
183 %add2 = add i64 %add1, 524287
184 %ptr = inttoptr i64 %add2 to i32 *
186 %bext = sext i32 %b to i64
187 %rem = srem i64 %a, %bext