[AArch64,ELF] Restrict MOVZ/MOVK to non-PIC large code model (#70178)
[llvm-project.git] / llvm / test / CodeGen / X86 / brcond.ll
blob02daaa23569b272a300f6043966811015850ebf2
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i386-apple-darwin10 -mcpu=penryn | FileCheck %s
4 ; rdar://7475489
6 define i32 @test1(i32 %a, i32 %b) nounwind ssp {
7 ; CHECK-LABEL: test1:
8 ; CHECK:       ## %bb.0: ## %entry
9 ; CHECK-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
10 ; CHECK-NEXT:    xorb {{[0-9]+}}(%esp), %al
11 ; CHECK-NEXT:    testb $64, %al
12 ; CHECK-NEXT:    jne _bar ## TAILCALL
13 ; CHECK-NEXT:  ## %bb.1: ## %bb
14 ; CHECK-NEXT:    jmp _foo ## TAILCALL
15 entry:
16   %0 = and i32 %a, 16384
17   %1 = icmp ne i32 %0, 0
18   %2 = and i32 %b, 16384
19   %3 = icmp ne i32 %2, 0
20   %4 = xor i1 %1, %3
21   br i1 %4, label %bb1, label %bb
23 bb:                                               ; preds = %entry
24   %5 = tail call i32 (...) @foo() nounwind       ; <i32> [#uses=1]
25   ret i32 %5
27 bb1:                                              ; preds = %entry
28   %6 = tail call i32 (...) @bar() nounwind       ; <i32> [#uses=1]
29   ret i32 %6
32 declare i32 @foo(...)
34 declare i32 @bar(...)
37 ; <rdar://problem/7598384>:
39 ;    jCC  L1
40 ;    jmp  L2
41 ; L1:
42 ;   ...
43 ; L2:
44 ;   ...
46 ; to:
48 ;    jnCC L2
49 ; L1:
50 ;   ...
51 ; L2:
52 ;   ...
53 define float @test4(float %x, float %y) nounwind readnone optsize ssp {
54 ; CHECK-LABEL: test4:
55 ; CHECK:       ## %bb.0: ## %entry
56 ; CHECK-NEXT:    pushl %eax
57 ; CHECK-NEXT:    cvtss2sd {{[0-9]+}}(%esp), %xmm1
58 ; CHECK-NEXT:    cvtss2sd {{[0-9]+}}(%esp), %xmm0
59 ; CHECK-NEXT:    mulsd %xmm1, %xmm0
60 ; CHECK-NEXT:    xorpd %xmm1, %xmm1
61 ; CHECK-NEXT:    ucomisd %xmm1, %xmm0
62 ; CHECK-NEXT:    jne LBB1_1
63 ; CHECK-NEXT:    jnp LBB1_2
64 ; CHECK-NEXT:  LBB1_1: ## %bb1
65 ; CHECK-NEXT:    addsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
66 ; CHECK-NEXT:  LBB1_2: ## %bb2
67 ; CHECK-NEXT:    cvtsd2ss %xmm0, %xmm0
68 ; CHECK-NEXT:    movss %xmm0, (%esp)
69 ; CHECK-NEXT:    flds (%esp)
70 ; CHECK-NEXT:    popl %eax
71 ; CHECK-NEXT:    retl
72 entry:
73   %0 = fpext float %x to double                   ; <double> [#uses=1]
74   %1 = fpext float %y to double                   ; <double> [#uses=1]
75   %2 = fmul double %0, %1                         ; <double> [#uses=3]
76   %3 = fcmp oeq double %2, 0.000000e+00           ; <i1> [#uses=1]
77   br i1 %3, label %bb2, label %bb1
80 bb1:                                              ; preds = %entry
81   %4 = fadd double %2, -1.000000e+00              ; <double> [#uses=1]
82   br label %bb2
84 bb2:                                              ; preds = %entry, %bb1
85   %.0.in = phi double [ %4, %bb1 ], [ %2, %entry ] ; <double> [#uses=1]
86   %.0 = fptrunc double %.0.in to float            ; <float> [#uses=1]
87   ret float %.0
90 declare i32 @llvm.x86.sse41.ptestz(<4 x float> %p1, <4 x float> %p2) nounwind
91 declare i32 @llvm.x86.sse41.ptestc(<4 x float> %p1, <4 x float> %p2) nounwind
93 define <4 x float> @test5(<4 x float> %a, <4 x float> %b) nounwind {
94 ; CHECK-LABEL: test5:
95 ; CHECK:       ## %bb.0: ## %entry
96 ; CHECK-NEXT:    ptest %xmm0, %xmm0
97 ; CHECK-NEXT:    jne LBB2_2
98 ; CHECK-NEXT:  ## %bb.1: ## %bb1
99 ; CHECK-NEXT:    addps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
100 ; CHECK-NEXT:    movaps %xmm1, %xmm0
101 ; CHECK-NEXT:    retl
102 ; CHECK-NEXT:  LBB2_2: ## %bb2
103 ; CHECK-NEXT:    divps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
104 ; CHECK-NEXT:    movaps %xmm1, %xmm0
105 ; CHECK-NEXT:    retl
106 entry:
108   %res = call i32 @llvm.x86.sse41.ptestz(<4 x float> %a, <4 x float> %a) nounwind
109   %one = icmp ne i32 %res, 0
110   br i1 %one, label %bb1, label %bb2
112 bb1:
113   %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
114   br label %return
116 bb2:
117         %d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
118         br label %return
120 return:
121   %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
122   ret <4 x float> %e
125 define <4 x float> @test7(<4 x float> %a, <4 x float> %b) nounwind {
126 ; CHECK-LABEL: test7:
127 ; CHECK:       ## %bb.0: ## %entry
128 ; CHECK-NEXT:    ptest %xmm0, %xmm0
129 ; CHECK-NEXT:    jne LBB3_2
130 ; CHECK-NEXT:  ## %bb.1: ## %bb1
131 ; CHECK-NEXT:    addps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
132 ; CHECK-NEXT:    movaps %xmm1, %xmm0
133 ; CHECK-NEXT:    retl
134 ; CHECK-NEXT:  LBB3_2: ## %bb2
135 ; CHECK-NEXT:    divps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
136 ; CHECK-NEXT:    movaps %xmm1, %xmm0
137 ; CHECK-NEXT:    retl
138 entry:
140   %res = call i32 @llvm.x86.sse41.ptestz(<4 x float> %a, <4 x float> %a) nounwind
141   %one = trunc i32 %res to i1
142   br i1 %one, label %bb1, label %bb2
144 bb1:
145   %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
146   br label %return
148 bb2:
149         %d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
150         br label %return
152 return:
153   %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
154   ret <4 x float> %e
157 define <4 x float> @test8(<4 x float> %a, <4 x float> %b) nounwind {
158 ; CHECK-LABEL: test8:
159 ; CHECK:       ## %bb.0: ## %entry
160 ; CHECK-NEXT:    ptest %xmm0, %xmm0
161 ; CHECK-NEXT:    jae LBB4_2
162 ; CHECK-NEXT:  ## %bb.1: ## %bb1
163 ; CHECK-NEXT:    addps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
164 ; CHECK-NEXT:    movaps %xmm1, %xmm0
165 ; CHECK-NEXT:    retl
166 ; CHECK-NEXT:  LBB4_2: ## %bb2
167 ; CHECK-NEXT:    divps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
168 ; CHECK-NEXT:    movaps %xmm1, %xmm0
169 ; CHECK-NEXT:    retl
170 entry:
172   %res = call i32 @llvm.x86.sse41.ptestc(<4 x float> %a, <4 x float> %a) nounwind
173   %one = icmp ne i32 %res, 0
174   br i1 %one, label %bb1, label %bb2
176 bb1:
177   %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
178   br label %return
180 bb2:
181         %d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
182         br label %return
184 return:
185   %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
186   ret <4 x float> %e
189 define <4 x float> @test10(<4 x float> %a, <4 x float> %b) nounwind {
190 ; CHECK-LABEL: test10:
191 ; CHECK:       ## %bb.0: ## %entry
192 ; CHECK-NEXT:    ptest %xmm0, %xmm0
193 ; CHECK-NEXT:    jae LBB5_2
194 ; CHECK-NEXT:  ## %bb.1: ## %bb1
195 ; CHECK-NEXT:    addps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
196 ; CHECK-NEXT:    movaps %xmm1, %xmm0
197 ; CHECK-NEXT:    retl
198 ; CHECK-NEXT:  LBB5_2: ## %bb2
199 ; CHECK-NEXT:    divps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
200 ; CHECK-NEXT:    movaps %xmm1, %xmm0
201 ; CHECK-NEXT:    retl
202 entry:
204   %res = call i32 @llvm.x86.sse41.ptestc(<4 x float> %a, <4 x float> %a) nounwind
205   %one = trunc i32 %res to i1
206   br i1 %one, label %bb1, label %bb2
208 bb1:
209   %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
210   br label %return
212 bb2:
213         %d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
214         br label %return
216 return:
217   %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
218   ret <4 x float> %e
221 define <4 x float> @test11(<4 x float> %a, <4 x float> %b) nounwind {
222 ; CHECK-LABEL: test11:
223 ; CHECK:       ## %bb.0: ## %entry
224 ; CHECK-NEXT:    ptest %xmm0, %xmm0
225 ; CHECK-NEXT:    jne LBB6_2
226 ; CHECK-NEXT:  ## %bb.1: ## %bb1
227 ; CHECK-NEXT:    addps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
228 ; CHECK-NEXT:    movaps %xmm1, %xmm0
229 ; CHECK-NEXT:    retl
230 ; CHECK-NEXT:  LBB6_2: ## %bb2
231 ; CHECK-NEXT:    divps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
232 ; CHECK-NEXT:    movaps %xmm1, %xmm0
233 ; CHECK-NEXT:    retl
234 entry:
236   %res = call i32 @llvm.x86.sse41.ptestz(<4 x float> %a, <4 x float> %a) nounwind
237   %one = icmp eq i32 %res, 1
238   br i1 %one, label %bb1, label %bb2
240 bb1:
241   %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
242   br label %return
244 bb2:
245         %d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
246         br label %return
248 return:
249   %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
250   ret <4 x float> %e
253 define <4 x float> @test12(<4 x float> %a, <4 x float> %b) nounwind {
254 ; CHECK-LABEL: test12:
255 ; CHECK:       ## %bb.0: ## %entry
256 ; CHECK-NEXT:    ptest %xmm0, %xmm0
257 ; CHECK-NEXT:    je LBB7_2
258 ; CHECK-NEXT:  ## %bb.1: ## %bb1
259 ; CHECK-NEXT:    addps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
260 ; CHECK-NEXT:    movaps %xmm1, %xmm0
261 ; CHECK-NEXT:    retl
262 ; CHECK-NEXT:  LBB7_2: ## %bb2
263 ; CHECK-NEXT:    divps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
264 ; CHECK-NEXT:    movaps %xmm1, %xmm0
265 ; CHECK-NEXT:    retl
266 entry:
268   %res = call i32 @llvm.x86.sse41.ptestz(<4 x float> %a, <4 x float> %a) nounwind
269   %one = icmp ne i32 %res, 1
270   br i1 %one, label %bb1, label %bb2
272 bb1:
273   %c = fadd <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
274   br label %return
276 bb2:
277         %d = fdiv <4 x float> %b, < float 1.000000e+002, float 2.000000e+002, float 3.000000e+002, float 4.000000e+002 >
278         br label %return
280 return:
281   %e = phi <4 x float> [%c, %bb1], [%d, %bb2]
282   ret <4 x float> %e