source: proto/parabix2/template.c @ 467

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

restore template.c

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