source: trunk/src/transpose.h @ 59

Last change on this file since 59 was 36, checked in by cameron, 11 years ago

Charset Architecture: Lexer Factory/bit streams

File size: 2.2 KB
Line 
1/*  transpose.h - parabix transposition library
2    Copyright (c) 2007, 2008 Robert D. Cameron. 
3    Licensed to the public under the Open Software License 3.0.
4    Licensed to International Characters, Inc., under the Academic
5    Free License 3.0.
6
7*/
8#ifndef TRANSPOSE_H
9#define TRANSPOSE_H
10
11#define s2p_step(s0, s1, hi_mask, shift, p0, p1) \
12{\
13  BitBlock t0, t1;\
14  t0 = simd_pack_16_hh(s0, s1);\
15  t1 = simd_pack_16_ll(s0, s1);\
16  p0 = simd_if(hi_mask, t0, simd_srli_16(t1, shift));\
17  p1 = simd_if(hi_mask, simd_slli_16(t0, shift), t1);\
18}
19
20static inline void s2p_bytepack(BytePack s[], BitBlock p[]) {
21    BitBlock mask_2 = simd_himask_2;
22    BitBlock mask_4 = simd_himask_4;
23    BitBlock mask_8 = simd_himask_8;
24    BitBlock bit00224466_0, bit00224466_1, bit00224466_2, bit00224466_3;
25    BitBlock bit11335577_0, bit11335577_1, bit11335577_2, bit11335577_3;
26    BitBlock bit00004444_0, bit22226666_0, bit00004444_1, bit22226666_1;
27    BitBlock bit11115555_0, bit33337777_0, bit11115555_1, bit33337777_1;
28#if (BYTE_ORDER == BIG_ENDIAN)
29    s2p_step(s[0], s[1], mask_2, 1, bit00224466_0, bit11335577_0);
30    s2p_step(s[2], s[3], mask_2, 1, bit00224466_1, bit11335577_1);
31    s2p_step(s[4], s[5], mask_2, 1, bit00224466_2, bit11335577_2);
32    s2p_step(s[6], s[7], mask_2, 1, bit00224466_3, bit11335577_3);
33#endif
34#if (BYTE_ORDER == LITTLE_ENDIAN)
35    s2p_step(s[7], s[6], mask_2, 1, bit00224466_0, bit11335577_0);
36    s2p_step(s[5], s[4], mask_2, 1, bit00224466_1, bit11335577_1);
37    s2p_step(s[3], s[2], mask_2, 1, bit00224466_2, bit11335577_2);
38    s2p_step(s[1], s[0], mask_2, 1, bit00224466_3, bit11335577_3);
39#endif
40    s2p_step(bit00224466_0, bit00224466_1, mask_4, 2, bit00004444_0, bit22226666_0);
41    s2p_step(bit00224466_2, bit00224466_3, mask_4, 2, bit00004444_1, bit22226666_1);
42    s2p_step(bit11335577_0, bit11335577_1, mask_4, 2, bit11115555_0, bit33337777_0);
43    s2p_step(bit11335577_2, bit11335577_3, mask_4, 2, bit11115555_1, bit33337777_1);
44    s2p_step(bit00004444_0, bit00004444_1, mask_8, 4, p[0], p[4]);
45    s2p_step(bit11115555_0, bit11115555_1, mask_8, 4, p[1], p[5]);
46    s2p_step(bit22226666_0, bit22226666_1, mask_8, 4, p[2], p[6]);
47    s2p_step(bit33337777_0, bit33337777_1, mask_8, 4, p[3], p[7]);
48  }
49
50#endif
Note: See TracBrowser for help on using the repository browser.