Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 #include <stdint.h> | |
| 2 #include "test_cast.h" | |
| 3 | |
| 4 template <typename FromType, typename ToType> | |
| 5 class Caster { | |
| 6 public: | |
| 7 static ToType __attribute__((noinline)) cast(FromType a) { return (ToType) a; } | |
| 8 }; | |
|
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.
| |
| 9 | |
| 10 template <typename ToType> | |
| 11 class CasterCaster { | |
| 12 static ToType f(bool a) { return Caster<bool, ToType>::cast(a); } | |
| 13 static ToType f(int8_t a) { return Caster<int8_t, ToType>::cast(a); } | |
| 14 static ToType f(uint8_t a) { return Caster<uint8_t, ToType>::cast(a); } | |
| 15 static ToType f(int16_t a) { return Caster<int16_t, ToType>::cast(a); } | |
| 16 static ToType f(uint16_t a) { return Caster<uint16_t, ToType>::cast(a); } | |
| 17 static ToType f(int32_t a) { return Caster<int32_t, ToType>::cast(a); } | |
| 18 static ToType f(uint32_t a) { return Caster<uint32_t, ToType>::cast(a); } | |
| 19 static ToType f(int64_t a) { return Caster<int64_t, ToType>::cast(a); } | |
| 20 static ToType f(uint64_t a) { return Caster<uint64_t, ToType>::cast(a); } | |
| 21 }; | |
| 22 | |
| 23 template class CasterCaster<bool>; | |
| 24 template class CasterCaster<int8_t>; | |
| 25 template class CasterCaster<uint8_t>; | |
| 26 template class CasterCaster<int16_t>; | |
| 27 template class CasterCaster<uint16_t>; | |
| 28 template class CasterCaster<int32_t>; | |
| 29 template class CasterCaster<uint32_t>; | |
| 30 template class CasterCaster<int64_t>; | |
| 31 template class CasterCaster<uint64_t>; | |
| 32 | |
| 33 #if 0 | |
| 34 // The bitcode for *ToUi1() needs to be hand-modified to change the | |
| 35 // 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
| |
| 36 bool castUi64ToUi1(uint64_t a) { return (bool) a; } | |
| 37 bool castSi64ToUi1(int64_t a) { return (bool) a; } | |
| 38 bool castUi32ToUi1(uint32_t a) { return (bool) a; } | |
| 39 bool castSi32ToUi1(int32_t a) { return (bool) a; } | |
| 40 bool castUi16ToUi1(unsigned short a) { return (bool) a; } | |
| 41 bool castSi16ToUi1(short a) { return (bool) a; } | |
| 42 bool castUi8ToUi1(unsigned char a) { return (bool) a; } | |
| 43 bool castSi8ToUi1(signed char a) { return (bool) a; } | |
| 44 bool castUi1ToUi1(bool a) { return (bool) a; } | |
| 45 bool castF64ToUi1(double a) { return (bool) a; } | |
| 46 bool castF32ToUi1(float a) { return (bool) a; } | |
| 47 #endif | |
| 48 | |
| 49 signed char castUi64ToSi8(uint64_t a) { return (signed char)a; } | |
| 50 signed char castSi64ToSi8(int64_t a) { return (signed char)a; } | |
| 51 signed char castUi32ToSi8(uint32_t a) { return (signed char)a; } | |
| 52 signed char castSi32ToSi8(int32_t a) { return (signed char)a; } | |
| 53 signed char castUi16ToSi8(unsigned short a) { return (signed char)a; } | |
| 54 signed char castSi16ToSi8(short a) { return (signed char)a; } | |
| 55 signed char castUi8ToSi8(unsigned char a) { return (signed char)a; } | |
| 56 signed char castSi8ToSi8(signed char a) { return (signed char)a; } | |
| 57 signed char castUi1ToSi8(bool a) { return (signed char)a; } | |
| 58 signed char castF64ToSi8(double a) { return (signed char)a; } | |
| 59 signed char castF32ToSi8(float a) { return (signed char)a; } | |
| 60 | |
| 61 unsigned char castUi64ToUi8(uint64_t a) { return (unsigned char)a; } | |
| 62 unsigned char castSi64ToUi8(int64_t a) { return (unsigned char)a; } | |
| 63 unsigned char castUi32ToUi8(uint32_t a) { return (unsigned char)a; } | |
| 64 unsigned char castSi32ToUi8(int32_t a) { return (unsigned char)a; } | |
| 65 unsigned char castUi16ToUi8(unsigned short a) { return (unsigned char)a; } | |
| 66 unsigned char castSi16ToUi8(short a) { return (unsigned char)a; } | |
| 67 unsigned char castUi8ToUi8(unsigned char a) { return (unsigned char)a; } | |
| 68 unsigned char castSi8ToUi8(signed char a) { return (unsigned char)a; } | |
| 69 unsigned char castUi1ToUi8(bool a) { return (unsigned char)a; } | |
| 70 unsigned char castF64ToUi8(double a) { return (unsigned char)a; } | |
| 71 unsigned char castF32ToUi8(float a) { return (unsigned char)a; } | |
| 72 | |
| 73 short castUi64ToSi16(uint64_t a) { return (short)a; } | |
| 74 short castSi64ToSi16(int64_t a) { return (short)a; } | |
| 75 short castUi32ToSi16(uint32_t a) { return (short)a; } | |
| 76 short castSi32ToSi16(int32_t a) { return (short)a; } | |
| 77 short castUi16ToSi16(unsigned short a) { return (short)a; } | |
| 78 short castSi16ToSi16(short a) { return (short)a; } | |
| 79 short castUi8ToSi16(unsigned char a) { return (short)a; } | |
| 80 short castSi8ToSi16(signed char a) { return (short)a; } | |
| 81 short castUi1ToSi16(bool a) { return (short)a; } | |
| 82 short castF64ToSi16(double a) { return (short)a; } | |
| 83 short castF32ToSi16(float a) { return (short)a; } | |
| 84 | |
| 85 unsigned short castUi64ToUi16(uint64_t a) { return (unsigned short)a; } | |
| 86 unsigned short castSi64ToUi16(int64_t a) { return (unsigned short)a; } | |
| 87 unsigned short castUi32ToUi16(uint32_t a) { return (unsigned short)a; } | |
| 88 unsigned short castSi32ToUi16(int32_t a) { return (unsigned short)a; } | |
| 89 unsigned short castUi16ToUi16(unsigned short a) { return (unsigned short)a; } | |
| 90 unsigned short castSi16ToUi16(short a) { return (unsigned short)a; } | |
| 91 unsigned short castUi8ToUi16(unsigned char a) { return (unsigned short)a; } | |
| 92 unsigned short castSi8ToUi16(signed char a) { return (unsigned short)a; } | |
| 93 unsigned short castUi1ToUi16(bool a) { return (unsigned short)a; } | |
| 94 unsigned short castF64ToUi16(double a) { return (unsigned short)a; } | |
| 95 unsigned short castF32ToUi16(float a) { return (unsigned short)a; } | |
| 96 | |
| 97 int32_t castUi64ToSi32(uint64_t a) { return (int32_t)a; } | |
| 98 int32_t castSi64ToSi32(int64_t a) { return (int32_t)a; } | |
| 99 int32_t castUi32ToSi32(uint32_t a) { return (int32_t)a; } | |
| 100 int32_t castSi32ToSi32(int32_t a) { return (int32_t)a; } | |
| 101 int32_t castUi16ToSi32(unsigned short a) { return (int32_t)a; } | |
| 102 int32_t castSi16ToSi32(short a) { return (int32_t)a; } | |
| 103 int32_t castUi8ToSi32(unsigned char a) { return (int32_t)a; } | |
| 104 int32_t castSi8ToSi32(signed char a) { return (int32_t)a; } | |
| 105 int32_t castUi1ToSi32(bool a) { return (int32_t)a; } | |
| 106 int32_t castF64ToSi32(double a) { return (int32_t)a; } | |
| 107 int32_t castF32ToSi32(float a) { return (int32_t)a; } | |
| 108 | |
| 109 uint32_t castUi64ToUi32(uint64_t a) { return (uint32_t)a; } | |
| 110 uint32_t castSi64ToUi32(int64_t a) { return (uint32_t)a; } | |
| 111 uint32_t castUi32ToUi32(uint32_t a) { return (uint32_t)a; } | |
| 112 uint32_t castSi32ToUi32(int32_t a) { return (uint32_t)a; } | |
| 113 uint32_t castUi16ToUi32(unsigned short a) { return (uint32_t)a; } | |
| 114 uint32_t castSi16ToUi32(short a) { return (uint32_t)a; } | |
| 115 uint32_t castUi8ToUi32(unsigned char a) { return (uint32_t)a; } | |
| 116 uint32_t castSi8ToUi32(signed char a) { return (uint32_t)a; } | |
| 117 uint32_t castUi1ToUi32(bool a) { return (uint32_t)a; } | |
| 118 uint32_t castF64ToUi32(double a) { return (uint32_t)a; } | |
| 119 uint32_t castF32ToUi32(float a) { return (uint32_t)a; } | |
| 120 | |
| 121 int64_t castUi64ToSi64(uint64_t a) { return (int64_t)a; } | |
| 122 int64_t castSi64ToSi64(int64_t a) { return (int64_t)a; } | |
| 123 int64_t castUi32ToSi64(uint32_t a) { return (int64_t)a; } | |
| 124 int64_t castSi32ToSi64(int32_t a) { return (int64_t)a; } | |
| 125 int64_t castUi16ToSi64(unsigned short a) { return (int64_t)a; } | |
| 126 int64_t castSi16ToSi64(short a) { return (int64_t)a; } | |
| 127 int64_t castUi8ToSi64(unsigned char a) { return (int64_t)a; } | |
| 128 int64_t castSi8ToSi64(signed char a) { return (int64_t)a; } | |
| 129 int64_t castUi1ToSi64(bool a) { return (int64_t)a; } | |
| 130 int64_t castF64ToSi64(double a) { return (int64_t)a; } | |
| 131 int64_t castF32ToSi64(float a) { return (int64_t)a; } | |
| 132 | |
| 133 uint64_t castUi64ToUi64(uint64_t a) { return (uint64_t)a; } | |
| 134 uint64_t castSi64ToUi64(int64_t a) { return (uint64_t)a; } | |
| 135 uint64_t castUi32ToUi64(uint32_t a) { return (uint64_t)a; } | |
| 136 uint64_t castSi32ToUi64(int32_t a) { return (uint64_t)a; } | |
| 137 uint64_t castUi16ToUi64(unsigned short a) { return (uint64_t)a; } | |
| 138 uint64_t castSi16ToUi64(short a) { return (uint64_t)a; } | |
| 139 uint64_t castUi8ToUi64(unsigned char a) { return (uint64_t)a; } | |
| 140 uint64_t castSi8ToUi64(signed char a) { return (uint64_t)a; } | |
| 141 uint64_t castUi1ToUi64(bool a) { return (uint64_t)a; } | |
| 142 uint64_t castF64ToUi64(double a) { return (uint64_t)a; } | |
| 143 uint64_t castF32ToUi64(float a) { return (uint64_t)a; } | |
| 144 | |
| 145 float castUi64ToF32(uint64_t a) { return (float)a; } | |
| 146 float castSi64ToF32(int64_t a) { return (float)a; } | |
| 147 float castUi32ToF32(uint32_t a) { return (float)a; } | |
| 148 float castSi32ToF32(int32_t a) { return (float)a; } | |
| 149 float castUi16ToF32(unsigned short a) { return (float)a; } | |
| 150 float castSi16ToF32(short a) { return (float)a; } | |
| 151 float castUi8ToF32(unsigned char a) { return (float)a; } | |
| 152 float castSi8ToF32(signed char a) { return (float)a; } | |
| 153 float castUi1ToF32(bool a) { return (float)a; } | |
| 154 float castF64ToF32(double a) { return (float)a; } | |
| 155 float castF32ToF32(float a) { return (float)a; } | |
| 156 | |
| 157 double castUi64ToF64(uint64_t a) { return (double)a; } | |
| 158 double castSi64ToF64(int64_t a) { return (double)a; } | |
| 159 double castUi32ToF64(uint32_t a) { return (double)a; } | |
| 160 double castSi32ToF64(int32_t a) { return (double)a; } | |
| 161 double castUi16ToF64(unsigned short a) { return (double)a; } | |
| 162 double castSi16ToF64(short a) { return (double)a; } | |
| 163 double castUi8ToF64(unsigned char a) { return (double)a; } | |
| 164 double castSi8ToF64(signed char a) { return (double)a; } | |
| 165 double castUi1ToF64(bool a) { return (double)a; } | |
| 166 double castF64ToF64(double a) { return (double)a; } | |
| 167 double castF32ToF64(float a) { return (double)a; } | |
| 168 | |
| 169 uint32_t castbits_F32ToUi32(float a) { return *(uint32_t *)&a; } | |
| 170 float castbits_Ui32ToF32(uint32_t a) { return *(float *)&a; } | |
| 171 uint64_t castbits_F64ToUi64(double a) { return *(uint64_t *)&a; } | |
| 172 double castbits_Ui64ToF64(uint64_t a) { return *(double *)&a; } | |
| OLD | NEW |