source: proto/FIX/fix_template.cpp @ 4373

Last change on this file since 4373 was 2557, checked in by ksherdy, 7 years ago

Removed CODE_CLOCKER reference.

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