source: proto/parabix2/Compiler/template.c @ 351

Last change on this file since 351 was 351, checked in by eamiri, 9 years ago

REAMDME updated
subtraction macro added to template

File size: 4.8 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <errno.h>
4#include "sse_simd.h"
5
6
7typedef SIMD_type BytePack;
8typedef SIMD_type BitBlock;
9
10
11// Profiling
12
13#ifdef BUFFER_PROFILING
14#include "../Profiling/BOM_Profiler.c"
15BOM_Table * transcode_timer;
16#endif
17
18
19#define s2p_step(s0,s1,hi_mask,shift,p0,p1)  \
20{ \
21BitBlock t0,t1; \
22t0= simd_pack_16_hh(s0,s1) ; \
23t1= simd_pack_16_ll(s0,s1) ; \
24p0= simd_if(hi_mask,t0,simd_srli_16(t1,shift) ) ; \
25p1= simd_if(hi_mask,simd_slli_16(t0,shift) ,t1) ; \
26} \
27
28#define s2p_bytepack(s0,s1,s2,s3,s4,s5,s6,s7,p0,p1,p2,p3,p4,p5,p6,p7)  \
29{BitBlock bit00224466_0,bit00224466_1,bit00224466_2,bit00224466_3; \
30BitBlock bit11335577_0,bit11335577_1,bit11335577_2,bit11335577_3; \
31BitBlock bit00004444_0,bit22226666_0,bit00004444_1,bit22226666_1; \
32BitBlock bit11115555_0,bit33337777_0,bit11115555_1,bit33337777_1; \
33s2p_step(s0,s1,mask_2,1,bit00224466_0,bit11335577_0)  \
34s2p_step(s2,s3,mask_2,1,bit00224466_1,bit11335577_1)  \
35s2p_step(s4,s5,mask_2,1,bit00224466_2,bit11335577_2)  \
36s2p_step(s6,s7,mask_2,1,bit00224466_3,bit11335577_3)  \
37s2p_step(bit00224466_0,bit00224466_1,mask_4,2,bit00004444_0,bit22226666_0)  \
38s2p_step(bit00224466_2,bit00224466_3,mask_4,2,bit00004444_1,bit22226666_1)  \
39s2p_step(bit11335577_0,bit11335577_1,mask_4,2,bit11115555_0,bit33337777_0)  \
40s2p_step(bit11335577_2,bit11335577_3,mask_4,2,bit11115555_1,bit33337777_1)  \
41s2p_step(bit00004444_0,bit00004444_1,mask_8,4,p0,p4)  \
42s2p_step(bit11115555_0,bit11115555_1,mask_8,4,p1,p5)  \
43s2p_step(bit22226666_0,bit22226666_1,mask_8,4,p2,p6)  \
44s2p_step(bit33337777_0,bit33337777_1,mask_8,4,p3,p7)  \
45} \
46
47
48
49
50#define double_int64_adc(x1, x2, y1, y2, rslt1, rslt2, carry) \
51  __asm__  ("sahf\n\t" \
52            "adc %[e1], %[z1]\n\t" \
53            "adc %[e2], %[z2]\n\t" \
54            "lahf\n\t" \
55         : [z1] "=r" (rslt1), [z2] "=r" (rslt2), [carry] "=a" (carry) \
56         : "[z1]" (x1), "[z2]" (x2), \
57           [e1] "r" (y1), [e2] "r" (y2), \
58           "[carry]" (carry) \
59         : "cc")
60
61static inline BitBlock adc128(BitBlock first, BitBlock second, int &carry)
62{
63  union {__m128i bitblock;
64         uint64_t int64[2];} rslt;
65
66  union {__m128i bitblock;
67         uint64_t int64[2];} x;
68
69  union {__m128i bitblock;
70         uint64_t int64[2];} y;
71
72  x.bitblock = first;
73  y.bitblock = second;
74
75  double_int64_adc(x.int64[0], x.int64[1], y.int64[0], y.int64[1], 
76                   rslt.int64[0], rslt.int64[1], carry);
77
78  return rslt.bitblock;
79}
80
81
82                     
83#define double_int64_sbb(x1, x2, y1, y2, rslt1, rslt2, carry) \
84  __asm__  ("sahf\n\t" \
85            "sbb %[e1], %[z1]\n\t" \
86            "sbb %[e2], %[z2]\n\t" \
87            "lahf\n\t" \
88         : [z1] "=r" (rslt1), [z2] "=r" (rslt2), [carry] "=a" (carry) \
89         : "[z1]" (x1), "[z2]" (x2), \
90           [e1] "r" (y1), [e2] "r" (y2), \
91           "[carry]" (carry) \
92         : "cc")
93
94static inline BitBlock sbb128(BitBlock first, BitBlock second, int &carry)
95{
96  union {__m128i bitblock;
97         uint64_t int64[2];} rslt;
98
99  union {__m128i bitblock;
100         uint64_t int64[2];} x;
101
102  union {__m128i bitblock;
103         uint64_t int64[2];} y;
104
105  x.bitblock = first;
106  y.bitblock = second;
107
108  double_int64_sbb(x.int64[0], x.int64[1], y.int64[0], y.int64[1], 
109                   rslt.int64[0], rslt.int64[1], carry);
110
111  return rslt.bitblock;
112}
113
114
115       
116           
117#define BLOCK_SIZE 128
118
119void do_process(FILE *infile, FILE *outfile) {
120
121  @decl
122
123  BytePack U8[8];
124//  BitBlock u8bit[8];
125
126  int block_pos = 0;
127
128  int chars_read = fread(&U8[0], 1, BLOCK_SIZE, infile);
129  while (chars_read > 0) {
130    for (int i = chars_read;i < BLOCK_SIZE; i++) {
131       ((char *) &U8[0])[i] = 0;
132    }
133    BitBlock mask_2 = simd_himask_2;
134    BitBlock mask_4 = simd_himask_4;
135    BitBlock mask_8 = simd_himask_8;
136    s2p_bytepack(U8[7], U8[6], U8[5], U8[4], U8[3], U8[2], U8[1], U8[0],
137    u8bit[0], u8bit[1], u8bit[2], u8bit[3], u8bit[4], u8bit[5], u8bit[6], u8bit[7]);
138
139    @stmts
140
141    if (bitblock_has_bit(error_mask)) {
142      int errpos = count_forward_zeroes(error_mask);
143      fprintf(stderr, "Error at byte #%i\n", block_pos + errpos);
144    }
145    block_pos += BLOCK_SIZE;
146    chars_read = fread(&U8[0], 1, BLOCK_SIZE, infile);
147  }
148
149  fclose(infile);
150  fclose(outfile);
151}
152
153
154
155
156int
157main(int argc, char * argv[]) {
158  if (argc < 2) {
159    printf("Usage: %s <filename> [<outputfile>]\n", argv[0]);
160          exit(-1);
161  }
162  char * filename = argv[1];
163#ifdef BUFFER_PROFILING
164  transcode_timer = init_BOM_timer(BUFFER_SIZE);
165#endif
166  FILE *infile, *outfile;
167  infile = fopen(filename, "rb");
168  if (!infile) {
169      fprintf(stderr, "Error: cannot open %s for input.\n", filename);
170      exit(-1);
171  }
172
173  if (argc < 3) outfile = stdout;
174  else {
175    outfile = fopen(argv[2], "wb");
176    if (!outfile) {
177      fprintf(stderr, "Error: cannot open %s for writing.\n", argv[2]);
178      exit(-1);
179    }
180  }
181
182  do_process(infile, outfile);
183
184#ifdef BUFFER_PROFILING
185  printf("Buffer conversion timing.\n");
186  dump_BOM_table(transcode_timer);
187#endif
188  return(0);
189}
Note: See TracBrowser for help on using the repository browser.