blob: 37150e8cded70f33bcd974d792f735832f7341ad [file] [log] [blame]
Wouter van Oortmerssen8a9cb242018-08-27 15:45:51 +00001; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-keep-registers | 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"
Sam Clegga5908002018-05-10 17:49:11 +00007target triple = "wasm32-unknown-unknown"
JF Bastienda06bce2015-08-11 21:02:46 +00008
Dan Gohmane51c0582015-10-06 00:27:55 +00009; CHECK-LABEL: ord_f64:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000010; CHECK-NEXT: .functype ord_f64 (f64, f64) -> (i32){{$}}
Thomas Lively6a87dda2019-01-08 06:25:55 +000011; CHECK-NEXT: local.get $push[[L0:[0-9]+]]=, 0{{$}}
12; CHECK-NEXT: local.get $push[[L1:[0-9]+]]=, 0{{$}}
Dan Gohmand934cb82017-02-24 23:18:00 +000013; CHECK-NEXT: f64.eq $push[[NUM0:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
Thomas Lively6a87dda2019-01-08 06:25:55 +000014; CHECK-NEXT: local.get $push[[L2:[0-9]+]]=, 1{{$}}
15; CHECK-NEXT: local.get $push[[L3:[0-9]+]]=, 1{{$}}
Dan Gohmand934cb82017-02-24 23:18:00 +000016; CHECK-NEXT: f64.eq $push[[NUM1:[0-9]+]]=, $pop[[L2]], $pop[[L3]]{{$}}
Dan Gohman700515f2015-11-23 21:55:57 +000017; CHECK-NEXT: i32.and $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM1]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000018; CHECK-NEXT: return $pop[[NUM2]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +000019define 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
23}
24
Dan Gohmane51c0582015-10-06 00:27:55 +000025; CHECK-LABEL: uno_f64:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000026; CHECK-NEXT: .functype uno_f64 (f64, f64) -> (i32){{$}}
Thomas Lively6a87dda2019-01-08 06:25:55 +000027; CHECK-NEXT: local.get $push[[L0:[0-9]+]]=, 0{{$}}
28; CHECK-NEXT: local.get $push[[L1:[0-9]+]]=, 0{{$}}
Dan Gohmand934cb82017-02-24 23:18:00 +000029; CHECK-NEXT: f64.ne $push[[NUM0:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
Thomas Lively6a87dda2019-01-08 06:25:55 +000030; CHECK-NEXT: local.get $push[[L2:[0-9]+]]=, 1{{$}}
31; CHECK-NEXT: local.get $push[[L3:[0-9]+]]=, 1{{$}}
Dan Gohmand934cb82017-02-24 23:18:00 +000032; CHECK-NEXT: f64.ne $push[[NUM1:[0-9]+]]=, $pop[[L2]], $pop[[L3]]{{$}}
Dan Gohman700515f2015-11-23 21:55:57 +000033; CHECK-NEXT: i32.or $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM1]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000034; CHECK-NEXT: return $pop[[NUM2]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +000035define 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
39}
JF Bastienda06bce2015-08-11 21:02:46 +000040
Dan Gohmane51c0582015-10-06 00:27:55 +000041; CHECK-LABEL: oeq_f64:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +000042; CHECK-NEXT: .functype oeq_f64 (f64, f64) -> (i32){{$}}
Thomas Lively6a87dda2019-01-08 06:25:55 +000043; CHECK-NEXT: local.get $push[[L0:[0-9]+]]=, 0{{$}}
44; CHECK-NEXT: local.get $push[[L1:[0-9]+]]=, 1{{$}}
Dan Gohmand934cb82017-02-24 23:18:00 +000045; CHECK-NEXT: f64.eq $push[[NUM:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000046; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000047define 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
51}
52
Dan Gohmane51c0582015-10-06 00:27:55 +000053; CHECK-LABEL: une_f64:
Dan Gohmand934cb82017-02-24 23:18:00 +000054; CHECK: f64.ne $push[[NUM:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000055; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000056define 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
60}
61
Dan Gohmane51c0582015-10-06 00:27:55 +000062; CHECK-LABEL: olt_f64:
Dan Gohmand934cb82017-02-24 23:18:00 +000063; CHECK: f64.lt $push[[NUM:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000064; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000065define 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
69}
70
Dan Gohmane51c0582015-10-06 00:27:55 +000071; CHECK-LABEL: ole_f64:
Dan Gohmand934cb82017-02-24 23:18:00 +000072; CHECK: f64.le $push[[NUM:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000073; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000074define 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
78}
79
Dan Gohmane51c0582015-10-06 00:27:55 +000080; CHECK-LABEL: ogt_f64:
Dan Gohmand934cb82017-02-24 23:18:00 +000081; CHECK: f64.gt $push[[NUM:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000082; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000083define 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
87}
88
Dan Gohmane51c0582015-10-06 00:27:55 +000089; CHECK-LABEL: oge_f64:
Dan Gohmand934cb82017-02-24 23:18:00 +000090; CHECK: f64.ge $push[[NUM:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000091; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000092define 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
96}
97
JF Bastien71d29ac2015-08-12 17:53:29 +000098; Expanded comparisons, which also check for NaN.
99
Dan Gohmane51c0582015-10-06 00:27:55 +0000100; CHECK-LABEL: ueq_f64:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000101; CHECK-NEXT: .functype ueq_f64 (f64, f64) -> (i32){{$}}
Thomas Lively6a87dda2019-01-08 06:25:55 +0000102; CHECK-NEXT: local.get $push[[L0:[0-9]+]]=, 0{{$}}
103; CHECK-NEXT: local.get $push[[L1:[0-9]+]]=, 1{{$}}
Dan Gohmand934cb82017-02-24 23:18:00 +0000104; CHECK-NEXT: f64.eq $push[[NUM0:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
Thomas Lively6a87dda2019-01-08 06:25:55 +0000105; CHECK-NEXT: local.get $push[[L2:[0-9]+]]=, 0{{$}}
106; CHECK-NEXT: local.get $push[[L3:[0-9]+]]=, 0{{$}}
Dan Gohmand934cb82017-02-24 23:18:00 +0000107; CHECK-NEXT: f64.ne $push[[NUM1:[0-9]+]]=, $pop[[L2]], $pop[[L3]]{{$}}
Thomas Lively6a87dda2019-01-08 06:25:55 +0000108; CHECK-NEXT: local.get $push[[L4:[0-9]+]]=, 1{{$}}
109; CHECK-NEXT: local.get $push[[L5:[0-9]+]]=, 1{{$}}
Dan Gohmand934cb82017-02-24 23:18:00 +0000110; CHECK-NEXT: f64.ne $push[[NUM2:[0-9]+]]=, $pop[[L4]], $pop[[L5]]{{$}}
Dan Gohman700515f2015-11-23 21:55:57 +0000111; 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]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000113; CHECK-NEXT: return $pop[[NUM4]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000114define 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
118}
119
Dan Gohmane51c0582015-10-06 00:27:55 +0000120; CHECK-LABEL: one_f64:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000121; CHECK-NEXT: .functype one_f64 (f64, f64) -> (i32){{$}}
Thomas Lively6a87dda2019-01-08 06:25:55 +0000122; CHECK-NEXT: local.get $push[[L0:[0-9]+]]=, 0{{$}}
123; CHECK-NEXT: local.get $push[[L1:[0-9]+]]=, 1{{$}}
Dan Gohmand934cb82017-02-24 23:18:00 +0000124; CHECK-NEXT: f64.ne $push[[NUM0:[0-9]+]]=, $pop[[L0]], $pop[[L1]]{{$}}
Thomas Lively6a87dda2019-01-08 06:25:55 +0000125; CHECK-NEXT: local.get $push[[L2:[0-9]+]]=, 0{{$}}
126; CHECK-NEXT: local.get $push[[L3:[0-9]+]]=, 0{{$}}
Dan Gohmand934cb82017-02-24 23:18:00 +0000127; CHECK-NEXT: f64.eq $push[[NUM1:[0-9]+]]=, $pop[[L2]], $pop[[L3]]{{$}}
Thomas Lively6a87dda2019-01-08 06:25:55 +0000128; CHECK-NEXT: local.get $push[[L4:[0-9]+]]=, 1{{$}}
129; CHECK-NEXT: local.get $push[[L5:[0-9]+]]=, 1{{$}}
Dan Gohmand934cb82017-02-24 23:18:00 +0000130; CHECK-NEXT: f64.eq $push[[NUM2:[0-9]+]]=, $pop[[L4]], $pop[[L5]]{{$}}
Dan Gohman700515f2015-11-23 21:55:57 +0000131; 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]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000133; CHECK-NEXT: return $pop[[NUM4]]
JF Bastien71d29ac2015-08-12 17:53:29 +0000134define 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
138}
139
Dan Gohmane51c0582015-10-06 00:27:55 +0000140; CHECK-LABEL: ult_f64:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000141; CHECK-NEXT: .functype ult_f64 (f64, f64) -> (i32){{$}}
Thomas Lively6a87dda2019-01-08 06:25:55 +0000142; CHECK-NEXT: local.get $push[[L0:[0-9]+]]=, 0{{$}}
143; CHECK-NEXT: local.get $push[[L1:[0-9]+]]=, 1{{$}}
Derek Schuffdc51fb42018-02-06 01:21:17 +0000144; 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]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000148define 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
152}
153
Dan Gohmane51c0582015-10-06 00:27:55 +0000154; CHECK-LABEL: ule_f64:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000155; CHECK-NEXT: .functype ule_f64 (f64, f64) -> (i32){{$}}
Thomas Lively6a87dda2019-01-08 06:25:55 +0000156; CHECK-NEXT: local.get $push[[L0:[0-9]+]]=, 0{{$}}
157; CHECK-NEXT: local.get $push[[L1:[0-9]+]]=, 1{{$}}
Derek Schuffdc51fb42018-02-06 01:21:17 +0000158; 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]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000162define 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
166}
167
Dan Gohmane51c0582015-10-06 00:27:55 +0000168; CHECK-LABEL: ugt_f64:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000169; CHECK-NEXT: .functype ugt_f64 (f64, f64) -> (i32){{$}}
Thomas Lively6a87dda2019-01-08 06:25:55 +0000170; CHECK-NEXT: local.get $push[[L0:[0-9]+]]=, 0{{$}}
171; CHECK-NEXT: local.get $push[[L1:[0-9]+]]=, 1{{$}}
Derek Schuffdc51fb42018-02-06 01:21:17 +0000172; 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]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000176define 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
180}
181
Dan Gohmane51c0582015-10-06 00:27:55 +0000182; CHECK-LABEL: uge_f64:
Wouter van Oortmerssen49482f82018-11-19 17:10:36 +0000183; CHECK-NEXT: .functype uge_f64 (f64, f64) -> (i32){{$}}
Thomas Lively6a87dda2019-01-08 06:25:55 +0000184; CHECK-NEXT: local.get $push[[L0:[0-9]+]]=, 0{{$}}
185; CHECK-NEXT: local.get $push[[L1:[0-9]+]]=, 1{{$}}
Derek Schuffdc51fb42018-02-06 01:21:17 +0000186; 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]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000190define 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
194}