Commit b9991778 authored by Laurent THOMAS's avatar Laurent THOMAS

remove MMX instruction usage in polar decode

parent ef3b99a2
...@@ -47,8 +47,8 @@ ...@@ -47,8 +47,8 @@
//#define CALLGRIND 1 //#define CALLGRIND 1
struct treillis { struct treillis {
uint8_t systematic_andp1[24]; uint8_t systematic_andp1[24] __attribute__((aligned(32)));
uint8_t parity2[24]; uint8_t parity2[24] __attribute__((aligned(32)));
int exit_state; int exit_state;
} __attribute__ ((aligned(64))); } __attribute__ ((aligned(64)));
...@@ -292,16 +292,17 @@ void threegpplte_turbo_encoder_sse(unsigned char *input, unsigned short input_le ...@@ -292,16 +292,17 @@ void threegpplte_turbo_encoder_sse(unsigned char *input, unsigned short input_le
unsigned char systematic2[768] __attribute__((aligned(32))); unsigned char systematic2[768] __attribute__((aligned(32)));
interleave_compact_byte(base_interleaver, input, systematic2, input_length_bytes); interleave_compact_byte(base_interleaver, input, systematic2, input_length_bytes);
unsigned char *ptr_output = output; unsigned char *ptr_output = output;
unsigned char cur_s1, cur_s2;
unsigned char state0 = 0, state1 = 0; unsigned char state0 = 0, state1 = 0;
for (int i = 0; i < input_length_bytes; i++) { for (int i = 0; i < input_length_bytes; i++) {
cur_s1=input[i]; int cur_s1 = input[i];
cur_s2=systematic2[i]; uint8_t *systematic_andp1 = all_treillis[state0][cur_s1].systematic_andp1;
*(simde__m128i *)ptr_output = simde_mm_add_epi8(*(simde__m128i *)all_treillis[state0][cur_s1].systematic_andp1, int cur_s2 = systematic2[i];
*(simde__m128i *)all_treillis[state1][cur_s2].parity2); uint8_t *parity2 = all_treillis[state1][cur_s2].parity2;
simde_mm_storeu_si128((simde__m128i *)ptr_output,
simde_mm_add_epi8(*(simde__m128i *)systematic_andp1, *(simde__m128i *)parity2));
ptr_output += 16; ptr_output += 16;
for (int code_rate = 16; code_rate < 24; code_rate++) { for (int code_rate = 16; code_rate < 24; code_rate++) {
*ptr_output++ = all_treillis[state0][cur_s1].systematic_andp1[code_rate] + all_treillis[state1][cur_s2].parity2[code_rate]; *ptr_output++ = systematic_andp1[code_rate] + parity2[code_rate];
} }
state0=all_treillis[state0][cur_s1].exit_state; state0=all_treillis[state0][cur_s1].exit_state;
state1=all_treillis[state1][cur_s2].exit_state; state1=all_treillis[state1][cur_s2].exit_state;
......
...@@ -252,6 +252,7 @@ static inline void applyFtoleft(const t_nrPolar_params *pp, decoder_node_t *node ...@@ -252,6 +252,7 @@ static inline void applyFtoleft(const t_nrPolar_params *pp, decoder_node_t *node
simde__m128i minabs128 = simde_mm_min_epi16(absa128, absb128); simde__m128i minabs128 = simde_mm_min_epi16(absa128, absb128);
*((simde__m128i *)alpha_l) = simde_mm_sign_epi16(minabs128, simde_mm_sign_epi16(a128, b128)); *((simde__m128i *)alpha_l) = simde_mm_sign_epi16(minabs128, simde_mm_sign_epi16(a128, b128));
} else if (avx2mod == 4) { } else if (avx2mod == 4) {
// this uses __m64, but only with SSE instructions, so we can disable MMX even with this piece of code
simde__m64 a64 = *((simde__m64 *)alpha_v); simde__m64 a64 = *((simde__m64 *)alpha_v);
simde__m64 b64 = ((simde__m64 *)alpha_v)[1]; simde__m64 b64 = ((simde__m64 *)alpha_v)[1];
simde__m64 absa64 = simde_mm_abs_pi16(a64); simde__m64 absa64 = simde_mm_abs_pi16(a64);
......
...@@ -44,7 +44,6 @@ int fullread(int fd, void *_buf, int count) { ...@@ -44,7 +44,6 @@ int fullread(int fd, void *_buf, int count) {
return ret; return ret;
} }
#define shift 4
void fullwrite(int fd, void *_buf, int count) { void fullwrite(int fd, void *_buf, int count) {
char *buf = _buf; char *buf = _buf;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment