source: proto/JSON/src/json.c @ 791

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

Add Pybit/Pablo? specific commands.

File size: 31.8 KB
Line 
1#include <string.h>
2#include <stdio.h>
3#include <stdlib.h>
4#include <errno.h>
5#include <sys/types.h>
6#include <sys/stat.h>
7
8#include "../lib/lib_simd.h"
9#include "../lib/perflib/perfsec.h"
10#include "../lib/s2p.h"
11#include "../lib/carryQ.h"
12
13typedef SIMD_type BytePack;
14typedef SIMD_type BitBlock;
15
16#define BLOCK_SIZE (sizeof(SIMD_type) * 8)      /* BLOCK_SIZE           - SIMD register in bits */     
17#define BUFFER_SIZE (BLOCK_SIZE * 16)           /* BUFFER_SIZE          - multiple of BLOCK_SIZE */
18#define OVERLAP_BUFSIZE BLOCK_SIZE              /* OVERLAP_BUFSIZE      - SIMD register width in bytes overlap */
19
20#define DEBUG 1
21
22#ifdef BUFFER_PROFILING
23        BOM_Table * perf_timer;
24#elif CODE_CLOCKER
25        #define NUM_EVENTS 1
26        int Events[NUM_EVENTS] = {PAPI_TOT_CYC};
27        //int Events[NUM_EVENTS] = {PAPI_L2_DCM};
28        //int Events[NUM_EVENTS] = {PAPI_TOT_CYC, PAPI_BR_MSP};
29        int cal_size = 20;
30        CC * perf_timer = new CC(Events,NUM_EVENTS,cal_size);
31#else
32        void * perf_timer;
33#endif
34
35void do_process(FILE *infile, FILE *outfile) {
36 
37        /* Compiler generated stream variable declarations. */
38        struct {
39  BitBlock unibyte;
40  BitBlock prefix;
41  BitBlock prefix2;
42  BitBlock prefix3;
43  BitBlock prefix4;
44  BitBlock suffix;
45  BitBlock badprefix;
46  BitBlock xE0;
47  BitBlock xED;
48  BitBlock xF0;
49  BitBlock xF4;
50  BitBlock xA0_xBF;
51  BitBlock x80_x9F;
52  BitBlock x90_xBF;
53  BitBlock x80_x8F;
54  BitBlock xEF;
55  BitBlock xBF;
56  BitBlock xBE;
57  BitBlock scope22;
58  BitBlock scope32;
59  BitBlock scope33;
60  BitBlock scope42;
61  BitBlock scope43;
62  BitBlock scope44;
63  BitBlock error;
64} u8;
65
66struct {
67  BitBlock LCurlyBrace;
68  BitBlock Colon;
69  BitBlock Comma;
70  BitBlock RCurlyBrace;
71  BitBlock LSquareBracket;
72  BitBlock RSquareBracket;
73  BitBlock Number;
74  BitBlock Minus;
75  BitBlock Zero;
76  BitBlock Digit1_9;
77  BitBlock Digit0_9;
78  BitBlock DecimalPoint;
79  BitBlock Ee;
80  BitBlock PlusMinus;
81  BitBlock DQuote;
82  BitBlock RSolidus;
83  BitBlock u;
84  BitBlock Escape;
85  BitBlock HexDigit;
86  BitBlock NotUnescaped;
87  BitBlock WS;
88  BitBlock True;
89  BitBlock t;
90  BitBlock r;
91  BitBlock e;
92  BitBlock False;
93  BitBlock f;
94  BitBlock a;
95  BitBlock l;
96  BitBlock s;
97  BitBlock Null;
98  BitBlock n;
99} Lex;
100
101struct {
102  BitBlock x00_x1F;
103  BitBlock CR;
104  BitBlock LF;
105  BitBlock HT;
106  BitBlock SP;
107} Ctrl;
108
109struct {
110  BitBlock Odd;
111  BitBlock Even;
112  BitBlock ParityMask;
113} Parity;
114
115  BitBlock temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9, temp10;
116  BitBlock temp11, temp12, temp13, temp14, temp15, temp16, temp17, temp18;
117  BitBlock temp19, temp20, temp21, temp22, temp23, temp24, temp25, temp26;
118  BitBlock temp27, temp28, temp29, temp30, temp31, temp32, temp33, temp34;
119  BitBlock temp35, temp36, temp37, temp38, temp39, temp40, temp41, temp42;
120  BitBlock temp43, temp44, temp45, temp46, temp47, temp48, temp49, temp50;
121  BitBlock temp51, temp52, temp53, temp54, temp55, temp56, temp57, temp58;
122  BitBlock temp59, temp60, temp61, temp62, temp63, temp64, temp65, temp66;
123  BitBlock temp67, temp68, temp69, temp70, temp71, temp72, temp73, temp74;
124  BitBlock temp75, temp76, temp77, temp78, temp79, temp80, temp81, temp82;
125  BitBlock temp83, temp84, temp85, temp86, temp87, temp88, temp89, Start;
126  BitBlock EvenStart, EvenFinal, EvenEscape, OddStart, OddFinal, OddEscape;
127  BitBlock Escape, UnescapedDQuotes, StringMask, StringSpans, StringStarts;
128  BitBlock UnmaskedAtomSpans, UnmaskedAtomStarts, NumberStarts, TrueStarts;
129  BitBlock FalseStarts, NullStarts, StringEscapeChars, StringErrors, u, uScope1;
130  BitBlock uScope2, uScope3, uScope4, StringNotEscapedChars, StringCursor;
131  BitBlock StringEnds, M0, M1, E1, M1a, M1b, M2a, M2b, M3b, M4, M4a, M4b, M5b;
132  BitBlock E5b, M6, M7, M7a, M7b, M8b, M9b, E9b, M10b, M11, NumberErrors;
133  BitBlock NumberSpans, TrueScope1, TrueScope2, TrueScope3, TrueErrors;
134  BitBlock TrueFollows, TrueSpans, FalseScope1, FalseScope2, FalseScope3;
135  BitBlock FalseScope4, FalseErrors, FalseFollows, FalseSpans, NullScope1;
136  BitBlock NullScope2, NullScope3, NullErrors, NullFollows, NullSpans;
137  BitBlock AtomStarts, AtomSpans, error_mask;
138CarryDeclare(carryQ, 38);
139
140       
141        // BitBlock error_mask;  // PyBit compiler auto declares this variable
142        BitBlock bit[8];
143        BitBlock EOF_mask = simd_const_1(1);
144       
145        /*extra*/
146        /* parse_escape, do not declare, since the PyBit compiler does so by default*/
147        Parity.Odd = simd_const_2(1);
148        Parity.Even = simd_const_2(2);
149       
150        BitBlock high_bit_mask = sisd_high_bit_mask;   
151        BitBlock high_bit_is_set;
152        // BitBlock ParityMask = simd_const_1(0); // PyBit compiler auto declares this variable
153        BitBlock bitblock_parity_mask; 
154       
155        /* 8 * sizeof(SIMD_type) bytes. */
156        BytePack U8[8];
157       
158        /* Source file data is broken into buffers, buffers are broken into blocks, blocks are SIMD register width. */
159        int src_pos = 0;
160        int buf_pos = 0;
161        int err_pos = 0;
162       
163        BytePack buf[(OVERLAP_BUFSIZE+BUFFER_SIZE+OVERLAP_BUFSIZE)/sizeof(SIMD_type)]; 
164        char * srcbuf = ((char *) buf) + OVERLAP_BUFSIZE;
165        memset((unsigned char *)srcbuf,0,16);
166        memset(((unsigned char *)srcbuf)+BUFFER_SIZE,0,16); /* Zero out first and last sizeof(SIMD_type) bytes. */
167       
168        /* File IO */
169        int chars_avail = 0;
170        int chars_read = 0;
171
172        chars_read = fread((void *)srcbuf, 1, BUFFER_SIZE, infile);
173        chars_avail = chars_read;
174        if(ferror(infile)) { fprintf(stderr, "Error: Failed to read input file.\n"); return; }
175        if(chars_avail==0 && feof(infile)) { return; }
176
177        CarryInit(carryQ, 38);
178
179       
180        while(1) {
181
182                PERF_SEC_START(perf_timer);
183               
184                while (chars_avail >= BLOCK_SIZE) { /* process full blocks */
185
186                        BytePack * U8 = (BytePack *) &srcbuf[buf_pos];
187
188                        s2p(U8[0], U8[1], U8[2], U8[3], U8[4], U8[5], U8[6], U8[7],
189                        bit[0], bit[1], bit[2], bit[3], bit[4], bit[5], bit[6], bit[7]);
190
191                       
192  u8.unibyte = simd_not(bit[0]);
193  u8.prefix = simd_and(bit[0], bit[1]);
194  u8.prefix2 = simd_andc(u8.prefix, bit[2]);
195  temp1 = simd_andc(bit[2], bit[3]);
196  u8.prefix3 = simd_and(u8.prefix, temp1);
197  temp2 = simd_and(bit[2], bit[3]);
198  u8.prefix4 = simd_and(u8.prefix, temp2);
199  u8.suffix = simd_andc(bit[0], bit[1]);
200  temp3 = simd_or(bit[2], bit[3]);
201  temp4 = simd_andc(u8.prefix, temp3);
202  temp5 = simd_or(bit[4], bit[5]);
203  temp6 = simd_or(temp5, bit[6]);
204  temp7 = simd_andc(temp4, temp6);
205  temp8 = simd_or(bit[6], bit[7]);
206  temp9 = simd_and(bit[5], temp8);
207  temp10 = simd_or(bit[4], temp9);
208  temp11 = simd_and(u8.prefix4, temp10);
209  u8.badprefix = simd_or(temp7, temp11);
210  temp12 = simd_or(temp5, temp8);
211  u8.xE0 = simd_andc(u8.prefix3, temp12);
212  temp13 = simd_and(bit[4], bit[5]);
213  temp14 = simd_andc(bit[7], bit[6]);
214  temp15 = simd_and(temp13, temp14);
215  u8.xED = simd_and(u8.prefix3, temp15);
216  u8.xF0 = simd_andc(u8.prefix4, temp12);
217  temp16 = simd_andc(bit[5], bit[4]);
218  temp17 = simd_andc(temp16, temp8);
219  u8.xF4 = simd_and(u8.prefix4, temp17);
220  u8.xA0_xBF = simd_and(u8.suffix, bit[2]);
221  u8.x80_x9F = simd_andc(u8.suffix, bit[2]);
222  u8.x90_xBF = simd_and(u8.suffix, temp3);
223  u8.x80_x8F = simd_andc(u8.suffix, temp3);
224  temp18 = simd_or(bit[0], bit[1]);
225  temp19 = simd_or(temp18, bit[2]);
226  Ctrl.x00_x1F = simd_not(temp19);
227  temp20 = simd_or(temp18, temp3);
228  Ctrl.CR = simd_andc(temp15, temp20);
229  temp21 = simd_andc(bit[4], bit[5]);
230  temp22 = simd_andc(bit[6], bit[7]);
231  temp23 = simd_and(temp21, temp22);
232  Ctrl.LF = simd_andc(temp23, temp20);
233  temp24 = simd_and(temp21, temp14);
234  Ctrl.HT = simd_andc(temp24, temp20);
235  temp25 = simd_andc(temp1, temp18);
236  Ctrl.SP = simd_andc(temp25, temp12);
237  temp26 = simd_andc(bit[1], bit[0]);
238  temp27 = simd_and(temp26, temp2);
239  temp28 = simd_and(bit[6], bit[7]);
240  temp29 = simd_and(temp21, temp28);
241  Lex.LCurlyBrace = simd_and(temp27, temp29);
242  temp30 = simd_andc(temp2, temp18);
243  Lex.Colon = simd_and(temp30, temp23);
244  temp31 = simd_andc(temp13, temp8);
245  Lex.Comma = simd_and(temp25, temp31);
246  Lex.RCurlyBrace = simd_and(temp27, temp15);
247  temp32 = simd_andc(bit[3], bit[2]);
248  temp33 = simd_and(temp26, temp32);
249  Lex.LSquareBracket = simd_and(temp33, temp29);
250  Lex.RSquareBracket = simd_and(temp33, temp15);
251  Lex.Minus = simd_and(temp25, temp15);
252  Lex.Zero = simd_andc(temp30, temp12);
253  temp34 = simd_or(bit[5], bit[6]);
254  temp35 = simd_not(temp34);
255  temp36 = simd_or(bit[5], temp8);
256  temp37 = simd_or(simd_and(bit[4], temp35), simd_andc(temp36, bit[4]));
257  Lex.Digit1_9 = simd_and(temp30, temp37);
258  temp38 = simd_and(bit[4], temp34);
259  Lex.Digit0_9 = simd_andc(temp30, temp38);
260  temp39 = simd_and(temp13, temp22);
261  Lex.DecimalPoint = simd_and(temp25, temp39);
262  temp40 = simd_and(temp16, temp14);
263  temp41 = simd_andc(temp3, temp1);
264  temp42 = simd_andc(temp26, temp41);
265  Lex.Ee = simd_and(temp40, temp42);
266  temp43 = simd_or(temp29, temp15);
267  Lex.PlusMinus = simd_and(temp25, temp43);
268  temp44 = simd_or(Lex.Minus, Lex.Digit0_9);
269  temp45 = simd_or(temp44, Lex.DecimalPoint);
270  temp46 = simd_andc(temp26, temp3);
271  temp47 = simd_and(temp46, temp40);
272  temp48 = simd_or(temp45, temp47);
273  temp49 = simd_and(temp26, temp1);
274  temp50 = simd_and(temp49, temp40);
275  temp51 = simd_or(temp48, temp50);
276  temp52 = simd_and(temp25, temp29);
277  temp53 = simd_or(temp51, temp52);
278  Lex.Number = simd_or(temp53, Lex.Minus);
279  temp54 = simd_andc(temp22, temp5);
280  Lex.DQuote = simd_and(temp25, temp54);
281  Lex.RSolidus = simd_and(temp33, temp31);
282  Lex.u = simd_and(temp27, temp40);
283  temp55 = simd_or(Lex.DQuote, Lex.RSolidus);
284  temp56 = simd_and(temp13, temp28);
285  temp57 = simd_and(temp25, temp56);
286  temp58 = simd_or(temp55, temp57);
287  temp59 = simd_and(temp49, temp54);
288  temp60 = simd_or(temp58, temp59);
289  temp61 = simd_and(temp16, temp22);
290  temp62 = simd_and(temp49, temp61);
291  temp63 = simd_or(temp60, temp62);
292  temp64 = simd_and(temp49, temp39);
293  temp65 = simd_or(temp63, temp64);
294  temp66 = simd_and(temp27, temp54);
295  temp67 = simd_or(temp65, temp66);
296  temp68 = simd_and(temp27, temp17);
297  temp69 = simd_or(temp67, temp68);
298  Lex.Escape = simd_or(temp69, Lex.u);
299  temp70 = simd_andc(temp49, bit[4]);
300  temp71 = simd_not(temp28);
301  temp72 = simd_or(simd_and(bit[5], temp71), simd_andc(temp8, bit[5]));
302  temp73 = simd_and(temp70, temp72);
303  temp74 = simd_or(Lex.Digit0_9, temp73);
304  temp75 = simd_andc(temp46, bit[4]);
305  temp76 = simd_and(temp75, temp72);
306  Lex.HexDigit = simd_or(temp74, temp76);
307  temp77 = simd_or(temp15, temp23);
308  temp78 = simd_or(temp77, temp24);
309  temp79 = simd_andc(temp78, temp20);
310  Lex.WS = simd_or(temp79, Ctrl.SP);
311  Lex.t = simd_and(temp27, temp17);
312  Lex.r = simd_and(temp27, temp54);
313  Lex.e = simd_and(temp49, temp40);
314  temp80 = simd_or(temp17, temp54);
315  temp81 = simd_or(temp80, temp40);
316  temp82 = simd_and(temp27, temp81);
317  Lex.True = simd_or(temp82, Lex.e);
318  Lex.f = simd_and(temp49, temp61);
319  temp83 = simd_andc(temp14, temp5);
320  Lex.a = simd_and(temp49, temp83);
321  Lex.l = simd_and(temp49, temp31);
322  temp84 = simd_andc(temp28, temp5);
323  Lex.s = simd_and(temp27, temp84);
324  temp85 = simd_or(temp61, temp83);
325  temp86 = simd_or(temp85, temp31);
326  temp87 = simd_and(temp49, temp86);
327  temp88 = simd_or(temp87, Lex.s);
328  Lex.False = simd_or(temp88, Lex.e);
329  Lex.n = simd_and(temp49, temp39);
330  temp89 = simd_or(Lex.n, Lex.u);
331  Lex.Null = simd_or(temp89, Lex.l);
332  Start = simd_andc(Lex.RSolidus, BitBlock_advance_ci_co(Lex.RSolidus, carryQ, 0));
333  EvenStart = simd_and(Start, Parity.Even);
334  EvenFinal = simd_andc(BitBlock_add_ci_co(EvenStart, Lex.RSolidus, carryQ, 1), Lex.RSolidus);
335  EvenEscape = simd_and(EvenFinal, Parity.Odd);
336  OddStart = simd_and(Start, Parity.Odd);
337  OddFinal = simd_andc(BitBlock_add_ci_co(OddStart, Lex.RSolidus, carryQ, 2), Lex.RSolidus);
338  OddEscape = simd_and(OddFinal, Parity.Even);
339  Escape = simd_or(EvenEscape, OddEscape);
340  UnescapedDQuotes = simd_andc(Lex.DQuote, Escape);
341  StringMask = simd_and(Parity.ParityMask, BitBlock_advance_ci_co(Parity.ParityMask, carryQ, 3));
342  StringSpans = simd_or(StringMask, UnescapedDQuotes);
343  StringStarts = simd_andc(StringSpans, BitBlock_advance_ci_co(StringSpans, carryQ, 4));
344  UnmaskedAtomSpans = simd_andc(simd_or(simd_or(simd_or(Lex.True, Lex.False), Lex.Null), Lex.Number), StringSpans);
345  UnmaskedAtomStarts = simd_andc(UnmaskedAtomSpans, BitBlock_advance_ci_co(UnmaskedAtomSpans, carryQ, 5));
346  NumberStarts = simd_and(UnmaskedAtomStarts, simd_or(Lex.Minus, Lex.Digit0_9));
347  TrueStarts = simd_and(UnmaskedAtomStarts, Lex.t);
348  FalseStarts = simd_and(UnmaskedAtomStarts, Lex.f);
349  NullStarts = simd_and(UnmaskedAtomStarts, Lex.n);
350  StringEscapeChars = simd_and(Escape, StringMask);
351  StringErrors = simd_andc(StringEscapeChars, Lex.Escape);
352  u = simd_and(StringEscapeChars, Lex.u);
353  uScope1 = BitBlock_advance_ci_co(u, carryQ, 6);
354  uScope2 = BitBlock_advance_ci_co(uScope1, carryQ, 7);
355  uScope3 = BitBlock_advance_ci_co(uScope2, carryQ, 8);
356  uScope4 = BitBlock_advance_ci_co(uScope3, carryQ, 9);
357  StringErrors = simd_or(StringErrors, simd_andc(uScope1, Lex.HexDigit));
358  StringErrors = simd_or(StringErrors, simd_andc(uScope2, Lex.HexDigit));
359  StringErrors = simd_or(StringErrors, simd_andc(uScope3, Lex.HexDigit));
360  StringErrors = simd_or(StringErrors, simd_andc(uScope4, Lex.HexDigit));
361  StringNotEscapedChars = simd_andc(StringMask, simd_or(Escape, Lex.RSolidus));
362  StringErrors = simd_or(StringErrors, simd_and(StringNotEscapedChars, Ctrl.x00_x1F));
363  StringCursor = BitBlock_advance_ci_co(StringStarts, carryQ, 10);
364  StringEnds = BitBlock_scanthru_ci_co(StringCursor, StringMask, carryQ, 11);
365  StringErrors = simd_or(StringErrors, simd_andc(StringEnds, UnescapedDQuotes));
366  M0 = NumberStarts;
367  M1 = BitBlock_scanthru_ci_co(M0, simd_and(Lex.Minus, M0), carryQ, 12);
368  E1 = simd_andc(M1, simd_or(Lex.Zero, Lex.Digit1_9));
369  M1 = simd_andc(M1, E1);
370  M1a = simd_and(M1, Lex.Zero);
371  M1b = simd_and(M1, Lex.Digit1_9);
372  M2a = BitBlock_advance_ci_co(M1a, carryQ, 13);
373  M2b = BitBlock_advance_ci_co(M1b, carryQ, 14);
374  M3b = BitBlock_scanthru_ci_co(M2b, Lex.Digit0_9, carryQ, 15);
375  M4 = simd_or(M2a, M3b);
376  M4a = simd_andc(M4, Lex.DecimalPoint);
377  M4b = simd_and(M4, Lex.DecimalPoint);
378  M5b = BitBlock_advance_ci_co(M4b, carryQ, 16);
379  E5b = simd_andc(M5b, Lex.Digit0_9);
380  M5b = simd_andc(M5b, E5b);
381  M6 = BitBlock_scanthru_ci_co(M5b, Lex.Digit0_9, carryQ, 17);
382  M7 = simd_or(M4a, M6);
383  M7a = simd_andc(M7, Lex.Ee);
384  M7b = simd_and(M7, Lex.Ee);
385  M8b = BitBlock_advance_ci_co(M7b, carryQ, 18);
386  M9b = BitBlock_scanthru_ci_co(M8b, simd_and(Lex.PlusMinus, M8b), carryQ, 19);
387  E9b = simd_andc(M9b, Lex.Digit0_9);
388  M9b = simd_andc(M9b, E9b);
389  M10b = BitBlock_scanthru_ci_co(M9b, Lex.Digit0_9, carryQ, 20);
390  M11 = simd_or(simd_or(simd_or(simd_or(E1, E5b), E9b), M7a), M10b);
391  NumberErrors = simd_or(simd_or(E1, E5b), E9b);
392  NumberSpans = BitBlock_sub_ci_co(M11, M0, carryQ, 21);
393  TrueScope1 = BitBlock_advance_ci_co(TrueStarts, carryQ, 22);
394  TrueScope2 = BitBlock_advance_ci_co(TrueScope1, carryQ, 23);
395  TrueScope3 = BitBlock_advance_ci_co(TrueScope2, carryQ, 24);
396  TrueErrors = simd_andc(TrueScope1, Lex.r);
397  TrueErrors = simd_or(TrueErrors, simd_andc(TrueScope2, Lex.u));
398  TrueErrors = simd_or(TrueErrors, simd_andc(TrueScope3, Lex.e));
399  TrueFollows = BitBlock_advance_ci_co(TrueScope3, carryQ, 25);
400  TrueSpans = BitBlock_sub_ci_co(TrueFollows, TrueStarts, carryQ, 26);
401  FalseScope1 = BitBlock_advance_ci_co(FalseStarts, carryQ, 27);
402  FalseScope2 = BitBlock_advance_ci_co(FalseScope1, carryQ, 28);
403  FalseScope3 = BitBlock_advance_ci_co(FalseScope2, carryQ, 29);
404  FalseScope4 = BitBlock_advance_ci_co(FalseScope3, carryQ, 30);
405  FalseErrors = simd_andc(FalseScope1, Lex.a);
406  FalseErrors = simd_or(FalseErrors, simd_andc(FalseScope2, Lex.l));
407  FalseErrors = simd_or(FalseErrors, simd_andc(FalseScope3, Lex.s));
408  FalseErrors = simd_or(FalseErrors, simd_andc(FalseScope4, Lex.e));
409  FalseFollows = BitBlock_advance_ci_co(FalseScope4, carryQ, 31);
410  FalseSpans = BitBlock_sub_ci_co(FalseFollows, FalseStarts, carryQ, 32);
411  NullScope1 = BitBlock_advance_ci_co(NullStarts, carryQ, 33);
412  NullScope2 = BitBlock_advance_ci_co(NullScope1, carryQ, 34);
413  NullScope3 = BitBlock_advance_ci_co(NullScope2, carryQ, 35);
414  NullErrors = simd_or(NullErrors, simd_andc(NullScope1, Lex.u));
415  NullErrors = simd_or(NullErrors, simd_andc(NullScope2, Lex.l));
416  NullErrors = simd_or(NullErrors, simd_andc(NullScope3, Lex.l));
417  NullFollows = BitBlock_advance_ci_co(NullScope3, carryQ, 36);
418  NullSpans = BitBlock_sub_ci_co(NullFollows, NullStarts, carryQ, 37);
419  AtomStarts = simd_or(simd_or(simd_or(simd_or(StringStarts, NumberStarts), TrueStarts), FalseStarts), NullStarts);
420  AtomSpans = simd_or(simd_or(simd_or(simd_or(StringSpans, NumberSpans), TrueSpans), FalseSpans), NullSpans);
421  error_mask = simd_or(simd_or(simd_or(simd_or(StringErrors, NumberErrors), TrueErrors), FalseErrors), NullErrors);
422  CarryQ_Adjust(carryQ, 38);
423
424                        /* Generate Parity Mask */
425                        high_bit_mask = sisd_high_bit_mask;
426                        high_bit_is_set = simd_and(high_bit_mask, bitblock_parity_mask);                       
427                        bitblock_parity_mask = sisd_add( simd_not(sisd_srl(high_bit_is_set, sisd_from_int(BLOCK_SIZE-1))) , sisd_low_bit_mask);                                         
428                        Parity.ParityMask = bitblock_parallel_prefix_parity(UnescapedDQuotes, bitblock_parity_mask);
429                       
430                        #ifdef DEBUG
431                       
432                        print_array_le("Data", &srcbuf[buf_pos],BLOCK_SIZE);
433                        print_simd_register("Escape", Escape);
434                        print_simd_register("Unescaped DQuote",UnescapedDQuotes);
435                        /*
436                        print_simd_register("high_bit_is_set", high_bit_is_set);
437                        print_simd_register("high_bit_mask", high_bit_mask);
438                        */
439                        print_simd_register("Parity.ParityMask", Parity.ParityMask);
440                        print_simd_register("StringMask", StringMask);
441                        print_simd_register("StringSpans", StringSpans);                                               
442               
443                        print_simd_register("AtomStarts", AtomStarts);
444                        print_simd_register("StringStarts", StringStarts);
445                        print_simd_register("NumberStarts", NumberStarts);
446                        print_simd_register("TrueStarts", TrueStarts);
447                        print_simd_register("FalseStarts", FalseStarts);
448                        print_simd_register("NullStarts", NullStarts);
449                        print_simd_register("AtomSpans", AtomSpans);
450                        print_simd_register("ErrorMask", error_mask);
451                                               
452                        #endif
453                       
454                        if (bitblock_has_bit(error_mask)){
455                                err_pos = src_pos + buf_pos + count_forward_zeroes(error_mask) + 1;
456                                fprintf(stderr, "Error at position %i.\n", err_pos);
457                                exit(-1);
458                        }
459
460                        chars_avail -= BLOCK_SIZE;
461                        buf_pos += BLOCK_SIZE;
462                }               
463               
464                if(chars_avail > 0 /* || any_carry */) { /* process final partial block */
465                        /* extra */
466                        EOF_mask = sisd_srl(simd_const_1(1),sisd_from_int(BLOCK_SIZE-chars_avail));
467                                               
468                        BytePack * U8 = (BytePack *) &srcbuf[buf_pos];
469                       
470                        s2p(U8[0], U8[1], U8[2], U8[3], U8[4], U8[5], U8[6], U8[7],
471                        bit[0], bit[1], bit[2], bit[3], bit[4], bit[5], bit[6], bit[7]);
472
473                        bit[0] = simd_and(bit[0], EOF_mask);
474                        bit[1] = simd_and(bit[1], EOF_mask);
475                        bit[2] = simd_and(bit[2], EOF_mask);
476                        bit[3] = simd_and(bit[3], EOF_mask);
477                        bit[4] = simd_and(bit[4], EOF_mask);
478                        bit[5] = simd_and(bit[5], EOF_mask);
479                        bit[6] = simd_and(bit[6], EOF_mask);
480                        bit[7] = simd_and(bit[7], EOF_mask);
481                       
482                       
483  u8.unibyte = simd_not(bit[0]);
484  u8.prefix = simd_and(bit[0], bit[1]);
485  u8.prefix2 = simd_andc(u8.prefix, bit[2]);
486  temp1 = simd_andc(bit[2], bit[3]);
487  u8.prefix3 = simd_and(u8.prefix, temp1);
488  temp2 = simd_and(bit[2], bit[3]);
489  u8.prefix4 = simd_and(u8.prefix, temp2);
490  u8.suffix = simd_andc(bit[0], bit[1]);
491  temp3 = simd_or(bit[2], bit[3]);
492  temp4 = simd_andc(u8.prefix, temp3);
493  temp5 = simd_or(bit[4], bit[5]);
494  temp6 = simd_or(temp5, bit[6]);
495  temp7 = simd_andc(temp4, temp6);
496  temp8 = simd_or(bit[6], bit[7]);
497  temp9 = simd_and(bit[5], temp8);
498  temp10 = simd_or(bit[4], temp9);
499  temp11 = simd_and(u8.prefix4, temp10);
500  u8.badprefix = simd_or(temp7, temp11);
501  temp12 = simd_or(temp5, temp8);
502  u8.xE0 = simd_andc(u8.prefix3, temp12);
503  temp13 = simd_and(bit[4], bit[5]);
504  temp14 = simd_andc(bit[7], bit[6]);
505  temp15 = simd_and(temp13, temp14);
506  u8.xED = simd_and(u8.prefix3, temp15);
507  u8.xF0 = simd_andc(u8.prefix4, temp12);
508  temp16 = simd_andc(bit[5], bit[4]);
509  temp17 = simd_andc(temp16, temp8);
510  u8.xF4 = simd_and(u8.prefix4, temp17);
511  u8.xA0_xBF = simd_and(u8.suffix, bit[2]);
512  u8.x80_x9F = simd_andc(u8.suffix, bit[2]);
513  u8.x90_xBF = simd_and(u8.suffix, temp3);
514  u8.x80_x8F = simd_andc(u8.suffix, temp3);
515  temp18 = simd_or(bit[0], bit[1]);
516  temp19 = simd_or(temp18, bit[2]);
517  Ctrl.x00_x1F = simd_not(temp19);
518  temp20 = simd_or(temp18, temp3);
519  Ctrl.CR = simd_andc(temp15, temp20);
520  temp21 = simd_andc(bit[4], bit[5]);
521  temp22 = simd_andc(bit[6], bit[7]);
522  temp23 = simd_and(temp21, temp22);
523  Ctrl.LF = simd_andc(temp23, temp20);
524  temp24 = simd_and(temp21, temp14);
525  Ctrl.HT = simd_andc(temp24, temp20);
526  temp25 = simd_andc(temp1, temp18);
527  Ctrl.SP = simd_andc(temp25, temp12);
528  temp26 = simd_andc(bit[1], bit[0]);
529  temp27 = simd_and(temp26, temp2);
530  temp28 = simd_and(bit[6], bit[7]);
531  temp29 = simd_and(temp21, temp28);
532  Lex.LCurlyBrace = simd_and(temp27, temp29);
533  temp30 = simd_andc(temp2, temp18);
534  Lex.Colon = simd_and(temp30, temp23);
535  temp31 = simd_andc(temp13, temp8);
536  Lex.Comma = simd_and(temp25, temp31);
537  Lex.RCurlyBrace = simd_and(temp27, temp15);
538  temp32 = simd_andc(bit[3], bit[2]);
539  temp33 = simd_and(temp26, temp32);
540  Lex.LSquareBracket = simd_and(temp33, temp29);
541  Lex.RSquareBracket = simd_and(temp33, temp15);
542  Lex.Minus = simd_and(temp25, temp15);
543  Lex.Zero = simd_andc(temp30, temp12);
544  temp34 = simd_or(bit[5], bit[6]);
545  temp35 = simd_not(temp34);
546  temp36 = simd_or(bit[5], temp8);
547  temp37 = simd_or(simd_and(bit[4], temp35), simd_andc(temp36, bit[4]));
548  Lex.Digit1_9 = simd_and(temp30, temp37);
549  temp38 = simd_and(bit[4], temp34);
550  Lex.Digit0_9 = simd_andc(temp30, temp38);
551  temp39 = simd_and(temp13, temp22);
552  Lex.DecimalPoint = simd_and(temp25, temp39);
553  temp40 = simd_and(temp16, temp14);
554  temp41 = simd_andc(temp3, temp1);
555  temp42 = simd_andc(temp26, temp41);
556  Lex.Ee = simd_and(temp40, temp42);
557  temp43 = simd_or(temp29, temp15);
558  Lex.PlusMinus = simd_and(temp25, temp43);
559  temp44 = simd_or(Lex.Minus, Lex.Digit0_9);
560  temp45 = simd_or(temp44, Lex.DecimalPoint);
561  temp46 = simd_andc(temp26, temp3);
562  temp47 = simd_and(temp46, temp40);
563  temp48 = simd_or(temp45, temp47);
564  temp49 = simd_and(temp26, temp1);
565  temp50 = simd_and(temp49, temp40);
566  temp51 = simd_or(temp48, temp50);
567  temp52 = simd_and(temp25, temp29);
568  temp53 = simd_or(temp51, temp52);
569  Lex.Number = simd_or(temp53, Lex.Minus);
570  temp54 = simd_andc(temp22, temp5);
571  Lex.DQuote = simd_and(temp25, temp54);
572  Lex.RSolidus = simd_and(temp33, temp31);
573  Lex.u = simd_and(temp27, temp40);
574  temp55 = simd_or(Lex.DQuote, Lex.RSolidus);
575  temp56 = simd_and(temp13, temp28);
576  temp57 = simd_and(temp25, temp56);
577  temp58 = simd_or(temp55, temp57);
578  temp59 = simd_and(temp49, temp54);
579  temp60 = simd_or(temp58, temp59);
580  temp61 = simd_and(temp16, temp22);
581  temp62 = simd_and(temp49, temp61);
582  temp63 = simd_or(temp60, temp62);
583  temp64 = simd_and(temp49, temp39);
584  temp65 = simd_or(temp63, temp64);
585  temp66 = simd_and(temp27, temp54);
586  temp67 = simd_or(temp65, temp66);
587  temp68 = simd_and(temp27, temp17);
588  temp69 = simd_or(temp67, temp68);
589  Lex.Escape = simd_or(temp69, Lex.u);
590  temp70 = simd_andc(temp49, bit[4]);
591  temp71 = simd_not(temp28);
592  temp72 = simd_or(simd_and(bit[5], temp71), simd_andc(temp8, bit[5]));
593  temp73 = simd_and(temp70, temp72);
594  temp74 = simd_or(Lex.Digit0_9, temp73);
595  temp75 = simd_andc(temp46, bit[4]);
596  temp76 = simd_and(temp75, temp72);
597  Lex.HexDigit = simd_or(temp74, temp76);
598  temp77 = simd_or(temp15, temp23);
599  temp78 = simd_or(temp77, temp24);
600  temp79 = simd_andc(temp78, temp20);
601  Lex.WS = simd_or(temp79, Ctrl.SP);
602  Lex.t = simd_and(temp27, temp17);
603  Lex.r = simd_and(temp27, temp54);
604  Lex.e = simd_and(temp49, temp40);
605  temp80 = simd_or(temp17, temp54);
606  temp81 = simd_or(temp80, temp40);
607  temp82 = simd_and(temp27, temp81);
608  Lex.True = simd_or(temp82, Lex.e);
609  Lex.f = simd_and(temp49, temp61);
610  temp83 = simd_andc(temp14, temp5);
611  Lex.a = simd_and(temp49, temp83);
612  Lex.l = simd_and(temp49, temp31);
613  temp84 = simd_andc(temp28, temp5);
614  Lex.s = simd_and(temp27, temp84);
615  temp85 = simd_or(temp61, temp83);
616  temp86 = simd_or(temp85, temp31);
617  temp87 = simd_and(temp49, temp86);
618  temp88 = simd_or(temp87, Lex.s);
619  Lex.False = simd_or(temp88, Lex.e);
620  Lex.n = simd_and(temp49, temp39);
621  temp89 = simd_or(Lex.n, Lex.u);
622  Lex.Null = simd_or(temp89, Lex.l);
623  Start = simd_andc(Lex.RSolidus, BitBlock_advance_ci_co(Lex.RSolidus, carryQ, 0));
624  EvenStart = simd_and(Start, Parity.Even);
625  EvenFinal = simd_andc(BitBlock_add_ci_co(EvenStart, Lex.RSolidus, carryQ, 1), Lex.RSolidus);
626  EvenEscape = simd_and(EvenFinal, Parity.Odd);
627  OddStart = simd_and(Start, Parity.Odd);
628  OddFinal = simd_andc(BitBlock_add_ci_co(OddStart, Lex.RSolidus, carryQ, 2), Lex.RSolidus);
629  OddEscape = simd_and(OddFinal, Parity.Even);
630  Escape = simd_or(EvenEscape, OddEscape);
631  UnescapedDQuotes = simd_andc(Lex.DQuote, Escape);
632  StringMask = simd_and(Parity.ParityMask, BitBlock_advance_ci_co(Parity.ParityMask, carryQ, 3));
633  StringSpans = simd_or(StringMask, UnescapedDQuotes);
634  StringStarts = simd_andc(StringSpans, BitBlock_advance_ci_co(StringSpans, carryQ, 4));
635  UnmaskedAtomSpans = simd_andc(simd_or(simd_or(simd_or(Lex.True, Lex.False), Lex.Null), Lex.Number), StringSpans);
636  UnmaskedAtomStarts = simd_andc(UnmaskedAtomSpans, BitBlock_advance_ci_co(UnmaskedAtomSpans, carryQ, 5));
637  NumberStarts = simd_and(UnmaskedAtomStarts, simd_or(Lex.Minus, Lex.Digit0_9));
638  TrueStarts = simd_and(UnmaskedAtomStarts, Lex.t);
639  FalseStarts = simd_and(UnmaskedAtomStarts, Lex.f);
640  NullStarts = simd_and(UnmaskedAtomStarts, Lex.n);
641  StringEscapeChars = simd_and(Escape, StringMask);
642  StringErrors = simd_andc(StringEscapeChars, Lex.Escape);
643  u = simd_and(StringEscapeChars, Lex.u);
644  uScope1 = BitBlock_advance_ci_co(u, carryQ, 6);
645  uScope2 = BitBlock_advance_ci_co(uScope1, carryQ, 7);
646  uScope3 = BitBlock_advance_ci_co(uScope2, carryQ, 8);
647  uScope4 = BitBlock_advance_ci_co(uScope3, carryQ, 9);
648  StringErrors = simd_or(StringErrors, simd_andc(uScope1, Lex.HexDigit));
649  StringErrors = simd_or(StringErrors, simd_andc(uScope2, Lex.HexDigit));
650  StringErrors = simd_or(StringErrors, simd_andc(uScope3, Lex.HexDigit));
651  StringErrors = simd_or(StringErrors, simd_andc(uScope4, Lex.HexDigit));
652  StringNotEscapedChars = simd_andc(StringMask, simd_or(Escape, Lex.RSolidus));
653  StringErrors = simd_or(StringErrors, simd_and(StringNotEscapedChars, Ctrl.x00_x1F));
654  StringCursor = BitBlock_advance_ci_co(StringStarts, carryQ, 10);
655  StringEnds = BitBlock_scanthru_ci_co(StringCursor, StringMask, carryQ, 11);
656  StringErrors = simd_or(StringErrors, simd_andc(StringEnds, UnescapedDQuotes));
657  M0 = NumberStarts;
658  M1 = BitBlock_scanthru_ci_co(M0, simd_and(Lex.Minus, M0), carryQ, 12);
659  E1 = simd_andc(M1, simd_or(Lex.Zero, Lex.Digit1_9));
660  M1 = simd_andc(M1, E1);
661  M1a = simd_and(M1, Lex.Zero);
662  M1b = simd_and(M1, Lex.Digit1_9);
663  M2a = BitBlock_advance_ci_co(M1a, carryQ, 13);
664  M2b = BitBlock_advance_ci_co(M1b, carryQ, 14);
665  M3b = BitBlock_scanthru_ci_co(M2b, Lex.Digit0_9, carryQ, 15);
666  M4 = simd_or(M2a, M3b);
667  M4a = simd_andc(M4, Lex.DecimalPoint);
668  M4b = simd_and(M4, Lex.DecimalPoint);
669  M5b = BitBlock_advance_ci_co(M4b, carryQ, 16);
670  E5b = simd_andc(M5b, Lex.Digit0_9);
671  M5b = simd_andc(M5b, E5b);
672  M6 = BitBlock_scanthru_ci_co(M5b, Lex.Digit0_9, carryQ, 17);
673  M7 = simd_or(M4a, M6);
674  M7a = simd_andc(M7, Lex.Ee);
675  M7b = simd_and(M7, Lex.Ee);
676  M8b = BitBlock_advance_ci_co(M7b, carryQ, 18);
677  M9b = BitBlock_scanthru_ci_co(M8b, simd_and(Lex.PlusMinus, M8b), carryQ, 19);
678  E9b = simd_andc(M9b, Lex.Digit0_9);
679  M9b = simd_andc(M9b, E9b);
680  M10b = BitBlock_scanthru_ci_co(M9b, Lex.Digit0_9, carryQ, 20);
681  M11 = simd_or(simd_or(simd_or(simd_or(E1, E5b), E9b), M7a), M10b);
682  NumberErrors = simd_or(simd_or(E1, E5b), E9b);
683  NumberSpans = BitBlock_sub_ci_co(M11, M0, carryQ, 21);
684  TrueScope1 = BitBlock_advance_ci_co(TrueStarts, carryQ, 22);
685  TrueScope2 = BitBlock_advance_ci_co(TrueScope1, carryQ, 23);
686  TrueScope3 = BitBlock_advance_ci_co(TrueScope2, carryQ, 24);
687  TrueErrors = simd_andc(TrueScope1, Lex.r);
688  TrueErrors = simd_or(TrueErrors, simd_andc(TrueScope2, Lex.u));
689  TrueErrors = simd_or(TrueErrors, simd_andc(TrueScope3, Lex.e));
690  TrueFollows = BitBlock_advance_ci_co(TrueScope3, carryQ, 25);
691  TrueSpans = BitBlock_sub_ci_co(TrueFollows, TrueStarts, carryQ, 26);
692  FalseScope1 = BitBlock_advance_ci_co(FalseStarts, carryQ, 27);
693  FalseScope2 = BitBlock_advance_ci_co(FalseScope1, carryQ, 28);
694  FalseScope3 = BitBlock_advance_ci_co(FalseScope2, carryQ, 29);
695  FalseScope4 = BitBlock_advance_ci_co(FalseScope3, carryQ, 30);
696  FalseErrors = simd_andc(FalseScope1, Lex.a);
697  FalseErrors = simd_or(FalseErrors, simd_andc(FalseScope2, Lex.l));
698  FalseErrors = simd_or(FalseErrors, simd_andc(FalseScope3, Lex.s));
699  FalseErrors = simd_or(FalseErrors, simd_andc(FalseScope4, Lex.e));
700  FalseFollows = BitBlock_advance_ci_co(FalseScope4, carryQ, 31);
701  FalseSpans = BitBlock_sub_ci_co(FalseFollows, FalseStarts, carryQ, 32);
702  NullScope1 = BitBlock_advance_ci_co(NullStarts, carryQ, 33);
703  NullScope2 = BitBlock_advance_ci_co(NullScope1, carryQ, 34);
704  NullScope3 = BitBlock_advance_ci_co(NullScope2, carryQ, 35);
705  NullErrors = simd_or(NullErrors, simd_andc(NullScope1, Lex.u));
706  NullErrors = simd_or(NullErrors, simd_andc(NullScope2, Lex.l));
707  NullErrors = simd_or(NullErrors, simd_andc(NullScope3, Lex.l));
708  NullFollows = BitBlock_advance_ci_co(NullScope3, carryQ, 36);
709  NullSpans = BitBlock_sub_ci_co(NullFollows, NullStarts, carryQ, 37);
710  AtomStarts = simd_or(simd_or(simd_or(simd_or(StringStarts, NumberStarts), TrueStarts), FalseStarts), NullStarts);
711  AtomSpans = simd_or(simd_or(simd_or(simd_or(StringSpans, NumberSpans), TrueSpans), FalseSpans), NullSpans);
712  error_mask = simd_or(simd_or(simd_or(simd_or(StringErrors, NumberErrors), TrueErrors), FalseErrors), NullErrors);
713  CarryQ_Adjust(carryQ, 38);
714                       
715                        /* Generate Parity Mask */
716                        high_bit_mask = sisd_srl(sisd_high_bit_mask, sisd_from_int(BLOCK_SIZE-chars_avail));
717                        high_bit_is_set = simd_and(high_bit_mask, bitblock_parity_mask);
718                        bitblock_parity_mask = sisd_add(simd_not(sisd_srl(high_bit_is_set, sisd_from_int(chars_avail-1))) , sisd_low_bit_mask);                 
719                        Parity.ParityMask = bitblock_parallel_prefix_parity(UnescapedDQuotes, bitblock_parity_mask);
720                        Parity.ParityMask = simd_and(Parity.ParityMask, EOF_mask);
721                       
722                        #ifdef DEBUG
723                       
724                        print_array_le("Data", &srcbuf[buf_pos],BLOCK_SIZE);
725                        print_simd_register("Escape", Escape);
726                        print_simd_register("Unescaped DQuote",UnescapedDQuotes);
727                        /*
728                        print_simd_register("high_bit_is_set", high_bit_is_set);
729                        print_simd_register("high_bit_mask", high_bit_mask);
730                        */
731                        print_simd_register("Parity.ParityMask", Parity.ParityMask);
732                        print_simd_register("StringMask", StringMask);
733                        print_simd_register("StringSpans", StringSpans);                                               
734               
735                        print_simd_register("AtomStarts", AtomStarts);
736                        print_simd_register("StringStarts", StringStarts);
737                        print_simd_register("NumberStarts", NumberStarts);
738                        print_simd_register("TrueStarts", TrueStarts);
739                        print_simd_register("FalseStarts", FalseStarts);
740                        print_simd_register("NullStarts", NullStarts);
741                        print_simd_register("AtomSpans", AtomSpans);
742                        print_simd_register("ErrorMask", error_mask);                   
743                       
744                        #endif
745                       
746                        if(bitblock_has_bit(error_mask)) {
747                                err_pos = src_pos + buf_pos + count_forward_zeroes(error_mask) + 1;
748                                fprintf(stderr, "Error at position %i.\n", err_pos);
749                                exit(-1);
750                        }
751                }
752               
753                PERF_SEC_END(perf_timer, chars_avail);
754
755                src_pos += chars_read;
756                buf_pos = 0;
757
758                chars_read = fread((void *)srcbuf, 1, BUFFER_SIZE, infile);
759                chars_avail = chars_read;
760                if(ferror(infile)) { fprintf(stderr, "Failed to read input file.\n"); return; }
761                if(chars_avail==0 && feof(infile)) { return; } 
762        }
763}
764
765int main(int argc, char * argv[]) {
766        char * infilename, * outfilename;       
767        FILE *infile, *outfile;
768        struct stat fileinfo;
769
770        if (argc < 2) {
771                printf("Usage: %s <filename> [<outputfile>]\n", argv[0]);
772                exit(-1);
773        }
774
775        infilename = argv[1];
776        stat(infilename, &fileinfo);
777        infile = fopen(infilename, "rb");
778        if (!infile) {
779                fprintf(stderr, "Error: Cannot open %s for reading.\n", infilename);
780                exit(-1);
781        }
782       
783        if (argc < 3) {
784                outfile = stdout;
785        }       else {
786                outfilename = argv[2];
787                outfile = fopen(outfilename, "wb");
788                if (!outfile) {
789                        fprintf(stderr, "Error: Cannot open %s for writing.\n", outfilename);
790                        exit(-1);
791                }
792        }
793
794        // PERF_SEC_BIND(1);
795
796        PERF_SEC_INIT(perf_timer);
797
798        do_process(infile, outfile);
799       
800        PERF_SEC_DUMP(perf_timer);
801       
802        PERF_SEC_DESTROY(perf_timer);
803
804        fclose(infile);
805        fclose(outfile);
806       
807        return(0);
808}
Note: See TracBrowser for help on using the repository browser.