@@ -255,6 +255,7 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
255255 setOperationAction (ISD::SETCC, VT, Legal);
256256 setOperationAction (ISD::VSELECT, VT, Legal);
257257 setOperationAction (ISD::VECTOR_SHUFFLE, VT, Custom);
258+ setOperationAction (ISD::SCALAR_TO_VECTOR, VT, Custom);
258259 }
259260 for (MVT VT : {MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64}) {
260261 setOperationAction ({ISD::ADD, ISD::SUB}, VT, Legal);
@@ -311,6 +312,7 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
311312 setOperationAction (ISD::SETCC, VT, Legal);
312313 setOperationAction (ISD::VSELECT, VT, Legal);
313314 setOperationAction (ISD::VECTOR_SHUFFLE, VT, Custom);
315+ setOperationAction (ISD::SCALAR_TO_VECTOR, VT, Custom);
314316 }
315317 for (MVT VT : {MVT::v4i64, MVT::v8i32, MVT::v16i16, MVT::v32i8}) {
316318 setOperationAction ({ISD::ADD, ISD::SUB}, VT, Legal);
@@ -446,10 +448,26 @@ SDValue LoongArchTargetLowering::LowerOperation(SDValue Op,
446448 return lowerVECTOR_SHUFFLE (Op, DAG);
447449 case ISD::BITREVERSE:
448450 return lowerBITREVERSE (Op, DAG);
451+ case ISD::SCALAR_TO_VECTOR:
452+ return lowerSCALAR_TO_VECTOR (Op, DAG);
449453 }
450454 return SDValue ();
451455}
452456
457+ SDValue
458+ LoongArchTargetLowering::lowerSCALAR_TO_VECTOR (SDValue Op,
459+ SelectionDAG &DAG) const {
460+ SDLoc DL (Op);
461+ MVT OpVT = Op.getSimpleValueType ();
462+
463+ SDValue Vector = DAG.getUNDEF (OpVT);
464+ SDValue Val = Op.getOperand (0 );
465+ SDValue Idx = DAG.getConstant (0 , DL, Subtarget.getGRLenVT ());
466+
467+ Vector = DAG.getNode (ISD::INSERT_VECTOR_ELT, DL, OpVT, Vector, Val, Idx);
468+ return Vector;
469+ }
470+
453471SDValue LoongArchTargetLowering::lowerBITREVERSE (SDValue Op,
454472 SelectionDAG &DAG) const {
455473 EVT ResTy = Op->getValueType (0 );
0 commit comments