1 ; Test memcmp using CLC, with i64 results.
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
5 declare i64 @memcmp(i8 *%src1, i8 *%src2, i64 %size)
7 ; Zero-length comparisons should be optimized away.
8 define i64 @f1(i8 *%src1, i8 *%src2) {
12 %res = call i64 @memcmp(i8 *%src1, i8 *%src2, i64 0)
16 ; Check a case where the result is used as an integer.
17 define i64 @f2(i8 *%src1, i8 *%src2) {
19 ; CHECK: clc 0(2,%r2), 0(%r3)
20 ; CHECK: ipm [[REG:%r[0-5]]]
21 ; CHECK: srl [[REG]], 28
22 ; CHECK: rll [[REG]], [[REG]], 31
23 ; CHECK: lgfr %r2, [[REG]]
25 %res = call i64 @memcmp(i8 *%src1, i8 *%src2, i64 2)
29 ; Check a case where the result is tested for equality.
30 define void @f3(i8 *%src1, i8 *%src2, i64 *%dest) {
32 ; CHECK: clc 0(3,%r2), 0(%r3)
33 ; CHECK-NEXT: je {{\..*}}
35 %res = call i64 @memcmp(i8 *%src1, i8 *%src2, i64 3)
36 %cmp = icmp eq i64 %res, 0
37 br i1 %cmp, label %exit, label %store
40 store i64 0, i64 *%dest
47 ; Check a case where the result is tested for inequality.
48 define void @f4(i8 *%src1, i8 *%src2, i64 *%dest) {
50 ; CHECK: clc 0(4,%r2), 0(%r3)
51 ; CHECK-NEXT: jlh {{\..*}}
54 %res = call i64 @memcmp(i8 *%src1, i8 *%src2, i64 4)
55 %cmp = icmp ne i64 %res, 0
56 br i1 %cmp, label %exit, label %store
59 store i64 0, i64 *%dest
66 ; Check a case where the result is tested via slt.
67 define void @f5(i8 *%src1, i8 *%src2, i64 *%dest) {
69 ; CHECK: clc 0(5,%r2), 0(%r3)
70 ; CHECK-NEXT: jl {{\..*}}
73 %res = call i64 @memcmp(i8 *%src1, i8 *%src2, i64 5)
74 %cmp = icmp slt i64 %res, 0
75 br i1 %cmp, label %exit, label %store
78 store i64 0, i64 *%dest
85 ; Check a case where the result is tested for sgt.
86 define void @f6(i8 *%src1, i8 *%src2, i64 *%dest) {
88 ; CHECK: clc 0(6,%r2), 0(%r3)
89 ; CHECK-NEXT: jh {{\..*}}
92 %res = call i64 @memcmp(i8 *%src1, i8 *%src2, i64 6)
93 %cmp = icmp sgt i64 %res, 0
94 br i1 %cmp, label %exit, label %store
97 store i64 0, i64 *%dest
104 ; Check the upper end of the CLC range. Here the result is used both as
105 ; an integer and for branching.
106 define i64 @f7(i8 *%src1, i8 *%src2, i64 *%dest) {
108 ; CHECK: clc 0(256,%r2), 0(%r3)
109 ; CHECK: ipm [[REG:%r[0-5]]]
110 ; CHECK: srl [[REG]], 28
111 ; CHECK: rll [[REG]], [[REG]], 31
112 ; CHECK: lgfr %r2, [[REG]]
116 %res = call i64 @memcmp(i8 *%src1, i8 *%src2, i64 256)
117 %cmp = icmp slt i64 %res, 0
118 br i1 %cmp, label %exit, label %store
121 store i64 0, i64 *%dest
128 ; 257 bytes needs two CLCs.
129 define i64 @f8(i8 *%src1, i8 *%src2) {
131 ; CHECK: clc 0(256,%r2), 0(%r3)
132 ; CHECK: jlh [[LABEL:\..*]]
133 ; CHECK: clc 256(1,%r2), 256(%r3)
135 ; CHECK: ipm [[REG:%r[0-5]]]
137 %res = call i64 @memcmp(i8 *%src1, i8 *%src2, i64 257)