Add arbitrary integer support to getRegisterType and
authorDuncan Sands <baldrick@free.fr>
Mon, 11 Feb 2008 11:09:23 +0000 (11:09 +0000)
committerDuncan Sands <baldrick@free.fr>
Mon, 11 Feb 2008 11:09:23 +0000 (11:09 +0000)
getNumRegisters.  This is needed for calling functions
with apint parameters or return values.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46956 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetLowering.h

index 947a1d67a8228e1ca47b3e3d4b2a818669accabd..ee3b27246e9ddd1ef77f7bb7db8230dc6a86a51d 100644 (file)
@@ -434,13 +434,18 @@ public:
       (void)getVectorTypeBreakdown(VT, VT1, NumIntermediates, RegisterVT);
       return RegisterVT;
     }
+    if (MVT::isInteger(VT)) {
+      return getRegisterType(getTypeToTransformTo(VT));
+    }
     assert(0 && "Unsupported extended type!");
   }
 
   /// getNumRegisters - Return the number of registers that this ValueType will
   /// eventually require.  This is one for any types promoted to live in larger
   /// registers, but may be more than one for types (like i64) that are split
-  /// into pieces.
+  /// into pieces.  For types like i140, which are first promoted then expanded,
+  /// it is the number of registers needed to hold all the bits of the original
+  /// type.  For an i140 on a 32 bit machine this means 5 registers.
   unsigned getNumRegisters(MVT::ValueType VT) const {
     if (!MVT::isExtendedVT(VT)) {
       assert(VT < array_lengthof(NumRegistersForVT));
@@ -451,6 +456,11 @@ public:
       unsigned NumIntermediates;
       return getVectorTypeBreakdown(VT, VT1, NumIntermediates, VT2);
     }
+    if (MVT::isInteger(VT)) {
+      unsigned BitWidth = MVT::getSizeInBits(VT);
+      unsigned RegWidth = MVT::getSizeInBits(getRegisterType(VT));
+      return (BitWidth + RegWidth - 1) / RegWidth;
+    }
     assert(0 && "Unsupported extended type!");
   }