@@ -77,7 +77,67 @@ define <8 x i16> @test3_x86_sse41_pblend_w(<8 x i16> %a0) {
77
77
ret <8 x i16 > %1
78
78
}
79
79
80
+ define double @demanded_blendvpd (<2 x double > %a0 , <2 x double > %a1 , <2 x double > %a2 ) {
81
+ ; CHECK-LABEL: demanded_blendvpd:
82
+ ; CHECK: # %bb.0:
83
+ ; CHECK-NEXT: movddup {{.*#+}} xmm3 = xmm0[0,0]
84
+ ; CHECK-NEXT: movddup {{.*#+}} xmm1 = xmm1[0,0]
85
+ ; CHECK-NEXT: movddup {{.*#+}} xmm0 = xmm2[0,0]
86
+ ; CHECK-NEXT: blendvpd %xmm0, %xmm1, %xmm3
87
+ ; CHECK-NEXT: movapd %xmm3, %xmm0
88
+ ; CHECK-NEXT: retq
89
+ %1 = shufflevector <2 x double > %a0 , <2 x double > undef , <2 x i32 > zeroinitializer
90
+ %2 = shufflevector <2 x double > %a1 , <2 x double > undef , <2 x i32 > zeroinitializer
91
+ %3 = shufflevector <2 x double > %a2 , <2 x double > undef , <2 x i32 > zeroinitializer
92
+ %4 = tail call <2 x double > @llvm.x86.sse41.blendvpd (<2 x double > %1 , <2 x double > %2 , <2 x double > %3 )
93
+ %5 = extractelement <2 x double > %4 , i32 0
94
+ ret double %5
95
+ }
96
+
97
+ define float @demanded_blendvps (<4 x float > %a0 , <4 x float > %a1 , <4 x float > %a2 ) {
98
+ ; CHECK-LABEL: demanded_blendvps:
99
+ ; CHECK: # %bb.0:
100
+ ; CHECK-NEXT: movaps %xmm0, %xmm3
101
+ ; CHECK-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,0],xmm0[0,0]
102
+ ; CHECK-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0,0,0]
103
+ ; CHECK-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,0,0,0]
104
+ ; CHECK-NEXT: movaps %xmm2, %xmm0
105
+ ; CHECK-NEXT: blendvps %xmm0, %xmm1, %xmm3
106
+ ; CHECK-NEXT: movaps %xmm3, %xmm0
107
+ ; CHECK-NEXT: retq
108
+ %1 = shufflevector <4 x float > %a0 , <4 x float > undef , <4 x i32 > zeroinitializer
109
+ %2 = shufflevector <4 x float > %a1 , <4 x float > undef , <4 x i32 > zeroinitializer
110
+ %3 = shufflevector <4 x float > %a2 , <4 x float > undef , <4 x i32 > zeroinitializer
111
+ %4 = tail call <4 x float > @llvm.x86.sse41.blendvps (<4 x float > %1 , <4 x float > %2 , <4 x float > %3 )
112
+ %5 = extractelement <4 x float > %4 , i32 0
113
+ ret float %5
114
+ }
115
+
116
+ define <16 x i8 > @demanded_pblendvb (<16 x i8 > %a0 , <16 x i8 > %a1 , <16 x i8 > %a2 ) {
117
+ ; CHECK-LABEL: demanded_pblendvb:
118
+ ; CHECK: # %bb.0:
119
+ ; CHECK-NEXT: movdqa %xmm0, %xmm3
120
+ ; CHECK-NEXT: pxor %xmm4, %xmm4
121
+ ; CHECK-NEXT: pshufb %xmm4, %xmm3
122
+ ; CHECK-NEXT: pshufb %xmm4, %xmm1
123
+ ; CHECK-NEXT: pshufb %xmm4, %xmm2
124
+ ; CHECK-NEXT: movdqa %xmm2, %xmm0
125
+ ; CHECK-NEXT: pblendvb %xmm0, %xmm1, %xmm3
126
+ ; CHECK-NEXT: pshufb %xmm4, %xmm3
127
+ ; CHECK-NEXT: movdqa %xmm3, %xmm0
128
+ ; CHECK-NEXT: retq
129
+ %1 = shufflevector <16 x i8 > %a0 , <16 x i8 > undef , <16 x i32 > zeroinitializer
130
+ %2 = shufflevector <16 x i8 > %a1 , <16 x i8 > undef , <16 x i32 > zeroinitializer
131
+ %3 = shufflevector <16 x i8 > %a2 , <16 x i8 > undef , <16 x i32 > zeroinitializer
132
+ %4 = tail call <16 x i8 > @llvm.x86.sse41.pblendvb (<16 x i8 > %1 , <16 x i8 > %2 , <16 x i8 > %3 )
133
+ %5 = shufflevector <16 x i8 > %4 , <16 x i8 > undef , <16 x i32 > zeroinitializer
134
+ ret <16 x i8 > %5
135
+ }
136
+
80
137
declare <2 x double > @llvm.x86.sse41.blendpd (<2 x double >, <2 x double >, i32 )
81
138
declare <4 x float > @llvm.x86.sse41.blendps (<4 x float >, <4 x float >, i32 )
82
139
declare <8 x i16 > @llvm.x86.sse41.pblendw (<8 x i16 >, <8 x i16 >, i32 )
83
140
141
+ declare <2 x double > @llvm.x86.sse41.blendvpd (<2 x double >, <2 x double >, <2 x double >)
142
+ declare <4 x float > @llvm.x86.sse41.blendvps (<4 x float >, <4 x float >, <4 x float >)
143
+ declare <16 x i8 > @llvm.x86.sse41.pblendvb (<16 x i8 >, <16 x i8 >, <16 x i8 >)
0 commit comments