/xmlbench/trunk

To get this branch, use:
bzr branch http://darksoft.org/webbzr/xmlbench/trunk

« back to all changes in this revision

Viewing changes to parse/parabix.20090211/lib/sse_simd.h

  • Committer: Suren A. Chilingaryan
  • Date: 2009-09-23 17:13:04 UTC
  • Revision ID: csa@dside.dyndns.org-20090923171304-osvtr4zqb29h11kd
Intel, Tango, Phobos, and RapidXML parsers; Memory benchmark scripts

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*  Idealized SIMD Operations with SSE versions
2
 
    Copyright (C) 2006, 2007, 2008, Robert D. Cameron
3
 
    Licensed to the public under the Open Software License 3.0.
4
 
    Licensed to International Characters Inc. 
5
 
       under the Academic Free License version 3.0.
6
 
*/
7
 
#ifndef SSE_SIMD_H
8
 
#define SSE_SIMD_H
9
 
 
10
 
/*------------------------------------------------------------*/
11
 
#ifndef _MSC_VER
12
 
#include <stdint.h>
13
 
#endif
14
 
#ifdef _MSC_VER
15
 
#include "stdint.h"
16
 
#define LITTLE_ENDIAN 1234
17
 
#define BIG_ENDIAN 4321
18
 
#define BYTE_ORDER LITTLE_ENDIAN
19
 
#endif
20
 
#include <limits.h>
21
 
#ifndef LONG_BIT
22
 
#define LONG_BIT (8* sizeof(unsigned long))
23
 
#endif 
24
 
#include <emmintrin.h>
25
 
#ifdef USE_LDDQU
26
 
#include <pmmintrin.h>
27
 
#endif
28
 
typedef __m128i SIMD_type;
29
 
/*------------------------------------------------------------*/
30
 
/* I. SIMD bitwise logical operations */
31
 
 
32
 
#define simd_or(b1, b2) _mm_or_si128(b1, b2)
33
 
#define simd_and(b1, b2) _mm_and_si128(b1, b2)
34
 
#define simd_xor(b1, b2) _mm_xor_si128(b1, b2)
35
 
#define simd_andc(b1, b2) _mm_andnot_si128(b2, b1)
36
 
#define simd_if(cond, then_val, else_val) \
37
 
  simd_or(simd_and(then_val, cond), simd_andc(else_val, cond))
38
 
#define simd_not(b) (simd_xor(b, _mm_set1_epi32(0xFFFFFFFF)))
39
 
#define simd_nor(a,b) (simd_not(simd_or(a,b)))
40
 
 
41
 
 
42
 
/*  Specific constants. */
43
 
#define simd_himask_2 _mm_set1_epi8(0xAA)
44
 
#define simd_himask_4 _mm_set1_epi8(0xCC)
45
 
#define simd_himask_8 _mm_set1_epi8(0xF0)
46
 
/* Little-endian */
47
 
#define simd_himask_16 _mm_set1_epi16(0xFF00)
48
 
#define simd_himask_32 _mm_set1_epi32(0xFFFF0000)
49
 
#define simd_himask_64 _mm_set_epi32(-1,0,-1,0)
50
 
#define simd_himask_128 _mm_set_epi32(-1,-1,0,0)
51
 
 
52
 
/* Idealized operations with direct implementation by built-in 
53
 
   operations for various target architectures. */
54
 
 
55
 
#define simd_add_8(a, b) _mm_add_epi8(a, b)
56
 
#define simd_add_16(a, b) _mm_add_epi16(a, b)
57
 
#define simd_add_32(a, b) _mm_add_epi32(a, b)
58
 
#define simd_add_64(a, b) _mm_add_epi64(a, b)
59
 
#define simd_sub_8(a, b) _mm_sub_epi8(a, b)
60
 
#define simd_sub_16(a, b) _mm_sub_epi16(a, b)
61
 
#define simd_sub_32(a, b) _mm_sub_epi32(a, b)
62
 
#define simd_sub_64(a, b) _mm_sub_epi64(a, b)
63
 
#define simd_mult_16(a, b) _mm_mullo_epi16(a, b)
64
 
#define simd_slli_16(r, shft) _mm_slli_epi16(r, shft)
65
 
#define simd_srli_16(r, shft) _mm_srli_epi16(r, shft)
66
 
#define simd_srai_16(r, shft) _mm_srai_epi16(r, shft)
67
 
#define simd_slli_32(r, shft) _mm_slli_epi32(r, shft)
68
 
#define simd_srli_32(r, shft) _mm_srli_epi32(r, shft)
69
 
#define simd_srai_32(r, shft) _mm_srai_epi32(r, shft)
70
 
#define simd_slli_64(r, shft) _mm_slli_epi64(r, shft)
71
 
