diff options
| author | Craig Topper <craig.topper@intel.com> | 2018-06-08 00:00:21 +0000 | 
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2018-06-08 00:00:21 +0000 | 
| commit | 7d17d7278b5eec9c3e063568e1e43bf2f577c0b7 (patch) | |
| tree | 14bb18b458671442610e883d55b0c570dffc3c57 /clang/lib/CodeGen | |
| parent | af1272918541ac6c8cfe0925a69ca7b17e4ebdb7 (diff) | |
| download | bcm5719-llvm-7d17d7278b5eec9c3e063568e1e43bf2f577c0b7.tar.gz bcm5719-llvm-7d17d7278b5eec9c3e063568e1e43bf2f577c0b7.zip | |
[X86] Add builtins for blend with immediate control to enforce target feature requirements and check immediate range.
llvm-svn: 334249
Diffstat (limited to 'clang/lib/CodeGen')
| -rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 21 | 
1 files changed, 21 insertions, 0 deletions
| diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 69f7d91b38a..00020584955 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -9235,6 +9235,27 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,      Ops[0] = Builder.CreateBitCast(Ops[0], PtrTy);      return Builder.CreateDefaultAlignedStore(Ops[1], Ops[0]);    } +  case X86::BI__builtin_ia32_pblendw128: +  case X86::BI__builtin_ia32_blendpd: +  case X86::BI__builtin_ia32_blendps: +  case X86::BI__builtin_ia32_blendpd256: +  case X86::BI__builtin_ia32_blendps256: +  case X86::BI__builtin_ia32_pblendw256: +  case X86::BI__builtin_ia32_pblendd128: +  case X86::BI__builtin_ia32_pblendd256: { +    unsigned NumElts = Ops[0]->getType()->getVectorNumElements(); +    unsigned Imm = cast<llvm::ConstantInt>(Ops[2])->getZExtValue(); + +    uint32_t Indices[16]; +    // If there are more than 8 elements, the immediate is used twice so make +    // sure we handle that. +    for (unsigned i = 0; i != NumElts; ++i) +      Indices[i] = ((Imm >> (i % 8)) & 0x1) ? NumElts + i : i; + +    return Builder.CreateShuffleVector(Ops[1], Ops[0], +                                       makeArrayRef(Indices, NumElts), +                                       "blend"); +  }    case X86::BI__builtin_ia32_palignr128:    case X86::BI__builtin_ia32_palignr256:    case X86::BI__builtin_ia32_palignr512: { | 

