source: trunk/src/bitplex.c @ 124

Last change on this file since 124 was 113, checked in by ksherdy, 11 years ago

Comment out CODE_COCKER code.

File size: 3.0 KB
Line 
1/*  bitplex - Parallel bit stream module.
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    Given a character stream of 8-bit code units, this module
8    produces a parallel bit stream representation.
9
10
11*/
12
13#include "bitplex.h"
14#include "../lib/lib_simd.h"
15
16#ifdef CODE_CLOCKING
17/*
18#include "../../code_clocker/clocker/code_clocker_session.h"
19Code_Clocker * transpose_clocker;
20*/
21#endif
22
23
24
25#define s2p_step(s0, s1, hi_mask, shift, p0, p1) \
26{\
27  BitBlock t0, t1;\
28  t0 = simd_pack_16_hh(s0, s1);\
29  t1 = simd_pack_16_ll(s0, s1);\
30  p0 = simd_if(hi_mask, t0, simd_srli_16(t1, shift));\
31  p1 = simd_if(hi_mask, simd_slli_16(t0, shift), t1);\
32}
33
34static inline void s2p_bytepack(BytePack s[], BitBlock p[]) {
35    BitBlock mask_2 = simd_himask_2;
36    BitBlock mask_4 = simd_himask_4;
37    BitBlock mask_8 = simd_himask_8;
38    BitBlock bit00224466_0, bit00224466_1, bit00224466_2, bit00224466_3;
39    BitBlock bit11335577_0, bit11335577_1, bit11335577_2, bit11335577_3;
40    BitBlock bit00004444_0, bit22226666_0, bit00004444_1, bit22226666_1;
41    BitBlock bit11115555_0, bit33337777_0, bit11115555_1, bit33337777_1;
42#if (BYTE_ORDER == BIG_ENDIAN)
43    s2p_step(s[0], s[1], mask_2, 1, bit00224466_0, bit11335577_0);
44    s2p_step(s[2], s[3], mask_2, 1, bit00224466_1, bit11335577_1);
45    s2p_step(s[4], s[5], mask_2, 1, bit00224466_2, bit11335577_2);
46    s2p_step(s[6], s[7], mask_2, 1, bit00224466_3, bit11335577_3);
47#endif
48#if (BYTE_ORDER == LITTLE_ENDIAN)
49    s2p_step(s[7], s[6], mask_2, 1, bit00224466_0, bit11335577_0);
50    s2p_step(s[5], s[4], mask_2, 1, bit00224466_1, bit11335577_1);
51    s2p_step(s[3], s[2], mask_2, 1, bit00224466_2, bit11335577_2);
52    s2p_step(s[1], s[0], mask_2, 1, bit00224466_3, bit11335577_3);
53#endif
54    s2p_step(bit00224466_0, bit00224466_1, mask_4, 2, bit00004444_0, bit22226666_0);
55    s2p_step(bit00224466_2, bit00224466_3, mask_4, 2, bit00004444_1, bit22226666_1);
56    s2p_step(bit11335577_0, bit11335577_1, mask_4, 2, bit11115555_0, bit33337777_0);
57    s2p_step(bit11335577_2, bit11335577_3, mask_4, 2, bit11115555_1, bit33337777_1);
58    s2p_step(bit00004444_0, bit00004444_1, mask_8, 4, p[0], p[4]);
59    s2p_step(bit11115555_0, bit11115555_1, mask_8, 4, p[1], p[5]);
60    s2p_step(bit22226666_0, bit22226666_1, mask_8, 4, p[2], p[6]);
61    s2p_step(bit33337777_0, bit33337777_1, mask_8, 4, p[3], p[7]);
62}
63
64
65Bitplex::Bitplex () {
66        x8basis = (BitBlockBasis *) simd_new(BUFFER_SIZE/PACKSIZE);
67#ifdef CODE_CLOCKING
68/*
69        transpose_clocker =     register_Code_Clocker("s2p", "transposition to parallel bit streams\n");
70*/
71#endif
72}
73
74Bitplex::~Bitplex() {
75        simd_delete((SIMD_type *) x8basis);
76};
77
78
79
80
81
82void Bitplex::TransposeToBitStreams(BytePack * pseudo_ASCII_stream, int blocks) {
83#ifdef CODE_CLOCKING
84/*
85        start_Interval(transpose_clocker);
86*/
87#endif
88       
89for (int blk = 0; blk < blocks; blk++) {
90        s2p_bytepack(&pseudo_ASCII_stream[blk*8], x8basis[blk].bit);
91}
92       
93#ifdef CODE_CLOCKING
94/*
95        end_Interval(transpose_clocker, BUFFER_SIZE);
96*/
97#endif
98}
99
100
101
102
Note: See TracBrowser for help on using the repository browser.