Index: crosstest/test_cast.cpp |
diff --git a/crosstest/test_cast.cpp b/crosstest/test_cast.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..838fb6f3eb9b21bb9e5c731bcb1f6a36f3472ffa |
--- /dev/null |
+++ b/crosstest/test_cast.cpp |
@@ -0,0 +1,172 @@ |
+#include <stdint.h> |
+#include "test_cast.h" |
+ |
+template <typename FromType, typename ToType> |
+class Caster { |
+public: |
+ static ToType __attribute__((noinline)) cast(FromType a) { return (ToType) a; } |
+}; |
JF
2014/05/01 00:16:55
Couldn't this avoid the class, and just be a templ
Jim Stichnoth
2014/05/05 07:03:55
Done.
|
+ |
+template <typename ToType> |
+class CasterCaster { |
+ static ToType f(bool a) { return Caster<bool, ToType>::cast(a); } |
+ static ToType f(int8_t a) { return Caster<int8_t, ToType>::cast(a); } |
+ static ToType f(uint8_t a) { return Caster<uint8_t, ToType>::cast(a); } |
+ static ToType f(int16_t a) { return Caster<int16_t, ToType>::cast(a); } |
+ static ToType f(uint16_t a) { return Caster<uint16_t, ToType>::cast(a); } |
+ static ToType f(int32_t a) { return Caster<int32_t, ToType>::cast(a); } |
+ static ToType f(uint32_t a) { return Caster<uint32_t, ToType>::cast(a); } |
+ static ToType f(int64_t a) { return Caster<int64_t, ToType>::cast(a); } |
+ static ToType f(uint64_t a) { return Caster<uint64_t, ToType>::cast(a); } |
+}; |
+ |
+template class CasterCaster<bool>; |
+template class CasterCaster<int8_t>; |
+template class CasterCaster<uint8_t>; |
+template class CasterCaster<int16_t>; |
+template class CasterCaster<uint16_t>; |
+template class CasterCaster<int32_t>; |
+template class CasterCaster<uint32_t>; |
+template class CasterCaster<int64_t>; |
+template class CasterCaster<uint64_t>; |
+ |
+#if 0 |
+// The bitcode for *ToUi1() needs to be hand-modified to change the |
+// icmp back to trunc or fptoui. |
JF
2014/05/01 00:16:55
TODO
Jim Stichnoth
2014/05/05 07:03:55
Actually it looks like I was still in the middle o
|
+bool castUi64ToUi1(uint64_t a) { return (bool) a; } |
+bool castSi64ToUi1(int64_t a) { return (bool) a; } |
+bool castUi32ToUi1(uint32_t a) { return (bool) a; } |
+bool castSi32ToUi1(int32_t a) { return (bool) a; } |
+bool castUi16ToUi1(unsigned short a) { return (bool) a; } |
+bool castSi16ToUi1(short a) { return (bool) a; } |
+bool castUi8ToUi1(unsigned char a) { return (bool) a; } |
+bool castSi8ToUi1(signed char a) { return (bool) a; } |
+bool castUi1ToUi1(bool a) { return (bool) a; } |
+bool castF64ToUi1(double a) { return (bool) a; } |
+bool castF32ToUi1(float a) { return (bool) a; } |
+#endif |
+ |
+signed char castUi64ToSi8(uint64_t a) { return (signed char)a; } |
+signed char castSi64ToSi8(int64_t a) { return (signed char)a; } |
+signed char castUi32ToSi8(uint32_t a) { return (signed char)a; } |
+signed char castSi32ToSi8(int32_t a) { return (signed char)a; } |
+signed char castUi16ToSi8(unsigned short a) { return (signed char)a; } |
+signed char castSi16ToSi8(short a) { return (signed char)a; } |
+signed char castUi8ToSi8(unsigned char a) { return (signed char)a; } |
+signed char castSi8ToSi8(signed char a) { return (signed char)a; } |
+signed char castUi1ToSi8(bool a) { return (signed char)a; } |
+signed char castF64ToSi8(double a) { return (signed char)a; } |
+signed char castF32ToSi8(float a) { return (signed char)a; } |
+ |
+unsigned char castUi64ToUi8(uint64_t a) { return (unsigned char)a; } |
+unsigned char castSi64ToUi8(int64_t a) { return (unsigned char)a; } |
+unsigned char castUi32ToUi8(uint32_t a) { return (unsigned char)a; } |
+unsigned char castSi32ToUi8(int32_t a) { return (unsigned char)a; } |
+unsigned char castUi16ToUi8(unsigned short a) { return (unsigned char)a; } |
+unsigned char castSi16ToUi8(short a) { return (unsigned char)a; } |
+unsigned char castUi8ToUi8(unsigned char a) { return (unsigned char)a; } |
+unsigned char castSi8ToUi8(signed char a) { return (unsigned char)a; } |
+unsigned char castUi1ToUi8(bool a) { return (unsigned char)a; } |
+unsigned char castF64ToUi8(double a) { return (unsigned char)a; } |
+unsigned char castF32ToUi8(float a) { return (unsigned char)a; } |
+ |
+short castUi64ToSi16(uint64_t a) { return (short)a; } |
+short castSi64ToSi16(int64_t a) { return (short)a; } |
+short castUi32ToSi16(uint32_t a) { return (short)a; } |
+short castSi32ToSi16(int32_t a) { return (short)a; } |
+short castUi16ToSi16(unsigned short a) { return (short)a; } |
+short castSi16ToSi16(short a) { return (short)a; } |
+short castUi8ToSi16(unsigned char a) { return (short)a; } |
+short castSi8ToSi16(signed char a) { return (short)a; } |
+short castUi1ToSi16(bool a) { return (short)a; } |
+short castF64ToSi16(double a) { return (short)a; } |
+short castF32ToSi16(float a) { return (short)a; } |
+ |
+unsigned short castUi64ToUi16(uint64_t a) { return (unsigned short)a; } |
+unsigned short castSi64ToUi16(int64_t a) { return (unsigned short)a; } |
+unsigned short castUi32ToUi16(uint32_t a) { return (unsigned short)a; } |
+unsigned short castSi32ToUi16(int32_t a) { return (unsigned short)a; } |
+unsigned short castUi16ToUi16(unsigned short a) { return (unsigned short)a; } |
+unsigned short castSi16ToUi16(short a) { return (unsigned short)a; } |
+unsigned short castUi8ToUi16(unsigned char a) { return (unsigned short)a; } |
+unsigned short castSi8ToUi16(signed char a) { return (unsigned short)a; } |
+unsigned short castUi1ToUi16(bool a) { return (unsigned short)a; } |
+unsigned short castF64ToUi16(double a) { return (unsigned short)a; } |
+unsigned short castF32ToUi16(float a) { return (unsigned short)a; } |
+ |
+int32_t castUi64ToSi32(uint64_t a) { return (int32_t)a; } |
+int32_t castSi64ToSi32(int64_t a) { return (int32_t)a; } |
+int32_t castUi32ToSi32(uint32_t a) { return (int32_t)a; } |
+int32_t castSi32ToSi32(int32_t a) { return (int32_t)a; } |
+int32_t castUi16ToSi32(unsigned short a) { return (int32_t)a; } |
+int32_t castSi16ToSi32(short a) { return (int32_t)a; } |
+int32_t castUi8ToSi32(unsigned char a) { return (int32_t)a; } |
+int32_t castSi8ToSi32(signed char a) { return (int32_t)a; } |
+int32_t castUi1ToSi32(bool a) { return (int32_t)a; } |
+int32_t castF64ToSi32(double a) { return (int32_t)a; } |
+int32_t castF32ToSi32(float a) { return (int32_t)a; } |
+ |
+uint32_t castUi64ToUi32(uint64_t a) { return (uint32_t)a; } |
+uint32_t castSi64ToUi32(int64_t a) { return (uint32_t)a; } |
+uint32_t castUi32ToUi32(uint32_t a) { return (uint32_t)a; } |
+uint32_t castSi32ToUi32(int32_t a) { return (uint32_t)a; } |
+uint32_t castUi16ToUi32(unsigned short a) { return (uint32_t)a; } |
+uint32_t castSi16ToUi32(short a) { return (uint32_t)a; } |
+uint32_t castUi8ToUi32(unsigned char a) { return (uint32_t)a; } |
+uint32_t castSi8ToUi32(signed char a) { return (uint32_t)a; } |
+uint32_t castUi1ToUi32(bool a) { return (uint32_t)a; } |
+uint32_t castF64ToUi32(double a) { return (uint32_t)a; } |
+uint32_t castF32ToUi32(float a) { return (uint32_t)a; } |
+ |
+int64_t castUi64ToSi64(uint64_t a) { return (int64_t)a; } |
+int64_t castSi64ToSi64(int64_t a) { return (int64_t)a; } |
+int64_t castUi32ToSi64(uint32_t a) { return (int64_t)a; } |
+int64_t castSi32ToSi64(int32_t a) { return (int64_t)a; } |
+int64_t castUi16ToSi64(unsigned short a) { return (int64_t)a; } |
+int64_t castSi16ToSi64(short a) { return (int64_t)a; } |
+int64_t castUi8ToSi64(unsigned char a) { return (int64_t)a; } |
+int64_t castSi8ToSi64(signed char a) { return (int64_t)a; } |
+int64_t castUi1ToSi64(bool a) { return (int64_t)a; } |
+int64_t castF64ToSi64(double a) { return (int64_t)a; } |
+int64_t castF32ToSi64(float a) { return (int64_t)a; } |
+ |
+uint64_t castUi64ToUi64(uint64_t a) { return (uint64_t)a; } |
+uint64_t castSi64ToUi64(int64_t a) { return (uint64_t)a; } |
+uint64_t castUi32ToUi64(uint32_t a) { return (uint64_t)a; } |
+uint64_t castSi32ToUi64(int32_t a) { return (uint64_t)a; } |
+uint64_t castUi16ToUi64(unsigned short a) { return (uint64_t)a; } |
+uint64_t castSi16ToUi64(short a) { return (uint64_t)a; } |
+uint64_t castUi8ToUi64(unsigned char a) { return (uint64_t)a; } |
+uint64_t castSi8ToUi64(signed char a) { return (uint64_t)a; } |
+uint64_t castUi1ToUi64(bool a) { return (uint64_t)a; } |
+uint64_t castF64ToUi64(double a) { return (uint64_t)a; } |
+uint64_t castF32ToUi64(float a) { return (uint64_t)a; } |
+ |
+float castUi64ToF32(uint64_t a) { return (float)a; } |
+float castSi64ToF32(int64_t a) { return (float)a; } |
+float castUi32ToF32(uint32_t a) { return (float)a; } |
+float castSi32ToF32(int32_t a) { return (float)a; } |
+float castUi16ToF32(unsigned short a) { return (float)a; } |
+float castSi16ToF32(short a) { return (float)a; } |
+float castUi8ToF32(unsigned char a) { return (float)a; } |
+float castSi8ToF32(signed char a) { return (float)a; } |
+float castUi1ToF32(bool a) { return (float)a; } |
+float castF64ToF32(double a) { return (float)a; } |
+float castF32ToF32(float a) { return (float)a; } |
+ |
+double castUi64ToF64(uint64_t a) { return (double)a; } |
+double castSi64ToF64(int64_t a) { return (double)a; } |
+double castUi32ToF64(uint32_t a) { return (double)a; } |
+double castSi32ToF64(int32_t a) { return (double)a; } |
+double castUi16ToF64(unsigned short a) { return (double)a; } |
+double castSi16ToF64(short a) { return (double)a; } |
+double castUi8ToF64(unsigned char a) { return (double)a; } |
+double castSi8ToF64(signed char a) { return (double)a; } |
+double castUi1ToF64(bool a) { return (double)a; } |
+double castF64ToF64(double a) { return (double)a; } |
+double castF32ToF64(float a) { return (double)a; } |
+ |
+uint32_t castbits_F32ToUi32(float a) { return *(uint32_t *)&a; } |
+float castbits_Ui32ToF32(uint32_t a) { return *(float *)&a; } |
+uint64_t castbits_F64ToUi64(double a) { return *(uint64_t *)&a; } |
+double castbits_Ui64ToF64(uint64_t a) { return *(double *)&a; } |