From 803b0289a628ac94b15b9fa5b2dc5c9fb31e9339 Mon Sep 17 00:00:00 2001 From: Laurent THOMAS Date: Fri, 26 Jul 2024 15:27:05 +0200 Subject: [PATCH] Use gold cache in code word (un)scrambling --- openair1/PHY/NR_TRANSPORT/nr_scrambling.c | 46 +++++++--------------- openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c | 30 +++++--------- 2 files changed, 23 insertions(+), 53 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_scrambling.c b/openair1/PHY/NR_TRANSPORT/nr_scrambling.c index 23c5aa9d4e..b71ee0cce0 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_scrambling.c +++ b/openair1/PHY/NR_TRANSPORT/nr_scrambling.c @@ -21,7 +21,6 @@ #include "nr_transport_common_proto.h" #include "PHY/NR_REFSIG/nr_refsig.h" -#include "openair1/PHY/LTE_TRANSPORT/transport_proto.h" // for lte_gold_generic() #include "common/utils/LOG/vcd_signal_dumper.h" #define DEBUG_SCRAMBLING(a) //#define DEBUG_SCRAMBLING(a) a @@ -32,45 +31,32 @@ void nr_codeword_scrambling(uint8_t *in, uint32_t n_RNTI, uint32_t* out) { - uint32_t x1; - uint32_t x2 = (n_RNTI << 15) + (q << 14) + Nid; - uint32_t s = lte_gold_generic(&x1, &x2, 1); - for (int i = 0; i < ((size >> 5) + ((size & 0x1f) > 0 ? 1 : 0)); i++) { + const int roundedSz = (size + 31) / 32; + uint32_t *seq = gold_cache((n_RNTI << 15) + (q << 14) + Nid, roundedSz); + for (int i = 0; i < roundedSz; i++) { simde__m256i c = ((simde__m256i*)in)[i]; uint32_t in32 = simde_mm256_movemask_epi8(simde_mm256_slli_epi16(c, 7)); - out[i] = (in32 ^ s); + out[i] = in32 ^ seq[i]; DEBUG_SCRAMBLING(LOG_D(PHY, "in[%d] %x => %x\n", i, in32, out[i])); - s = lte_gold_generic(&x1, &x2, 0); } } void nr_codeword_unscrambling(int16_t* llr, uint32_t size, uint8_t q, uint32_t Nid, uint32_t n_RNTI) { - uint32_t x1; - uint32_t x2 = (n_RNTI << 15) + (q << 14) + Nid; - uint32_t s = 0; - + const int roundedSz = (size + 31) / 32; + uint32_t *seq = gold_cache((n_RNTI << 15) + (q << 14) + Nid, roundedSz); #if defined(__x86_64__) || defined(__i386__) || defined(__arm__) || defined(__aarch64__) - uint8_t *s8=(uint8_t *)&s; simde__m128i *llr128 = (simde__m128i*)llr; - s = lte_gold_generic(&x1, &x2, 1); - - for (int i = 0, j = 0; i < ((size >> 5) + ((size & 0x1f) > 0 ? 1 : 0)); i++, j += 4) { + for (int i = 0, j = 0; i < roundedSz; i++, j += 4) { + uint8_t *s8 = (uint8_t *)(seq + i); llr128[j] = simde_mm_mullo_epi16(llr128[j],byte2m128i[s8[0]]); llr128[j+1] = simde_mm_mullo_epi16(llr128[j+1],byte2m128i[s8[1]]); llr128[j+2] = simde_mm_mullo_epi16(llr128[j+2],byte2m128i[s8[2]]); - llr128[j+3] = simde_mm_mullo_epi16(llr128[j+3],byte2m128i[s8[3]]); - s = lte_gold_generic(&x1, &x2, 0); + llr128[j + 3] = simde_mm_mullo_epi16(llr128[j + 3], byte2m128i[s8[3]]); } #else - uint8_t reset = 1; - for (uint32_t i=0; i>(i&0x1f))&1)==1) + if (seq[i / 32] & (1U << (i % 32))) llr[i] = -llr[i]; } #endif @@ -78,18 +64,14 @@ void nr_codeword_unscrambling(int16_t* llr, uint32_t size, uint8_t q, uint32_t N void nr_codeword_unscrambling_init(int16_t *s2, uint32_t size, uint8_t q, uint32_t Nid, uint32_t n_RNTI) { - uint32_t x1; - uint32_t x2 = (n_RNTI << 15) + (q << 14) + Nid; + const int roundedSz = (size + 31) / 32; + uint32_t *seq = gold_cache((n_RNTI << 15) + (q << 14) + Nid, roundedSz); simde__m128i *s128=(simde__m128i *)s2; - - uint32_t s = lte_gold_generic(&x1, &x2, 1); - uint8_t *s8=(uint8_t *)&s; - - for (int i = 0; i < (size +31) >> 5; i++) { + for (int i = 0; i < roundedSz; i++) { + uint8_t *s8 = (uint8_t *)(seq + i); *s128++ = byte2m128i[s8[0]]; *s128++ = byte2m128i[s8[1]]; *s128++ = byte2m128i[s8[2]]; *s128++ = byte2m128i[s8[3]]; - s = lte_gold_generic(&x1, &x2, 0); } } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c index 638d1e2e22..3425c23289 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c @@ -57,34 +57,22 @@ void nr_pusch_codeword_scrambling_uci(uint8_t *in, uint32_t size, uint32_t Nid, uint32_t n_RNTI, uint32_t* out) { - uint8_t reset, b_idx; - uint32_t x1 = 0, x2 = 0, s = 0, temp_out = 0; - - reset = 1; - x2 = (n_RNTI<<15) + Nid; - + uint32_t *seq = gold_cache((n_RNTI << 15) + Nid, (size + 31) / 32); for (int i=0; i>31; - + uint32_t temp_out = out[idx - 1]; + out[idx] ^= temp_out >> 31; } } else - *out ^= (((in[i])&1) ^ ((s>>b_idx)&1))<> b_idx) & 1)) << b_idx; //printf("i %d b_idx %d in %d s 0x%08x out 0x%08x\n", i, b_idx, in[i], s, *out); } }