#define simd_srli_64(r, shft) _mm_srli_epi64(r, shft)
72
 
#define simd_sll_64(r, shft_reg) _mm_sll_epi64(r, shft_reg)
73
 
#define simd_srl_64(r, shft_reg) _mm_srl_epi64(r, shft_reg)
74
 
#define simd_pack_16(a, b) \
75
 
  _mm_packus_epi16(simd_andc(b, simd_himask_16), simd_andc(a, simd_himask_16))
76
 
#define simd_mergeh_8(a, b) _mm_unpackhi_epi8(b, a)
77
 
#define simd_mergeh_16(a, b) _mm_unpackhi_epi16(b, a)
78
 
#define simd_mergeh_32(a, b) _mm_unpackhi_epi32(b, a)
79
 
#define simd_mergeh_64(a, b) _mm_unpackhi_epi64(b, a)
80
 
#define simd_mergel_8(a, b) _mm_unpacklo_epi8(b, a)
81
 
#define simd_mergel_16(a, b) _mm_unpacklo_epi16(b, a)
82
 
#define simd_mergel_32(a, b) _mm_unpacklo_epi32(b, a)
83
 
#define simd_mergel_64(a, b) _mm_unpacklo_epi64(b, a)
84
 
#define simd_eq_8(a, b) _mm_cmpeq_epi8(a, b)
85
 
#define simd_eq_16(a, b) _mm_cmpeq_epi16(a, b)
86
 
#define simd_eq_32(a, b) _mm_cmpeq_epi32(a, b)
87
 
 
88
 
#define simd_max_8(a, b) _mm_max_epu8(a, b)
89
 
 
90
 
#define simd_slli_128(r, shft) \
91
 
  ((shft) % 8 == 0 ? _mm_slli_si128(r, (shft)/8) : \
92
 
   (shft) >= 64 ? simd_slli_64(_mm_slli_si128(r, 8), (shft) - 64) : \
93
 
   simd_or(simd_slli_64(r, shft), _mm_slli_si128(simd_srli_64(r, 64-(shft)), 8)))
94
 
 
95
 
#define simd_srli_128(r, shft) \
96
 
  ((shft) % 8 == 0 ? _mm_srli_si128(r, (shft)/8) : \
97
 
   (shft) >= 64 ? simd_srli_64(_mm_srli_si128(r, 8), (shft) - 64) : \
98
 
   simd_or(simd_srli_64(r, shft), _mm_srli_si128(simd_slli_64(r, 64-(shft)), 8)))
99
 
 
100
 
#define simd_sll_128(r, shft) \
101
 
   simd_or(simd_sll_64(r, shft), \
102
 
           simd_or(_mm_slli_si128(simd_sll_64(r, simd_sub_32(shft, sisd_from_int(64))), 8), \
103
 
                   _mm_slli_si128(simd_srl_64(r, simd_sub_32(sisd_from_int(64), shft)), 8)))
104
 
 
105
 
#define simd_srl_128(r, shft) \
106
 
   simd_or(simd_srl_64(r, shft), \
107
 
           simd_or(_mm_srli_si128(simd_srl_64(r, simd_sub_32(shft, sisd_from_int(64))), 8), \
108
 
                   _mm_srli_si128(simd_sll_64(r, simd_sub_32(sisd_from_int(64), shft)), 8)))
109
 
 
110
 
#define sisd_sll(r, shft) simd_sll_128(r, shft)
111
 
#define sisd_srl(r, shft) simd_srl_128(r, shft)
112
 
#define sisd_slli(r, shft) simd_slli_128(r, shft)
113
 
#define sisd_srli(r, shft) simd_srli_128(r, shft)
114
 
#define sisd_add(a, b) simd_add_128(a, b)
115
 
#define sisd_sub(a, b) simd_sub_128(a, b)
116
 
 
117
 
#define sisd_store_aligned(r, addr) _mm_store_si128(addr, r)
118
 
#define sisd_store_unaligned(r, addr) _mm_storeu_si128(addr, r)
119
 
#define sisd_load_aligned(addr) _mm_load_si128(addr)
120
 
#ifndef USE_LDDQU
121
 
#define sisd_load_unaligned(addr) _mm_loadu_si128(addr)
122
 
#endif
123
 
#ifdef USE_LDDQU
124
 
#define sisd_load_unaligned(addr) _mm_lddqu_si128(addr)
125
 
#endif
126
 
 
127
 
 
128
 
 
129
 
#define simd_const_32(n) _mm_set1_epi32(n)
130
 
#define simd_const_16(n) _mm_set1_epi16(n)
131
 
#define simd_const_8(n) _mm_set1_epi8(n)
132
 
#define simd_const_4(n) _mm_set1_epi8((n)<<4|(n))
133
 
#define simd_const_2(n) simd_const_4(n<<2|n)
134
 
