summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGBuiltin.cpp
diff options
context:
space:
mode:
authorAlbert Gutowski <agutowski@google.com>2016-10-10 18:09:27 +0000
committerAlbert Gutowski <agutowski@google.com>2016-10-10 18:09:27 +0000
commit7216f17653631046264b6741982afe8ee7f5e4d8 (patch)
tree950451da2ca277f5eaf2df6c06185799cb1b16e6 /clang/lib/CodeGen/CGBuiltin.cpp
parent3bfe1093dfba160a9f5beb4dd6d78f6f6a9a7ac2 (diff)
downloadbcm5719-llvm-7216f17653631046264b6741982afe8ee7f5e4d8.tar.gz
bcm5719-llvm-7216f17653631046264b6741982afe8ee7f5e4d8.zip
Implement __emul, __emulu, _mul128 and _umul128 MS intrinsics
Reviewers: rnk, thakis, majnemer, hans Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D25353 llvm-svn: 283785
Diffstat (limited to 'clang/lib/CodeGen/CGBuiltin.cpp')
-rw-r--r--clang/lib/CodeGen/CGBuiltin.cpp29
1 files changed, 21 insertions, 8 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index d05e910f244..5cbb6a2338f 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -7576,16 +7576,24 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
case X86::BI__builtin_ia32_cmpordsd:
return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 7);
+ case X86::BI__emul:
+ case X86::BI__emulu: {
+ llvm::Type *Int64Ty = llvm::IntegerType::get(getLLVMContext(), 64);
+ bool isSigned = (BuiltinID == X86::BI__emul);
+ Value *LHS = Builder.CreateIntCast(Ops[0], Int64Ty, isSigned);
+ Value *RHS = Builder.CreateIntCast(Ops[1], Int64Ty, isSigned);
+ return Builder.CreateMul(LHS, RHS, "", !isSigned, isSigned);
+ }
case X86::BI__mulh:
- case X86::BI__umulh: {
- Value *LHS = EmitScalarExpr(E->getArg(0));
- Value *RHS = EmitScalarExpr(E->getArg(1));
+ case X86::BI__umulh:
+ case X86::BI_mul128:
+ case X86::BI_umul128: {
llvm::Type *ResType = ConvertType(E->getType());
llvm::Type *Int128Ty = llvm::IntegerType::get(getLLVMContext(), 128);
- bool IsSigned = (BuiltinID == X86::BI__mulh);
- LHS = Builder.CreateIntCast(LHS, Int128Ty, IsSigned);
- RHS = Builder.CreateIntCast(RHS, Int128Ty, IsSigned);
+ bool IsSigned = (BuiltinID == X86::BI__mulh || BuiltinID == X86::BI_mul128);
+ Value *LHS = Builder.CreateIntCast(Ops[0], Int128Ty, IsSigned);
+ Value *RHS = Builder.CreateIntCast(Ops[1], Int128Ty, IsSigned);
Value *MulResult, *HigherBits;
if (IsSigned) {
@@ -7595,9 +7603,14 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
MulResult = Builder.CreateNUWMul(LHS, RHS);
HigherBits = Builder.CreateLShr(MulResult, 64);
}
-
HigherBits = Builder.CreateIntCast(HigherBits, ResType, IsSigned);
- return HigherBits;
+
+ if (BuiltinID == X86::BI__mulh || BuiltinID == X86::BI__umulh)
+ return HigherBits;
+
+ Address HighBitsAddress = EmitPointerWithAlignment(E->getArg(2));
+ Builder.CreateStore(HigherBits, HighBitsAddress);
+ return Builder.CreateIntCast(MulResult, ResType, IsSigned);
}
}
}
OpenPOWER on IntegriCloud