[FastISel][AArch64] Optimize compare-and-branch for i1 to use 'tbz'.
[oota-llvm.git] / test / CodeGen / AArch64 / arm64-fast-isel-fcmp.ll
1 ; RUN: llc -O0 -fast-isel-abort -verify-machineinstrs -mtriple=arm64-apple-darwin < %s | FileCheck %s
2
3 define zeroext i1 @fcmp_float1(float %a) {
4 ; CHECK-LABEL: fcmp_float1
5 ; CHECK:       fcmp s0, #0.0
6 ; CHECK-NEXT:  cset {{w[0-9]+}}, ne
7   %1 = fcmp une float %a, 0.000000e+00
8   ret i1 %1
9 }
10
11 define zeroext i1 @fcmp_float2(float %a, float %b) {
12 ; CHECK-LABEL: fcmp_float2
13 ; CHECK:       fcmp s0, s1
14 ; CHECK-NEXT:  cset {{w[0-9]+}}, ne
15   %1 = fcmp une float %a, %b
16   ret i1 %1
17 }
18
19 define zeroext i1 @fcmp_double1(double %a) {
20 ; CHECK-LABEL: fcmp_double1
21 ; CHECK:       fcmp d0, #0.0
22 ; CHECK-NEXT:  cset {{w[0-9]+}}, ne
23   %1 = fcmp une double %a, 0.000000e+00
24   ret i1 %1
25 }
26
27 define zeroext i1 @fcmp_double2(double %a, double %b) {
28 ; CHECK-LABEL: fcmp_double2
29 ; CHECK:       fcmp d0, d1
30 ; CHECK-NEXT:  cset {{w[0-9]+}}, ne
31   %1 = fcmp une double %a, %b
32   ret i1 %1
33 }
34
35 ; Check each fcmp condition
36 define zeroext i1 @fcmp_false(float %a) {
37 ; CHECK-LABEL: fcmp_false
38 ; CHECK:       mov {{w[0-9]+}}, wzr
39   %1 = fcmp ogt float %a, %a
40   ret i1 %1
41 }
42
43 define zeroext i1 @fcmp_oeq(float %a, float %b) {
44 ; CHECK-LABEL: fcmp_oeq
45 ; CHECK:       fcmp s0, s1
46 ; CHECK-NEXT:  cset {{w[0-9]+}}, eq
47   %1 = fcmp oeq float %a, %b
48   ret i1 %1
49 }
50
51 define zeroext i1 @fcmp_ogt(float %a, float %b) {
52 ; CHECK-LABEL: fcmp_ogt
53 ; CHECK:       fcmp s0, s1
54 ; CHECK-NEXT:  cset {{w[0-9]+}}, gt
55   %1 = fcmp ogt float %a, %b
56   ret i1 %1
57 }
58
59 define zeroext i1 @fcmp_oge(float %a, float %b) {
60 ; CHECK-LABEL: fcmp_oge
61 ; CHECK:       fcmp s0, s1
62 ; CHECK-NEXT:  cset {{w[0-9]+}}, ge
63   %1 = fcmp oge float %a, %b
64   ret i1 %1
65 }
66
67 define zeroext i1 @fcmp_olt(float %a, float %b) {
68 ; CHECK-LABEL: fcmp_olt
69 ; CHECK:       fcmp s0, s1
70 ; CHECK-NEXT:  cset {{w[0-9]+}}, mi
71   %1 = fcmp olt float %a, %b
72   ret i1 %1
73 }
74
75 define zeroext i1 @fcmp_ole(float %a, float %b) {
76 ; CHECK-LABEL: fcmp_ole
77 ; CHECK:       fcmp s0, s1
78 ; CHECK-NEXT:  cset {{w[0-9]+}}, ls
79   %1 = fcmp ole float %a, %b
80   ret i1 %1
81 }
82
83 define zeroext i1 @fcmp_one(float %a, float %b) {
84 ; CHECK-LABEL: fcmp_one
85 ; CHECK:       fcmp s0, s1
86 ; CHECK-NEXT:  cset [[REG:w[0-9]+]], mi
87 ; CHECK-NEXT:  csinc {{w[0-9]+}}, [[REG]], wzr, le
88   %1 = fcmp one float %a, %b
89   ret i1 %1
90 }
91
92 define zeroext i1 @fcmp_ord(float %a, float %b) {
93 ; CHECK-LABEL: fcmp_ord
94 ; CHECK:       fcmp s0, s1
95 ; CHECK-NEXT:  cset {{w[0-9]+}}, vc
96   %1 = fcmp ord float %a, %b
97   ret i1 %1
98 }
99
100 define zeroext i1 @fcmp_uno(float %a, float %b) {
101 ; CHECK-LABEL: fcmp_uno
102 ; CHECK:       fcmp s0, s1
103 ; CHECK-NEXT:  cset {{w[0-9]+}}, vs
104   %1 = fcmp uno float %a, %b
105   ret i1 %1
106 }
107
108 define zeroext i1 @fcmp_ueq(float %a, float %b) {
109 ; CHECK-LABEL: fcmp_ueq
110 ; CHECK:       fcmp s0, s1
111 ; CHECK-NEXT:  cset [[REG:w[0-9]+]], eq
112 ; CHECK-NEXT:  csinc {{w[0-9]+}}, [[REG]], wzr, vc
113   %1 = fcmp ueq float %a, %b
114   ret i1 %1
115 }
116
117 define zeroext i1 @fcmp_ugt(float %a, float %b) {
118 ; CHECK-LABEL: fcmp_ugt
119 ; CHECK:       fcmp s0, s1
120 ; CHECK-NEXT:  cset {{w[0-9]+}}, hi
121   %1 = fcmp ugt float %a, %b
122   ret i1 %1
123 }
124
125 define zeroext i1 @fcmp_uge(float %a, float %b) {
126 ; CHECK-LABEL: fcmp_uge
127 ; CHECK:       fcmp s0, s1
128 ; CHECK-NEXT:  cset {{w[0-9]+}}, pl
129   %1 = fcmp uge float %a, %b
130   ret i1 %1
131 }
132
133 define zeroext i1 @fcmp_ult(float %a, float %b) {
134 ; CHECK-LABEL: fcmp_ult
135 ; CHECK:       fcmp s0, s1
136 ; CHECK-NEXT:  cset {{w[0-9]+}}, lt
137   %1 = fcmp ult float %a, %b
138   ret i1 %1
139 }
140
141 define zeroext i1 @fcmp_ule(float %a, float %b) {
142 ; CHECK-LABEL: fcmp_ule
143 ; CHECK:       fcmp s0, s1
144 ; CHECK-NEXT:  cset {{w[0-9]+}}, le
145   %1 = fcmp ule float %a, %b
146   ret i1 %1
147 }
148
149 define zeroext i1 @fcmp_une(float %a, float %b) {
150 ; CHECK-LABEL: fcmp_une
151 ; CHECK:       fcmp s0, s1
152 ; CHECK-NEXT:  cset {{w[0-9]+}}, ne
153   %1 = fcmp une float %a, %b
154   ret i1 %1
155 }
156
157 define zeroext i1 @fcmp_true(float %a) {
158 ; CHECK-LABEL: fcmp_true
159 ; CHECK:       orr {{w[0-9]+}}, wzr, #0x1
160   %1 = fcmp ueq float %a, %a
161   ret i1 %1
162 }