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 |