source: proto/FIX/fix_template.cpp @ 1466

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

Centralized typedefs.

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