Chromium Code Reviews| 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; } |