Add deSignExtendTo32() to deInt32.h
authorPyry Haulos <phaulos@google.com>
Fri, 22 May 2015 23:57:13 +0000 (16:57 -0700)
committerPyry Haulos <phaulos@google.com>
Thu, 28 May 2015 21:46:11 +0000 (14:46 -0700)
Change-Id: I1e70245b92b044ba136b40be7ef0694c0ae1c18b

framework/delibs/debase/deInt32.h
framework/delibs/debase/deInt32Test.c

index d60b62e80aa299698827fa54a3e2449369be86f4..04231837148ca6f35c80f0383f20e431805a2d96 100644 (file)
@@ -532,6 +532,23 @@ DE_INLINE deInt32 deIntMinValue32 (int numBits)
        }
 }
 
+DE_INLINE deInt32 deSignExtendTo32 (deInt32 value, int numBits)
+{
+       DE_ASSERT(deInRange32(numBits, 1, 32));
+
+       if (numBits < 32)
+       {
+               deBool          signSet         = ((deUint32)value & (1u<<(numBits-1))) != 0;
+               deUint32        signMask        = deBitMask32(numBits, 32-numBits);
+
+               DE_ASSERT(((deUint32)value & signMask) == 0u);
+
+               return (deInt32)((deUint32)value | (signSet ? signMask : 0u));
+       }
+       else
+               return value;
+}
+
 DE_END_EXTERN_C
 
 #endif /* _DEINT32_H */
index 9fe0de32b58947d0171335d8975b0488b4f0879e..6603aec3ad3fcab7a9a6bb2ca8ee8bae09ce5bd9 100644 (file)
@@ -155,6 +155,19 @@ void deInt32_selfTest (void)
        DE_TEST_ASSERT(deIntMinValue32(1) == -1);
        DE_TEST_ASSERT(deIntMinValue32(2) == -2);
        DE_TEST_ASSERT(deIntMinValue32(32) == -0x7FFFFFFF - 1);
+
+       DE_TEST_ASSERT(deSignExtendTo32((int)0x0, 1) == 0);
+       DE_TEST_ASSERT(deSignExtendTo32((int)0x1, 1) == (int)0xFFFFFFFF);
+       DE_TEST_ASSERT(deSignExtendTo32((int)0x3, 3) == 3);
+       DE_TEST_ASSERT(deSignExtendTo32((int)0x6, 3) == (int)0xFFFFFFFE);
+       DE_TEST_ASSERT(deSignExtendTo32((int)0x3, 4) == 3);
+       DE_TEST_ASSERT(deSignExtendTo32((int)0xC, 4) == (int)0xFFFFFFFC);
+       DE_TEST_ASSERT(deSignExtendTo32((int)0x7FC3, 16) == (int)0x7FC3);
+       DE_TEST_ASSERT(deSignExtendTo32((int)0x84A0, 16) == (int)0xFFFF84A0);
+       DE_TEST_ASSERT(deSignExtendTo32((int)0xFFC3, 17) == (int)0xFFC3);
+       DE_TEST_ASSERT(deSignExtendTo32((int)0x184A0, 17) == (int)0xFFFF84A0);
+       DE_TEST_ASSERT(deSignExtendTo32((int)0x7A016601, 32) == (int)0x7A016601);
+       DE_TEST_ASSERT(deSignExtendTo32((int)0x8A016601, 32) == (int)0x8A016601);
 }
 
 DE_END_EXTERN_C