#define simd_const_1(n) \
135
 
  (n==0 ? simd_const_8(0): simd_const_8(-1))
136
 
 
137
 
#define simd_pack_16_ll(a, b) simd_pack_16(a, b)
138
 
#define simd_pack_16_hh(a, b) \
139
 
  simd_pack_16(simd_srli_16(a, 8), simd_srli_16(b, 8))
140
 
 
141
 
 
142
 
static inline
143
 
SIMD_type simd_add_2(SIMD_type a, SIMD_type b)
144
 
{
145
 
         SIMD_type c1 = simd_xor(a,b);
146
 
         SIMD_type borrow = simd_and(a,b);
147
 
         SIMD_type c2 = simd_xor(c1,(sisd_slli(borrow,1)));
148
 
         return simd_if(simd_himask_2,c2,c1);
149
 
}
150
 
#define simd_add_4(a, b)\
151
 
        simd_if(simd_himask_8, simd_add_8(simd_and(a,simd_himask_8),simd_and(b,simd_himask_8))\
152
 
        ,simd_add_8(simd_andc(a,simd_himask_8),simd_andc(b,simd_himask_8)))
153
 
 
154
 
#define simd_srli_2(r, sh)\
155
 
         simd_and(simd_srli_32(r,sh),simd_const_2(3>>sh))
156
 
 
157
 
#define simd_srli_4(r, sh)\
158
 
         simd_and(simd_srli_32(r,sh),simd_const_4(15>>sh))
159
 
#define simd_srli_8(r, sh)\
160
 
         simd_and(simd_srli_32(r,sh),simd_const_8(255>>sh))
161
 
 
162
 
#define simd_slli_2(r, sh)\
163
 
         simd_and(simd_slli_32(r,sh),simd_const_2((3<<sh)&3))
164
 
 
165
 
#define simd_slli_4(r, sh)\
166
 
         simd_and(simd_slli_32(r,sh),simd_const_4((15<<sh)&15))
167
 
#define simd_slli_8(r, sh)\
168
 
         simd_and(simd_slli_32(r,sh),simd_const_8((255<<sh) &255))
169
 
 
170
 
 
171
 
 
172
 
 
173
 
#define simd_mergeh_4(a,b)\
174
 
        simd_mergeh_8(simd_if(simd_himask_8,a,simd_srli_8(b,4)),\
175
 
        simd_if(simd_himask_8,simd_slli_8(a,4),b))
176
 
#define simd_mergel_4(a,b)\
177
 
        simd_mergel_8(simd_if(simd_himask_8,a,simd_srli_8(b,4)),\
178
 
        simd_if(simd_himask_8,simd_slli_8(a,4),b))
179
 
#define simd_mergeh_2(a,b)\
180
 
        simd_mergeh_4(simd_if(simd_himask_4,a,simd_srli_4(b,2)),\
181
 
        simd_if(simd_himask_4,simd_slli_4(a,2),b))
182
 
#define simd_mergel_2(a,b)\
183
 
        simd_mergel_4(simd_if(simd_himask_4,a,simd_srli_4(b,2)),\
184
 
        simd_if(simd_himask_4,simd_slli_4(a,2),b))
185
 
#define simd_mergeh_1(a,b)\
186
 
        simd_mergeh_2(simd_if(simd_himask_2,a,simd_srli_2(b,1)),\
187
 
        simd_if(simd_himask_2,simd_slli_2(a,1),b))
188
 
#define simd_mergel_1(a,b)\
189
 
        simd_mergel_2(simd_if(simd_himask_2,a,simd_srli_2(b,1)),\
190
 
        simd_if(simd_himask_2,simd_slli_2(a,1),b))
191
 
 
192
 
#define sisd_to_int(x) _mm_cvtsi128_si32(x)
193
 
 
194
 
#define sisd_from_int(n) _mm_cvtsi32_si128(n)
195
 
 
196
 
static inline int simd_all_true_8(SIMD_type v) {
197
 
  return _mm_movemask_epi8(v) == 0xFFFF;
198
 
}
199
 
 
200
 
static inline int simd_any_true_8(SIMD_type v) {
201
 
  return _mm_movemask_epi8(v) != 0;
202
 
}
203
 
 
204
 
static inline int simd_any_sign_bit_8(SIMD_type v) {
205
 
  return _mm_movemask_epi8(v) != 0;
206
 
}
207
 
 
208
 
#define simd_all_eq_8(v1, v2) simd_all_true_8(_mm_cmpeq_epi8(v1, v2))
209
 
#define simd_all_le_8(v1, v2) \
210
 
  simd_all_eq_8(simd_max_8(v1, v2), v2)
211
 
 
212
 
#define simd_all_signed_gt_8(v1, v2) simd_all_true_8(_mm_cmpgt_epi8(v1, v2))
213
 
 
214
 
