diff options
author | Albert Gutowski <agutowski@google.com> | 2016-10-10 18:09:27 +0000 |
---|---|---|
committer | Albert Gutowski <agutowski@google.com> | 2016-10-10 18:09:27 +0000 |
commit | 7216f17653631046264b6741982afe8ee7f5e4d8 (patch) | |
tree | 950451da2ca277f5eaf2df6c06185799cb1b16e6 /clang/lib/CodeGen/CGBuiltin.cpp | |
parent | 3bfe1093dfba160a9f5beb4dd6d78f6f6a9a7ac2 (diff) | |
download | bcm5719-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.cpp | 29 |
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); } } } |