@@ -41,19 +41,83 @@ define <4 x i32> @test2(<4 x float> %a, <4 x float> %b, <4 x i32> %x) {
41
41
ret <4 x i32 > %r
42
42
}
43
43
44
- define float @fsel (float %a , float %b , float %x ) {
45
- ; SSE-LABEL: fsel:
44
+ define float @fsel_zero_false_val (float %a , float %b , float %x ) {
45
+ ; SSE-LABEL: fsel_zero_false_val:
46
+ ; SSE: # %bb.0:
47
+ ; SSE-NEXT: cmpeqss %xmm1, %xmm0
48
+ ; SSE-NEXT: andps %xmm2, %xmm0
49
+ ; SSE-NEXT: retq
50
+ ;
51
+ ; AVX-LABEL: fsel_zero_false_val:
52
+ ; AVX: # %bb.0:
53
+ ; AVX-NEXT: vcmpeqss %xmm1, %xmm0, %xmm0
54
+ ; AVX-NEXT: vandps %xmm2, %xmm0, %xmm0
55
+ ; AVX-NEXT: retq
56
+ %cond = fcmp oeq float %a , %b
57
+ %r = select i1 %cond , float %x , float 0 .0
58
+ ret float %r
59
+ }
60
+
61
+ define float @fsel_zero_true_val (float %a , float %b , float %x ) {
62
+ ; SSE-LABEL: fsel_zero_true_val:
46
63
; SSE: # %bb.0:
47
64
; SSE-NEXT: cmpeqss %xmm1, %xmm0
48
65
; SSE-NEXT: andnps %xmm2, %xmm0
49
66
; SSE-NEXT: retq
50
67
;
51
- ; AVX-LABEL: fsel :
68
+ ; AVX-LABEL: fsel_zero_true_val :
52
69
; AVX: # %bb.0:
53
70
; AVX-NEXT: vcmpeqss %xmm1, %xmm0, %xmm0
54
71
; AVX-NEXT: vandnps %xmm2, %xmm0, %xmm0
55
72
; AVX-NEXT: retq
56
73
%cond = fcmp oeq float %a , %b
57
- %sel = select i1 %cond , float 0 .0 , float %x
58
- ret float %sel
74
+ %r = select i1 %cond , float 0 .0 , float %x
75
+ ret float %r
59
76
}
77
+
78
+ define double @fsel_nonzero_false_val (double %x , double %y , double %z ) {
79
+ ; SSE-LABEL: fsel_nonzero_false_val:
80
+ ; SSE: # %bb.0:
81
+ ; SSE-NEXT: cmpeqsd %xmm1, %xmm0
82
+ ; SSE-NEXT: andpd %xmm0, %xmm2
83
+ ; SSE-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero
84
+ ; SSE-NEXT: andnpd %xmm1, %xmm0
85
+ ; SSE-NEXT: orpd %xmm2, %xmm0
86
+ ; SSE-NEXT: retq
87
+ ;
88
+ ; AVX-LABEL: fsel_nonzero_false_val:
89
+ ; AVX: # %bb.0:
90
+ ; AVX-NEXT: vcmpeqsd %xmm1, %xmm0, %xmm0
91
+ ; AVX-NEXT: vandpd %xmm2, %xmm0, %xmm1
92
+ ; AVX-NEXT: vmovsd {{.*#+}} xmm2 = mem[0],zero
93
+ ; AVX-NEXT: vandnpd %xmm2, %xmm0, %xmm0
94
+ ; AVX-NEXT: vorpd %xmm1, %xmm0, %xmm0
95
+ ; AVX-NEXT: retq
96
+ %cond = fcmp oeq double %x , %y
97
+ %r = select i1 %cond , double %z , double 42 .0
98
+ ret double %r
99
+ }
100
+
101
+ define double @fsel_nonzero_true_val (double %x , double %y , double %z ) {
102
+ ; SSE-LABEL: fsel_nonzero_true_val:
103
+ ; SSE: # %bb.0:
104
+ ; SSE-NEXT: cmpeqsd %xmm1, %xmm0
105
+ ; SSE-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero
106
+ ; SSE-NEXT: andpd %xmm0, %xmm1
107
+ ; SSE-NEXT: andnpd %xmm2, %xmm0
108
+ ; SSE-NEXT: orpd %xmm1, %xmm0
109
+ ; SSE-NEXT: retq
110
+ ;
111
+ ; AVX-LABEL: fsel_nonzero_true_val:
112
+ ; AVX: # %bb.0:
113
+ ; AVX-NEXT: vcmpeqsd %xmm1, %xmm0, %xmm0
114
+ ; AVX-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero
115
+ ; AVX-NEXT: vandpd %xmm1, %xmm0, %xmm1
116
+ ; AVX-NEXT: vandnpd %xmm2, %xmm0, %xmm0
117
+ ; AVX-NEXT: vorpd %xmm1, %xmm0, %xmm0
118
+ ; AVX-NEXT: retq
119
+ %cond = fcmp oeq double %x , %y
120
+ %r = select i1 %cond , double 42 .0 , double %z
121
+ ret double %r
122
+ }
123
+
0 commit comments