blob: b17fedd03db292a879c1dae792fe6957e31f9157 [file] [log] [blame]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +00001; Test 32-bit comparisons in which the second operand is sign-extended
2; from a PC-relative i16.
3;
4; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
5
6@g = global i16 1
Richard Sandiford46af5a22013-05-30 09:45:42 +00007@h = global i16 1, align 1, section "foo"
Ulrich Weigand9e3577f2013-05-06 16:17:29 +00008
9; Check signed comparison.
10define i32 @f1(i32 %src1) {
Stephen Lind24ab202013-07-14 06:24:09 +000011; CHECK-LABEL: f1:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000012; CHECK: chrl %r2, g
Ulrich Weigand2eb027d2016-04-07 16:11:44 +000013; CHECK-NEXT: blr %r14
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000014; CHECK: br %r14
15entry:
David Blaikiea79ac142015-02-27 21:17:42 +000016 %val = load i16 , i16 *@g
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000017 %src2 = sext i16 %val to i32
18 %cond = icmp slt i32 %src1, %src2
19 br i1 %cond, label %exit, label %mulb
20mulb:
21 %mul = mul i32 %src1, %src1
22 br label %exit
23exit:
24 %res = phi i32 [ %src1, %entry ], [ %mul, %mulb ]
25 ret i32 %res
26}
27
28; Check unsigned comparison, which cannot use CHRL.
29define i32 @f2(i32 %src1) {
Stephen Lind24ab202013-07-14 06:24:09 +000030; CHECK-LABEL: f2:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000031; CHECK-NOT: chrl
32; CHECK: br %r14
33entry:
David Blaikiea79ac142015-02-27 21:17:42 +000034 %val = load i16 , i16 *@g
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000035 %src2 = sext i16 %val to i32
36 %cond = icmp ult i32 %src1, %src2
37 br i1 %cond, label %exit, label %mulb
38mulb:
39 %mul = mul i32 %src1, %src1
40 br label %exit
41exit:
42 %res = phi i32 [ %src1, %entry ], [ %mul, %mulb ]
43 ret i32 %res
44}
45
46; Check equality.
47define i32 @f3(i32 %src1) {
Stephen Lind24ab202013-07-14 06:24:09 +000048; CHECK-LABEL: f3:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000049; CHECK: chrl %r2, g
Ulrich Weigand2eb027d2016-04-07 16:11:44 +000050; CHECK-NEXT: ber %r14
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000051; CHECK: br %r14
52entry:
David Blaikiea79ac142015-02-27 21:17:42 +000053 %val = load i16 , i16 *@g
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000054 %src2 = sext i16 %val to i32
55 %cond = icmp eq i32 %src1, %src2
56 br i1 %cond, label %exit, label %mulb
57mulb:
58 %mul = mul i32 %src1, %src1
59 br label %exit
60exit:
61 %res = phi i32 [ %src1, %entry ], [ %mul, %mulb ]
62 ret i32 %res
63}
64
65; Check inequality.
66define i32 @f4(i32 %src1) {
Stephen Lind24ab202013-07-14 06:24:09 +000067; CHECK-LABEL: f4:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000068; CHECK: chrl %r2, g
Ulrich Weigand2eb027d2016-04-07 16:11:44 +000069; CHECK-NEXT: blhr %r14
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000070; CHECK: br %r14
71entry:
David Blaikiea79ac142015-02-27 21:17:42 +000072 %val = load i16 , i16 *@g
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000073 %src2 = sext i16 %val to i32
74 %cond = icmp ne i32 %src1, %src2
75 br i1 %cond, label %exit, label %mulb
76mulb:
77 %mul = mul i32 %src1, %src1
78 br label %exit
79exit:
80 %res = phi i32 [ %src1, %entry ], [ %mul, %mulb ]
81 ret i32 %res
82}
Richard Sandiford46af5a22013-05-30 09:45:42 +000083
84; Repeat f1 with an unaligned address.
85define i32 @f5(i32 %src1) {
Stephen Lind24ab202013-07-14 06:24:09 +000086; CHECK-LABEL: f5:
Richard Sandiford46af5a22013-05-30 09:45:42 +000087; CHECK: lgrl [[REG:%r[0-5]]], h@GOT
88; CHECK: ch %r2, 0([[REG]])
Ulrich Weigand2eb027d2016-04-07 16:11:44 +000089; CHECK-NEXT: blr %r14
Richard Sandiford46af5a22013-05-30 09:45:42 +000090; CHECK: br %r14
91entry:
David Blaikiea79ac142015-02-27 21:17:42 +000092 %val = load i16 , i16 *@h, align 1
Richard Sandiford46af5a22013-05-30 09:45:42 +000093 %src2 = sext i16 %val to i32
94 %cond = icmp slt i32 %src1, %src2
95 br i1 %cond, label %exit, label %mulb
96mulb:
97 %mul = mul i32 %src1, %src1
98 br label %exit
99exit:
100 %res = phi i32 [ %src1, %entry ], [ %mul, %mulb ]
101 ret i32 %res
102}
Richard Sandiford24e597b2013-08-23 11:27:19 +0000103
104; Check the comparison can be reversed if that allows CHRL to be used.
105define i32 @f6(i32 %src2) {
106; CHECK-LABEL: f6:
107; CHECK: chrl %r2, g
Ulrich Weigand2eb027d2016-04-07 16:11:44 +0000108; CHECK-NEXT: bhr %r14
Richard Sandiford24e597b2013-08-23 11:27:19 +0000109; CHECK: br %r14
110entry:
David Blaikiea79ac142015-02-27 21:17:42 +0000111 %val = load i16 , i16 *@g
Richard Sandiford24e597b2013-08-23 11:27:19 +0000112 %src1 = sext i16 %val to i32
113 %cond = icmp slt i32 %src1, %src2
114 br i1 %cond, label %exit, label %mulb
115mulb:
116 %mul = mul i32 %src2, %src2
117 br label %exit
118exit:
119 %res = phi i32 [ %src2, %entry ], [ %mul, %mulb ]
120 ret i32 %res
121}