#define simd_cmpgt_8(v1,v2) _mm_cmpgt_epi8(v1, v2)
215
 
 
216
 
static inline int bitblock_has_bit(SIMD_type v) {
217
 
  return !simd_all_true_8(simd_eq_8(v, simd_const_8(0)));
218
 
}
219
 
 
220
 
 
221
 
 
222
 
#define bitblock_test_bit(blk, n) \
223
 
   sisd_to_int(sisd_srli(sisd_slli(blk, ((BLOCKSIZE-1)-(n))), BLOCKSIZE-1))
224
 
 
225
 
#define simd_pack_2(a,b)\
226
 
        simd_pack_4(simd_if(simd_himask_2,sisd_srli(a,1),a),\
227
 
        simd_if(simd_himask_2,sisd_srli(b,1),b))
228
 
#define simd_pack_4(a,b)\
229
 
        simd_pack_8(simd_if(simd_himask_4,sisd_srli(a,2),a),\
230
 
        simd_if(simd_himask_4,sisd_srli(b,2),b))
231
 
#define simd_pack_8(a,b)\
232
 
        simd_pack_16(simd_if(simd_himask_8,sisd_srli(a,4),a),\
233
 
        simd_if(simd_himask_8,sisd_srli(b,4),b))
234
 
 
235
 
#ifndef simd_add_2_xx
236
 
#define simd_add_2_xx(v1, v2) simd_add_2(v1, v2)
237
 
#endif
238
 
 
239
 
#ifndef simd_add_2_xl
240
 
#define simd_add_2_xl(v1, v2) simd_add_2(v1, simd_andc(v2, simd_himask_2))
241
 
#endif
242
 
 
243
 
#ifndef simd_add_2_xh
244
 
#define simd_add_2_xh(v1, v2) simd_add_2(v1, simd_srli_2(v2, 1))
245
 
#endif
246
 
 
247
 
#ifndef simd_add_2_lx
248
 
#define simd_add_2_lx(v1, v2) simd_add_2(simd_andc(v1, simd_himask_2), v2)
249
 
#endif
250
 
 
251
 
#ifndef simd_add_2_ll
252
 
#define simd_add_2_ll(v1, v2) simd_add_8(simd_andc(v1, simd_himask_2), simd_andc(v2, simd_himask_2))
253
 
#endif
254
 
 
255
 
#ifndef simd_add_2_lh
256
 
#define simd_add_2_lh(v1, v2) simd_add_8(simd_andc(v1, simd_himask_2), simd_srli_2(v2, 1))
257
 
#endif
258
 
 
259
 
#ifndef simd_add_2_hx
260
 
#define simd_add_2_hx(v1, v2) simd_add_2(simd_srli_2(v1, 1), v2)
261
 
#endif
262
 
 
263
 
#ifndef simd_add_2_hl
264
 
#define simd_add_2_hl(v1, v2) simd_add_8(simd_srli_2(v1, 1), simd_andc(v2, simd_himask_2))
265
 
#endif
266
 
 
267
 
#ifndef simd_add_2_hh
268
 
#define simd_add_2_hh(v1, v2) simd_add_8(simd_srli_2(v1, 1), simd_srli_2(v2, 1))
269
 
#endif
270
 
 
271
 
#ifndef simd_add_4_xx
272
 
#define simd_add_4_xx(v1, v2) simd_add_4(v1, v2)
273
 
#endif
274
 
 
275
 
#ifndef simd_add_4_xl
276
 
#define simd_add_4_xl(v1, v2) simd_add_4(v1, simd_andc(v2, simd_himask_4))
277
 
#endif
278
 
 
279
 
#ifndef simd_add_4_xh
280
 
#define simd_add_4_xh(v1, v2) simd_add_4(v1, simd_srli_4(v2, 2))
281
 
#endif
282
 
 
283
 
#ifndef simd_add_4_lx
284
 
#define simd_add_4_lx(v1, v2) simd_add_4(simd_andc(v1, simd_himask_4), v2)
285
 
#endif
286
 
 
287
 
#ifndef simd_add_4_ll
288
 
#define simd_add_4_ll(v1, v2) simd_add_8(simd_andc(v1, simd_himask_4), simd_andc(v2, simd_himask_4))
289
 
#endif
290
 
 
291
 
#ifndef simd_add_4_lh
292
 
#define simd_add_4_lh(v1, v2) simd_add_8(simd_andc(v1, simd_himask_4), simd_srli_4(v2, 2))
293
 
#endif
294
 
 
295
 
#ifndef simd_add_4_hx
296
 
#define simd_add_4_hx(v1, v2) simd_add_4(simd_srli_4(v1, 2), v2)
297
 
#endif
298
 
 
299
 
#ifndef simd_add_4_hl
300
 
