remove MMX instruction usage in polar decode
This commit is contained in:
@@ -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
|
|||||||
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
|
|||||||
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) {
|
|||||||
|
|
||||||
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;
|
||||||
|
|||||||
Reference in New Issue
Block a user