From: Simon Atanasyan Date: Mon, 16 Jul 2012 18:52:02 +0000 (+0000) Subject: MIPS: Implement __builtin_mips_shll_qb builtin function overloading. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d7bad053b048494db5f83b512a5169d01be96f81;p=clang MIPS: Implement __builtin_mips_shll_qb builtin function overloading. This function has two versions. The first one is used for a register operand. The second one is used for an immediate number. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160308 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp index dd04a464e1..174e2cbdf5 100644 --- a/lib/CodeGen/CGBuiltin.cpp +++ b/lib/CodeGen/CGBuiltin.cpp @@ -1378,6 +1378,11 @@ Value *CodeGenFunction::EmitTargetBuiltinExpr(unsigned BuiltinID, case llvm::Triple::ppc: case llvm::Triple::ppc64: return EmitPPCBuiltinExpr(BuiltinID, E); + case llvm::Triple::mips: + case llvm::Triple::mipsel: + case llvm::Triple::mips64: + case llvm::Triple::mips64el: + return EmitMipsBuiltinExpr(BuiltinID, E); default: return 0; } @@ -2563,3 +2568,27 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID, } } } + +Value *CodeGenFunction::EmitMipsBuiltinExpr(unsigned BuiltinID, + const CallExpr *E) { + SmallVector Ops; + + for (unsigned i = 0, e = E->getNumArgs(); i != e; i++) + Ops.push_back(EmitScalarExpr(E->getArg(i))); + + Intrinsic::ID ID = Intrinsic::not_intrinsic; + + switch (BuiltinID) { + default: return 0; + case Mips::BI__builtin_mips_shll_qb: + llvm::APSInt Value; + if (E->getArg(1)->isIntegerConstantExpr(Value, getContext())) + ID = Intrinsic::mips_shll_qb; + else + ID = Intrinsic::mips_shll_qb_v; + break; + } + + llvm::Function *F = CGM.getIntrinsic(ID); + return Builder.CreateCall(F, Ops, ""); +} diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index b737a9ed7a..82423f5c30 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -2276,6 +2276,7 @@ public: llvm::Value *BuildVector(ArrayRef Ops); llvm::Value *EmitX86BuiltinExpr(unsigned BuiltinID, const CallExpr *E); llvm::Value *EmitPPCBuiltinExpr(unsigned BuiltinID, const CallExpr *E); + llvm::Value *EmitMipsBuiltinExpr(unsigned BuiltinID, const CallExpr *E); llvm::Value *EmitObjCProtocolExpr(const ObjCProtocolExpr *E); llvm::Value *EmitObjCStringLiteral(const ObjCStringLiteral *E); diff --git a/test/CodeGen/builtins-mips-ovld.c b/test/CodeGen/builtins-mips-ovld.c new file mode 100644 index 0000000000..b3460abd90 --- /dev/null +++ b/test/CodeGen/builtins-mips-ovld.c @@ -0,0 +1,13 @@ +// REQUIRES: mips-registered-target +// RUN: %clang_cc1 -triple mips-unknown-linux-gnu -emit-llvm -o - %s | FileCheck %s + +typedef signed char v4i8 __attribute__ ((vector_size(4))); + +void foo() { + v4i8 a = {1, 2, 3, 4}; + int shift = 1; +// CHECK: {{%.*}} = call <4 x i8> @llvm.mips.shll.qb(<4 x i8> {{%.*}}, i32 1) + v4i8 r1 = __builtin_mips_shll_qb(a, 1); +// CHECK: {{%.*}} = call <4 x i8> @llvm.mips.shll.qb.v(<4 x i8> {{%.*}}, i32 {{%.*}}) + v4i8 r2 = __builtin_mips_shll_qb(a, shift); +}