[ARM] Fixup the creation of VPT blocks
[llvm-core.git] / test / CodeGen / WebAssembly / comparisons-f64.ll
blob37150e8cded70f33bcd974d792f735832f7341ad
1 ; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-keep-registers | FileCheck %s
3 ; Test that basic 64-bit floating-point comparison operations assemble as
4 ; expected.
6 target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
7 target triple = "wasm32-unknown-unknown"
9 ; CHECK-LABEL: ord_f64:
10 ; CHECK-NEXT: .functype ord_f64 (f64, f64) -> (i32){{$}}
11 ; CHECK-NEXT: local.get $push[[L0:[0-9]+]]=, 0{{$}}
12 ; CHECK-NEXT: local.get $push[[L1:[0-9]+]]=, 0{{$}}
13 ; CHECK-NEXT: f64.eq $push[[NUM0:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
14 ; CHECK-NEXT: local.get $push[[L2:[0-9]+]]=, 1{{$}}
15 ; CHECK-NEXT: local.get $push[[L3:[0-9]+]]=, 1{{$}}
16 ; CHECK-NEXT: f64.eq $push[[NUM1:[0-9]+]]=, $pop[[L2]], $pop[[L3]]{{$}}
17 ; CHECK-NEXT: i32.and $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM1]]{{$}}
18 ; CHECK-NEXT: return $pop[[NUM2]]{{$}}
19 define i32 @ord_f64(double %x, double %y) {
20   %a = fcmp ord double %x, %y
21   %b = zext i1 %a to i32
22   ret i32 %b
25 ; CHECK-LABEL: uno_f64:
26 ; CHECK-NEXT: .functype uno_f64 (f64, f64) -> (i32){{$}}
27 ; CHECK-NEXT: local.get $push[[L0:[0-9]+]]=, 0{{$}}
28 ; CHECK-NEXT: local.get $push[[L1:[0-9]+]]=, 0{{$}}
29 ; CHECK-NEXT: f64.ne $push[[NUM0:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
30 ; CHECK-NEXT: local.get $push[[L2:[0-9]+]]=, 1{{$}}
31 ; CHECK-NEXT: local.get $push[[L3:[0-9]+]]=, 1{{$}}
32 ; CHECK-NEXT: f64.ne $push[[NUM1:[0-9]+]]=, $pop[[L2]], $pop[[L3]]{{$}}
33 ; CHECK-NEXT: i32.or $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM1]]{{$}}
34 ; CHECK-NEXT: return $pop[[NUM2]]{{$}}
35 define i32 @uno_f64(double %x, double %y) {
36   %a = fcmp uno double %x, %y
37   %b = zext i1 %a to i32
38   ret i32 %b
41 ; CHECK-LABEL: oeq_f64:
42 ; CHECK-NEXT: .functype oeq_f64 (f64, f64) -> (i32){{$}}
43 ; CHECK-NEXT: local.get $push[[L0:[0-9]+]]=, 0{{$}}
44 ; CHECK-NEXT: local.get $push[[L1:[0-9]+]]=, 1{{$}}
45 ; CHECK-NEXT: f64.eq $push[[NUM:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
46 ; CHECK-NEXT: return $pop[[NUM]]{{$}}
47 define i32 @oeq_f64(double %x, double %y) {
48   %a = fcmp oeq double %x, %y
49   %b = zext i1 %a to i32
50   ret i32 %b
53 ; CHECK-LABEL: une_f64:
54 ; CHECK: f64.ne $push[[NUM:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
55 ; CHECK-NEXT: return $pop[[NUM]]{{$}}
56 define i32 @une_f64(double %x, double %y) {
57   %a = fcmp une double %x, %y
58   %b = zext i1 %a to i32
59   ret i32 %b
62 ; CHECK-LABEL: olt_f64:
63 ; CHECK: f64.lt $push[[NUM:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
64 ; CHECK-NEXT: return $pop[[NUM]]{{$}}
65 define i32 @olt_f64(double %x, double %y) {
66   %a = fcmp olt double %x, %y
67   %b = zext i1 %a to i32
68   ret i32 %b
71 ; CHECK-LABEL: ole_f64:
72 ; CHECK: f64.le $push[[NUM:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
73 ; CHECK-NEXT: return $pop[[NUM]]{{$}}
74 define i32 @ole_f64(double %x, double %y) {
75   %a = fcmp ole double %x, %y
76   %b = zext i1 %a to i32
77   ret i32 %b
80 ; CHECK-LABEL: ogt_f64:
81 ; CHECK: f64.gt $push[[NUM:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
82 ; CHECK-NEXT: return $pop[[NUM]]{{$}}
83 define i32 @ogt_f64(double %x, double %y) {
84   %a = fcmp ogt double %x, %y
85   %b = zext i1 %a to i32
86   ret i32 %b
89 ; CHECK-LABEL: oge_f64:
90 ; CHECK: f64.ge $push[[NUM:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
91 ; CHECK-NEXT: return $pop[[NUM]]{{$}}
92 define i32 @oge_f64(double %x, double %y) {
93   %a = fcmp oge double %x, %y
94   %b = zext i1 %a to i32
95   ret i32 %b
98 ; Expanded comparisons, which also check for NaN.
100 ; CHECK-LABEL: ueq_f64:
101 ; CHECK-NEXT: .functype ueq_f64 (f64, f64) -> (i32){{$}}
102 ; CHECK-NEXT: local.get $push[[L0:[0-9]+]]=, 0{{$}}
103 ; CHECK-NEXT: local.get $push[[L1:[0-9]+]]=, 1{{$}}
104 ; CHECK-NEXT: f64.eq $push[[NUM0:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
105 ; CHECK-NEXT: local.get $push[[L2:[0-9]+]]=, 0{{$}}
106 ; CHECK-NEXT: local.get $push[[L3:[0-9]+]]=, 0{{$}}
107 ; CHECK-NEXT: f64.ne $push[[NUM1:[0-9]+]]=, $pop[[L2]], $pop[[L3]]{{$}}
108 ; CHECK-NEXT: local.get $push[[L4:[0-9]+]]=, 1{{$}}
109 ; CHECK-NEXT: local.get $push[[L5:[0-9]+]]=, 1{{$}}
110 ; CHECK-NEXT: f64.ne $push[[NUM2:[0-9]+]]=, $pop[[L4]], $pop[[L5]]{{$}}
111 ; CHECK-NEXT: i32.or $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]{{$}}
112 ; CHECK-NEXT: i32.or $push[[NUM4:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM3]]{{$}}
113 ; CHECK-NEXT: return $pop[[NUM4]]{{$}}
114 define i32 @ueq_f64(double %x, double %y) {
115   %a = fcmp ueq double %x, %y
116   %b = zext i1 %a to i32
117   ret i32 %b
120 ; CHECK-LABEL: one_f64:
121 ; CHECK-NEXT: .functype one_f64 (f64, f64) -> (i32){{$}}
122 ; CHECK-NEXT: local.get $push[[L0:[0-9]+]]=, 0{{$}}
123 ; CHECK-NEXT: local.get $push[[L1:[0-9]+]]=, 1{{$}}
124 ; CHECK-NEXT: f64.ne $push[[NUM0:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
125 ; CHECK-NEXT: local.get $push[[L2:[0-9]+]]=, 0{{$}}
126 ; CHECK-NEXT: local.get $push[[L3:[0-9]+]]=, 0{{$}}
127 ; CHECK-NEXT: f64.eq $push[[NUM1:[0-9]+]]=, $pop[[L2]], $pop[[L3]]{{$}}
128 ; CHECK-NEXT: local.get $push[[L4:[0-9]+]]=, 1{{$}}
129 ; CHECK-NEXT: local.get $push[[L5:[0-9]+]]=, 1{{$}}
130 ; CHECK-NEXT: f64.eq $push[[NUM2:[0-9]+]]=, $pop[[L4]], $pop[[L5]]{{$}}
131 ; CHECK-NEXT: i32.and $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]{{$}}
132 ; CHECK-NEXT: i32.and $push[[NUM4:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM3]]{{$}}
133 ; CHECK-NEXT: return $pop[[NUM4]]
134 define i32 @one_f64(double %x, double %y) {
135   %a = fcmp one double %x, %y
136   %b = zext i1 %a to i32
137   ret i32 %b
140 ; CHECK-LABEL: ult_f64:
141 ; CHECK-NEXT: .functype ult_f64 (f64, f64) -> (i32){{$}}
142 ; CHECK-NEXT: local.get $push[[L0:[0-9]+]]=, 0{{$}}
143 ; CHECK-NEXT: local.get $push[[L1:[0-9]+]]=, 1{{$}}
144 ; CHECK-NEXT: f64.ge $push[[NUM0:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
145 ; CHECK-NEXT: i32.const $push[[C0:[0-9]+]]=, 1
146 ; CHECK-NEXT: i32.xor $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $pop[[C0]]{{$}}
147 ; CHECK-NEXT: return $pop[[NUM2]]{{$}}
148 define i32 @ult_f64(double %x, double %y) {
149   %a = fcmp ult double %x, %y
150   %b = zext i1 %a to i32
151   ret i32 %b
154 ; CHECK-LABEL: ule_f64:
155 ; CHECK-NEXT: .functype ule_f64 (f64, f64) -> (i32){{$}}
156 ; CHECK-NEXT: local.get $push[[L0:[0-9]+]]=, 0{{$}}
157 ; CHECK-NEXT: local.get $push[[L1:[0-9]+]]=, 1{{$}}
158 ; CHECK-NEXT: f64.gt $push[[NUM0:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
159 ; CHECK-NEXT: i32.const $push[[C0:[0-9]+]]=, 1
160 ; CHECK-NEXT: i32.xor $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $pop[[C0]]{{$}}
161 ; CHECK-NEXT: return $pop[[NUM2]]{{$}}
162 define i32 @ule_f64(double %x, double %y) {
163   %a = fcmp ule double %x, %y
164   %b = zext i1 %a to i32
165   ret i32 %b
168 ; CHECK-LABEL: ugt_f64:
169 ; CHECK-NEXT: .functype ugt_f64 (f64, f64) -> (i32){{$}}
170 ; CHECK-NEXT: local.get $push[[L0:[0-9]+]]=, 0{{$}}
171 ; CHECK-NEXT: local.get $push[[L1:[0-9]+]]=, 1{{$}}
172 ; CHECK-NEXT: f64.le $push[[NUM0:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
173 ; CHECK-NEXT: i32.const $push[[C0:[0-9]+]]=, 1
174 ; CHECK-NEXT: i32.xor $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $pop[[C0]]{{$}}
175 ; CHECK-NEXT: return $pop[[NUM2]]{{$}}
176 define i32 @ugt_f64(double %x, double %y) {
177   %a = fcmp ugt double %x, %y
178   %b = zext i1 %a to i32
179   ret i32 %b
182 ; CHECK-LABEL: uge_f64:
183 ; CHECK-NEXT: .functype uge_f64 (f64, f64) -> (i32){{$}}
184 ; CHECK-NEXT: local.get $push[[L0:[0-9]+]]=, 0{{$}}
185 ; CHECK-NEXT: local.get $push[[L1:[0-9]+]]=, 1{{$}}
186 ; CHECK-NEXT: f64.lt $push[[NUM0:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
187 ; CHECK-NEXT: i32.const $push[[C0:[0-9]+]]=, 1
188 ; CHECK-NEXT: i32.xor $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $pop[[C0]]{{$}}
189 ; CHECK-NEXT: return $pop[[NUM2]]{{$}}
190 define i32 @uge_f64(double %x, double %y) {
191   %a = fcmp uge double %x, %y
192   %b = zext i1 %a to i32
193   ret i32 %b