source: proto/Compiler/p-workspace/template.c @ 445

Last change on this file since 445 was 445, checked in by ksherdy, 9 years ago

Uncomment BUFFER_PROFILING.

File size: 6.1 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <errno.h>
4#include <sys/types.h>
5#include <sys/stat.h>
6#include "sse_simd.h"
7#define minimum(x,y) ((x) <(y) ?(x) :(y) )  \
8
9
10typedef SIMD_type BytePack;
11typedef SIMD_type BitBlock;
12
13
14#include "perfsec.h"
15#define BUFFER_PROFILING
16#ifdef BUFFER_PROFILING
17BOM_Table * parser_timer;
18#endif
19
20
21#define s2p_step(s0,s1,hi_mask,shift,p0,p1)  \
22{ \
23BitBlock t0,t1; \
24t0= simd_pack_16_hh(s0,s1) ; \
25t1= simd_pack_16_ll(s0,s1) ; \
26p0= simd_if(hi_mask,t0,simd_srli_16(t1,shift) ) ; \
27p1= simd_if(hi_mask,simd_slli_16(t0,shift) ,t1) ; \
28} \
29
30#define s2p_bytepack(s0,s1,s2,s3,s4,s5,s6,s7,p0,p1,p2,p3,p4,p5,p6,p7)  \
31{BitBlock bit00224466_0,bit00224466_1,bit00224466_2,bit00224466_3; \
32BitBlock bit11335577_0,bit11335577_1,bit11335577_2,bit11335577_3; \
33BitBlock bit00004444_0,bit22226666_0,bit00004444_1,bit22226666_1; \
34BitBlock bit11115555_0,bit33337777_0,bit11115555_1,bit33337777_1; \
35s2p_step(s0,s1,simd_himask_2,1,bit00224466_0,bit11335577_0)  \
36s2p_step(s2,s3,simd_himask_2,1,bit00224466_1,bit11335577_1)  \
37s2p_step(s4,s5,simd_himask_2,1,bit00224466_2,bit11335577_2)  \
38s2p_step(s6,s7,simd_himask_2,1,bit00224466_3,bit11335577_3)  \
39s2p_step(bit00224466_0,bit00224466_1,simd_himask_4,2,bit00004444_0,bit22226666_0)  \
40s2p_step(bit00224466_2,bit00224466_3,simd_himask_4,2,bit00004444_1,bit22226666_1)  \
41s2p_step(bit11335577_0,bit11335577_1,simd_himask_4,2,bit11115555_0,bit33337777_0)  \
42s2p_step(bit11335577_2,bit11335577_3,simd_himask_4,2,bit11115555_1,bit33337777_1)  \
43s2p_step(bit00004444_0,bit00004444_1,simd_himask_8,4,p0,p4)  \
44s2p_step(bit11115555_0,bit11115555_1,simd_himask_8,4,p1,p5)  \
45s2p_step(bit22226666_0,bit22226666_1,simd_himask_8,4,p2,p6)  \
46s2p_step(bit33337777_0,bit33337777_1,simd_himask_8,4,p3,p7)  \
47} \
48
49#define p2s_step(p0,p1,hi_mask,shift,s0,s1)  \
50{ \
51BitBlock t0,t1; \
52t0= simd_if(hi_mask,p0,simd_srli_16(p1,shift) ) ; \
53t1= simd_if(hi_mask,simd_slli_16(p0,shift) ,p1) ; \
54s0= simd_mergeh_8(t0,t1) ; \
55s1= simd_mergel_8(t0,t1) ; \
56} \
57
58#define p2s_bytemerge(p0,p1,p2,p3,p4,p5,p6,p7,s0,s1,s2,s3,s4,s5,s6,s7)  \
59{ \
60BitBlock bit00004444_0,bit22226666_0,bit00004444_1,bit22226666_1; \
61BitBlock bit11115555_0,bit33337777_0,bit11115555_1,bit33337777_1; \
62BitBlock bit00224466_0,bit00224466_1,bit00224466_2,bit00224466_3; \
63BitBlock bit11335577_0,bit11335577_1,bit11335577_2,bit11335577_3; \
64p2s_step(p0,p4,simd_himask_8,4,bit00004444_0,bit00004444_1)  \
65p2s_step(p1,p5,simd_himask_8,4,bit11115555_0,bit11115555_1)  \
66p2s_step(p2,p6,simd_himask_8,4,bit22226666_0,bit22226666_1)  \
67p2s_step(p3,p7,simd_himask_8,4,bit33337777_0,bit33337777_1)  \
68p2s_step(bit00004444_0,bit22226666_0,simd_himask_4,2,bit00224466_0,bit00224466_1)  \
69p2s_step(bit11115555_0,bit33337777_0,simd_himask_4,2,bit11335577_0,bit11335577_1)  \
70p2s_step(bit00004444_1,bit22226666_1,simd_himask_4,2,bit00224466_2,bit00224466_3)  \
71p2s_step(bit11115555_1,bit33337777_1,simd_himask_4,2,bit11335577_2,bit11335577_3)  \
72p2s_step(bit00224466_0,bit11335577_0,simd_himask_2,1,s0,s1)  \
73p2s_step(bit00224466_1,bit11335577_1,simd_himask_2,1,s2,s3)  \
74p2s_step(bit00224466_2,bit11335577_2,simd_himask_2,1,s4,s5)  \
75p2s_step(bit00224466_3,bit11335577_3,simd_himask_2,1,s6,s7)  \
76} \
77
78     
79
80       
81#define BUFFER_SIZE 12800   
82#define BLOCK_SIZE 128
83
84void do_process(FILE *infile, FILE *outfile) {
85
86@decl
87
88  BytePack U8[8];
89  int buf_pos = 0;
90  int block_pos = 0;
91  int errpos = 0;
92  int chars_read = 0;
93  int bytes = 0;
94  char * srcbuf;
95  char * srclimit;
96
97
98 
99  srcbuf = (char *) malloc(BUFFER_SIZE+BLOCK_SIZE);
100  if(!srcbuf){
101    printf("Can't allocate srcbuf!\n");
102    exit(-1);
103  }
104 
105  chars_read = fread((void *)srcbuf, 1, BUFFER_SIZE, infile);
106  srclimit = srcbuf + chars_read;
107
108@stream_stmts
109
110  while(chars_read>0){
111
112    PERF_SEC_START(parser_timer);
113       
114    while (&srcbuf[block_pos] < srclimit){
115     
116      bytes = minimum(srclimit-&srcbuf[block_pos],BLOCK_SIZE);
117      if(bytes < BLOCK_SIZE){
118        EOF_mask = sisd_srl(simd_const_1(1),sisd_from_int(BLOCK_SIZE-bytes));
119      }
120      BytePack * U8pack = (BytePack *) &srcbuf[block_pos];
121      U8[0] = sisd_load_unaligned(&U8pack[0]);
122      U8[1] = sisd_load_unaligned(&U8pack[1]);
123      U8[2] = sisd_load_unaligned(&U8pack[2]);
124      U8[3] = sisd_load_unaligned(&U8pack[3]);
125      U8[4] = sisd_load_unaligned(&U8pack[4]);
126      U8[5] = sisd_load_unaligned(&U8pack[5]);
127      U8[6] = sisd_load_unaligned(&U8pack[6]);
128      U8[7] = sisd_load_unaligned(&U8pack[7]); 
129     
130      s2p_bytepack(U8[7], U8[6], U8[5], U8[4], U8[3], U8[2], U8[1], U8[0],
131      array_bit__0_,array_bit__1_,array_bit__2_,array_bit__3_,array_bit__4_,array_bit__5_,array_bit__6_,array_bit__7_);
132
133      array_bit__0_ &= EOF_mask;
134      array_bit__1_ &= EOF_mask;
135      array_bit__2_ &= EOF_mask;
136      array_bit__3_ &= EOF_mask;
137      array_bit__4_ &= EOF_mask;
138      array_bit__5_ &= EOF_mask;
139      array_bit__6_ &= EOF_mask;
140      array_bit__7_ &= EOF_mask;
141
142      @block_stmts
143
144     
145      if (bitblock_has_bit(error_mask)) {
146        errpos = block_pos + buf_pos + count_forward_zeroes(error_mask);
147        fprintf(stderr, "error found at position %i\n",errpos);
148      }
149     
150      block_pos += BLOCK_SIZE;
151      bytes = minimum(srclimit-&srcbuf[block_pos],BLOCK_SIZE);
152    }
153
154    PERF_SEC_END(parser_timer, chars_read);
155
156    buf_pos += chars_read;
157    chars_read = fread((void *)srcbuf, 1, BUFFER_SIZE, infile);
158    block_pos = 0;
159    srclimit = srcbuf + chars_read;
160  }
161  free((void*)srcbuf);
162}
163
164
165
166int
167main(int argc, char * argv[]) {
168        char * infilename, * outfilename;       
169        FILE *infile, *outfile;
170        struct stat fileinfo;
171
172        if (argc < 2) {
173                printf("Usage: %s <filename> [<outputfile>]\n", argv[0]);
174                exit(-1);
175        }
176
177        infilename = argv[1];
178        stat(infilename, &fileinfo);
179        infile = fopen(infilename, "rb");
180        if (!infile) {
181                fprintf(stderr, "Error: cannot open %s for input.\n", infilename);
182                exit(-1);
183        }
184       
185        if (argc < 3) outfile = stdout;
186        else {
187                outfilename = argv[2];
188                outfile = fopen(outfilename, "wb");
189                if (!outfile) {
190                        fprintf(stderr, "Error: cannot open %s for writing.\n", outfilename);
191                        exit(-1);
192                }
193        }
194
195
196        PERF_SEC_INIT(parser_timer);
197
198        do_process(infile, outfile);
199       
200        PERF_SEC_DUMP(parser_timer);
201
202        fclose(infile);
203        fclose(outfile);
204        return(0);
205}
Note: See TracBrowser for help on using the repository browser.