From 0f704894f4d699554de1287d7ba5c558b4b51703 Mon Sep 17 00:00:00 2001 From: Sy Date: Wed, 1 Jul 2020 14:12:53 +0200 Subject: [PATCH] degradation of performance in BLER corrected | bnProc & bnProcPc unrolled --- .../CODING/nrLDPC_decoder/nrLDPC_decoder.c | 155 ++- .../PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h | 42 +- .../generator_bnProc/bnProcPc_gen_BG1_avx2.c | 244 ++-- .../generator_bnProc/bnProcPc_gen_BG2_avx2.c | 246 ++-- .../generator_bnProc/bnProc_gen_BG1_avx2.c | 374 +++-- .../generator_bnProc/bnProc_gen_BG1_avx2.c.1 | 1235 ----------------- .../generator_bnProc/bnProc_gen_BG2_avx2.c | 534 +++---- .../generator_bnProc/bnProc_gen_avx2 | Bin 279472 -> 119536 bytes .../generator_bnProc/sauvegarde.tar.gz | Bin 9279 -> 8704 bytes .../generator_cnProc/cnProc_gen_BG1_avx2.c | 8 +- .../generator_cnProc/cnProc_gen_avx2 | Bin 43424 -> 43328 bytes .../cnProc_gen_BG1_avx512.c | 15 +- .../cnProc_gen_BG1_avx512.save1 | 603 -------- .../cnProc_gen_BG2_avx512.c | 121 +- .../generator_cnProc_avx512/cnProc_gen_avx512 | Bin 43352 -> 43224 bytes .../generator_cnProc_avx512/sauvegarde.tar.gz | Bin 3958 -> 3797 bytes .../save/cnProc_gen_BG1_avx512.2 | 583 -------- .../save/cnProc_gen_BG1_avx512.c | 557 -------- .../save/cnProc_gen_BG1_avx512.c.today | 596 -------- .../save/cnProc_gen_BG1_avx512.native | 596 -------- .../save/cnProc_gen_BG1_avx512.unrolled | 590 -------- .../bnProc/nrLDPC_bnProc_BG1_R13_AVX2.h | 584 +++----- .../bnProc/nrLDPC_bnProc_BG1_R23_AVX2.h | 172 +-- .../bnProc/nrLDPC_bnProc_BG1_R89_AVX2.h | 56 +- .../bnProc/nrLDPC_bnProc_BG2_R13_AVX2.c | 440 ++++++ .../bnProc/nrLDPC_bnProc_BG2_R15_AVX2.c | 799 +++++++++++ .../bnProc/nrLDPC_bnProc_BG2_R23_AVX2.c | 153 ++ .../bnProcPc/nrLDPC_bnProcPc_BG1_R13_AVX2.h | 58 +- .../bnProcPc/nrLDPC_bnProcPc_BG1_R23_AVX2.h | 45 +- .../bnProcPc/nrLDPC_bnProcPc_BG1_R89_AVX2.h | 36 +- .../bnProcPc/nrLDPC_bnProcPc_BG2_R13_AVX2.h | 51 +- .../bnProcPc/nrLDPC_bnProcPc_BG2_R15_AVX2.h | 58 +- .../bnProcPc/nrLDPC_bnProcPc_BG2_R23_AVX2.h | 39 +- .../cnProc/nrLDPC_cnProc_BG1_R13_AVX2.h | 14 +- .../cnProc/nrLDPC_cnProc_BG1_R23_AVX2.h | 14 +- .../nrLDPC_cnProc_BG1_R13_AVX512.h | 14 +- .../nrLDPC_cnProc_BG1_R23_AVX512.h | 14 +- .../nrLDPC_cnProc_BG2_R13_AVX512.h | 168 ++- .../nrLDPC_cnProc_BG2_R15_AVX512.h | 200 +-- .../nrLDPC_cnProc_BG2_R23_AVX512.h | 143 +- .../nrLDPC_llr2CnProcBuf_BG1_AVX2.h | 1040 ++++++++++++++ 41 files changed, 3902 insertions(+), 6695 deletions(-) delete mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG1_avx2.c.1 delete mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG1_avx512.save1 delete mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/save/cnProc_gen_BG1_avx512.2 delete mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/save/cnProc_gen_BG1_avx512.c delete mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/save/cnProc_gen_BG1_avx512.c.today delete mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/save/cnProc_gen_BG1_avx512.native delete mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/save/cnProc_gen_BG1_avx512.unrolled create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProc/nrLDPC_bnProc_BG2_R13_AVX2.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProc/nrLDPC_bnProc_BG2_R15_AVX2.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProc/nrLDPC_bnProc_BG2_R23_AVX2.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/llr2CnProcBuf/nrLDPC_llr2CnProcBuf_BG1_AVX2.h diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c index e6ca01d28e..6061c397fb 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder.c @@ -1,4 +1,3 @@ - /* * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more * contributor license agreements. See the NOTICE file distributed with @@ -35,7 +34,7 @@ /*---------------------------------------------------------------------- -| cn processing files -->AVX512 +| cn processing files -->AVX512 /----------------------------------------------------------------------*/ //BG1------------------------------------------------------------------- @@ -53,7 +52,7 @@ #else /*---------------------------------------------------------------------- -| cn Processing files -->AVX2 +| cn Processing files -->AVX2 /----------------------------------------------------------------------*/ //BG1------------------------------------------------------------------ @@ -68,7 +67,7 @@ #endif /*---------------------------------------------------------------------- -| bn Processing files -->AVX2 +| bn Processing files -->AVX2 /----------------------------------------------------------------------*/ //bnProcPc------------------------------------------------------------- @@ -94,6 +93,9 @@ + + + #define NR_LDPC_ENABLE_PARITY_CHECK #define NR_LDPC_PROFILER_DETAIL @@ -179,7 +181,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP #endif if (BG == 1) { - nrLDPC_llr2CnProcBuf_BG1(p_lut, p_llr, p_procBuf, Z); + nrLDPC_llr2CnProcBuf_BG1(p_lut, p_llr, p_procBuf, Z); } else { @@ -217,8 +219,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP case 23: { #ifdef __AVX512BW__ - nrLDPC_cnProc_BG1_R23_AVX512(p_procBuf->cnProcBuf, p_procBuf->cnProcBufRes, Z); - //nrLDPC_cnProc_BG1_R13_AVX512(p_procBuf->cnProcBuf,p_procBuf->cnProcBufRes); + nrLDPC_cnProc_BG1_R23_AVX512(p_procBuf->cnProcBuf, p_procBuf->cnProcBufRes, Z); #else nrLDPC_cnProc_BG1_R23_AVX2(p_procBuf->cnProcBuf, p_procBuf->cnProcBufRes, Z); #endif @@ -236,7 +237,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP } } - } //end if + } else { switch (R) @@ -272,7 +273,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP } } - }//end of else + } #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->cnProc); #endif @@ -315,47 +316,47 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP { case 13: { - nrLDPC_bnProcPc_BG1_R13_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); + nrLDPC_bnProcPc_BG1_R13_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); break; } case 23: { - nrLDPC_bnProcPc_BG1_R23_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); + nrLDPC_bnProcPc_BG1_R23_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); break; } case 89: { - nrLDPC_bnProcPc_BG1_R89_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); + nrLDPC_bnProcPc_BG1_R89_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); break; } } - } //end if + } else { switch (R) { case 15: { - nrLDPC_bnProcPc_BG2_R15_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); + nrLDPC_bnProcPc_BG2_R15_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); break; } case 13: - + { - nrLDPC_bnProcPc_BG2_R13_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); + nrLDPC_bnProcPc_BG2_R13_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); break; } - + case 23: - + { - nrLDPC_bnProcPc_BG2_R23_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); + nrLDPC_bnProcPc_BG2_R23_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); break; } - + } - }//end of else + } #ifdef NR_LDPC_PROFILER_DETAIL @@ -370,9 +371,9 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP #ifdef NR_LDPC_PROFILER_DETAIL start_meas(&p_profiler->bnProc); #endif - nrLDPC_bnProc(p_lut, p_procBuf, Z); +// nrLDPC_bnProc(p_lut, p_procBuf, Z); + -/* if (BG==1) { switch (R) @@ -393,7 +394,7 @@ if (BG==1) break; } } - } //end if + } else { switch (R) @@ -404,23 +405,23 @@ if (BG==1) break; } case 13: - + { nrLDPC_bnProc_BG2_R13_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, Z); break; } - + case 23: - + { nrLDPC_bnProc_BG2_R23_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, Z); break; } - + } - }//end of else -*/ + } + #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->bnProc); #endif @@ -500,7 +501,7 @@ if (BG==1) } } - } //end if + } else { switch (R) @@ -536,7 +537,7 @@ if (BG==1) } } - }//end of else + } #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->cnProc); #endif @@ -577,47 +578,47 @@ if (BG==1) { case 13: { - nrLDPC_bnProcPc_BG1_R13_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); + nrLDPC_bnProcPc_BG1_R13_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); break; } case 23: { - nrLDPC_bnProcPc_BG1_R23_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); + nrLDPC_bnProcPc_BG1_R23_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); break; } case 89: { - nrLDPC_bnProcPc_BG1_R89_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); + nrLDPC_bnProcPc_BG1_R89_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); break; } } - } //end if + } else { switch (R) { case 15: { - nrLDPC_bnProcPc_BG2_R15_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); + nrLDPC_bnProcPc_BG2_R15_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); break; } - case 13: - + case 13: + { - nrLDPC_bnProcPc_BG2_R13_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); + nrLDPC_bnProcPc_BG2_R13_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); break; } - + case 23: - + { - nrLDPC_bnProcPc_BG2_R23_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); + nrLDPC_bnProcPc_BG2_R23_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); break; } - + } - }//end of else + } #ifdef NR_LDPC_PROFILER_DETAIL @@ -631,8 +632,8 @@ if (BG==1) #ifdef NR_LDPC_PROFILER_DETAIL start_meas(&p_profiler->bnProc); #endif - nrLDPC_bnProc(p_lut, p_procBuf, Z); -/* +// nrLDPC_bnProc(p_lut, p_procBuf, Z); + if (BG==1) { switch (R) @@ -653,7 +654,7 @@ if (BG==1) break; } } - } //end if + } else { switch (R) @@ -664,23 +665,23 @@ if (BG==1) break; } case 13: - + { nrLDPC_bnProc_BG2_R13_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, Z); break; } - + case 23: - + { nrLDPC_bnProc_BG2_R23_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, Z); break; } - + } - }//end of else -*/ + } + @@ -759,7 +760,6 @@ if (BG==1) { #ifdef __AVX512BW__ nrLDPC_cnProc_BG1_R23_AVX512(p_procBuf->cnProcBuf, p_procBuf->cnProcBufRes, Z); - //nrLDPC_cnProc_BG1_R13_AVX512(p_procBuf->cnProcBuf,p_procBuf->cnProcBufRes); #else nrLDPC_cnProc_BG1_R23_AVX2(p_procBuf->cnProcBuf, p_procBuf->cnProcBufRes, Z); #endif @@ -777,7 +777,7 @@ if (BG==1) } } - } //end if + } else { switch (R) @@ -813,7 +813,7 @@ if (BG==1) } } - }//end of else + } #ifdef NR_LDPC_PROFILER_DETAIL stop_meas(&p_profiler->cnProc); #endif @@ -854,47 +854,47 @@ if (BG==1) { case 13: { - nrLDPC_bnProcPc_BG1_R13_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); + nrLDPC_bnProcPc_BG1_R13_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); break; } case 23: { - nrLDPC_bnProcPc_BG1_R23_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); + nrLDPC_bnProcPc_BG1_R23_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); break; } case 89: { - nrLDPC_bnProcPc_BG1_R89_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); + nrLDPC_bnProcPc_BG1_R89_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); break; } } - } //end if + } else { switch (R) { case 15: { - nrLDPC_bnProcPc_BG2_R15_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); + nrLDPC_bnProcPc_BG2_R15_AVX2(p_procBuf->bnProcBuf, p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); break; } case 13: - + { - nrLDPC_bnProcPc_BG2_R13_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); + nrLDPC_bnProcPc_BG2_R13_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); break; } - + case 23: - + { - nrLDPC_bnProcPc_BG2_R23_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); + nrLDPC_bnProcPc_BG2_R23_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); break; } - + } - }//end of else + } #ifdef NR_LDPC_PROFILER_DETAIL @@ -912,9 +912,9 @@ if (BG==1) start_meas(&p_profiler->bnProc); #endif -nrLDPC_bnProc(p_lut, p_procBuf, Z); +//nrLDPC_bnProc(p_lut, p_procBuf, Z); + -/* if (BG==1) { switch (R) @@ -935,7 +935,7 @@ if (BG==1) break; } } - } //end if + } else { switch (R) @@ -946,23 +946,23 @@ if (BG==1) break; } case 13: - + { nrLDPC_bnProc_BG2_R13_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, Z); break; } - + case 23: - + { nrLDPC_bnProc_BG2_R23_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, Z); break; } - + } } -*/ + #ifdef NR_LDPC_PROFILER_DETAIL @@ -1053,3 +1053,4 @@ if (BG==1) + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h index f2373c6341..9053b24117 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_mPass.h @@ -1,4 +1,3 @@ - /* * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more * contributor license agreements. See the NOTICE file distributed with @@ -22,7 +21,7 @@ /*!\file nrLDPC_mPass.h * \brief Defines the functions for message passing - * + * */ #ifndef __NR_LDPC_MPASS__H__ #define __NR_LDPC_MPASS__H__ @@ -42,7 +41,7 @@ \param Z Lifting size \param cshift Circular shift */ -//more faster memcpy by using "rep movsb", which on modern processors is highly optimized +//more faster memcpy by using "rep movsb", which on modern processors is highly optimized void *memcpy1(void *dst, const void *src, size_t n) { @@ -177,8 +176,7 @@ static inline void nrLDPC_llr2CnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* llr, t_ bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX; -// #pragma omp simd -// #pragma omp parallel for schedule(dynamic) + for (j=0; j<3; j++) { @@ -1026,7 +1024,7 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf // CN group with 3 BNs bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX; -// #pragma omp simd + for (j=0;j<2; j++) { p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[0] + j*bitOffsetInGroup]; @@ -1037,11 +1035,11 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf // CN group with 4 BNs bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX; - // #pragma omp simd + for (j=0; j<3; j++) { p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[1] + j*bitOffsetInGroup]; - // #pragma omp simd + for (i=0; i #include #include "../../nrLDPCdecoder_defs.h" @@ -22,8 +23,8 @@ void nrLDPC_bnProcPc_BG1_generator_AVX2(int R) // fprintf(fd,"#include \n"); // fprintf(fd,"#include \n"); - - fprintf(fd,"static inline void nrLDPC_bnProcPc_BG1_R%s_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {\n",ratestr[R]); + + fprintf(fd,"static inline void nrLDPC_bnProcPc_BG1_R%s_AVX2(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {\n",ratestr[R]); const uint8_t* lut_numBnInBnGroups; const uint32_t* lut_startAddrBnGroups; const uint16_t* lut_startAddrBnGroupsLlr; @@ -59,72 +60,67 @@ void nrLDPC_bnProcPc_BG1_generator_AVX2(int R) fprintf(fd," __m256i ymm0, ymm1, ymmRes0, ymmRes1; \n"); - + fprintf(fd," __m128i* p_bnProcBuf; \n"); - fprintf(fd," __m256i* p_bnProcBufRes; \n"); fprintf(fd," __m128i* p_llrProcBuf;\n"); - fprintf(fd," __m256i* p_llrProcBuf256; \n"); fprintf(fd," __m256i* p_llrRes; \n"); fprintf(fd," uint32_t M ;\n"); - - - - - // ===================================================================== - // Process group with 1 CN - // Already done in bnProcBufPc - - // ===================================================================== - fprintf(fd, "// Process group with 1 CNs \n"); - // if (lut_numBnInBnGroups[1] > 0) - // { + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[0] > 0) + { // If elements in group move to next address -// idxBnGroup++; + // idxBnGroup++; // Number of groups of 32 BNs for parallel processing - fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[26] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[0] ); - fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - fprintf(fd," p_llrProcBuf256 = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[0]*NR_LDPC_ZMAX)>>4; + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs fprintf(fd," for (int i=0,j=0;i>5 ); - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 8 CNs - + fprintf(fd, "// Process group with 8 CNs \n"); // Process group with 8 CNs @@ -519,14 +515,14 @@ fprintf(fd, "// Process group with 8 CNs \n"); // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] //fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 9 CNs - + fprintf(fd, "// Process group with 9 CNs \n"); // Process group with 9 CNs @@ -575,15 +571,15 @@ fprintf(fd, "// Process group with 9 CNs \n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] //fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 10 CNs - + fprintf(fd, "// Process group with 10 CNs \n"); // Process group with 10 CNs @@ -631,15 +627,15 @@ fprintf(fd, "// Process group with 10 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== - + fprintf(fd, "// Process group with 11 CNs \n"); @@ -689,8 +685,8 @@ fprintf(fd, "// Process group with 11 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== @@ -744,8 +740,8 @@ fprintf(fd, "// Process group with 12 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } @@ -800,8 +796,8 @@ fprintf(fd, "// Process group with 13 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } @@ -857,15 +853,15 @@ fprintf(fd, "// Process group with 14 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 5 CNs - + fprintf(fd, "// Process group with 15 CNs \n"); // Process group with 5 CNs @@ -913,8 +909,8 @@ fprintf(fd, "// Process group with 15 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } @@ -922,7 +918,7 @@ fprintf(fd, "// Process group with 15 CNs \n"); // ===================================================================== // Process group with 6 CNs - + fprintf(fd, "// Process group with 16 CNs \n"); // Process group with 6 CNs @@ -970,15 +966,15 @@ fprintf(fd, "// Process group with 16 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 17 CNs - + fprintf(fd, "// Process group with 17 CNs \n"); // Process group with 17 CNs @@ -1026,15 +1022,15 @@ fprintf(fd, "// Process group with 17 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 18 CNs - + fprintf(fd, "// Process group with 18 CNs \n"); // Process group with 8 CNs @@ -1082,14 +1078,14 @@ fprintf(fd, "// Process group with 18 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 9 CNs - + fprintf(fd, "// Process group with 19 CNs \n"); // Process group with 9 CNs @@ -1137,15 +1133,15 @@ fprintf(fd, "// Process group with 19 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 20 CNs - + fprintf(fd, "// Process group with 20 CNs \n"); // Process group with 20 CNs @@ -1193,8 +1189,8 @@ fprintf(fd, "// Process group with 20 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } @@ -1203,7 +1199,7 @@ fprintf(fd, "// Process group with 20 CNs \n"); // ===================================================================== - + fprintf(fd, "// Process group with 21 CNs \n"); @@ -1253,8 +1249,8 @@ fprintf(fd, "// Process group with 21 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== @@ -1308,8 +1304,8 @@ fprintf(fd, "// Process group with 22 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } @@ -1364,8 +1360,8 @@ fprintf(fd, "// Process group with <23 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } @@ -1421,15 +1417,15 @@ fprintf(fd, "// Process group with 24 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 5 CNs - + fprintf(fd, "// Process group with 25 CNs \n"); // Process group with 5 CNs @@ -1477,8 +1473,8 @@ fprintf(fd, "// Process group with 25 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } @@ -1486,7 +1482,7 @@ fprintf(fd, "// Process group with 25 CNs \n"); // ===================================================================== // Process group with 6 CNs - + fprintf(fd, "// Process group with 26 CNs \n"); // Process group with 6 CNs @@ -1534,15 +1530,15 @@ fprintf(fd, "// Process group with 26 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 17 CNs - + fprintf(fd, "// Process group with 27 CNs \n"); // Process group with 17 CNs @@ -1590,15 +1586,15 @@ fprintf(fd, "// Process group with 27 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 18 CNs - + fprintf(fd, "// Process group with 28 CNs \n"); // Process group with 8 CNs @@ -1646,14 +1642,14 @@ fprintf(fd, "// Process group with 28 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 9 CNs - + fprintf(fd, "// Process group with 29 CNs \n"); // Process group with 9 CNs @@ -1701,15 +1697,15 @@ fprintf(fd, "// Process group with 29 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 20 CNs - + fprintf(fd, "// Process group with 30 CNs \n"); // Process group with 20 CNs @@ -1757,8 +1753,8 @@ fprintf(fd, "// Process group with 30 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } @@ -1769,3 +1765,5 @@ fprintf(fd, "// Process group with 30 CNs \n"); + + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG2_avx2.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG2_avx2.c index fbb7dde5e0..a6662ee331 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG2_avx2.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG2_avx2.c @@ -1,5 +1,7 @@ + + #include #include #include "../../nrLDPCdecoder_defs.h" @@ -22,8 +24,8 @@ void nrLDPC_bnProcPc_BG2_generator_AVX2(int R) // fprintf(fd,"#include \n"); //fprintf(fd,"#include \n"); - - fprintf(fd,"static inline void nrLDPC_bnProcPc_BG2_R%s_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {\n",ratestr[R]); + + fprintf(fd,"static inline void nrLDPC_bnProcPc_BG2_R%s_AVX2(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {\n",ratestr[R]); const uint8_t* lut_numBnInBnGroups; const uint32_t* lut_startAddrBnGroups; const uint16_t* lut_startAddrBnGroupsLlr; @@ -60,72 +62,67 @@ void nrLDPC_bnProcPc_BG2_generator_AVX2(int R) fprintf(fd," __m256i ymm0, ymm1, ymmRes0, ymmRes1; \n"); - + fprintf(fd," __m128i* p_bnProcBuf; \n"); - fprintf(fd," __m256i* p_bnProcBufRes; \n"); fprintf(fd," __m128i* p_llrProcBuf;\n"); - fprintf(fd," __m256i* p_llrProcBuf256; \n"); fprintf(fd," __m256i* p_llrRes; \n"); fprintf(fd," uint32_t M ;\n"); - - - - - // ===================================================================== - // Process group with 1 CN - // Already done in bnProcBufPc - - // ===================================================================== - fprintf(fd, "// Process group with 1 CNs \n"); - // if (lut_numBnInBnGroups[1] > 0) - // { + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[0] > 0) + { // If elements in group move to next address -// idxBnGroup++; + // idxBnGroup++; // Number of groups of 32 BNs for parallel processing - fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[26] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[0] ); - fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - fprintf(fd," p_llrProcBuf256 = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[0]*NR_LDPC_ZMAX)>>4; + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs fprintf(fd," for (int i=0,j=0;i>5 ); - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 8 CNs - + fprintf(fd, "// Process group with 8 CNs \n"); // Process group with 8 CNs @@ -520,14 +517,14 @@ fprintf(fd, "// Process group with 8 CNs \n"); // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] //fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 9 CNs - + fprintf(fd, "// Process group with 9 CNs \n"); // Process group with 9 CNs @@ -576,15 +573,15 @@ fprintf(fd, "// Process group with 9 CNs \n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] //fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 10 CNs - + fprintf(fd, "// Process group with 10 CNs \n"); // Process group with 10 CNs @@ -632,15 +629,15 @@ fprintf(fd, "// Process group with 10 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== - + fprintf(fd, "// Process group with 11 CNs \n"); @@ -690,8 +687,8 @@ fprintf(fd, "// Process group with 11 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== @@ -745,8 +742,8 @@ fprintf(fd, "// Process group with 12 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } @@ -801,8 +798,8 @@ fprintf(fd, "// Process group with 13 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } @@ -858,15 +855,15 @@ fprintf(fd, "// Process group with 14 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 5 CNs - + fprintf(fd, "// Process group with 15 CNs \n"); // Process group with 5 CNs @@ -914,8 +911,8 @@ fprintf(fd, "// Process group with 15 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } @@ -923,7 +920,7 @@ fprintf(fd, "// Process group with 15 CNs \n"); // ===================================================================== // Process group with 6 CNs - + fprintf(fd, "// Process group with 16 CNs \n"); // Process group with 6 CNs @@ -971,15 +968,15 @@ fprintf(fd, "// Process group with 16 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 17 CNs - + fprintf(fd, "// Process group with 17 CNs \n"); // Process group with 17 CNs @@ -1027,15 +1024,15 @@ fprintf(fd, "// Process group with 17 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 18 CNs - + fprintf(fd, "// Process group with 18 CNs \n"); // Process group with 8 CNs @@ -1083,14 +1080,14 @@ fprintf(fd, "// Process group with 18 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 9 CNs - + fprintf(fd, "// Process group with 19 CNs \n"); // Process group with 9 CNs @@ -1138,15 +1135,15 @@ fprintf(fd, "// Process group with 19 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 20 CNs - + fprintf(fd, "// Process group with 20 CNs \n"); // Process group with 20 CNs @@ -1194,8 +1191,8 @@ fprintf(fd, "// Process group with 20 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } @@ -1204,7 +1201,7 @@ fprintf(fd, "// Process group with 20 CNs \n"); // ===================================================================== - + fprintf(fd, "// Process group with 21 CNs \n"); @@ -1254,8 +1251,8 @@ fprintf(fd, "// Process group with 21 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== @@ -1309,8 +1306,8 @@ fprintf(fd, "// Process group with 22 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } @@ -1318,7 +1315,7 @@ fprintf(fd, "// Process group with 22 CNs \n"); // Process group with 13 CNs -fprintf(fd, "// Process group with 23 CNs \n"); +fprintf(fd, "// Process group with <23 CNs \n"); // Process group with 3 CNs @@ -1365,8 +1362,8 @@ fprintf(fd, "// Process group with 23 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } @@ -1422,15 +1419,15 @@ fprintf(fd, "// Process group with 24 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 5 CNs - + fprintf(fd, "// Process group with 25 CNs \n"); // Process group with 5 CNs @@ -1478,8 +1475,8 @@ fprintf(fd, "// Process group with 25 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } @@ -1487,7 +1484,7 @@ fprintf(fd, "// Process group with 25 CNs \n"); // ===================================================================== // Process group with 6 CNs - + fprintf(fd, "// Process group with 26 CNs \n"); // Process group with 6 CNs @@ -1535,15 +1532,15 @@ fprintf(fd, "// Process group with 26 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 17 CNs - + fprintf(fd, "// Process group with 27 CNs \n"); // Process group with 17 CNs @@ -1591,15 +1588,15 @@ fprintf(fd, "// Process group with 27 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 18 CNs - + fprintf(fd, "// Process group with 28 CNs \n"); // Process group with 8 CNs @@ -1647,14 +1644,14 @@ fprintf(fd, "// Process group with 28 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 9 CNs - + fprintf(fd, "// Process group with 29 CNs \n"); // Process group with 9 CNs @@ -1702,15 +1699,15 @@ fprintf(fd, "// Process group with 29 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } // ===================================================================== // Process group with 20 CNs - + fprintf(fd, "// Process group with 30 CNs \n"); // Process group with 20 CNs @@ -1758,8 +1755,8 @@ fprintf(fd, "// Process group with 30 CNs \n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] - fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); + fprintf(fd,"}\n"); } @@ -1770,3 +1767,8 @@ fprintf(fd, "// Process group with 30 CNs \n"); + + + + + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG1_avx2.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG1_avx2.c index 4cb44cc0bb..96dc885766 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG1_avx2.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG1_avx2.c @@ -1,4 +1,5 @@ + #include #include #include "../../nrLDPCdecoder_defs.h" @@ -25,9 +26,9 @@ void nrLDPC_bnProc_BG1_generator_AVX2(int R) //fprintf(fd,"#include \n"); //fprintf(fd,"#include \n"); - + fprintf(fd,"static inline void nrLDPC_bnProc_BG1_R%s_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z ) {\n", ratestr[R]); - + const uint8_t* lut_numBnInBnGroups; const uint32_t* lut_startAddrBnGroups; const uint16_t* lut_startAddrBnGroupsLlr; @@ -63,7 +64,7 @@ void nrLDPC_bnProc_BG1_generator_AVX2(int R) uint8_t idxBnGroup = 0; - + fprintf(fd," __m256i* p_bnProcBuf; \n"); fprintf(fd," __m256i* p_bnProcBufRes; \n"); fprintf(fd," __m256i* p_llrRes; \n"); @@ -78,6 +79,9 @@ void nrLDPC_bnProc_BG1_generator_AVX2(int R) // ===================================================================== + + // ===================================================================== + fprintf(fd, "// Process group with 2 CNs \n"); if (lut_numBnInBnGroups[1] > 0) @@ -87,15 +91,15 @@ fprintf(fd, "// Process group with 2 CNs \n"); // Number of groups of 32 BNs or parallel processing fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[1] ); - + // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<2; k++) { @@ -104,16 +108,14 @@ fprintf(fd, "// Process group with 2 CNs \n"); // Loop over BNs fprintf(fd," for (i=0;i 0) { @@ -175,8 +175,8 @@ fprintf(fd, "// Process group with 4 CNs \n"); // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + for (k=0; k<4; k++) { fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); @@ -184,9 +184,7 @@ fprintf(fd, "// Process group with 4 CNs \n"); // Loop over BNs fprintf(fd," for (i=0;i 0) @@ -450,8 +436,8 @@ fprintf(fd, "// Process group with 11 CNs \n"); // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<11; k++) { @@ -460,12 +446,10 @@ fprintf(fd, "// Process group with 11 CNs \n"); // Loop over BNs fprintf(fd," for (i=0;i 0) { @@ -650,8 +626,8 @@ fprintf(fd, "// Process group with 16 CNs \n"); // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<16; k++) { @@ -660,19 +636,17 @@ fprintf(fd, "// Process group with 16 CNs \n"); // Loop over BNs fprintf(fd," for (i=0;i 0) { @@ -853,8 +819,8 @@ fprintf(fd, "// Process group with 21 CNs \n"); // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<21; k++) { @@ -863,12 +829,10 @@ fprintf(fd, "// Process group with 21 CNs \n"); // Loop over BNs fprintf(fd," for (i=0;i 0) { @@ -1053,8 +1010,8 @@ fprintf(fd, "// Process group with 26 CNs \n"); // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<26; k++) { @@ -1063,19 +1020,17 @@ fprintf(fd, "// Process group with 26 CNs \n"); // Loop over BNs fprintf(fd," for (i=0;i -#include -#include "../../nrLDPCdecoder_defs.h" -#include "../../nrLDPC_types.h" -#include "../../nrLDPC_bnProc.h" -#include "../../nrLDPC_cnProc.h" -#include "../../nrLDPC_init.h" - -void nrLDPC_bnProc_BG1_generator_AVX2(uint16_t Z,int R) -{ - const char *ratestr[3]={"13","23","89"}; - - if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} - - - // system("mkdir -p ../ldpc_gen_files"); - - char fname[50]; - sprintf(fname,"../ldpc_gen_files/bnProc/nrLDPC_bnProc_BG1_Z%d_R%s_AVX2.c",Z,ratestr[R]); - FILE *fd=fopen(fname,"w"); - if (fd == NULL) {printf("Cannot create \n");abort();} - - fprintf(fd,"#include \n"); - fprintf(fd,"#include \n"); - - - fprintf(fd,"void nrLDPC_bnProc_BG1_Z%d_R%s_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes ) {\n",Z, ratestr[R]); - const uint8_t* lut_numBnInBnGroups; - const uint32_t* lut_startAddrBnGroups; - const uint16_t* lut_startAddrBnGroupsLlr; - if (R==0) { - - - lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R13; - lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R13; - lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R13; - - } - else if (R==1){ - - lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R23; - lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R23; - lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R23; - } - else if (R==2) { - - lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R89; - lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R89; - lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R89; - } - else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} - - - uint32_t M; - //uint32_t M32rem; - // uint32_t i; - uint32_t k; - // Offset to each bit within a group in terms of 32 Byte - uint32_t cnOffsetInGroup; - uint8_t idxBnGroup = 0; - - - - fprintf(fd," __m256i* p_bnProcBuf; \n"); - fprintf(fd," __m256i* p_bnProcBufRes; \n"); - fprintf(fd," __m256i* p_llrRes; \n"); - fprintf(fd," __m256i* p_res; \n"); - - - -// ===================================================================== - // Process group with 1 CN - // Already done in bnProcBufPc - - // ===================================================================== - -fprintf(fd, "// Process group with 2 CNs \n"); - - if (lut_numBnInBnGroups[1] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[1]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<2; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - - - - } - - // ===================================================================== - - -fprintf(fd, "// Process group with 3 CNs \n"); - - - - if (lut_numBnInBnGroups[2] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[2]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - for (k=0; k<3; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - } - } - - - - // ===================================================================== - - -fprintf(fd, "// Process group with 4 CNs \n"); - - - - if (lut_numBnInBnGroups[3] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[3]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[3]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - for (k=0; k<4; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - } - } - - - // ===================================================================== - - - fprintf(fd, "// Process group with 5 CNs \n"); - - - - if (lut_numBnInBnGroups[4] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[4]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[4]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<5; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - - - // ===================================================================== - - -fprintf(fd, "// Process group with 6 CNs \n"); - - // Process group with 6 CNs - - if (lut_numBnInBnGroups[5] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[5]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[5]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<6; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - - // ===================================================================== - - -fprintf(fd, "// Process group with 7 CNs \n"); - - // Process group with 7 CNs - - if (lut_numBnInBnGroups[6] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[6]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[6]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<7; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - - // ===================================================================== - - -fprintf(fd, "// Process group with 8 CNs \n"); - - // Process group with 8 CNs - - if (lut_numBnInBnGroups[7] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[7]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[7]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<8; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - // ===================================================================== - - -fprintf(fd, "// Process group with 9 CNs \n"); - - // Process group with 9 CNs - - if (lut_numBnInBnGroups[8] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[8]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[8]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<9; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - - // ===================================================================== - -fprintf(fd, "// Process group with 10 CNs \n"); - - // Process group with 10 CNs - - if (lut_numBnInBnGroups[9] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[9]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[9]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<10; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - - - // ===================================================================== - -fprintf(fd, "// Process group with 11 CNs \n"); - - if (lut_numBnInBnGroups[10] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[10]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[10]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<11; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - // ===================================================================== - - - -fprintf(fd, "// Process group with 12 CNs \n"); - - - if (lut_numBnInBnGroups[11] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[11]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[11]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<12; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - // ===================================================================== - - - -fprintf(fd, "// Process group with 13 CNs \n"); - - - - if (lut_numBnInBnGroups[12] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[12]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[12]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<1; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - - - // ===================================================================== - - -fprintf(fd, "// Process group with 14 CNs \n"); - - - - if (lut_numBnInBnGroups[13] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[13]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[13]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<14; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - - // ===================================================================== - - -fprintf(fd, "// Process group with 15 CNs \n"); - - - - if (lut_numBnInBnGroups[14] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[14]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[14]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<15; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - - - // ===================================================================== - - -fprintf(fd, "// Process group with 16 CNs \n"); - - - - if (lut_numBnInBnGroups[15] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[15]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[15]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<16; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - - // ===================================================================== - // Process group with 17 CNs - -fprintf(fd, "// Process group with 17 CNs \n"); - - // Process group with 17 CNs - - if (lut_numBnInBnGroups[16] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[16]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[16]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<17; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - - // ===================================================================== - - -fprintf(fd, "// Process group with 18 CNs \n"); - - // Process group with 8 CNs - - if (lut_numBnInBnGroups[17] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[17]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[17]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<18; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - // ===================================================================== - - -fprintf(fd, "// Process group with 19 CNs \n"); - - - - if (lut_numBnInBnGroups[18] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[18]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[18]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<19; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - - // ===================================================================== - - -fprintf(fd, "// Process group with 20 CNs \n"); - - - - if (lut_numBnInBnGroups[19] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[19]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[19]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<20; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - - - - - // ===================================================================== - -fprintf(fd, "// Process group with 21 CNs \n"); - - - - - - if (lut_numBnInBnGroups[20] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[20]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[20]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<21; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - // ===================================================================== - - - -fprintf(fd, "// Process group with 22 CNs \n"); - - - if (lut_numBnInBnGroups[21] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[21]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[21]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<22; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - // ===================================================================== - - - -fprintf(fd, "// Process group with <23 CNs \n"); - - - - if (lut_numBnInBnGroups[22] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[22]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[22]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<23; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - - - // ===================================================================== - - -fprintf(fd, "// Process group with 24 CNs \n"); - - // Process group with 4 CNs - - if (lut_numBnInBnGroups[23] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[23]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[23]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<24; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - - // ===================================================================== - - -fprintf(fd, "// Process group with 25 CNs \n"); - - - - if (lut_numBnInBnGroups[24] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[24]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[24]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<25; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - - - // ===================================================================== - - -fprintf(fd, "// Process group with 26 CNs \n"); - - - - if (lut_numBnInBnGroups[25] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[25]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[25]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<26; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - - // ===================================================================== - - -fprintf(fd, "// Process group with 27 CNs \n"); - - // Process group with 17 CNs - - if (lut_numBnInBnGroups[26] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[26]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[26]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<27; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - - // ===================================================================== - - -fprintf(fd, "// Process group with 28 CNs \n"); - - // Process group with 8 CNs - - if (lut_numBnInBnGroups[27] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[27]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[27]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<28; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - // ===================================================================== - -fprintf(fd, "// Process group with 29 CNs \n"); - - // Process group with 9 CNs - - if (lut_numBnInBnGroups[28] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[28]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[28]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<29; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - - // ===================================================================== - -fprintf(fd, "// Process group with 30 CNs \n"); - - // Process group with 20 CNs - - if (lut_numBnInBnGroups[29] > 0) - { - // If elements in group move to next address - idxBnGroup++; - - // Number of groups of 32 BNs for parallel processing - M = (lut_numBnInBnGroups[29]*Z + 31)>>5; - - // Set the offset to each CN within a group in terms of 16 Byte - cnOffsetInGroup = (lut_numBnInBnGroups[29]*NR_LDPC_ZMAX)>>5; - - // Set pointers to start of group 2 - fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - - // Loop over CNs - for (k=0; k<30; k++) - { - fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); - fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); - - // Loop over BNs - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); - - fprintf(fd,"}\n"); - - } - } - - fprintf(fd,"}\n"); - fclose(fd); -}//end of the function nrLDPC_bnProc_BG1 - - - - diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG2_avx2.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG2_avx2.c index 670bb4d13e..617dc54520 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG2_avx2.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG2_avx2.c @@ -1,10 +1,13 @@ + + #include #include #include "../../nrLDPCdecoder_defs.h" #include "../../nrLDPC_types.h" -#include "../../nrLDPC_bnProc.h" -#include "../../nrLDPC_cnProc.h" -#include "../../nrLDPC_init.h" +//#include "../../nrLDPC_bnProc.h" +//#include "../../nrLDPC_cnProc.h" +//#include "../../nrLDPC_init.h" + void nrLDPC_bnProc_BG2_generator_AVX2(int R) { @@ -16,13 +19,13 @@ void nrLDPC_bnProc_BG2_generator_AVX2(int R) // system("mkdir -p ../ldpc_gen_files"); char fname[50]; - sprintf(fname,"../ldpc_gen_files/bnProc/nrLDPC_bnProc_BG2_R%s_AVX2.h",ratestr[R]); + sprintf(fname,"../ldpc_gen_files/bnProc/nrLDPC_bnProc_BG2_R%s_AVX2.c",ratestr[R]); FILE *fd=fopen(fname,"w"); if (fd == NULL) {printf("Cannot create \n");abort();} fprintf(fd,"#include \n"); fprintf(fd,"#include \n"); - + fprintf(fd,"void nrLDPC_bnProc_BG2_R%s_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z ) {\n",ratestr[R]); const uint8_t* lut_numBnInBnGroups; const uint32_t* lut_startAddrBnGroups; @@ -59,12 +62,12 @@ void nrLDPC_bnProc_BG2_generator_AVX2(int R) uint8_t idxBnGroup = 0; - + fprintf(fd," __m256i* p_bnProcBuf; \n"); fprintf(fd," __m256i* p_bnProcBufRes; \n"); fprintf(fd," __m256i* p_llrRes; \n"); fprintf(fd," __m256i* p_res; \n"); - fprintf(fd," uint32_t M, i;\n"); + fprintf(fd," uint32_t M, i; \n"); @@ -74,6 +77,9 @@ void nrLDPC_bnProc_BG2_generator_AVX2(int R) // ===================================================================== + + // ===================================================================== + fprintf(fd, "// Process group with 2 CNs \n"); if (lut_numBnInBnGroups[1] > 0) @@ -81,16 +87,17 @@ fprintf(fd, "// Process group with 2 CNs \n"); // If elements in group move to next address idxBnGroup++; - // Number of groups of 32 BNs for parallel processing - fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[1] ); + // Number of groups of 32 BNs or parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[1] ); + // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<2; k++) { @@ -98,18 +105,15 @@ fprintf(fd, "// Process group with 2 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[1] ); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[2] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[2] ); // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + for (k=0; k<3; k++) { fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[2] ); - fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); - fprintf(fd," p_res++;\n"); - fprintf(fd," p_llrRes++;\n"); + fprintf(fd," for (i=0;i 0) { @@ -165,26 +166,23 @@ fprintf(fd, "// Process group with 4 CNs \n"); idxBnGroup++; // Number of groups of 32 BNs for parallel processing - fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[3] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[3] ); // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[3]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + for (k=0; k<4; k++) { fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[4] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[4] ); // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[4]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<5; k++) { @@ -220,22 +218,19 @@ fprintf(fd, "// Process group with 4 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[5] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[5] ); // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[5]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<6; k++) { @@ -262,21 +257,18 @@ fprintf(fd, "// Process group with 6 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[6] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[6] ); // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[6]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<7; k++) { @@ -303,21 +295,18 @@ fprintf(fd, "// Process group with 7 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[7] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[7] ); // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[7]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<8; k++) { @@ -344,20 +333,17 @@ fprintf(fd, "// Process group with 8 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[8] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[8] ); // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[8]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<9; k++) { @@ -384,14 +370,11 @@ fprintf(fd, "// Process group with 9 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[9] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[9] ); // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[9]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<10; k++) { @@ -424,21 +407,18 @@ fprintf(fd, "// Process group with 10 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i 0) @@ -447,15 +427,15 @@ fprintf(fd, "// Process group with 11 CNs \n"); idxBnGroup++; // Number of groups of 32 BNs for parallel processing - fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[10] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[10] );; // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[10]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<11; k++) { @@ -463,14 +443,11 @@ fprintf(fd, "// Process group with 11 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[11] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[11] );; // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[11]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<12; k++) { @@ -502,14 +479,11 @@ fprintf(fd, "// Process group with 12 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[12] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[12] );; // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[12]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs - for (k=0; k<1; k++) + for (k=0; k<13; k++) { fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[13] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[13] );; // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[13]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<14; k++) { @@ -585,21 +556,18 @@ fprintf(fd, "// Process group with 14 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[14] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[14] );; // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[14]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<15; k++) { @@ -626,14 +594,11 @@ fprintf(fd, "// Process group with 15 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i 0) { @@ -652,15 +617,15 @@ fprintf(fd, "// Process group with 16 CNs \n"); idxBnGroup++; // Number of groups of 32 BNs for parallel processing - fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[15] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[15] );; // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[15]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<16; k++) { @@ -668,21 +633,18 @@ fprintf(fd, "// Process group with 16 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[16] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[16] );; // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[16]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<17; k++) { @@ -709,21 +671,18 @@ fprintf(fd, "// Process group with 17 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[17] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[17] );; // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[17]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<18; k++) { @@ -750,20 +709,17 @@ fprintf(fd, "// Process group with 18 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[18] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[18] );; // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[18]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<19; k++) { @@ -790,21 +746,18 @@ fprintf(fd, "// Process group with 19 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[19] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[19] );; // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[19]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<20; k++) { @@ -831,14 +784,11 @@ fprintf(fd, "// Process group with 20 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i 0) { @@ -860,15 +810,15 @@ fprintf(fd, "// Process group with 21 CNs \n"); idxBnGroup++; // Number of groups of 32 BNs for parallel processing - fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[20] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[20] );; // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[20]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<21; k++) { @@ -876,14 +826,11 @@ fprintf(fd, "// Process group with 21 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[21] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[21] );; // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[21]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<22; k++) { @@ -915,22 +862,19 @@ fprintf(fd, "// Process group with 22 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[22] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[22] );; // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[22]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<23; k++) { @@ -956,21 +900,18 @@ fprintf(fd, "// Process group with 23 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[23] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[23] );; // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[23]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<24; k++) { @@ -998,21 +939,18 @@ fprintf(fd, "// Process group with 24 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[24] ); + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[24] );; // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[24]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<25; k++) { @@ -1039,25 +977,23 @@ fprintf(fd, "// Process group with 25 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i 0) { @@ -1065,15 +1001,15 @@ fprintf(fd, "// Process group with 26 CNs \n"); idxBnGroup++; // Number of groups of 32 BNs for parallel processing - fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[25] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[25] );; // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[25]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<26; k++) { @@ -1081,21 +1017,18 @@ fprintf(fd, "// Process group with 26 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[26] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[26] );; // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[26]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<27; k++) { @@ -1122,21 +1055,18 @@ fprintf(fd, "// Process group with 27 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[27] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[27] );; // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[27]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<28; k++) { @@ -1163,18 +1093,16 @@ fprintf(fd, "// Process group with 28 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[28] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[28] );; // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[28]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<29; k++) { @@ -1201,14 +1129,11 @@ fprintf(fd, "// Process group with 29 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;i>5;\n",lut_numBnInBnGroups[29] ); + fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[29] );; // Set the offset to each CN within a group in terms of 16 Byte cnOffsetInGroup = (lut_numBnInBnGroups[29]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); - + fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + // Loop over CNs for (k=0; k<30; k++) { @@ -1241,13 +1166,11 @@ fprintf(fd, "// Process group with 30 CNs \n"); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); // Loop over BNs - fprintf(fd," for (i=0;iJ&CC(|i*hC2s4>0p%x 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%0A}ZfjvmZg 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 literal 279472 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⁣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≥^#IrO9xv>XfBK;-20 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 V7u~5D|t^C9^(fya*HebPKPAYP^Xa6bn@n+X7w( zt_`Cc9k)_rRuVS9DNA91;RFof{eMNYFHpBUdfUYapULZq^$yuPA&<>r7q__V|Mkgc z!FkE3M=bpP^(c>VoqqP@UCd00%$-=33%7FGP00`gsn3UDZe~*xNg(&h9rpBi{Gzhh z9%;J*fb&zVnuEtYoW9GTBil~P_Qx8a_Ds*XJvk7U5rw}x z->nPIxasU6I1`veq~!|*J3T)iwYN0-Yb4zGmP$7XeRa7DqPl%=S{smCYrMALoRLvw zC(x8G@~d}9^m36P@uGzGUV5bJwMFEaj?l`}Lop+5p+F}bk9#$stGe~9XMx3x-g}kq zQ(b+nM^cD}UN*xUhk1br_OOrzQ3f3rHhl_x7AsTbUB(QgiZ^nxZ-lYq5J?;PG8Og% zVYs@&yBmKta6SDn-Z|$ghH9g}i`SQKrESW?&j?g;#10a`_k01D=6(4%{-TmxNB+5h zGH(?C@S=7i&arXquO-nc6FaNL@z?MZ(B!Mjn}&-ZI_zG8)i1iDs`ONT>UwWP|BB|B z@3wp~#Pk)U{g`Cubnm`w*_E7ni$J6sn`~E`X3|zCvvb(S;JUp^#9WU{-VeS2!htU-6&8%gZA)In z84awK?tY*8IVahJKJ42r+GUvd4f`UR-#v40LFv)>cENbDNHG#7F3?S4){X1}2V z+?FqorZ_e|O<^O8SGc2?NXDXF*pz~vr8u~36aEp4bGJM z4Qt*I$0D~`ljiu@g?`Z%@Gf0639bD*?e9DkI%}*eB2IvjwGzKD8Lq} zk33eUOQVTBQ~$j$j8`7}zifYIOG$&{^DG)sK7Z|b0IqGkIm2K3d#Pl6x@v)Sx@T`k zNd^4mWBXJ;3!?%6t-Ohm_KEZE2>y0DJS5Li*z#=esl8y}kHur%^~2~uB&Uxm&*@fo zY?jxQsv3(#7UFw*Yt2;+4E_;VC9qf~USS{LYw9;R&y6_aY&=`_LL>w=-<}`_rMfL>t7;sLYXkkUHTPFPIacLdfOHGwfr{`&pN3jtZJ@MPmwog^ zM*7Ut(IwwWib4Uc+n3X)&l5$CV(r1IE1P5Mui?_U*MYF^=DJ~@m|pAy;?@RE#TWYa8=pxmawL1be zNp(xMpLEIcI|-y$9WzkD4aml9d+W;LHTF{KZD-Qv0 zP2?Ch>97E^hKXPg1=n(Zs?D7a;PQOiiU~FV|IdWqUCK=~ahep$$oM%)y^g9(2fd!x z<7kr0Kgv^J?v$kB9MZ+?lzgR?Nuoel!~9;5{*gNQM%(=jZh{Blgq=7R`wSLNxRxpL zztKiCjQ>r5W0nLm8i73C?};JUKMF~cc{%j#$TW4)|G4~UqxBO{FHT;913+LC{tFH z07POS&dCtV457|jn7hFq&A}eltS>S;f#EjRjL$)5qf^+AUC^!LpfD@hF_8=Io0bS|S_+-JSd zv&{A!R7a8L(Qk+^cHevfWx=>7AMDW~j*jI2Qc1bN_>}d66bcQ%cT_GC2Y3hXoG0#> zuV6y4r$cr;gLnEAKl4Yt!W-@r2!lFg%4)F-GfE0~xZm`;3l3vUhHQ7ZOLVx?hl;0n z=7mNB^aL>@iJ(vg+-IqA9xf1!83f~uP=g)@dVd{FuR6rJrKtFXKM@r{wQy7SbYaW7 zdE`x3>)x`izp7rwxE?|}?!_F1TDE*PB$h;6aZ=(^SlTtju}xW5DUjy68AasEQ}l+y(lA0Ov@%{1Flc`8D2g zkwiwhqR0GG+CQh+(S`G3bza5VXYv(MG131Vgz*!>^b-cbTAIL~!QA!4-2IaPUEIMw zNGN1S55^_|5(I!ScFxImmh~`8u%|G0JTZ4fzM^p|BDxz4{dMVAf#EB4H@?`cpjQK9vP1tB@aO;2D%(F9uhKtACmtJ`nw>|e=A7SQ$?!xU*mW(q3Hiq zt&RJ838#a~a;$u!KWC&K+pyla{i0pwE5m!H zDECIsK8(?>_RBOczWiVrFI6}LpuTjs>}7j?te5efwQ(!VP^_bSq{L_Z+yh0fws`C5LmPYk<&6<*;LzK!gU8EJhLw_2w8`oKlIL@L z8L7NIqw!l#v=sva{Ih$mG_;xNvgrxFG>u}5#f%r3@?SwjY8+l%sCfonLf&K{fr7IH zH540W^(fOnt!g-D^PlE4_4H84Z2FDA3J8@m5%+KkUY6eDXGl=Rl1Gg!&(vdJ;4*&G z^UcIA);ZgdzgFmAs~T|y-R9@;GCC+0a)}e<_jSKmF5yXxb~x*Kt_{jk3$;X<+L}h&8hhPhQ}{SBmh@+1 za5Cf7r_?J#3PH$)3;Dz~B|MwWjq9ai`^u22e>x}1yWS=nvM4g^w5nAsU(#Bh{39v( z5TayP?l$wman5A@8ZxlwKX)nmQp8}JzD6Y*68;$Osi`ORwrE0NsexIE)QN$YV~%1o z=Q{`QVDHhk>SdK<@%>&`VCmJM-B4c)u+x6a%(7-F1O8jeM~^51@<}Ouk&uFN#rlzsd_S4z{~ys`a&t1O3Z6d`s?TFgV|RTm*ub5n~Jzj zgdjusy>$rdwjTt`644)mIPaUO`1374TZ?rSGQ)&m4T%kaFH~Yhy?2lLv8# z&`%~ZIh2KKE@Qc_tDt|$Q4rXvasSNP^HVAsK?fpGwzPAfAUlEj?+08frQn(gvGEv! z{BPpIPG|*5Y4GFVHgRzB-a;42!M;OvPIBePa+156*=BOeZPtnq_7ju$fWxzr5_q#8-?=8rZ+34>x`$o4d>JKZhdWi zRs@}dL-eY{hw1y=4*Dqgogb+svG=)M^tnxUc*kOa)1OAHFi;8QyyXp~oy(cJ`KlWw) z(k1>q(q*PYvden-Wd>r;6tF=kpV1SFracTz`xP|pQLsokW@J}yU1%RZYl4y$n)Xk_ z@BgNK^5Y~Y2@NSbMSdndP&S!ya-6%%HO2&jX#%#5z0~o$EBi*f*{5jEA2EqP+_w`3 z-8qvjO|c;LWD0J)4Fg^VU~FK3gMqS{sbau-%p5g~OIcwzP*PS`HKi_@J8 z={F{HXU5<{3I;!oIKZb8LVd;>K`*#VW}FcRcDchCK`@QLQ2*Vw*%8%{WF^D#K+{fP zqHL243}Q0i8zpe%JjQUyh79@ltCc*0+ zZsv`TZ5l~n3~DP}FnI>{%;0<+(6mnIN0lC6gDS@6Iq4>i341X3ce^OMnnP(unEs&x zM|au)jqCU3hwony%pu)c3;{edgR)ov*s1=5| zzf;8E!XICSGuUSs3UT0rvC*pu{vLjwxM9wRnT3rm$+ygnKPTjW1+AYauA_s}u?Iue zzh$nA;(+br*m?eQrNtE!+#ZTQ2gE7X)oJ@@ptGPGv1!j;lRyTE+J!tE`yJ}XPUA)& z%lGPA3162FL0cZCw*y4uZo#i@GtA{BX5V%9rg=6kwbi7W_Bh)4LuN}Coqv{y{c68z zx63y!V;WO!9Ur3u{WQm?d+lNT?2&QLt+GkaLy7zUW~+5-6;0E}d4%Oil#fiWtewOf zegHBYKPjjCZ^XaAUD%3u@7mu|TmoL1nCO(QE-uobuHAf8&{D+2sIa~*#{NUOLEei? z(I;m{>&K(6f#vl7f_{r58v2&I@qDDv)=^|QU_*qsx2}SR>7|!~F?V{*(2c9Fe#^!B zj9>MCJ60=Ihw{d;&X=qU|3Dw}MYfgd#blo+Sz^}3gEx%-VO8yuon|kK?`30meTZuM z7xRl}G`Uv(VSZF?3ys%r<`0o+a>tc3O41>ZH;zSs`@3bRt)9xxfIF&rrWWNJar?Ty z<|Tdst7KF6$8WwTW;h>D*WCU{j93T)IWd0InwVr4oNh< z^=orziY2V|mW~gx3U?jPZ;n*#e)wQID_-FXkyjNBG^ zz>@_~s_EjI31FKF@pk{no@@(7taK%y6aaHt4VZ?={->-@3@MU74+Ufm_K&gar=IgP+%YZne1I?|{d&1xa z>j<^uJ(Kedj;fO8b{0{C!0TvnvXj4#NdV1L9*0El%Q8kKE<8~ zhjmdGR|hpA^0)p;+DdPwIPIODA!>d10DRd-W;3bgZUN$uHo;GA#|=a3_kpWgsI<9l zi??_X`M)+^5BC@B4FKl~jJ{k_z9FzR;{7^?9}E^PwC+~&uhw&2Q1Vk*&Dwa-Cc|hI zFt@eoN8U^Mi)OanU7$L#9K5w8x@Fd|BX#W-PJC7xQ@W(tS}kFyV`r`a#p7?Qqo?C4 z3fW#nGQ8Ry>p)D&q+C7t7DY7k9prNKsvgQ^4uWFwx9$8zlnG;XYx069KEd#r$MZ4i zjG|Zk9=FH~yfan-S=VrYM5&j!3Fn4nL?>Ho1yk_*Hqr+;<{BJgTG}<1&m2#joplvN zc6C7DqiM$%!^C>R3(YVVk6?%ABC8cLzQ{Kzbnt80;Z^w>X3$gWr6ip3A(^L>t)ZM0 z_)#04G3c3WY)-{fuIiIZSh9+B6u?IyHu7O&dGs{=EUv+JPQ`XMrCBUrR1_vq5SgEM zAF@h(I6xxQ!l=9~+7b?p4BdzQ*w$dR*ENFCKB=855$$s2+^T7&=1=N{<8B=!J0dNL=N}c~TnXaCN-wUTHg) zsmka_Y_74UD35BZu;nKS>nO{{Q)-P`OsKoK%_#NH0g2~;S6i&rV7-anI7}V& zhoeSx5)7b8aOT=6!@JWQe@cpNpelDk+9`uR)n#0B6H3@gUz<{Z-F9EldVh`eW8b{C znq>b*p|HXRsqRy7q{_&=Mc;hC(!=D&n)TyL@`m|ZnIh!{i8LXC1F^ zCXZBfnqPJ&8WnB`D(Iq@n__r3mE&Lg00JBvQF5?VgaFmGof$cR!ja6voJ`yDHVHZt zDx#>efjFec56G8JZlG->vn?mniu_1|PG_Uf`qwD$JwePw#-fsb($t)huB4IFSaT+Qk%t)hGnAMd)i z2iS79#=*xfbt(*6muj`0zXzQJjVrzfk=Ye4+S$ePI96iESBn>-1#AOT^x%)?bONA@ zlfmrE`aq?O=PR6(J0v|#vLlQJn+C)Eo77cLz<{;aNQW$L{*O6nS9h@KFZ8X+PCpnI zwj}=jp@m-naz7`QxAb(zKpk|vAuGMY6*d$yD-M%L*<*2Wk{g2 zHIRQhV1x6!P=y7cJOFg{qltIIxJs{p3Ka&5xoF$*zMPbr?Mq}TxD9oU&QaDpBI!;1 z`zdB2wf0;))m=LN?Zsiqb}D0r)&Ea7yX=3Xo24d~>btqO@)kDE1GV$+Q<9#gM)?z)UO8Vj#gjO`#WO-d$4jrE8#VK6YJj{jvfeb zoE;6Q^@zny($7sM_^E&K)3DDAUrGW{M0Ud%q4GT~!7~#4SE)(M8)88no#59DPO211 zj%}6^SMh8M?VF{(Wde`^=d)pgjz1!nCcx~sh_%TiUv9Jib{A(XCh~sJwzrd^td}jk^#Wx=uKza4W<*b**!C z+k^xb{^j{ZJnV*S7e;?Vzx z90i3$)`c@vpy4LHX?ax#erR-@UdhI)o^XD+p2CSXy^g|z{*uNh4ma)h6dKj8!$Vxu zAkbZdF62wJ{FI6O1D_JrXq#_PZk8-PHnR6bYk53b?|jivNDj-2b1j<-4u7YN)mtBxTQgPl2R7dxc(0iK(qR_`)%AP z{~r>tOY~@4udU@L_04LlG52qr2`PLd1x*PhsCvfbE6@JE@hbAuB?rcODc`y3X?Fp5 z<^&U11UQ)jT@icj*ldCjFnC6bn(LbA?P?R7k^UvMDvGQ+;~ zv!_j3yBs}K^Np%!TE6nHekF8b3NK%q@dlBmebgk)R>y+%>q_>e8iTWF+%x4LVbJ)eQ|>$nZdt- zwK0-DxGJ~oHi`9t#UqkCs|ih|eZc}WJd%_b=G;QqR1i*7(l+n2x+pbb#>XErN#PDt?$G_mg2cW77=iFsIkMQxVMR5#K@mdb!yPRDA@CQH% zRl?1U_cbiPs=9C_Ju|;>NT|DslgWu|@lP1ZiYMw!G#0Q3?2#xYzy>ePF4n6pwioMG zUbWp;O@oJ%6{23>%o>a}kCd9(TU0abjURuzncm9AW*rrM+BQ`RIuLW5qCZ+fO_WSv z8$-nC7Tf9eWb%#QPm@KZ+ZK1e-g{;CFaL5-VYg|P*97TybvzqX|M6DL=X?p7uKJOr z8LgN)*QLXbJ9ni`&1yNQ2kI<5kac%XX0?5zkwG7@TW9M$-25jbcv^za%uJchE|3MY z;SQe?n5gZ#2rwLJCOx zj8jX~7ySOyS>Nbp3rfN8mgMSc|2A^=z_iWY3w4G=FXh^_>f9qDE!jgTAlZl_qxIC-El>(wJ!A$@nD`^}s|-gv-6$kns&;C+ jCx5PZv>I5x!@c(xpJAmrEc7+v_^u`0>lUK}8{@wK1|>(< literal 9279 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 J4ezHc{{h*r-R}SZ delta 805 zcmXw#Ur3W-6vp54wSD{7n3aa+W`VZ(mzirBQ8{p=h3KFtEUdn*ZQtDXZEkZ^VpnFC z7g;BwNTzqXAV>#Mc#(lccp+thMi)hhMBStmb(40!&2Apv=RN1V?|FXH^W5k=Zm1kS zPgI=Y@=q>p{-b$4WIwog>efSk@7dzS#nsF`ZdV0F@mW9?#FSIg&?toBxmbY8Bm zRYzZ4y|%W#K7?EkFeEU2JbQMHXBST z#&{(xFvgm-r96(icNg(*|UXdZM%X@ zJ#Pbm_({o`B;0s>%HFB*=eC{iRK3pWzq(YOw5T6JS0$>}w6dZixR z)DYDS;!H?R|2>p|F+3mM0V(VWkHSkdN+$rZOX}tHYWyLUa3(e8MM_{9t&y_*HELRu zv28bu4tj?%Lsl6x6SVw|Vu8)%$X=Ik6seFIjLgaWPIqPbjdaQUo{}Mcf5}YY_L$5s zL7K+-SeBnEF7vw*m-)@dWqz)N%x`OVj-PtAUn}!t$8!Ja1+p@~Pu+)e;B2(+0X3E< zEd@EGrpH;{fHy^Td_ F%Reqt?(hHr diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG1_avx512.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG1_avx512.c index fb0db9236a..575f53834d 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG1_avx512.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG1_avx512.c @@ -1,5 +1,3 @@ - - #include #include #include "../../nrLDPCdecoder_defs.h" @@ -327,14 +325,13 @@ void nrLDPC_cnProc_BG1_generator_AVX512(int R) // ===================================================================== // Process group with 8 BNs fprintf(fd,"//Process group with 8 BNs\n"); - // Offset is 2*384/32 = 12 - const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,112,144,168}, {0,48,72,96,112,144,168}, - {0,24,72,96,112,144,168}, {0,24,48,96,112,144,168}, - {0,24,48,72,112,144,168}, {0,24,48,72,96,144,168}, - {0,24,48,72,96,112,168}, {0,24,48,72,96,112,144}}; - - + // Offset is 2*384/32 = 24 + const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,120,144,168}, {0,48,72,96,120,144,168}, + {0,24,72,96,120,144,168}, {0,24,48,96,120,144,168}, + {0,24,48,72,120,144,168}, {0,24,48,72,96,144,168}, + {0,24,48,72,96,120,168}, {0,24,48,72,96,120,144}}; + if (lut_numCnInCnGroups[5] > 0) { // Number of groups of 64 CNs for parallel processing diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG1_avx512.save1 b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG1_avx512.save1 deleted file mode 100644 index 462f196d1d..0000000000 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_BG1_avx512.save1 +++ /dev/null @@ -1,603 +0,0 @@ - -#include -#include -#include "../../nrLDPCdecoder_defs.h" - -void nrLDPC_cnProc_BG1_generator_AVX512(int R) -{ - const char *ratestr[3]={"13","23","89"}; - - if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} - - - // system("mkdir -p ../ldpc_gen_files"); - - char fname[50]; - sprintf(fname,"../ldpc_gen_files/cnProc_avx512/nrLDPC_cnProc_BG1_R%s_AVX512.h",ratestr[R]); - FILE *fd=fopen(fname,"w"); - if (fd == NULL) {printf("Cannot create \n");abort();} - - fprintf(fd,"#include \n"); - fprintf(fd,"#include \n"); - - - fprintf(fd, "#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)\n"); - - - fprintf(fd,"static inline void nrLDPC_cnProc_BG1_R%s_AVX512(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z) {\n",ratestr[R]); - - const uint8_t* lut_numCnInCnGroups; - const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG1; - - if (R==0) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R13; - else if (R==1) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R23; - else if (R==2) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R89; - else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} - - - - uint32_t i,j; - uint32_t k; - // Offset to each bit within a group in terms of 64 Byte - uint32_t bitOffsetInGroup; - - - fprintf(fd," uint32_t M, i;\n"); - fprintf(fd," int8_t* cnProcBuf = p_procBuf->cnProcBuf;\n"); - fprintf(fd," int8_t* cnProcBufRes = p_procBuf->cnProcBufRes;\n"); - fprintf(fd," __m512i* p_cnProcBufResBit;\n"); - fprintf(fd," __m512i* p_cnProcBufRes;\n"); - fprintf(fd," __m512i* p_cnProcBuf;\n"); - - - fprintf(fd," __m512i zmm0, min, sgn,zeros,maxLLR, ones;\n"); - - fprintf(fd," zeros = _mm512_setzero_si512();\n"); - fprintf(fd," maxLLR = _mm512_set1_epi8((char)127);\n"); - fprintf(fd," ones = _mm512_set1_epi8((char)1);\n"); - - - - // ===================================================================== - // Process group with 3 BNs - fprintf(fd,"//Process group with 3 BNs\n"); - // LUT with offsets for bits that need to be processed - // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc. - // Offsets are in units of bitOffsetInGroup (1*384/32)12 - // Offsets are in units of bitOffsetInGroup (1*384/32)12 - - const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}}; - - if (lut_numCnInCnGroups[0] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - //M = (lut_numCnInCnGroups[0]*Z + 63)>>6; - - fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[0] ); - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups[0]*NR_LDPC_ZMAX)>>6; - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[0]); - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf[%d];\n", lut_startAddrCnGroups[0]); - - // Loop over every BN - - for (j=0; j<3; j++) - { - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d ;\n", (j*bitOffsetInGroup)); - fprintf(fd," for (i=0;i 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - //M = (lut_numCnInCnGroups[1]*Z + 63)>>6; - fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[1] ); - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups[1]*NR_LDPC_ZMAX)>>6; - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[1]); - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf[%d];\n", lut_startAddrCnGroups[1]); - - // Loop over every BN - for (j=0; j<4; j++) - { - // Loop over CNs - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d ;\n", (j*bitOffsetInGroup)); - // { - fprintf(fd," for (i=0;i 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - //M = (lut_numCnInCnGroups[2]*Z + 63)>>6; - fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[2] ); - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups[2]*NR_LDPC_ZMAX)>>6; - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[2]); - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf[%d];\n", lut_startAddrCnGroups[2]); - - // Loop over every BN - - for (j=0; j<5; j++) - { -fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d ;\n", (j*bitOffsetInGroup)); - fprintf(fd," for (i=0;i 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - //M = (lut_numCnInCnGroups[3]*Z + 63)>>6; - - fprintf(fd, "M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[3] ); - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups[3]*NR_LDPC_ZMAX)>>6; - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[3]); - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf[%d];\n", lut_startAddrCnGroups[3]); - - // Loop over every BN - - for (j=0; j<6; j++) - { -fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d ;\n", (j*bitOffsetInGroup)); - fprintf(fd," for (i=0;i 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - // M = (lut_numCnInCnGroups[4]*Z + 63)>>6; - fprintf(fd, "M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[4] ); - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups[4]*NR_LDPC_ZMAX)>>6; - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[4]); - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf[%d];\n", lut_startAddrCnGroups[4]); - - // Loop over every BN - - for (j=0; j<7; j++) - { - // Loop over CNs -fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d ;\n", (j*bitOffsetInGroup)); - // { - fprintf(fd," for (i=0;i 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - // M = (lut_numCnInCnGroups[5]*Z + 63)>>6; - fprintf(fd, "M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[5] ); - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups[5]*NR_LDPC_ZMAX)>>6; - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[5]); - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf[%d];\n", lut_startAddrCnGroups[5]); - - // Loop over every BN - - for (j=0; j<8; j++) - { -fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d ;\n", (j*bitOffsetInGroup)); - // { - fprintf(fd," for (i=0;i 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - // M = (lut_numCnInCnGroups[5]*Z + 63)>>6; - fprintf(fd, "M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[6] ); - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups[6]*NR_LDPC_ZMAX)>>6; - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[6]); - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf[%d];\n", lut_startAddrCnGroups[6]); - - // Loop over every BN - - for (j=0; j<9; j++) - { -fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d ;\n", (j*bitOffsetInGroup)); - fprintf(fd," for (i=0;i 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - //M = (lut_numCnInCnGroups[7]*Z + 63)>>6; - fprintf(fd, " M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[7] ); - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups[7]*NR_LDPC_ZMAX)>>6; - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[7]); - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf[%d];\n", lut_startAddrCnGroups[7]); - - - // Loop over every BN - - for (j=0; j<10; j++) - { -fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d ;\n", (j*bitOffsetInGroup)); - // { - fprintf(fd," for (i=0;i 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - // M = (lut_numCnInCnGroups[8]*Z + 63)>>6; - fprintf(fd, " M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[8] ); - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups[8]*NR_LDPC_ZMAX)>>6; - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[8]); - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf[%d];\n", lut_startAddrCnGroups[8]); - - // Loop over every BN - - for (j=0; j<19; j++) - { - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d ;\n", (j*bitOffsetInGroup)); - fprintf(fd," for (i=0;i #include #include "../../nrLDPCdecoder_defs.h" @@ -24,7 +25,7 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R) fprintf(fd, "#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)\n"); - + fprintf(fd,"static inline void nrLDPC_cnProc_BG2_R%s_AVX512(int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) {\n",ratestr[R]); const uint8_t* lut_numCnInCnGroups; const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG2; @@ -42,16 +43,17 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R) // Offset to each bit within a group in terms of 64 Byte uint32_t bitOffsetInGroup; - fprintf(fd," uint32_t M;\n"); - fprintf(fd," __m512i zmm0, min, sgn,zeros,maxLLR;\n"); + fprintf(fd," uint32_t M;\n"); + fprintf(fd," __m512i zmm0, min, sgn,zeros,ones,maxLLR;\n"); fprintf(fd," zeros = _mm512_setzero_si512();\n"); fprintf(fd," maxLLR = _mm512_set1_epi8((char)127);\n"); + fprintf(fd," ones = _mm512_set1_epi8((char)1);\n"); // ===================================================================== // Process group with 3 BNs fprintf(fd,"//Process group with 3 BNs\n"); // LUT with offsets for bits that need to be processed // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc. - // Offsets are in units of bitOffsetInGroup + // Offsets are in units of bitOffsetInGroup const uint8_t lut_idxCnProcG3[3][2] = {{72,144}, {0,144}, {0,72}}; @@ -59,7 +61,7 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R) { // Number of groups of 64 CNs for parallel processing // Ceil for values not divisible by 64 - fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[1] ); + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[0] ); // Set the offset to each bit within a group in terms of 64 Byte bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[0]*NR_LDPC_ZMAX)>>6; @@ -71,57 +73,38 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R) { - fprintf(fd," for (int i=0;i>6)+lut_idxCnProcG3[j][0]/2); - // sgn = _mm512_sign_epi8(ones, zmm0); - // min = _mm512_abs_epi8(zmm0); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][0]/2); + fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n"); + fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - // 32 CNs of second BN - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i]; - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][1]/2); - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); + // for (k=1; k<2; k++) + //{ + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][1]/2); - // sgn = _mm512_sign_epi8(sgn, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); + // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); + fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); + + // sgn = _mm512_sign_epi8(*p_ones, zmm0); + fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); + // } // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 + // min = _mm512_min_epu8(min, *maxLLR); // 128 in epi8 is -127 fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - + // *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn); + // p_cnProcBufResBit++; fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[0]>>6)+(j*bitOffsetInGroup)); - - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+(lut_idxCnProcG3[j][0]/2)+1); - // sgn = _mm512_sign_epi8(ones, zmm0); - // min = _mm512_abs_epi8(zmm0); - fprintf(fd," min = _mm512_abs_epi8(sgn);\n"); - - // 32 CNs of second BN - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i]; - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+(lut_idxCnProcG3[j][1]/2)+1); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(sgn, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[0]>>6)+(j*bitOffsetInGroup)+1); - fprintf(fd," }\n"); } + } + // ===================================================================== // Process group with 4 BNs fprintf(fd,"//Process group with 4 BNs\n"); @@ -140,14 +123,13 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R) // Loop over every BN for (j=0; j<4; j++) - { + { fprintf(fd," for (int i=0;i>6)+lut_idxCnProcG4[j][0]/2); - // sgn = _mm512_sign_epi8(ones, zmm0); - // min = _mm512_abs_epi8(zmm0); - fprintf(fd," min = _mm512_abs_epi8(sgn);\n"); + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>6)+lut_idxCnProcG4[j][0]/2); + fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n"); + fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); // Loop over BNs @@ -179,6 +161,7 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R) // Offset is 9*384/32 = 108 const uint16_t lut_idxCnProcG5[5][4] = {{108,216,324,432}, {0,216,324,432}, {0,108,324,432}, {0,108,216,432}, {0,108,216,324}}; + @@ -199,10 +182,9 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R) fprintf(fd," for (int i=0;i>6)+lut_idxCnProcG5[j][0]/2); - // sgn = _mm512_sign_epi8(ones, zmm0); - // min = _mm512_abs_epi8(zmm0); - fprintf(fd," min = _mm512_abs_epi8(sgn);\n"); + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][0]/2); + fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n"); + fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); // Loop over BNs @@ -233,6 +215,7 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R) const uint16_t lut_idxCnProcG6[6][5] = {{36,72,108,144,180}, {0,72,108,144,180}, {0,36,108,144,180}, {0,36,72,144,180}, {0,36,72,108,180}, {0,36,72,108,144}}; + @@ -253,10 +236,9 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R) fprintf(fd," for (int i=0;i>6)+lut_idxCnProcG6[j][0]/2); - // sgn = _mm512_sign_epi8(ones, zmm0); - // min = _mm512_abs_epi8(zmm0); - fprintf(fd," min = _mm512_abs_epi8(sgn);\n"); + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][0]/2); + fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n"); + fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); // Loop over BNs @@ -291,6 +273,8 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R) {0,24,48,72,120,144,168}, {0,24,48,72,96,144,168}, {0,24,48,72,96,120,168}, {0,24,48,72,96,120,144}}; + + if (lut_numCnInCnGroups[4] > 0) { @@ -305,14 +289,13 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R) for (j=0; j<8; j++) { - + fprintf(fd," for (int i=0;i>6)+lut_idxCnProcG8[j][0]/2); - // sgn = _mm512_sign_epi8(ones, zmm0); - // min = _mm512_abs_epi8(zmm0); - fprintf(fd," min = _mm512_abs_epi8(sgn);\n"); + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>6)+lut_idxCnProcG8[j][0]/2); + fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n"); + fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); // Loop over BNs @@ -330,7 +313,7 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R) // Store result // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - + fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[4]>>6)+(j*bitOffsetInGroup)); fprintf(fd," }\n"); } @@ -340,13 +323,15 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R) // ===================================================================== // Process group with 10 BNs fprintf(fd,"//Process group with 10 BNs\n"); - + const uint8_t lut_idxCnProcG10[10][9] = {{24,48,72,96,120,144,168,192,216}, {0,48,72,96,120,144,168,192,216}, {0,24,72,96,120,144,168,192,216}, {0,24,48,96,120,144,168,192,216}, {0,24,48,72,120,144,168,192,216}, {0,24,48,72,96,144,168,192,216}, {0,24,48,72,96,120,168,192,216}, {0,24,48,72,96,120,144,192,216}, {0,24,48,72,96,120,144,168,216}, {0,24,48,72,96,120,144,168,192}}; + + if (lut_numCnInCnGroups[5] > 0) { @@ -365,10 +350,9 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R) fprintf(fd," for (int i=0;i>6)+lut_idxCnProcG10[j][0]/2); - // sgn = _mm512_sign_epi8(ones, zmm0); - // min = _mm512_abs_epi8(zmm0); - fprintf(fd," min = _mm512_abs_epi8(sgn);\n"); + fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>6)+lut_idxCnProcG10[j][0]/2); + fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n"); + fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); // Loop over BNs @@ -392,7 +376,7 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R) } } - + fprintf(fd,"}\n"); fclose(fd); }//end of the function nrLDPC_cnProc_BG2 @@ -404,3 +388,4 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R) + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_avx512 b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/cnProc_gen_avx512 index 9f1d553a1cc90b6d267c0c69b0ab2f899e4e4783..7d6d59a05875fefcdac341117272a391f762629a 100755 GIT binary patch delta 9020 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 delta 9733 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 diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/sauvegarde.tar.gz b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/sauvegarde.tar.gz index 5e2fc29a8f233d488780e8905cdfe9dd125117c6..69e1d9ca37cf707a56e023bb1f4d6c808389dcf2 100644 GIT binary patch literal 3797 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 QfrgOqe_s$yM*zqG0M$3m(*OVf diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/save/cnProc_gen_BG1_avx512.2 b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/save/cnProc_gen_BG1_avx512.2 deleted file mode 100644 index da72d4a934..0000000000 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/save/cnProc_gen_BG1_avx512.2 +++ /dev/null @@ -1,583 +0,0 @@ - -#include -#include -#include "../../nrLDPCdecoder_defs.h" - -void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R) -{ - const char *ratestr[3]={"13","23","89"}; - - if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} - - - // system("mkdir -p ../ldpc_gen_files"); - - char fname[50]; - sprintf(fname,"../ldpc_gen_files/nrLDPC_cnProc_BG1_Z%d_%s_AVX512.c",Z,ratestr[R]); - FILE *fd=fopen(fname,"w"); - if (fd == NULL) {printf("Cannot create \n");abort();} - - fprintf(fd,"#include \n"); - fprintf(fd,"#include \n"); - - - fprintf(fd, "#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)\n"); - - - fprintf(fd,"void nrLDPC_cnProc_BG1_Z%d_%s_AVX512(int8_t* cnProcBuf,int8_t* cnProcBufRes) {\n",Z,ratestr[R]); - - const uint8_t* lut_numCnInCnGroups; - const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG1; - - if (R==0) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R13; - else if (R==1) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R23; - else if (R==2) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R89; - else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} - - - uint32_t M; - uint32_t j; - uint32_t k; - // Offset to each bit within a group in terms of 64 Byte - uint32_t bitOffsetInGroup; - - - - // ===================================================================== - // Process group with 3 BNs - fprintf(fd,"//Process group with 3 BNs\n"); - // LUT with offsets for bits that need to be processed - // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc. - // Offsets are in units of bitOffsetInGroup (1*384/32)12 - // Offsets are in units of bitOffsetInGroup (1*384/32)12 - - const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}}; - - - fprintf(fd," __m512i zmm0, min, sgn,zeros,maxLLR;\n"); - fprintf(fd," zeros = _mm512_setzero_si512();\n"); - fprintf(fd," maxLLR = _mm512_set1_epi8((char)127);\n"); - - if (lut_numCnInCnGroups[0] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[0]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX)>>6; - - // Loop over every BN - - for (j=0; j<3; j++) - { - - fprintf(fd," for (int i=0;i<%d;i+=2) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][0]/2); - // sgn = _mm512_sign_epi8(ones, zmm0); - // min = _mm512_abs_epi8(zmm0); - fprintf(fd," min = _mm512_abs_epi8(sgn);\n"); - - // 32 CNs of second BN - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i]; - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][1]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(sgn, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[0]>>6)+(j*bitOffsetInGroup)); - - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+(lut_idxCnProcG3[j][0]/2)+1); - - fprintf(fd," min = _mm512_abs_epi8(sgn);\n"); - - // 32 CNs of second BN - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i]; - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+(lut_idxCnProcG3[j][1]/2)+1); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(sgn, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[0]>>6)+(j*bitOffsetInGroup)+1); - - fprintf(fd," }\n"); - } - } - - // ===================================================================== - // Process group with 4 BNs - fprintf(fd,"//Process group with 4 BNs\n"); - // Offset is 5*384/32 = 30 - const uint8_t lut_idxCnProcG4[4][3] = {{60,120,180}, {0,120,180}, {0,60,180}, {0,60,120}}; - - if (lut_numCnInCnGroups[1] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[1]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX)>>6; - - // Loop over every BN - for (j=0; j<4; j++) - { - // Loop over CNs - // for (i=0; i>6)+lut_idxCnProcG4[j][0]/2); - // sgn = _mm512_sign_epi8(ones, zmm0); - // min = _mm512_abs_epi8(zmm0); - fprintf(fd," min = _mm512_abs_epi8(sgn);\n"); - - - // Loop over BNs - for (k=1; k<3; k++) - { - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>6)+lut_idxCnProcG4[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(sgn, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - // *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn); - // p_cnProcBufResBit++; - fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[1]>>6)+(j*bitOffsetInGroup)); - fprintf(fd," }\n"); - } - } - - - // ===================================================================== - // Process group with 5 BNs - fprintf(fd,"//Process group with 5 BNs\n"); - // Offset is 18*384/32 = 216 - const uint16_t lut_idxCnProcG5[5][4] = {{216,432,648,864}, {0,432,648,864}, - {0,216,648,864}, {0,216,432,864}, {0,216,432,648}}; - - - if (lut_numCnInCnGroups[2] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[2]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX)>>6; - - // Loop over every BN - - for (j=0; j<5; j++) - { - - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][0]/2); - // sgn = _mm512_sign_epi8(ones, zmm0); - // min = _mm512_abs_epi8(zmm0); - fprintf(fd," min = _mm512_abs_epi8(sgn);\n"); - - - // Loop over BNs - for (k=1; k<4; k++) - { - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(sgn, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[2]>>6)+(j*bitOffsetInGroup)); - fprintf(fd," }\n"); - } - } - - // ===================================================================== - // Process group with 6 BNs - fprintf(fd,"//Process group with 6 BNs\n"); - // Offset is 8*384/32 = 48 - const uint16_t lut_idxCnProcG6[6][5] = {{96,192,288,384,480}, {0,192,288,384,480}, - {0,96,288,384,480}, {0,96,192,384,480}, - {0,96,192,288,480}, {0,96,192,288,384}}; - - - if (lut_numCnInCnGroups[3] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[3]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX)>>6; - - // Loop over every BN - - for (j=0; j<6; j++) - { - - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][0]/2); - // sgn = _mm512_sign_epi8(ones, zmm0); - // min = _mm512_abs_epi8(zmm0); - fprintf(fd," min = _mm512_abs_epi8(sgn);\n"); - - - // Loop over BNs - for (k=1; k<5; k++) - { - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(sgn, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[3]>>6)+(j*bitOffsetInGroup)); - fprintf(fd," }\n"); - } - } - - - // ===================================================================== - // Process group with 7 BNs - fprintf(fd,"//Process group with 7 BNs\n"); - // Offset is 5*384/32 = 30 - const uint16_t lut_idxCnProcG7[7][6] = {{60,120,180,240,300,360}, {0,120,180,240,300,360}, - {0,60,180,240,300,360}, {0,60,120,240,300,360}, - {0,60,120,180,300,360}, {0,60,120,180,240,360}, - {0,60,120,180,240,300}}; - - - if (lut_numCnInCnGroups[4] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[4]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX)>>6; - - // Loop over every BN - - for (j=0; j<7; j++) - { - // Loop over CNs - // for (i=0; i>6)+lut_idxCnProcG7[j][0]/2); - // sgn = _mm512_sign_epi816(ones, zmm0); - // min = _mm512_abs_epi8(zmm0); - fprintf(fd," min = _mm512_abs_epi8(sgn);\n"); - - - // Loop over BNs - for (k=1; k<6; k++) - { - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>6)+lut_idxCnProcG7[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(sgn, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[4]>>6)+(j*bitOffsetInGroup)); - fprintf(fd," }\n"); - } - } - - - // ===================================================================== - // Process group with 8 BNs - fprintf(fd,"//Process group with 8 BNs\n"); - // Offset is 2*384/32 = 12 - const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,112,144,168}, {0,48,72,96,112,144,168}, - {0,24,72,96,112,144,168}, {0,24,48,96,112,144,168}, - {0,24,48,72,112,144,168}, {0,24,48,72,96,144,168}, - {0,24,48,72,96,112,168}, {0,24,48,72,96,112,144}}; - - - - if (lut_numCnInCnGroups[5] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[5]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX)>>6; - - // Loop over every BN - - for (j=0; j<8; j++) - { - // Loop over CNs - // for (i=0; i>6)+lut_idxCnProcG8[j][0]/2); - // sgn = _mm512_sign_epi8(ones, zmm0); - // min = _mm512_abs_epi8(zmm0); - fprintf(fd," min = _mm512_abs_epi8(sgn);\n"); - - - // Loop over BNs - for (k=1; k<7; k++) - { - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>6)+lut_idxCnProcG8[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(sgn, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[5]>>6)+(j*bitOffsetInGroup)); - fprintf(fd," }\n"); - } - } - - // ===================================================================== - // Process group with 9 BNs - fprintf(fd,"//Process group with 9 BNs\n"); - // Offset is 2*384/32 = 12 - const uint8_t lut_idxCnProcG9[9][8] = {{24,48,72,96,120,144,168,192}, {0,48,72,96,120,144,168,192}, - {0,24,72,96,120,144,168,192}, {0,24,48,96,120,144,168,192}, - {0,24,48,72,120,144,168,192}, {0,24,48,72,96,144,168,192}, - {0,24,48,72,96,120,168,192}, {0,24,48,72,96,120,144,192}, - {0,24,48,72,96,120,144,168}}; - - - - - if (lut_numCnInCnGroups[6] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[6]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[6]*NR_LDPC_ZMAX)>>6; - - // Set pointers to start of group - // Loop over every BN - - for (j=0; j<9; j++) - { - // Loop over CNs - // for (i=0; i>6)+lut_idxCnProcG9[j][0]/2); - // sgn = _mm512_sign_epi8(ones, zmm0); - // min = _mm512_abs_epi8(zmm0); - fprintf(fd," min = _mm512_abs_epi8(sgn);\n"); - - - // Loop over BNs - for (k=1; k<8; k++) - { - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[6]>>6)+lut_idxCnProcG9[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(sgn, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn, zeros);\n",(lut_startAddrCnGroups[6]>>6)+(j*bitOffsetInGroup)); - fprintf(fd," }\n"); - } - } - - // ===================================================================== - // Process group with 10 BNs - fprintf(fd,"//Process group with 10 BNs\n"); - // Offset is 1*384/32 = 6 - const uint8_t lut_idxCnProcG10[10][9] = {{12,24,36,48,60,72,84,96,108}, {0,24,36,48,60,72,84,96,108}, - {0,12,36,48,60,72,84,96,108}, {0,12,24,48,60,72,84,96,108}, - {0,12,24,36,60,72,84,96,108}, {0,12,24,36,48,72,84,96,108}, - {0,12,24,36,48,60,84,96,108}, {0,12,24,36,48,60,72,96,108}, - {0,12,24,36,48,60,72,84,108}, {0,12,24,36,48,60,72,84,96}}; - - if (lut_numCnInCnGroups[7] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[7]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX)>>6; - - - // Loop over every BN - - for (j=0; j<10; j++) - { - // Loop over CNs - // for (i=0; i>6)+lut_idxCnProcG10[j][0]/2); - // sgn = _mm512_sign_epi8(ones, zmm0); - // min = _mm512_abs_epi8(zmm0); - fprintf(fd," min = _mm512_abs_epi8(sgn);\n"); - - - // Loop over BNs - for (k=1; k<9; k++) - { - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[7]>>6)+lut_idxCnProcG10[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(sgn, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min,sgn,zeros);\n",(lut_startAddrCnGroups[7]>>6)+(j*bitOffsetInGroup)); - fprintf(fd," }\n"); - } - } - - - // ===================================================================== - // Process group with 19 BNs - fprintf(fd,"//Process group with 19 BNs\n"); - // Offset is 4*384/32 = 24 - const uint16_t lut_idxCnProcG19[19][18] = {{48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, - {0,48,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, - {0,48,96,144,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,288,336,384,432,480,528,576,624,672,720,768,816,864}, - {0,48,96,144,192,240,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,384,432,480,528,576,624,672,720,768,816,864}, - {0,48,96,144,192,240,288,336,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,480,528,576,624,672,720,768,816,864}, - {0,48,96,144,192,240,288,336,384,432,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,576,624,672,720,768,816,864}, - {0,48,96,144,192,240,288,336,384,432,480,528,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,672,720,768,816,864}, - {0,48,96,144,192,240,288,336,384,432,480,528,576,624,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,768,816,864}, - {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,864}, - {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816}}; - - - if (lut_numCnInCnGroups[8] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[8]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX)>>6; - - // Loop over every BN - - for (j=0; j<19; j++) - { - // Loop over CNs - // for (i=0; i>6)+lut_idxCnProcG19[j][0]/2); - // sgn = _mm512_sign_epi8(ones, zmm0); - // min = _mm512_abs_epi8(zmm0); - fprintf(fd," min = _mm512_abs_epi8(sgn);\n"); - - - // Loop over BNs - for (k=1; k<18; k++) - { - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[8]>>6)+lut_idxCnProcG19[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(sgn, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[8]>>6)+(j*bitOffsetInGroup)); - fprintf(fd," }\n"); - } - } - - fprintf(fd,"}\n"); - fclose(fd); -}//end of the function nrLDPC_cnProc_BG1 - - - diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/save/cnProc_gen_BG1_avx512.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/save/cnProc_gen_BG1_avx512.c deleted file mode 100644 index 6f9036db18..0000000000 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/save/cnProc_gen_BG1_avx512.c +++ /dev/null @@ -1,557 +0,0 @@ - -#include -#include -#include "../../nrLDPCdecoder_defs.h" - -void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R) -{ - const char *ratestr[3]={"13","23","89"}; - - if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} - - - // system("mkdir -p ../ldpc_gen_files"); - - char fname[50]; - sprintf(fname,"../ldpc_gen_files/nrLDPC_cnProc_BG1_Z%d_R%s_AVX512.c",Z,ratestr[R]); - FILE *fd=fopen(fname,"w"); - if (fd == NULL) {printf("Cannot create \n");abort();} - - fprintf(fd,"#include \n"); - fprintf(fd,"#include \n"); - - - fprintf(fd, "#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)\n"); - - - fprintf(fd,"void nrLDPC_cnProc_BG1_Z%d_R%s_AVX512(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf) {\n",Z,ratestr[R]); - - const uint8_t* lut_numCnInCnGroups; - const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG1; - - if (R==0) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R13; - else if (R==1) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R23; - else if (R==2) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R89; - else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} - - - uint32_t M; - uint32_t j; - uint32_t k; - // Offset to each bit within a group in terms of 64 Byte - uint32_t bitOffsetInGroup; - - - - // ===================================================================== - // Process group with 3 BNs - fprintf(fd,"//Process group with 3 BNs\n"); - // LUT with offsets for bits that need to be processed - // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc. - // Offsets are in units of bitOffsetInGroup (1*384/32)12 - // Offsets are in units of bitOffsetInGroup (1*384/32)12 - - const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}}; - - fprintf(fd," int8_t* cnProcBuf = p_procBuf->cnProcBuf;\n"); - fprintf(fd," int8_t* cnProcBufRes = p_procBuf->cnProcBufRes;\n"); - - fprintf(fd," __m512i zmm0, min, sgn,zeros,maxLLR;\n"); - - fprintf(fd," zeros = _mm512_setzero_si512();\n"); - fprintf(fd," maxLLR = _mm512_set1_epi8((char)127);\n"); - - fprintf(fd," const __m512i* p_ones = (__m512i*) ones512_epi8;\n"); - - if (lut_numCnInCnGroups[0] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[0]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX)>>6; - - // Loop over every BN - - for (j=0; j<3; j++) - { - - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][0]/2); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // 32 CNs of second BN - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i]; - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][1]/2); - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[0]>>6)+(j*bitOffsetInGroup)); - - - fprintf(fd," }\n"); - } - } - - // ===================================================================== - // Process group with 4 BNs - fprintf(fd,"//Process group with 4 BNs\n"); - // Offset is 5*384/32 = 30 - const uint8_t lut_idxCnProcG4[4][3] = {{60,120,180}, {0,120,180}, {0,60,180}, {0,60,120}}; - - if (lut_numCnInCnGroups[1] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[1]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX)>>6; - - // Loop over every BN - for (j=0; j<4; j++) - { - // Loop over CNs - // for (i=0; i>6)+lut_idxCnProcG4[j][0]/2); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<3; k++) - { - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>6)+lut_idxCnProcG4[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - // *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn); - // p_cnProcBufResBit++; - fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[1]>>6)+(j*bitOffsetInGroup)); - fprintf(fd," }\n"); - } - } - - - // ===================================================================== - // Process group with 5 BNs - fprintf(fd,"//Process group with 5 BNs\n"); - // Offset is 18*384/32 = 216 - const uint16_t lut_idxCnProcG5[5][4] = {{216,432,648,864}, {0,432,648,864}, - {0,216,648,864}, {0,216,432,864}, {0,216,432,648}}; - - - if (lut_numCnInCnGroups[2] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[2]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX)>>6; - - // Loop over every BN - - for (j=0; j<5; j++) - { - - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][0]/2); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<4; k++) - { - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[2]>>6)+(j*bitOffsetInGroup)); - fprintf(fd," }\n"); - } - } - - // ===================================================================== - // Process group with 6 BNs - fprintf(fd,"//Process group with 6 BNs\n"); - // Offset is 8*384/32 = 48 - const uint16_t lut_idxCnProcG6[6][5] = {{96,192,288,384,480}, {0,192,288,384,480}, - {0,96,288,384,480}, {0,96,192,384,480}, - {0,96,192,288,480}, {0,96,192,288,384}}; - - - if (lut_numCnInCnGroups[3] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[3]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX)>>6; - - // Loop over every BN - - for (j=0; j<6; j++) - { - - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][0]/2); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<5; k++) - { - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[3]>>6)+(j*bitOffsetInGroup)); - fprintf(fd," }\n"); - } - } - - - // ===================================================================== - // Process group with 7 BNs - fprintf(fd,"//Process group with 7 BNs\n"); - // Offset is 5*384/32 = 30 - const uint16_t lut_idxCnProcG7[7][6] = {{60,120,180,240,300,360}, {0,120,180,240,300,360}, - {0,60,180,240,300,360}, {0,60,120,240,300,360}, - {0,60,120,180,300,360}, {0,60,120,180,240,360}, - {0,60,120,180,240,300}}; - - - if (lut_numCnInCnGroups[4] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[4]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX)>>6; - - // Loop over every BN - - for (j=0; j<7; j++) - { - // Loop over CNs - // for (i=0; i>6)+lut_idxCnProcG7[j][0]/2); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<6; k++) - { - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>6)+lut_idxCnProcG7[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[4]>>6)+(j*bitOffsetInGroup)); - fprintf(fd," }\n"); - } - } - - - // ===================================================================== - // Process group with 8 BNs - fprintf(fd,"//Process group with 8 BNs\n"); - // Offset is 2*384/32 = 12 - const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,112,144,168}, {0,48,72,96,112,144,168}, - {0,24,72,96,112,144,168}, {0,24,48,96,112,144,168}, - {0,24,48,72,112,144,168}, {0,24,48,72,96,144,168}, - {0,24,48,72,96,112,168}, {0,24,48,72,96,112,144}}; - - - - if (lut_numCnInCnGroups[5] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[5]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX)>>6; - - // Loop over every BN - - for (j=0; j<8; j++) - { - // Loop over CNs - // for (i=0; i>6)+lut_idxCnProcG8[j][0]/2); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<7; k++) - { - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>6)+lut_idxCnProcG8[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[5]>>6)+(j*bitOffsetInGroup)); - fprintf(fd," }\n"); - } - } - - // ===================================================================== - // Process group with 9 BNs - fprintf(fd,"//Process group with 9 BNs\n"); - // Offset is 2*384/32 = 12 - const uint8_t lut_idxCnProcG9[9][8] = {{24,48,72,96,120,144,168,192}, {0,48,72,96,120,144,168,192}, - {0,24,72,96,120,144,168,192}, {0,24,48,96,120,144,168,192}, - {0,24,48,72,120,144,168,192}, {0,24,48,72,96,144,168,192}, - {0,24,48,72,96,120,168,192}, {0,24,48,72,96,120,144,192}, - {0,24,48,72,96,120,144,168}}; - - - - - if (lut_numCnInCnGroups[6] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[6]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[6]*NR_LDPC_ZMAX)>>6; - - // Set pointers to start of group - // Loop over every BN - - for (j=0; j<9; j++) - { - // Loop over CNs - // for (i=0; i>6)+lut_idxCnProcG9[j][0]/2); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<8; k++) - { - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[6]>>6)+lut_idxCnProcG9[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn, zeros);\n",(lut_startAddrCnGroups[6]>>6)+(j*bitOffsetInGroup)); - fprintf(fd," }\n"); - } - } - - // ===================================================================== - // Process group with 10 BNs - fprintf(fd,"//Process group with 10 BNs\n"); - // Offset is 1*384/32 = 6 - const uint8_t lut_idxCnProcG10[10][9] = {{12,24,36,48,60,72,84,96,108}, {0,24,36,48,60,72,84,96,108}, - {0,12,36,48,60,72,84,96,108}, {0,12,24,48,60,72,84,96,108}, - {0,12,24,36,60,72,84,96,108}, {0,12,24,36,48,72,84,96,108}, - {0,12,24,36,48,60,84,96,108}, {0,12,24,36,48,60,72,96,108}, - {0,12,24,36,48,60,72,84,108}, {0,12,24,36,48,60,72,84,96}}; - - if (lut_numCnInCnGroups[7] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[7]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX)>>6; - - - // Loop over every BN - - for (j=0; j<10; j++) - { - // Loop over CNs - // for (i=0; i>6)+lut_idxCnProcG10[j][0]/2); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<9; k++) - { - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[7]>>6)+lut_idxCnProcG10[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min,sgn,zeros);\n",(lut_startAddrCnGroups[7]>>6)+(j*bitOffsetInGroup)); - fprintf(fd," }\n"); - } - } - - - // ===================================================================== - // Process group with 19 BNs - fprintf(fd,"//Process group with 19 BNs\n"); - // Offset is 4*384/32 = 24 - const uint16_t lut_idxCnProcG19[19][18] = {{48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, - {0,48,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, - {0,48,96,144,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,288,336,384,432,480,528,576,624,672,720,768,816,864}, - {0,48,96,144,192,240,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,384,432,480,528,576,624,672,720,768,816,864}, - {0,48,96,144,192,240,288,336,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,480,528,576,624,672,720,768,816,864}, - {0,48,96,144,192,240,288,336,384,432,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,576,624,672,720,768,816,864}, - {0,48,96,144,192,240,288,336,384,432,480,528,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,672,720,768,816,864}, - {0,48,96,144,192,240,288,336,384,432,480,528,576,624,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,768,816,864}, - {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,864}, - {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816}}; - - - if (lut_numCnInCnGroups[8] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[8]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX)>>6; - - // Loop over every BN - - for (j=0; j<19; j++) - { - // Loop over CNs - // for (i=0; i>6)+lut_idxCnProcG19[j][0]/2); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<18; k++) - { - fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[8]>>6)+lut_idxCnProcG19[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[8]>>6)+(j*bitOffsetInGroup)); - fprintf(fd," }\n"); - } - } - - fprintf(fd,"}\n"); - fclose(fd); -}//end of the function nrLDPC_cnProc_BG1 - - - - diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/save/cnProc_gen_BG1_avx512.c.today b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/save/cnProc_gen_BG1_avx512.c.today deleted file mode 100644 index a9dab4bf99..0000000000 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/save/cnProc_gen_BG1_avx512.c.today +++ /dev/null @@ -1,596 +0,0 @@ - -#include -#include -#include "../../nrLDPCdecoder_defs.h" - -void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R) -{ - const char *ratestr[3]={"13","23","89"}; - - if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} - - - // system("mkdir -p ../ldpc_gen_files"); - - char fname[50]; - sprintf(fname,"../ldpc_gen_files/nrLDPC_cnProc_BG1_Z%d_R%s_AVX512.c",Z,ratestr[R]); - FILE *fd=fopen(fname,"w"); - if (fd == NULL) {printf("Cannot create \n");abort();} - - fprintf(fd,"#include \n"); - fprintf(fd,"#include \n"); - - - fprintf(fd, "#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)\n"); - - - fprintf(fd,"void nrLDPC_cnProc_BG1_Z%d_R%s_AVX512(int8_t* cnProcBuf,int8_t* cnProcBufRes) {\n",Z,ratestr[R]); - - const uint8_t* lut_numCnInCnGroups; - const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG1; - - if (R==0) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R13; - else if (R==1) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R23; - else if (R==2) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R89; - else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} - - - uint32_t M; - uint32_t j; - uint32_t k; - // Offset to each bit within a group in terms of 64 Byte - uint32_t bitOffsetInGroup; - - - - // ===================================================================== - // Process group with 3 BNs - fprintf(fd,"//Process group with 3 BNs\n"); - // LUT with offsets for bits that need to be processed - // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc. - // Offsets are in units of bitOffsetInGroup (1*384/32)12 - // Offsets are in units of bitOffsetInGroup (1*384/32)12 - - const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}}; - - - fprintf(fd," __m512i zmm0, min, sgn,zeros,maxLLR;\n"); - fprintf(fd," zeros = _mm512_setzero_si512();\n"); - fprintf(fd," maxLLR = _mm512_set1_epi8((char)127);\n"); - fprintf(fd," __m512i* p_cnProcBufResBit;\n"); - fprintf(fd," __m512i* p_cnProcBuf;\n"); - fprintf(fd," __m512i* p_cnProcBufRes;\n"); - fprintf(fd," const __m512i* p_ones = (__m512i*) ones512_epi8;\n"); - - - - if (lut_numCnInCnGroups[0] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[0]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX)>>6; - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[0]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[0]); - - // Loop over every BN - // Loop over every BN - - - - - for (j=0; j<3; j++) - { - - - // Set of results pointer to correct BN address - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup)); - - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG3[j][0]/2)); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // 32 CNs of second BN - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG3[j][1]/2)); - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - - fprintf(fd," }\n"); - } - } - - // ===================================================================== - // Process group with 4 BNs - fprintf(fd,"//Process group with 4 BNs\n"); - // Offset is 5*384/32 = 30 - const uint8_t lut_idxCnProcG4[4][3] = {{60,120,180}, {0,120,180}, {0,60,180}, {0,60,120}}; - - if (lut_numCnInCnGroups[1] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[1]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX)>>6; - - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[1]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[1]); - - // Loop over every BN - for (j=0; j<4; j++) - { - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup)); - - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG4[j][0]/2)); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<3; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG4[j][k]/2)); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - // *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn); - // p_cnProcBufResBit++; - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - } - } - - - // ===================================================================== - // Process group with 5 BNs - fprintf(fd,"//Process group with 5 BNs\n"); - // Offset is 18*384/32 = 216 - const uint16_t lut_idxCnProcG5[5][4] = {{216,432,648,864}, {0,432,648,864}, - {0,216,648,864}, {0,216,432,864}, {0,216,432,648}}; - - - if (lut_numCnInCnGroups[2] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[2]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX)>>6; - - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[2]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[2]); - - // Loop over every BN - - for (j=0; j<5; j++) - { - - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup)); - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG5[j][0]/2)); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<4; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG5[j][k]/2)); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - } - } - - // ===================================================================== - // Process group with 6 BNs - fprintf(fd,"//Process group with 6 BNs\n"); - // Offset is 8*384/32 = 48 - const uint16_t lut_idxCnProcG6[6][5] = {{96,192,288,384,480}, {0,192,288,384,480}, - {0,96,288,384,480}, {0,96,192,384,480}, - {0,96,192,288,480}, {0,96,192,288,384}}; - - - if (lut_numCnInCnGroups[3] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[3]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX)>>6; - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[3]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[3]); - - // Loop over every BN - - for (j=0; j<6; j++) - { - - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup)); - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG6[j][0]/2)); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<5; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG6[j][k]/2)); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - } - } - - - // ===================================================================== - // Process group with 7 BNs - fprintf(fd,"//Process group with 7 BNs\n"); - // Offset is 5*384/32 = 30 - const uint16_t lut_idxCnProcG7[7][6] = {{60,120,180,240,300,360}, {0,120,180,240,300,360}, - {0,60,180,240,300,360}, {0,60,120,240,300,360}, - {0,60,120,180,300,360}, {0,60,120,180,240,360}, - {0,60,120,180,240,300}}; - - - if (lut_numCnInCnGroups[4] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[4]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX)>>6; - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[4]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[4]); - - // Loop over every BN - - for (j=0; j<7; j++) - { - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup)); - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0= p_cnProcBuf [%d+i];\n",(lut_idxCnProcG7[j][0]/2)); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<6; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG7[j][k]/2)); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - } - } - - - // ===================================================================== - // Process group with 8 BNs - fprintf(fd,"//Process group with 8 BNs\n"); - // Offset is 2*384/32 = 12 - const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,112,144,168}, {0,48,72,96,112,144,168}, - {0,24,72,96,112,144,168}, {0,24,48,96,112,144,168}, - {0,24,48,72,112,144,168}, {0,24,48,72,96,144,168}, - {0,24,48,72,96,112,168}, {0,24,48,72,96,112,144}}; - - - - if (lut_numCnInCnGroups[5] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[5]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX)>>6; - - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[5]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[5]); - - // Loop over every BN - - for (j=0; j<8; j++) - { - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup)); - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG8[j][0]/2)); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<7; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG8[j][k]/2)); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - } - } - - // ===================================================================== - // Process group with 9 BNs - fprintf(fd,"//Process group with 9 BNs\n"); - // Offset is 2*384/32 = 12 - const uint8_t lut_idxCnProcG9[9][8] = {{24,48,72,96,120,144,168,192}, {0,48,72,96,120,144,168,192}, - {0,24,72,96,120,144,168,192}, {0,24,48,96,120,144,168,192}, - {0,24,48,72,120,144,168,192}, {0,24,48,72,96,144,168,192}, - {0,24,48,72,96,120,168,192}, {0,24,48,72,96,120,144,192}, - {0,24,48,72,96,120,144,168}}; - - - - - if (lut_numCnInCnGroups[6] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[6]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[6]*NR_LDPC_ZMAX)>>6; - - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[6]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[6]); - - // Set pointers to start of group - // Loop over every BN - - for (j=0; j<9; j++) - { - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup)); - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG9[j][0]/2)); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<8; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG9[j][k]/2)); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - } - } - - // ===================================================================== - // Process group with 10 BNs - fprintf(fd,"//Process group with 10 BNs\n"); - // Offset is 1*384/32 = 6 - const uint8_t lut_idxCnProcG10[10][9] = {{12,24,36,48,60,72,84,96,108}, {0,24,36,48,60,72,84,96,108}, - {0,12,36,48,60,72,84,96,108}, {0,12,24,48,60,72,84,96,108}, - {0,12,24,36,60,72,84,96,108}, {0,12,24,36,48,72,84,96,108}, - {0,12,24,36,48,60,84,96,108}, {0,12,24,36,48,60,72,96,108}, - {0,12,24,36,48,60,72,84,108}, {0,12,24,36,48,60,72,84,96}}; - - if (lut_numCnInCnGroups[7] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[7]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX)>>6; - - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[7]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[7]); - - - // Loop over every BN - - for (j=0; j<10; j++) - { - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup)); - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG10[j][0]/2)); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<9; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG10[j][k]/2)); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - } - } - - - // ===================================================================== - // Process group with 19 BNs - fprintf(fd,"//Process group with 19 BNs\n"); - // Offset is 4*384/32 = 24 - const uint16_t lut_idxCnProcG19[19][18] = {{48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, - {0,48,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, - {0,48,96,144,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,288,336,384,432,480,528,576,624,672,720,768,816,864}, - {0,48,96,144,192,240,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,384,432,480,528,576,624,672,720,768,816,864}, - {0,48,96,144,192,240,288,336,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,480,528,576,624,672,720,768,816,864}, - {0,48,96,144,192,240,288,336,384,432,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,576,624,672,720,768,816,864}, - {0,48,96,144,192,240,288,336,384,432,480,528,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,672,720,768,816,864}, - {0,48,96,144,192,240,288,336,384,432,480,528,576,624,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,768,816,864}, - {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,864}, - {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816}}; - - - if (lut_numCnInCnGroups[8] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[8]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX)>>6; - - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[8]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[8]); - - // Loop over every BN - - for (j=0; j<19; j++) - { - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup)); - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG19[j][0]/2)); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<18; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG19[j][k]/2)); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - } - } - - fprintf(fd,"}\n"); - fclose(fd); -}//end of the function nrLDPC_cnProc_BG1 - - - - diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/save/cnProc_gen_BG1_avx512.native b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/save/cnProc_gen_BG1_avx512.native deleted file mode 100644 index f8de0dc0b7..0000000000 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/save/cnProc_gen_BG1_avx512.native +++ /dev/null @@ -1,596 +0,0 @@ - -#include -#include -#include "../../nrLDPCdecoder_defs.h" - -void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R) -{ - const char *ratestr[3]={"13","23","89"}; - - if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} - - - // system("mkdir -p ../ldpc_gen_files"); - - char fname[50]; - sprintf(fname,"../ldpc_gen_files/nrLDPC_cnProc_BG1_Z%d_R%s_AVX512.c",Z,ratestr[R]); - FILE *fd=fopen(fname,"w"); - if (fd == NULL) {printf("Cannot create \n");abort();} - - fprintf(fd,"#include \n"); - fprintf(fd,"#include \n"); - - - fprintf(fd, "#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)\n"); - - - fprintf(fd,"void nrLDPC_cnProc_BG1_Z%d_R%s_AVX512(int8_t* cnProcBuf,int8_t* cnProcBufRes) {\n",Z,ratestr[R]); - - const uint8_t* lut_numCnInCnGroups; - const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG1; - - if (R==0) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R13; - else if (R==1) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R23; - else if (R==2) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R89; - else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} - - - uint32_t M; - uint32_t j; - uint32_t k; - // Offset to each bit within a group in terms of 64 Byte - uint32_t bitOffsetInGroup; - - - - // ===================================================================== - // Process group with 3 BNs - fprintf(fd,"//Process group with 3 BNs\n"); - // LUT with offsets for bits that need to be processed - // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc. - // Offsets are in units of bitOffsetInGroup (1*384/32)12 - // Offsets are in units of bitOffsetInGroup (1*384/32)12 - - const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}}; - - - fprintf(fd," __m512i zmm0, min, sgn,zeros,maxLLR;\n"); - fprintf(fd," zeros = _mm512_setzero_si512();\n"); - fprintf(fd," maxLLR = _mm512_set1_epi8((char)127);\n"); - fprintf(fd," __m512i* p_cnProcBufResBit;\n"); - fprintf(fd," __m512i* p_cnProcBuf;\n"); - fprintf(fd," __m512i* p_cnProcBufRes;\n"); - fprintf(fd," const __m512i* p_ones = (__m512i*) ones512_epi8;\n"); - fprintf(fd," const __m512i* p_maxLLR = (__m512i*) maxLLR512_epi8;\n"); - - - if (lut_numCnInCnGroups[0] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[0]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX)>>6; - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[0]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[0]); - - // Loop over every BN - // Loop over every BN - - - - - for (j=0; j<3; j++) - { - - - // Set of results pointer to correct BN address - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", j*bitOffsetInGroup); - - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG3[j][0]/2); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // 32 CNs of second BN - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG3[j][1]/2); - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - - // Store result - // min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, *p_maxLLR);\n"); - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - - fprintf(fd," }\n"); - } - } - - // ===================================================================== - // Process group with 4 BNs - fprintf(fd,"//Process group with 4 BNs\n"); - // Offset is 5*384/32 = 30 - const uint8_t lut_idxCnProcG4[4][3] = {{60,120,180}, {0,120,180}, {0,60,180}, {0,60,120}}; - - if (lut_numCnInCnGroups[1] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[1]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX)>>6; - - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[1]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[1]); - - // Loop over every BN - for (j=0; j<4; j++) - { - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", j*bitOffsetInGroup); - - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG4[j][0]/2); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<3; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG4[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, *p_maxLLR);\n"); - // *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn); - // p_cnProcBufResBit++; - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - } - } - - - // ===================================================================== - // Process group with 5 BNs - fprintf(fd,"//Process group with 5 BNs\n"); - // Offset is 18*384/32 = 216 - const uint16_t lut_idxCnProcG5[5][4] = {{216,432,648,864}, {0,432,648,864}, - {0,216,648,864}, {0,216,432,864}, {0,216,432,648}}; - - - if (lut_numCnInCnGroups[2] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[2]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX)>>6; - - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[2]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[2]); - - // Loop over every BN - - for (j=0; j<5; j++) - { - - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", j*bitOffsetInGroup); - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG5[j][0]/2); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<4; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG5[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, *p_maxLLR);\n"); - - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - } - } - - // ===================================================================== - // Process group with 6 BNs - fprintf(fd,"//Process group with 6 BNs\n"); - // Offset is 8*384/32 = 48 - const uint16_t lut_idxCnProcG6[6][5] = {{96,192,288,384,480}, {0,192,288,384,480}, - {0,96,288,384,480}, {0,96,192,384,480}, - {0,96,192,288,480}, {0,96,192,288,384}}; - - - if (lut_numCnInCnGroups[3] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[3]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX)>>6; - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[3]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[3]); - - // Loop over every BN - - for (j=0; j<6; j++) - { - - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", j*bitOffsetInGroup); - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG6[j][0]/2); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<5; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG6[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, *p_maxLLR);\n"); - - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - } - } - - - // ===================================================================== - // Process group with 7 BNs - fprintf(fd,"//Process group with 7 BNs\n"); - // Offset is 5*384/32 = 30 - const uint16_t lut_idxCnProcG7[7][6] = {{60,120,180,240,300,360}, {0,120,180,240,300,360}, - {0,60,180,240,300,360}, {0,60,120,240,300,360}, - {0,60,120,180,300,360}, {0,60,120,180,240,360}, - {0,60,120,180,240,300}}; - - - if (lut_numCnInCnGroups[4] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[4]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX)>>6; - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[4]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[4]); - - // Loop over every BN - - for (j=0; j<7; j++) - { - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", j*bitOffsetInGroup); - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0= p_cnProcBuf [%d+i];\n",lut_idxCnProcG7[j][0]/2); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<6; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG7[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, *p_maxLLR);\n"); - - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - } - } - - - // ===================================================================== - // Process group with 8 BNs - fprintf(fd,"//Process group with 8 BNs\n"); - // Offset is 2*384/32 = 12 - const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,112,144,168}, {0,48,72,96,112,144,168}, - {0,24,72,96,112,144,168}, {0,24,48,96,112,144,168}, - {0,24,48,72,112,144,168}, {0,24,48,72,96,144,168}, - {0,24,48,72,96,112,168}, {0,24,48,72,96,112,144}}; - - - - if (lut_numCnInCnGroups[5] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[5]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX)>>6; - - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[5]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[5]); - - // Loop over every BN - - for (j=0; j<8; j++) - { - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", j*bitOffsetInGroup); - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG8[j][0]/2); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<7; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG8[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, *p_maxLLR);\n"); - - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - } - } - - // ===================================================================== - // Process group with 9 BNs - fprintf(fd,"//Process group with 9 BNs\n"); - // Offset is 2*384/32 = 12 - const uint8_t lut_idxCnProcG9[9][8] = {{24,48,72,96,120,144,168,192}, {0,48,72,96,120,144,168,192}, - {0,24,72,96,120,144,168,192}, {0,24,48,96,120,144,168,192}, - {0,24,48,72,120,144,168,192}, {0,24,48,72,96,144,168,192}, - {0,24,48,72,96,120,168,192}, {0,24,48,72,96,120,144,192}, - {0,24,48,72,96,120,144,168}}; - - - - - if (lut_numCnInCnGroups[6] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[6]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[6]*NR_LDPC_ZMAX)>>6; - - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[6]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[6]); - - // Set pointers to start of group - // Loop over every BN - - for (j=0; j<9; j++) - { - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", j*bitOffsetInGroup); - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG9[j][0]/2); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<8; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG9[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, *p_maxLLR);\n"); - - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - } - } - - // ===================================================================== - // Process group with 10 BNs - fprintf(fd,"//Process group with 10 BNs\n"); - // Offset is 1*384/32 = 6 - const uint8_t lut_idxCnProcG10[10][9] = {{12,24,36,48,60,72,84,96,108}, {0,24,36,48,60,72,84,96,108}, - {0,12,36,48,60,72,84,96,108}, {0,12,24,48,60,72,84,96,108}, - {0,12,24,36,60,72,84,96,108}, {0,12,24,36,48,72,84,96,108}, - {0,12,24,36,48,60,84,96,108}, {0,12,24,36,48,60,72,96,108}, - {0,12,24,36,48,60,72,84,108}, {0,12,24,36,48,60,72,84,96}}; - - if (lut_numCnInCnGroups[7] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[7]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX)>>6; - - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[7]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[7]); - - - // Loop over every BN - - for (j=0; j<10; j++) - { - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", j*bitOffsetInGroup); - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG10[j][0]/2); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<9; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG10[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, *p_maxLLR);\n"); - - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - } - } - - - // ===================================================================== - // Process group with 19 BNs - fprintf(fd,"//Process group with 19 BNs\n"); - // Offset is 4*384/32 = 24 - const uint16_t lut_idxCnProcG19[19][18] = {{48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, - {0,48,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, - {0,48,96,144,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,288,336,384,432,480,528,576,624,672,720,768,816,864}, - {0,48,96,144,192,240,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,384,432,480,528,576,624,672,720,768,816,864}, - {0,48,96,144,192,240,288,336,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,480,528,576,624,672,720,768,816,864}, - {0,48,96,144,192,240,288,336,384,432,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,576,624,672,720,768,816,864}, - {0,48,96,144,192,240,288,336,384,432,480,528,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,672,720,768,816,864}, - {0,48,96,144,192,240,288,336,384,432,480,528,576,624,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,768,816,864}, - {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,864}, - {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816}}; - - - if (lut_numCnInCnGroups[8] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[8]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX)>>6; - - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[8]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[8]); - - // Loop over every BN - - for (j=0; j<19; j++) - { - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", j*bitOffsetInGroup); - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG19[j][0]/2); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<18; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG19[j][k]/2); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, *p_maxLLR);\n"); - - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - } - } - - fprintf(fd,"}\n"); - fclose(fd); -}//end of the function nrLDPC_cnProc_BG1 - - - - diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/save/cnProc_gen_BG1_avx512.unrolled b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/save/cnProc_gen_BG1_avx512.unrolled deleted file mode 100644 index 96002878a1..0000000000 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_cnProc_avx512/save/cnProc_gen_BG1_avx512.unrolled +++ /dev/null @@ -1,590 +0,0 @@ - -#include -#include -#include "../../nrLDPCdecoder_defs.h" - -void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R) -{ - const char *ratestr[3]={"13","23","89"}; - - if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} - - - // system("mkdir -p ../ldpc_gen_files"); - - char fname[50]; - sprintf(fname,"../ldpc_gen_files/nrLDPC_cnProc_BG1_Z%d_R%s_AVX512.c",Z,ratestr[R]); - FILE *fd=fopen(fname,"w"); - if (fd == NULL) {printf("Cannot create \n");abort();} - - fprintf(fd,"#include \n"); - fprintf(fd,"#include \n"); - - - fprintf(fd, "#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)\n"); - - - fprintf(fd,"void nrLDPC_cnProc_BG1_Z%d_R%s_AVX512(int8_t* cnProcBuf,int8_t* cnProcBufRes) {\n",Z,ratestr[R]); - - const uint8_t* lut_numCnInCnGroups; - const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG1; - - if (R==0) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R13; - else if (R==1) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R23; - else if (R==2) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R89; - else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} - - - uint32_t M; - uint32_t j; - uint32_t k; - // Offset to each bit within a group in terms of 64 Byte - uint32_t bitOffsetInGroup; - - - - // ===================================================================== - // Process group with 3 BNs - fprintf(fd,"//Process group with 3 BNs\n"); - // LUT with offsets for bits that need to be processed - // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc. - // Offsets are in units of bitOffsetInGroup (1*384/32)12 - // Offsets are in units of bitOffsetInGroup (1*384/32)12 - - const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}}; - - - fprintf(fd," __m512i zmm0, min, sgn,zeros,maxLLR;\n"); - fprintf(fd," zeros = _mm512_setzero_si512();\n"); - fprintf(fd," maxLLR = _mm512_set1_epi8((char)127);\n"); - fprintf(fd," __m512i* p_cnProcBufResBit;\n"); - fprintf(fd," __m512i* p_cnProcBuf;\n"); - fprintf(fd," __m512i* p_cnProcBufRes;\n"); - fprintf(fd," const __m512i* p_ones = (__m512i*) ones512_epi8;\n"); - - - - if (lut_numCnInCnGroups[0] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[0]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX)>>6; - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[0]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[0]); - - // Loop over every BN - // Loop over every BN - - - - -fprintf(fd," for (int j=0;j<3;j++) {\n"); - - - // Set of results pointer to correct BN address - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup)); - - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG3[j][0]/2)); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // 32 CNs of second BN - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG3[j][1]/2)); - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - - fprintf(fd," }\n"); - fprintf(fd,"}\n"); - } - - // ===================================================================== - // Process group with 4 BNs - fprintf(fd,"//Process group with 4 BNs\n"); - // Offset is 5*384/32 = 30 - const uint8_t lut_idxCnProcG4[4][3] = {{60,120,180}, {0,120,180}, {0,60,180}, {0,60,120}}; - - if (lut_numCnInCnGroups[1] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[1]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX)>>6; - - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[1]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[1]); - - // Loop over every BN - //for (j=0; j<4; j++) - // { - - fprintf(fd," for (int j=0;j<4;j++) {\n"); - - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup)); - - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG4[j][0]/2)); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<3; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG4[j][k]/2)); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - // *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn); - // p_cnProcBufResBit++; - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - fprintf(fd,"}\n"); - } - - - // ===================================================================== - // Process group with 5 BNs - fprintf(fd,"//Process group with 5 BNs\n"); - // Offset is 18*384/32 = 216 - const uint16_t lut_idxCnProcG5[5][4] = {{216,432,648,864}, {0,432,648,864}, - {0,216,648,864}, {0,216,432,864}, {0,216,432,648}}; - - - if (lut_numCnInCnGroups[2] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[2]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX)>>6; - - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[2]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[2]); - - // Loop over every BN - - fprintf(fd," for (int j=0;j<5;j++) {\n"); - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup)); - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG5[j][0]/2)); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<4; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG5[j][k]/2)); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - fprintf(fd,"}\n"); - } - - // ===================================================================== - // Process group with 6 BNs - fprintf(fd,"//Process group with 6 BNs\n"); - // Offset is 8*384/32 = 48 - const uint16_t lut_idxCnProcG6[6][5] = {{96,192,288,384,480}, {0,192,288,384,480}, - {0,96,288,384,480}, {0,96,192,384,480}, - {0,96,192,288,480}, {0,96,192,288,384}}; - - - if (lut_numCnInCnGroups[3] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[3]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX)>>6; - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[3]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[3]); - - // Loop over every BN - - fprintf(fd," for (int j=0;j<6;j++) {\n"); - - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup)); - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG6[j][0]/2)); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<5; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG6[j][k]/2)); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - fprintf(fd,"}\n"); - } - - - // ===================================================================== - // Process group with 7 BNs - fprintf(fd,"//Process group with 7 BNs\n"); - // Offset is 5*384/32 = 30 - const uint16_t lut_idxCnProcG7[7][6] = {{60,120,180,240,300,360}, {0,120,180,240,300,360}, - {0,60,180,240,300,360}, {0,60,120,240,300,360}, - {0,60,120,180,300,360}, {0,60,120,180,240,360}, - {0,60,120,180,240,300}}; - - - if (lut_numCnInCnGroups[4] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[4]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX)>>6; - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[4]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[4]); - - // Loop over every BN - - fprintf(fd," for (int j=0;j<7;j++) {\n"); - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup)); - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0= p_cnProcBuf [%d+i];\n",(lut_idxCnProcG7[j][0]/2)); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<6; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG7[j][k]/2)); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - fprintf(fd,"}\n"); - } - - - // ===================================================================== - // Process group with 8 BNs - fprintf(fd,"//Process group with 8 BNs\n"); - // Offset is 2*384/32 = 12 - const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,112,144,168}, {0,48,72,96,112,144,168}, - {0,24,72,96,112,144,168}, {0,24,48,96,112,144,168}, - {0,24,48,72,112,144,168}, {0,24,48,72,96,144,168}, - {0,24,48,72,96,112,168}, {0,24,48,72,96,112,144}}; - - - - if (lut_numCnInCnGroups[5] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[5]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX)>>6; - - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[5]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[5]); - - // Loop over every BN - - fprintf(fd," for (int j=0;j<8;j++) {\n"); - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup)); - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG8[j][0]/2)); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<7; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG8[j][k]/2)); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - fprintf(fd,"}\n"); - } - - // ===================================================================== - // Process group with 9 BNs - fprintf(fd,"//Process group with 9 BNs\n"); - // Offset is 2*384/32 = 12 - const uint8_t lut_idxCnProcG9[9][8] = {{24,48,72,96,120,144,168,192}, {0,48,72,96,120,144,168,192}, - {0,24,72,96,120,144,168,192}, {0,24,48,96,120,144,168,192}, - {0,24,48,72,120,144,168,192}, {0,24,48,72,96,144,168,192}, - {0,24,48,72,96,120,168,192}, {0,24,48,72,96,120,144,192}, - {0,24,48,72,96,120,144,168}}; - - - - - if (lut_numCnInCnGroups[6] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[6]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[6]*NR_LDPC_ZMAX)>>6; - - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[6]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[6]); - - // Set pointers to start of group - // Loop over every BN - - fprintf(fd," for (int j=0;j<9;j++) {\n"); - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup)); - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG9[j][0]/2)); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<8; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG9[j][k]/2)); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - fprintf(fd,"}\n"); - } - - // ===================================================================== - // Process group with 10 BNs - fprintf(fd,"//Process group with 10 BNs\n"); - // Offset is 1*384/32 = 6 - const uint8_t lut_idxCnProcG10[10][9] = {{12,24,36,48,60,72,84,96,108}, {0,24,36,48,60,72,84,96,108}, - {0,12,36,48,60,72,84,96,108}, {0,12,24,48,60,72,84,96,108}, - {0,12,24,36,60,72,84,96,108}, {0,12,24,36,48,72,84,96,108}, - {0,12,24,36,48,60,84,96,108}, {0,12,24,36,48,60,72,96,108}, - {0,12,24,36,48,60,72,84,108}, {0,12,24,36,48,60,72,84,96}}; - - if (lut_numCnInCnGroups[7] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[7]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX)>>6; - - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[7]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[7]); - - - // Loop over every BN - - fprintf(fd," for (int j=0;j<10;j++) {\n"); - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup)); - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG10[j][0]/2)); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<9; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG10[j][k]/2)); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - fprintf(fd,"}\n"); - } - - - // ===================================================================== - // Process group with 19 BNs - fprintf(fd,"//Process group with 19 BNs\n"); - // Offset is 4*384/32 = 24 - const uint16_t lut_idxCnProcG19[19][18] = {{48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, - {0,48,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, - {0,48,96,144,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,288,336,384,432,480,528,576,624,672,720,768,816,864}, - {0,48,96,144,192,240,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,384,432,480,528,576,624,672,720,768,816,864}, - {0,48,96,144,192,240,288,336,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,480,528,576,624,672,720,768,816,864}, - {0,48,96,144,192,240,288,336,384,432,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,576,624,672,720,768,816,864}, - {0,48,96,144,192,240,288,336,384,432,480,528,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,672,720,768,816,864}, - {0,48,96,144,192,240,288,336,384,432,480,528,576,624,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,768,816,864}, - {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,864}, - {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816}}; - - - if (lut_numCnInCnGroups[8] > 0) - { - // Number of groups of 64 CNs for parallel processing - // Ceil for values not divisible by 64 - M = (lut_numCnInCnGroups[8]*Z + 63)>>6; - - // Set the offset to each bit within a group in terms of 64 Byte - bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX)>>6; - - // Set pointers to start of group 3 - fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[8]); - fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[8]); - - // Loop over every BN - - fprintf(fd," for (int j=0;j<11;j++) {\n"); - fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup)); - fprintf(fd," for (int i=0;i<%d;i++) {\n",M); - // Abs and sign of 64 CNs (first BN) - // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG19[j][0]/2)); - fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n"); - fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); - - - // Loop over BNs - for (k=1; k<18; k++) - { - fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG19[j][k]/2)); - - // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); - fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); - - // sgn = _mm512_sign_epi8(*p_ones, zmm0); - fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); - } - - // Store result - // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 - fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); - - fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n"); - fprintf(fd," p_cnProcBufResBit++;\n"); - fprintf(fd," }\n"); - fprintf(fd,"}\n"); - } - - fprintf(fd,"}\n"); - fclose(fd); -}//end of the function nrLDPC_cnProc_BG1 - - - - diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProc/nrLDPC_bnProc_BG1_R13_AVX2.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProc/nrLDPC_bnProc_BG1_R13_AVX2.h index d6bdfb4571..ada3706a6f 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProc/nrLDPC_bnProc_BG1_R13_AVX2.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProc/nrLDPC_bnProc_BG1_R13_AVX2.h @@ -13,30 +13,22 @@ static inline void nrLDPC_bnProc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu p_res = &p_bnProcBufRes[0]; p_llrRes = (__m256i*) &llrRes [16128]; for (i=0;i>5; @@ -45,37 +37,27 @@ static inline void nrLDPC_bnProc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu p_res = &p_bnProcBufRes[0]; p_llrRes = (__m256i*) &llrRes [16512]; for (i=0;i>5; @@ -84,44 +66,32 @@ static inline void nrLDPC_bnProc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu p_res = &p_bnProcBufRes[0]; p_llrRes = (__m256i*) &llrRes [16896]; for (i=0;i>5; @@ -130,51 +100,37 @@ static inline void nrLDPC_bnProc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu p_res = &p_bnProcBufRes[0]; p_llrRes = (__m256i*) &llrRes [17664]; for (i=0;i>5; @@ -183,58 +139,42 @@ static inline void nrLDPC_bnProc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu p_res = &p_bnProcBufRes[0]; p_llrRes = (__m256i*) &llrRes [19200]; for (i=0;i>5; @@ -243,65 +183,47 @@ static inline void nrLDPC_bnProc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu p_res = &p_bnProcBufRes[0]; p_llrRes = (__m256i*) &llrRes [20352]; for (i=0;i>5; @@ -310,72 +232,52 @@ static inline void nrLDPC_bnProc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu p_res = &p_bnProcBufRes[0]; p_llrRes = (__m256i*) &llrRes [20736]; for (i=0;i>5; @@ -384,79 +286,57 @@ static inline void nrLDPC_bnProc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu p_res = &p_bnProcBufRes[0]; p_llrRes = (__m256i*) &llrRes [22272]; for (i=0;i>5; @@ -465,86 +345,62 @@ static inline void nrLDPC_bnProc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu p_res = &p_bnProcBufRes[0]; p_llrRes = (__m256i*) &llrRes [23424]; for (i=0;i>5; @@ -553,9 +409,67 @@ static inline void nrLDPC_bnProc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu p_res = &p_bnProcBufRes[0]; p_llrRes = (__m256i*) &llrRes [24960]; for (i=0;i>5; @@ -29,23 +25,17 @@ static inline void nrLDPC_bnProc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu p_res = &p_bnProcBufRes[0]; p_llrRes = (__m256i*) &llrRes [3840]; for (i=0;i>5; @@ -54,30 +44,22 @@ static inline void nrLDPC_bnProc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu p_res = &p_bnProcBufRes[0]; p_llrRes = (__m256i*) &llrRes [5760]; for (i=0;i>5; @@ -86,37 +68,27 @@ static inline void nrLDPC_bnProc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu p_res = &p_bnProcBufRes[0]; p_llrRes = (__m256i*) &llrRes [6912]; for (i=0;i>5; @@ -125,44 +97,32 @@ static inline void nrLDPC_bnProc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu p_res = &p_bnProcBufRes[0]; p_llrRes = (__m256i*) &llrRes [9600]; for (i=0;i>5; @@ -256,86 +194,62 @@ static inline void nrLDPC_bnProc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu p_res = &p_bnProcBufRes[0]; p_llrRes = (__m256i*) &llrRes [13056]; for (i=0;i>5; @@ -29,23 +25,17 @@ static inline void nrLDPC_bnProc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu p_res = &p_bnProcBufRes[0]; p_llrRes = (__m256i*) &llrRes [1536]; for (i=0;i>5; @@ -54,30 +44,22 @@ static inline void nrLDPC_bnProc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu p_res = &p_bnProcBufRes[0]; p_llrRes = (__m256i*) &llrRes [9600]; for (i=0;i>5; @@ -86,37 +68,27 @@ static inline void nrLDPC_bnProc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu p_res = &p_bnProcBufRes[0]; p_llrRes = (__m256i*) &llrRes [9984]; for (i=0;i +#include +void nrLDPC_bnProc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z ) { + __m256i* p_bnProcBuf; + __m256i* p_bnProcBufRes; + __m256i* p_llrRes; + __m256i* p_res; + uint32_t M, i; +// Process group with 2 CNs + M = (1*Z + 31)>>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [6912]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [6912]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [6912]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [7680]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [7680]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [7296]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [10752]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [10752]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [8064]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [12672]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [12672]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [8448]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [24192]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [24192]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [10368]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [26880]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [26880]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [10752]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [29952]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [29952]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [11136]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [34944]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [34944]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [11520]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [40320]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [40320]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [11904]; + for (i=0;i +#include +void nrLDPC_bnProc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z ) { + __m256i* p_bnProcBuf; + __m256i* p_bnProcBufRes; + __m256i* p_llrRes; + __m256i* p_res; + uint32_t M, i; +// Process group with 2 CNs +// Process group with 3 CNs +// Process group with 4 CNs +// Process group with 5 CNs + M = (2*Z + 31)>>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [14592]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [14592]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [14592]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [18432]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [18432]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [15360]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [20736]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [20736]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [15744]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [23424]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [23424]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [16128]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [26496]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [26496]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [16512]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [33408]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [33408]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [17280]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [37248]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [37248]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [17664]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [41856]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [41856]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [18048]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [46848]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [46848]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [18432]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [52224]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [52224]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [18816]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [58368]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [58368]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [66816]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [66816]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i +#include +void nrLDPC_bnProc_BG2_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z ) { + __m256i* p_bnProcBuf; + __m256i* p_bnProcBufRes; + __m256i* p_llrRes; + __m256i* p_res; + uint32_t M, i; +// Process group with 2 CNs + M = (3*Z + 31)>>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [1152]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [1152]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [1152]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [3456]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [3456]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [2304]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [9216]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [9216]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [4224]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [13824]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [13824]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [5376]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [17664]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [17664]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [6144]; + for (i=0;i>5; + M = (42*Z + 31)>>5; p_bnProcBuf = (__m128i*) &bnProcBuf [0]; - p_bnProcBufRes = (__m256i*) &bnProcBufRes [0]; p_llrProcBuf = (__m128i*) &llrProcBuf [0]; - p_llrProcBuf256 = (__m256i*) &llrProcBuf [0]; p_llrRes = (__m256i*) &llrRes [0]; for (int i=0,j=0;i>5; @@ -84,8 +77,7 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 6 CNs M = (2*Z + 31)>>5; @@ -120,8 +112,7 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 7 CNs M = (4*Z + 31)>>5; @@ -160,8 +151,7 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 8 CNs M = (3*Z + 31)>>5; @@ -204,8 +194,7 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 9 CNs M = (1*Z + 31)>>5; @@ -252,8 +241,7 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 10 CNs M = (4*Z + 31)>>5; @@ -304,8 +292,7 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 11 CNs M = (3*Z + 31)>>5; @@ -360,8 +347,7 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 12 CNs M = (4*Z + 31)>>5; @@ -420,8 +406,7 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 13 CNs M = (1*Z + 31)>>5; @@ -484,8 +469,7 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 14 CNs // Process group with 15 CNs @@ -622,8 +606,7 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 29 CNs // Process group with 30 CNs @@ -755,7 +738,6 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } } diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG1_R23_AVX2.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG1_R23_AVX2.h index 6d6572bea3..47fd449fe4 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG1_R23_AVX2.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG1_R23_AVX2.h @@ -1,29 +1,23 @@ -static inline void nrLDPC_bnProcPc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { +static inline void nrLDPC_bnProcPc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { __m256i ymm0, ymm1, ymmRes0, ymmRes1; __m128i* p_bnProcBuf; - __m256i* p_bnProcBufRes; __m128i* p_llrProcBuf; - __m256i* p_llrProcBuf256; __m256i* p_llrRes; uint32_t M ; // Process group with 1 CNs - M = (0*Z + 31)>>5; + M = (9*Z + 31)>>5; p_bnProcBuf = (__m128i*) &bnProcBuf [0]; - p_bnProcBufRes = (__m256i*) &bnProcBufRes [0]; p_llrProcBuf = (__m128i*) &llrProcBuf [0]; - p_llrProcBuf256 = (__m256i*) &llrProcBuf [0]; p_llrRes = (__m256i*) &llrRes [0]; for (int i=0,j=0;i>5; @@ -32,7 +26,7 @@ static inline void nrLDPC_bnProcPc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc p_llrRes = (__m256i*) &llrRes [3456]; for (int i=0,j=0;i>5; @@ -66,8 +59,7 @@ static inline void nrLDPC_bnProcPc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 4 CNs M = (3*Z + 31)>>5; @@ -94,8 +86,7 @@ static inline void nrLDPC_bnProcPc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 5 CNs M = (7*Z + 31)>>5; @@ -126,8 +117,7 @@ static inline void nrLDPC_bnProcPc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 6 CNs M = (8*Z + 31)>>5; @@ -162,8 +152,7 @@ static inline void nrLDPC_bnProcPc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 7 CNs // Process group with 8 CNs @@ -222,8 +211,7 @@ static inline void nrLDPC_bnProcPc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 12 CNs M = (1*Z + 31)>>5; @@ -282,8 +270,7 @@ static inline void nrLDPC_bnProcPc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 13 CNs // Process group with 14 CNs diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG1_R89_AVX2.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG1_R89_AVX2.h index 11f974ee87..8c7fa43f5d 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG1_R89_AVX2.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG1_R89_AVX2.h @@ -1,29 +1,23 @@ -static inline void nrLDPC_bnProcPc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { +static inline void nrLDPC_bnProcPc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { __m256i ymm0, ymm1, ymmRes0, ymmRes1; __m128i* p_bnProcBuf; - __m256i* p_bnProcBufRes; __m128i* p_llrProcBuf; - __m256i* p_llrProcBuf256; __m256i* p_llrRes; uint32_t M ; // Process group with 1 CNs - M = (0*Z + 31)>>5; + M = (1*Z + 31)>>5; p_bnProcBuf = (__m128i*) &bnProcBuf [0]; - p_bnProcBufRes = (__m256i*) &bnProcBufRes [0]; p_llrProcBuf = (__m128i*) &llrProcBuf [0]; - p_llrProcBuf256 = (__m256i*) &llrProcBuf [0]; p_llrRes = (__m256i*) &llrRes [0]; for (int i=0,j=0;i>5; @@ -32,7 +26,7 @@ static inline void nrLDPC_bnProcPc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* bnProc p_llrRes = (__m256i*) &llrRes [384]; for (int i=0,j=0;i>5; @@ -66,8 +59,7 @@ static inline void nrLDPC_bnProcPc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 4 CNs M = (1*Z + 31)>>5; @@ -94,8 +86,7 @@ static inline void nrLDPC_bnProcPc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 5 CNs M = (1*Z + 31)>>5; @@ -126,8 +117,7 @@ static inline void nrLDPC_bnProcPc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 6 CNs // Process group with 7 CNs diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG2_R13_AVX2.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG2_R13_AVX2.h index 4ca040e27d..c4268cd7af 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG2_R13_AVX2.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG2_R13_AVX2.h @@ -1,29 +1,23 @@ -static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { +static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { __m256i ymm0, ymm1, ymmRes0, ymmRes1; __m128i* p_bnProcBuf; - __m256i* p_bnProcBufRes; __m128i* p_llrProcBuf; - __m256i* p_llrProcBuf256; __m256i* p_llrRes; uint32_t M ; // Process group with 1 CNs - M = (0*Z + 31)>>5; + M = (18*Z + 31)>>5; p_bnProcBuf = (__m128i*) &bnProcBuf [0]; - p_bnProcBufRes = (__m256i*) &bnProcBufRes [0]; p_llrProcBuf = (__m128i*) &llrProcBuf [0]; - p_llrProcBuf256 = (__m256i*) &llrProcBuf [0]; p_llrRes = (__m256i*) &llrRes [0]; for (int i=0,j=0;i>5; @@ -32,7 +26,7 @@ static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc p_llrRes = (__m256i*) &llrRes [6912]; for (int i=0,j=0;i>5; @@ -103,8 +95,7 @@ static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 6 CNs M = (5*Z + 31)>>5; @@ -139,8 +130,7 @@ static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 7 CNs M = (1*Z + 31)>>5; @@ -179,8 +169,7 @@ static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 8 CNs M = (1*Z + 31)>>5; @@ -223,8 +212,7 @@ static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 9 CNs // Process group with 10 CNs @@ -291,8 +279,7 @@ static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 14 CNs M = (1*Z + 31)>>5; @@ -359,8 +346,7 @@ static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 15 CNs // Process group with 16 CNs @@ -436,8 +422,7 @@ static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 17 CNs // Process group with 18 CNs @@ -445,7 +430,7 @@ static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc // Process group with 20 CNs // Process group with 21 CNs // Process group with 22 CNs -// Process group with 23 CNs +// Process group with <23 CNs // Process group with 24 CNs // Process group with 25 CNs // Process group with 26 CNs diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG2_R15_AVX2.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG2_R15_AVX2.h index 2dc723ad25..3a43ebe6b5 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG2_R15_AVX2.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG2_R15_AVX2.h @@ -1,29 +1,23 @@ -static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { +static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { __m256i ymm0, ymm1, ymmRes0, ymmRes1; __m128i* p_bnProcBuf; - __m256i* p_bnProcBufRes; __m128i* p_llrProcBuf; - __m256i* p_llrProcBuf256; __m256i* p_llrRes; uint32_t M ; // Process group with 1 CNs - M = (0*Z + 31)>>5; + M = (38*Z + 31)>>5; p_bnProcBuf = (__m128i*) &bnProcBuf [0]; - p_bnProcBufRes = (__m256i*) &bnProcBufRes [0]; p_llrProcBuf = (__m128i*) &llrProcBuf [0]; - p_llrProcBuf256 = (__m256i*) &llrProcBuf [0]; p_llrRes = (__m256i*) &llrRes [0]; for (int i=0,j=0;i>5; @@ -93,8 +86,7 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 7 CNs M = (1*Z + 31)>>5; @@ -133,8 +125,7 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 8 CNs M = (1*Z + 31)>>5; @@ -177,8 +168,7 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 9 CNs M = (2*Z + 31)>>5; @@ -225,8 +215,7 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 10 CNs M = (1*Z + 31)>>5; @@ -277,8 +266,7 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 11 CNs // Process group with 12 CNs @@ -338,8 +326,7 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 13 CNs M = (1*Z + 31)>>5; @@ -402,8 +389,7 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 14 CNs M = (1*Z + 31)>>5; @@ -470,8 +456,7 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 15 CNs // Process group with 16 CNs @@ -547,8 +532,7 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 17 CNs // Process group with 18 CNs @@ -652,10 +636,9 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } -// Process group with 23 CNs +// Process group with <23 CNs M = (1*Z + 31)>>5; p_bnProcBuf = (__m128i*) &bnProcBuf [66816]; p_llrProcBuf = (__m128i*) &llrProcBuf [19584]; @@ -756,8 +739,7 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 24 CNs // Process group with 25 CNs diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG2_R23_AVX2.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG2_R23_AVX2.h index ddb40887f7..aec8838761 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG2_R23_AVX2.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG2_R23_AVX2.h @@ -1,29 +1,23 @@ -static inline void nrLDPC_bnProcPc_BG2_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { +static inline void nrLDPC_bnProcPc_BG2_R23_AVX2(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { __m256i ymm0, ymm1, ymmRes0, ymmRes1; __m128i* p_bnProcBuf; - __m256i* p_bnProcBufRes; __m128i* p_llrProcBuf; - __m256i* p_llrProcBuf256; __m256i* p_llrRes; uint32_t M ; // Process group with 1 CNs - M = (0*Z + 31)>>5; + M = (3*Z + 31)>>5; p_bnProcBuf = (__m128i*) &bnProcBuf [0]; - p_bnProcBufRes = (__m256i*) &bnProcBufRes [0]; p_llrProcBuf = (__m128i*) &llrProcBuf [0]; - p_llrProcBuf256 = (__m256i*) &llrProcBuf [0]; p_llrRes = (__m256i*) &llrRes [0]; for (int i=0,j=0;i>5; @@ -32,7 +26,7 @@ static inline void nrLDPC_bnProcPc_BG2_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc p_llrRes = (__m256i*) &llrRes [1152]; for (int i=0,j=0;i>5; @@ -66,8 +59,7 @@ static inline void nrLDPC_bnProcPc_BG2_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 4 CNs M = (3*Z + 31)>>5; @@ -94,8 +86,7 @@ static inline void nrLDPC_bnProcPc_BG2_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 5 CNs M = (2*Z + 31)>>5; @@ -126,8 +117,7 @@ static inline void nrLDPC_bnProcPc_BG2_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 6 CNs M = (1*Z + 31)>>5; @@ -162,8 +152,7 @@ static inline void nrLDPC_bnProcPc_BG2_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); - p_llrRes++; + p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); } // Process group with 7 CNs // Process group with 8 CNs @@ -181,7 +170,7 @@ static inline void nrLDPC_bnProcPc_BG2_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc // Process group with 20 CNs // Process group with 21 CNs // Process group with 22 CNs -// Process group with 23 CNs +// Process group with <23 CNs // Process group with 24 CNs // Process group with 25 CNs // Process group with 26 CNs diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/cnProc/nrLDPC_cnProc_BG1_R13_AVX2.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/cnProc/nrLDPC_cnProc_BG1_R13_AVX2.h index 12ccd19459..19f4406ae7 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/cnProc/nrLDPC_cnProc_BG1_R13_AVX2.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/cnProc/nrLDPC_cnProc_BG1_R13_AVX2.h @@ -460,7 +460,7 @@ M = (2*Z + 31)>>5; ymm0 = ((__m256i*)cnProcBuf)[2448+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); - ymm0 = ((__m256i*)cnProcBuf)[2464+i]; + ymm0 = ((__m256i*)cnProcBuf)[2472+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); ymm0 = ((__m256i*)cnProcBuf)[2496+i]; @@ -485,7 +485,7 @@ M = (2*Z + 31)>>5; ymm0 = ((__m256i*)cnProcBuf)[2448+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); - ymm0 = ((__m256i*)cnProcBuf)[2464+i]; + ymm0 = ((__m256i*)cnProcBuf)[2472+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); ymm0 = ((__m256i*)cnProcBuf)[2496+i]; @@ -510,7 +510,7 @@ M = (2*Z + 31)>>5; ymm0 = ((__m256i*)cnProcBuf)[2448+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); - ymm0 = ((__m256i*)cnProcBuf)[2464+i]; + ymm0 = ((__m256i*)cnProcBuf)[2472+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); ymm0 = ((__m256i*)cnProcBuf)[2496+i]; @@ -535,7 +535,7 @@ M = (2*Z + 31)>>5; ymm0 = ((__m256i*)cnProcBuf)[2448+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); - ymm0 = ((__m256i*)cnProcBuf)[2464+i]; + ymm0 = ((__m256i*)cnProcBuf)[2472+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); ymm0 = ((__m256i*)cnProcBuf)[2496+i]; @@ -560,7 +560,7 @@ M = (2*Z + 31)>>5; ymm0 = ((__m256i*)cnProcBuf)[2424+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); - ymm0 = ((__m256i*)cnProcBuf)[2464+i]; + ymm0 = ((__m256i*)cnProcBuf)[2472+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); ymm0 = ((__m256i*)cnProcBuf)[2496+i]; @@ -613,7 +613,7 @@ M = (2*Z + 31)>>5; ymm0 = ((__m256i*)cnProcBuf)[2448+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); - ymm0 = ((__m256i*)cnProcBuf)[2464+i]; + ymm0 = ((__m256i*)cnProcBuf)[2472+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); ymm0 = ((__m256i*)cnProcBuf)[2520+i]; @@ -638,7 +638,7 @@ M = (2*Z + 31)>>5; ymm0 = ((__m256i*)cnProcBuf)[2448+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); - ymm0 = ((__m256i*)cnProcBuf)[2464+i]; + ymm0 = ((__m256i*)cnProcBuf)[2472+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); ymm0 = ((__m256i*)cnProcBuf)[2496+i]; diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/cnProc/nrLDPC_cnProc_BG1_R23_AVX2.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/cnProc/nrLDPC_cnProc_BG1_R23_AVX2.h index 3fafddd85e..113daa7e21 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/cnProc/nrLDPC_cnProc_BG1_R23_AVX2.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/cnProc/nrLDPC_cnProc_BG1_R23_AVX2.h @@ -211,7 +211,7 @@ M = (2*Z + 31)>>5; ymm0 = ((__m256i*)cnProcBuf)[2448+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); - ymm0 = ((__m256i*)cnProcBuf)[2464+i]; + ymm0 = ((__m256i*)cnProcBuf)[2472+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); ymm0 = ((__m256i*)cnProcBuf)[2496+i]; @@ -236,7 +236,7 @@ M = (2*Z + 31)>>5; ymm0 = ((__m256i*)cnProcBuf)[2448+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); - ymm0 = ((__m256i*)cnProcBuf)[2464+i]; + ymm0 = ((__m256i*)cnProcBuf)[2472+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); ymm0 = ((__m256i*)cnProcBuf)[2496+i]; @@ -261,7 +261,7 @@ M = (2*Z + 31)>>5; ymm0 = ((__m256i*)cnProcBuf)[2448+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); - ymm0 = ((__m256i*)cnProcBuf)[2464+i]; + ymm0 = ((__m256i*)cnProcBuf)[2472+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); ymm0 = ((__m256i*)cnProcBuf)[2496+i]; @@ -286,7 +286,7 @@ M = (2*Z + 31)>>5; ymm0 = ((__m256i*)cnProcBuf)[2448+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); - ymm0 = ((__m256i*)cnProcBuf)[2464+i]; + ymm0 = ((__m256i*)cnProcBuf)[2472+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); ymm0 = ((__m256i*)cnProcBuf)[2496+i]; @@ -311,7 +311,7 @@ M = (2*Z + 31)>>5; ymm0 = ((__m256i*)cnProcBuf)[2424+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); - ymm0 = ((__m256i*)cnProcBuf)[2464+i]; + ymm0 = ((__m256i*)cnProcBuf)[2472+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); ymm0 = ((__m256i*)cnProcBuf)[2496+i]; @@ -364,7 +364,7 @@ M = (2*Z + 31)>>5; ymm0 = ((__m256i*)cnProcBuf)[2448+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); - ymm0 = ((__m256i*)cnProcBuf)[2464+i]; + ymm0 = ((__m256i*)cnProcBuf)[2472+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); ymm0 = ((__m256i*)cnProcBuf)[2520+i]; @@ -389,7 +389,7 @@ M = (2*Z + 31)>>5; ymm0 = ((__m256i*)cnProcBuf)[2448+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); - ymm0 = ((__m256i*)cnProcBuf)[2464+i]; + ymm0 = ((__m256i*)cnProcBuf)[2472+i]; min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); sgn = _mm256_sign_epi8(sgn, ymm0); ymm0 = ((__m256i*)cnProcBuf)[2496+i]; diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/cnProc_avx512/nrLDPC_cnProc_BG1_R13_AVX512.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/cnProc_avx512/nrLDPC_cnProc_BG1_R13_AVX512.h index b53bff6d41..4e60809501 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/cnProc_avx512/nrLDPC_cnProc_BG1_R13_AVX512.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/cnProc_avx512/nrLDPC_cnProc_BG1_R13_AVX512.h @@ -460,7 +460,7 @@ M = (2*Z + 63)>>6; zmm0 = ((__m512i*)cnProcBuf)[1224+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); - zmm0 = ((__m512i*)cnProcBuf)[1232+i]; + zmm0 = ((__m512i*)cnProcBuf)[1236+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); zmm0 = ((__m512i*)cnProcBuf)[1248+i]; @@ -485,7 +485,7 @@ M = (2*Z + 63)>>6; zmm0 = ((__m512i*)cnProcBuf)[1224+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); - zmm0 = ((__m512i*)cnProcBuf)[1232+i]; + zmm0 = ((__m512i*)cnProcBuf)[1236+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); zmm0 = ((__m512i*)cnProcBuf)[1248+i]; @@ -510,7 +510,7 @@ M = (2*Z + 63)>>6; zmm0 = ((__m512i*)cnProcBuf)[1224+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); - zmm0 = ((__m512i*)cnProcBuf)[1232+i]; + zmm0 = ((__m512i*)cnProcBuf)[1236+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); zmm0 = ((__m512i*)cnProcBuf)[1248+i]; @@ -535,7 +535,7 @@ M = (2*Z + 63)>>6; zmm0 = ((__m512i*)cnProcBuf)[1224+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); - zmm0 = ((__m512i*)cnProcBuf)[1232+i]; + zmm0 = ((__m512i*)cnProcBuf)[1236+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); zmm0 = ((__m512i*)cnProcBuf)[1248+i]; @@ -560,7 +560,7 @@ M = (2*Z + 63)>>6; zmm0 = ((__m512i*)cnProcBuf)[1212+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); - zmm0 = ((__m512i*)cnProcBuf)[1232+i]; + zmm0 = ((__m512i*)cnProcBuf)[1236+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); zmm0 = ((__m512i*)cnProcBuf)[1248+i]; @@ -613,7 +613,7 @@ M = (2*Z + 63)>>6; zmm0 = ((__m512i*)cnProcBuf)[1224+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); - zmm0 = ((__m512i*)cnProcBuf)[1232+i]; + zmm0 = ((__m512i*)cnProcBuf)[1236+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); zmm0 = ((__m512i*)cnProcBuf)[1260+i]; @@ -638,7 +638,7 @@ M = (2*Z + 63)>>6; zmm0 = ((__m512i*)cnProcBuf)[1224+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); - zmm0 = ((__m512i*)cnProcBuf)[1232+i]; + zmm0 = ((__m512i*)cnProcBuf)[1236+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); zmm0 = ((__m512i*)cnProcBuf)[1248+i]; diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/cnProc_avx512/nrLDPC_cnProc_BG1_R23_AVX512.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/cnProc_avx512/nrLDPC_cnProc_BG1_R23_AVX512.h index 18ad638b6b..2f5ad66dc3 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/cnProc_avx512/nrLDPC_cnProc_BG1_R23_AVX512.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/cnProc_avx512/nrLDPC_cnProc_BG1_R23_AVX512.h @@ -211,7 +211,7 @@ M = (2*Z + 63)>>6; zmm0 = ((__m512i*)cnProcBuf)[1224+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); - zmm0 = ((__m512i*)cnProcBuf)[1232+i]; + zmm0 = ((__m512i*)cnProcBuf)[1236+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); zmm0 = ((__m512i*)cnProcBuf)[1248+i]; @@ -236,7 +236,7 @@ M = (2*Z + 63)>>6; zmm0 = ((__m512i*)cnProcBuf)[1224+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); - zmm0 = ((__m512i*)cnProcBuf)[1232+i]; + zmm0 = ((__m512i*)cnProcBuf)[1236+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); zmm0 = ((__m512i*)cnProcBuf)[1248+i]; @@ -261,7 +261,7 @@ M = (2*Z + 63)>>6; zmm0 = ((__m512i*)cnProcBuf)[1224+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); - zmm0 = ((__m512i*)cnProcBuf)[1232+i]; + zmm0 = ((__m512i*)cnProcBuf)[1236+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); zmm0 = ((__m512i*)cnProcBuf)[1248+i]; @@ -286,7 +286,7 @@ M = (2*Z + 63)>>6; zmm0 = ((__m512i*)cnProcBuf)[1224+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); - zmm0 = ((__m512i*)cnProcBuf)[1232+i]; + zmm0 = ((__m512i*)cnProcBuf)[1236+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); zmm0 = ((__m512i*)cnProcBuf)[1248+i]; @@ -311,7 +311,7 @@ M = (2*Z + 63)>>6; zmm0 = ((__m512i*)cnProcBuf)[1212+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); - zmm0 = ((__m512i*)cnProcBuf)[1232+i]; + zmm0 = ((__m512i*)cnProcBuf)[1236+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); zmm0 = ((__m512i*)cnProcBuf)[1248+i]; @@ -364,7 +364,7 @@ M = (2*Z + 63)>>6; zmm0 = ((__m512i*)cnProcBuf)[1224+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); - zmm0 = ((__m512i*)cnProcBuf)[1232+i]; + zmm0 = ((__m512i*)cnProcBuf)[1236+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); zmm0 = ((__m512i*)cnProcBuf)[1260+i]; @@ -389,7 +389,7 @@ M = (2*Z + 63)>>6; zmm0 = ((__m512i*)cnProcBuf)[1224+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); - zmm0 = ((__m512i*)cnProcBuf)[1232+i]; + zmm0 = ((__m512i*)cnProcBuf)[1236+i]; min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); sgn = _mm512_xor_si512(sgn, zmm0); zmm0 = ((__m512i*)cnProcBuf)[1248+i]; diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/cnProc_avx512/nrLDPC_cnProc_BG2_R13_AVX512.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/cnProc_avx512/nrLDPC_cnProc_BG2_R13_AVX512.h index 2fd076df2d..a4fa8b480e 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/cnProc_avx512/nrLDPC_cnProc_BG2_R13_AVX512.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/cnProc_avx512/nrLDPC_cnProc_BG2_R13_AVX512.h @@ -1,15 +1,17 @@ #define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a) static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) { uint32_t M; - __m512i zmm0, min, sgn,zeros,maxLLR; + __m512i zmm0, min, sgn,zeros,ones,maxLLR; zeros = _mm512_setzero_si512(); maxLLR = _mm512_set1_epi8((char)127); + ones = _mm512_set1_epi8((char)1); //Process group with 3 BNs //Process group with 4 BNs M = (8*Z + 63)>>6; for (int i=0;i>6; for (int i=0;i>6; for (int i=0;i>6; for (int i=0;i>6; for (int i=0;i>6; - for (int i=0;i>6; + for (int i=0;i>6; for (int i=0;i>6; for (int i=0;i>6; for (int i=0;i>6; for (int i=0;i>6; for (int i=0;i>6; for (int i=0;i>6; for (int i=0;i>6; for (int i=0;i>6; for (int i=0;i +#pragma omp declare simd notinbranch +static inline void nrLDPC_llr2CnProcBuf_BG1_AVX2(t_nrLDPC_lut* p_lut, int8_t* llr, int8_t* cnProcBuf, uint16_t Z) { + const uint16_t (*lut_circShift_CNG3) [lut_numCnInCnGroups_BG1_R13[0]] = (uint16_t(*)[lut_numCnInCnGroups_BG1_R13[0]]) p_lut->circShift[0]; + const uint16_t (*lut_circShift_CNG4) [lut_numCnInCnGroups_BG1_R13[1]] = (uint16_t(*)[lut_numCnInCnGroups_BG1_R13[1]]) p_lut->circShift[1]; + const uint16_t (*lut_circShift_CNG5) [lut_numCnInCnGroups_BG1_R13[2]] = (uint16_t(*)[lut_numCnInCnGroups_BG1_R13[2]]) p_lut->circShift[2]; + const uint16_t (*lut_circShift_CNG6) [lut_numCnInCnGroups_BG1_R13[3]] = (uint16_t(*)[lut_numCnInCnGroups_BG1_R13[3]]) p_lut->circShift[3]; + const uint16_t (*lut_circShift_CNG7) [lut_numCnInCnGroups_BG1_R13[4]] = (uint16_t(*)[lut_numCnInCnGroups_BG1_R13[4]]) p_lut->circShift[4]; + const uint16_t (*lut_circShift_CNG8) [lut_numCnInCnGroups_BG1_R13[5]] = (uint16_t(*)[lut_numCnInCnGroups_BG1_R13[5]]) p_lut->circShift[5]; + const uint16_t (*lut_circShift_CNG9) [lut_numCnInCnGroups_BG1_R13[6]] = (uint16_t(*)[lut_numCnInCnGroups_BG1_R13[6]]) p_lut->circShift[6]; + const uint16_t (*lut_circShift_CNG10)[lut_numCnInCnGroups_BG1_R13[7]] = (uint16_t(*)[lut_numCnInCnGroups_BG1_R13[7]]) p_lut->circShift[7]; + const uint16_t (*lut_circShift_CNG19)[lut_numCnInCnGroups_BG1_R13[8]] = (uint16_t(*)[lut_numCnInCnGroups_BG1_R13[8]]) p_lut->circShift[8]; + const uint8_t (*lut_posBnInCnProcBuf_CNG3) [lut_numCnInCnGroups_BG1_R13[0]] = (uint8_t(*)[lut_numCnInCnGroups_BG1_R13[0]]) p_lut->posBnInCnProcBuf[0]; + const uint8_t (*lut_posBnInCnProcBuf_CNG4) [lut_numCnInCnGroups_BG1_R13[1]] = (uint8_t(*)[lut_numCnInCnGroups_BG1_R13[1]]) p_lut->posBnInCnProcBuf[1]; + const uint8_t (*lut_posBnInCnProcBuf_CNG5) [lut_numCnInCnGroups_BG1_R13[2]] = (uint8_t(*)[lut_numCnInCnGroups_BG1_R13[2]]) p_lut->posBnInCnProcBuf[2]; + const uint8_t (*lut_posBnInCnProcBuf_CNG6) [lut_numCnInCnGroups_BG1_R13[3]] = (uint8_t(*)[lut_numCnInCnGroups_BG1_R13[3]]) p_lut->posBnInCnProcBuf[3]; + const uint8_t (*lut_posBnInCnProcBuf_CNG7) [lut_numCnInCnGroups_BG1_R13[4]] = (uint8_t(*)[lut_numCnInCnGroups_BG1_R13[4]]) p_lut->posBnInCnProcBuf[4]; + const uint8_t (*lut_posBnInCnProcBuf_CNG8) [lut_numCnInCnGroups_BG1_R13[5]] = (uint8_t(*)[lut_numCnInCnGroups_BG1_R13[5]]) p_lut->posBnInCnProcBuf[5]; + const uint8_t (*lut_posBnInCnProcBuf_CNG9) [lut_numCnInCnGroups_BG1_R13[6]] = (uint8_t(*)[lut_numCnInCnGroups_BG1_R13[6]]) p_lut->posBnInCnProcBuf[6]; + const uint8_t (*lut_posBnInCnProcBuf_CNG10)[lut_numCnInCnGroups_BG1_R13[7]] = (uint8_t(*)[lut_numCnInCnGroups_BG1_R13[7]]) p_lut->posBnInCnProcBuf[7]; + const uint8_t (*lut_posBnInCnProcBuf_CNG19)[lut_numCnInCnGroups_BG1_R13[8]] = (uint8_t(*)[lut_numCnInCnGroups_BG1_R13[8]]) p_lut->posBnInCnProcBuf[8]; + int8_t* p_cnProcBuf; + uint32_t idxBn = 0; + p_cnProcBuf= &cnProcBuf[0]; + idxBn = lut_posBnInCnProcBuf_CNG3[0][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG3[0][0]); + p_cnProcBuf= &cnProcBuf[384]; + idxBn = lut_posBnInCnProcBuf_CNG3[1][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG3[1][0]); + p_cnProcBuf= &cnProcBuf[768]; + idxBn = lut_posBnInCnProcBuf_CNG3[2][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG3[2][0]); + p_cnProcBuf= &cnProcBuf[1152]; + idxBn = lut_posBnInCnProcBuf_CNG4[0][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG4[0][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG4[0][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG4[0][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG4[0][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG4[0][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG4[0][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG4[0][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG4[0][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG4[0][4]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[3072]; + idxBn = lut_posBnInCnProcBuf_CNG4[1][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG4[1][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG4[1][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG4[1][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG4[1][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG4[1][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG4[1][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG4[1][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG4[1][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG4[1][4]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[4992]; + idxBn = lut_posBnInCnProcBuf_CNG4[2][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG4[2][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG4[2][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG4[2][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG4[2][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG4[2][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG4[2][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG4[2][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG4[2][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG4[2][4]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[6912]; + idxBn = lut_posBnInCnProcBuf_CNG4[3][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG4[3][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG4[3][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG4[3][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG4[3][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG4[3][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG4[3][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG4[3][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG4[3][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG4[3][4]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[8832]; + idxBn = lut_posBnInCnProcBuf_CNG5[0][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[0][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[0][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[0][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[0][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[0][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[0][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[0][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[0][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[0][4]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[0][5]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[0][5]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[0][6]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[0][6]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[0][7]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[0][7]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[0][8]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[0][8]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[0][9]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[0][9]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[0][10]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[0][10]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[0][11]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[0][11]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[0][12]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[0][12]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[0][13]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[0][13]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[0][14]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[0][14]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[0][15]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[0][15]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[0][16]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[0][16]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[0][17]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[0][17]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[15744]; + idxBn = lut_posBnInCnProcBuf_CNG5[1][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[1][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[1][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[1][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[1][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[1][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[1][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[1][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[1][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[1][4]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[1][5]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[1][5]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[1][6]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[1][6]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[1][7]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[1][7]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[1][8]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[1][8]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[1][9]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[1][9]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[1][10]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[1][10]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[1][11]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[1][11]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[1][12]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[1][12]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[1][13]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[1][13]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[1][14]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[1][14]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[1][15]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[1][15]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[1][16]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[1][16]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[1][17]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[1][17]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[22656]; + idxBn = lut_posBnInCnProcBuf_CNG5[2][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[2][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[2][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[2][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[2][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[2][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[2][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[2][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[2][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[2][4]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[2][5]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[2][5]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[2][6]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[2][6]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[2][7]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[2][7]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[2][8]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[2][8]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[2][9]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[2][9]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[2][10]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[2][10]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[2][11]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[2][11]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[2][12]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[2][12]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[2][13]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[2][13]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[2][14]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[2][14]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[2][15]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[2][15]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[2][16]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[2][16]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[2][17]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[2][17]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[29568]; + idxBn = lut_posBnInCnProcBuf_CNG5[3][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[3][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[3][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[3][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[3][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[3][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[3][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[3][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[3][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[3][4]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[3][5]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[3][5]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[3][6]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[3][6]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[3][7]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[3][7]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[3][8]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[3][8]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[3][9]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[3][9]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[3][10]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[3][10]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[3][11]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[3][11]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[3][12]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[3][12]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[3][13]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[3][13]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[3][14]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[3][14]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[3][15]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[3][15]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[3][16]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[3][16]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[3][17]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[3][17]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[36480]; + idxBn = lut_posBnInCnProcBuf_CNG5[4][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[4][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[4][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[4][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[4][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[4][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[4][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[4][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[4][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[4][4]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[4][5]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[4][5]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[4][6]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[4][6]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[4][7]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[4][7]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[4][8]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[4][8]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[4][9]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[4][9]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[4][10]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[4][10]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[4][11]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[4][11]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[4][12]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[4][12]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[4][13]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[4][13]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[4][14]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[4][14]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[4][15]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[4][15]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[4][16]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[4][16]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG5[4][17]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG5[4][17]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[43392]; + idxBn = lut_posBnInCnProcBuf_CNG6[0][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[0][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[0][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[0][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[0][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[0][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[0][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[0][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[0][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[0][4]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[0][5]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[0][5]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[0][6]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[0][6]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[0][7]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[0][7]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[46464]; + idxBn = lut_posBnInCnProcBuf_CNG6[1][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[1][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[1][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[1][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[1][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[1][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[1][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[1][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[1][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[1][4]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[1][5]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[1][5]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[1][6]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[1][6]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[1][7]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[1][7]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[49536]; + idxBn = lut_posBnInCnProcBuf_CNG6[2][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[2][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[2][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[2][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[2][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[2][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[2][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[2][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[2][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[2][4]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[2][5]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[2][5]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[2][6]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[2][6]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[2][7]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[2][7]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[52608]; + idxBn = lut_posBnInCnProcBuf_CNG6[3][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[3][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[3][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[3][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[3][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[3][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[3][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[3][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[3][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[3][4]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[3][5]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[3][5]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[3][6]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[3][6]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[3][7]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[3][7]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[55680]; + idxBn = lut_posBnInCnProcBuf_CNG6[4][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[4][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[4][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[4][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[4][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[4][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[4][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[4][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[4][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[4][4]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[4][5]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[4][5]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[4][6]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[4][6]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[4][7]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[4][7]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[58752]; + idxBn = lut_posBnInCnProcBuf_CNG6[5][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[5][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[5][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[5][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[5][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[5][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[5][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[5][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[5][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[5][4]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[5][5]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[5][5]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[5][6]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[5][6]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG6[5][7]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG6[5][7]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[61824]; + idxBn = lut_posBnInCnProcBuf_CNG7[0][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[0][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[0][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[0][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[0][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[0][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[0][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[0][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[0][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[0][4]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[63744]; + idxBn = lut_posBnInCnProcBuf_CNG7[1][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[1][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[1][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[1][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[1][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[1][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[1][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[1][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[1][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[1][4]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[65664]; + idxBn = lut_posBnInCnProcBuf_CNG7[2][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[2][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[2][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[2][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[2][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[2][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[2][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[2][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[2][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[2][4]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[67584]; + idxBn = lut_posBnInCnProcBuf_CNG7[3][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[3][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[3][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[3][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[3][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[3][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[3][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[3][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[3][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[3][4]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[69504]; + idxBn = lut_posBnInCnProcBuf_CNG7[4][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[4][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[4][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[4][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[4][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[4][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[4][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[4][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[4][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[4][4]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[71424]; + idxBn = lut_posBnInCnProcBuf_CNG7[5][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[5][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[5][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[5][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[5][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[5][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[5][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[5][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[5][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[5][4]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[73344]; + idxBn = lut_posBnInCnProcBuf_CNG7[6][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[6][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[6][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[6][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[6][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[6][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[6][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[6][3]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG7[6][4]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG7[6][4]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[75264]; + idxBn = lut_posBnInCnProcBuf_CNG8[0][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG8[0][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG8[0][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG8[0][1]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[76032]; + idxBn = lut_posBnInCnProcBuf_CNG8[1][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG8[1][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG8[1][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG8[1][1]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[76800]; + idxBn = lut_posBnInCnProcBuf_CNG8[2][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG8[2][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG8[2][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG8[2][1]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[77568]; + idxBn = lut_posBnInCnProcBuf_CNG8[3][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG8[3][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG8[3][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG8[3][1]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[78336]; + idxBn = lut_posBnInCnProcBuf_CNG8[4][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG8[4][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG8[4][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG8[4][1]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[79104]; + idxBn = lut_posBnInCnProcBuf_CNG8[5][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG8[5][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG8[5][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG8[5][1]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[79872]; + idxBn = lut_posBnInCnProcBuf_CNG8[6][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG8[6][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG8[6][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG8[6][1]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[80640]; + idxBn = lut_posBnInCnProcBuf_CNG8[7][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG8[7][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG8[7][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG8[7][1]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[81408]; + idxBn = lut_posBnInCnProcBuf_CNG9[0][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG9[0][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG9[0][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG9[0][1]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[82176]; + idxBn = lut_posBnInCnProcBuf_CNG9[1][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG9[1][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG9[1][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG9[1][1]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[82944]; + idxBn = lut_posBnInCnProcBuf_CNG9[2][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG9[2][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG9[2][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG9[2][1]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[83712]; + idxBn = lut_posBnInCnProcBuf_CNG9[3][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG9[3][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG9[3][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG9[3][1]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[84480]; + idxBn = lut_posBnInCnProcBuf_CNG9[4][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG9[4][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG9[4][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG9[4][1]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[85248]; + idxBn = lut_posBnInCnProcBuf_CNG9[5][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG9[5][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG9[5][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG9[5][1]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[86016]; + idxBn = lut_posBnInCnProcBuf_CNG9[6][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG9[6][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG9[6][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG9[6][1]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[86784]; + idxBn = lut_posBnInCnProcBuf_CNG9[7][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG9[7][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG9[7][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG9[7][1]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[87552]; + idxBn = lut_posBnInCnProcBuf_CNG9[8][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG9[8][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG9[8][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG9[8][1]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[88320]; + idxBn = lut_posBnInCnProcBuf_CNG10[0][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG10[0][0]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[88704]; + idxBn = lut_posBnInCnProcBuf_CNG10[1][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG10[1][0]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[89088]; + idxBn = lut_posBnInCnProcBuf_CNG10[2][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG10[2][0]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[89472]; + idxBn = lut_posBnInCnProcBuf_CNG10[3][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG10[3][0]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[89856]; + idxBn = lut_posBnInCnProcBuf_CNG10[4][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG10[4][0]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[90240]; + idxBn = lut_posBnInCnProcBuf_CNG10[5][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG10[5][0]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[90624]; + idxBn = lut_posBnInCnProcBuf_CNG10[6][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG10[6][0]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[91008]; + idxBn = lut_posBnInCnProcBuf_CNG10[7][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG10[7][0]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[91392]; + idxBn = lut_posBnInCnProcBuf_CNG10[8][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG10[8][0]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[91776]; + idxBn = lut_posBnInCnProcBuf_CNG10[9][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG10[9][0]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[92160]; + idxBn = lut_posBnInCnProcBuf_CNG19[0][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[0][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[0][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[0][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[0][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[0][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[0][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[0][3]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[93696]; + idxBn = lut_posBnInCnProcBuf_CNG19[1][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[1][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[1][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[1][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[1][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[1][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[1][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[1][3]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[95232]; + idxBn = lut_posBnInCnProcBuf_CNG19[2][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[2][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[2][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[2][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[2][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[2][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[2][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[2][3]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[96768]; + idxBn = lut_posBnInCnProcBuf_CNG19[3][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[3][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[3][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[3][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[3][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[3][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[3][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[3][3]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[98304]; + idxBn = lut_posBnInCnProcBuf_CNG19[4][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[4][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[4][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[4][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[4][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[4][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[4][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[4][3]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[99840]; + idxBn = lut_posBnInCnProcBuf_CNG19[5][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[5][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[5][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[5][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[5][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[5][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[5][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[5][3]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[101376]; + idxBn = lut_posBnInCnProcBuf_CNG19[6][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[6][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[6][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[6][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[6][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[6][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[6][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[6][3]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[102912]; + idxBn = lut_posBnInCnProcBuf_CNG19[7][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[7][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[7][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[7][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[7][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[7][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[7][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[7][3]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[104448]; + idxBn = lut_posBnInCnProcBuf_CNG19[8][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[8][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[8][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[8][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[8][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[8][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[8][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[8][3]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[105984]; + idxBn = lut_posBnInCnProcBuf_CNG19[9][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[9][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[9][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[9][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[9][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[9][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[9][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[9][3]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[107520]; + idxBn = lut_posBnInCnProcBuf_CNG19[10][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[10][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[10][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[10][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[10][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[10][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[10][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[10][3]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[109056]; + idxBn = lut_posBnInCnProcBuf_CNG19[11][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[11][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[11][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[11][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[11][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[11][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[11][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[11][3]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[110592]; + idxBn = lut_posBnInCnProcBuf_CNG19[12][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[12][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[12][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[12][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[12][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[12][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[12][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[12][3]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[112128]; + idxBn = lut_posBnInCnProcBuf_CNG19[13][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[13][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[13][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[13][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[13][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[13][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[13][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[13][3]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[113664]; + idxBn = lut_posBnInCnProcBuf_CNG19[14][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[14][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[14][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[14][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[14][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[14][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[14][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[14][3]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[115200]; + idxBn = lut_posBnInCnProcBuf_CNG19[15][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[15][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[15][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[15][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[15][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[15][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[15][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[15][3]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[116736]; + idxBn = lut_posBnInCnProcBuf_CNG19[16][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[16][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[16][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[16][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[16][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[16][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[16][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[16][3]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[118272]; + idxBn = lut_posBnInCnProcBuf_CNG19[17][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[17][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[17][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[17][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[17][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[17][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[17][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[17][3]); + p_cnProcBuf += Z; + p_cnProcBuf= &cnProcBuf[119808]; + idxBn = lut_posBnInCnProcBuf_CNG19[18][0]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[18][0]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[18][1]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[18][1]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[18][2]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[18][2]); + p_cnProcBuf += Z; + idxBn = lut_posBnInCnProcBuf_CNG19[18][3]*Z; + nrLDPC_circ_memcpy1(p_cnProcBuf, &llr[idxBn], Z, lut_circShift_CNG19[18][3]); + p_cnProcBuf += Z; +}