source: proto/parabix2/template.c @ 516

Last change on this file since 516 was 516, checked in by cameron, 9 years ago

Stack-allocated buffer replaces heap-allocated buffer.

File size: 7.6 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 "../lib/lib_simd.h"
7#include "../lib/block_carry.h"
8
9typedef SIMD_type BytePack;
10typedef SIMD_type BitBlock;
11
12#include "xmldecl.h"
13#include "xml_error.c"
14#include "xmldecl.c"
15
16#include "../lib/perflib/perfsec.h"
17
18#ifdef BUFFER_PROFILING
19        BOM_Table * parser_timer;
20
21#elif CODE_CLOCKER
22        #define NUM_EVENTS 1
23        int Events[NUM_EVENTS] = {PAPI_TOT_CYC};
24        //int Events[NUM_EVENTS] = {PAPI_L2_DCM};
25        //int Events[NUM_EVENTS] = {PAPI_TOT_CYC, PAPI_BR_MSP};
26        int cal_size = 20;
27        CC * parser_timer = new CC(Events,NUM_EVENTS,cal_size);
28#else
29        void * parser_timer;
30#endif
31
32#define s2p_step(s0,s1,hi_mask,shift,p0,p1)  \
33{ \
34BitBlock t0,t1; \
35t0= simd_pack_16_hh(s0,s1) ; \
36t1= simd_pack_16_ll(s0,s1) ; \
37p0= simd_if(hi_mask,t0,simd_srli_16(t1,shift) ) ; \
38p1= simd_if(hi_mask,simd_slli_16(t0,shift) ,t1) ; \
39} \
40
41#define s2p_bytepack(s0,s1,s2,s3,s4,s5,s6,s7,p0,p1,p2,p3,p4,p5,p6,p7)  \
42{BitBlock bit00224466_0,bit00224466_1,bit00224466_2,bit00224466_3; \
43BitBlock bit11335577_0,bit11335577_1,bit11335577_2,bit11335577_3; \
44BitBlock bit00004444_0,bit22226666_0,bit00004444_1,bit22226666_1; \
45BitBlock bit11115555_0,bit33337777_0,bit11115555_1,bit33337777_1; \
46s2p_step(s0,s1,simd_himask_2,1,bit00224466_0,bit11335577_0)  \
47s2p_step(s2,s3,simd_himask_2,1,bit00224466_1,bit11335577_1)  \
48s2p_step(s4,s5,simd_himask_2,1,bit00224466_2,bit11335577_2)  \
49s2p_step(s6,s7,simd_himask_2,1,bit00224466_3,bit11335577_3)  \
50s2p_step(bit00224466_0,bit00224466_1,simd_himask_4,2,bit00004444_0,bit22226666_0)  \
51s2p_step(bit00224466_2,bit00224466_3,simd_himask_4,2,bit00004444_1,bit22226666_1)  \
52s2p_step(bit11335577_0,bit11335577_1,simd_himask_4,2,bit11115555_0,bit33337777_0)  \
53s2p_step(bit11335577_2,bit11335577_3,simd_himask_4,2,bit11115555_1,bit33337777_1)  \
54s2p_step(bit00004444_0,bit00004444_1,simd_himask_8,4,p0,p4)  \
55s2p_step(bit11115555_0,bit11115555_1,simd_himask_8,4,p1,p5)  \
56s2p_step(bit22226666_0,bit22226666_1,simd_himask_8,4,p2,p6)  \
57s2p_step(bit33337777_0,bit33337777_1,simd_himask_8,4,p3,p7)  \
58} \
59
60#define p2s_step(p0,p1,hi_mask,shift,s0,s1)  \
61{ \
62BitBlock t0,t1; \
63t0= simd_if(hi_mask,p0,simd_srli_16(p1,shift) ) ; \
64t1= simd_if(hi_mask,simd_slli_16(p0,shift) ,p1) ; \
65s0= simd_mergeh_8(t0,t1) ; \
66s1= simd_mergel_8(t0,t1) ; \
67} \
68
69#define p2s_bytemerge(p0,p1,p2,p3,p4,p5,p6,p7,s0,s1,s2,s3,s4,s5,s6,s7)  \
70{ \
71BitBlock bit00004444_0,bit22226666_0,bit00004444_1,bit22226666_1; \
72BitBlock bit11115555_0,bit33337777_0,bit11115555_1,bit33337777_1; \
73BitBlock bit00224466_0,bit00224466_1,bit00224466_2,bit00224466_3; \
74BitBlock bit11335577_0,bit11335577_1,bit11335577_2,bit11335577_3; \
75p2s_step(p0,p4,simd_himask_8,4,bit00004444_0,bit00004444_1)  \
76p2s_step(p1,p5,simd_himask_8,4,bit11115555_0,bit11115555_1)  \
77p2s_step(p2,p6,simd_himask_8,4,bit22226666_0,bit22226666_1)  \
78p2s_step(p3,p7,simd_himask_8,4,bit33337777_0,bit33337777_1)  \
79p2s_step(bit00004444_0,bit22226666_0,simd_himask_4,2,bit00224466_0,bit00224466_1)  \
80p2s_step(bit11115555_0,bit33337777_0,simd_himask_4,2,bit11335577_0,bit11335577_1)  \
81p2s_step(bit00004444_1,bit22226666_1,simd_himask_4,2,bit00224466_2,bit00224466_3)  \
82p2s_step(bit11115555_1,bit33337777_1,simd_himask_4,2,bit11335577_2,bit11335577_3)  \
83p2s_step(bit00224466_0,bit11335577_0,simd_himask_2,1,s0,s1)  \
84p2s_step(bit00224466_1,bit11335577_1,simd_himask_2,1,s2,s3)  \
85p2s_step(bit00224466_2,bit11335577_2,simd_himask_2,1,s4,s5)  \
86p2s_step(bit00224466_3,bit11335577_3,simd_himask_2,1,s6,s7)  \
87} \
88
89       
90#define BUFFER_SIZE 12800   
91#define BLOCK_SIZE 128
92
93void do_process(FILE *infile, FILE *outfile) {
94
95  @decl
96
97  BytePack U8[8];
98  int buf_pos = 0;
99  int block_pos = 0;
100  int errpos = 0;
101  int chars_read = 0;
102  char srcbuf[BUFFER_SIZE+BLOCK_SIZE];
103 
104  EOF_mask = simd_const_1(1);
105  chars_read = fread((void *)srcbuf, 1, BUFFER_SIZE, infile);
106
107  Entity_Info * e = new Entity_Info;
108  e->AnalyzeSignature((unsigned char *)srcbuf);
109  XML_Decl_Parser<ASCII> decl_parser((unsigned char *)srcbuf);
110
111  decl_parser.ReadXMLInfo(*e);
112
113  if (e->content_start != 0) {
114        memmove(&srcbuf[0], &srcbuf[e->content_start], chars_read - e->content_start);
115        if (chars_read == BUFFER_SIZE) {
116                chars_read = BUFFER_SIZE - e->content_start + 
117                             fread(&srcbuf[BUFFER_SIZE-e->content_start], 1, e->content_start, infile);
118        }
119  }
120 
121  @stream_stmts
122
123  while(chars_read>0){
124
125    PERF_SEC_START(parser_timer);
126
127    if(chars_read < BUFFER_SIZE){
128   
129      while (block_pos < chars_read){
130
131        int bytes = chars_read - block_pos;
132        if(bytes < BLOCK_SIZE){
133          EOF_mask = sisd_srl(simd_const_1(1),sisd_from_int(BLOCK_SIZE-bytes));
134        }
135        BytePack * U8pack = (BytePack *) &srcbuf[block_pos];
136        U8[0] = sisd_load_unaligned(&U8pack[0]);
137        U8[1] = sisd_load_unaligned(&U8pack[1]);
138        U8[2] = sisd_load_unaligned(&U8pack[2]);
139        U8[3] = sisd_load_unaligned(&U8pack[3]);
140        U8[4] = sisd_load_unaligned(&U8pack[4]);
141        U8[5] = sisd_load_unaligned(&U8pack[5]);
142        U8[6] = sisd_load_unaligned(&U8pack[6]);
143        U8[7] = sisd_load_unaligned(&U8pack[7]); 
144       
145        s2p_bytepack(U8[7], U8[6], U8[5], U8[4], U8[3], U8[2], U8[1], U8[0],
146        array_bit__0_,array_bit__1_,array_bit__2_,array_bit__3_,array_bit__4_,array_bit__5_,array_bit__6_,array_bit__7_);
147
148        array_bit__0_ = simd_and(array_bit__0_, EOF_mask);
149        array_bit__1_ = simd_and(array_bit__1_, EOF_mask);
150        array_bit__2_ = simd_and(array_bit__2_, EOF_mask);
151        array_bit__3_ = simd_and(array_bit__3_, EOF_mask);
152        array_bit__4_ = simd_and(array_bit__4_, EOF_mask);
153        array_bit__5_ = simd_and(array_bit__5_, EOF_mask);
154        array_bit__6_ = simd_and(array_bit__6_, EOF_mask);
155        array_bit__7_ = simd_and(array_bit__7_, EOF_mask);
156
157        @block_stmts
158
159        if (bitblock_has_bit(error_mask)) {
160          errpos = block_pos + buf_pos + count_forward_zeroes(error_mask);
161          fprintf(stderr, "error found at position %i\n",errpos);
162          exit(-1);
163        }
164       
165        block_pos += BLOCK_SIZE;
166      }
167    }
168    else{
169      while (block_pos < chars_read){
170
171        BytePack * U8pack = (BytePack *) &srcbuf[block_pos];
172        U8[0] = sisd_load_unaligned(&U8pack[0]);
173        U8[1] = sisd_load_unaligned(&U8pack[1]);
174        U8[2] = sisd_load_unaligned(&U8pack[2]);
175        U8[3] = sisd_load_unaligned(&U8pack[3]);
176        U8[4] = sisd_load_unaligned(&U8pack[4]);
177        U8[5] = sisd_load_unaligned(&U8pack[5]);
178        U8[6] = sisd_load_unaligned(&U8pack[6]);
179        U8[7] = sisd_load_unaligned(&U8pack[7]); 
180       
181        s2p_bytepack(U8[7], U8[6], U8[5], U8[4], U8[3], U8[2], U8[1], U8[0],
182        array_bit__0_,array_bit__1_,array_bit__2_,array_bit__3_,array_bit__4_,array_bit__5_,array_bit__6_,array_bit__7_);
183
184        @block_stmts
185       
186        if (bitblock_has_bit(error_mask)) {
187          errpos = block_pos + buf_pos + count_forward_zeroes(error_mask);
188          fprintf(stderr, "error found at position %i\n",errpos);
189          exit(-1);
190        }
191       
192        block_pos += BLOCK_SIZE;
193      }
194    }
195
196    PERF_SEC_END(parser_timer, chars_read);
197
198    buf_pos += chars_read;
199    chars_read = fread((void *)srcbuf, 1, BUFFER_SIZE, infile);
200    block_pos = 0;
201  }
202}
203
204
205
206int
207main(int argc, char * argv[]) {
208        char * infilename, * outfilename;       
209        FILE *infile, *outfile;
210        struct stat fileinfo;
211
212        if (argc < 2) {
213                printf("Usage: %s <filename> [<outputfile>]\n", argv[0]);
214                exit(-1);
215        }
216
217        infilename = argv[1];
218        stat(infilename, &fileinfo);
219        infile = fopen(infilename, "rb");
220        if (!infile) {
221                fprintf(stderr, "Error: cannot open %s for input.\n", infilename);
222                exit(-1);
223        }
224       
225        if (argc < 3) outfile = stdout;
226        else {
227                outfilename = argv[2];
228                outfile = fopen(outfilename, "wb");
229                if (!outfile) {
230                        fprintf(stderr, "Error: cannot open %s for writing.\n", outfilename);
231                        exit(-1);
232                }
233        }
234
235
236        PERF_SEC_INIT(parser_timer);
237
238        do_process(infile, outfile);
239       
240        PERF_SEC_DUMP(parser_timer);
241       
242        PERF_SEC_DESTROY(parser_timer);
243
244        fclose(infile);
245        fclose(outfile);
246        return(0);
247}
Note: See TracBrowser for help on using the repository browser.