#define simd_add_4_hl(v1, v2) simd_add_8(simd_srli_4(v1, 2), simd_andc(v2, simd_himask_4))
301
 
#endif
302
 
 
303
 
#ifndef simd_add_4_hh
304
 
#define simd_add_4_hh(v1, v2) simd_add_8(simd_srli_4(v1, 2), simd_srli_4(v2, 2))
305
 
#endif
306
 
 
307
 
#ifndef simd_add_8_xx
308
 
#define simd_add_8_xx(v1, v2) simd_add_8(v1, v2)
309
 
#endif
310
 
 
311
 
#ifndef simd_add_8_xl
312
 
#define simd_add_8_xl(v1, v2) simd_add_8(v1, simd_andc(v2, simd_himask_8))
313
 
#endif
314
 
 
315
 
#ifndef simd_add_8_xh
316
 
#define simd_add_8_xh(v1, v2) simd_add_8(v1, simd_srli_8(v2, 4))
317
 
#endif
318
 
 
319
 
#ifndef simd_add_8_lx
320
 
#define simd_add_8_lx(v1, v2) simd_add_8(simd_andc(v1, simd_himask_8), v2)
321
 
#endif
322
 
 
323
 
#ifndef simd_add_8_ll
324
 
#define simd_add_8_ll(v1, v2) simd_add_8(simd_andc(v1, simd_himask_8), simd_andc(v2, simd_himask_8))
325
 
#endif
326
 
 
327
 
#ifndef simd_add_8_lh
328
 
#define simd_add_8_lh(v1, v2) simd_add_8(simd_andc(v1, simd_himask_8), simd_srli_8(v2, 4))
329
 
#endif
330
 
 
331
 
#ifndef simd_add_8_hx
332
 
#define simd_add_8_hx(v1, v2) simd_add_8(simd_srli_8(v1, 4), v2)
333
 
#endif
334
 
 
335
 
#ifndef simd_add_8_hl
336
 
#define simd_add_8_hl(v1, v2) simd_add_8(simd_srli_8(v1, 4), simd_andc(v2, simd_himask_8))
337
 
#endif
338
 
 
339
 
#ifndef simd_add_8_hh
340
 
#define simd_add_8_hh(v1, v2) simd_add_8(simd_srli_8(v1, 4), simd_srli_8(v2, 4))
341
 
#endif
342
 
 
343
 
#ifndef simd_add_16_xx
344
 
#define simd_add_16_xx(v1, v2) simd_add_16(v1, v2)
345
 
#endif
346
 
 
347
 
#ifndef simd_add_16_xl
348
 
#define simd_add_16_xl(v1, v2) simd_add_16(v1, simd_andc(v2, simd_himask_16))
349
 
#endif
350
 
 
351
 
#ifndef simd_add_16_xh
352
 
#define simd_add_16_xh(v1, v2) simd_add_16(v1, simd_srli_16(v2, 8))
353
 
#endif
354
 
 
355
 
#ifndef simd_add_16_lx
356
 
#define simd_add_16_lx(v1, v2) simd_add_16(simd_andc(v1, simd_himask_16), v2)
357
 
#endif
358
 
 
359
 
#ifndef simd_add_16_ll
360
 
#define simd_add_16_ll(v1, v2) simd_add_16(simd_andc(v1, simd_himask_16), simd_andc(v2, simd_himask_16))
361
 
#endif
362
 
 
363
 
#ifndef simd_add_16_lh
364
 
#define simd_add_16_lh(v1, v2) simd_add_16(simd_andc(v1, simd_himask_16), simd_srli_16(v2, 8))
365
 
#endif
366
 
 
367
 
#ifndef simd_add_16_hx
368
 
#define simd_add_16_hx(v1, v2) simd_add_16(simd_srli_16(v1, 8), v2)
369
 
#endif
370
 
 
371
 
#ifndef simd_add_16_hl
372
 
#define simd_add_16_hl(v1, v2) simd_add_16(simd_srli_16(v1, 8), simd_andc(v2, simd_himask_16))
373
 
#endif
374
 
 
375
 
#ifndef simd_add_16_hh
376
 
#define simd_add_16_hh(v1, v2) simd_add_16(simd_srli_16(v1, 8), simd_srli_16(v2, 8))
377
 
#endif
378
 
 
379
 
#ifndef simd_add_32_xx
380
 
#define simd_add_32_xx(v1, v2) simd_add_32(v1, v2)
381
 
#endif
382
 
 
383
 
#ifndef simd_add_32_xl
384
 
#define simd_add_32_xl(v1, v2) simd_add_32(v1, simd_andc(v2, simd_himask_32))
385
 
#endif
386
 
 
387
 
#ifndef simd_add_32_xh
388
 
#define simd_add_32_xh(v1, v2) simd_add_32(v1, simd_srli_32(v2, 16))
389
 
