source: proto/CSV/csv2xml/standalone/pablo_api.hpp @ 3383

Last change on this file since 3383 was 3383, checked in by linmengl, 6 years ago

first version of standalone PabloAPI

File size: 8.4 KB
Line 
1namespace PabloAPI
2{
3        // global
4          struct Basis_bits {
5  BitBlock bit_0;
6  BitBlock bit_1;
7  BitBlock bit_2;
8  BitBlock bit_3;
9  BitBlock bit_4;
10  BitBlock bit_5;
11  BitBlock bit_6;
12  BitBlock bit_7;
13};
14
15  struct Lex {
16  BitBlock BackSlash;
17  BitBlock DQuote;
18  BitBlock SQuote;
19  BitBlock CR;
20  BitBlock LF;
21  BitBlock Comma;
22  BitBlock Period;
23  BitBlock HT;
24  BitBlock AndSymbol;
25};
26
27  struct Marker {
28  BitBlock delim;
29  BitBlock quote;
30  BitBlock quote_mask;
31  BitBlock escape;
32  BitBlock eol;
33  BitBlock hide;
34};
35
36  struct Classify_bytes {
37 
38  IDISA_INLINE void do_block(Basis_bits & basis_bits, Lex & lex) {
39                BitBlock temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9, temp10;
40                BitBlock temp11, temp12, temp13, temp14, temp15, temp16, temp17, temp18;
41                BitBlock temp19, temp20, temp21, temp22, temp23, temp24;
42
43
44
45
46        temp1 = simd_andc(basis_bits.bit_1, basis_bits.bit_0);
47        temp2 = simd_andc(basis_bits.bit_3, basis_bits.bit_2);
48        temp3 = simd_and(temp1, temp2);
49        temp4 = simd_and(basis_bits.bit_4, basis_bits.bit_5);
50        temp5 = simd_or(basis_bits.bit_6, basis_bits.bit_7);
51        temp6 = simd_andc(temp4, temp5);
52        lex.BackSlash = simd_and(temp3, temp6);
53        temp7 = simd_or(basis_bits.bit_0, basis_bits.bit_1);
54        temp8 = simd_andc(basis_bits.bit_2, basis_bits.bit_3);
55        temp9 = simd_andc(temp8, temp7);
56        temp10 = simd_or(basis_bits.bit_4, basis_bits.bit_5);
57        temp11 = simd_andc(basis_bits.bit_6, basis_bits.bit_7);
58        temp12 = simd_andc(temp11, temp10);
59        lex.DQuote = simd_and(temp9, temp12);
60        temp13 = simd_andc(basis_bits.bit_5, basis_bits.bit_4);
61        temp14 = simd_and(basis_bits.bit_6, basis_bits.bit_7);
62        temp15 = simd_and(temp13, temp14);
63        lex.SQuote = simd_and(temp9, temp15);
64        temp16 = simd_or(basis_bits.bit_2, basis_bits.bit_3);
65        temp17 = simd_or(temp7, temp16);
66        temp18 = simd_andc(basis_bits.bit_7, basis_bits.bit_6);
67        temp19 = simd_and(temp4, temp18);
68        lex.CR = simd_andc(temp19, temp17);
69        temp20 = simd_andc(basis_bits.bit_4, basis_bits.bit_5);
70        temp21 = simd_and(temp20, temp11);
71        lex.LF = simd_andc(temp21, temp17);
72        lex.Comma = simd_and(temp9, temp6);
73        temp22 = simd_and(temp20, temp18);
74        lex.HT = simd_andc(temp22, temp17);
75        temp23 = simd_and(temp4, temp11);
76        lex.Period = simd_and(temp9, temp23);
77        temp24 = simd_and(temp13, temp11);
78        lex.AndSymbol = simd_and(temp9, temp24);
79  }
80  void do_final_block(Basis_bits & basis_bits, Lex & lex, BitBlock EOF_mask) {
81                BitBlock temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9, temp10;
82                BitBlock temp11, temp12, temp13, temp14, temp15, temp16, temp17, temp18;
83                BitBlock temp19, temp20, temp21, temp22, temp23, temp24;
84
85
86
87
88        temp1 = simd_andc(basis_bits.bit_1, basis_bits.bit_0);
89        temp2 = simd_andc(basis_bits.bit_3, basis_bits.bit_2);
90        temp3 = simd_and(temp1, temp2);
91        temp4 = simd_and(basis_bits.bit_4, basis_bits.bit_5);
92        temp5 = simd_or(basis_bits.bit_6, basis_bits.bit_7);
93        temp6 = simd_andc(temp4, temp5);
94        lex.BackSlash = simd_and(temp3, temp6);
95        temp7 = simd_or(basis_bits.bit_0, basis_bits.bit_1);
96        temp8 = simd_andc(basis_bits.bit_2, basis_bits.bit_3);
97        temp9 = simd_andc(temp8, temp7);
98        temp10 = simd_or(basis_bits.bit_4, basis_bits.bit_5);
99        temp11 = simd_andc(basis_bits.bit_6, basis_bits.bit_7);
100        temp12 = simd_andc(temp11, temp10);
101        lex.DQuote = simd_and(temp9, temp12);
102        temp13 = simd_andc(basis_bits.bit_5, basis_bits.bit_4);
103        temp14 = simd_and(basis_bits.bit_6, basis_bits.bit_7);
104        temp15 = simd_and(temp13, temp14);
105        lex.SQuote = simd_and(temp9, temp15);
106        temp16 = simd_or(basis_bits.bit_2, basis_bits.bit_3);
107        temp17 = simd_or(temp7, temp16);
108        temp18 = simd_andc(basis_bits.bit_7, basis_bits.bit_6);
109        temp19 = simd_and(temp4, temp18);
110        lex.CR = simd_andc(temp19, temp17);
111        temp20 = simd_andc(basis_bits.bit_4, basis_bits.bit_5);
112        temp21 = simd_and(temp20, temp11);
113        lex.LF = simd_andc(temp21, temp17);
114        lex.Comma = simd_and(temp9, temp6);
115        temp22 = simd_and(temp20, temp18);
116        lex.HT = simd_andc(temp22, temp17);
117        temp23 = simd_and(temp4, temp11);
118        lex.Period = simd_and(temp9, temp23);
119        temp24 = simd_and(temp13, temp11);
120        lex.AndSymbol = simd_and(temp9, temp24);
121  }
122 
123  };
124
125  struct Parse_marker {
126  Parse_marker() { 
127 }
128  IDISA_INLINE void do_block(Lex & lex, Marker & marker) {
129                BitBlock odd, even, start, even_start, even_final, escape, odd_start;
130                BitBlock odd_final;
131
132                BitBlock tempvar0, tempvar1;
133
134
135        odd = Simd_const_odd;
136        even = Simd_const_even;
137        carryQ.cq[0] = bitblock::srli<127>(pablo_blk_Advance(lex.BackSlash, carryQ.get_carry_in(0), tempvar0));
138        start = simd_andc(lex.BackSlash, tempvar0);
139        even_start = simd_and(start, even);
140        carryQ.cq[1] = bitblock::srli<127>(pablo_blk_ScanThru(even_start, lex.BackSlash, carryQ.get_carry_in(1), even_final));
141        escape = simd_and(even_final, odd);
142        odd_start = simd_and(start, odd);
143        carryQ.cq[2] = bitblock::srli<127>(pablo_blk_ScanThru(odd_start, lex.BackSlash, carryQ.get_carry_in(2), odd_final));
144        marker.escape = simd_or(escape, simd_and(odd_final, even));
145        marker.quote = simd_andc(lex.DQuote, marker.escape);
146        marker.quote_mask = parse_quote_mask(marker.quote);
147        if (bitblock::any(FlipSignal)) {
148          marker.quote_mask = simd_not(marker.quote_mask);
149        }
150        if (bitblock::any(UseTabSignal)) {
151          marker.delim = simd_andc(simd_andc(lex.HT, escape), marker.quote_mask);
152        }
153        else {
154          marker.delim = simd_andc(simd_andc(lex.Comma, escape), marker.quote_mask);
155        }
156        marker.eol = simd_andc(simd_or(lex.CR, lex.LF), marker.quote_mask);
157        carryQ.cq[3] = bitblock::srli<127>(pablo_blk_Advance(lex.CR, carryQ.get_carry_in(3), tempvar1));
158        marker.hide = simd_or(marker.quote, simd_andc(simd_and(tempvar1, lex.LF), marker.quote_mask));
159        marker.eol = simd_andc(marker.eol, marker.hide);
160        carryQ.CarryQ_Adjust(4);
161  }
162  void do_final_block(Lex & lex, Marker & marker, BitBlock EOF_mask) {
163                BitBlock odd, even, start, even_start, even_final, escape, odd_start;
164                BitBlock odd_final;
165
166                BitBlock tempvar0, tempvar1;
167
168
169        odd = Simd_const_odd;
170        even = Simd_const_even;
171        carryQ.cq[0] = bitblock::srli<127>(pablo_blk_Advance(lex.BackSlash, carryQ.get_carry_in(0), tempvar0));
172        start = simd_andc(lex.BackSlash, tempvar0);
173        even_start = simd_and(start, even);
174        carryQ.cq[1] = bitblock::srli<127>(pablo_blk_ScanThru(even_start, lex.BackSlash, carryQ.get_carry_in(1), even_final));
175        escape = simd_and(even_final, odd);
176        odd_start = simd_and(start, odd);
177        carryQ.cq[2] = bitblock::srli<127>(pablo_blk_ScanThru(odd_start, lex.BackSlash, carryQ.get_carry_in(2), odd_final));
178        marker.escape = simd_or(escape, simd_and(odd_final, even));
179        marker.quote = simd_andc(lex.DQuote, marker.escape);
180        marker.quote_mask = parse_quote_mask(marker.quote);
181        if (bitblock::any(FlipSignal)) {
182          marker.quote_mask = simd_not(marker.quote_mask);
183        }
184        if (bitblock::any(UseTabSignal)) {
185          marker.delim = simd_andc(simd_andc(lex.HT, escape), marker.quote_mask);
186        }
187        else {
188          marker.delim = simd_andc(simd_andc(lex.Comma, escape), marker.quote_mask);
189        }
190        marker.eol = simd_andc(simd_or(lex.CR, lex.LF), marker.quote_mask);
191        carryQ.cq[3] = bitblock::srli<127>(pablo_blk_Advance(lex.CR, carryQ.get_carry_in(3), tempvar1));
192        marker.hide = simd_or(marker.quote, simd_andc(simd_and(tempvar1, lex.LF), marker.quote_mask));
193        marker.eol = simd_andc(marker.eol, marker.hide);
194  }
195  CarryArray<4, 0> carryQ;
196  };
197
198
199
200        // decl
201          struct Basis_bits basis_bits;
202
203  struct Lex lex;
204
205  struct Marker marker;
206
207
208
209
210        // stream_stmts
211          Classify_bytes classify_bytes;
212  Parse_marker parse_marker;
213
214
215        static inline void do_block_stmts()
216        {
217                //block_stmts
218               
219  classify_bytes.do_block(basis_bits, lex);
220  parse_marker.do_block(lex, marker);           
221        }
222
223        static inline void do_final_block_stmts()
224        {
225                //final_block_stmts
226               
227  classify_bytes.do_final_block(basis_bits, lex, EOF_mask);
228  parse_marker.do_final_block(lex, marker, EOF_mask);           
229        }
230
231        static inline bool any_carry()
232        {
233                return (0 || parse_marker.carryQ.CarryTest(0, 4));
234        }
235}
Note: See TracBrowser for help on using the repository browser.