10#ifndef INCLUDED_volk_8u_conv_k7_r2puppet_8u_H
11#define INCLUDED_volk_8u_conv_k7_r2puppet_8u_H
23static inline int parity(
int x,
unsigned char* Partab)
32 unsigned int endstate,
33 unsigned int tailsize,
34 unsigned char* decisions)
38 int d_numstates = (1 << 6);
39 int d_decision_t_size = d_numstates / 8;
41 int d_framebits = nbits;
48 endstate = (endstate % d_numstates) << d_ADDSHIFT;
55 d += tailsize * d_decision_t_size;
57 int dif = tailsize - (d_k - 1);
60 while (nbits-- > d_framebits - (d_k - 1)) {
62 dec.
t = &d[nbits * d_decision_t_size];
63 k = (dec.w[(endstate >> d_ADDSHIFT) / 32] >> ((endstate >> d_ADDSHIFT) % 32)) & 1;
65 endstate = (endstate >> 1) | (k << (d_k - 2 + d_ADDSHIFT));
68 data[((nbits + dif) % d_framebits)] = k;
74 while (nbits-- != 0) {
77 dec.t = &d[nbits * d_decision_t_size];
79 k = (dec.w[(endstate >> d_ADDSHIFT) / 32] >> ((endstate >> d_ADDSHIFT) % 32)) & 1;
81 endstate = (endstate >> 1) | (k << (d_k - 2 + d_ADDSHIFT));
82 data[((nbits + dif) % d_framebits)] = k;
88 return retval >> d_ADDSHIFT;
102 unsigned int framebits)
104 if (framebits < 12) {
109 int d_numstates = (1 << 6);
111 static unsigned char* D;
112 static unsigned char* Y;
113 static unsigned char* X;
114 static unsigned int excess = 6;
115 static unsigned char* Branchtab;
116 static unsigned char Partab[256];
118 int d_polys[2] = { 79, 109 };
123 X = (
unsigned char*)
volk_malloc(2 * d_numstates, volk_get_alignment());
126 (
unsigned char*)
volk_malloc(d_numstates / 2 * rate, volk_get_alignment());
127 D = (
unsigned char*)
volk_malloc((d_numstates / 8) * (framebits + 6),
128 volk_get_alignment());
133 for (i = 0; i < 256; i++) {
144 for (state = 0; state < d_numstates / 2; state++) {
145 for (i = 0; i < rate; i++) {
146 Branchtab[i * d_numstates / 2 + state] =
147 parity((2 * state) & d_polys[i], Partab) ? 255 : 0;
155 memset(X, 31, d_numstates);
158 memset(D, 0, (d_numstates / 8) * (framebits + 6));
161 Y, X, syms, D, framebits / 2 - excess, excess, Branchtab);
163 unsigned int min = X[0];
164 int i = 0, state = 0;
165 for (i = 0; i < (d_numstates); ++i) {
184 unsigned int framebits)
186 if (framebits < 12) {
191 int d_numstates = (1 << 6);
193 static unsigned char* D;
194 static unsigned char* Y;
195 static unsigned char* X;
196 static unsigned int excess = 6;
197 static unsigned char* Branchtab;
198 static unsigned char Partab[256];
200 int d_polys[2] = { 79, 109 };
205 X = (
unsigned char*)
volk_malloc(2 * d_numstates, volk_get_alignment());
208 (
unsigned char*)
volk_malloc(d_numstates / 2 * rate, volk_get_alignment());
209 D = (
unsigned char*)
volk_malloc((d_numstates / 8) * (framebits + 6),
210 volk_get_alignment());
215 for (i = 0; i < 256; i++) {
226 for (state = 0; state < d_numstates / 2; state++) {
227 for (i = 0; i < rate; i++) {
228 Branchtab[i * d_numstates / 2 + state] =
229 parity((2 * state) & d_polys[i], Partab) ? 255 : 0;
237 memset(X, 31, d_numstates);
240 memset(D, 0, (d_numstates / 8) * (framebits + 6));
243 Y, X, syms, D, framebits / 2 - excess, excess, Branchtab);
245 unsigned int min = X[0];
246 int i = 0, state = 0;
247 for (i = 0; i < (d_numstates); ++i) {
264#include <immintrin.h>
267static inline void volk_8u_conv_k7_r2puppet_8u_avx2(
unsigned char* dec,
269 unsigned int framebits)
271 if (framebits < 12) {
276 int d_numstates = (1 << 6);
278 static unsigned char* D;
279 static unsigned char* Y;
280 static unsigned char* X;
281 static unsigned int excess = 6;
282 static unsigned char* Branchtab;
283 static unsigned char Partab[256];
285 int d_polys[2] = { 79, 109 };
290 X = (
unsigned char*)
volk_malloc(2 * d_numstates, volk_get_alignment());
293 (
unsigned char*)
volk_malloc(d_numstates / 2 * rate, volk_get_alignment());
294 D = (
unsigned char*)
volk_malloc((d_numstates / 8) * (framebits + 6),
295 volk_get_alignment());
300 for (i = 0; i < 256; i++) {
311 for (state = 0; state < d_numstates / 2; state++) {
312 for (i = 0; i < rate; i++) {
313 Branchtab[i * d_numstates / 2 + state] =
314 parity((2 * state) & d_polys[i], Partab) ? 255 : 0;
322 memset(X, 31, d_numstates);
325 memset(D, 0, (d_numstates / 8) * (framebits + 6));
327 volk_8u_x4_conv_k7_r2_8u_avx2(
328 Y, X, syms, D, framebits / 2 - excess, excess, Branchtab);
330 unsigned int min = X[0];
331 int i = 0, state = 0;
332 for (i = 0; i < (d_numstates); ++i) {
352 unsigned int framebits)
354 if (framebits < 12) {
359 int d_numstates = (1 << 6);
361 static unsigned char* Y;
362 static unsigned char* X;
363 static unsigned char* D;
364 static unsigned int excess = 6;
365 static unsigned char* Branchtab;
366 static unsigned char Partab[256];
368 int d_polys[2] = { 79, 109 };
373 X = (
unsigned char*)
volk_malloc(2 * d_numstates, volk_get_alignment());
376 (
unsigned char*)
volk_malloc(d_numstates / 2 * rate, volk_get_alignment());
377 D = (
unsigned char*)
volk_malloc((d_numstates / 8) * (framebits + 6),
378 volk_get_alignment());
384 for (i = 0; i < 256; i++) {
395 for (state = 0; state < d_numstates / 2; state++) {
396 for (i = 0; i < rate; i++) {
397 Branchtab[i * d_numstates / 2 + state] =
398 parity((2 * state) & d_polys[i], Partab) ? 255 : 0;
406 memset(X, 31, d_numstates);
409 memset(D, 0, (d_numstates / 8) * (framebits + 6));
412 Y, X, syms, D, framebits / 2 - excess, excess, Branchtab);
414 unsigned int min = X[0];
415 int i = 0, state = 0;
416 for (i = 0; i < (d_numstates); ++i) {