Commit eb0dda59 authored by Laurent THOMAS's avatar Laurent THOMAS

remove intermediate buffer and memory copy, continue to simplify nr pdsch computation

parent 2fad8796
...@@ -52,15 +52,15 @@ static void nr_pdsch_codeword_scrambling(uint8_t *in, uint32_t size, uint8_t q, ...@@ -52,15 +52,15 @@ static void nr_pdsch_codeword_scrambling(uint8_t *in, uint32_t size, uint8_t q,
static int do_ptrs_symbol(nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15, static int do_ptrs_symbol(nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15,
int start_sc, int start_sc,
int k,
uint *cur_re,
int symbol_sz, int symbol_sz,
c16_t *output, c16_t *txF,
c16_t *tx_layer, c16_t *tx_layer,
int amp, int amp,
c16_t *mod_ptrs) c16_t *mod_ptrs)
{ {
int ptrs_idx = 0; int ptrs_idx = 0;
int k = start_sc;
c16_t *in = tx_layer;
for (int i = 0; i < rel15->rbSize * NR_NB_SC_PER_RB; i++) { for (int i = 0; i < rel15->rbSize * NR_NB_SC_PER_RB; i++) {
/* check for PTRS symbol and set flag for PTRS RE */ /* check for PTRS symbol and set flag for PTRS RE */
bool is_ptrs_re = bool is_ptrs_re =
...@@ -68,40 +68,36 @@ static int do_ptrs_symbol(nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15, ...@@ -68,40 +68,36 @@ static int do_ptrs_symbol(nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15,
if (is_ptrs_re) { if (is_ptrs_re) {
/* check if cuurent RE is PTRS RE*/ /* check if cuurent RE is PTRS RE*/
uint16_t beta_ptrs = 1; uint16_t beta_ptrs = 1;
output[k] = c16mulRealShift(mod_ptrs[ptrs_idx], beta_ptrs * amp, 15); txF[k] = c16mulRealShift(mod_ptrs[ptrs_idx], beta_ptrs * amp, 15);
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
printf("ptrs_idx %d\t \t k %d \t \t txdataF: %d %d, mod_ptrs: %d %d\n", printf("ptrs_idx %d\t \t k %d \t \t txdataF: %d %d, mod_ptrs: %d %d\n",
ptrs_idx, ptrs_idx,
k, k,
output[k].r, txF[k].r,
output[k].i, txF[k].i,
mod_ptrs[ptrs_idx].r, mod_ptrs[ptrs_idx].r,
mod_ptrs[ptrs_idx].i); mod_ptrs[ptrs_idx].i);
#endif #endif
ptrs_idx++; ptrs_idx++;
} else { } else {
output[k] = c16mulRealShift(tx_layer[*cur_re], amp, 15); txF[k] = c16mulRealShift(*in++, amp, 15);
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
printf("re %u\t k %d \t txdataF: %d %d\n", *cur_re, k, output[k].r, output[k].i); printf("k %d \t txdataF: %d %d\n", k, txF[k].r, txF[k].i);
#endif #endif
*cur_re = *cur_re + 1;
} }
if (++k >= symbol_sz) if (++k >= symbol_sz)
k -= symbol_sz; k -= symbol_sz;
} }
return k; return in - tx_layer;
} }
static inline void static inline int dmrs_case20(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz)
dmrs_case1(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc, int upper_limit, int remaining_re)
{ {
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
printf("doing DMRS pattern for port 0 : d0 0 d1 0 ... dNm2 0 dNm1 0 (ul %d, rr %d)\n", upper_limit, remaining_re); printf("doing DMRS pattern for port 0 : d0 0 d1 0 ... dNm2 0 dNm1 0 (ul %d, rr %d)\n", upper_limit, remaining_re);
#endif #endif
// add filler to process all as SIMD // add filler to process all as SIMD
c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64))); c16_t *out = txF;
c16_t *in = mod_dmrs;
c16_t *out = dmrs_mux;
int i = 0; int i = 0;
int end = sz / 2; int end = sz / 2;
#if defined(__AVX512BW__) #if defined(__AVX512BW__)
...@@ -109,60 +105,51 @@ dmrs_case1(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc ...@@ -109,60 +105,51 @@ dmrs_case1(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
__m512i perml = _mm512_set_epi32(23, 7, 22, 6, 21, 5, 20, 4, 19, 3, 18, 2, 17, 1, 16, 0); __m512i perml = _mm512_set_epi32(23, 7, 22, 6, 21, 5, 20, 4, 19, 3, 18, 2, 17, 1, 16, 0);
__m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8); __m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8);
for (; i < (end & ~15); i += 16) { for (; i < (end & ~15); i += 16) {
__m512i d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)in), amp_dmrs512); __m512i d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)(mod_dmrs + i)), amp_dmrs512);
in += 16; _mm512_storeu_si512((__m512i *)out, _mm512_permutex2var_epi32(d0, perml, zeros512));
*(__m512i *)out = _mm512_permutex2var_epi32(d0, perml, zeros512);
out += 16; out += 16;
*(__m512i *)out = _mm512_permutex2var_epi32(d0, permh, zeros512); _mm512_storeu_si512((__m512i *)out, _mm512_permutex2var_epi32(d0, permh, zeros512));
out += 16; out += 16;
} }
#endif #endif
#if defined(__AVX2__) #if defined(__AVX2__)
simde__m256i zeros256 = simde_mm256_setzero_si256(), amp_dmrs256 = simde_mm256_set1_epi16(amp_dmrs); simde__m256i zeros256 = simde_mm256_setzero_si256(), amp_dmrs256 = simde_mm256_set1_epi16(amp_dmrs);
for (; i < (end & ~7); i += 8) { for (; i < (end & ~7); i += 8) {
simde__m256i d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)in), amp_dmrs256); simde__m256i d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)(mod_dmrs + i)), amp_dmrs256);
in += 8;
simde__m256i d2 = simde_mm256_unpacklo_epi32(d0, zeros256); simde__m256i d2 = simde_mm256_unpacklo_epi32(d0, zeros256);
simde__m256i d3 = simde_mm256_unpackhi_epi32(d0, zeros256); simde__m256i d3 = simde_mm256_unpackhi_epi32(d0, zeros256);
*(simde__m256i *)out = simde_mm256_permute2x128_si256(d2, d3, 32); simde_mm256_storeu_si256((simde__m256i *)out, simde_mm256_permute2x128_si256(d2, d3, 32));
out += 8; out += 8;
*(simde__m256i *)out = simde_mm256_permute2x128_si256(d2, d3, 49); simde_mm256_storeu_si256((simde__m256i *)out, simde_mm256_permute2x128_si256(d2, d3, 49));
out += 8; out += 8;
} }
#endif #endif
#if defined(USE128BIT) #if defined(USE128BIT)
simde__m128i zeros = simde_mm_setzero_si128(), amp_dmrs128 = simde_mm_set1_epi16(amp_dmrs); simde__m128i zeros = simde_mm_setzero_si128(), amp_dmrs128 = simde_mm_set1_epi16(amp_dmrs);
for (; i < (end & ~3); i += 4) { for (; i < (end & ~3); i += 4) {
simde__m128i d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)in), amp_dmrs128); simde__m128i d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)(mod_dmrs + i)), amp_dmrs128);
in += 4;
simde__m128i d2 = simde_mm_unpacklo_epi32(d0, zeros); simde__m128i d2 = simde_mm_unpacklo_epi32(d0, zeros);
simde__m128i d3 = simde_mm_unpackhi_epi32(d0, zeros); simde__m128i d3 = simde_mm_unpackhi_epi32(d0, zeros);
*(simde__m128i *)out = d2; simde_mm_storeu_si128((simde__m128i *)out, d2);
out += 4; out += 4;
*(simde__m128i *)out = d3; simde_mm_storeu_si128((simde__m128i *)out, d3);
out += 4; out += 4;
} }
#endif #endif
for (; i < end; i++) { for (; i < end; i++) {
*out++ = (c16_t){(((in->r * amp_dmrs) >> 14) + 1) >> 1, (((in->i * amp_dmrs) >> 14) + 1) >> 1}; *out++ = (c16_t){(((mod_dmrs[i].r * amp_dmrs) >> 14) + 1) >> 1, (((mod_dmrs[i].i * amp_dmrs) >> 14) + 1) >> 1};
in++;
*out++ = (c16_t){}; *out++ = (c16_t){};
} }
memcpy(&txF[start_sc], dmrs_mux, sizeof(c16_t) * upper_limit); return 0;
if (remaining_re)
memcpy(&txF[0], &dmrs_mux[upper_limit], sizeof(c16_t) * remaining_re);
} }
static inline void static inline int dmrs_case21(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz)
dmrs_case2(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc, int upper_limit, int remaining_re)
{ {
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
printf("doing DMRS pattern for port 1 : d0 0 -d1 0 ...dNm2 0 -dNm1 0\n"); printf("doing DMRS pattern for port 1 : d0 0 -d1 0 ...dNm2 0 -dNm1 0\n");
#endif #endif
// add filler to process all as SIMD // add filler to process all as SIMD
c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64))); c16_t *out = txF;
c16_t *in = mod_dmrs;
c16_t *out = dmrs_mux;
int i = 0; int i = 0;
int end = sz / 2; int end = sz / 2;
...@@ -202,11 +189,10 @@ dmrs_case2(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc ...@@ -202,11 +189,10 @@ dmrs_case2(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
__m512i perml = _mm512_set_epi32(23, 7, 22, 6, 21, 5, 20, 4, 19, 3, 18, 2, 17, 1, 16, 0); __m512i perml = _mm512_set_epi32(23, 7, 22, 6, 21, 5, 20, 4, 19, 3, 18, 2, 17, 1, 16, 0);
__m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8); __m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8);
for (; i < (end & ~15); i += 16) { for (; i < (end & ~15); i += 16) {
__m512i d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)in), amp_dmrs512); __m512i d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)(mod_dmrs + i)), amp_dmrs512);
in += 16; _mm512_storeu_si512((__m512i *)out, _mm512_permutex2var_epi32(d0, perml, zeros512));
*(__m512i *)out = _mm512_permutex2var_epi32(d0, perml, zeros512);
out += 16; out += 16;
*(__m512i *)out = _mm512_permutex2var_epi32(d0, permh, zeros512); _mm512_storeu_si512((__m512i *)out, _mm512_permutex2var_epi32(d0, permh, zeros512));
out += 16; out += 16;
} }
#endif #endif
...@@ -228,13 +214,12 @@ dmrs_case2(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc ...@@ -228,13 +214,12 @@ dmrs_case2(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
amp_dmrs, amp_dmrs,
amp_dmrs); amp_dmrs);
for (; i < (end & ~7); i += 8) { for (; i < (end & ~7); i += 8) {
simde__m256i d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)in), amp_dmrs256); simde__m256i d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)(mod_dmrs + i)), amp_dmrs256);
in += 8;
simde__m256i d2 = simde_mm256_unpacklo_epi32(d0, zeros256); simde__m256i d2 = simde_mm256_unpacklo_epi32(d0, zeros256);
simde__m256i d3 = simde_mm256_unpackhi_epi32(d0, zeros256); simde__m256i d3 = simde_mm256_unpackhi_epi32(d0, zeros256);
*(simde__m256i *)out = simde_mm256_permute2x128_si256(d2, d3, 32); simde_mm256_storeu_si256((simde__m256i *)out, simde_mm256_permute2x128_si256(d2, d3, 32));
out += 8; out += 8;
*(simde__m256i *)out = simde_mm256_permute2x128_si256(d2, d3, 49); simde_mm256_storeu_si256((simde__m256i *)out, simde_mm256_permute2x128_si256(d2, d3, 49));
out += 8; out += 8;
} }
#endif #endif
...@@ -242,39 +227,32 @@ dmrs_case2(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc ...@@ -242,39 +227,32 @@ dmrs_case2(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
simde__m128i zeros = simde_mm_setzero_si128(), simde__m128i zeros = simde_mm_setzero_si128(),
amp_dmrs128 = simde_mm_set_epi16(-amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs, -amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs); amp_dmrs128 = simde_mm_set_epi16(-amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs, -amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs);
for (; i < (end & ~3); i += 4) { for (; i < (end & ~3); i += 4) {
simde__m128i d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)in), amp_dmrs128); simde__m128i d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)(mod_dmrs + i)), amp_dmrs128);
in += 4;
simde__m128i d2 = simde_mm_unpacklo_epi32(d0, zeros); simde__m128i d2 = simde_mm_unpacklo_epi32(d0, zeros);
simde__m128i d3 = simde_mm_unpackhi_epi32(d0, zeros); simde__m128i d3 = simde_mm_unpackhi_epi32(d0, zeros);
*(simde__m128i *)out = d2; simde_mm_storeu_si128((simde__m128i *)out, d2);
out += 4; out += 4;
*(simde__m128i *)out = d3; simde_mm_storeu_si128((simde__m128i *)out, d3);
out += 4; out += 4;
} }
#endif #endif
for (; i < end; i += 2) { for (; i < end;) {
*out++ = (c16_t){(((in->r * amp_dmrs) >> 14) + 1) >> 1, (((in->i * amp_dmrs) >> 14) + 1) >> 1}; *out++ = (c16_t){(((mod_dmrs[i].r * amp_dmrs) >> 14) + 1) >> 1, (((mod_dmrs[i].i * amp_dmrs) >> 14) + 1) >> 1};
in++; i++;
*out++ = (c16_t){}; *out++ = (c16_t){};
*out++ = (c16_t){-(((in->r * amp_dmrs) >> 14) + 1) >> 1, -(((in->i * amp_dmrs) >> 14) + 1) >> 1}; *out++ = (c16_t){-(((mod_dmrs[i].r * amp_dmrs) >> 14) + 1) >> 1, -(((mod_dmrs[i].i * amp_dmrs) >> 14) + 1) >> 1};
in++; i++;
*out++ = (c16_t){}; *out++ = (c16_t){};
} }
memcpy(&txF[start_sc], dmrs_mux, sizeof(c16_t) * upper_limit); return 0;
if (remaining_re)
memcpy(&txF[0], &dmrs_mux[upper_limit], sizeof(c16_t) * remaining_re);
} }
static inline void static inline int dmrs_case22(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz)
dmrs_case3(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc, int upper_limit, int remaining_re)
{ {
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
printf("doing DMRS pattern for port 2 : 0 d0 0 d1 ... 0 dNm2 0 dNm1\n"); printf("doing DMRS pattern for port 2 : 0 d0 0 d1 ... 0 dNm2 0 dNm1\n");
#endif #endif
// add filler to process all as SIMD c16_t *out = txF;
c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64)));
c16_t *in = mod_dmrs;
c16_t *out = dmrs_mux;
int i = 0; int i = 0;
int end = sz / 2; int end = sz / 2;
#if defined(__AVX512BW__) #if defined(__AVX512BW__)
...@@ -282,63 +260,52 @@ dmrs_case3(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc ...@@ -282,63 +260,52 @@ dmrs_case3(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
__m512i perml = _mm512_set_epi32(23, 7, 22, 6, 21, 5, 20, 4, 19, 3, 18, 2, 17, 1, 16, 0); __m512i perml = _mm512_set_epi32(23, 7, 22, 6, 21, 5, 20, 4, 19, 3, 18, 2, 17, 1, 16, 0);
__m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8); __m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8);
for (; i < (end & ~15); i += 16) { for (; i < (end & ~15); i += 16) {
__m512i d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)in), amp_dmrs512); __m512i d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)(mod_dmrs + i)), amp_dmrs512);
in += 16;
__m512i d2 = _mm512_unpacklo_epi32(zeros512, d0); // 0 d0_0 0 d0_1 0 d0_4 0 d0_5 0 d0_8 0 d0_9 0 d0_12 0 d0_13 __m512i d2 = _mm512_unpacklo_epi32(zeros512, d0); // 0 d0_0 0 d0_1 0 d0_4 0 d0_5 0 d0_8 0 d0_9 0 d0_12 0 d0_13
__m512i d3 = _mm512_unpackhi_epi32(zeros512, d0); // 0 d0_2 0 d0_3 0 d0_6 0 d0_7 0 d0_10 0 d0_11 d0_14 0 d0_15 __m512i d3 = _mm512_unpackhi_epi32(zeros512, d0); // 0 d0_2 0 d0_3 0 d0_6 0 d0_7 0 d0_10 0 d0_11 d0_14 0 d0_15
*(__m512i *)out = _mm512_permutex2var_epi32(d2, perml, d3); // _mm512_storeu_si512((__m512i *)out, _mm512_permutex2var_epi32(d2, perml, d3)); //
out += 16; out += 16;
*(__m512i *)out = _mm512_permutex2var_epi32(d2, permh, d3); _mm512_storeu_si512((__m512i *)out, _mm512_permutex2var_epi32(d2, permh, d3));
out += 16; out += 16;
} }
#endif #endif
#if defined(__AVX2__) #if defined(__AVX2__)
simde__m256i zeros256 = simde_mm256_setzero_si256(), amp_dmrs256 = simde_mm256_set1_epi16(amp_dmrs); simde__m256i zeros256 = simde_mm256_setzero_si256(), amp_dmrs256 = simde_mm256_set1_epi16(amp_dmrs);
for (; i < (end & ~7); i += 8) { for (; i < (end & ~7); i += 8) {
simde__m256i d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)in), amp_dmrs256); simde__m256i d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)(mod_dmrs + i)), amp_dmrs256);
in += 8;
simde__m256i d2 = simde_mm256_unpacklo_epi32(zeros256, d0); simde__m256i d2 = simde_mm256_unpacklo_epi32(zeros256, d0);
simde__m256i d3 = simde_mm256_unpackhi_epi32(zeros256, d0); simde__m256i d3 = simde_mm256_unpackhi_epi32(zeros256, d0);
*(simde__m256i *)out = simde_mm256_permute2x128_si256(d2, d3, 32); simde_mm256_storeu_si256((simde__m256i *)out, simde_mm256_permute2x128_si256(d2, d3, 32));
out += 8; out += 8;
*(simde__m256i *)out = simde_mm256_permute2x128_si256(d2, d3, 49); simde_mm256_storeu_si256((simde__m256i *)out, simde_mm256_permute2x128_si256(d2, d3, 49));
out += 8; out += 8;
} }
#endif #endif
#if defined(USE128BIT) #if defined(USE128BIT)
simde__m128i zeros = simde_mm_setzero_si128(), amp_dmrs128 = simde_mm_set1_epi16(amp_dmrs); simde__m128i zeros = simde_mm_setzero_si128(), amp_dmrs128 = simde_mm_set1_epi16(amp_dmrs);
for (; i < (end & ~3); i += 4) { for (; i < (end & ~3); i += 4) {
simde__m128i d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)in), amp_dmrs128); simde__m128i d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)(mod_dmrs + i)), amp_dmrs128);
in += 4;
simde__m128i d2 = simde_mm_unpacklo_epi32(zeros, d0); simde__m128i d2 = simde_mm_unpacklo_epi32(zeros, d0);
simde__m128i d3 = simde_mm_unpackhi_epi32(zeros, d0); simde__m128i d3 = simde_mm_unpackhi_epi32(zeros, d0);
*(simde__m128i *)out = d2; simde_mm_storeu_si128((simde__m128i *)out, d2);
out += 4; out += 4;
*(simde__m128i *)out = d3; simde_mm_storeu_si128((simde__m128i *)out, d3);
out += 4; out += 4;
} }
#endif #endif
for (; i < end; i++) { for (; i < end; i++) {
*out++ = (c16_t){}; *out++ = (c16_t){};
*out++ = (c16_t){(((in->r * amp_dmrs) >> 14) + 1) >> 1, (((in->i * amp_dmrs) >> 14) + 1) >> 1}; *out++ = (c16_t){(((mod_dmrs[i].r * amp_dmrs) >> 14) + 1) >> 1, (((mod_dmrs[i].i * amp_dmrs) >> 14) + 1) >> 1};
in++;
} }
return 0;
memcpy(&txF[start_sc], dmrs_mux, sizeof(c16_t) * upper_limit);
if (remaining_re)
memcpy(&txF[0], &dmrs_mux[upper_limit], sizeof(c16_t) * remaining_re);
} }
static inline void static inline int dmrs_case23(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz)
dmrs_case4(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc, int upper_limit, int remaining_re)
{ {
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
printf("doing DMRS pattern for port 3 : 0 d0 0 -d1 ... 0 dNm2 0 -dNm1\n"); printf("doing DMRS pattern for port 3 : 0 d0 0 -d1 ... 0 dNm2 0 -dNm1\n");
#endif #endif
// add filler to process all as SIMD c16_t *out = txF;
c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64)));
c16_t *in = mod_dmrs;
c16_t *out = dmrs_mux;
int i = 0; int i = 0;
int end = sz / 2; int end = sz / 2;
...@@ -378,11 +345,10 @@ dmrs_case4(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc ...@@ -378,11 +345,10 @@ dmrs_case4(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
__m512i perml = _mm512_set_epi32(23, 7, 22, 6, 21, 5, 20, 4, 19, 3, 18, 2, 17, 1, 16, 0); __m512i perml = _mm512_set_epi32(23, 7, 22, 6, 21, 5, 20, 4, 19, 3, 18, 2, 17, 1, 16, 0);
__m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8); __m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8);
for (; i < (end & ~15); i += 16) { for (; i < (end & ~15); i += 16) {
__m512i d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)in), amp_dmrs512); __m512i d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)(mod_dmrs + i)), amp_dmrs512);
in += 16; _mm512_storeu_si512((__m512i *)out, _mm512_permutex2var_epi32(zeros512, perml, d0));
*(__m512i *)out = _mm512_permutex2var_epi32(zeros512, perml, d0);
out += 16; out += 16;
*(__m512i *)out = _mm512_permutex2var_epi32(zeros512, permh, d0); _mm512_storeu_si512((__m512i *)out, _mm512_permutex2var_epi32(zeros512, permh, d0));
out += 16; out += 16;
} }
...@@ -405,13 +371,12 @@ dmrs_case4(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc ...@@ -405,13 +371,12 @@ dmrs_case4(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
amp_dmrs, amp_dmrs,
amp_dmrs); amp_dmrs);
for (; i < (end & ~7); i += 8) { for (; i < (end & ~7); i += 8) {
simde__m256i d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)in), amp_dmrs256); simde__m256i d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)(mod_dmrs + i)), amp_dmrs256);
in += 8;
simde__m256i d2 = simde_mm256_unpacklo_epi32(zeros256, d0); simde__m256i d2 = simde_mm256_unpacklo_epi32(zeros256, d0);
simde__m256i d3 = simde_mm256_unpackhi_epi32(zeros256, d0); simde__m256i d3 = simde_mm256_unpackhi_epi32(zeros256, d0);
*(simde__m256i *)out = simde_mm256_permute2x128_si256(d2, d3, 32); simde_mm256_storeu_si256((simde__m256i *)out, simde_mm256_permute2x128_si256(d2, d3, 32));
out += 8; out += 8;
*(simde__m256i *)out = simde_mm256_permute2x128_si256(d2, d3, 49); simde_mm256_storeu_si256((simde__m256i *)out, simde_mm256_permute2x128_si256(d2, d3, 49));
out += 8; out += 8;
} }
#endif #endif
...@@ -419,46 +384,33 @@ dmrs_case4(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc ...@@ -419,46 +384,33 @@ dmrs_case4(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
simde__m128i zeros = simde_mm_setzero_si128(), simde__m128i zeros = simde_mm_setzero_si128(),
amp_dmrs128 = simde_mm_set_epi16(-amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs, -amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs); amp_dmrs128 = simde_mm_set_epi16(-amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs, -amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs);
for (; i < (end & ~3); i += 4) { for (; i < (end & ~3); i += 4) {
simde__m128i d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)in), amp_dmrs128); simde__m128i d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)(mod_dmrs + i)), amp_dmrs128);
in += 4;
simde__m128i d2 = simde_mm_unpacklo_epi32(zeros, d0); simde__m128i d2 = simde_mm_unpacklo_epi32(zeros, d0);
simde__m128i d3 = simde_mm_unpackhi_epi32(zeros, d0); simde__m128i d3 = simde_mm_unpackhi_epi32(zeros, d0);
*(simde__m128i *)out = d2; simde_mm_storeu_si128((simde__m128i *)out, d2);
out += 4; out += 4;
*(simde__m128i *)out = d3; simde_mm_storeu_si128((simde__m128i *)out, d3);
out += 4; out += 4;
} }
#endif #endif
for (; i < end; i += 2) { for (; i < end;) {
*out++ = (c16_t){}; *out++ = (c16_t){};
*out++ = (c16_t){(((in->r * amp_dmrs) >> 14) + 1) >> 1, (((in->i * amp_dmrs) >> 14) + 1) >> 1}; *out++ = (c16_t){(((mod_dmrs[i].r * amp_dmrs) >> 14) + 1) >> 1, (((mod_dmrs[i].i * amp_dmrs) >> 14) + 1) >> 1};
in++; i++;
*out++ = (c16_t){}; *out++ = (c16_t){};
*out++ = (c16_t){-(((in->r * amp_dmrs) >> 14) + 1) >> 1, -(((in->i * amp_dmrs) >> 14) + 1) >> 1}; *out++ = (c16_t){-(((mod_dmrs[i].r * amp_dmrs) >> 14) + 1) >> 1, -(((mod_dmrs[i].i * amp_dmrs) >> 14) + 1) >> 1};
in++; i++;
} }
memcpy(&txF[start_sc], dmrs_mux, sizeof(c16_t) * upper_limit); return 0;
if (remaining_re)
memcpy(&txF[0], &dmrs_mux[upper_limit], sizeof(c16_t) * remaining_re);
} }
static inline void dmrs_case5(c16_t *txF, static inline int dmrs_case10(c16_t *txF, c16_t *txl, c16_t *mod_dmrs, const int amp_dmrs, const int amp, int sz)
c16_t *txl,
c16_t *mod_dmrs,
const int amp_dmrs,
const int amp,
int sz,
int start_sc,
int upper_limit,
int remaining_re)
{ {
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
printf("doing DMRS pattern for port 0 : d0 X0 d1 X1 ... dNm2 XNm2 dNm1 XNm1\n"); printf("doing DMRS pattern for port 0 : d0 X0 d1 X1 ... dNm2 XNm2 dNm1 XNm1\n");
#endif #endif
// add filler to process all as SIMD // add filler to process all as SIMD
c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64))); c16_t *out = txF;
c16_t *in = mod_dmrs;
c16_t *out = dmrs_mux;
int i = 0; int i = 0;
int end = sz / 2; int end = sz / 2;
c16_t *txlc = txl; c16_t *txlc = txl;
...@@ -468,74 +420,58 @@ static inline void dmrs_case5(c16_t *txF, ...@@ -468,74 +420,58 @@ static inline void dmrs_case5(c16_t *txF,
__m512i perml = _mm512_set_epi32(23, 7, 22, 6, 21, 5, 20, 4, 19, 3, 18, 2, 17, 1, 16, 0); __m512i perml = _mm512_set_epi32(23, 7, 22, 6, 21, 5, 20, 4, 19, 3, 18, 2, 17, 1, 16, 0);
__m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8); __m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8);
for (; i < (end & ~15); i += 16) { for (; i < (end & ~15); i += 16) {
__m512i d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)in), amp_dmrs512); __m512i d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)(mod_dmrs + i)), amp_dmrs512);
in += 16;
__m512i d1 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)txlc), amp512); __m512i d1 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)txlc), amp512);
txlc += 16; txlc += 16;
*(__m512i *)out = _mm512_permutex2var_epi32(d0, perml, d1); _mm512_storeu_si512((__m512i *)out, _mm512_permutex2var_epi32(d0, perml, d1));
out += 16; out += 16;
*(__m512i *)out = _mm512_permutex2var_epi32(d0, permh, d1); _mm512_storeu_si512((__m512i *)out, _mm512_permutex2var_epi32(d0, permh, d1));
out += 16; out += 16;
} }
#endif #endif
#if defined(__AVX2__) #if defined(__AVX2__)
simde__m256i amp_dmrs256 = simde_mm256_set1_epi16(amp_dmrs), amp256 = simde_mm256_set1_epi16(amp); simde__m256i amp_dmrs256 = simde_mm256_set1_epi16(amp_dmrs), amp256 = simde_mm256_set1_epi16(amp);
for (; i < (end & ~7); i += 8) { for (; i < (end & ~7); i += 8) {
simde__m256i d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)in), amp_dmrs256); simde__m256i d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)(mod_dmrs + i)), amp_dmrs256);
in += 8;
simde__m256i d1 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)txlc), amp256); simde__m256i d1 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)txlc), amp256);
txlc += 8; txlc += 8;
simde__m256i d2 = simde_mm256_unpacklo_epi32(d0, d1); simde__m256i d2 = simde_mm256_unpacklo_epi32(d0, d1);
simde__m256i d3 = simde_mm256_unpackhi_epi32(d0, d1); simde__m256i d3 = simde_mm256_unpackhi_epi32(d0, d1);
*(simde__m256i *)out = simde_mm256_permute2x128_si256(d2, d3, 32); simde_mm256_storeu_si256((simde__m256i *)out, simde_mm256_permute2x128_si256(d2, d3, 32));
out += 8; out += 8;
*(simde__m256i *)out = simde_mm256_permute2x128_si256(d2, d3, 49); simde_mm256_storeu_si256((simde__m256i *)out, simde_mm256_permute2x128_si256(d2, d3, 49));
out += 8; out += 8;
} }
#endif #endif
#if defined(USE128BIT) #if defined(USE128BIT)
simde__m128i amp_dmrs128 = simde_mm_set1_epi16(amp_dmrs), amp128 = simde_mm_set1_epi16(amp); simde__m128i amp_dmrs128 = simde_mm_set1_epi16(amp_dmrs), amp128 = simde_mm_set1_epi16(amp);
for (; i < (end & ~3); i += 4) { for (; i < (end & ~3); i += 4) {
simde__m128i d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)in), amp_dmrs128); simde__m128i d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)(mod_dmrs + i)), amp_dmrs128);
in += 4;
simde__m128i d1 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)txlc), amp128); simde__m128i d1 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)txlc), amp128);
txlc += 4; txlc += 4;
simde__m128i d2 = simde_mm_unpacklo_epi32(d0, d1); simde__m128i d2 = simde_mm_unpacklo_epi32(d0, d1);
simde__m128i d3 = simde_mm_unpackhi_epi32(d0, d1); simde__m128i d3 = simde_mm_unpackhi_epi32(d0, d1);
*(simde__m128i *)out = d2; simde_mm_storeu_si128((simde__m128i *)out, d2);
out += 4; out += 4;
*(simde__m128i *)out = d3; simde_mm_storeu_si128((simde__m128i *)out, d3);
out += 4; out += 4;
} }
#endif #endif
for (; i < end; i++) { for (; i < end; i++) {
*out++ = (c16_t){(((in->r * amp_dmrs) >> 14) + 1) >> 1, (((in->i * amp_dmrs) >> 14) + 1) >> 1}; *out++ = (c16_t){(((mod_dmrs[i].r * amp_dmrs) >> 14) + 1) >> 1, (((mod_dmrs[i].i * amp_dmrs) >> 14) + 1) >> 1};
in++;
*out++ = (c16_t){(((txlc->r * amp) >> 14) + 1) >> 1, (((txlc->i * amp) >> 14) + 1) >> 1}; *out++ = (c16_t){(((txlc->r * amp) >> 14) + 1) >> 1, (((txlc->i * amp) >> 14) + 1) >> 1};
txlc++; txlc++;
} }
memcpy(&txF[start_sc], dmrs_mux, sizeof(c16_t) * upper_limit); return sz / 2;
if (remaining_re)
memcpy(&txF[0], &dmrs_mux[upper_limit], sizeof(c16_t) * remaining_re);
} }
static inline void dmrs_case6(c16_t *txF, static inline int dmrs_case11(c16_t *txF, c16_t *txl, c16_t *mod_dmrs, const int amp_dmrs, const int amp, int sz)
c16_t *txl,
c16_t *mod_dmrs,
const int amp_dmrs,
const int amp,
int sz,
int start_sc,
int upper_limit,
int remaining_re)
{ {
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
printf("doing DMRS pattern for port 1 : d0 X0 -d1 X1 ...dNm2 XNm2 -dNm1 XNm1\n"); printf("doing DMRS pattern for port 1 : d0 X0 -d1 X1 ...dNm2 XNm2 -dNm1 XNm1\n");
#endif #endif
// add filler to process all as SIMD // add filler to process all as SIMD
c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64))); c16_t *out = txF;
c16_t *in = mod_dmrs;
c16_t *out = dmrs_mux;
int i = 0; int i = 0;
int end = sz / 2; int end = sz / 2;
c16_t *txlc = txl; c16_t *txlc = txl;
...@@ -577,13 +513,12 @@ static inline void dmrs_case6(c16_t *txF, ...@@ -577,13 +513,12 @@ static inline void dmrs_case6(c16_t *txF,
__m512i perml = _mm512_set_epi32(23, 7, 22, 6, 21, 5, 20, 4, 19, 3, 18, 2, 17, 1, 16, 0); __m512i perml = _mm512_set_epi32(23, 7, 22, 6, 21, 5, 20, 4, 19, 3, 18, 2, 17, 1, 16, 0);
__m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8); __m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8);
for (; i < (end & ~15); i += 16) { for (; i < (end & ~15); i += 16) {
__m512i d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)in), amp_dmrs512); __m512i d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)(mod_dmrs + i)), amp_dmrs512);
in += 16;
__m512i d1 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)txlc), amp512); __m512i d1 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)txlc), amp512);
txlc += 16; txlc += 16;
*(__m512i *)out = _mm512_permutex2var_epi32(d0, perml, d1); _mm512_storeu_si512((__m512i *)out, _mm512_permutex2var_epi32(d0, perml, d1));
out += 16; out += 16;
*(__m512i *)out = _mm512_permutex2var_epi32(d0, permh, d1); _mm512_storeu_si512((__m512i *)out, _mm512_permutex2var_epi32(d0, permh, d1));
out += 16; out += 16;
} }
#endif #endif
...@@ -606,15 +541,14 @@ static inline void dmrs_case6(c16_t *txF, ...@@ -606,15 +541,14 @@ static inline void dmrs_case6(c16_t *txF,
amp_dmrs), amp_dmrs),
amp256 = simde_mm256_set1_epi16(amp); amp256 = simde_mm256_set1_epi16(amp);
for (; i < (end & ~7); i += 8) { for (; i < (end & ~7); i += 8) {
simde__m256i d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)in), amp_dmrs256); simde__m256i d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)(mod_dmrs + i)), amp_dmrs256);
in += 8;
simde__m256i d1 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)txlc), amp256); simde__m256i d1 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)txlc), amp256);
txlc += 8; txlc += 8;
simde__m256i d2 = simde_mm256_unpacklo_epi32(d0, d1); simde__m256i d2 = simde_mm256_unpacklo_epi32(d0, d1);
simde__m256i d3 = simde_mm256_unpackhi_epi32(d0, d1); simde__m256i d3 = simde_mm256_unpackhi_epi32(d0, d1);
*(simde__m256i *)out = simde_mm256_permute2x128_si256(d2, d3, 32); simde_mm256_storeu_si256((simde__m256i *)out, simde_mm256_permute2x128_si256(d2, d3, 32));
out += 8; out += 8;
*(simde__m256i *)out = simde_mm256_permute2x128_si256(d2, d3, 49); simde_mm256_storeu_si256((simde__m256i *)out, simde_mm256_permute2x128_si256(d2, d3, 49));
out += 8; out += 8;
} }
#endif #endif
...@@ -622,50 +556,36 @@ static inline void dmrs_case6(c16_t *txF, ...@@ -622,50 +556,36 @@ static inline void dmrs_case6(c16_t *txF,
simde__m128i amp_dmrs128 = simde_mm_set_epi16(-amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs, -amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs), simde__m128i amp_dmrs128 = simde_mm_set_epi16(-amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs, -amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs),
amp128 = simde_mm_set1_epi16(amp); amp128 = simde_mm_set1_epi16(amp);
for (; i < (end & ~3); i += 4) { for (; i < (end & ~3); i += 4) {
simde__m128i d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)in), amp_dmrs128); simde__m128i d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)(mod_dmrs + i)), amp_dmrs128);
in += 4;
simde__m128i d1 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)txlc), amp128); simde__m128i d1 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)txlc), amp128);
txlc += 4; txlc += 4;
simde__m128i d2 = simde_mm_unpacklo_epi32(d0, d1); simde__m128i d2 = simde_mm_unpacklo_epi32(d0, d1);
simde__m128i d3 = simde_mm_unpackhi_epi32(d0, d1); simde__m128i d3 = simde_mm_unpackhi_epi32(d0, d1);
*(simde__m128i *)out = d2; simde_mm_storeu_si128((simde__m128i *)out, d2);
out += 4; out += 4;
*(simde__m128i *)out = d3; simde_mm_storeu_si128((simde__m128i *)out, d3);
out += 4; out += 4;
} }
#endif #endif
for (; i < end; i += 2) { for (; i < end;) {
*out++ = (c16_t){(((in->r * amp_dmrs) >> 14) + 1) >> 1, (((in->i * amp_dmrs) >> 14) + 1) >> 1}; *out++ = (c16_t){(((mod_dmrs[i].r * amp_dmrs) >> 14) + 1) >> 1, (((mod_dmrs[i].i * amp_dmrs) >> 14) + 1) >> 1};
in++; i++;
*out++ = (c16_t){(((txlc->r * amp) >> 14) + 1) >> 1, (((txlc->i * amp) >> 14) + 1) >> 1}; *out++ = (c16_t){(((txlc->r * amp) >> 14) + 1) >> 1, (((txlc->i * amp) >> 14) + 1) >> 1};
txlc++; txlc++;
*out++ = (c16_t){-(((in->r * amp_dmrs) >> 14) + 1) >> 1, -(((in->i * amp_dmrs) >> 14) + 1) >> 1}; *out++ = (c16_t){-(((mod_dmrs[i].r * amp_dmrs) >> 14) + 1) >> 1, -(((mod_dmrs[i].i * amp_dmrs) >> 14) + 1) >> 1};
in++; i++;
*out++ = (c16_t){(((txlc->r * amp) >> 14) + 1) >> 1, (((txlc->i * amp) >> 14) + 1) >> 1}; *out++ = (c16_t){(((txlc->r * amp) >> 14) + 1) >> 1, (((txlc->i * amp) >> 14) + 1) >> 1};
txlc++; txlc++;
} }
memcpy(&txF[start_sc], dmrs_mux, sizeof(c16_t) * upper_limit); return sz / 2;
if (remaining_re)
memcpy(&txF[0], &dmrs_mux[upper_limit], sizeof(c16_t) * remaining_re);
} }
static inline void dmrs_case7(c16_t *txF, static inline int dmrs_case12(c16_t *txF, c16_t *txl, c16_t *mod_dmrs, const int amp_dmrs, const int amp, int sz)
c16_t *txl,
c16_t *mod_dmrs,
const int amp_dmrs,
const int amp,
int sz,
int start_sc,
int upper_limit,
int remaining_re)
{ {
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
printf("doing DMRS pattern for port 2 : X0 d0 X1 d1 ... XNm2 dNm2 XNm1 dNm1\n"); printf("doing DMRS pattern for port 2 : X0 d0 X1 d1 ... XNm2 dNm2 XNm1 dNm1\n");
#endif #endif
// add filler to process all as SIMD c16_t *out = txF;
c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64)));
c16_t *in = mod_dmrs;
c16_t *out = dmrs_mux;
int i = 0; int i = 0;
int end = sz / 2; int end = sz / 2;
c16_t *txlc = txl; c16_t *txlc = txl;
...@@ -675,74 +595,57 @@ static inline void dmrs_case7(c16_t *txF, ...@@ -675,74 +595,57 @@ static inline void dmrs_case7(c16_t *txF,
__m512i perml = _mm512_set_epi32(23, 7, 22, 6, 21, 5, 20, 4, 19, 3, 18, 2, 17, 1, 16, 0); __m512i perml = _mm512_set_epi32(23, 7, 22, 6, 21, 5, 20, 4, 19, 3, 18, 2, 17, 1, 16, 0);
__m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8); __m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8);
for (; i < (end & ~15); i += 16) { for (; i < (end & ~15); i += 16) {
__m512i d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)in), amp_dmrs512); __m512i d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)(mod_dmrs + i)), amp_dmrs512);
in += 16;
__m512i d1 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)txlc), amp512); __m512i d1 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)txlc), amp512);
txlc += 16; txlc += 16;
*(__m512i *)out = _mm512_permutex2var_epi32(d1, perml, d0); _mm512_storeu_si512((__m512i *)out, _mm512_permutex2var_epi32(d1, perml, d0));
out += 16; out += 16;
*(__m512i *)out = _mm512_permutex2var_epi32(d1, permh, d0); _mm512_storeu_si512((__m512i *)out, _mm512_permutex2var_epi32(d1, permh, d0));
out += 16; out += 16;
} }
#endif #endif
#if defined(__AVX2__) #if defined(__AVX2__)
simde__m256i amp_dmrs256 = simde_mm256_set1_epi16(amp_dmrs), amp256 = simde_mm256_set1_epi16(amp); simde__m256i amp_dmrs256 = simde_mm256_set1_epi16(amp_dmrs), amp256 = simde_mm256_set1_epi16(amp);
for (; i < (end & ~7); i += 8) { for (; i < (end & ~7); i += 8) {
simde__m256i d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)in), amp_dmrs256); simde__m256i d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)(mod_dmrs + i)), amp_dmrs256);
in += 8;
simde__m256i d1 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)txlc), amp256); simde__m256i d1 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)txlc), amp256);
txlc += 8; txlc += 8;
simde__m256i d2 = simde_mm256_unpacklo_epi32(d0, d1); simde__m256i d2 = simde_mm256_unpacklo_epi32(d0, d1);
simde__m256i d3 = simde_mm256_unpackhi_epi32(d0, d1); simde__m256i d3 = simde_mm256_unpackhi_epi32(d0, d1);
*(simde__m256i *)out = simde_mm256_permute2x128_si256(d2, d3, 32); simde_mm256_storeu_si256((simde__m256i *)out, simde_mm256_permute2x128_si256(d2, d3, 32));
out += 8; out += 8;
*(simde__m256i *)out = simde_mm256_permute2x128_si256(d2, d3, 49); simde_mm256_storeu_si256((simde__m256i *)out, simde_mm256_permute2x128_si256(d2, d3, 49));
out += 8; out += 8;
} }
#endif #endif
#if defined(USE128BIT) #if defined(USE128BIT)
simde__m128i amp_dmrs128 = simde_mm_set1_epi16(amp_dmrs), amp128 = simde_mm_set1_epi16(amp); simde__m128i amp_dmrs128 = simde_mm_set1_epi16(amp_dmrs), amp128 = simde_mm_set1_epi16(amp);
for (; i < (end & ~3); i += 4) { for (; i < (end & ~3); i += 4) {
simde__m128i d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)in), amp_dmrs128); simde__m128i d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)(mod_dmrs + i)), amp_dmrs128);
in += 4;
simde__m128i d1 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)txlc), amp128); simde__m128i d1 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)txlc), amp128);
txlc += 4; txlc += 4;
simde__m128i d2 = simde_mm_unpacklo_epi32(d0, d1); simde__m128i d2 = simde_mm_unpacklo_epi32(d0, d1);
simde__m128i d3 = simde_mm_unpackhi_epi32(d0, d1); simde__m128i d3 = simde_mm_unpackhi_epi32(d0, d1);
*(simde__m128i *)out = d2; simde_mm_storeu_si128((simde__m128i *)out, d2);
out += 4; out += 4;
*(simde__m128i *)out = d3; simde_mm_storeu_si128((simde__m128i *)out, d3);
out += 4; out += 4;
} }
#endif #endif
for (; i < end; i++) { for (; i < end; i++) {
*out++ = (c16_t){(((txlc->r * amp) >> 14) + 1) >> 1, (((txlc->i * amp) >> 14) + 1) >> 1}; *out++ = (c16_t){(((txlc->r * amp) >> 14) + 1) >> 1, (((txlc->i * amp) >> 14) + 1) >> 1};
txlc++; txlc++;
*out++ = (c16_t){(((in->r * amp_dmrs) >> 14) + 1) >> 1, (((in->i * amp_dmrs) >> 14) + 1) >> 1}; *out++ = (c16_t){(((mod_dmrs[i].r * amp_dmrs) >> 14) + 1) >> 1, (((mod_dmrs[i].i * amp_dmrs) >> 14) + 1) >> 1};
in++;
} }
memcpy(&txF[start_sc], dmrs_mux, sizeof(c16_t) * upper_limit); return sz / 2;
if (remaining_re)
memcpy(&txF[0], &dmrs_mux[upper_limit], sizeof(c16_t) * remaining_re);
} }
static inline void dmrs_case8(c16_t *txF, static inline int dmrs_case13(c16_t *txF, c16_t *txl, c16_t *mod_dmrs, const int amp_dmrs, const int amp, int sz)
c16_t *txl,
c16_t *mod_dmrs,
const int amp_dmrs,
const int amp,
int sz,
int start_sc,
int upper_limit,
int remaining_re)
{ {
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
printf("doing DMRS pattern for port 3 : X0 d0 X1 -d1 ... XNm2 dNm2 XNm1 -dNm1\n"); printf("doing DMRS pattern for port 3 : X0 d0 X1 -d1 ... XNm2 dNm2 XNm1 -dNm1\n");
#endif #endif
// add filler to process all as SIMD c16_t *out = txF;
c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64)));
c16_t *in = mod_dmrs;
c16_t *out = dmrs_mux;
int i = 0; int i = 0;
int end = sz / 2; int end = sz / 2;
c16_t *txlc = txl; c16_t *txlc = txl;
...@@ -784,13 +687,12 @@ static inline void dmrs_case8(c16_t *txF, ...@@ -784,13 +687,12 @@ static inline void dmrs_case8(c16_t *txF,
__m512i perml = _mm512_set_epi32(23, 7, 22, 6, 21, 5, 20, 4, 19, 3, 18, 2, 17, 1, 16, 0); __m512i perml = _mm512_set_epi32(23, 7, 22, 6, 21, 5, 20, 4, 19, 3, 18, 2, 17, 1, 16, 0);
__m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8); __m512i permh = _mm512_set_epi32(31, 15, 30, 14, 29, 13, 28, 12, 27, 11, 26, 10, 25, 9, 24, 8);
for (; i < (end & ~15); i += 16) { for (; i < (end & ~15); i += 16) {
__m512i d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)in), amp_dmrs512); __m512i d0 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)(mod_dmrs + i)), amp_dmrs512);
in += 16;
__m512i d1 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)txlc), amp512); __m512i d1 = _mm512_mulhrs_epi16(_mm512_loadu_si512((__m512i *)txlc), amp512);
txlc += 16; txlc += 16;
*(__m512i *)out = _mm512_permutex2var_epi32(d1, perml, d0); _mm512_storeu_si512((__m512i *)out, _mm512_permutex2var_epi32(d1, perml, d0));
out += 16; out += 16;
*(__m512i *)out = _mm512_permutex2var_epi32(d1, permh, d0); _mm512_storeu_si512((__m512i *)out, _mm512_permutex2var_epi32(d1, permh, d0));
out += 16; out += 16;
} }
#endif #endif
...@@ -813,15 +715,14 @@ static inline void dmrs_case8(c16_t *txF, ...@@ -813,15 +715,14 @@ static inline void dmrs_case8(c16_t *txF,
amp_dmrs), amp_dmrs),
amp256 = simde_mm256_set1_epi16(amp); amp256 = simde_mm256_set1_epi16(amp);
for (; i < (end & ~7); i += 8) { for (; i < (end & ~7); i += 8) {
simde__m256i d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)in), amp_dmrs256); simde__m256i d0 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)(mod_dmrs + i)), amp_dmrs256);
in += 8;
simde__m256i d1 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)txlc), amp256); simde__m256i d1 = simde_mm256_mulhrs_epi16(simde_mm256_loadu_si256((simde__m256i *)txlc), amp256);
txlc += 8; txlc += 8;
simde__m256i d2 = simde_mm256_unpacklo_epi32(d0, d1); simde__m256i d2 = simde_mm256_unpacklo_epi32(d0, d1);
simde__m256i d3 = simde_mm256_unpackhi_epi32(d0, d1); simde__m256i d3 = simde_mm256_unpackhi_epi32(d0, d1);
*(simde__m256i *)out = simde_mm256_permute2x128_si256(d2, d3, 32); simde_mm256_storeu_si256((simde__m256i *)out, simde_mm256_permute2x128_si256(d2, d3, 32));
out += 8; out += 8;
*(simde__m256i *)out = simde_mm256_permute2x128_si256(d2, d3, 49); simde_mm256_storeu_si256((simde__m256i *)out, simde_mm256_permute2x128_si256(d2, d3, 49));
out += 8; out += 8;
} }
...@@ -830,41 +731,36 @@ static inline void dmrs_case8(c16_t *txF, ...@@ -830,41 +731,36 @@ static inline void dmrs_case8(c16_t *txF,
simde__m128i amp_dmrs128 = simde_mm_set_epi16(-amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs, -amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs), simde__m128i amp_dmrs128 = simde_mm_set_epi16(-amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs, -amp_dmrs, -amp_dmrs, amp_dmrs, amp_dmrs),
amp128 = simde_mm_set1_epi16(amp); amp128 = simde_mm_set1_epi16(amp);
for (; i < (end & ~3); i += 4) { for (; i < (end & ~3); i += 4) {
simde__m128i d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)in), amp_dmrs128); simde__m128i d0 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)(mod_dmrs + i)), amp_dmrs128);
in += 4;
simde__m128i d1 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)txlc), amp128); simde__m128i d1 = simde_mm_mulhrs_epi16(simde_mm_loadu_si128((simde__m128i *)txlc), amp128);
txlc += 4; txlc += 4;
simde__m128i d2 = simde_mm_unpacklo_epi32(d0, d1); simde__m128i d2 = simde_mm_unpacklo_epi32(d0, d1);
simde__m128i d3 = simde_mm_unpackhi_epi32(d0, d1); simde__m128i d3 = simde_mm_unpackhi_epi32(d0, d1);
*(simde__m128i *)out = d2; simde_mm_storeu_si128((simde__m128i *)out, d2);
out += 4; out += 4;
*(simde__m128i *)out = d3; simde_mm_storeu_si128((simde__m128i *)out, d3);
out += 4; out += 4;
} }
#endif #endif
for (; i < end; i += 2) { for (; i < end;) {
*out++ = (c16_t){(((txlc->r * amp) >> 14) + 1) >> 1, (((txlc->i * amp) >> 14) + 1) >> 1}; *out++ = (c16_t){(((txlc->r * amp) >> 14) + 1) >> 1, (((txlc->i * amp) >> 14) + 1) >> 1};
txlc++; txlc++;
*out++ = (c16_t){(((in->r * amp_dmrs) >> 14) + 1) >> 1, (((in->i * amp_dmrs) >> 14) + 1) >> 1}; *out++ = (c16_t){(((mod_dmrs[i].r * amp_dmrs) >> 14) + 1) >> 1, (((mod_dmrs[i].i * amp_dmrs) >> 14) + 1) >> 1};
in++; i++;
*out++ = (c16_t){(((txlc->r * amp) >> 14) + 1) >> 1, (((txlc->i * amp) >> 14) + 1) >> 1}; *out++ = (c16_t){(((txlc->r * amp) >> 14) + 1) >> 1, (((txlc->i * amp) >> 14) + 1) >> 1};
txlc++; txlc++;
*out++ = (c16_t){-(((in->r * amp_dmrs) >> 14) + 1) >> 1, -(((in->i * amp_dmrs) >> 14) + 1) >> 1}; *out++ = (c16_t){-(((mod_dmrs[i].r * amp_dmrs) >> 14) + 1) >> 1, -(((mod_dmrs[i].i * amp_dmrs) >> 14) + 1) >> 1};
in++; i++;
} }
memcpy(&txF[start_sc], dmrs_mux, sizeof(c16_t) * upper_limit); return sz / 2;
if (remaining_re)
memcpy(&txF[0], &dmrs_mux[upper_limit], sizeof(c16_t) * remaining_re);
} }
static inline int dmrs_case9(int k, static inline int dmrs_case00(c16_t *txF,
c16_t *txF,
c16_t *txl, c16_t *txl,
c16_t *mod_dmrs, c16_t *mod_dmrs,
const int amp_dmrs, const int amp_dmrs,
const int amp, const int amp,
int sz, int sz,
uint *cur_re,
int start_sc, int start_sc,
int remaining_re, int remaining_re,
int dmrs_port, int dmrs_port,
...@@ -873,7 +769,7 @@ static inline int dmrs_case9(int k, ...@@ -873,7 +769,7 @@ static inline int dmrs_case9(int k,
uint16_t *n, uint16_t *n,
int symbol_sz, int symbol_sz,
int l_prime, int l_prime,
nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15) uint8_t numDmrsCdmGrpsNoData)
{ {
// add filler to process all as SIMD // add filler to process all as SIMD
//c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64))); //c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64)));
...@@ -884,6 +780,8 @@ static inline int dmrs_case9(int k, ...@@ -884,6 +780,8 @@ static inline int dmrs_case9(int k,
get_Wf(Wf, dmrs_port, dmrs_Type); get_Wf(Wf, dmrs_port, dmrs_Type);
const int8_t delta = get_delta(dmrs_port, dmrs_Type); const int8_t delta = get_delta(dmrs_port, dmrs_Type);
int dmrs_idx = 0; int dmrs_idx = 0;
int k = start_sc;
c16_t *in = txl;
for (int i = 0; i < sz; i++) { for (int i = 0; i < sz; i++) {
if (k == ((start_sc + get_dmrs_freq_idx(*n, *k_prime, delta, dmrs_Type)) % (symbol_sz))) { if (k == ((start_sc + get_dmrs_freq_idx(*n, *k_prime, delta, dmrs_Type)) % (symbol_sz))) {
txF[k] = c16mulRealShift(mod_dmrs[dmrs_idx], Wt[l_prime] * Wf[*k_prime] * amp_dmrs, 15); txF[k] = c16mulRealShift(mod_dmrs[dmrs_idx], Wt[l_prime] * Wf[*k_prime] * amp_dmrs, 15);
...@@ -893,9 +791,8 @@ static inline int dmrs_case9(int k, ...@@ -893,9 +791,8 @@ static inline int dmrs_case9(int k,
} }
/* Map PTRS Symbol */ /* Map PTRS Symbol */
/* Map DATA Symbol */ /* Map DATA Symbol */
else if (allowed_xlsch_re_in_dmrs_symbol(k, start_sc, symbol_sz, rel15->numDmrsCdmGrpsNoData, dmrs_Type)) { else if (allowed_xlsch_re_in_dmrs_symbol(k, start_sc, symbol_sz, numDmrsCdmGrpsNoData, dmrs_Type)) {
txF[k] = c16mulRealShift(txl[*cur_re], amp, 15); txF[k] = c16mulRealShift(*in++, amp, 15);
*cur_re = *cur_re + 1;
} }
/* mute RE */ /* mute RE */
else { else {
...@@ -904,7 +801,7 @@ static inline int dmrs_case9(int k, ...@@ -904,7 +801,7 @@ static inline int dmrs_case9(int k,
if (++k >= symbol_sz) if (++k >= symbol_sz)
k -= symbol_sz; k -= symbol_sz;
} // RE loop } // RE loop
return k; return in - txl;
} }
static inline int no_ptrs_dmrs_case(c16_t *txF, c16_t *txl, const int amp_dmrs, const int amp, const int sz) static inline int no_ptrs_dmrs_case(c16_t *txF, c16_t *txl, const int amp_dmrs, const int amp, const int sz)
...@@ -1119,7 +1016,6 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC ...@@ -1119,7 +1016,6 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
cur_re = re_beginning_of_symbol; cur_re = re_beginning_of_symbol;
c16_t *txF = txdataF_precoding[layer][l_symbol]; c16_t *txF = txdataF_precoding[layer][l_symbol];
c16_t *txl = tx_layers[layer]; c16_t *txl = tx_layers[layer];
int k = start_sc;
const uint sz = rel15->rbSize * NR_NB_SC_PER_RB; const uint sz = rel15->rbSize * NR_NB_SC_PER_RB;
int upper_limit = sz; int upper_limit = sz;
int remaining_re = 0; int remaining_re = 0;
...@@ -1146,64 +1042,59 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC ...@@ -1146,64 +1042,59 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
slot, slot,
l_symbol); l_symbol);
nr_modulation(gold, n_ptrs * DMRS_MOD_ORDER, DMRS_MOD_ORDER, (int16_t *)mod_ptrs); nr_modulation(gold, n_ptrs * DMRS_MOD_ORDER, DMRS_MOD_ORDER, (int16_t *)mod_ptrs);
k = do_ptrs_symbol(rel15, start_sc, k, &cur_re, symbol_sz, txF, txl, amp, mod_ptrs); cur_re += do_ptrs_symbol(rel15, start_sc, symbol_sz, txF, txl + cur_re, amp, mod_ptrs);
} else if (dmrs_symbol_map & (1 << l_symbol)) { } else if (dmrs_symbol_map & (1 << l_symbol)) {
/* Map DMRS Symbol */ /* Map DMRS Symbol */
int dmrs_port = get_dmrs_port(layer, rel15->dmrsPorts); int dmrs_port = get_dmrs_port(layer, rel15->dmrsPorts);
if (l_prime == 0 && dmrs_Type == NFAPI_NR_DMRS_TYPE1) {
#ifdef DEBUG_DLSCH_MAPPING if (rel15->numDmrsCdmGrpsNoData == 2) {
int Wt[2], Wf[2]; switch (dmrs_port & 3) {
get_Wt(Wt, dmrs_port, dmrs_Type); case 0:
get_Wf(Wf, dmrs_port, dmrs_Type); cur_re += dmrs_case20(txF + start_sc, dmrs_start, amp_dmrs, upper_limit);
const int8_t delta = get_delta(dmrs_port, dmrs_Type); cur_re += dmrs_case20(txF, dmrs_start, amp_dmrs, remaining_re);
uint8_t dmrs_symbol = l_overline + l_prime; break;
case 1:
printf( cur_re += dmrs_case21(txF + start_sc, dmrs_start, amp_dmrs, upper_limit);
"DMRS Type %d params for layer %d : numDmrsCdmGrpsNoData %d Wt %d %d \t Wf %d %d \t delta %d \t l_prime %d \t " cur_re += dmrs_case21(txF, dmrs_start, amp_dmrs, remaining_re);
"l0 " break;
"%d\tDMRS symbol %d\n", case 2:
1 + dmrs_Type, cur_re += dmrs_case22(txF + start_sc, dmrs_start, amp_dmrs, upper_limit);
layer, cur_re += dmrs_case22(txF, dmrs_start, amp_dmrs, remaining_re);
rel15->numDmrsCdmGrpsNoData, break;
Wt[0], case 3:
Wt[1], cur_re += dmrs_case23(txF + start_sc, dmrs_start, amp_dmrs, upper_limit);
Wf[0], cur_re += dmrs_case23(txF, dmrs_start, amp_dmrs, remaining_re);
Wf[1], break;
delta, }
l_prime, } else if (rel15->numDmrsCdmGrpsNoData == 1) {
l_overline, switch (dmrs_port & 3) {
dmrs_symbol); case 0:
#endif cur_re += dmrs_case10(txF + start_sc, txl + cur_re, dmrs_start, amp_dmrs, amp, upper_limit);
if (rel15->numDmrsCdmGrpsNoData == 2 && dmrs_Type == 0 && (dmrs_port & 3) == 0 && l_prime == 0) { cur_re += dmrs_case10(txF, txl + cur_re, dmrs_start + (sz - remaining_re) / 2, amp_dmrs, amp, remaining_re);
dmrs_case1(txF, dmrs_start, amp_dmrs, sz, start_sc, upper_limit, remaining_re); break;
} else if (rel15->numDmrsCdmGrpsNoData == 2 && dmrs_Type == 0 && (dmrs_port & 3) == 1 && l_prime == 0) { case 1:
dmrs_case2(txF, dmrs_start, amp_dmrs, sz, start_sc, upper_limit, remaining_re); cur_re += dmrs_case11(txF + start_sc, txl + cur_re, dmrs_start, amp_dmrs, amp, upper_limit);
} else if (rel15->numDmrsCdmGrpsNoData == 2 && dmrs_Type == 0 && (dmrs_port & 3) == 2 && l_prime == 0) { cur_re += dmrs_case11(txF, txl + cur_re, dmrs_start + (sz - remaining_re) / 2, amp_dmrs, amp, remaining_re);
dmrs_case3(txF, dmrs_start, amp_dmrs, sz, start_sc, upper_limit, remaining_re); break;
} else if (rel15->numDmrsCdmGrpsNoData == 2 && dmrs_Type == 0 && (dmrs_port & 3) == 3 && l_prime == 0) { case 2:
dmrs_case4(txF, dmrs_start, amp_dmrs, sz, start_sc, upper_limit, remaining_re); cur_re += dmrs_case12(txF + start_sc, txl + cur_re, dmrs_start, amp_dmrs, amp, upper_limit);
} else if (rel15->numDmrsCdmGrpsNoData == 1 && dmrs_Type == 0 && (dmrs_port & 3) == 0 && l_prime == 0) { cur_re += dmrs_case12(txF, txl + cur_re, dmrs_start + (sz - remaining_re) / 2, amp_dmrs, amp, remaining_re);
dmrs_case5(txF, txl + cur_re, dmrs_start, amp_dmrs, amp, sz, start_sc, upper_limit, remaining_re); break;
cur_re += sz >> 1; case 3:
} else if (rel15->numDmrsCdmGrpsNoData == 1 && dmrs_Type == 0 && (dmrs_port & 3) == 1 && l_prime == 0) { cur_re += dmrs_case13(txF + start_sc, txl + cur_re, dmrs_start, amp_dmrs, amp, upper_limit);
dmrs_case6(txF, txl + cur_re, dmrs_start, amp_dmrs, amp, sz, start_sc, upper_limit, remaining_re); cur_re += dmrs_case13(txF, txl + cur_re, dmrs_start + (sz - remaining_re) / 2, amp_dmrs, amp, remaining_re);
cur_re += sz >> 1; break;
} else if (rel15->numDmrsCdmGrpsNoData == 1 && dmrs_Type == 0 && (dmrs_port & 3) == 2 && l_prime == 0) { }
dmrs_case7(txF, txl + cur_re, dmrs_start, amp_dmrs, amp, sz, start_sc, upper_limit, remaining_re); } else
cur_re += sz >> 1; AssertFatal(false, "rel15->numDmrsCdmGrpsNoData is %d\n", rel15->numDmrsCdmGrpsNoData);
} else if (rel15->numDmrsCdmGrpsNoData == 1 && dmrs_Type == 0 && (dmrs_port & 3) == 3 && l_prime == 0) {
dmrs_case8(txF, txl + cur_re, dmrs_start, amp_dmrs, amp, sz, start_sc, upper_limit, remaining_re);
cur_re += sz >> 1;
} else { } else {
k = dmrs_case9(k, cur_re += dmrs_case00(txF,
txF, txl + cur_re,
txl,
dmrs_start, dmrs_start,
amp_dmrs, amp_dmrs,
amp, amp,
sz, sz,
&cur_re,
start_sc, start_sc,
remaining_re, remaining_re,
dmrs_port, dmrs_port,
...@@ -1212,7 +1103,7 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC ...@@ -1212,7 +1103,7 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
&n, &n,
symbol_sz, symbol_sz,
l_prime, l_prime,
rel15); rel15->numDmrsCdmGrpsNoData);
} // generic DMRS case } // generic DMRS case
} else { // no PTRS or DMRS in this symbol } else { // no PTRS or DMRS in this symbol
cur_re += no_ptrs_dmrs_case(txF + start_sc, txl + cur_re, amp_dmrs, amp, upper_limit); cur_re += no_ptrs_dmrs_case(txF + start_sc, txl + cur_re, amp_dmrs, amp, upper_limit);
......
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