From 04feb51886805046e8b1af10b7d21bc1ef85f457 Mon Sep 17 00:00:00 2001 From: Duncan Sands Date: Mon, 11 Feb 2008 11:09:23 +0000 Subject: [PATCH] Add arbitrary integer support to getRegisterType and 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 | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/include/llvm/Target/TargetLowering.h b/include/llvm/Target/TargetLowering.h index 947a1d67a82..ee3b27246e9 100644 --- a/include/llvm/Target/TargetLowering.h +++ b/include/llvm/Target/TargetLowering.h @@ -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!"); }