blob: 6694f989627f2578aded37483cc9dab1e8e80217 [file] [log] [blame]
Dan Gohmanb7c24002016-05-21 00:21:56 +00001; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt | FileCheck %s
JF Bastienda06bce2015-08-11 21:02:46 +00002
3; Test that basic 64-bit floating-point comparison operations assemble as
4; expected.
5
Dan Gohman0c6f5ac2016-01-07 03:19:23 +00006target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
Dan Gohmand934cb82017-02-24 23:18:00 +00007target triple = "wasm32-unknown-unknown-wasm"
JF Bastienda06bce2015-08-11 21:02:46 +00008
Dan Gohmane51c0582015-10-06 00:27:55 +00009; CHECK-LABEL: ord_f64:
Dan Gohman53828fd2015-11-23 16:50:18 +000010; CHECK-NEXT: .param f64, f64{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000011; CHECK-NEXT: .result i32{{$}}
Dan Gohmand934cb82017-02-24 23:18:00 +000012; CHECK-NEXT: get_local $push[[L0:[0-9]+]]=, 0{{$}}
13; CHECK-NEXT: get_local $push[[L1:[0-9]+]]=, 0{{$}}
14; CHECK-NEXT: f64.eq $push[[NUM0:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
15; CHECK-NEXT: get_local $push[[L2:[0-9]+]]=, 1{{$}}
16; CHECK-NEXT: get_local $push[[L3:[0-9]+]]=, 1{{$}}
17; CHECK-NEXT: f64.eq $push[[NUM1:[0-9]+]]=, $pop[[L2]], $pop[[L3]]{{$}}
Dan Gohman700515f2015-11-23 21:55:57 +000018; CHECK-NEXT: i32.and $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM1]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000019; CHECK-NEXT: return $pop[[NUM2]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +000020define i32 @ord_f64(double %x, double %y) {
21 %a = fcmp ord double %x, %y
22 %b = zext i1 %a to i32
23 ret i32 %b
24}
25
Dan Gohmane51c0582015-10-06 00:27:55 +000026; CHECK-LABEL: uno_f64:
Dan Gohman53828fd2015-11-23 16:50:18 +000027; CHECK-NEXT: .param f64, f64{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000028; CHECK-NEXT: .result i32{{$}}
Dan Gohmand934cb82017-02-24 23:18:00 +000029; CHECK-NEXT: get_local $push[[L0:[0-9]+]]=, 0{{$}}
30; CHECK-NEXT: get_local $push[[L1:[0-9]+]]=, 0{{$}}
31; CHECK-NEXT: f64.ne $push[[NUM0:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
32; CHECK-NEXT: get_local $push[[L2:[0-9]+]]=, 1{{$}}
33; CHECK-NEXT: get_local $push[[L3:[0-9]+]]=, 1{{$}}
34; CHECK-NEXT: f64.ne $push[[NUM1:[0-9]+]]=, $pop[[L2]], $pop[[L3]]{{$}}
Dan Gohman700515f2015-11-23 21:55:57 +000035; CHECK-NEXT: i32.or $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM1]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000036; CHECK-NEXT: return $pop[[NUM2]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +000037define i32 @uno_f64(double %x, double %y) {
38 %a = fcmp uno double %x, %y
39 %b = zext i1 %a to i32
40 ret i32 %b
41}
JF Bastienda06bce2015-08-11 21:02:46 +000042
Dan Gohmane51c0582015-10-06 00:27:55 +000043; CHECK-LABEL: oeq_f64:
Dan Gohman53828fd2015-11-23 16:50:18 +000044; CHECK-NEXT: .param f64, f64{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000045; CHECK-NEXT: .result i32{{$}}
Dan Gohmand934cb82017-02-24 23:18:00 +000046; CHECK-NEXT: get_local $push[[L0:[0-9]+]]=, 0{{$}}
47; CHECK-NEXT: get_local $push[[L1:[0-9]+]]=, 1{{$}}
48; CHECK-NEXT: f64.eq $push[[NUM:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000049; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000050define i32 @oeq_f64(double %x, double %y) {
51 %a = fcmp oeq double %x, %y
52 %b = zext i1 %a to i32
53 ret i32 %b
54}
55
Dan Gohmane51c0582015-10-06 00:27:55 +000056; CHECK-LABEL: une_f64:
Dan Gohmand934cb82017-02-24 23:18:00 +000057; CHECK: f64.ne $push[[NUM:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000058; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000059define i32 @une_f64(double %x, double %y) {
60 %a = fcmp une double %x, %y
61 %b = zext i1 %a to i32
62 ret i32 %b
63}
64
Dan Gohmane51c0582015-10-06 00:27:55 +000065; CHECK-LABEL: olt_f64:
Dan Gohmand934cb82017-02-24 23:18:00 +000066; CHECK: f64.lt $push[[NUM:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000067; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000068define i32 @olt_f64(double %x, double %y) {
69 %a = fcmp olt double %x, %y
70 %b = zext i1 %a to i32
71 ret i32 %b
72}
73
Dan Gohmane51c0582015-10-06 00:27:55 +000074; CHECK-LABEL: ole_f64:
Dan Gohmand934cb82017-02-24 23:18:00 +000075; CHECK: f64.le $push[[NUM:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000076; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000077define i32 @ole_f64(double %x, double %y) {
78 %a = fcmp ole double %x, %y
79 %b = zext i1 %a to i32
80 ret i32 %b
81}
82
Dan Gohmane51c0582015-10-06 00:27:55 +000083; CHECK-LABEL: ogt_f64:
Dan Gohmand934cb82017-02-24 23:18:00 +000084; CHECK: f64.gt $push[[NUM:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000085; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000086define i32 @ogt_f64(double %x, double %y) {
87 %a = fcmp ogt double %x, %y
88 %b = zext i1 %a to i32
89 ret i32 %b
90}
91
Dan Gohmane51c0582015-10-06 00:27:55 +000092; CHECK-LABEL: oge_f64:
Dan Gohmand934cb82017-02-24 23:18:00 +000093; CHECK: f64.ge $push[[NUM:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000094; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000095define i32 @oge_f64(double %x, double %y) {
96 %a = fcmp oge double %x, %y
97 %b = zext i1 %a to i32
98 ret i32 %b
99}
100
JF Bastien71d29ac2015-08-12 17:53:29 +0000101; Expanded comparisons, which also check for NaN.
102
Dan Gohmane51c0582015-10-06 00:27:55 +0000103; CHECK-LABEL: ueq_f64:
Dan Gohman53828fd2015-11-23 16:50:18 +0000104; CHECK-NEXT: .param f64, f64{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000105; CHECK-NEXT: .result i32{{$}}
Dan Gohmand934cb82017-02-24 23:18:00 +0000106; CHECK-NEXT: get_local $push[[L0:[0-9]+]]=, 0{{$}}
107; CHECK-NEXT: get_local $push[[L1:[0-9]+]]=, 1{{$}}
108; CHECK-NEXT: f64.eq $push[[NUM0:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
109; CHECK-NEXT: get_local $push[[L2:[0-9]+]]=, 0{{$}}
110; CHECK-NEXT: get_local $push[[L3:[0-9]+]]=, 0{{$}}
111; CHECK-NEXT: f64.ne $push[[NUM1:[0-9]+]]=, $pop[[L2]], $pop[[L3]]{{$}}
112; CHECK-NEXT: get_local $push[[L4:[0-9]+]]=, 1{{$}}
113; CHECK-NEXT: get_local $push[[L5:[0-9]+]]=, 1{{$}}
114; CHECK-NEXT: f64.ne $push[[NUM2:[0-9]+]]=, $pop[[L4]], $pop[[L5]]{{$}}
Dan Gohman700515f2015-11-23 21:55:57 +0000115; CHECK-NEXT: i32.or $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]{{$}}
116; CHECK-NEXT: i32.or $push[[NUM4:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM3]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000117; CHECK-NEXT: return $pop[[NUM4]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000118define i32 @ueq_f64(double %x, double %y) {
119 %a = fcmp ueq double %x, %y
120 %b = zext i1 %a to i32
121 ret i32 %b
122}
123
Dan Gohmane51c0582015-10-06 00:27:55 +0000124; CHECK-LABEL: one_f64:
Dan Gohman1270b0a2015-11-25 17:33:15 +0000125; CHECK-NEXT: .param f64, f64{{$}}
126; CHECK-NEXT: .result i32{{$}}
Dan Gohmand934cb82017-02-24 23:18:00 +0000127; CHECK-NEXT: get_local $push[[L0:[0-9]+]]=, 0{{$}}
128; CHECK-NEXT: get_local $push[[L1:[0-9]+]]=, 1{{$}}
129; CHECK-NEXT: f64.ne $push[[NUM0:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
130; CHECK-NEXT: get_local $push[[L2:[0-9]+]]=, 0{{$}}
131; CHECK-NEXT: get_local $push[[L3:[0-9]+]]=, 0{{$}}
132; CHECK-NEXT: f64.eq $push[[NUM1:[0-9]+]]=, $pop[[L2]], $pop[[L3]]{{$}}
133; CHECK-NEXT: get_local $push[[L4:[0-9]+]]=, 1{{$}}
134; CHECK-NEXT: get_local $push[[L5:[0-9]+]]=, 1{{$}}
135; CHECK-NEXT: f64.eq $push[[NUM2:[0-9]+]]=, $pop[[L4]], $pop[[L5]]{{$}}
Dan Gohman700515f2015-11-23 21:55:57 +0000136; CHECK-NEXT: i32.and $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]{{$}}
137; CHECK-NEXT: i32.and $push[[NUM4:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM3]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000138; CHECK-NEXT: return $pop[[NUM4]]
JF Bastien71d29ac2015-08-12 17:53:29 +0000139define i32 @one_f64(double %x, double %y) {
140 %a = fcmp one double %x, %y
141 %b = zext i1 %a to i32
142 ret i32 %b
143}
144
Dan Gohmane51c0582015-10-06 00:27:55 +0000145; CHECK-LABEL: ult_f64:
Dan Gohman53828fd2015-11-23 16:50:18 +0000146; CHECK-NEXT: .param f64, f64{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000147; CHECK-NEXT: .result i32{{$}}
Dan Gohmand934cb82017-02-24 23:18:00 +0000148; CHECK-NEXT: get_local $push[[L0:[0-9]+]]=, 0{{$}}
149; CHECK-NEXT: get_local $push[[L1:[0-9]+]]=, 1{{$}}
150; CHECK-NEXT: f64.lt $push[[NUM0:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
151; CHECK-NEXT: get_local $push[[L2:[0-9]+]]=, 0{{$}}
152; CHECK-NEXT: get_local $push[[L3:[0-9]+]]=, 0{{$}}
153; CHECK-NEXT: f64.ne $push[[NUM1:[0-9]+]]=, $pop[[L2]], $pop[[L3]]{{$}}
154; CHECK-NEXT: get_local $push[[L4:[0-9]+]]=, 1{{$}}
155; CHECK-NEXT: get_local $push[[L5:[0-9]+]]=, 1{{$}}
156; CHECK-NEXT: f64.ne $push[[NUM2:[0-9]+]]=, $pop[[L4]], $pop[[L5]]{{$}}
Dan Gohman700515f2015-11-23 21:55:57 +0000157; CHECK-NEXT: i32.or $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]{{$}}
158; CHECK-NEXT: i32.or $push[[NUM4:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM3]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000159; CHECK-NEXT: return $pop[[NUM4]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000160define i32 @ult_f64(double %x, double %y) {
161 %a = fcmp ult double %x, %y
162 %b = zext i1 %a to i32
163 ret i32 %b
164}
165
Dan Gohmane51c0582015-10-06 00:27:55 +0000166; CHECK-LABEL: ule_f64:
Dan Gohman53828fd2015-11-23 16:50:18 +0000167; CHECK-NEXT: .param f64, f64{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000168; CHECK-NEXT: .result i32{{$}}
Dan Gohmand934cb82017-02-24 23:18:00 +0000169; CHECK-NEXT: get_local $push[[L0:[0-9]+]]=, 0{{$}}
170; CHECK-NEXT: get_local $push[[L1:[0-9]+]]=, 1{{$}}
171; CHECK-NEXT: f64.le $push[[NUM0:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
172; CHECK-NEXT: get_local $push[[L2:[0-9]+]]=, 0{{$}}
173; CHECK-NEXT: get_local $push[[L3:[0-9]+]]=, 0{{$}}
174; CHECK-NEXT: f64.ne $push[[NUM1:[0-9]+]]=, $pop[[L2]], $pop[[L3]]{{$}}
175; CHECK-NEXT: get_local $push[[L4:[0-9]+]]=, 1{{$}}
176; CHECK-NEXT: get_local $push[[L5:[0-9]+]]=, 1{{$}}
177; CHECK-NEXT: f64.ne $push[[NUM2:[0-9]+]]=, $pop[[L4]], $pop[[L5]]{{$}}
Dan Gohman700515f2015-11-23 21:55:57 +0000178; CHECK-NEXT: i32.or $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]{{$}}
179; CHECK-NEXT: i32.or $push[[NUM4:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM3]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000180; CHECK-NEXT: return $pop[[NUM4]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000181define i32 @ule_f64(double %x, double %y) {
182 %a = fcmp ule double %x, %y
183 %b = zext i1 %a to i32
184 ret i32 %b
185}
186
Dan Gohmane51c0582015-10-06 00:27:55 +0000187; CHECK-LABEL: ugt_f64:
Dan Gohman53828fd2015-11-23 16:50:18 +0000188; CHECK-NEXT: .param f64, f64{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000189; CHECK-NEXT: .result i32{{$}}
Dan Gohmand934cb82017-02-24 23:18:00 +0000190; CHECK-NEXT: get_local $push[[L0:[0-9]+]]=, 0{{$}}
191; CHECK-NEXT: get_local $push[[L1:[0-9]+]]=, 1{{$}}
192; CHECK-NEXT: f64.gt $push[[NUM0:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
193; CHECK-NEXT: get_local $push[[L2:[0-9]+]]=, 0{{$}}
194; CHECK-NEXT: get_local $push[[L3:[0-9]+]]=, 0{{$}}
195; CHECK-NEXT: f64.ne $push[[NUM1:[0-9]+]]=, $pop[[L2]], $pop[[L3]]{{$}}
196; CHECK-NEXT: get_local $push[[L4:[0-9]+]]=, 1{{$}}
197; CHECK-NEXT: get_local $push[[L5:[0-9]+]]=, 1{{$}}
198; CHECK-NEXT: f64.ne $push[[NUM2:[0-9]+]]=, $pop[[L4]], $pop[[L5]]{{$}}
Dan Gohman700515f2015-11-23 21:55:57 +0000199; CHECK-NEXT: i32.or $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]{{$}}
200; CHECK-NEXT: i32.or $push[[NUM4:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM3]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000201; CHECK-NEXT: return $pop[[NUM4]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000202define i32 @ugt_f64(double %x, double %y) {
203 %a = fcmp ugt double %x, %y
204 %b = zext i1 %a to i32
205 ret i32 %b
206}
207
Dan Gohmane51c0582015-10-06 00:27:55 +0000208; CHECK-LABEL: uge_f64:
Dan Gohman53828fd2015-11-23 16:50:18 +0000209; CHECK-NEXT: .param f64, f64{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000210; CHECK-NEXT: .result i32{{$}}
Dan Gohmand934cb82017-02-24 23:18:00 +0000211; CHECK-NEXT: get_local $push[[L0:[0-9]+]]=, 0{{$}}
212; CHECK-NEXT: get_local $push[[L1:[0-9]+]]=, 1{{$}}
213; CHECK-NEXT: f64.ge $push[[NUM0:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
214; CHECK-NEXT: get_local $push[[L2:[0-9]+]]=, 0{{$}}
215; CHECK-NEXT: get_local $push[[L3:[0-9]+]]=, 0{{$}}
216; CHECK-NEXT: f64.ne $push[[NUM1:[0-9]+]]=, $pop[[L2]], $pop[[L3]]{{$}}
217; CHECK-NEXT: get_local $push[[L4:[0-9]+]]=, 1{{$}}
218; CHECK-NEXT: get_local $push[[L5:[0-9]+]]=, 1{{$}}
219; CHECK-NEXT: f64.ne $push[[NUM2:[0-9]+]]=, $pop[[L4]], $pop[[L5]]{{$}}
Dan Gohman700515f2015-11-23 21:55:57 +0000220; CHECK-NEXT: i32.or $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]{{$}}
221; CHECK-NEXT: i32.or $push[[NUM4:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM3]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000222; CHECK-NEXT: return $pop[[NUM4]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000223define i32 @uge_f64(double %x, double %y) {
224 %a = fcmp uge double %x, %y
225 %b = zext i1 %a to i32
226 ret i32 %b
227}