#endif
390
 
 
391
 
#ifndef simd_add_32_lx
392
 
#define simd_add_32_lx(v1, v2) simd_add_32(simd_andc(v1, simd_himask_32), v2)
393
 
#endif
394
 
 
395
 
#ifndef simd_add_32_ll
396
 
#define simd_add_32_ll(v1, v2) simd_add_32(simd_andc(v1, simd_himask_32), simd_andc(v2, simd_himask_32))
397
 
#endif
398
 
 
399
 
#ifndef simd_add_32_lh
400
 
#define simd_add_32_lh(v1, v2) simd_add_32(simd_andc(v1, simd_himask_32), simd_srli_32(v2, 16))
401
 
#endif
402
 
 
403
 
#ifndef simd_add_32_hx
404
 
#define simd_add_32_hx(v1, v2) simd_add_32(simd_srli_32(v1, 16), v2)
405
 
#endif
406
 
 
407
 
#ifndef simd_add_32_hl
408
 
#define simd_add_32_hl(v1, v2) simd_add_32(simd_srli_32(v1, 16), simd_andc(v2, simd_himask_32))
409
 
#endif
410
 
 
411
 
#ifndef simd_add_32_hh
412
 
#define simd_add_32_hh(v1, v2) simd_add_32(simd_srli_32(v1, 16), simd_srli_32(v2, 16))
413
 
#endif
414
 
 
415
 
#ifndef simd_add_64_xx
416
 
#define simd_add_64_xx(v1, v2) simd_add_64(v1, v2)
417
 
#endif
418
 
 
419
 
#ifndef simd_add_64_xl
420
 
#define simd_add_64_xl(v1, v2) simd_add_64(v1, simd_andc(v2, simd_himask_64))
421
 
#endif
422
 
 
423
 
#ifndef simd_add_64_xh
424
 
#define simd_add_64_xh(v1, v2) simd_add_64(v1, simd_srli_64(v2, 32))
425
 
#endif
426
 
 
427
 
#ifndef simd_add_64_lx
428
 
#define simd_add_64_lx(v1, v2) simd_add_64(simd_andc(v1, simd_himask_64), v2)
429
 
#endif
430
 
 
431
 
#ifndef simd_add_64_ll
432
 
#define simd_add_64_ll(v1, v2) simd_add_64(simd_andc(v1, simd_himask_64), simd_andc(v2, simd_himask_64))
433
 
#endif
434
 
 
435
 
#ifndef simd_add_64_lh
436
 
#define simd_add_64_lh(v1, v2) simd_add_64(simd_andc(v1, simd_himask_64), simd_srli_64(v2, 32))
437
 
#endif
438
 
 
439
 
#ifndef simd_add_64_hx
440
 
#define simd_add_64_hx(v1, v2) simd_add_64(simd_srli_64(v1, 32), v2)
441
 
#endif
442
 
 
443
 
#ifndef simd_add_64_hl
444
 
#define simd_add_64_hl(v1, v2) simd_add_64(simd_srli_64(v1, 32), simd_andc(v2, simd_himask_64))
445
 
#endif
446
 
 
447
 
#ifndef simd_add_64_hh
448
 
#define simd_add_64_hh(v1, v2) simd_add_64(simd_srli_64(v1, 32), simd_srli_64(v2, 32))
449
 
#endif
450
 
 
451
 
#ifndef simd_add_128_xx
452
 
#define simd_add_128_xx(v1, v2) simd_add_128(v1, v2)
453
 
#endif
454
 
 
455
 
#ifndef simd_add_128_xl
456
 
#define simd_add_128_xl(v1, v2) simd_add_128(v1, simd_andc(v2, simd_himask_128))
457
 
#endif
458
 
 
459
 
#ifndef simd_add_128_xh
460
 
#define simd_add_128_xh(v1, v2) simd_add_128(v1, simd_srli_128(v2, 64))
461
 
#endif
462
 
 
463
 
#ifndef simd_add_128_lx
464
 
#define simd_add_128_lx(v1, v2) simd_add_128(simd_andc(v1, simd_himask_128), v2)
465
 
#endif
466
 
 
467
 
#ifndef simd_add_128_ll
468
 
#define simd_add_128_ll(v1, v2) simd_add_128(simd_andc(v1, simd_himask_128), simd_andc(v2, simd_himask_128))
469
 
#endif
470
 
 
471
 
#ifndef simd_add_128_lh
472
 
#define simd_add_128_lh(v1, v2) simd_add_128(simd_andc(v1, simd_himask_128), simd_srli_128(v2, 64))
473
 
#endif
474
 
 
475
 
#ifndef simd_add_128_hx
476
 
#define simd_add_128_hx(v1, v2) simd_add_128(simd_srli_128(v1, 64), v2)
477
 
