source: trunk/src/transpose.h @ 14

Last change on this file since 14 was 4, checked in by cameron, 11 years ago

Initial import of parabix-0.36

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