@@ -212,6 +212,9 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering(
212
212
MVT::v2f64})
213
213
setOperationAction (ISD::BUILD_VECTOR, T, Custom);
214
214
215
+ if (Subtarget->hasFP16 ())
216
+ setOperationAction (ISD::BUILD_VECTOR, MVT::f16, Custom);
217
+
215
218
// We have custom shuffle lowering to expose the shuffle mask
216
219
for (auto T : {MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v4f32, MVT::v2i64,
217
220
MVT::v2f64})
@@ -2059,6 +2062,18 @@ static SDValue LowerConvertLow(SDValue Op, SelectionDAG &DAG) {
2059
2062
2060
2063
SDValue WebAssemblyTargetLowering::LowerBUILD_VECTOR (SDValue Op,
2061
2064
SelectionDAG &DAG) const {
2065
+ MVT VT = Op.getSimpleValueType ();
2066
+ if (VT == MVT::v8f16) {
2067
+ // BUILD_VECTOR can't handle FP16 operands since Wasm doesn't have a scaler
2068
+ // FP16 type, so cast them to I16s.
2069
+ MVT IVT = VT.changeVectorElementType (MVT::i16);
2070
+ SmallVector<SDValue, 8 > NewOps;
2071
+ for (unsigned I = 0 , E = Op.getNumOperands (); I < E; ++I)
2072
+ NewOps.push_back (DAG.getBitcast (MVT::i16, Op.getOperand (I)));
2073
+ SDValue Res = DAG.getNode (ISD::BUILD_VECTOR, SDLoc (), IVT, NewOps);
2074
+ return DAG.getBitcast (VT, Res);
2075
+ }
2076
+
2062
2077
if (auto ConvertLow = LowerConvertLow (Op, DAG))
2063
2078
return ConvertLow;
2064
2079
0 commit comments