1 ; Test all condition-code masks that are relevant for CGRJ.
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
8 define void @f1(i64 %target) {
10 ; CHECK: .cfi_def_cfa_offset
11 ; CHECK: .L[[LABEL:.*]]:
12 ; CHECK: cgrje %r2, {{%r[0-9]+}}, .L[[LABEL]]
15 %val = call i64 @foo()
16 %cond = icmp eq i64 %val, %target
17 br i1 %cond, label %loop, label %exit
23 define void @f2(i64 %target) {
25 ; CHECK: .cfi_def_cfa_offset
26 ; CHECK: .L[[LABEL:.*]]:
27 ; CHECK: cgrjlh %r2, {{%r[0-9]+}}, .L[[LABEL]]
30 %val = call i64 @foo()
31 %cond = icmp ne i64 %val, %target
32 br i1 %cond, label %loop, label %exit
38 define void @f3(i64 %target) {
40 ; CHECK: .cfi_def_cfa_offset
41 ; CHECK: .L[[LABEL:.*]]:
42 ; CHECK: cgrjle %r2, {{%r[0-9]+}}, .L[[LABEL]]
45 %val = call i64 @foo()
46 %cond = icmp sle i64 %val, %target
47 br i1 %cond, label %loop, label %exit
53 define void @f4(i64 %target) {
55 ; CHECK: .cfi_def_cfa_offset
56 ; CHECK: .L[[LABEL:.*]]:
57 ; CHECK: cgrjl %r2, {{%r[0-9]+}}, .L[[LABEL]]
60 %val = call i64 @foo()
61 %cond = icmp slt i64 %val, %target
62 br i1 %cond, label %loop, label %exit
68 define void @f5(i64 %target) {
70 ; CHECK: .cfi_def_cfa_offset
71 ; CHECK: .L[[LABEL:.*]]:
72 ; CHECK: cgrjh %r2, {{%r[0-9]+}}, .L[[LABEL]]
75 %val = call i64 @foo()
76 %cond = icmp sgt i64 %val, %target
77 br i1 %cond, label %loop, label %exit
83 define void @f6(i64 %target) {
85 ; CHECK: .cfi_def_cfa_offset
86 ; CHECK: .L[[LABEL:.*]]:
87 ; CHECK: cgrjhe %r2, {{%r[0-9]+}}, .L[[LABEL]]
90 %val = call i64 @foo()
91 %cond = icmp sge i64 %val, %target
92 br i1 %cond, label %loop, label %exit
97 ; Test a vector of 0/-1 results for i32 EQ.
98 define i64 @f7(i64 %a, i64 %b) {
100 ; CHECK: lhi [[REG:%r[0-5]]], -1
101 ; CHECK: crje {{%r[0-5]}}
102 ; CHECK: lhi [[REG]], 0
105 %avec = bitcast i64 %a to <2 x i32>
106 %bvec = bitcast i64 %b to <2 x i32>
107 %cmp = icmp eq <2 x i32> %avec, %bvec
108 %ext = sext <2 x i1> %cmp to <2 x i32>
109 %ret = bitcast <2 x i32> %ext to i64
113 ; Test a vector of 0/-1 results for i32 NE.
114 define i64 @f8(i64 %a, i64 %b) {
116 ; CHECK: lhi [[REG:%r[0-5]]], -1
117 ; CHECK: crjlh {{%r[0-5]}}
118 ; CHECK: lhi [[REG]], 0
121 %avec = bitcast i64 %a to <2 x i32>
122 %bvec = bitcast i64 %b to <2 x i32>
123 %cmp = icmp ne <2 x i32> %avec, %bvec
124 %ext = sext <2 x i1> %cmp to <2 x i32>
125 %ret = bitcast <2 x i32> %ext to i64
129 ; Test a vector of 0/-1 results for i64 EQ.
130 define void @f9(i64 %a, i64 %b, <2 x i64> *%dest) {
132 ; CHECK: lghi [[REG:%r[0-5]]], -1
133 ; CHECK: crje {{%r[0-5]}}
134 ; CHECK: lghi [[REG]], 0
137 %avec = bitcast i64 %a to <2 x i32>
138 %bvec = bitcast i64 %b to <2 x i32>
139 %cmp = icmp eq <2 x i32> %avec, %bvec
140 %ext = sext <2 x i1> %cmp to <2 x i64>
141 store <2 x i64> %ext, <2 x i64> *%dest
145 ; Test a vector of 0/-1 results for i64 NE.
146 define void @f10(i64 %a, i64 %b, <2 x i64> *%dest) {
148 ; CHECK: lghi [[REG:%r[0-5]]], -1
149 ; CHECK: crjlh {{%r[0-5]}}
150 ; CHECK: lghi [[REG]], 0
153 %avec = bitcast i64 %a to <2 x i32>
154 %bvec = bitcast i64 %b to <2 x i32>
155 %cmp = icmp ne <2 x i32> %avec, %bvec
156 %ext = sext <2 x i1> %cmp to <2 x i64>
157 store <2 x i64> %ext, <2 x i64> *%dest