From b999177810ffabe7992aa879d52b74fb79c85b69 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Thu, 16 Jan 2025 10:28:02 +0100 Subject: [PATCH] remove MMX instruction usage in polar decode --- openair1/PHY/CODING/3gpplte_sse.c | 17 +++++++++-------- .../nrPolar_tools/nr_polar_decoding_tools.c | 1 + radio/rfsimulator/stored_node.c | 1 - 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/openair1/PHY/CODING/3gpplte_sse.c b/openair1/PHY/CODING/3gpplte_sse.c index 169f53e23e..9d19c9b346 100644 --- a/openair1/PHY/CODING/3gpplte_sse.c +++ b/openair1/PHY/CODING/3gpplte_sse.c @@ -47,8 +47,8 @@ //#define CALLGRIND 1 struct treillis { - uint8_t systematic_andp1[24]; - uint8_t parity2[24]; + uint8_t systematic_andp1[24] __attribute__((aligned(32))); + uint8_t parity2[24] __attribute__((aligned(32))); int exit_state; } __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))); interleave_compact_byte(base_interleaver, input, systematic2, input_length_bytes); unsigned char *ptr_output = output; - unsigned char cur_s1, cur_s2; unsigned char state0 = 0, state1 = 0; for (int i = 0; i < input_length_bytes; i++) { - cur_s1=input[i]; - cur_s2=systematic2[i]; - *(simde__m128i *)ptr_output = simde_mm_add_epi8(*(simde__m128i *)all_treillis[state0][cur_s1].systematic_andp1, - *(simde__m128i *)all_treillis[state1][cur_s2].parity2); + int cur_s1 = input[i]; + uint8_t *systematic_andp1 = all_treillis[state0][cur_s1].systematic_andp1; + int cur_s2 = systematic2[i]; + 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; 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; state1=all_treillis[state1][cur_s2].exit_state; diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c index cc0f31f1de..80d82c3f8c 100644 --- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c +++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c @@ -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 *)alpha_l) = simde_mm_sign_epi16(minabs128, simde_mm_sign_epi16(a128, b128)); } 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 b64 = ((simde__m64 *)alpha_v)[1]; simde__m64 absa64 = simde_mm_abs_pi16(a64); diff --git a/radio/rfsimulator/stored_node.c b/radio/rfsimulator/stored_node.c index 3001eac222..51db5bfea1 100644 --- a/radio/rfsimulator/stored_node.c +++ b/radio/rfsimulator/stored_node.c @@ -44,7 +44,6 @@ int fullread(int fd, void *_buf, int count) { return ret; } -#define shift 4 void fullwrite(int fd, void *_buf, int count) { char *buf = _buf;