source: proto/parabix2/template.c @ 494

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

Fix case for void * parser_timer.

File size: 7.7 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;
103
104 
105  srcbuf = (char *) malloc(BUFFER_SIZE+BLOCK_SIZE);
106  if(!srcbuf){
107    printf("Can't allocate srcbuf!\n");
108    exit(-1);
109  }
110 
111  EOF_mask = simd_const_1(1);
112  chars_read = fread((void *)srcbuf, 1, BUFFER_SIZE, infile);
113
114  Entity_Info * e = new Entity_Info;
115  e->AnalyzeSignature((unsigned char *)srcbuf);
116  XML_Decl_Parser<ASCII> decl_parser((unsigned char *)srcbuf);
117
118  decl_parser.ReadXMLInfo(*e);
119
120  if (e->content_start != 0) {
121        memmove(&srcbuf[0], &srcbuf[e->content_start], chars_read - e->content_start);
122        if (chars_read == BUFFER_SIZE) {
123                chars_read = BUFFER_SIZE - e->content_start + 
124                             fread(&srcbuf[BUFFER_SIZE-e->content_start], 1, e->content_start, infile);
125        }
126  }
127 
128  @stream_stmts
129
130  while(chars_read>0){
131
132    PERF_SEC_START(parser_timer);
133
134    if(chars_read < BUFFER_SIZE){
135   
136      while (block_pos < chars_read){
137
138        int bytes = chars_read - block_pos;
139        if(bytes < BLOCK_SIZE){
140          EOF_mask = sisd_srl(simd_const_1(1),sisd_from_int(BLOCK_SIZE-bytes));
141        }
142        BytePack * U8pack = (BytePack *) &srcbuf[block_pos];
143        U8[0] = sisd_load_unaligned(&U8pack[0]);
144        U8[1] = sisd_load_unaligned(&U8pack[1]);
145        U8[2] = sisd_load_unaligned(&U8pack[2]);
146        U8[3] = sisd_load_unaligned(&U8pack[3]);
147        U8[4] = sisd_load_unaligned(&U8pack[4]);
148        U8[5] = sisd_load_unaligned(&U8pack[5]);
149        U8[6] = sisd_load_unaligned(&U8pack[6]);
150        U8[7] = sisd_load_unaligned(&U8pack[7]); 
151       
152        s2p_bytepack(U8[7], U8[6], U8[5], U8[4], U8[3], U8[2], U8[1], U8[0],
153        array_bit__0_,array_bit__1_,array_bit__2_,array_bit__3_,array_bit__4_,array_bit__5_,array_bit__6_,array_bit__7_);
154
155        array_bit__0_ = simd_and(array_bit__0_, EOF_mask);
156        array_bit__1_ = simd_and(array_bit__1_, EOF_mask);
157        array_bit__2_ = simd_and(array_bit__2_, EOF_mask);
158        array_bit__3_ = simd_and(array_bit__3_, EOF_mask);
159        array_bit__4_ = simd_and(array_bit__4_, EOF_mask);
160        array_bit__5_ = simd_and(array_bit__5_, EOF_mask);
161        array_bit__6_ = simd_and(array_bit__6_, EOF_mask);
162        array_bit__7_ = simd_and(array_bit__7_, EOF_mask);
163
164        @block_stmts
165
166        if (bitblock_has_bit(error_mask)) {
167          errpos = block_pos + buf_pos + count_forward_zeroes(error_mask);
168          fprintf(stderr, "error found at position %i\n",errpos);
169          exit(-1);
170        }
171       
172        block_pos += BLOCK_SIZE;
173      }
174    }
175    else{
176      while (block_pos < chars_read){
177
178        BytePack * U8pack = (BytePack *) &srcbuf[block_pos];
179        U8[0] = sisd_load_unaligned(&U8pack[0]);
180        U8[1] = sisd_load_unaligned(&U8pack[1]);
181        U8[2] = sisd_load_unaligned(&U8pack[2]);
182        U8[3] = sisd_load_unaligned(&U8pack[3]);
183        U8[4] = sisd_load_unaligned(&U8pack[4]);
184        U8[5] = sisd_load_unaligned(&U8pack[5]);
185        U8[6] = sisd_load_unaligned(&U8pack[6]);
186        U8[7] = sisd_load_unaligned(&U8pack[7]); 
187       
188        s2p_bytepack(U8[7], U8[6], U8[5], U8[4], U8[3], U8[2], U8[1], U8[0],
189        array_bit__0_,array_bit__1_,array_bit__2_,array_bit__3_,array_bit__4_,array_bit__5_,array_bit__6_,array_bit__7_);
190
191        @block_stmts
192       
193        if (bitblock_has_bit(error_mask)) {
194          errpos = block_pos + buf_pos + count_forward_zeroes(error_mask);
195          fprintf(stderr, "error found at position %i\n",errpos);
196          exit(-1);
197        }
198       
199        block_pos += BLOCK_SIZE;
200      }
201    }
202
203    PERF_SEC_END(parser_timer, chars_read);
204
205    buf_pos += chars_read;
206    chars_read = fread((void *)srcbuf, 1, BUFFER_SIZE, infile);
207    block_pos = 0;
208  }
209  free((void*)srcbuf);
210}
211
212
213
214int
215main(int argc, char * argv[]) {
216        char * infilename, * outfilename;       
217        FILE *infile, *outfile;
218        struct stat fileinfo;
219
220        if (argc < 2) {
221                printf("Usage: %s <filename> [<outputfile>]\n", argv[0]);
222                exit(-1);
223        }
224
225        infilename = argv[1];
226        stat(infilename, &fileinfo);
227        infile = fopen(infilename, "rb");
228        if (!infile) {
229                fprintf(stderr, "Error: cannot open %s for input.\n", infilename);
230                exit(-1);
231        }
232       
233        if (argc < 3) outfile = stdout;
234        else {
235                outfilename = argv[2];
236                outfile = fopen(outfilename, "wb");
237                if (!outfile) {
238                        fprintf(stderr, "Error: cannot open %s for writing.\n", outfilename);
239                        exit(-1);
240                }
241        }
242
243
244        PERF_SEC_INIT(parser_timer);
245
246        do_process(infile, outfile);
247       
248        PERF_SEC_DUMP(parser_timer);
249       
250        PERF_SEC_DESTROY(parser_timer);
251
252        fclose(infile);
253        fclose(outfile);
254        return(0);
255}
Note: See TracBrowser for help on using the repository browser.