diff options
| author | Craig Topper <craig.topper@intel.com> | 2018-06-08 07:18:33 +0000 | 
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2018-06-08 07:18:33 +0000 | 
| commit | 422a1bbb84e3c67db56f402d3d8f7b70419e619f (patch) | |
| tree | 58ee321b68fffda1929d6489902b182d08b73f0e /clang/lib/CodeGen | |
| parent | 03de166ccd128a402f3bf12fa5b2ac06455331b5 (diff) | |
| download | bcm5719-llvm-422a1bbb84e3c67db56f402d3d8f7b70419e619f.tar.gz bcm5719-llvm-422a1bbb84e3c67db56f402d3d8f7b70419e619f.zip | |
[X86] Add builtins for shufps and shufpd to enable target feature and immediate range checking.
llvm-svn: 334266
Diffstat (limited to 'clang/lib/CodeGen')
| -rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 30 | 
1 files changed, 30 insertions, 0 deletions
| diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 741f36b095d..9d9a9427edb 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -9403,6 +9403,36 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,                                         makeArrayRef(Indices, NumElts),                                         "permil");    } +  case X86::BI__builtin_ia32_shufpd: +  case X86::BI__builtin_ia32_shufpd256: +  case X86::BI__builtin_ia32_shufpd512: +  case X86::BI__builtin_ia32_shufps: +  case X86::BI__builtin_ia32_shufps256: +  case X86::BI__builtin_ia32_shufps512: { +    uint32_t Imm = cast<llvm::ConstantInt>(Ops[2])->getZExtValue(); +    llvm::Type *Ty = Ops[0]->getType(); +    unsigned NumElts = Ty->getVectorNumElements(); +    unsigned NumLanes = Ty->getPrimitiveSizeInBits() / 128; +    unsigned NumLaneElts = NumElts / NumLanes; + +    // Splat the 8-bits of immediate 4 times to help the loop wrap around. +    Imm = (Imm & 0xff) * 0x01010101; + +    uint32_t Indices[16]; +    for (unsigned l = 0; l != NumElts; l += NumLaneElts) { +      for (unsigned i = 0; i != NumLaneElts; ++i) { +        unsigned Index = Imm % NumLaneElts; +        Imm /= NumLaneElts; +        if (i >= (NumLaneElts / 2)) +          Index += NumElts; +        Indices[l + i] = l + Index; +      } +    } + +    return Builder.CreateShuffleVector(Ops[0], Ops[1], +                                       makeArrayRef(Indices, NumElts), +                                       "shufp"); +  }    case X86::BI__builtin_ia32_palignr128:    case X86::BI__builtin_ia32_palignr256:    case X86::BI__builtin_ia32_palignr512: { | 

