diff options
| author | Craig Topper <craig.topper@intel.com> | 2018-06-10 17:27:05 +0000 | 
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2018-06-10 17:27:05 +0000 | 
| commit | 3cce6a7ed90345e9aaadb3c9a5b8a0e2f400745d (patch) | |
| tree | e23ade10750b292457f4d76bf96c4185152cd3ed /clang/lib/CodeGen | |
| parent | c03ec17a75cb09c38bef0c6ee3b7ea94f2b9d5c6 (diff) | |
| download | bcm5719-llvm-3cce6a7ed90345e9aaadb3c9a5b8a0e2f400745d.tar.gz bcm5719-llvm-3cce6a7ed90345e9aaadb3c9a5b8a0e2f400745d.zip | |
[X86] Use target independent masked expandload and compressstore intrinsics to implement expandload/compressstore builtins.
Summary: We've had these target independent intrinsics for at least a year and a half. Looks like they do exactly what we need here and the backend already supports them.
Reviewers: RKSimon, delena, spatel, GBuella
Reviewed By: RKSimon
Subscribers: cfe-commits, llvm-commits
Differential Revision: https://reviews.llvm.org/D47693
llvm-svn: 334366
Diffstat (limited to 'clang/lib/CodeGen')
| -rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 74 | 
1 files changed, 74 insertions, 0 deletions
| diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 175e58af784..674cb487eef 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -8496,6 +8496,40 @@ static Value *EmitX86MaskedLoad(CodeGenFunction &CGF,    return CGF.Builder.CreateMaskedLoad(Ptr, Align, MaskVec, Ops[1]);  } +static Value *EmitX86ExpandLoad(CodeGenFunction &CGF, +                                ArrayRef<Value *> Ops) { +  llvm::Type *ResultTy = Ops[1]->getType(); +  llvm::Type *PtrTy = ResultTy->getVectorElementType(); + +  // Cast the pointer to element type. +  Value *Ptr = CGF.Builder.CreateBitCast(Ops[0], +                                         llvm::PointerType::getUnqual(PtrTy)); + +  Value *MaskVec = getMaskVecValue(CGF, Ops[2], +                                   ResultTy->getVectorNumElements()); + +  llvm::Function *F = CGF.CGM.getIntrinsic(Intrinsic::masked_expandload, +                                           ResultTy); +  return CGF.Builder.CreateCall(F, { Ptr, MaskVec, Ops[1] }); +} + +static Value *EmitX86CompressStore(CodeGenFunction &CGF, +                                   ArrayRef<Value *> Ops) { +  llvm::Type *ResultTy = Ops[1]->getType(); +  llvm::Type *PtrTy = ResultTy->getVectorElementType(); + +  // Cast the pointer to element type. +  Value *Ptr = CGF.Builder.CreateBitCast(Ops[0], +                                         llvm::PointerType::getUnqual(PtrTy)); + +  Value *MaskVec = getMaskVecValue(CGF, Ops[2], +                                   ResultTy->getVectorNumElements()); + +  llvm::Function *F = CGF.CGM.getIntrinsic(Intrinsic::masked_compressstore, +                                           ResultTy); +  return CGF.Builder.CreateCall(F, { Ops[1], Ptr, MaskVec }); +} +  static Value *EmitX86MaskLogic(CodeGenFunction &CGF, Instruction::BinaryOps Opc,                                unsigned NumElts, ArrayRef<Value *> Ops,                                bool InvertLHS = false) { @@ -9219,6 +9253,46 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,      return EmitX86MaskedLoad(*this, Ops, Align);    } +  case X86::BI__builtin_ia32_expandloaddf128_mask: +  case X86::BI__builtin_ia32_expandloaddf256_mask: +  case X86::BI__builtin_ia32_expandloaddf512_mask: +  case X86::BI__builtin_ia32_expandloadsf128_mask: +  case X86::BI__builtin_ia32_expandloadsf256_mask: +  case X86::BI__builtin_ia32_expandloadsf512_mask: +  case X86::BI__builtin_ia32_expandloaddi128_mask: +  case X86::BI__builtin_ia32_expandloaddi256_mask: +  case X86::BI__builtin_ia32_expandloaddi512_mask: +  case X86::BI__builtin_ia32_expandloadsi128_mask: +  case X86::BI__builtin_ia32_expandloadsi256_mask: +  case X86::BI__builtin_ia32_expandloadsi512_mask: +  case X86::BI__builtin_ia32_expandloadhi128_mask: +  case X86::BI__builtin_ia32_expandloadhi256_mask: +  case X86::BI__builtin_ia32_expandloadhi512_mask: +  case X86::BI__builtin_ia32_expandloadqi128_mask: +  case X86::BI__builtin_ia32_expandloadqi256_mask: +  case X86::BI__builtin_ia32_expandloadqi512_mask: +    return EmitX86ExpandLoad(*this, Ops); + +  case X86::BI__builtin_ia32_compressstoredf128_mask: +  case X86::BI__builtin_ia32_compressstoredf256_mask: +  case X86::BI__builtin_ia32_compressstoredf512_mask: +  case X86::BI__builtin_ia32_compressstoresf128_mask: +  case X86::BI__builtin_ia32_compressstoresf256_mask: +  case X86::BI__builtin_ia32_compressstoresf512_mask: +  case X86::BI__builtin_ia32_compressstoredi128_mask: +  case X86::BI__builtin_ia32_compressstoredi256_mask: +  case X86::BI__builtin_ia32_compressstoredi512_mask: +  case X86::BI__builtin_ia32_compressstoresi128_mask: +  case X86::BI__builtin_ia32_compressstoresi256_mask: +  case X86::BI__builtin_ia32_compressstoresi512_mask: +  case X86::BI__builtin_ia32_compressstorehi128_mask: +  case X86::BI__builtin_ia32_compressstorehi256_mask: +  case X86::BI__builtin_ia32_compressstorehi512_mask: +  case X86::BI__builtin_ia32_compressstoreqi128_mask: +  case X86::BI__builtin_ia32_compressstoreqi256_mask: +  case X86::BI__builtin_ia32_compressstoreqi512_mask: +    return EmitX86CompressStore(*this, Ops); +    case X86::BI__builtin_ia32_storehps:    case X86::BI__builtin_ia32_storelps: {      llvm::Type *PtrTy = llvm::PointerType::getUnqual(Int64Ty); | 

