source: proto/FIX/fix_template.cpp @ 1314

Last change on this file since 1314 was 1314, checked in by cameron, 8 years ago

Fixes

File size: 5.6 KB
RevLine 
[1313]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
8#define BLOCK_SIZE (sizeof(SIMD_type) * 8)
9#define SEGMENT_BLOCKS 12
10#define BUFFER_SIZE (BLOCK_SIZE * SEGMENT_BLOCKS)
11#define OVERLAP_BUFSIZE (sizeof(SIMD_type))
12
13typedef long ScanBlock;
14typedef SIMD_type BytePack;
15typedef SIMD_type BitBlock;
16
17#include "../lib/carryQ.h"
18
19#include "../lib/perflib/perfsec.h"
20#include "../lib/s2p.h"
21
22#ifdef BUFFER_PROFILING
23        BOM_Table * parser_timer;
24
25#elif CODE_CLOCKER
26        #define NUM_EVENTS 1
27        int Events[NUM_EVENTS] = {PAPI_TOT_CYC};
28        //int Events[NUM_EVENTS] = {PAPI_L2_DCM};
29        //int Events[NUM_EVENTS] = {PAPI_TOT_CYC, PAPI_BR_MSP};
30        int cal_size = 20;
31        CC * parser_timer = new CC(Events,NUM_EVENTS,cal_size);
32#else
33        void * parser_timer;
34#endif
35
36int block_base=0;
37int buffer_base=0;
38int buffer_last;
39char * source;
40
41
42static inline void ReportError(const char * error_msg, int error_pos_in_block) {
43  fprintf(stderr, "%s at position %i\n", error_msg, block_base + error_pos_in_block);
44}
45
46class ErrorTracker {
47public:
48        ErrorTracker() { noted_pos_in_block = -1;}
49
50        inline void NoteError(const char * error_msg, BitBlock err_strm) {
51          int pos_in_block = count_forward_zeroes(err_strm);
52          if ((noted_pos_in_block == -1) || (noted_pos_in_block > pos_in_block)) {
53            noted_pos_in_block = pos_in_block;
54            noted_error = error_msg;
55          }
56        }
57
58        inline void If_Error_Report_First() {
59          if (noted_pos_in_block > -1) {
60                  int error_line, error_column;
61                  ReportError(noted_error, noted_pos_in_block);
62                  exit(-1);
63          }
64        }
65 
66private:
67  const char * noted_error;
68  int noted_pos_in_block;       
69};
70
71
72BitBlock EOF_mask = simd_const_1(1);
73
74ErrorTracker error_tracker;
75
76
77
78@global
79
80static inline void s2p_do_block(BytePack U8[], Basis_bits & basis_bits) {
81  s2p(U8[0], U8[1], U8[2], U8[3], U8[4], U8[5], U8[6], U8[7],
82        basis_bits.bit_0, basis_bits.bit_1, basis_bits.bit_2, basis_bits.bit_3, basis_bits.bit_4, basis_bits.bit_5, basis_bits.bit_6, basis_bits.bit_7);
83}
84
85static inline void s2p_do_final_block(BytePack U8[], Basis_bits & basis_bits, BitBlock EOF_mask) {
86  s2p_do_block(U8, basis_bits);
87  basis_bits.bit_0 = simd_and(basis_bits.bit_0, EOF_mask);
88  basis_bits.bit_1 = simd_and(basis_bits.bit_1, EOF_mask);
89  basis_bits.bit_2 = simd_and(basis_bits.bit_2, EOF_mask);
90  basis_bits.bit_3 = simd_and(basis_bits.bit_3, EOF_mask);
91  basis_bits.bit_4 = simd_and(basis_bits.bit_4, EOF_mask);
92  basis_bits.bit_5 = simd_and(basis_bits.bit_5, EOF_mask);
93  basis_bits.bit_6 = simd_and(basis_bits.bit_6, EOF_mask);
94  basis_bits.bit_7 = simd_and(basis_bits.bit_7, EOF_mask);
95}
96
97static inline void postprocess_do_block(Fix_lex & fix_lex, Fix_callout & Fix_callout, int chars_avail){
98
99}
100
101void do_process(FILE *infile, FILE *outfile) {
102
103@decl
104
105  int buf_pos = 0;
106  int block_pos = 0;
107  int errpos = 0;
108  int chars_avail = 0;
109  int check_pos = 0;
110  int chars_read = 0;
111  BytePack buf[(BUFFER_SIZE+BLOCK_SIZE+OVERLAP_BUFSIZE*2)/sizeof(SIMD_type)];
112
113  char * srcbuf = ((char *) buf) + OVERLAP_BUFSIZE;
114  buffer_base = buf_pos;
115  source = srcbuf;
116
117  chars_read = fread((void *)srcbuf, 1, BUFFER_SIZE + OVERLAP_BUFSIZE, infile);
118  chars_avail = chars_read;
119  if (chars_avail > BUFFER_SIZE) chars_avail = BUFFER_SIZE;
120
121
122@stream_stmts
123
124/* Full Buffers */
125
126    while (chars_avail == BUFFER_SIZE) {
127      PERF_SEC_START(parser_timer);
128      for (int blk = 0; blk < SEGMENT_BLOCKS; blk++) {
129          block_base = blk*BLOCK_SIZE;
130          s2p_do_block((BytePack *) &srcbuf[block_base], basis_bits);
131          @block_stmts
[1314]132          postprocess_do_block(fix_lex, fix_callout, chars_avail);
[1313]133      }
134      PERF_SEC_END(parser_timer, chars_avail);
135           
136      int bytes_left = chars_read - chars_avail;
137      memmove(srcbuf, &srcbuf[BUFFER_SIZE], bytes_left);
138      chars_read = fread(&srcbuf[bytes_left],1, BUFFER_SIZE + OVERLAP_BUFSIZE - bytes_left, infile) + bytes_left;
139      chars_avail = chars_read;
140      if (chars_avail > BUFFER_SIZE) chars_avail = BUFFER_SIZE;
141      buf_pos += chars_avail;
142      buffer_base = buf_pos;
143    }
144/* Final Partial Buffer */
145    PERF_SEC_START(parser_timer);
146
147    block_pos = 0;
148    int remaining = chars_avail;
149/* Full Blocks */
150    while (remaining >= BLOCK_SIZE) {
151          block_base = block_pos;
152          s2p_do_block((BytePack *) &srcbuf[block_pos], basis_bits);
153          @block_stmts
[1314]154          postprocess_do_block(fix_lex, fix_callout, chars_avail);
[1313]155          block_pos += BLOCK_SIZE;
156          remaining -= BLOCK_SIZE;
157    }
158    block_base = block_pos;
159    if (remaining > 0 || @any_carry) {
160          EOF_mask = sisd_srl(simd_const_1(1),sisd_from_int(BLOCK_SIZE-remaining));
161          s2p_do_final_block((BytePack *) &srcbuf[block_pos], basis_bits, EOF_mask);
162          @final_block_stmts
[1314]163          postprocess_do_block(fix_lex, fix_callout, chars_avail);
[1313]164    }
165    buf_pos += chars_avail;
166    buffer_base = buf_pos;
167
168
169    PERF_SEC_END(parser_timer, chars_avail);
170}
171
172
173
174int
175main(int argc, char * argv[]) {
176        char * infilename, * outfilename;
177        FILE *infile, *outfile;
178        struct stat fileinfo;
179
180        if (argc < 2) {
181                printf("Usage: %s <filename> [<outputfile>]\n", argv[0]);
182                exit(-1);
183        }
184
185        infilename = argv[1];
186        stat(infilename, &fileinfo);
187        infile = fopen(infilename, "rb");
188        if (!infile) {
189                fprintf(stderr, "Error: cannot open %s for input.\n", infilename);
190                exit(-1);
191        }
192
193        if (argc < 3) outfile = stdout;
194        else {
195                outfilename = argv[2];
196                outfile = fopen(outfilename, "wb");
197                if (!outfile) {
198                        fprintf(stderr, "Error: cannot open %s for writing.\n", outfilename);
199                        exit(-1);
200                }
201        }
202
203//      PERF_SEC_BIND(1);
204
205        PERF_SEC_INIT(parser_timer);
206
207        do_process(infile, outfile);
208
209        PERF_SEC_DUMP(parser_timer);
210
211        PERF_SEC_DESTROY(parser_timer);
212
213        fclose(infile);
214        fclose(outfile);
215        return(0);
216}
Note: See TracBrowser for help on using the repository browser.