[SystemZ] Make more use of LTGFR
[oota-llvm.git] / test / CodeGen / SystemZ / branch-04.ll
1 ; Test all condition-code masks that are relevant for floating-point
2 ; comparisons.
3 ;
4 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
5
6 define void @f1(float *%src, float %target) {
7 ; CHECK-LABEL: f1:
8 ; CHECK: .cfi_startproc
9 ; CHECK: .L[[LABEL:.*]]:
10 ; CHECK: ceb %f0, 0(%r2)
11 ; CHECK-NEXT: je .L[[LABEL]]
12   br label %loop
13 loop:
14   %val = load volatile float *%src
15   %cond = fcmp oeq float %target, %val
16   br i1 %cond, label %loop, label %exit
17 exit:
18   ret void
19 }
20
21 define void @f2(float *%src, float %target) {
22 ; CHECK-LABEL: f2:
23 ; CHECK: .cfi_startproc
24 ; CHECK: .L[[LABEL:.*]]:
25 ; CHECK: ceb %f0, 0(%r2)
26 ; CHECK-NEXT: jlh .L[[LABEL]]
27   br label %loop
28 loop:
29   %val = load volatile float *%src
30   %cond = fcmp one float %target, %val
31   br i1 %cond, label %loop, label %exit
32 exit:
33   ret void
34 }
35
36 define void @f3(float *%src, float %target) {
37 ; CHECK-LABEL: f3:
38 ; CHECK: .cfi_startproc
39 ; CHECK: .L[[LABEL:.*]]:
40 ; CHECK: ceb %f0, 0(%r2)
41 ; CHECK-NEXT: jle .L[[LABEL]]
42   br label %loop
43 loop:
44   %val = load volatile float *%src
45   %cond = fcmp ole float %target, %val
46   br i1 %cond, label %loop, label %exit
47 exit:
48   ret void
49 }
50
51 define void @f4(float *%src, float %target) {
52 ; CHECK-LABEL: f4:
53 ; CHECK: .cfi_startproc
54 ; CHECK: .L[[LABEL:.*]]:
55 ; CHECK: ceb %f0, 0(%r2)
56 ; CHECK-NEXT: jl .L[[LABEL]]
57   br label %loop
58 loop:
59   %val = load volatile float *%src
60   %cond = fcmp olt float %target, %val
61   br i1 %cond, label %loop, label %exit
62 exit:
63   ret void
64 }
65
66 define void @f5(float *%src, float %target) {
67 ; CHECK-LABEL: f5:
68 ; CHECK: .cfi_startproc
69 ; CHECK: .L[[LABEL:.*]]:
70 ; CHECK: ceb %f0, 0(%r2)
71 ; CHECK-NEXT: jh .L[[LABEL]]
72   br label %loop
73 loop:
74   %val = load volatile float *%src
75   %cond = fcmp ogt float %target, %val
76   br i1 %cond, label %loop, label %exit
77 exit:
78   ret void
79 }
80
81 define void @f6(float *%src, float %target) {
82 ; CHECK-LABEL: f6:
83 ; CHECK: .cfi_startproc
84 ; CHECK: .L[[LABEL:.*]]:
85 ; CHECK: ceb %f0, 0(%r2)
86 ; CHECK-NEXT: jhe .L[[LABEL]]
87   br label %loop
88 loop:
89   %val = load volatile float *%src
90   %cond = fcmp oge float %target, %val
91   br i1 %cond, label %loop, label %exit
92 exit:
93   ret void
94 }
95
96 define void @f7(float *%src, float %target) {
97 ; CHECK-LABEL: f7:
98 ; CHECK: .cfi_startproc
99 ; CHECK: .L[[LABEL:.*]]:
100 ; CHECK: ceb %f0, 0(%r2)
101 ; CHECK-NEXT: jnlh .L[[LABEL]]
102   br label %loop
103 loop:
104   %val = load volatile float *%src
105   %cond = fcmp ueq float %target, %val
106   br i1 %cond, label %loop, label %exit
107 exit:
108   ret void
109 }
110
111 define void @f8(float *%src, float %target) {
112 ; CHECK-LABEL: f8:
113 ; CHECK: .cfi_startproc
114 ; CHECK: .L[[LABEL:.*]]:
115 ; CHECK: ceb %f0, 0(%r2)
116 ; CHECK-NEXT: jne .L[[LABEL]]
117   br label %loop
118 loop:
119   %val = load volatile float *%src
120   %cond = fcmp une float %target, %val
121   br i1 %cond, label %loop, label %exit
122 exit:
123   ret void
124 }
125
126 define void @f9(float *%src, float %target) {
127 ; CHECK-LABEL: f9:
128 ; CHECK: .cfi_startproc
129 ; CHECK: .L[[LABEL:.*]]:
130 ; CHECK: ceb %f0, 0(%r2)
131 ; CHECK-NEXT: jnh .L[[LABEL]]
132   br label %loop
133 loop:
134   %val = load volatile float *%src
135   %cond = fcmp ule float %target, %val
136   br i1 %cond, label %loop, label %exit
137 exit:
138   ret void
139 }
140
141 define void @f10(float *%src, float %target) {
142 ; CHECK-LABEL: f10:
143 ; CHECK: .cfi_startproc
144 ; CHECK: .L[[LABEL:.*]]:
145 ; CHECK: ceb %f0, 0(%r2)
146 ; CHECK-NEXT: jnhe .L[[LABEL]]
147   br label %loop
148 loop:
149   %val = load volatile float *%src
150   %cond = fcmp ult float %target, %val
151   br i1 %cond, label %loop, label %exit
152 exit:
153   ret void
154 }
155
156 define void @f11(float *%src, float %target) {
157 ; CHECK-LABEL: f11:
158 ; CHECK: .cfi_startproc
159 ; CHECK: .L[[LABEL:.*]]:
160 ; CHECK: ceb %f0, 0(%r2)
161 ; CHECK-NEXT: jnle .L[[LABEL]]
162   br label %loop
163 loop:
164   %val = load volatile float *%src
165   %cond = fcmp ugt float %target, %val
166   br i1 %cond, label %loop, label %exit
167 exit:
168   ret void
169 }
170
171 define void @f12(float *%src, float %target) {
172 ; CHECK-LABEL: f12:
173 ; CHECK: .cfi_startproc
174 ; CHECK: .L[[LABEL:.*]]:
175 ; CHECK: ceb %f0, 0(%r2)
176 ; CHECK-NEXT: jnl .L[[LABEL]]
177   br label %loop
178 loop:
179   %val = load volatile float *%src
180   %cond = fcmp uge float %target, %val
181   br i1 %cond, label %loop, label %exit
182 exit:
183   ret void
184 }
185
186 ; "jno" == "jump if no overflow", which corresponds to "jump if ordered"
187 ; rather than "jump if not ordered" after a floating-point comparison.
188 define void @f13(float *%src, float %target) {
189 ; CHECK-LABEL: f13:
190 ; CHECK: .cfi_startproc
191 ; CHECK: .L[[LABEL:.*]]:
192 ; CHECK: ceb %f0, 0(%r2)
193 ; CHECK-NEXT: jno .L[[LABEL]]
194   br label %loop
195 loop:
196   %val = load volatile float *%src
197   %cond = fcmp ord float %target, %val
198   br i1 %cond, label %loop, label %exit
199 exit:
200   ret void
201 }
202
203 ; "jo" == "jump if overflow", which corresponds to "jump if not ordered"
204 ; rather than "jump if ordered" after a floating-point comparison.
205 define void @f14(float *%src, float %target) {
206 ; CHECK-LABEL: f14:
207 ; CHECK: .cfi_startproc
208 ; CHECK: .L[[LABEL:.*]]:
209 ; CHECK: ceb %f0, 0(%r2)
210 ; CHECK-NEXT: jo .L[[LABEL]]
211   br label %loop
212 loop:
213   %val = load volatile float *%src
214   %cond = fcmp uno float %target, %val
215   br i1 %cond, label %loop, label %exit
216 exit:
217   ret void
218 }