[cfe-commits] r160308 - in /cfe/trunk: lib/CodeGen/CGBuiltin.cpp lib/CodeGen/CodeGenFunction.h test/CodeGen/builtins-mips-ovld.c

Benjamin Kramer benny.kra at gmail.com
Mon Jul 16 12:01:22 PDT 2012


On 16.07.2012, at 20:52, Simon Atanasyan <satanasyan at mips.com> wrote:

> Author: atanasyan
> Date: Mon Jul 16 13:52:02 2012
> New Revision: 160308
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=160308&view=rev
> Log:
> 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.

Would it make sense to do this as an optimization in the backend instead? The IR optimizers can infer constants in a lot more cases, I assume the constant version of the builtin only differs in performance/code size?

- Ben
> 
> Added:
>    cfe/trunk/test/CodeGen/builtins-mips-ovld.c
> Modified:
>    cfe/trunk/lib/CodeGen/CGBuiltin.cpp
>    cfe/trunk/lib/CodeGen/CodeGenFunction.h
> 
> Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=160308&r1=160307&r2=160308&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Mon Jul 16 13:52:02 2012
> @@ -1378,6 +1378,11 @@
>   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::EmitMipsBuiltinExpr(unsigned BuiltinID,
> +                                            const CallExpr *E) {
> +  SmallVector<Value*, 4> 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, "");
> +}
> 
> Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=160308&r1=160307&r2=160308&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Mon Jul 16 13:52:02 2012
> @@ -2276,6 +2276,7 @@
>   llvm::Value *BuildVector(ArrayRef<llvm::Value*> 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);
> 
> Added: cfe/trunk/test/CodeGen/builtins-mips-ovld.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/builtins-mips-ovld.c?rev=160308&view=auto
> ==============================================================================
> --- cfe/trunk/test/CodeGen/builtins-mips-ovld.c (added)
> +++ cfe/trunk/test/CodeGen/builtins-mips-ovld.c Mon Jul 16 13:52:02 2012
> @@ -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);
> +}
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits





More information about the cfe-commits mailing list