[llvm-commits] [llvm-gcc-4.2] r77469 - /llvm-gcc-4.2/trunk/gcc/config/arm/llvm-arm.cpp

Bob Wilson bob.wilson at apple.com
Wed Jul 29 09:42:28 PDT 2009


Author: bwilson
Date: Wed Jul 29 11:42:27 2009
New Revision: 77469

URL: http://llvm.org/viewvc/llvm-project?rev=77469&view=rev
Log:
Change handling of VLDn/VSTn to match changes to the corresponding
LLVM intrinsics.

Modified:
    llvm-gcc-4.2/trunk/gcc/config/arm/llvm-arm.cpp

Modified: llvm-gcc-4.2/trunk/gcc/config/arm/llvm-arm.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/arm/llvm-arm.cpp?rev=77469&r1=77468&r2=77469&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/arm/llvm-arm.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/config/arm/llvm-arm.cpp Wed Jul 29 11:42:27 2009
@@ -1964,32 +1964,45 @@
     Result = Builder.CreateBitCast(Ops[0], ResultType);
     break;
 
-  case NEON_BUILTIN_vld1:
-  case NEON_BUILTIN_vld2:
-  case NEON_BUILTIN_vld3:
-  case NEON_BUILTIN_vld4: {
-    const VectorType *VTy =
-      GetVldstType(exp, insn_data[icode].operand[0].mode);
+  case NEON_BUILTIN_vld1: {
+    const VectorType *VTy = dyn_cast<const VectorType>(ResultType);
+    assert(VTy && "expected a vector type");
     if (VTy->getElementType()->isFloatingPoint())
-      intID = Intrinsic::arm_neon_vldf;
+      intID = Intrinsic::arm_neon_vld1f;
     else
-      intID = Intrinsic::arm_neon_vldi;
+      intID = Intrinsic::arm_neon_vld1i;
     intFn = Intrinsic::getDeclaration(TheModule, intID, (const Type **)&VTy, 1);
+    Type *VPTy = Context.getPointerTypeUnqual(Type::Int8Ty);
+    Result = Builder.CreateCall(intFn, BitCastToType(Ops[0], VPTy));
+    break;
+  }
 
-    unsigned N = 0;
-    switch (neon_code) {
-    case NEON_BUILTIN_vld1: N = 1; break;
-    case NEON_BUILTIN_vld2: N = 2; break;
-    case NEON_BUILTIN_vld3: N = 3; break;
-    case NEON_BUILTIN_vld4: N = 4; break;
-    default: assert(false);
+  case NEON_BUILTIN_vld2:
+  case NEON_BUILTIN_vld3:
+  case NEON_BUILTIN_vld4: {
+    const StructType *STy = dyn_cast<const StructType>(ResultType);
+    assert(STy && "expected a struct type");
+    const VectorType *VTy = dyn_cast<const VectorType>(STy->getElementType(0));
+    assert(VTy && "expected a vector type");
+    if (VTy->getElementType()->isFloatingPoint()) {
+      switch (neon_code) {
+      case NEON_BUILTIN_vld2: intID = Intrinsic::arm_neon_vld2f; break;
+      case NEON_BUILTIN_vld3: intID = Intrinsic::arm_neon_vld3f; break;
+      case NEON_BUILTIN_vld4: intID = Intrinsic::arm_neon_vld4f; break;
+      default: assert(false);
+      }
+    } else {
+      switch (neon_code) {
+      case NEON_BUILTIN_vld2: intID = Intrinsic::arm_neon_vld2i; break;
+      case NEON_BUILTIN_vld3: intID = Intrinsic::arm_neon_vld3i; break;
+      case NEON_BUILTIN_vld4: intID = Intrinsic::arm_neon_vld4i; break;
+      default: assert(false);
+      }
     }
-
+    intFn = Intrinsic::getDeclaration(TheModule, intID, (const Type **)&VTy, 1);
     Type *VPTy = Context.getPointerTypeUnqual(Type::Int8Ty);
-    Result = Builder.CreateCall2(intFn, BitCastToType(Ops[0], VPTy),
-                                 ConstantInt::get(Type::Int32Ty, N));
-    Type *PtrToWideVec = Context.getPointerTypeUnqual(Result->getType());
-    Builder.CreateStore(Result, BitCastToType(DestLoc->Ptr, PtrToWideVec));
+    Result = Builder.CreateCall(intFn, BitCastToType(Ops[0], VPTy));
+    Builder.CreateStore(Result, DestLoc->Ptr);
     Result = 0;
     break;
   }
@@ -2066,34 +2079,57 @@
     break;
   }
 
-  case NEON_BUILTIN_vst1:
-  case NEON_BUILTIN_vst2:
-  case NEON_BUILTIN_vst3:
-  case NEON_BUILTIN_vst4: {
-    const VectorType *VTy =
-      GetVldstType(exp, insn_data[icode].operand[1].mode);
+  case NEON_BUILTIN_vst1: {
+    const VectorType *VTy = dyn_cast<const VectorType>(Ops[1]->getType());
+    assert(VTy && "expected a vector type");
     if (VTy->getElementType()->isFloatingPoint())
-      intID = Intrinsic::arm_neon_vstf;
+      intID = Intrinsic::arm_neon_vst1f;
     else
-      intID = Intrinsic::arm_neon_vsti;
+      intID = Intrinsic::arm_neon_vst1i;
     intFn = Intrinsic::getDeclaration(TheModule, intID, (const Type **)&VTy, 1);
+    Type *VPTy = Context.getPointerTypeUnqual(Type::Int8Ty);
+    Builder.CreateCall2(intFn, BitCastToType(Ops[0], VPTy), Ops[1]);
+    Result = 0;
+    break;
+  }
 
-    unsigned N = 0;
+  case NEON_BUILTIN_vst2:
+  case NEON_BUILTIN_vst3:
+  case NEON_BUILTIN_vst4: {
+    const StructType *STy = dyn_cast<const StructType>(Ops[1]->getType());
+    assert(STy && "expected a struct type");
+    const VectorType *VTy = dyn_cast<const VectorType>(STy->getElementType(0));
+    assert(VTy && "expected a vector type");
+    if (VTy->getElementType()->isFloatingPoint()) {
+      switch (neon_code) {
+      case NEON_BUILTIN_vst2: intID = Intrinsic::arm_neon_vst2f; break;
+      case NEON_BUILTIN_vst3: intID = Intrinsic::arm_neon_vst3f; break;
+      case NEON_BUILTIN_vst4: intID = Intrinsic::arm_neon_vst4f; break;
+      default: assert(false);
+      }
+    } else {
+      switch (neon_code) {
+      case NEON_BUILTIN_vst2: intID = Intrinsic::arm_neon_vst2i; break;
+      case NEON_BUILTIN_vst3: intID = Intrinsic::arm_neon_vst3i; break;
+      case NEON_BUILTIN_vst4: intID = Intrinsic::arm_neon_vst4i; break;
+      default: assert(false);
+      }
+    }
+    intFn = Intrinsic::getDeclaration(TheModule, intID, (const Type **)&VTy, 1);
+    unsigned NumVecs = 0;
     switch (neon_code) {
-    case NEON_BUILTIN_vst1: N = 1; break;
-    case NEON_BUILTIN_vst2: N = 2; break;
-    case NEON_BUILTIN_vst3: N = 3; break;
-    case NEON_BUILTIN_vst4: N = 4; break;
+    case NEON_BUILTIN_vst2: NumVecs = 2; break;
+    case NEON_BUILTIN_vst3: NumVecs = 3; break;
+    case NEON_BUILTIN_vst4: NumVecs = 4; break;
     default: assert(false);
     }
-
+    std::vector<Value*> Args;
     Type *VPTy = Context.getPointerTypeUnqual(Type::Int8Ty);
-    Value *Tmp = CreateTemporary(VTy);
-    Type *PtrToStruct = Context.getPointerTypeUnqual(Ops[1]->getType());
-    Builder.CreateStore(Ops[1], BitCastToType(Tmp, PtrToStruct));
-    Value *Vec = Builder.CreateLoad(Tmp);
-    Builder.CreateCall3(intFn, BitCastToType(Ops[0], VPTy), Vec,
-                        ConstantInt::get(Type::Int32Ty, N));
+    Args.push_back(BitCastToType(Ops[0], VPTy));
+    for (unsigned n = 0; n < NumVecs; ++n) {
+      Args.push_back(Builder.CreateExtractValue(Ops[1], n));
+    }
+    Builder.CreateCall(intFn, Args.begin(), Args.end());
     Result = 0;
     break;
   }





More information about the llvm-commits mailing list