@@ -117,8 +117,10 @@ HexagonTargetLowering::initializeHVXLowering() {
117117 setOperationAction (ISD::VECTOR_SHUFFLE, ByteW, Legal);
118118 setOperationAction (ISD::INTRINSIC_WO_CHAIN, MVT::Other, Custom);
119119
120- if (Subtarget.useHVX128BOps ())
120+ if (Subtarget.useHVX128BOps ()) {
121121 setOperationAction (ISD::BITCAST, MVT::v32i1, Custom);
122+ setOperationAction (ISD::BITCAST, MVT::v64i1, Custom);
123+ }
122124 if (Subtarget.useHVX128BOps () && Subtarget.useHVXV68Ops () &&
123125 Subtarget.useHVXFloatingPoint ()) {
124126
@@ -2024,13 +2026,9 @@ HexagonTargetLowering::LowerHvxBitcast(SDValue Op, SelectionDAG &DAG) const {
20242026 // Handle bitcast from i32, v2i16, and v4i8 to v32i1.
20252027 // Splat the input into a 32-element i32 vector, then AND each element
20262028 // with a unique bitmask to isolate individual bits.
2027- if (ResTy == MVT::v32i1 &&
2028- (ValTy == MVT::i32 || ValTy == MVT::v2i16 || ValTy == MVT::v4i8) &&
2029- Subtarget.useHVX128BOps ()) {
2030- SDValue Val32 = Val;
2031- if (ValTy == MVT::v2i16 || ValTy == MVT::v4i8)
2032- Val32 = DAG.getNode (ISD::BITCAST, dl, MVT::i32 , Val);
2033-
2029+ auto bitcastI32ToV32I1 = [&](SDValue Val32) {
2030+ assert (Val32.getValueType ().getSizeInBits () == 32 &&
2031+ " Input must be 32 bits" );
20342032 MVT VecTy = MVT::getVectorVT (MVT::i32 , 32 );
20352033 SDValue Splat = DAG.getNode (ISD::SPLAT_VECTOR, dl, VecTy, Val32);
20362034 SmallVector<SDValue, 32 > Mask;
@@ -2039,7 +2037,31 @@ HexagonTargetLowering::LowerHvxBitcast(SDValue Op, SelectionDAG &DAG) const {
20392037
20402038 SDValue MaskVec = DAG.getBuildVector (VecTy, dl, Mask);
20412039 SDValue Anded = DAG.getNode (ISD::AND, dl, VecTy, Splat, MaskVec);
2042- return DAG.getNode (HexagonISD::V2Q, dl, ResTy, Anded);
2040+ return DAG.getNode (HexagonISD::V2Q, dl, MVT::v32i1, Anded);
2041+ };
2042+ // === Case: v32i1 ===
2043+ if (ResTy == MVT::v32i1 &&
2044+ (ValTy == MVT::i32 || ValTy == MVT::v2i16 || ValTy == MVT::v4i8) &&
2045+ Subtarget.useHVX128BOps ()) {
2046+ SDValue Val32 = Val;
2047+ if (ValTy == MVT::v2i16 || ValTy == MVT::v4i8)
2048+ Val32 = DAG.getNode (ISD::BITCAST, dl, MVT::i32 , Val);
2049+ return bitcastI32ToV32I1 (Val32);
2050+ }
2051+ // === Case: v64i1 ===
2052+ if (ResTy == MVT::v64i1 && ValTy == MVT::i64 && Subtarget.useHVX128BOps ()) {
2053+ // Split i64 into lo/hi 32-bit halves.
2054+ SDValue Lo = DAG.getNode (ISD::TRUNCATE, dl, MVT::i32 , Val);
2055+ SDValue HiShifted = DAG.getNode (ISD::SRL, dl, MVT::i64 , Val,
2056+ DAG.getConstant (32 , dl, MVT::i64 ));
2057+ SDValue Hi = DAG.getNode (ISD::TRUNCATE, dl, MVT::i32 , HiShifted);
2058+
2059+ // Reuse the same 32-bit logic twice.
2060+ SDValue LoRes = bitcastI32ToV32I1 (Lo);
2061+ SDValue HiRes = bitcastI32ToV32I1 (Hi);
2062+
2063+ // Concatenate into a v64i1 predicate.
2064+ return DAG.getNode (ISD::CONCAT_VECTORS, dl, MVT::v64i1, LoRes, HiRes);
20432065 }
20442066
20452067 if (isHvxBoolTy (ResTy) && ValTy.isScalarInteger ()) {
0 commit comments