#endif
478
 
 
479
 
#ifndef simd_add_128_hl
480
 
#define simd_add_128_hl(v1, v2) simd_add_128(simd_srli_128(v1, 64), simd_andc(v2, simd_himask_128))
481
 
#endif
482
 
 
483
 
#ifndef simd_add_128_hh
484
 
#define simd_add_128_hh(v1, v2) simd_add_128(simd_srli_128(v1, 64), simd_srli_128(v2, 64))
485
 
#endif
486
 
 
487
 
#ifndef simd_pack_2_xx
488
 
#define simd_pack_2_xx(v1, v2) simd_pack_2(v1, v2)
489
 
#endif
490
 
 
491
 
#ifndef simd_pack_2_xl
492
 
#define simd_pack_2_xl(v1, v2) simd_pack_2(v1, v2)
493
 
#endif
494
 
 
495
 
#ifndef simd_pack_2_xh
496
 
#define simd_pack_2_xh(v1, v2) simd_pack_2(v1, simd_srli_16(v2, 1))
497
 
#endif
498
 
 
499
 
#ifndef simd_pack_2_lx
500
 
#define simd_pack_2_lx(v1, v2) simd_pack_2(v1, v2)
501
 
#endif
502
 
 
503
 
#ifndef simd_pack_2_ll
504
 
#define simd_pack_2_ll(v1, v2) simd_pack_2(v1, v2)
505
 
#endif
506
 
 
507
 
#ifndef simd_pack_2_lh
508
 
#define simd_pack_2_lh(v1, v2) simd_pack_2(v1, simd_srli_16(v2, 1))
509
 
#endif
510
 
 
511
 
#ifndef simd_pack_2_hx
512
 
#define simd_pack_2_hx(v1, v2) simd_pack_2(simd_srli_16(v1, 1), v2)
513
 
#endif
514
 
 
515
 
#ifndef simd_pack_2_hl
516
 
#define simd_pack_2_hl(v1, v2) simd_pack_2(simd_srli_16(v1, 1), v2)
517
 
#endif
518
 
 
519
 
#ifndef simd_pack_2_hh
520
 
#define simd_pack_2_hh(v1, v2) simd_pack_2(simd_srli_16(v1, 1), simd_srli_16(v2, 1))
521
 
#endif
522
 
 
523
 
#ifndef simd_pack_4_xx
524
 
#define simd_pack_4_xx(v1, v2) simd_pack_4(v1, v2)
525
 
#endif
526
 
 
527
 
#ifndef simd_pack_4_xl
528
 
#define simd_pack_4_xl(v1, v2) simd_pack_4(v1, v2)
529
 
#endif
530
 
 
531
 
#ifndef simd_pack_4_xh
532
 
#define simd_pack_4_xh(v1, v2) simd_pack_4(v1, simd_srli_16(v2, 2))
533
 
#endif
534
 
 
535
 
#ifndef simd_pack_4_lx
536
 
#define simd_pack_4_lx(v1, v2) simd_pack_4(v1, v2)
537
 
#endif
538
 
 
539
 
#ifndef simd_pack_4_ll
540
 
#define simd_pack_4_ll(v1, v2) simd_pack_4(v1, v2)
541
 
#endif
542
 
 
543
 
#ifndef simd_pack_4_lh
544
 
#define simd_pack_4_lh(v1, v2) simd_pack_4(v1, simd_srli_16(v2, 2))
545
 
#endif
546
 
 
547
 
#ifndef simd_pack_4_hx
548
 
#define simd_pack_4_hx(v1, v2) simd_pack_4(simd_srli_16(v1, 2), v2)
549
 
#endif
550
 
 
551
 
#ifndef simd_pack_4_hl
552
 
#define simd_pack_4_hl(v1, v2) simd_pack_4(simd_srli_16(v1, 2), v2)
553
 
#endif
554
 
 
555
 
#ifndef simd_pack_4_hh
556
 
#define simd_pack_4_hh(v1, v2) simd_pack_4(simd_srli_16(v1, 2), simd_srli_16(v2, 2))
557
 
#endif
558
 
 
559
 
#ifndef simd_pack_8_xx
560
 
#define simd_pack_8_xx(v1, v2) simd_pack_8(v1, v2)
561
 
#endif
562
 
 
563
 
#ifndef simd_pack_8_xl
564
 
#define simd_pack_8_xl(v1, v2) simd_pack_8(v1, v2)
565
 
#endif
566
 
 
567
 
#ifndef simd_pack_8_xh
568
 
#define simd_pack_8_xh(v1, v2) simd_pack_8(v1, simd_srli_16(v2, 4))
569
 
#endif
570
 
 
571
 
#ifndef simd_pack_8_lx
572
 
#define simd_pack_8_lx(v1, v2) simd_pack_8(v1, v2)
573
 
