diff options
Diffstat (limited to 'clang/lib/AST')
| -rw-r--r-- | clang/lib/AST/ASTContext.cpp | 5 | ||||
| -rw-r--r-- | clang/lib/AST/ByteCode/InterpBuiltin.cpp | 42 | ||||
| -rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 46 | ||||
| -rw-r--r-- | clang/lib/AST/OpenMPClause.cpp | 8 | ||||
| -rw-r--r-- | clang/lib/AST/StmtProfile.cpp | 2 | 
5 files changed, 91 insertions, 12 deletions
| diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 687cd46..2669f62 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -12403,6 +12403,11 @@ static QualType DecodeTypeFromStr(const char *&Str, const ASTContext &Context,    // Read the base type.    switch (*Str++) {    default: llvm_unreachable("Unknown builtin type letter!"); +  case 'e': +    assert(HowLong == 0 && !Signed && !Unsigned && +           "Bad modifiers used with 'e'!"); +    Type = Context.getLangOpts().OpenCL ? Context.HalfTy : Context.Float16Ty; +    break;    case 'x':      assert(HowLong == 0 && !Signed && !Unsigned &&             "Bad modifiers used with 'x'!"); diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp index b3ab82d..8b57b96 100644 --- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp +++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp @@ -3411,7 +3411,7 @@ static bool interp__builtin_x86_byteshift(  static bool interp__builtin_ia32_shuffle_generic(      InterpState &S, CodePtr OpPC, const CallExpr *Call, -    llvm::function_ref<std::pair<unsigned, unsigned>(unsigned, unsigned)> +    llvm::function_ref<std::pair<unsigned, int>(unsigned, unsigned)>          GetSourceIndex) {    assert(Call->getNumArgs() == 3); @@ -3428,8 +3428,19 @@ static bool interp__builtin_ia32_shuffle_generic(    for (unsigned DstIdx = 0; DstIdx != NumElems; ++DstIdx) {      auto [SrcVecIdx, SrcIdx] = GetSourceIndex(DstIdx, ShuffleMask); -    const Pointer &Src = (SrcVecIdx == 0) ? A : B; -    TYPE_SWITCH(ElemT, { Dst.elem<T>(DstIdx) = Src.elem<T>(SrcIdx); }); + +    if (SrcIdx < 0) { +      // Zero out this element +      if (ElemT == PT_Float) { +        Dst.elem<Floating>(DstIdx) = Floating( +            S.getASTContext().getFloatTypeSemantics(VecT->getElementType())); +      } else { +        INT_TYPE_SWITCH_NO_BOOL(ElemT, { Dst.elem<T>(DstIdx) = T::from(0); }); +      } +    } else { +      const Pointer &Src = (SrcVecIdx == 0) ? A : B; +      TYPE_SWITCH(ElemT, { Dst.elem<T>(DstIdx) = Src.elem<T>(SrcIdx); }); +    }    }    Dst.initializeAllElements(); @@ -4382,7 +4393,8 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,            unsigned SrcIdx = ElemInLane >= NumSelectableElems ? 1 : 0;            unsigned BitIndex = (DstIdx * BitsPerElem) % MaskBits;            unsigned Index = (ShuffleMask >> BitIndex) & IndexMask; -          return std::pair<unsigned, unsigned>{SrcIdx, LaneOffset + Index}; +          return std::pair<unsigned, int>{SrcIdx, +                                          static_cast<int>(LaneOffset + Index)};          });    case X86::BI__builtin_ia32_shufpd:    case X86::BI__builtin_ia32_shufpd256: @@ -4400,7 +4412,27 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,            unsigned SrcIdx = ElemInLane >= NumSelectableElems ? 1 : 0;            unsigned BitIndex = (DstIdx * BitsPerElem) % MaskBits;            unsigned Index = (ShuffleMask >> BitIndex) & IndexMask; -          return std::pair<unsigned, unsigned>{SrcIdx, LaneOffset + Index}; +          return std::pair<unsigned, int>{SrcIdx, +                                          static_cast<int>(LaneOffset + Index)}; +        }); +  case X86::BI__builtin_ia32_insertps128: +    return interp__builtin_ia32_shuffle_generic( +        S, OpPC, Call, [](unsigned DstIdx, unsigned Mask) { +          // Bits [3:0]: zero mask - if bit is set, zero this element +          if ((Mask & (1 << DstIdx)) != 0) { +            return std::pair<unsigned, int>{0, -1}; +          } +          // Bits [7:6]: select element from source vector Y (0-3) +          // Bits [5:4]: select destination position (0-3) +          unsigned SrcElem = (Mask >> 6) & 0x3; +          unsigned DstElem = (Mask >> 4) & 0x3; +          if (DstIdx == DstElem) { +            // Insert element from source vector (B) at this position +            return std::pair<unsigned, int>{1, static_cast<int>(SrcElem)}; +          } else { +            // Copy from destination vector (A) +            return std::pair<unsigned, int>{0, static_cast<int>(DstIdx)}; +          }          });    case X86::BI__builtin_ia32_pshufb128:    case X86::BI__builtin_ia32_pshufb256: diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index d0404b9..97eeba8 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -11621,7 +11621,7 @@ static bool evalPackBuiltin(const CallExpr *E, EvalInfo &Info, APValue &Result,  static bool evalShuffleGeneric(      EvalInfo &Info, const CallExpr *Call, APValue &Out, -    llvm::function_ref<std::pair<unsigned, unsigned>(unsigned, unsigned)> +    llvm::function_ref<std::pair<unsigned, int>(unsigned, unsigned)>          GetSourceIndex) {    const auto *VT = Call->getType()->getAs<VectorType>(); @@ -11644,8 +11644,16 @@ static bool evalShuffleGeneric(    for (unsigned DstIdx = 0; DstIdx != NumElts; ++DstIdx) {      auto [SrcVecIdx, SrcIdx] = GetSourceIndex(DstIdx, ShuffleMask); -    const APValue &Src = (SrcVecIdx == 0) ? A : B; -    ResultElements.push_back(Src.getVectorElt(SrcIdx)); + +    if (SrcIdx < 0) { +      // Zero out this element +      QualType ElemTy = VT->getElementType(); +      ResultElements.push_back( +          APValue(APFloat::getZero(Info.Ctx.getFloatTypeSemantics(ElemTy)))); +    } else { +      const APValue &Src = (SrcVecIdx == 0) ? A : B; +      ResultElements.push_back(Src.getVectorElt(SrcIdx)); +    }    }    Out = APValue(ResultElements.data(), ResultElements.size()); @@ -12438,7 +12446,7 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {      if (!evalShuffleGeneric(              Info, E, R,              [](unsigned DstIdx, -               unsigned ShuffleMask) -> std::pair<unsigned, unsigned> { +               unsigned ShuffleMask) -> std::pair<unsigned, int> {                constexpr unsigned LaneBits = 128u;                unsigned NumElemPerLane = LaneBits / 32;                unsigned NumSelectableElems = NumElemPerLane / 2; @@ -12451,7 +12459,7 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {                unsigned BitIndex = (DstIdx * BitsPerElem) % MaskBits;                unsigned SrcIdx = (ElemInLane < NumSelectableElems) ? 0 : 1;                unsigned Index = (ShuffleMask >> BitIndex) & IndexMask; -              return {SrcIdx, LaneOffset + Index}; +              return {SrcIdx, static_cast<int>(LaneOffset + Index)};              }))        return false;      return Success(R, E); @@ -12463,7 +12471,7 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {      if (!evalShuffleGeneric(              Info, E, R,              [](unsigned DstIdx, -               unsigned ShuffleMask) -> std::pair<unsigned, unsigned> { +               unsigned ShuffleMask) -> std::pair<unsigned, int> {                constexpr unsigned LaneBits = 128u;                unsigned NumElemPerLane = LaneBits / 64;                unsigned NumSelectableElems = NumElemPerLane / 2; @@ -12476,7 +12484,31 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {                unsigned BitIndex = (DstIdx * BitsPerElem) % MaskBits;                unsigned SrcIdx = (ElemInLane < NumSelectableElems) ? 0 : 1;                unsigned Index = (ShuffleMask >> BitIndex) & IndexMask; -              return {SrcIdx, LaneOffset + Index}; +              return {SrcIdx, static_cast<int>(LaneOffset + Index)}; +            })) +      return false; +    return Success(R, E); +  } +  case X86::BI__builtin_ia32_insertps128: { +    APValue R; +    if (!evalShuffleGeneric( +            Info, E, R, +            [](unsigned DstIdx, unsigned Mask) -> std::pair<unsigned, int> { +              // Bits [3:0]: zero mask - if bit is set, zero this element +              if ((Mask & (1 << DstIdx)) != 0) { +                return {0, -1}; +              } +              // Bits [7:6]: select element from source vector Y (0-3) +              // Bits [5:4]: select destination position (0-3) +              unsigned SrcElem = (Mask >> 6) & 0x3; +              unsigned DstElem = (Mask >> 4) & 0x3; +              if (DstIdx == DstElem) { +                // Insert element from source vector (B) at this position +                return {1, static_cast<int>(SrcElem)}; +              } else { +                // Copy from destination vector (A) +                return {0, static_cast<int>(DstIdx)}; +              }              }))        return false;      return Success(R, E); diff --git a/clang/lib/AST/OpenMPClause.cpp b/clang/lib/AST/OpenMPClause.cpp index 791df7e..59d9459 100644 --- a/clang/lib/AST/OpenMPClause.cpp +++ b/clang/lib/AST/OpenMPClause.cpp @@ -124,6 +124,7 @@ const OMPClauseWithPreInit *OMPClauseWithPreInit::get(const OMPClause *C) {    case OMPC_nowait:    case OMPC_untied:    case OMPC_mergeable: +  case OMPC_threadset:    case OMPC_threadprivate:    case OMPC_groupprivate:    case OMPC_flush: @@ -2035,6 +2036,13 @@ void OMPClausePrinter::VisitOMPDefaultClause(OMPDefaultClause *Node) {    OS << ")";  } +void OMPClausePrinter::VisitOMPThreadsetClause(OMPThreadsetClause *Node) { +  OS << "threadset(" +     << getOpenMPSimpleClauseTypeName(OMPC_threadset, +                                      unsigned(Node->getThreadsetKind())) +     << ")"; +} +  void OMPClausePrinter::VisitOMPProcBindClause(OMPProcBindClause *Node) {    OS << "proc_bind("       << getOpenMPSimpleClauseTypeName(OMPC_proc_bind, diff --git a/clang/lib/AST/StmtProfile.cpp b/clang/lib/AST/StmtProfile.cpp index 05b64cc..c909e1b 100644 --- a/clang/lib/AST/StmtProfile.cpp +++ b/clang/lib/AST/StmtProfile.cpp @@ -546,6 +546,8 @@ void OMPClauseProfiler::VisitOMPNocontextClause(const OMPNocontextClause *C) {  void OMPClauseProfiler::VisitOMPDefaultClause(const OMPDefaultClause *C) { } +void OMPClauseProfiler::VisitOMPThreadsetClause(const OMPThreadsetClause *C) {} +  void OMPClauseProfiler::VisitOMPProcBindClause(const OMPProcBindClause *C) { }  void OMPClauseProfiler::VisitOMPUnifiedAddressClause( | 
