[llvm-commits] [127735] simplify this code through the use of Intrinsic::getDeclaration

clattner at apple.com clattner at apple.com
Sun May 27 08:51:12 PDT 2007


Revision: 127735
Author:   clattner
Date:     2007-05-27 08:51:11 -0700 (Sun, 27 May 2007)

Log Message:
-----------
simplify this code through the use of Intrinsic::getDeclaration

Modified Paths:
--------------
     apple-local/branches/llvm/gcc/config/rs6000/llvm-rs6000.cpp

Modified: apple-local/branches/llvm/gcc/config/rs6000/llvm-rs6000.cpp
===================================================================
--- apple-local/branches/llvm/gcc/config/rs6000/llvm-rs6000.cpp	 
2007-05-27 15:33:17 UTC (rev 127734)
+++ apple-local/branches/llvm/gcc/config/rs6000/llvm-rs6000.cpp	 
2007-05-27 15:51:11 UTC (rev 127735)
@@ -34,30 +34,19 @@
  #include "toplev.h"
  }

-/* MergeIntPtrOperand - This merges the int and pointer operands of  
a GCC
- * intrinsic into a single operand for the LLVM intrinsic.  For  
example, this
- * turns LVX(4, p) -> llvm.lvx(gep P, 4).  OPNUM specifies the  
operand number
- * of the integer to contract with its following pointer and NAME  
specifies the
- * name of the resultant intrinsic.
- */
-static void MergeIntPtrOperand(TreeToLLVM *TTL, Constant *&Cache,
-                               unsigned OpNum, const char *Name,
+// MergeIntPtrOperand - This merges the int and pointer operands of  
a GCC
+// intrinsic into a single operand for the LLVM intrinsic.  For  
example, this
+// turns LVX(4, p) -> llvm.lvx(gep P, 4).  OPNUM specifies the  
operand number
+// of the integer to contract with its following pointer and NAME  
specifies the
+// name of the resultant intrinsic.
+static void MergeIntPtrOperand(TreeToLLVM *TTL,
+                               unsigned OpNum, Intrinsic::ID IID,
                                 const Type *ResultType,
                                 std::vector<Value*> &Ops,
                                 LLVMBuilder &Builder, Value *&Result) {
    const Type *VoidPtrTy = PointerType::get(Type::Int8Ty);

-  if (!Cache) {
-    std::vector<const Type*> ArgTys;
-    for (unsigned i = 0, e = Ops.size(); i != e; ++i)
-      ArgTys.push_back(Ops[i]->getType());
-
-    ArgTys.erase(ArgTys.begin() + OpNum);
-    ArgTys[OpNum] = VoidPtrTy;
-    FunctionType *FT = FunctionType::get(ResultType, ArgTys, false);
-    Module *M = Builder.GetInsertBlock()->getParent()->getParent();
-    Cache = M->getOrInsertFunction(Name, FT);
-  }
+  Function *IntFn = Intrinsic::getDeclaration(TheModule, IID);

    Value *Offset = Ops[OpNum];
    Value *Ptr = Ops[OpNum + 1];
@@ -68,7 +57,7 @@

    Ops.erase(Ops.begin() + OpNum);
    Ops[OpNum] = Ptr;
-  Value *V = Builder.CreateCall(Cache, &Ops[0], Ops.size());
+  Value *V = Builder.CreateCall(IntFn, &Ops[0], Ops.size());

    if (V->getType() != Type::VoidTy) {
      V->setName("tmp");
@@ -76,9 +65,8 @@
    }
  }

-/* GetAltivecTypeNumFromType - Given an LLVM type, return a unique  
ID for
- * the type in the range 0-3.
- */
+// GetAltivecTypeNumFromType - Given an LLVM type, return a unique  
ID for
+// the type in the range 0-3.
  static int GetAltivecTypeNumFromType(const Type *Ty) {
    return ((Ty == Type::Int32Ty) ? 0 : \
            ((Ty == Type::Int16Ty) ? 1 : \
@@ -86,20 +74,10 @@
              ((Ty == Type::FloatTy) ? 3 : -1))));
  }

