source: trunk/symtab/markers.hpp @ 3937

Last change on this file since 3937 was 1929, checked in by ksherdy, 8 years ago

Updated identity symbol table.

File size: 6.1 KB
Line 
1#ifndef MARKERS_TEMPLATE_HPP
2#define MARKERS_TEMPLATE_HPP
3#include "../lib/bitblock.hpp"
4#include "../lib/carryQ.hpp"
5
6  struct Markers {
7  BitBlock spans;
8  BitBlock starts;
9  BitBlock ends;
10};
11
12  struct Generate_markers {
13  Generate_markers() { 
14 }
15  void do_block(Markers & markers) {
16
17
18
19        markers.starts = simd_andc(markers.spans, carryQ.BitBlock_advance_ci_co(markers.spans, 0));
20         print_register<BitBlock>("markers.starts", markers.starts);
21        markers.ends = simd_andc(carryQ.BitBlock_advance_ci_co(markers.spans, 1), markers.spans);
22         print_register<BitBlock>("markers.ends", markers.ends);
23        carryQ.CarryQ_Adjust(2);
24  }
25  void do_final_block(Markers & markers, BitBlock EOF_mask) {
26
27
28
29        markers.starts = simd_andc(markers.spans, carryQ.BitBlock_advance_ci_co(markers.spans, 0));
30         print_register<BitBlock>("markers.starts", markers.starts);
31        markers.ends = simd_andc(carryQ.BitBlock_advance_ci_co(markers.spans, 1), markers.spans);
32         print_register<BitBlock>("markers.ends", markers.ends);
33  }
34  void do_segment(Markers markers[]) {
35  int i;
36  for (i = 0; i < SEGMENT_BLOCKS; i++)
37    do_block(markers[i]);
38  }
39  CarryArray<2> carryQ;
40  };
41
42  struct Classify_markers {
43 
44  void do_block(Basis_bits & basis_bits, Markers & markers) {
45                BitBlock temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9, temp10;
46                BitBlock temp11, temp12, temp13, temp14, temp15, temp16;
47
48
49        temp1 = simd_and(basis_bits.bit_6, basis_bits.bit_7);
50         print_register<BitBlock>("temp1", temp1);
51        temp2 = simd_or(basis_bits.bit_5, temp1);
52         print_register<BitBlock>("temp2", temp2);
53        temp3 = simd_and(basis_bits.bit_4, temp2);
54         print_register<BitBlock>("temp3", temp3);
55        temp4 = simd_not(temp3);
56         print_register<BitBlock>("temp4", temp4);
57        temp5 = simd_or(basis_bits.bit_4, basis_bits.bit_5);
58         print_register<BitBlock>("temp5", temp5);
59        temp6 = simd_or(basis_bits.bit_6, basis_bits.bit_7);
60         print_register<BitBlock>("temp6", temp6);
61        temp7 = simd_or(temp5, temp6);
62         print_register<BitBlock>("temp7", temp7);
63        temp8 = simd_or(simd_and(basis_bits.bit_3, temp4), simd_andc(temp7, basis_bits.bit_3));
64         print_register<BitBlock>("temp8", temp8);
65        temp9 = simd_andc(basis_bits.bit_1, basis_bits.bit_0);
66         print_register<BitBlock>("temp9", temp9);
67        temp10 = simd_and(temp8, temp9);
68         print_register<BitBlock>("temp10", temp10);
69        temp11 = simd_or(basis_bits.bit_0, basis_bits.bit_1);
70         print_register<BitBlock>("temp11", temp11);
71        temp12 = simd_and(basis_bits.bit_2, basis_bits.bit_3);
72         print_register<BitBlock>("temp12", temp12);
73        temp13 = simd_andc(temp12, temp11);
74         print_register<BitBlock>("temp13", temp13);
75        temp14 = simd_or(basis_bits.bit_5, basis_bits.bit_6);
76         print_register<BitBlock>("temp14", temp14);
77        temp15 = simd_and(basis_bits.bit_4, temp14);
78         print_register<BitBlock>("temp15", temp15);
79        temp16 = simd_andc(temp13, temp15);
80         print_register<BitBlock>("temp16", temp16);
81        markers.spans = simd_or(temp10, temp16);
82         print_register<BitBlock>("markers.spans", markers.spans);
83  }
84  void do_final_block(Basis_bits & basis_bits, Markers & markers, BitBlock EOF_mask) {
85                BitBlock temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9, temp10;
86                BitBlock temp11, temp12, temp13, temp14, temp15, temp16;
87
88
89        temp1 = simd_and(basis_bits.bit_6, basis_bits.bit_7);
90         print_register<BitBlock>("temp1", temp1);
91        temp2 = simd_or(basis_bits.bit_5, temp1);
92         print_register<BitBlock>("temp2", temp2);
93        temp3 = simd_and(basis_bits.bit_4, temp2);
94         print_register<BitBlock>("temp3", temp3);
95        temp4 = simd_not(temp3);
96         print_register<BitBlock>("temp4", temp4);
97        temp5 = simd_or(basis_bits.bit_4, basis_bits.bit_5);
98         print_register<BitBlock>("temp5", temp5);
99        temp6 = simd_or(basis_bits.bit_6, basis_bits.bit_7);
100         print_register<BitBlock>("temp6", temp6);
101        temp7 = simd_or(temp5, temp6);
102         print_register<BitBlock>("temp7", temp7);
103        temp8 = simd_or(simd_and(basis_bits.bit_3, temp4), simd_andc(temp7, basis_bits.bit_3));
104         print_register<BitBlock>("temp8", temp8);
105        temp9 = simd_andc(basis_bits.bit_1, basis_bits.bit_0);
106         print_register<BitBlock>("temp9", temp9);
107        temp10 = simd_and(temp8, temp9);
108         print_register<BitBlock>("temp10", temp10);
109        temp11 = simd_or(basis_bits.bit_0, basis_bits.bit_1);
110         print_register<BitBlock>("temp11", temp11);
111        temp12 = simd_and(basis_bits.bit_2, basis_bits.bit_3);
112         print_register<BitBlock>("temp12", temp12);
113        temp13 = simd_andc(temp12, temp11);
114         print_register<BitBlock>("temp13", temp13);
115        temp14 = simd_or(basis_bits.bit_5, basis_bits.bit_6);
116         print_register<BitBlock>("temp14", temp14);
117        temp15 = simd_and(basis_bits.bit_4, temp14);
118         print_register<BitBlock>("temp15", temp15);
119        temp16 = simd_andc(temp13, temp15);
120         print_register<BitBlock>("temp16", temp16);
121        markers.spans = simd_or(temp10, temp16);
122         print_register<BitBlock>("markers.spans", markers.spans);
123  }
124  void do_segment(Basis_bits basis_bits[], Markers markers[]) {
125  int i;
126  for (i = 0; i < SEGMENT_BLOCKS; i++)
127    do_block(basis_bits[i], markers[i]);
128  }
129 
130  };
131
132
133
134  Generate_markers generate_markers;
135  Classify_markers classify_markers;
136
137
138static IDISA_ALWAYS_INLINE void markers_do_block(Basis_bits & basis_bits, BitBlock & starts, BitBlock & ends) {
139          struct Markers markers;
140
141
142       
143  classify_markers.do_block(basis_bits, markers);
144  generate_markers.do_block(markers);
145        starts = markers.starts;
146        ends = markers.ends;
147}
148
149static IDISA_ALWAYS_INLINE void markers_do_final_block(Basis_bits & basis_bits , BitBlock & starts, BitBlock & ends, BitBlock & EOF_mask) {
150          struct Markers markers;
151
152
153       
154  classify_markers.do_final_block(basis_bits, markers, EOF_mask);
155  generate_markers.do_final_block(markers, EOF_mask);
156
157        starts = markers.starts;
158        ends = markers.ends;
159}
160
161#endif // MARKERS_TEMPLATE_HPP
Note: See TracBrowser for help on using the repository browser.