22; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx10.2-512 | FileCheck %s --check-prefix=X64
33; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+avx10.2-512 | FileCheck %s --check-prefix=X86
44
5- define i1 @oeq ( float %x , float %y ) {
6- ; X64-LABEL: oeq :
5+ define i1 @hoeq ( half %x , half %y ) {
6+ ; X64-LABEL: hoeq :
77; X64: # %bb.0:
8- ; X64-NEXT: vucomxss %xmm1, %xmm0
8+ ; X64-NEXT: vucomxsh %xmm1, %xmm0
99; X64-NEXT: sete %al
1010; X64-NEXT: retq
1111;
12- ; X86-LABEL: oeq :
12+ ; X86-LABEL: hoeq :
1313; X86: # %bb.0:
14- ; X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
15- ; X86-NEXT: vucomxss {{[0-9]+}}(%esp), %xmm0
14+ ; X86-NEXT: vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero ,zero,zero,zero
15+ ; X86-NEXT: vucomxsh {{[0-9]+}}(%esp), %xmm0
1616; X86-NEXT: sete %al
1717; X86-NEXT: retl
18- %1 = fcmp oeq float %x , %y
18+ %1 = fcmp oeq half %x , %y
1919 ret i1 %1
2020}
2121
22- define i1 @une ( float %x , float %y ) {
23- ; X64-LABEL: une :
22+ define i1 @hune ( half %x , half %y ) {
23+ ; X64-LABEL: hune :
2424; X64: # %bb.0:
25- ; X64-NEXT: vucomxss %xmm1, %xmm0
25+ ; X64-NEXT: vucomxsh %xmm1, %xmm0
2626; X64-NEXT: setne %al
2727; X64-NEXT: retq
2828;
29- ; X86-LABEL: une:
29+ ; X86-LABEL: hune:
30+ ; X86: # %bb.0:
31+ ; X86-NEXT: vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero
32+ ; X86-NEXT: vucomxsh {{[0-9]+}}(%esp), %xmm0
33+ ; X86-NEXT: setne %al
34+ ; X86-NEXT: retl
35+ %1 = fcmp une half %x , %y
36+ ret i1 %1
37+ }
38+
39+ define i1 @hoeq_mem (ptr %xp , ptr %yp ) {
40+ ; X64-LABEL: hoeq_mem:
41+ ; X64: # %bb.0:
42+ ; X64-NEXT: vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero
43+ ; X64-NEXT: vucomxsh (%rsi), %xmm0
44+ ; X64-NEXT: sete %al
45+ ; X64-NEXT: retq
46+ ;
47+ ; X86-LABEL: hoeq_mem:
48+ ; X86: # %bb.0:
49+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
50+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
51+ ; X86-NEXT: vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero
52+ ; X86-NEXT: vucomxsh (%eax), %xmm0
53+ ; X86-NEXT: sete %al
54+ ; X86-NEXT: retl
55+ %x = load half , ptr %xp
56+ %y = load half , ptr %yp
57+ %1 = fcmp oeq half %x , %y
58+ ret i1 %1
59+ }
60+
61+ define i1 @hune_mem (ptr %xp , ptr %yp ) {
62+ ; X64-LABEL: hune_mem:
63+ ; X64: # %bb.0:
64+ ; X64-NEXT: vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero
65+ ; X64-NEXT: vucomxsh (%rsi), %xmm0
66+ ; X64-NEXT: setne %al
67+ ; X64-NEXT: retq
68+ ;
69+ ; X86-LABEL: hune_mem:
70+ ; X86: # %bb.0:
71+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
72+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
73+ ; X86-NEXT: vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero
74+ ; X86-NEXT: vucomxsh (%eax), %xmm0
75+ ; X86-NEXT: setne %al
76+ ; X86-NEXT: retl
77+ %x = load half , ptr %xp
78+ %y = load half , ptr %yp
79+ %1 = fcmp une half %x , %y
80+ ret i1 %1
81+ }
82+
83+ define i1 @foeq (float %x , float %y ) {
84+ ; X64-LABEL: foeq:
85+ ; X64: # %bb.0:
86+ ; X64-NEXT: vucomxss %xmm1, %xmm0
87+ ; X64-NEXT: sete %al
88+ ; X64-NEXT: retq
89+ ;
90+ ; X86-LABEL: foeq:
3091; X86: # %bb.0:
3192; X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
3293; X86-NEXT: vucomxss {{[0-9]+}}(%esp), %xmm0
33- ; X86-NEXT: setne %al
94+ ; X86-NEXT: sete %al
3495; X86-NEXT: retl
35- %1 = fcmp une float %x , %y
96+ %1 = fcmp oeq float %x , %y
3697 ret i1 %1
3798}
3899
39- define i1 @ogt (float %x , float %y ) {
40- ; X64-LABEL: ogt :
100+ define i1 @fune (float %x , float %y ) {
101+ ; X64-LABEL: fune :
41102; X64: # %bb.0:
42- ; X64-NEXT: vucomiss %xmm1, %xmm0
43- ; X64-NEXT: seta %al
103+ ; X64-NEXT: vucomxss %xmm1, %xmm0
104+ ; X64-NEXT: setne %al
44105; X64-NEXT: retq
45106;
46- ; X86-LABEL: ogt :
107+ ; X86-LABEL: fune :
47108; X86: # %bb.0:
48109; X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
49- ; X86-NEXT: vucomiss {{[0-9]+}}(%esp), %xmm0
50- ; X86-NEXT: seta %al
110+ ; X86-NEXT: vucomxss {{[0-9]+}}(%esp), %xmm0
111+ ; X86-NEXT: setne %al
51112; X86-NEXT: retl
52- %1 = fcmp ogt float %x , %y
113+ %1 = fcmp une float %x , %y
53114 ret i1 %1
54115}
55116
56- define i1 @oeq_mem (ptr %xp , ptr %yp ) {
57- ; X64-LABEL: oeq_mem :
117+ define i1 @foeq_mem (ptr %xp , ptr %yp ) {
118+ ; X64-LABEL: foeq_mem :
58119; X64: # %bb.0:
59120; X64-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
60121; X64-NEXT: vucomxss (%rsi), %xmm0
61122; X64-NEXT: sete %al
62123; X64-NEXT: retq
63124;
64- ; X86-LABEL: oeq_mem :
125+ ; X86-LABEL: foeq_mem :
65126; X86: # %bb.0:
66127; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
67128; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
@@ -75,15 +136,15 @@ define i1 @oeq_mem(ptr %xp, ptr %yp) {
75136 ret i1 %1
76137}
77138
78- define i1 @une_mem (ptr %xp , ptr %yp ) {
79- ; X64-LABEL: une_mem :
139+ define i1 @fune_mem (ptr %xp , ptr %yp ) {
140+ ; X64-LABEL: fune_mem :
80141; X64: # %bb.0:
81142; X64-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
82143; X64-NEXT: vucomxss (%rsi), %xmm0
83144; X64-NEXT: setne %al
84145; X64-NEXT: retq
85146;
86- ; X86-LABEL: une_mem :
147+ ; X86-LABEL: fune_mem :
87148; X86: # %bb.0:
88149; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
89150; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
@@ -97,25 +158,80 @@ define i1 @une_mem(ptr %xp, ptr %yp) {
97158 ret i1 %1
98159}
99160
161+ define i1 @doeq (double %x , double %y ) {
162+ ; X64-LABEL: doeq:
163+ ; X64: # %bb.0:
164+ ; X64-NEXT: vucomxsd %xmm1, %xmm0
165+ ; X64-NEXT: sete %al
166+ ; X64-NEXT: retq
167+ ;
168+ ; X86-LABEL: doeq:
169+ ; X86: # %bb.0:
170+ ; X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
171+ ; X86-NEXT: vucomxsd {{[0-9]+}}(%esp), %xmm0
172+ ; X86-NEXT: sete %al
173+ ; X86-NEXT: retl
174+ %1 = fcmp oeq double %x , %y
175+ ret i1 %1
176+ }
100177
101- define i1 @ogt_mem ( ptr %xp , ptr %yp ) {
102- ; X64-LABEL: ogt_mem :
178+ define i1 @dune ( double %x , double %y ) {
179+ ; X64-LABEL: dune :
103180; X64: # %bb.0:
104- ; X64-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
105- ; X64-NEXT: vucomiss (%rsi), %xmm0
106- ; X64-NEXT: seta %al
181+ ; X64-NEXT: vucomxsd %xmm1, %xmm0
182+ ; X64-NEXT: setne %al
107183; X64-NEXT: retq
108184;
109- ; X86-LABEL: ogt_mem:
185+ ; X86-LABEL: dune:
186+ ; X86: # %bb.0:
187+ ; X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
188+ ; X86-NEXT: vucomxsd {{[0-9]+}}(%esp), %xmm0
189+ ; X86-NEXT: setne %al
190+ ; X86-NEXT: retl
191+ %1 = fcmp une double %x , %y
192+ ret i1 %1
193+ }
194+
195+ define i1 @doeq_mem (ptr %xp , ptr %yp ) {
196+ ; X64-LABEL: doeq_mem:
197+ ; X64: # %bb.0:
198+ ; X64-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
199+ ; X64-NEXT: vucomxsd (%rsi), %xmm0
200+ ; X64-NEXT: sete %al
201+ ; X64-NEXT: retq
202+ ;
203+ ; X86-LABEL: doeq_mem:
110204; X86: # %bb.0:
111205; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
112206; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
113- ; X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero ,zero
114- ; X86-NEXT: vucomiss (%eax), %xmm0
115- ; X86-NEXT: seta %al
207+ ; X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
208+ ; X86-NEXT: vucomxsd (%eax), %xmm0
209+ ; X86-NEXT: sete %al
116210; X86-NEXT: retl
117- %x = load float , ptr %xp
118- %y = load float , ptr %yp
119- %1 = fcmp ogt float %x , %y
211+ %x = load double , ptr %xp
212+ %y = load double , ptr %yp
213+ %1 = fcmp oeq double %x , %y
214+ ret i1 %1
215+ }
216+
217+ define i1 @dune_mem (ptr %xp , ptr %yp ) {
218+ ; X64-LABEL: dune_mem:
219+ ; X64: # %bb.0:
220+ ; X64-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
221+ ; X64-NEXT: vucomxsd (%rsi), %xmm0
222+ ; X64-NEXT: setne %al
223+ ; X64-NEXT: retq
224+ ;
225+ ; X86-LABEL: dune_mem:
226+ ; X86: # %bb.0:
227+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
228+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
229+ ; X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
230+ ; X86-NEXT: vucomxsd (%eax), %xmm0
231+ ; X86-NEXT: setne %al
232+ ; X86-NEXT: retl
233+ %x = load double , ptr %xp
234+ %y = load double , ptr %yp
235+ %1 = fcmp une double %x , %y
120236 ret i1 %1
121237}
0 commit comments