Implement loading and storing of APInt values from memory.
authorReid Spencer <rspencer@reidspencer.com>
Sat, 3 Mar 2007 06:18:03 +0000 (06:18 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Sat, 3 Mar 2007 06:18:03 +0000 (06:18 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34874 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/ExecutionEngine.cpp

index 47266bf5920fb9028a8ca6bea7dd8734d496270b..55793219bcfe5c1fbd2a4f0a3ff5b938a00b7551 100644 (file)
@@ -425,7 +425,7 @@ GenericValue ExecutionEngine::getConstantValue(const Constant *C) {
     else if (BitWidth <= 64)
       Result.Int64Val = (uint64_t )cast<ConstantInt>(C)->getZExtValue();
     else
-      assert(0 && "Integers with > 64-bits not implemented");
+      Result.APIntVal = const_cast<APInt*>(&cast<ConstantInt>(C)->getValue());
     break;
   }
 
@@ -481,8 +481,12 @@ void ExecutionEngine::StoreValueToMemory(GenericValue Val, GenericValue *Ptr,
         Ptr->Untyped[5] = (unsigned char)(TmpVal.Int64Val >> 40);
         Ptr->Untyped[6] = (unsigned char)(TmpVal.Int64Val >> 48);
         Ptr->Untyped[7] = (unsigned char)(TmpVal.Int64Val >> 56);
-      } else
-        assert(0 && "Integer types > 64 bits not supported");
+      } else {
+        uint64_t *Dest = (uint64_t*)Ptr;
+        const uint64_t *Src = Val.APIntVal->getRawData();
+        for (uint32_t i = 0; i < Val.APIntVal->getNumWords(); ++i)
+          Dest[i] = Src[i];
+      }
       break;
     }
 Store4BytesLittleEndian:
@@ -537,8 +541,12 @@ Store4BytesLittleEndian:
         Ptr->Untyped[2] = (unsigned char)(TmpVal.Int64Val >> 40);
         Ptr->Untyped[1] = (unsigned char)(TmpVal.Int64Val >> 48);
         Ptr->Untyped[0] = (unsigned char)(TmpVal.Int64Val >> 56);
-      } else
-        assert(0 && "Integer types > 64 bits not supported");
+      } else {
+        uint64_t *Dest = (uint64_t*)Ptr;
+        const uint64_t *Src = Val.APIntVal->getRawData();
+        for (uint32_t i = 0; i < Val.APIntVal->getNumWords(); ++i)
+          Dest[i] = Src[i];
+      }
       break;
     }
     Store4BytesBigEndian:
@@ -597,7 +605,7 @@ GenericValue ExecutionEngine::LoadValueFromMemory(GenericValue *Ptr,
                           ((uint64_t)Ptr->Untyped[6] << 48) |
                           ((uint64_t)Ptr->Untyped[7] << 56);
       } else
-        assert(0 && "Integer types > 64 bits not supported");
+        Result.APIntVal = new APInt(BitWidth, BitWidth/64, (uint64_t*)Ptr);
       break;
     }
     Load4BytesLittleEndian:
@@ -628,7 +636,7 @@ GenericValue ExecutionEngine::LoadValueFromMemory(GenericValue *Ptr,
   } else {
     switch (Ty->getTypeID()) {
     case Type::IntegerTyID: {
-      unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth();
+      uint32_t BitWidth = cast<IntegerType>(Ty)->getBitWidth();
       if (BitWidth <= 8)
         Result.Int8Val  = Ptr->Untyped[0];
       else if (BitWidth <= 16) {
@@ -649,7 +657,7 @@ GenericValue ExecutionEngine::LoadValueFromMemory(GenericValue *Ptr,
                           ((uint64_t)Ptr->Untyped[1] << 48) |
                           ((uint64_t)Ptr->Untyped[0] << 56);
       } else
-        assert(0 && "Integer types > 64 bits not supported");
+        Result.APIntVal = new APInt(BitWidth, BitWidth/64, (uint64_t*)Ptr);
       break;
     }
     Load4BytesBigEndian: