diff options
author | Nemanja Ivanovic <nemanja.i.ibm@gmail.com> | 2015-03-04 21:48:22 +0000 |
---|---|---|
committer | Nemanja Ivanovic <nemanja.i.ibm@gmail.com> | 2015-03-04 21:48:22 +0000 |
commit | 55e757db4a53ff13195e97b271fff691a43b1ddc (patch) | |
tree | c64b4d56e226c7db220ac4da81c12caff6767609 /clang/lib/CodeGen/CGBuiltin.cpp | |
parent | 77a4da19914c84e07a82dc22bbbf28540f90ca31 (diff) | |
download | bcm5719-llvm-55e757db4a53ff13195e97b271fff691a43b1ddc.tar.gz bcm5719-llvm-55e757db4a53ff13195e97b271fff691a43b1ddc.zip |
Add Clang support for PPC cryptography builtins
Review: http://reviews.llvm.org/D7951
llvm-svn: 231291
Diffstat (limited to 'clang/lib/CodeGen/CGBuiltin.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 014ea9d9392..eae5f02edbd 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -6349,6 +6349,35 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID, llvm::Function *F = CGM.getIntrinsic(ID); return Builder.CreateCall(F, Ops, ""); } + // P8 Crypto builtins + case PPC::BI__builtin_altivec_crypto_vshasigmaw: + case PPC::BI__builtin_altivec_crypto_vshasigmad: + { + ConstantInt *CI1 = dyn_cast<ConstantInt>(Ops[1]); + ConstantInt *CI2 = dyn_cast<ConstantInt>(Ops[2]); + assert(CI1 && CI2); + if (CI1->getZExtValue() > 1) { + CGM.Error(E->getArg(1)->getExprLoc(), + "argument out of range (should be 0-1)."); + return llvm::UndefValue::get(Ops[0]->getType()); + } + if (CI2->getZExtValue() > 15) { + CGM.Error(E->getArg(2)->getExprLoc(), + "argument out of range (should be 0-15)."); + return llvm::UndefValue::get(Ops[0]->getType()); + } + switch (BuiltinID) { + default: llvm_unreachable("Unsupported sigma intrinsic!"); + case PPC::BI__builtin_altivec_crypto_vshasigmaw: + ID = Intrinsic::ppc_altivec_crypto_vshasigmaw; + break; + case PPC::BI__builtin_altivec_crypto_vshasigmad: + ID = Intrinsic::ppc_altivec_crypto_vshasigmad; + break; + } + llvm::Function *F = CGM.getIntrinsic(ID); + return Builder.CreateCall(F, Ops, ""); + } } } |