diff options
Diffstat (limited to 'clang/lib/CodeGen/CGBuiltin.cpp')
| -rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 37 | 
1 files changed, 21 insertions, 16 deletions
| diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index ac9f46cb449..012428dbb28 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -9239,18 +9239,18 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,    case X86::BI__builtin_ia32_vextractf128_ps256:    case X86::BI__builtin_ia32_vextractf128_si256:    case X86::BI__builtin_ia32_extract128i256: -  case X86::BI__builtin_ia32_extractf64x4: -  case X86::BI__builtin_ia32_extractf32x4: -  case X86::BI__builtin_ia32_extracti64x4: -  case X86::BI__builtin_ia32_extracti32x4: -  case X86::BI__builtin_ia32_extractf32x8: -  case X86::BI__builtin_ia32_extracti32x8: -  case X86::BI__builtin_ia32_extractf32x4_256: -  case X86::BI__builtin_ia32_extracti32x4_256: -  case X86::BI__builtin_ia32_extractf64x2_256: -  case X86::BI__builtin_ia32_extracti64x2_256: -  case X86::BI__builtin_ia32_extractf64x2_512: -  case X86::BI__builtin_ia32_extracti64x2_512: { +  case X86::BI__builtin_ia32_extractf64x4_mask: +  case X86::BI__builtin_ia32_extractf32x4_mask: +  case X86::BI__builtin_ia32_extracti64x4_mask: +  case X86::BI__builtin_ia32_extracti32x4_mask: +  case X86::BI__builtin_ia32_extractf32x8_mask: +  case X86::BI__builtin_ia32_extracti32x8_mask: +  case X86::BI__builtin_ia32_extractf32x4_256_mask: +  case X86::BI__builtin_ia32_extracti32x4_256_mask: +  case X86::BI__builtin_ia32_extractf64x2_256_mask: +  case X86::BI__builtin_ia32_extracti64x2_256_mask: +  case X86::BI__builtin_ia32_extractf64x2_512_mask: +  case X86::BI__builtin_ia32_extracti64x2_512_mask: {      llvm::Type *DstTy = ConvertType(E->getType());      unsigned NumElts = DstTy->getVectorNumElements();      unsigned Index = cast<ConstantInt>(Ops[1])->getZExtValue() * NumElts; @@ -9259,10 +9259,15 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,      for (unsigned i = 0; i != NumElts; ++i)        Indices[i] = i + Index; -    return Builder.CreateShuffleVector(Ops[0], -                                       UndefValue::get(Ops[0]->getType()), -                                       makeArrayRef(Indices, NumElts), -                                       "extract"); +    Value *Res = Builder.CreateShuffleVector(Ops[0], +                                             UndefValue::get(Ops[0]->getType()), +                                             makeArrayRef(Indices, NumElts), +                                             "extract"); + +    if (Ops.size() == 4) +      Res = EmitX86Select(*this, Ops[3], Res, Ops[2]); + +    return Res;    }    case X86::BI__builtin_ia32_vinsertf128_pd256:    case X86::BI__builtin_ia32_vinsertf128_ps256: | 

