• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s
3
4define <4 x i32> @test1(<4 x float> %a, <4 x float> %b, <4 x i32> %c) {
5; CHECK-LABEL: test1:
6; CHECK:       # %bb.0:
7; CHECK-NEXT:    vcmpnleps %xmm0, %xmm1, %xmm0
8; CHECK-NEXT:    vandps %xmm2, %xmm0, %xmm0
9; CHECK-NEXT:    retq
10  %f = fcmp ult <4 x float> %a, %b
11  %r = select <4 x i1> %f, <4 x i32> %c, <4 x i32> zeroinitializer
12  ret <4 x i32> %r
13}
14
15define <4 x i32> @test2(<4 x float> %a, <4 x float> %b, <4 x i32> %c) {
16; CHECK-LABEL: test2:
17; CHECK:       # %bb.0:
18; CHECK-NEXT:    vcmpnleps %xmm0, %xmm1, %xmm0
19; CHECK-NEXT:    vorps %xmm2, %xmm0, %xmm0
20; CHECK-NEXT:    retq
21  %f = fcmp ult <4 x float> %a, %b
22  %r = select <4 x i1> %f, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> %c
23  ret <4 x i32> %r
24}
25
26define <4 x i32> @test3(<4 x float> %a, <4 x float> %b, <4 x i32> %c) {
27; CHECK-LABEL: test3:
28; CHECK:       # %bb.0:
29; CHECK-NEXT:    vcmpleps %xmm0, %xmm1, %xmm0
30; CHECK-NEXT:    vandps %xmm2, %xmm0, %xmm0
31; CHECK-NEXT:    retq
32  %f = fcmp ult <4 x float> %a, %b
33  %r = select <4 x i1> %f, <4 x i32> zeroinitializer, <4 x i32> %c
34  ret <4 x i32> %r
35}
36
37define <4 x i32> @test4(<4 x float> %a, <4 x float> %b, <4 x i32> %c) {
38; CHECK-LABEL: test4:
39; CHECK:       # %bb.0:
40; CHECK-NEXT:    vcmpleps %xmm0, %xmm1, %xmm0
41; CHECK-NEXT:    vorps %xmm2, %xmm0, %xmm0
42; CHECK-NEXT:    retq
43  %f = fcmp ult <4 x float> %a, %b
44  %r = select <4 x i1> %f, <4 x i32> %c, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>
45  ret <4 x i32> %r
46}
47
48define <4 x i32> @test5(<4 x float> %a, <4 x float> %b, <4 x i32> %c) {
49; CHECK-LABEL: test5:
50; CHECK:       # %bb.0:
51; CHECK-NEXT:    vcmpnleps %xmm0, %xmm1, %xmm0
52; CHECK-NEXT:    retq
53  %f = fcmp ult <4 x float> %a, %b
54  %r = sext <4 x i1> %f to <4 x i32>
55  ret <4 x i32> %r
56}
57
58define <4 x i32> @test6(<4 x float> %a, <4 x float> %b, <4 x i32> %c) {
59; CHECK-LABEL: test6:
60; CHECK:       # %bb.0:
61; CHECK-NEXT:    vcmpleps %xmm0, %xmm1, %xmm0
62; CHECK-NEXT:    retq
63  %not.f = fcmp oge <4 x float> %a, %b
64  %r = sext <4 x i1> %not.f to <4 x i32>
65  ret <4 x i32> %r
66}
67
68define <4 x i32> @test7(<4 x float> %a, <4 x float> %b, <4 x i32>* %p) {
69; CHECK-LABEL: test7:
70; CHECK:       # %bb.0:
71; CHECK-NEXT:    vcmpnleps %xmm0, %xmm1, %xmm0
72; CHECK-NEXT:    vandps (%rdi), %xmm0, %xmm0
73; CHECK-NEXT:    retq
74  %f = fcmp ult <4 x float> %a, %b
75  %l = load <4 x i32>, <4 x i32>* %p, align 16
76  %r = select <4 x i1> %f, <4 x i32> %l, <4 x i32> zeroinitializer
77  ret <4 x i32> %r
78}
79
80; Repeat all with FP types for the select operands. Also, use different comparison predicates for better test coverage.
81
82define <2 x double> @test1f(<2 x double> %a, <2 x double> %b, <2 x double> %c) {
83; CHECK-LABEL: test1f:
84; CHECK:       # %bb.0:
85; CHECK-NEXT:    vcmpltpd %xmm0, %xmm1, %xmm0
86; CHECK-NEXT:    vandpd %xmm2, %xmm0, %xmm0
87; CHECK-NEXT:    retq
88  %f = fcmp ogt <2 x double> %a, %b
89  %r = select <2 x i1> %f, <2 x double> %c, <2 x double> zeroinitializer
90  ret <2 x double> %r
91}
92
93define <2 x double> @test2f(<2 x double> %a, <2 x double> %b, <2 x double> %c) {
94; CHECK-LABEL: test2f:
95; CHECK:       # %bb.0:
96; CHECK-NEXT:    vcmplepd %xmm0, %xmm1, %xmm0
97; CHECK-NEXT:    vorpd %xmm2, %xmm0, %xmm0
98; CHECK-NEXT:    retq
99  %f = fcmp oge <2 x double> %a, %b
100  %r = select <2 x i1> %f, <2 x double> <double 0xffffffffffffffff, double 0xffffffffffffffff>, <2 x double> %c
101  ret <2 x double> %r
102}
103
104define <2 x double> @test3f(<2 x double> %a, <2 x double> %b, <2 x double> %c) {
105; CHECK-LABEL: test3f:
106; CHECK:       # %bb.0:
107; CHECK-NEXT:    vcmpnltpd %xmm1, %xmm0, %xmm0
108; CHECK-NEXT:    vandpd %xmm2, %xmm0, %xmm0
109; CHECK-NEXT:    retq
110  %f = fcmp olt <2 x double> %a, %b
111  %r = select <2 x i1> %f, <2 x double> zeroinitializer, <2 x double> %c
112  ret <2 x double> %r
113}
114
115define <2 x double> @test4f(<2 x double> %a, <2 x double> %b, <2 x double> %c) {
116; CHECK-LABEL: test4f:
117; CHECK:       # %bb.0:
118; CHECK-NEXT:    vcmpnlepd %xmm1, %xmm0, %xmm0
119; CHECK-NEXT:    vorpd %xmm2, %xmm0, %xmm0
120; CHECK-NEXT:    retq
121  %f = fcmp ole <2 x double> %a, %b
122  %r = select <2 x i1> %f, <2 x double> %c, <2 x double> <double 0xffffffffffffffff, double 0xffffffffffffffff>
123  ret <2 x double> %r
124}
125
126define <2 x double> @test5f(<2 x double> %a, <2 x double> %b, <2 x double> %c) {
127; CHECK-LABEL: test5f:
128; CHECK:       # %bb.0:
129; CHECK-NEXT:    vcmpnlepd %xmm1, %xmm0, %xmm0
130; CHECK-NEXT:    retq
131  %f = fcmp ugt <2 x double> %a, %b
132  %r = select <2 x i1> %f, <2 x double> <double 0xffffffffffffffff, double 0xffffffffffffffff>, <2 x double> zeroinitializer
133  ret <2 x double> %r
134}
135
136define <2 x double> @test6f(<2 x double> %a, <2 x double> %b, <2 x double> %c) {
137; CHECK-LABEL: test6f:
138; CHECK:       # %bb.0:
139; CHECK-NEXT:    vcmpltpd %xmm0, %xmm1, %xmm0
140; CHECK-NEXT:    retq
141  %f = fcmp ule <2 x double> %a, %b
142  %r = select <2 x i1> %f, <2 x double> zeroinitializer, <2 x double> <double 0xffffffffffffffff, double 0xffffffffffffffff>
143  ret <2 x double> %r
144}
145
146define <2 x double> @test7f(<2 x double> %a, <2 x double> %b, <2 x double>* %p) {
147; CHECK-LABEL: test7f:
148; CHECK:       # %bb.0:
149; CHECK-NEXT:    vcmpeqpd %xmm1, %xmm0, %xmm0
150; CHECK-NEXT:    vandpd (%rdi), %xmm0, %xmm0
151; CHECK-NEXT:    retq
152  %f = fcmp oeq <2 x double> %a, %b
153  %l = load <2 x double>, <2 x double>* %p, align 16
154  %r = select <2 x i1> %f, <2 x double> %l, <2 x double> zeroinitializer
155  ret <2 x double> %r
156}
157
158