-/* GetAltivecLetterFromType - Given an LLVM type, return the altivec  
letter
- * for the type, e.g. int -> w.
- */
-static char GetAltivecLetterFromType(const Type *Ty) {
-  return ((Ty == Type::Int32Ty) ? 'w' :
-          ((Ty == Type::Int16Ty) ? 'h' :
-           ((Ty == Type::Int8Ty) ? 'b' :
-            ((Ty == Type::FloatTy) ? 'f' : 'x'))));
-}
-
-/* TargetIntrinsicLower - To handle builtins, we want to expand the
- * invocation into normal LLVM code.  If the target can handle the  
builtin, this
- * function should emit the expanded code and return true.
- */
+// TargetIntrinsicLower - To handle builtins, we want to expand the
+//invocation into normal LLVM code.  If the target can handle the  
builtin, this
+//function should emit the expanded code and return true.
+//
  bool TreeToLLVM::TargetIntrinsicLower(tree exp,
                                        unsigned FnCode,
                                        Value *DestLoc,
@@ -137,77 +115,53 @@
    case ALTIVEC_BUILTIN_VXOR:
      Result = Builder.CreateXor(Ops[0], Ops[1], "tmp");
      return true;
-  case ALTIVEC_BUILTIN_LVSL: {
-      static Constant *Cache = NULL;
-      MergeIntPtrOperand(this, Cache, 0, "llvm.ppc.altivec.lvsl",
-                         ResultType, Ops, Builder, Result);
-    }
+  case ALTIVEC_BUILTIN_LVSL:
+    MergeIntPtrOperand(this, 0, Intrinsic::ppc_altivec_lvsl,
+                       ResultType, Ops, Builder, Result);
      return true;
-  case ALTIVEC_BUILTIN_LVSR: {
-      static Constant *Cache = NULL;
-      MergeIntPtrOperand(this, Cache, 0, "llvm.ppc.altivec.lvsr",
-                         ResultType, Ops, Builder, Result);
-    }
+  case ALTIVEC_BUILTIN_LVSR:
+    MergeIntPtrOperand(this, 0, Intrinsic::ppc_altivec_lvsr,
+                       ResultType, Ops, Builder, Result);
      return true;
-  case ALTIVEC_BUILTIN_LVX: {
-      static Constant *Cache = NULL;
-      MergeIntPtrOperand(this, Cache, 0, "llvm.ppc.altivec.lvx",
-                         ResultType, Ops, Builder, Result);
-    }
+  case ALTIVEC_BUILTIN_LVX:
+    MergeIntPtrOperand(this, 0, Intrinsic::ppc_altivec_lvx,
+                       ResultType, Ops, Builder, Result);
      return true;
-  case ALTIVEC_BUILTIN_LVXL: {
-      static Constant *Cache = NULL;
-      MergeIntPtrOperand(this, Cache, 0, "llvm.ppc.altivec.lvxl",
+  case ALTIVEC_BUILTIN_LVXL:
+    MergeIntPtrOperand(this, 0, Intrinsic::ppc_altivec_lvxl,
                           ResultType, Ops, Builder, Result);
-    }
      return true;
-  case ALTIVEC_BUILTIN_LVEBX: {
-      static Constant *Cache = NULL;
-      MergeIntPtrOperand(this, Cache, 0, "llvm.ppc.altivec.lvebx",
-                         ResultType, Ops, Builder, Result);
-    }
+  case ALTIVEC_BUILTIN_LVEBX:
+    MergeIntPtrOperand(this, 0, Intrinsic::ppc_altivec_lvebx,
+                       ResultType, Ops, Builder, Result);
      return true;
-  case ALTIVEC_BUILTIN_LVEHX: {
-      static Constant *Cache = NULL;
-      MergeIntPtrOperand(this, Cache, 0, "llvm.ppc.altivec.lvehx",
-                         ResultType, Ops, Builder, Result);
-    }
+  case ALTIVEC_BUILTIN_LVEHX:
+    MergeIntPtrOperand(this, 0, Intrinsic::ppc_altivec_lvehx,
+                       ResultType, Ops, Builder, Result);
      return true;
    case ALTIVEC_BUILTIN_LVEWX: {
-      static Constant *Cache = NULL;
-      MergeIntPtrOperand(this, Cache, 0, "llvm.ppc.altivec.lvewx",
-                         ResultType, Ops, Builder, Result);
-    }
+    MergeIntPtrOperand(this, 0, Intrinsic::ppc_altivec_lvewx,
+                       ResultType, Ops, Builder, Result);
      return true;
-  case ALTIVEC_BUILTIN_STVX: {
-      static Constant *Cache = NULL;
-      MergeIntPtrOperand(this, Cache, 1, "llvm.ppc.altivec.stvx",
-                         ResultType, Ops, Builder, Result);
-    }
+  case ALTIVEC_BUILTIN_STVX:
+    MergeIntPtrOperand(this, 1, Intrinsic::ppc_altivec_stvx,
+                       ResultType, Ops, Builder, Result);
      return true;
-  case ALTIVEC_BUILTIN_STVEBX: {
-      static Constant *Cache = NULL;
-      MergeIntPtrOperand(this, Cache, 1, "llvm.ppc.altivec.stvebx",
-                         ResultType, Ops, Builder, Result);
-    }
+  case ALTIVEC_BUILTIN_STVEBX:
+    MergeIntPtrOperand(this, 1, Intrinsic::ppc_altivec_stvebx,
+                       ResultType, Ops, Builder, Result);
      return true;
-  case ALTIVEC_BUILTIN_STVEHX: {
-      static Constant *Cache = NULL;
-      MergeIntPtrOperand(this, Cache, 1, "llvm.ppc.altivec.stvehx",
-                         ResultType, Ops, Builder, Result);
-    }
+  case ALTIVEC_BUILTIN_STVEHX:
+    MergeIntPtrOperand(this, 1, Intrinsic::ppc_altivec_stvehx,
+                       ResultType, Ops, Builder, Result);
      return true;
    case ALTIVEC_BUILTIN_STVEWX: {
-      static Constant *Cache = NULL;
-      MergeIntPtrOperand(this, Cache, 1, "llvm.ppc.altivec.stvewx",
-                         ResultType, Ops, Builder, Result);
-    }
+    MergeIntPtrOperand(this, 1, Intrinsic::ppc_altivec_stvewx,
+                       ResultType, Ops, Builder, Result);
      return true;
-  case ALTIVEC_BUILTIN_STVXL: {
-      static Constant *Cache = NULL;
-      MergeIntPtrOperand(this, Cache, 1, "llvm.ppc.altivec.stvxl",
-                         ResultType, Ops, Builder, Result);
-    }
+  case ALTIVEC_BUILTIN_STVXL:
+    MergeIntPtrOperand(this, 1, Intrinsic::ppc_altivec_stvxl,
+                       ResultType, Ops, Builder, Result);
      return true;
    case ALTIVEC_BUILTIN_VSPLTISB:
      if (Constant *Elt = dyn_cast<ConstantInt>(Ops[0])) {
@@ -327,7 +281,7 @@
      Result = BuildVectorShuffle(Ops[0], Ops[1], 2, 6, 3, 7);
      return true;
    case ALTIVEC_BUILTIN_ABS_V4SF: {
-    /* and out sign bits */
+    // and out sign bits
      VectorType *v4i32 = VectorType::get(Type::Int32Ty, 4);
      Ops[0] = Builder.CreateBitCast(Ops[0], v4i32, "tmp");
      Constant *C = ConstantInt::get(Type::Int32Ty, 0x7FFFFFFF);
@@ -338,44 +292,45 @@
    }
    case ALTIVEC_BUILTIN_ABS_V4SI:
    case ALTIVEC_BUILTIN_ABS_V8HI:
-  case ALTIVEC_BUILTIN_ABS_V16QI: { /* iabs(x) -> smax(x, 0-x) */
+  case ALTIVEC_BUILTIN_ABS_V16QI: { // iabs(x) -> smax(x, 0-x)
      Result = Builder.CreateNeg(Ops[0], "tmp");
-    /* get the right smax intrinsic. */
-    static Constant *smax[3];
+    // get the right smax intrinsic.
+    static const unsigned smax_iid[3] = {
+      Intrinsic::ppc_altivec_vmaxsw,
+      Intrinsic::ppc_altivec_vmaxsh,
+      Intrinsic::ppc_altivec_vmaxsb
+    };
      const VectorType *PTy = cast<VectorType>(ResultType);
      unsigned N = GetAltivecTypeNumFromType(PTy->getElementType());
-    if (smax[N] == 0) {
-      Module *M = Builder.GetInsertBlock()->getParent()->getParent();
-      smax[N] = M->getOrInsertFunction(std::string 
("llvm.ppc.altivec.vmaxs")+
-                         GetAltivecLetterFromType(PTy->getElementType 
()),
-                                      ResultType, ResultType,  
ResultType, NULL);
-    }
-    Result = Builder.CreateCall(smax[N], Ops[0], Result, "tmp");
+    Function *smax = Intrinsic::getDeclaration(TheModule, smax_iid[N]);
+    Result = Builder.CreateCall(smax, Ops[0], Result, "tmp");
      return true;
    }
    case ALTIVEC_BUILTIN_ABSS_V4SI:
    case ALTIVEC_BUILTIN_ABSS_V8HI:
-  case ALTIVEC_BUILTIN_ABSS_V16QI: { /* iabss(x) -> smax(x, satsub 
(0,x)) */
+  case ALTIVEC_BUILTIN_ABSS_V16QI: { // iabss(x) -> smax(x, satsub 
(0,x))
+    // get the right smax/subs intrinsics.
+    static const unsigned smax_iid[3] = {
+      Intrinsic::ppc_altivec_vmaxsw,
+      Intrinsic::ppc_altivec_vmaxsh,
+      Intrinsic::ppc_altivec_vmaxsb
+    };
+    static const unsigned subss_iid[3] = {
+      Intrinsic::ppc_altivec_vsubsws,
+      Intrinsic::ppc_altivec_vsubshs,
+      Intrinsic::ppc_altivec_vsubsbs
+    };
+
      static Constant *sxs[3], *smax[3];
-    /* get the right satsub intrinsic. */
+    // get the right satsub intrinsic.
      const VectorType *PTy = cast<VectorType>(ResultType);
      unsigned N = GetAltivecTypeNumFromType(PTy->getElementType());
-    if (sxs[N] == 0) {
-      Module *M = Builder.GetInsertBlock()->getParent()->getParent();
-      sxs[N] = M->getOrInsertFunction(std::string 
("llvm.ppc.altivec.vsubs")+
-                     GetAltivecLetterFromType(PTy->getElementType()) 
+"s",
-                                      ResultType, ResultType,  
ResultType, NULL);
-    }
-    Result = Constant::getNullValue(ResultType);
-    Result = Builder.CreateCall(sxs[N], Result, Ops[0], "tmp");
-    /* get the right smax intrinsic. */
-    if (smax[N] == 0) {
-      Module *M = Builder.GetInsertBlock()->getParent()->getParent();
-      smax[N] = M->getOrInsertFunction(std::string 
("llvm.ppc.altivec.vmaxs")+
-                         GetAltivecLetterFromType(PTy->getElementType 
()),
-                                      ResultType, ResultType,  
ResultType, NULL);
-    }
-    Result = Builder.CreateCall(smax[N], Ops[0], Result, "tmp");
+    Function *smax = Intrinsic::getDeclaration(TheModule, smax_iid[N]);
+    Function *subss = Intrinsic::getDeclaration(TheModule, subss_iid 
[N]);
+
+    Result = Builder.CreateCall(subss, Constant::getNullValue 
(ResultType),
+                                Ops[0], "tmp");
+    Result = Builder.CreateCall(smax, Ops[0], Result, "tmp");
      return true;
    }
    }





More information about the llvm-commits mailing list