39 #define TDS_GET_A1LE(ptr) (((uint8_t *)(ptr))[0])
40 #define TDS_GET_A1BE(ptr) TDS_GET_A1LE(ptr)
41 #define TDS_GET_UA1LE(ptr) TDS_GET_A1LE(ptr)
42 #define TDS_GET_UA1BE(ptr) TDS_GET_A1LE(ptr)
44 #define TDS_PUT_A1LE(ptr,val) do { ((uint8_t *)(ptr))[0] = (val); } while(0)
45 #define TDS_PUT_A1BE(ptr,val) TDS_PUT_A1LE(ptr,val)
46 #define TDS_PUT_UA1LE(ptr,val) TDS_PUT_A1LE(ptr,val)
47 #define TDS_PUT_UA1BE(ptr,val) TDS_PUT_A1LE(ptr,val)
50 #define TDS_GET_UA2LE(ptr) (((uint8_t *)(ptr))[1] * 0x100u + ((uint8_t *)(ptr))[0])
51 #define TDS_GET_UA2BE(ptr) (((uint8_t *)(ptr))[0] * 0x100u + ((uint8_t *)(ptr))[1])
52 #define TDS_GET_A2LE(ptr) TDS_GET_UA2LE(ptr)
53 #define TDS_GET_A2BE(ptr) TDS_GET_UA2BE(ptr)
55 #define TDS_PUT_UA2LE(ptr,val) do {\
56 ((uint8_t *)(ptr))[1] = (uint8_t)((val)>>8); ((uint8_t *)(ptr))[0] = (uint8_t)(val); } while(0)
57 #define TDS_PUT_UA2BE(ptr,val) do {\
58 ((uint8_t *)(ptr))[0] = (uint8_t)((val)>>8); ((uint8_t *)(ptr))[1] = (uint8_t)(val); } while(0)
59 #define TDS_PUT_A2LE(ptr,val) TDS_PUT_UA2LE(ptr,val)
60 #define TDS_PUT_A2BE(ptr,val) TDS_PUT_UA2BE(ptr,val)
63 #define TDS_GET_UA4LE(ptr) \
64 (((uint8_t *)(ptr))[3] * 0x1000000u + ((uint8_t *)(ptr))[2] * 0x10000u +\
65 ((uint8_t *)(ptr))[1] * 0x100u + ((uint8_t *)(ptr))[0])
66 #define TDS_GET_UA4BE(ptr) \
67 (((uint8_t *)(ptr))[0] * 0x1000000u + ((uint8_t *)(ptr))[1] * 0x10000u +\
68 ((uint8_t *)(ptr))[2] * 0x100u + ((uint8_t *)(ptr))[3])
69 #define TDS_GET_A4LE(ptr) TDS_GET_UA4LE(ptr)
70 #define TDS_GET_A4BE(ptr) TDS_GET_UA4BE(ptr)
72 #define TDS_PUT_UA4LE(ptr,val) do {\
73 ((uint8_t *)(ptr))[3] = (uint8_t)((val)>>24); ((uint8_t *)(ptr))[2] = (uint8_t)((val)>>16);\
74 ((uint8_t *)(ptr))[1] = (uint8_t)((val)>>8); ((uint8_t *)(ptr))[0] = (uint8_t)(val); } while(0)
75 #define TDS_PUT_UA4BE(ptr,val) do {\
76 ((uint8_t *)(ptr))[0] = (uint8_t)((val)>>24); ((uint8_t *)(ptr))[1] = (uint8_t)((val)>>16);\
77 ((uint8_t *)(ptr))[2] = (uint8_t)((val)>>8); ((uint8_t *)(ptr))[3] = (uint8_t)(val); } while(0)
78 #define TDS_PUT_A4LE(ptr,val) TDS_PUT_UA4LE(ptr,val)
79 #define TDS_PUT_A4BE(ptr,val) TDS_PUT_UA4BE(ptr,val)
82 # define TDS_MAY_ALIAS __attribute__((__may_alias__))
84 # define TDS_MAY_ALIAS
99 #ifdef WORDS_BIGENDIAN
100 # define TDS_GET_A1(ptr) TDS_GET_A1BE(ptr)
101 # define TDS_GET_UA1(ptr) TDS_GET_UA1BE(ptr)
102 # define TDS_GET_A2(ptr) TDS_GET_A2BE(ptr)
103 # define TDS_GET_UA2(ptr) TDS_GET_UA2BE(ptr)
104 # define TDS_GET_A4(ptr) TDS_GET_A4BE(ptr)
105 # define TDS_GET_UA4(ptr) TDS_GET_UA4BE(ptr)
108 # define TDS_GET_A2BE(ptr) (((TDS_BYTE_CONVERT2*)(ptr))->usi)
109 # define TDS_GET_A4BE(ptr) (((TDS_BYTE_CONVERT4*)(ptr))->ui)
111 # define TDS_PUT_A1(ptr,val) TDS_PUT_A1BE(ptr,val)
112 # define TDS_PUT_UA1(ptr,val) TDS_PUT_UA1BE(ptr,val)
113 # define TDS_PUT_A2(ptr,val) TDS_PUT_A2BE(ptr,val)
114 # define TDS_PUT_UA2(ptr,val) TDS_PUT_UA2BE(ptr,val)
115 # define TDS_PUT_A4(ptr,val) TDS_PUT_A4BE(ptr,val)
116 # define TDS_PUT_UA4(ptr,val) TDS_PUT_UA4BE(ptr,val)
119 # define TDS_PUT_A2BE(ptr,val) (((TDS_BYTE_CONVERT2*)(ptr))->usi = (val))
120 # define TDS_PUT_A4BE(ptr,val) (((TDS_BYTE_CONVERT4*)(ptr))->ui = (val))
121 # define TDS_HOST2LE(val) TDS_BYTE_SWAP16(val)
122 # define TDS_HOST4LE(val) TDS_BYTE_SWAP32(val)
123 # define TDS_HOST2BE(val) (val)
124 # define TDS_HOST4BE(val) (val)
126 # define TDS_GET_A1(ptr) TDS_GET_A1LE(ptr)
127 # define TDS_GET_UA1(ptr) TDS_GET_UA1LE(ptr)
128 # define TDS_GET_A2(ptr) TDS_GET_A2LE(ptr)
129 # define TDS_GET_UA2(ptr) TDS_GET_UA2LE(ptr)
130 # define TDS_GET_A4(ptr) TDS_GET_A4LE(ptr)
131 # define TDS_GET_UA4(ptr) TDS_GET_UA4LE(ptr)
134 # define TDS_GET_A2LE(ptr) (((TDS_BYTE_CONVERT2*)(ptr))->usi)
135 # define TDS_GET_A4LE(ptr) (((TDS_BYTE_CONVERT4*)(ptr))->ui)
137 # define TDS_PUT_A1(ptr,val) TDS_PUT_A1LE(ptr,val)
138 # define TDS_PUT_UA1(ptr,val) TDS_PUT_UA1LE(ptr,val)
139 # define TDS_PUT_A2(ptr,val) TDS_PUT_A2LE(ptr,val)
140 # define TDS_PUT_UA2(ptr,val) TDS_PUT_UA2LE(ptr,val)
141 # define TDS_PUT_A4(ptr,val) TDS_PUT_A4LE(ptr,val)
142 # define TDS_PUT_UA4(ptr,val) TDS_PUT_UA4LE(ptr,val)
145 # define TDS_PUT_A2LE(ptr,val) (((TDS_BYTE_CONVERT2*)(ptr))->usi = (val))
146 # define TDS_PUT_A4LE(ptr,val) (((TDS_BYTE_CONVERT4*)(ptr))->ui = (val))
147 # define TDS_HOST2LE(val) (val)
148 # define TDS_HOST4LE(val) (val)
149 # define TDS_HOST2BE(val) TDS_BYTE_SWAP16(val)
150 # define TDS_HOST4BE(val) TDS_BYTE_SWAP32(val)
155 #if defined(__i386__) || defined(__amd64__) || defined(__CRIS__) ||\
156 defined(__powerpc__) || defined(__powerpc64__) || defined(__ppc__) || defined(__ppc64__) ||\
157 defined(__s390__) || defined(__s390x__) || defined(__m68k__) ||\
158 (defined(_MSC_VER) && (defined(_M_AMD64) || defined(_M_IX86) || defined(_M_X64))) ||\
159 defined(__ARM_FEATURE_UNALIGNED) ||\
160 defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_8__) ||\
161 (defined(_M_ARM) && (_M_ARM >= 7))
162 # ifdef WORDS_BIGENDIAN
163 # undef TDS_GET_UA2BE
164 # undef TDS_GET_UA4BE
165 # define TDS_GET_UA2BE(ptr) TDS_GET_A2BE(ptr)
166 # define TDS_GET_UA4BE(ptr) TDS_GET_A4BE(ptr)
168 # undef TDS_PUT_UA2BE
169 # undef TDS_PUT_UA4BE
170 # define TDS_PUT_UA2BE(ptr,val) TDS_PUT_A2BE(ptr,val)
171 # define TDS_PUT_UA4BE(ptr,val) TDS_PUT_A4BE(ptr,val)
173 # undef TDS_GET_UA2LE
174 # undef TDS_GET_UA4LE
175 # define TDS_GET_UA2LE(ptr) TDS_GET_A2LE(ptr)
176 # define TDS_GET_UA4LE(ptr) TDS_GET_A4LE(ptr)
178 # undef TDS_PUT_UA2LE
179 # undef TDS_PUT_UA4LE
180 # define TDS_PUT_UA2LE(ptr,val) TDS_PUT_A2LE(ptr,val)
181 # define TDS_PUT_UA4LE(ptr,val) TDS_PUT_A4LE(ptr,val)
187 #if defined (__GNUC__) && (__GNUC__ >= 4) && defined (__OPTIMIZE__)
188 # define TDS_BSWAP16(val) __builtin_bswap16(val)
189 # define TDS_BSWAP32(val) __builtin_bswap32(val)
190 #elif defined(_MSC_VER)
191 # define TDS_BSWAP16(val) _byteswap_ushort(val)
192 # define TDS_BSWAP32(val) _byteswap_ulong(val)
195 #if defined(TDS_BSWAP16) && !defined(WORDS_BIGENDIAN)
196 # undef TDS_GET_UA2BE
197 # undef TDS_GET_UA4BE
198 # define TDS_GET_UA2BE(ptr) TDS_BSWAP16(TDS_GET_UA2LE(ptr))
199 # define TDS_GET_UA4BE(ptr) TDS_BSWAP32(TDS_GET_UA4LE(ptr))
201 # undef TDS_PUT_UA2BE
202 # undef TDS_PUT_UA4BE
203 # define TDS_PUT_UA2BE(ptr,val) do {\
204 uint16_t _tds_si = TDS_BSWAP16(val); TDS_PUT_UA2LE(ptr,_tds_si); } while(0)
205 # define TDS_PUT_UA4BE(ptr,val) do {\
206 uint32_t _tds_i = TDS_BSWAP32(val); TDS_PUT_UA4LE(ptr,_tds_i); } while(0)
207 #elif defined(TDS_BSWAP16) && defined(WORDS_BIGENDIAN)
208 # undef TDS_GET_UA2LE
209 # undef TDS_GET_UA4LE
210 # define TDS_GET_UA2LE(ptr) TDS_BSWAP16(TDS_GET_UA2BE(ptr))
211 # define TDS_GET_UA4LE(ptr) TDS_BSWAP32(TDS_GET_UA4BE(ptr))
213 # undef TDS_PUT_UA2LE
214 # undef TDS_PUT_UA4LE
215 # define TDS_PUT_UA2LE(ptr,val) do {\
216 uint16_t _tds_si = TDS_BSWAP16(val); TDS_PUT_UA2BE(ptr,_tds_si); } while(0)
217 # define TDS_PUT_UA4LE(ptr,val) do {\
218 uint32_t _tds_i = TDS_BSWAP32(val); TDS_PUT_UA4BE(ptr,_tds_i); } while(0)
221 #if defined(__GNUC__) && defined(__powerpc__) && defined(WORDS_BIGENDIAN)
222 # undef TDS_GET_UA2LE
223 # undef TDS_GET_UA4LE
224 static inline uint16_t
225 TDS_GET_UA2LE(
void *ptr)
228 __asm__ (
"lhbrx %0,0,%1\n" :
"=r" (res) :
"r" (ptr),
"m"(*(uint16_t *)ptr));
229 return (uint16_t) res;
231 static inline uint32_t
232 TDS_GET_UA4LE(
void *ptr)
235 __asm__ (
"lwbrx %0,0,%1\n" :
"=r" (res) :
"r" (ptr),
"m"(*(uint32_t *)ptr));
236 return (uint32_t) res;
239 # undef TDS_PUT_UA2LE
240 # undef TDS_PUT_UA4LE
242 TDS_PUT_UA2LE(
void *ptr,
unsigned data)
244 __asm__ (
"sthbrx %1,0,%2\n" :
"=m" (*(uint16_t *)ptr) :
"r" (data),
"r" (ptr));
247 TDS_PUT_UA4LE(
void *ptr,
unsigned data)
249 __asm__ (
"stwbrx %1,0,%2\n" :
"=m" (*(uint32_t *)ptr) :
"r" (data),
"r" (ptr));