#endif
574
 
 
575
 
#ifndef simd_pack_8_ll
576
 
#define simd_pack_8_ll(v1, v2) simd_pack_8(v1, v2)
577
 
#endif
578
 
 
579
 
#ifndef simd_pack_8_lh
580
 
#define simd_pack_8_lh(v1, v2) simd_pack_8(v1, simd_srli_16(v2, 4))
581
 
#endif
582
 
 
583
 
#ifndef simd_pack_8_hx
584
 
#define simd_pack_8_hx(v1, v2) simd_pack_8(simd_srli_16(v1, 4), v2)
585
 
#endif
586
 
 
587
 
#ifndef simd_pack_8_hl
588
 
#define simd_pack_8_hl(v1, v2) simd_pack_8(simd_srli_16(v1, 4), v2)
589
 
#endif
590
 
 
591
 
#ifndef simd_pack_8_hh
592
 
#define simd_pack_8_hh(v1, v2) simd_pack_8(simd_srli_16(v1, 4), simd_srli_16(v2, 4))
593
 
#endif
594
 
 
595
 
#ifndef simd_pack_16_xx
596
 
#define simd_pack_16_xx(v1, v2) simd_pack_16(v1, v2)
597
 
#endif
598
 
 
599
 
#ifndef simd_pack_16_xl
600
 
#define simd_pack_16_xl(v1, v2) simd_pack_16(v1, v2)
601
 
#endif
602
 
 
603
 
#ifndef simd_pack_16_xh
604
 
#define simd_pack_16_xh(v1, v2) simd_pack_16(v1, simd_srli_16(v2, 8))
605
 
#endif
606
 
 
607
 
#ifndef simd_pack_16_lx
608
 
#define simd_pack_16_lx(v1, v2) simd_pack_16(v1, v2)
609
 
#endif
610
 
 
611
 
#ifndef simd_pack_16_ll
612
 
#define simd_pack_16_ll(v1, v2) simd_pack_16(v1, v2)
613
 
#endif
614
 
 
615
 
#ifndef simd_pack_16_lh
616
 
#define simd_pack_16_lh(v1, v2) simd_pack_16(v1, simd_srli_16(v2, 8))
617
 
#endif
618
 
 
619
 
#ifndef simd_pack_16_hx
620
 
#define simd_pack_16_hx(v1, v2) simd_pack_16(simd_srli_16(v1, 8), v2)
621
 
#endif
622
 
 
623
 
#ifndef simd_pack_16_hl
624
 
#define simd_pack_16_hl(v1, v2) simd_pack_16(simd_srli_16(v1, 8), v2)
625
 
#endif
626
 
 
627
 
#ifndef simd_pack_16_hh
628
 
#define simd_pack_16_hh(v1, v2) simd_pack_16(simd_srli_16(v1, 8), simd_srli_16(v2, 8))
629
 
#endif
630
 
 
631
 
 
632
 
// Splat the first 16-bit int into all positions.
633
 
static inline SIMD_type simd_splat_16(SIMD_type x) {
634
 
  SIMD_type t = _mm_shufflelo_epi16(x,0);
635
 
  return _mm_shuffle_epi32(t,0);
636
 
}
637
 
 
638
 
// Splat the first 32-bit int into all positions.
639
 
static inline SIMD_type simd_splat_32(SIMD_type x) {
640
 
  return _mm_shuffle_epi32(x,0);
641
 
}
642
 
 
643
 
 
644
 
void print_bit_block(char * var_name, SIMD_type v) {
645
 
  union {SIMD_type vec; unsigned char elems[8];} x;
646
 
  x.vec = v;
647
 
  unsigned char c, bit_reversed;
648
 
  int i;
649
 
  printf("%20s = ", var_name);
650
 
  for (i = 0; i < sizeof(SIMD_type); i++) {
651
 
    c = x.elems[i];
652
 
     printf("%02X ", c); 
653
 
  }
654
 
  printf("\n");
655
 
}
656
 
 
657
 
static inline int bitblock_bit_count(SIMD_type v) {
658
 
  int bit_count = 0;
659
 
  SIMD_type cts_2 = simd_add_2_lh(v, v);
660
 
  SIMD_type cts_4 = simd_add_4_lh(cts_2, cts_2);
661
 
  SIMD_type cts_8 = simd_add_8_lh(cts_4, cts_4);
662
 
  SIMD_type cts_64 = _mm_sad_epu8(cts_8, simd_const_8(0));
663
 
  /* SIMD_type cts_128 = simd_add_128_lh(cts_64, cts_64) */;
664
 
  SIMD_type cts_128 = simd_add_64(cts_64, sisd_srli(cts_64,64));
665
 
  return (int) sisd_to_int(cts_128);
666
 
}
667
 
 
668
 
#endif
669