blob: 80fbd0cadd3ae5367b1c726238e715bd2104c7ad [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 Gohmandde8dce2015-08-19 20:30:20 +00006target datalayout = "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:
10; CHECK-NEXT: .param f32{{$}}
11; CHECK-NEXT: .param f32{{$}}
12; CHECK-NEXT: .result i32{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000013; CHECK-NEXT: f32.eq $push[[NUM0:[0-9]+]], $0, $0{{$}}
14; CHECK-NEXT: f32.eq $push[[NUM1:[0-9]+]], $1, $1{{$}}
15; CHECK-NEXT: i32.and $push[[NUM2:[0-9]+]], $pop[[NUM0]], $pop[[NUM1]]{{$}}
16; CHECK-NEXT: return $pop[[NUM2]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +000017define i32 @ord_f32(float %x, float %y) {
18 %a = fcmp ord float %x, %y
19 %b = zext i1 %a to i32
20 ret i32 %b
21}
22
Dan Gohmane51c0582015-10-06 00:27:55 +000023; CHECK-LABEL: uno_f32:
24; CHECK-NEXT: .param f32{{$}}
25; CHECK-NEXT: .param f32{{$}}
26; CHECK-NEXT: .result i32{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000027; CHECK-NEXT: f32.ne $push[[NUM0:[0-9]+]], $0, $0{{$}}
28; CHECK-NEXT: f32.ne $push[[NUM1:[0-9]+]], $1, $1{{$}}
29; CHECK-NEXT: i32.or $push[[NUM2:[0-9]+]], $pop[[NUM0]], $pop[[NUM1]]{{$}}
30; CHECK-NEXT: return $pop[[NUM2]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +000031define i32 @uno_f32(float %x, float %y) {
32 %a = fcmp uno float %x, %y
33 %b = zext i1 %a to i32
34 ret i32 %b
35}
JF Bastienda06bce2015-08-11 21:02:46 +000036
Dan Gohmane51c0582015-10-06 00:27:55 +000037; CHECK-LABEL: oeq_f32:
38; CHECK-NEXT: .param f32{{$}}
39; CHECK-NEXT: .param f32{{$}}
40; CHECK-NEXT: .result i32{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +000041; CHECK-NEXT: f32.eq $push[[NUM:[0-9]+]], $0, $1{{$}}
42; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000043define i32 @oeq_f32(float %x, float %y) {
44 %a = fcmp oeq float %x, %y
45 %b = zext i1 %a to i32
46 ret i32 %b
47}
48
Dan Gohmane51c0582015-10-06 00:27:55 +000049; CHECK-LABEL: une_f32:
Dan Gohman4ba48162015-11-18 16:12:01 +000050; CHECK: f32.ne $push[[NUM:[0-9]+]], $0, $1{{$}}
51; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000052define i32 @une_f32(float %x, float %y) {
53 %a = fcmp une float %x, %y
54 %b = zext i1 %a to i32
55 ret i32 %b
56}
57
Dan Gohmane51c0582015-10-06 00:27:55 +000058; CHECK-LABEL: olt_f32:
Dan Gohman4ba48162015-11-18 16:12:01 +000059; CHECK: f32.lt $push[[NUM:[0-9]+]], $0, $1{{$}}
60; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000061define i32 @olt_f32(float %x, float %y) {
62 %a = fcmp olt float %x, %y
63 %b = zext i1 %a to i32
64 ret i32 %b
65}
66
Dan Gohmane51c0582015-10-06 00:27:55 +000067; CHECK-LABEL: ole_f32:
Dan Gohman4ba48162015-11-18 16:12:01 +000068; CHECK: f32.le $push[[NUM:[0-9]+]], $0, $1{{$}}
69; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000070define i32 @ole_f32(float %x, float %y) {
71 %a = fcmp ole float %x, %y
72 %b = zext i1 %a to i32
73 ret i32 %b
74}
75
Dan Gohmane51c0582015-10-06 00:27:55 +000076; CHECK-LABEL: ogt_f32:
Dan Gohman4ba48162015-11-18 16:12:01 +000077; CHECK: f32.gt $push[[NUM:[0-9]+]], $0, $1{{$}}
78; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000079define i32 @ogt_f32(float %x, float %y) {
80 %a = fcmp ogt float %x, %y
81 %b = zext i1 %a to i32
82 ret i32 %b
83}
84
Dan Gohmane51c0582015-10-06 00:27:55 +000085; CHECK-LABEL: oge_f32:
Dan Gohman4ba48162015-11-18 16:12:01 +000086; CHECK: f32.ge $push[[NUM:[0-9]+]], $0, $1{{$}}
87; CHECK-NEXT: return $pop[[NUM]]{{$}}
JF Bastienda06bce2015-08-11 21:02:46 +000088define i32 @oge_f32(float %x, float %y) {
89 %a = fcmp oge float %x, %y
90 %b = zext i1 %a to i32
91 ret i32 %b
92}
93
JF Bastien71d29ac2015-08-12 17:53:29 +000094; Expanded comparisons, which also check for NaN.
95
Dan Gohmane51c0582015-10-06 00:27:55 +000096; CHECK-LABEL: ueq_f32:
97; CHECK-NEXT: .param f32{{$}}
98; CHECK-NEXT: .param f32{{$}}
99; CHECK-NEXT: .result i32{{$}}
Dan Gohman4ba48162015-11-18 16:12:01 +0000100; CHECK-NEXT: f32.eq $push[[NUM0:[0-9]+]], $0, $1{{$}}
101; CHECK-NEXT: f32.ne $push[[NUM1:[0-9]+]], $0, $0{{$}}
102; CHECK-NEXT: f32.ne $push[[NUM2:[0-9]+]], $1, $1{{$}}
103; CHECK-NEXT: i32.or $push[[NUM3:[0-9]+]], $pop[[NUM1]], $pop[[NUM2]]{{$}}
104; CHECK-NEXT: i32.or $push[[NUM4:[0-9]+]], $pop[[NUM0]], $pop[[NUM3]]{{$}}
105; CHECK-NEXT: return $pop[[NUM4]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000106define i32 @ueq_f32(float %x, float %y) {
107 %a = fcmp ueq float %x, %y
108 %b = zext i1 %a to i32
109 ret i32 %b
110}
111
Dan Gohmane51c0582015-10-06 00:27:55 +0000112; CHECK-LABEL: one_f32:
Dan Gohman4ba48162015-11-18 16:12:01 +0000113; CHECK-NEXT: .param f32
114; CHECK-NEXT: .param f32
115; CHECK-NEXT: .result i32
116; CHECK-NEXT: f32.ne $push[[NUM0:[0-9]+]], $0, $1{{$}}
117; CHECK-NEXT: f32.eq $push[[NUM1:[0-9]+]], $0, $0{{$}}
118; CHECK-NEXT: f32.eq $push[[NUM2:[0-9]+]], $1, $1{{$}}
119; CHECK-NEXT: i32.and $push[[NUM3:[0-9]+]], $pop[[NUM1]], $pop[[NUM2]]{{$}}
120; CHECK-NEXT: i32.and $push[[NUM4:[0-9]+]], $pop[[NUM0]], $pop[[NUM3]]{{$}}
121; CHECK-NEXT: return $pop[[NUM4]]
JF Bastien71d29ac2015-08-12 17:53:29 +0000122define i32 @one_f32(float %x, float %y) {
123 %a = fcmp one float %x, %y
124 %b = zext i1 %a to i32
125 ret i32 %b
126}
127
Dan Gohmane51c0582015-10-06 00:27:55 +0000128; CHECK-LABEL: ult_f32:
Dan Gohman4ba48162015-11-18 16:12:01 +0000129; CHECK-NEXT: .param f32{{$}}
130; CHECK-NEXT: .param f32{{$}}
131; CHECK-NEXT: .result i32{{$}}
132; CHECK-NEXT: f32.lt $push[[NUM0:[0-9]+]], $0, $1{{$}}
133; CHECK-NEXT: f32.ne $push[[NUM1:[0-9]+]], $0, $0{{$}}
134; CHECK-NEXT: f32.ne $push[[NUM2:[0-9]+]], $1, $1{{$}}
135; CHECK-NEXT: i32.or $push[[NUM3:[0-9]+]], $pop[[NUM1]], $pop[[NUM2]]{{$}}
136; CHECK-NEXT: i32.or $push[[NUM4:[0-9]+]], $pop[[NUM0]], $pop[[NUM3]]{{$}}
137; CHECK-NEXT: return $pop[[NUM4]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000138define i32 @ult_f32(float %x, float %y) {
139 %a = fcmp ult float %x, %y
140 %b = zext i1 %a to i32
141 ret i32 %b
142}
143
Dan Gohmane51c0582015-10-06 00:27:55 +0000144; CHECK-LABEL: ule_f32:
Dan Gohman4ba48162015-11-18 16:12:01 +0000145; CHECK-NEXT: .param f32{{$}}
146; CHECK-NEXT: .param f32{{$}}
147; CHECK-NEXT: .result i32{{$}}
148; CHECK-NEXT: f32.le $push[[NUM0:[0-9]+]], $0, $1{{$}}
149; CHECK-NEXT: f32.ne $push[[NUM1:[0-9]+]], $0, $0{{$}}
150; CHECK-NEXT: f32.ne $push[[NUM2:[0-9]+]], $1, $1{{$}}
151; CHECK-NEXT: i32.or $push[[NUM3:[0-9]+]], $pop[[NUM1]], $pop[[NUM2]]{{$}}
152; CHECK-NEXT: i32.or $push[[NUM4:[0-9]+]], $pop[[NUM0]], $pop[[NUM3]]{{$}}
153; CHECK-NEXT: return $pop[[NUM4]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000154define i32 @ule_f32(float %x, float %y) {
155 %a = fcmp ule float %x, %y
156 %b = zext i1 %a to i32
157 ret i32 %b
158}
159
Dan Gohmane51c0582015-10-06 00:27:55 +0000160; CHECK-LABEL: ugt_f32:
Dan Gohman4ba48162015-11-18 16:12:01 +0000161; CHECK-NEXT: .param f32{{$}}
162; CHECK-NEXT: .param f32{{$}}
163; CHECK-NEXT: .result i32{{$}}
164; CHECK-NEXT: f32.gt $push[[NUM0:[0-9]+]], $0, $1{{$}}
165; CHECK-NEXT: f32.ne $push[[NUM1:[0-9]+]], $0, $0{{$}}
166; CHECK-NEXT: f32.ne $push[[NUM2:[0-9]+]], $1, $1{{$}}
167; CHECK-NEXT: i32.or $push[[NUM3:[0-9]+]], $pop[[NUM1]], $pop[[NUM2]]{{$}}
168; CHECK-NEXT: i32.or $push[[NUM4:[0-9]+]], $pop[[NUM0]], $pop[[NUM3]]{{$}}
169; CHECK-NEXT: return $pop[[NUM4]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000170define i32 @ugt_f32(float %x, float %y) {
171 %a = fcmp ugt float %x, %y
172 %b = zext i1 %a to i32
173 ret i32 %b
174}
175
Dan Gohmane51c0582015-10-06 00:27:55 +0000176; CHECK-LABEL: uge_f32:
Dan Gohman4ba48162015-11-18 16:12:01 +0000177; CHECK-NEXT: .param f32{{$}}
178; CHECK-NEXT: .param f32{{$}}
179; CHECK-NEXT: .result i32{{$}}
180; CHECK-NEXT: f32.ge $push[[NUM0:[0-9]+]], $0, $1{{$}}
181; CHECK-NEXT: f32.ne $push[[NUM1:[0-9]+]], $0, $0{{$}}
182; CHECK-NEXT: f32.ne $push[[NUM2:[0-9]+]], $1, $1{{$}}
183; CHECK-NEXT: i32.or $push[[NUM3:[0-9]+]], $pop[[NUM1]], $pop[[NUM2]]{{$}}
184; CHECK-NEXT: i32.or $push[[NUM4:[0-9]+]], $pop[[NUM0]], $pop[[NUM3]]{{$}}
185; CHECK-NEXT: return $pop[[NUM4]]{{$}}
JF Bastien71d29ac2015-08-12 17:53:29 +0000186define i32 @uge_f32(float %x, float %y) {
187 %a = fcmp uge float %x, %y
188 %b = zext i1 %a to i32
189 ret i32 %b
190}