1 ; RUN: llc < %s -asm-verbose=false | FileCheck %s
3 ; Test that basic 64-bit floating-point comparison operations assemble as
6 target datalayout = "e-p:32:32-i64:64-n32:64-S128"
7 target triple = "wasm32-unknown-unknown"
9 ; CHECK-LABEL: ord_f64:
10 ; CHECK-NEXT: .param f64{{$}}
11 ; CHECK-NEXT: .param f64{{$}}
12 ; CHECK-NEXT: .result i32{{$}}
13 ; CHECK-NEXT: .local f64, f64, i32, i32, i32{{$}}
14 ; CHECK-NEXT: get_local 0{{$}}
15 ; CHECK-NEXT: set_local 2, pop{{$}}
16 ; CHECK-NEXT: get_local 1{{$}}
17 ; CHECK-NEXT: set_local 3, pop{{$}}
18 ; CHECK-NEXT: eq (get_local 3), (get_local 3){{$}}
19 ; CHECK-NEXT: set_local 4, pop{{$}}
20 ; CHECK-NEXT: eq (get_local 2), (get_local 2){{$}}
21 ; CHECK-NEXT: set_local 5, pop{{$}}
22 ; CHECK-NEXT: and (get_local 5), (get_local 4){{$}}
23 ; CHECK-NEXT: set_local 6, pop{{$}}
24 ; CHECK-NEXT: return (get_local 6){{$}}
25 define i32 @ord_f64(double %x, double %y) {
26 %a = fcmp ord double %x, %y
27 %b = zext i1 %a to i32
31 ; CHECK-LABEL: uno_f64:
32 ; CHECK-NEXT: .param f64{{$}}
33 ; CHECK-NEXT: .param f64{{$}}
34 ; CHECK-NEXT: .result i32{{$}}
35 ; CHECK-NEXT: .local f64, f64, i32, i32, i32{{$}}
36 ; CHECK-NEXT: get_local 0{{$}}
37 ; CHECK-NEXT: set_local 2, pop{{$}}
38 ; CHECK-NEXT: get_local 1{{$}}
39 ; CHECK-NEXT: set_local 3, pop{{$}}
40 ; CHECK-NEXT: ne (get_local 3), (get_local 3){{$}}
41 ; CHECK-NEXT: set_local 4, pop{{$}}
42 ; CHECK-NEXT: ne (get_local 2), (get_local 2){{$}}
43 ; CHECK-NEXT: set_local 5, pop{{$}}
44 ; CHECK-NEXT: ior (get_local 5), (get_local 4){{$}}
45 ; CHECK-NEXT: set_local 6, pop{{$}}
46 ; CHECK-NEXT: return (get_local 6){{$}}
47 define i32 @uno_f64(double %x, double %y) {
48 %a = fcmp uno double %x, %y
49 %b = zext i1 %a to i32
53 ; CHECK-LABEL: oeq_f64:
54 ; CHECK-NEXT: .param f64{{$}}
55 ; CHECK-NEXT: .param f64{{$}}
56 ; CHECK-NEXT: .result i32{{$}}
57 ; CHECK-NEXT: .local f64, f64, i32{{$}}
58 ; CHECK-NEXT: get_local 1{{$}}
59 ; CHECK-NEXT: set_local 2, pop{{$}}
60 ; CHECK-NEXT: get_local 0{{$}}
61 ; CHECK-NEXT: set_local 3, pop{{$}}
62 ; CHECK-NEXT: eq (get_local 3), (get_local 2){{$}}
63 ; CHECK-NEXT: set_local 4, pop{{$}}
64 ; CHECK-NEXT: return (get_local 4){{$}}
65 define i32 @oeq_f64(double %x, double %y) {
66 %a = fcmp oeq double %x, %y
67 %b = zext i1 %a to i32
71 ; CHECK-LABEL: une_f64:
72 ; CHECK: ne (get_local 3), (get_local 2){{$}}
73 ; CHECK-NEXT: set_local 4, pop{{$}}
74 define i32 @une_f64(double %x, double %y) {
75 %a = fcmp une double %x, %y
76 %b = zext i1 %a to i32
80 ; CHECK-LABEL: olt_f64:
81 ; CHECK: lt (get_local 3), (get_local 2){{$}}
82 ; CHECK-NEXT: set_local 4, pop{{$}}
83 define i32 @olt_f64(double %x, double %y) {
84 %a = fcmp olt double %x, %y
85 %b = zext i1 %a to i32
89 ; CHECK-LABEL: ole_f64:
90 ; CHECK: le (get_local 3), (get_local 2){{$}}
91 ; CHECK-NEXT: set_local 4, pop{{$}}
92 define i32 @ole_f64(double %x, double %y) {
93 %a = fcmp ole double %x, %y
94 %b = zext i1 %a to i32
98 ; CHECK-LABEL: ogt_f64:
99 ; CHECK: gt (get_local 3), (get_local 2){{$}}
100 ; CHECK-NEXT: set_local 4, pop{{$}}
101 define i32 @ogt_f64(double %x, double %y) {
102 %a = fcmp ogt double %x, %y
103 %b = zext i1 %a to i32
107 ; CHECK-LABEL: oge_f64:
108 ; CHECK: ge (get_local 3), (get_local 2){{$}}
109 ; CHECK-NEXT: set_local 4, pop{{$}}
110 define i32 @oge_f64(double %x, double %y) {
111 %a = fcmp oge double %x, %y
112 %b = zext i1 %a to i32
116 ; Expanded comparisons, which also check for NaN.
118 ; CHECK-LABEL: ueq_f64:
119 ; CHECK-NEXT: .param f64{{$}}
120 ; CHECK-NEXT: .param f64{{$}}
121 ; CHECK-NEXT: .result i32{{$}}
122 ; CHECK-NEXT: .local f64, f64, i32, i32, i32, i32, i32{{$}}
123 ; CHECK-NEXT: get_local 1{{$}}
124 ; CHECK-NEXT: set_local 2, pop{{$}}
125 ; CHECK-NEXT: get_local 0{{$}}
126 ; CHECK-NEXT: set_local 3, pop{{$}}
127 ; CHECK-NEXT: eq (get_local 3), (get_local 2){{$}}
128 ; CHECK-NEXT: set_local 4, pop{{$}}
129 ; CHECK-NEXT: ne (get_local 2), (get_local 2){{$}}
130 ; CHECK-NEXT: set_local 5, pop{{$}}
131 ; CHECK-NEXT: ne (get_local 3), (get_local 3){{$}}
132 ; CHECK-NEXT: set_local 6, pop{{$}}
133 ; CHECK-NEXT: ior (get_local 6), (get_local 5){{$}}
134 ; CHECK-NEXT: set_local 7, pop{{$}}
135 ; CHECK-NEXT: ior (get_local 4), (get_local 7){{$}}
136 ; CHECK-NEXT: set_local 8, pop{{$}}
137 ; CHECK-NEXT: return (get_local 8){{$}}
138 define i32 @ueq_f64(double %x, double %y) {
139 %a = fcmp ueq double %x, %y
140 %b = zext i1 %a to i32
144 ; CHECK-LABEL: one_f64:
145 ; CHECK: ne (get_local 3), (get_local 2){{$}}
146 ; CHECK-NEXT: set_local 4, pop{{$}}
147 define i32 @one_f64(double %x, double %y) {
148 %a = fcmp one double %x, %y
149 %b = zext i1 %a to i32
153 ; CHECK-LABEL: ult_f64:
154 ; CHECK: lt (get_local 3), (get_local 2){{$}}
155 ; CHECK-NEXT: set_local 4, pop{{$}}
156 define i32 @ult_f64(double %x, double %y) {
157 %a = fcmp ult double %x, %y
158 %b = zext i1 %a to i32
162 ; CHECK-LABEL: ule_f64:
163 ; CHECK: le (get_local 3), (get_local 2){{$}}
164 ; CHECK-NEXT: set_local 4, pop{{$}}
165 define i32 @ule_f64(double %x, double %y) {
166 %a = fcmp ule double %x, %y
167 %b = zext i1 %a to i32
171 ; CHECK-LABEL: ugt_f64:
172 ; CHECK: gt (get_local 3), (get_local 2){{$}}
173 ; CHECK-NEXT: set_local 4, pop{{$}}
174 define i32 @ugt_f64(double %x, double %y) {
175 %a = fcmp ugt double %x, %y
176 %b = zext i1 %a to i32
180 ; CHECK-LABEL: uge_f64:
181 ; CHECK: ge (get_local 3), (get_local 2){{$}}
182 ; CHECK-NEXT: set_local 4, pop{{$}}
183 define i32 @uge_f64(double %x, double %y) {
184 %a = fcmp uge double %x, %y
185 %b = zext i1 %a to i32