/*============================================================================== * nrLDPC_bnProc.h * * Defines the functions for bit node processing * * Author: Sebastian Wagner * Date: 17-11-2017 * ===============================================================================*/ #ifndef __NR_LDPC_BNPROC__H__ #define __NR_LDPC_BNPROC__H__ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, uint16_t Z) { const uint8_t* lut_numBnInBnGroups = p_lut->numBnInBnGroups; const uint32_t* lut_startAddrBnGroups = p_lut->startAddrBnGroups; const uint16_t* lut_startAddrBnGroupsLlr = p_lut->startAddrBnGroupsLlr; __m128i* p_bnProcBuf; __m256i* p_bnProcBufRes; __m128i* p_llrProcBuf; __m256i* p_llrProcBuf256; __m256i* p_llrRes; // Number of BNs in Groups uint32_t M; //uint32_t M32rem; uint32_t i,j; uint32_t k; // Offset to each bit within a group in terms of 32 Byte uint32_t cnOffsetInGroup; uint8_t idxBnGroup = 0; __m256i ymm0, ymm1, ymmRes0, ymmRes1; // ===================================================================== // Process group with 1 CN // There is always a BN group with 1 CN // Number of groups of 32 BNs for parallel processing M = (lut_numBnInBnGroups[0]*Z + 31)>>5; p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrProcBuf256 = (__m256i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 2 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 3 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 4 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 5 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 6 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 7 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 8 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 9 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 10 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 11 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 12 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 13 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 14 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 15 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 16 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 16 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 18 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 19 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 20 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 21 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 22 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 23 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 24 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 25 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 26 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 27 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 28 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 29 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; i 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)>>4; // Set pointers to start of group 30 p_bnProcBuf = (__m128i*) &bnProcBuf [lut_startAddrBnGroups [idxBnGroup]]; p_llrProcBuf = (__m128i*) &llrProcBuf [lut_startAddrBnGroupsLlr[idxBnGroup]]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0,j=0; inumBnInBnGroups; const uint32_t* lut_startAddrBnGroups = p_lut->startAddrBnGroups; const uint16_t* lut_startAddrBnGroupsLlr = p_lut->startAddrBnGroupsLlr; __m256i* p_bnProcBuf; __m256i* p_bnProcBufRes; __m256i* p_llrRes; __m256i* p_res; // Number of BNs in Groups 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; // ===================================================================== // Process group with 1 CN // Already done in bnProcBufPc // ===================================================================== // Process group with 2 CNs 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 2 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<2; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes[lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 3 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<3; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes[lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[3]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 4 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<4; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes[lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[4]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 5 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<5; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[5]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 6 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<6; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes[lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[6]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 7 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<7; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[7]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 8 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<8; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[8]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 9 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<9; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[9]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 10 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<10; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[10]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 10 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<11; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[11]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 12 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<12; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[12]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 13 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<13; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[13]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 14 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<14; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[14]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 15 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<15; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[15]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 16 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<16; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[16]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 17 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<17; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[17]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 18 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<18; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[18]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 19 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<19; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[19]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 20 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<20; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[20]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 21 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<21; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[21]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 22 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<22; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[22]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 23 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<23; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[23]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 24 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<24; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[24]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 25 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<25; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[25]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 26 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<26; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[26]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 27 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<27; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[27]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 28 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<28; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[28]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 29 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<29; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i 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 32 Byte cnOffsetInGroup = (lut_numBnInBnGroups[29]*NR_LDPC_ZMAX)>>5; // Set pointers to start of group 30 p_bnProcBuf = (__m256i*) &bnProcBuf [lut_startAddrBnGroups[idxBnGroup]]; p_bnProcBufRes = (__m256i*) &bnProcBufRes[lut_startAddrBnGroups[idxBnGroup]]; // Loop over CNs for (k=0; k<30; k++) { p_res = &p_bnProcBufRes[k*cnOffsetInGroup]; p_llrRes = (__m256i*) &llrRes [lut_startAddrBnGroupsLlr[idxBnGroup]]; // Loop over BNs for (i=0; i>5; uint32_t Mr = numLLR&31; const __m256i* p_zeros = (__m256i*) zeros256_epi8; const __m256i* p_ones = (__m256i*) ones256_epi8; for (i=0; i 0) { // Remaining LLRs that do not fit in multiples of 32 bytes p_llrOut8 = (int8_t*) p_llrOut; p_out8 = (int8_t*) p_out; for (i=0; i>5; uint32_t Mr = numLLR&31; const __m256i* p_zeros = (__m256i*) zeros256_epi8; for (i=0; i 0) { // Remaining LLRs that do not fit in multiples of 32 bytes p_llrOut8 = (int8_t*) p_llrOut; for (i=0; illr2CnProcBuf; const uint8_t* lut_numEdgesPerBn = p_lut->numEdgesPerBn; uint32_t idxLut = 0; uint32_t idxCnProcBuf = 0; uint8_t numEdges; uint32_t i; uint32_t j; uint32_t k; uint8_t startColParity = NR_LDPC_START_COL_PARITY_BG1; uint32_t colG1; uint16_t bnSum[16] __attribute__ ((aligned(32))) = {0}; uint16_t llrTmp[16] __attribute__ ((aligned(32))) = {0}; __m256i* p_bnSum256 = (__m256i*) &bnSum[0]; __m256i* p_llrOut256 = (__m256i*) &llrTmp[0]; if (BG == 2) { startColParity = NR_LDPC_START_COL_PARITY_BG2; } colG1 = startColParity*Z; // BNs connected to more than 1 CN for (k=0; kllr2CnProcBuf; const uint8_t* lut_numEdgesPerBn = p_lut->numEdgesPerBn; uint32_t idxLut = 0; uint32_t idxCnProcBuf = 0; uint8_t numEdges; uint32_t i; uint32_t j; uint32_t k; uint8_t startColParity = NR_LDPC_START_COL_PARITY_BG1; uint32_t colG1; if (BG == 2) { startColParity = NR_LDPC_START_COL_PARITY_BG2; } colG1 = startColParity*Z; // BNs connected to more than 1 CN for (k=0; k