blob: 2d324f7f2083077f0742f34a34f5d2eb1f5f14e7 [file] [log] [blame]
JF Bastienda06bce2015-08-11 21:02:46 +00001; RUN: llc < %s -asm-verbose=false | FileCheck %s
2
3; Test that basic 32-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"
JF Bastienda06bce2015-08-11 21:02:46 +00007target triple = "wasm32-unknown-unknown"
8
Dan Gohmane51c0582015-10-06 00:27:55 +00009; CHECK-LABEL: ord_f32:
Dan Gohman53828fd2015-11-23 16:50:18 +000010; CHECK-NEXT: .param f32, f32{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000011; CHECK-NEXT: .result i32{{$}}
Dan Gohman700515f2015-11-23 21:55:57 +000012; CHECK-NEXT: f32.eq $push[[NUM0:[0-9]+]]=, $0, $0{{$}}
13; CHECK-NEXT: f32.eq $push[[NUM1:[0-9]+]]=, $1, $1{{$}}
14; CHECK-NEXT: i32.and $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM1]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000015; CHECK-NEXT: return $pop[[NUM2]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +000016define i32 @ord_f32(float %x, float %y) {
17 %a = fcmp ord float %x, %y
18 %b = zext i1 %a to i32
19 ret i32 %b
20}
21
Dan Gohmane51c0582015-10-06 00:27:55 +000022; CHECK-LABEL: uno_f32:
Dan Gohman53828fd2015-11-23 16:50:18 +000023; CHECK-NEXT: .param f32, f32{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000024; CHECK-NEXT: .result i32{{$}}
Dan Gohman700515f2015-11-23 21:55:57 +000025; CHECK-NEXT: f32.ne $push[[NUM0:[0-9]+]]=, $0, $0{{$}}
26; CHECK-NEXT: f32.ne $push[[NUM1:[0-9]+]]=, $1, $1{{$}}
27; CHECK-NEXT: i32.or $push[[NUM2:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM1]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000028; CHECK-NEXT: return $pop[[NUM2]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +000029define i32 @uno_f32(float %x, float %y) {
30 %a = fcmp uno float %x, %y
31 %b = zext i1 %a to i32
32 ret i32 %b
33}
JF Bastienda06bce2015-08-11 21:02:46 +000034
Dan Gohmane51c0582015-10-06 00:27:55 +000035; CHECK-LABEL: oeq_f32:
Dan Gohman53828fd2015-11-23 16:50:18 +000036; CHECK-NEXT: .param f32, f32{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000037; CHECK-NEXT: .result i32{{$}}
Dan Gohman700515f2015-11-23 21:55:57 +000038; CHECK-NEXT: f32.eq $push[[NUM:[0-9]+]]=, $0, $1{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000039; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000040define i32 @oeq_f32(float %x, float %y) {
41 %a = fcmp oeq float %x, %y
42 %b = zext i1 %a to i32
43 ret i32 %b
44}
45
Dan Gohmane51c0582015-10-06 00:27:55 +000046; CHECK-LABEL: une_f32:
Dan Gohman700515f2015-11-23 21:55:57 +000047; CHECK: f32.ne $push[[NUM:[0-9]+]]=, $0, $1{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000048; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000049define i32 @une_f32(float %x, float %y) {
50 %a = fcmp une float %x, %y
51 %b = zext i1 %a to i32
52 ret i32 %b
53}
54
Dan Gohmane51c0582015-10-06 00:27:55 +000055; CHECK-LABEL: olt_f32:
Dan Gohman700515f2015-11-23 21:55:57 +000056; CHECK: f32.lt $push[[NUM:[0-9]+]]=, $0, $1{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000057; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000058define i32 @olt_f32(float %x, float %y) {
59 %a = fcmp olt float %x, %y
60 %b = zext i1 %a to i32
61 ret i32 %b
62}
63
Dan Gohmane51c0582015-10-06 00:27:55 +000064; CHECK-LABEL: ole_f32:
Dan Gohman700515f2015-11-23 21:55:57 +000065; CHECK: f32.le $push[[NUM:[0-9]+]]=, $0, $1{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000066; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000067define i32 @ole_f32(float %x, float %y) {
68 %a = fcmp ole float %x, %y
69 %b = zext i1 %a to i32
70 ret i32 %b
71}
72
Dan Gohmane51c0582015-10-06 00:27:55 +000073; CHECK-LABEL: ogt_f32:
Dan Gohman700515f2015-11-23 21:55:57 +000074; CHECK: f32.gt $push[[NUM:[0-9]+]]=, $0, $1{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000075; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000076define i32 @ogt_f32(float %x, float %y) {
77 %a = fcmp ogt float %x, %y
78 %b = zext i1 %a to i32
79 ret i32 %b
80}
81
Dan Gohmane51c0582015-10-06 00:27:55 +000082; CHECK-LABEL: oge_f32:
Dan Gohman700515f2015-11-23 21:55:57 +000083; CHECK: f32.ge $push[[NUM:[0-9]+]]=, $0, $1{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000084; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000085define i32 @oge_f32(float %x, float %y) {
86 %a = fcmp oge float %x, %y
87 %b = zext i1 %a to i32
88 ret i32 %b
89}
90
JF Bastien71d29ac2015-08-12 17:53:29 +000091; Expanded comparisons, which also check for NaN.
92
Dan Gohmane51c0582015-10-06 00:27:55 +000093; CHECK-LABEL: ueq_f32:
Dan Gohman53828fd2015-11-23 16:50:18 +000094; CHECK-NEXT: .param f32, f32{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000095; CHECK-NEXT: .result i32{{$}}
Dan Gohman700515f2015-11-23 21:55:57 +000096; CHECK-NEXT: f32.eq $push[[NUM0:[0-9]+]]=, $0, $1{{$}}
97; CHECK-NEXT: f32.ne $push[[NUM1:[0-9]+]]=, $0, $0{{$}}
98; CHECK-NEXT: f32.ne $push[[NUM2:[0-9]+]]=, $1, $1{{$}}
99; CHECK-NEXT: i32.or $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]{{$}}
100; CHECK-NEXT: i32.or $push[[NUM4:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM3]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000101; CHECK-NEXT: return $pop[[NUM4]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000102define i32 @ueq_f32(float %x, float %y) {
103 %a = fcmp ueq float %x, %y
104 %b = zext i1 %a to i32
105 ret i32 %b
106}
107
Dan Gohmane51c0582015-10-06 00:27:55 +0000108; CHECK-LABEL: one_f32:
Dan Gohman1270b0a2015-11-25 17:33:15 +0000109; CHECK-NEXT: .param f32, f32{{$}}
110; CHECK-NEXT: .result i32{{$}}
Dan Gohman700515f2015-11-23 21:55:57 +0000111; CHECK-NEXT: f32.ne $push[[NUM0:[0-9]+]]=, $0, $1{{$}}
112; CHECK-NEXT: f32.eq $push[[NUM1:[0-9]+]]=, $0, $0{{$}}
113; CHECK-NEXT: f32.eq $push[[NUM2:[0-9]+]]=, $1, $1{{$}}
114; CHECK-NEXT: i32.and $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]{{$}}
115; CHECK-NEXT: i32.and $push[[NUM4:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM3]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000116; CHECK-NEXT: return $pop[[NUM4]]
JF Bastien71d29ac2015-08-12 17:53:29 +0000117define i32 @one_f32(float %x, float %y) {
118 %a = fcmp one float %x, %y
119 %b = zext i1 %a to i32
120 ret i32 %b
121}
122
Dan Gohmane51c0582015-10-06 00:27:55 +0000123; CHECK-LABEL: ult_f32:
Dan Gohman53828fd2015-11-23 16:50:18 +0000124; CHECK-NEXT: .param f32, f32{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000125; CHECK-NEXT: .result i32{{$}}
Dan Gohman700515f2015-11-23 21:55:57 +0000126; CHECK-NEXT: f32.lt $push[[NUM0:[0-9]+]]=, $0, $1{{$}}
127; CHECK-NEXT: f32.ne $push[[NUM1:[0-9]+]]=, $0, $0{{$}}
128; CHECK-NEXT: f32.ne $push[[NUM2:[0-9]+]]=, $1, $1{{$}}
129; CHECK-NEXT: i32.or $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]{{$}}
130; CHECK-NEXT: i32.or $push[[NUM4:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM3]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000131; CHECK-NEXT: return $pop[[NUM4]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000132define i32 @ult_f32(float %x, float %y) {
133 %a = fcmp ult float %x, %y
134 %b = zext i1 %a to i32
135 ret i32 %b
136}
137
Dan Gohmane51c0582015-10-06 00:27:55 +0000138; CHECK-LABEL: ule_f32:
Dan Gohman53828fd2015-11-23 16:50:18 +0000139; CHECK-NEXT: .param f32, f32{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000140; CHECK-NEXT: .result i32{{$}}
Dan Gohman700515f2015-11-23 21:55:57 +0000141; CHECK-NEXT: f32.le $push[[NUM0:[0-9]+]]=, $0, $1{{$}}
142; CHECK-NEXT: f32.ne $push[[NUM1:[0-9]+]]=, $0, $0{{$}}
143; CHECK-NEXT: f32.ne $push[[NUM2:[0-9]+]]=, $1, $1{{$}}
144; CHECK-NEXT: i32.or $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]{{$}}
145; CHECK-NEXT: i32.or $push[[NUM4:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM3]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000146; CHECK-NEXT: return $pop[[NUM4]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000147define i32 @ule_f32(float %x, float %y) {
148 %a = fcmp ule float %x, %y
149 %b = zext i1 %a to i32
150 ret i32 %b
151}
152
Dan Gohmane51c0582015-10-06 00:27:55 +0000153; CHECK-LABEL: ugt_f32:
Dan Gohman53828fd2015-11-23 16:50:18 +0000154; CHECK-NEXT: .param f32, f32{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000155; CHECK-NEXT: .result i32{{$}}
Dan Gohman700515f2015-11-23 21:55:57 +0000156; CHECK-NEXT: f32.gt $push[[NUM0:[0-9]+]]=, $0, $1{{$}}
157; CHECK-NEXT: f32.ne $push[[NUM1:[0-9]+]]=, $0, $0{{$}}
158; CHECK-NEXT: f32.ne $push[[NUM2:[0-9]+]]=, $1, $1{{$}}
159; CHECK-NEXT: i32.or $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]{{$}}
160; CHECK-NEXT: i32.or $push[[NUM4:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM3]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000161; CHECK-NEXT: return $pop[[NUM4]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000162define i32 @ugt_f32(float %x, float %y) {
163 %a = fcmp ugt float %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: uge_f32:
Dan Gohman53828fd2015-11-23 16:50:18 +0000169; CHECK-NEXT: .param f32, f32{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000170; CHECK-NEXT: .result i32{{$}}
Dan Gohman700515f2015-11-23 21:55:57 +0000171; CHECK-NEXT: f32.ge $push[[NUM0:[0-9]+]]=, $0, $1{{$}}
172; CHECK-NEXT: f32.ne $push[[NUM1:[0-9]+]]=, $0, $0{{$}}
173; CHECK-NEXT: f32.ne $push[[NUM2:[0-9]+]]=, $1, $1{{$}}
174; CHECK-NEXT: i32.or $push[[NUM3:[0-9]+]]=, $pop[[NUM1]], $pop[[NUM2]]{{$}}
175; CHECK-NEXT: i32.or $push[[NUM4:[0-9]+]]=, $pop[[NUM0]], $pop[[NUM3]]{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000176; CHECK-NEXT: return $pop[[NUM4]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000177define i32 @uge_f32(float %x, float %y) {
178 %a = fcmp uge float %x, %y
179 %b = zext i1 %a to i32
180 ret i32 %b
181}