From c8a787d22c11a340953142d15fcab194d7f49593 Mon Sep 17 00:00:00 2001 From: Sy <mody.sy@eurecom.fr> Date: Fri, 3 Jul 2020 14:21:00 +0200 Subject: [PATCH] optimized 5G NR LDPC decoder --- .../generator_bnProc/bnProcPc_gen_BG1_avx2.c | 4 +- .../generator_bnProc/bnProcPc_gen_BG1_avx2.o | Bin 0 -> 67136 bytes .../generator_bnProc/bnProcPc_gen_BG2_avx2.o | Bin 0 -> 68416 bytes .../generator_bnProc/bnProc_gen_BG1_avx2.o | Bin 0 -> 43488 bytes .../generator_bnProc/bnProc_gen_BG2_avx2.o | Bin 0 -> 43688 bytes .../generator_bnProc/bnProc_gen_avx2 | Bin 119536 -> 119560 bytes .../nrLDPC_tools/generator_bnProc/main.o | Bin 0 -> 3704 bytes .../generator_bnProc/sauvegarde.tar.gz | Bin 0 -> 9262 bytes .../bnProcPc_gen_BG1_avx512.c | 1768 ++++++++++++++++ .../bnProcPc_gen_BG2_avx512.c | 1770 +++++++++++++++++ .../generator_bnProc_avx512/bnProc_gen_avx512 | Bin 57368 -> 119632 bytes .../generator_bnProc_avx512/main.c | 8 +- .../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 | 14 - .../bnProcPc/nrLDPC_bnProcPc_BG1_R23_AVX2.h | 14 - .../bnProcPc/nrLDPC_bnProcPc_BG1_R89_AVX2.h | 14 - .../nrLDPC_bnProcPc_BG1_R13_AVX512.h | 743 +++++++ .../nrLDPC_bnProcPc_BG1_R23_AVX512.h | 293 +++ .../nrLDPC_bnProcPc_BG1_R89_AVX512.h | 147 ++ .../nrLDPC_bnProcPc_BG2_R13_AVX512.h | 441 ++++ .../nrLDPC_bnProcPc_BG2_R15_AVX512.h | 751 +++++++ .../nrLDPC_bnProcPc_BG2_R23_AVX512.h | 181 ++ 24 files changed, 7492 insertions(+), 48 deletions(-) create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.o create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG2_avx2.o create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG1_avx2.o create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG2_avx2.o create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/main.o create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/sauvegarde.tar.gz create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG1_avx512.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG2_avx512.c 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/bn_avx512/nrLDPC_bnProcPc_BG1_R13_AVX512.h create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG1_R23_AVX512.h create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG1_R89_AVX512.h create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG2_R13_AVX512.h create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG2_R15_AVX512.h create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG2_R23_AVX512.h diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.c index feb0fa70893..fd015580495 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.c @@ -71,7 +71,7 @@ fprintf(fd, "// Process group with 1 CNs \n"); // Process group with 2 CNs - +/* if (lut_numBnInBnGroups[0] > 0) { // If elements in group move to next address @@ -123,7 +123,7 @@ fprintf(fd, "// Process group with 1 CNs \n"); } // ===================================================================== // Process group with 2 CNs - +*/ fprintf(fd, "// Process group with 2 CNs \n"); diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.o b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.o new file mode 100644 index 0000000000000000000000000000000000000000..8caf4b85a31f5704239e0d6aa2071be5529f93a2 GIT binary patch literal 67136 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 literal 0 HcmV?d00001 diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG2_avx2.o b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG2_avx2.o new file mode 100644 index 0000000000000000000000000000000000000000..2f6a08ea358ebdad5d329ffe676e4f502c3abf58 GIT binary patch literal 68416 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 literal 0 HcmV?d00001 diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG1_avx2.o b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG1_avx2.o new file mode 100644 index 0000000000000000000000000000000000000000..d40fd0a3af91fdbdb82afdac3ac2f5500eec1dc6 GIT binary patch literal 43488 zcmeI5eS8$vxyNUAvzrZhh43n%tGqOT<c*gG5sY9oC@7+|D5aZ_Y+g#TiP;2$6kSWP zpyDTJ?X|T^&{l1&Ew)urt2fr7R$DLL`a*AOFBa&>m+QS?Z@pNn+~=9|Jjt17=j?`Z zKcD__b96Ive&;*Sob&u<W@l%1hwG}Ap6|15i;Hb7v<7OdT2}9O2IecB*-C4aHPTvH zz3p)I_5aZe(zd5sjvqf>{e0DKY=`L{n)cyzv(svIXQ>(AwG(dIg8a7U{u!Gc_HCSV z{;0O<JF0KGeDCh+?OWP`d>UJ;w>>|AiUw!N>TOl~t2b}jZ*}E6flV=Qs@k6%kUH6Q z3iSS%v%2T2j?mNz^j=IMb_(Po8es~g$T0S5=oO4`pwG`$9ki7A%oC?UN1jG+2FArr zXPBENn489#o5q@(CVDm<tKQsa=RazFwJ-mxS3)QAAFVnF%GRob&_`~}e{>)AI63cb zX4^iy&))aUfy`%)1-4bailM5vkK6+5#atYzw)fps;2q}#(C4cTVZe9pg+Dh{9m@Yv z)vMcno-!(~{B2ly{$p1DW9ET?fzLb<hN!};G%LYX<C4DQB{x?cvNvx!War;-8SY>N zntkx4@&Oyu`9RE&5AMB<eDDp{2Y)IburZwv#0>f1>4Sf;K4hfw0UOi#K+KR2o<3v@ z)`vhUAFwf<55x@l;ORqPus#G+`GAe-d?04X2Tvb@gY_XZl@HjM&Ie+KeDL%kbFe;y zQu%<5>3kq&$Olg!LT(>UO+LYeQ(F9pkd?{@Y)t0^F+)Ch`j9nPABLs!0UOi#K+KR2 zo<0m4tPk0#e89$ZJ`gkHgQpMKgY_XNl@HjM&Ie+KeDL%kXRtoxrt$$B)A>NmkPn_d z<PO${yi`75V>%y*8S=r?hrGf1ke|v2Y)t0^F+)Ch`j9_Z9|}_WfQ{*VAZEx1Pag^f z>%;I=K44=yABY+9!PAG~gY{uVDj%>hoe#te`QYiph{5_$n92uiOy>hJLq2%=P&im0 zMyB!s8`Jqf%#aVBK8zf!52I4~fQ{*VAZEx1Paj6PeenLe0$%4EoyrGnOy>hJLq2%= zFxu^d`FiV^R6by1Iv<D`^1;)GF@yDCY$_kHF`W;@4Ef;c!`Q+4FfNr3*qF`-VupP1 z^kLj!eK;kR57?N_2V#bN@bux7!TK;hl@HjM&Ie+KeDL&P{9t{Ukje*aOy>hJLq2%= zFk!GhOibkiHm37|m?0lLeVFL>!Q+dt>Z`Bn>(Re_7QRQIN+QFu67Uu1#P{HJ6tt-j ze<8fCfL9Z)OO)|YzYW;e6`#nmEq_KJm>J3%R%i!CgaSUFoq@~wc?JW(S}g0-37Oeh z8KIm|X3nsj>|vS1hUI34vU38#AhudoPIg8h0Ko$OAQbo;2twqb-;cwA63Fm-6`#+C zJqQg8j?99UTA@t*Yg?d?9y2Tu$ji(PhO!E>a`Fm%85zM~2!iJZGJ^r1-=E?92Ytr) z(=E%keHnfmR55ZJzu2E;2mF~KB(*R7W0i{SALZRZ?Neb2zZbB55Dh@J3T=rI&}TcK zg#LC84pYBB;D=>TtegXQ6?nB2USEXQR(SmYv?t*8A<Tcqwi0a+bThmjI?>?iyOPL- zbrb;i8F<Zu`Br#60`t$QWfQQ<#4wm|hF6=?w7=&hDy>D(|BDirSeII#PpnSVT6Kwf zjYv5QYtK)Nw#Fx>B+9H=uqN9ICZ;%j;pL!DRyDjXh1S*ZYJ}HU;I#u@`2F_B;Poqb z;Wyp`e@A|Bf5DHDuyH{j91onacELP)aTl~{C4u`R<jk53uetC7?^2X`*4c>#7Gx>0 z*s4mLZ&fFjK(4@RLm8i#kT}gcJyB#$Pt34pCW>Kg8CDiJG|Ix?Ew~D7q$!IF_NZK! zrlbr$h(?c9o{*HLduf}?W?AL4tcrQol9rZeV{J=#MR-a*Y|F*PB`x*sb&<wsEYi^2 z5{;LvjV<qJt1F3hEIn`e;)tq67F|#lSurIZIrnp`%8Q$<tF6Vgu~=JYxUM5w+Zhd8 zR=l&ev$-zZ9BXNgMZ@dcn(M>n2u01Y&WcFq^stJ)sH@@3BxOZ3er6crDX^ub!x6eb zD4QGU3||?Z7T!3_s$JXG(b*hpJTu(v9#@!3B+^<wXKwTKa61hJRyIF8%u3Y`Yce3J z8-~UX_hQ)9S>@2xWzacXq@*N_nT^Kd;l_@(uJ-WN&7Do*^6=t|<Jh5P;RWHMDfQE@ z49^J9Dx0=&;hg#45B5{*y3=jocv#cIQ~Ps>ZL6o$uffGEnAaAA5n-!gLDky7sIy%n z&ZRv9LxY8<x+A(4U>2wC5tS#gJ`xA|h%3^UYiR2T7d0;^o!@-+viZ$3W;hNzy>W9+ ze^xiIf%uVDv^Ns(S{si<+nXzjc-_!^rk(-lEabI$%{0i)CX*Ml*bCJwPe;66oJ~u5 zx6Vn~IyYtOXH<q->o>t&l_Sj+K=%VQ4Q))6QG3DL!Y^)XsS`wR7f7?VLMPJ7>?- z&iOO7_h-;MKjmriSDq$+<!SPFb~z`|u>LgpD^HWZ@-+D?Pm{m$H2Et}lfPM<zjL$b zyxR&n=PgMmFB{?ApNn$>?3-Kxb-(SLkNbTAY|O|Az(LpYhn$+iN+S;DoC+(Y>?%}z znYe^fW^G0#!%_SpHKD*Nls^Mbb%^%AdLz=I0VU(+W!#vt9cL*<AQTM2shJfF9fZG` zIP0u0Q2J+>b$YZv_+ck#FnYlL=X{)~`M<pZvmrJA3C<U&`A>0vteQWL^YGRIC1}}L zDN+^Nsg$aU?Xir=YJs!G7ARI5tRsVrBOOsBF+RkG|KKo@INCENZnRGL&J*Tx>V ztIBYv(y1zi_8w^IR+TX}W;~%PV{P>9E2=Wi-UHD#tI9<C1*mLQm8mv<?(0#N68kl% z+@UI^PNi2>%ACprs#5M$cB{%P`#xA^kE+aZ`qrl^pS53x_58xhhIT7>r{lxe;4U1b z%IiHiOY`^QaLI@JakK?s=SI+iAv7@uO~r2Kz6>*{qMeTV2UZJtdkBW!11+=L;XcIK z%bi)<53>z0n+Gq;&cVM}c$>Gs{X-z~S3nc?z`x`7*W#xX%g#gHzoYj$RUP%TQ$29) z@P>NJ9`iEPd^@UDTlfg9&$pvV)lNU`)M`}ijE|k#s^RM_dja;&x8riva*nE<r)rhh zUEhw&teiJt23O{c+NZ{gt8?mQkcGDa$iamVu^NKRLCO5mN1$ZEOO?!5Vb&q@V25&+ z4-nZh2^5X|6iMtt1(O`JeVLmqf~s0uN295w^LkUu`a6?bob~Po-Ra>tioRj5o9u<E zTJOexH??f~D7nRno(Bgl*Z8lW1d2ZX{^*+*m|C`c-qiB7tCCxs_1*xwv))|l`;B+H z$@NfGqq_MKQ_C&?lHB4%KLolHeImv9`bTc^Rj8`y-zW^a#yik*$4pbpT^E>IcGj9& zc5O^<akju7&|Q7K@4Id?0ab^5g2_zk`vd>tCcn?*Atp13{QgI7@>L`oV5`o9_Z`>T zADRS;?mv?iO!C@)w9HKwLDh-5mPuaw!&ke>6-eTKdNY%wsh^MRa+6<X@=+$Uh<xlN zH+dgam7|XzcDFctFpl-F9D~>PvwS!VYh!&E0A~b~L3gskYkPX0n;Z#MhrF0cK7RDo zxygk{&V;phGkF^I^V#igvI(kc1bgo{wLJe!a*GrFb<mw2pF=TTe9uij2UQjQR{?m# z(MCPc^73iPEhC`oR%p`s@VC&Jo%}FN1{SyM;r5ig!fb!u_`Kovh|Gd9aI_w6`SZ@o zo}ax07V%HEva=ULJDe%eEOaH14=TKK;RLD7sTNK`g|<I0I~$j^p_-N3AE*N8VN?w) zDa2|vuLd$~+e->@iQLm6P6;&T72D^GQ@!}iIP6&E*l#Qvhe&<^-WpZ!d}ARgv-{V9 z)!|UpT1O1Do-^)jc&0_6F5m*znec+QGAJ-Et?(PECONaW0OqqkfO*^gI4>8kbmEC8 zyzG*$ct=TdtgfZ2K599Ymgco3jdgV;-4$~qb7#-&h}JjNcFu&$9bMfevx_T==eTiN zwq$K{XB@Ax6c?+%FoXYJe#s?EFS9JVyn<I>7QrQ!+V$P##dX-XcxOGF%EF}<=nTx) zM;l-s#@4x^JsO8ucrQexO%c#Ho>f;}>Z5gS_0f(9EQd6_b96ShMkB4!TCBn$7aUcY zf;oSV9V!g1w|p7CU=RGYdxD`K`=%C#y08-L48H4|H0HL=n|Iy1d2=tm{8_#t`{K|} z^`AdCba$vXRJO}Ed35M0-;6@vj8PctXZR=d2L2@_w9}FH<6r;Pp}S#f2QLizN8TN} z$60<9Ek6>8!7o4JB$pp9mp{S&7oOzuN&P>;^`GqWCp-R=T^{<cwjcKY1ji5S-{snV zPH_2?&EG%T|9|xQPd0!52iuSP_;G^%!|~@kC$s(hKimF(>m0w=r#OC}VE#{b`#IU= z3r_O*eX`qc-rb>{PvU)GyQQl$66<PR6k8Ho6uSWL62#%epggjoY>rjm*0r`JYDJb@ z5;=d#(kcsCxb4!>d2W4u2h&SiI@HY?xZy*=s_Gk~@#RrKDAX(qPA%a6i`81&y>#h{ zIc4R}wR5YvzMH~0D~Z>xk4B=gdMn-pH(Bsjj1_ObCJM{p1W!b)NLxcgJle@?S`6J@ z?CLh$bMow_>Z7UES^d==&7ILmduN9gX=tf!j9U?0+uYf(eoVpIu7=3k+Bo!~rLAtA zbxpLREsnPW@GgKAX|3&87ww2!b?se|hK}e}kqfG?G4=%0Ywo8?KHkm2lzAHjH^*o! zV4lpkX_U$;2oFF*OIvNHH3(aQ#nG$rSuJg`#<24T-SO_5$LKVV%G_DeTFUi!nhs-y zY(?t2IwEy#EnTfK=7jse!R<y*_xnc<fgI!dH^DUc94pe^23rDTKy4n*7SI)oH#f$j z_2IgvTG(3RuxY@S*;3D2r}s&ANmE;Ev?RWvgwB=uj%R0ETT8qI&d8%3wViDpblcE- zAZmvKPugP9fvt~xNX`cgSMTY7d;KFo8~MheRTsO&*}ayiUCMG%$#+)=x{P;eArH9Q zVlLEf-oJBrcTa65m|3``Tkq`m1nLJPE7BF~ibw0qt%g`_t2!7tJnpB&yS9I|74Qy= zM-z{z{b_Uz<a@ko>&A?L5z#mv2x8H0*!v^xwe@9c0>i`_Y>zmZttNB4&4R6tS1!AV z#yAH#SBf2f+=@CpyB1f+2OL$>!B`#TU@sWhV6_Y+Zy&gG<4yQj8|+_AwaqaY4;=IO zh*w*;t_yC#;z93%i&ushhn<g|;qub5Ii+*qPEpYc*axa>JC#0j*1T!qnXUMd5+<Ep zvFHM43xT`zpmx+XEr3t5Gw03@&uk3OgwK)->gGX5okJ~TwG}=-I^A~Mb=FD7iEgJI zJ{~OAch<sN7w?a_v-I!rZSC!_v0-z)vp(ltM_-@5`SmAM+laJ7Q;NRyzc11;Ngk)w z5gdKOx06%{dKiy&!Q#bdg^R$1Y3V({&)OC|K~)v|8n}$#U0{#T$qe<tXM22XC%&*a zmnqK8E4ab8I5+5DUkr$9@c4_@DKf01$32?h+5omD7e8J#@F;$~KHyRO>Oz651+FPU zbmszsqfe&RGSW+_j+bMwTm&!VtDPELb)ab@>6Z$9GwD|feJAP8#Sxh2I8Tz^PW&k} z#T!Pr-X5X<7wNl&4qpv)_!misYpqV1Li#?TpG!J?wa_WduOa>SLf=68A4zv^^}zgX zq#qGFe!UI*|EbWQC%pisSn%swSPqh2D)i%|FBkfFxcY<f+lBsF(tCt{8R@%)-bVTX z(z{i6tnH-Nz!Xc^`D<AZlAa))_lsYW-b?z~#J@}W0n!Ud&xTDI`;WJ^usFB&V0tF$ zys3Y|X|=2iNw0w^mLfH=nn>><owwT?Nbe)PnE3liKSDb9{{_<3jbgYAO8h&dhiMlJ zll~#;l|skmaa=V*FC;xddL_ldxXAYjy_j@patiZU@x$$6ui_V%O_}lc?`^E8sbAef zb&F8*Tll5G<l?vTlSNSc>T-Ben_t}!b?FOWT*Ivoj)zI*BjkmkkAO^Y;Y+?-K<90S z+i<$hpkHOsHyHHm4Ek3M`ppLYHiK@sLhL%-(B1+6-qU&S_jYxvZ)}6p6=R$EZ5G}? zX(`uflzIa;v<yVUvjJ_q1Mm3ohHgAF@owwyNAhw5BXjl9wYH>|{&=!wAX@Ud%s@7h z+fps(&Io_{S0~bNt$^|<Vq*XMdzsuu>oc6j(vpVO)XP$Dla}p2D>DV}2Tbw%0n;j6 zDM{)8wW_2TT2rrjV4Fx<T=i`r>1F^{;rayWzM3IEzqwAI-5;OD1s&JbkF*~co$u0G z@%9e*$kkvqw6#ZLR(luRy=q{ouB8n=do(y7z3E^&il%U%&v~n<r1u+qYB?6x7n43k z$^H8Iq@PDRzK^4{g!GF^$G7<kc>N8YjE)8FojC<{{8~KgElPII2Qb7cinD=q<j;Z^ z^IJ&g_1;4Kc8#B}@%$Bd=6i_0N8|C_h2!6^>3Tn(BAw&(Qk)kxet{O}ccgPZ3+S!x zpwJJH{+`hJyo%2!IZi3@L7K8&gNcHYCv-j!J6-6@sXk5U35ruDbUtsZB%SjxhE7c` zBpnymegB-MFN8ME^J-1k^V}ukms0#|G#-C;!f|>8znu8n4g7<Gj}yP!z&|H={LTrM zmkj({g2ykGVEL1Q|C`{SCEg|<aH5ZQ4(Xi#w}@Y)@%nbSN$|&rztO-yAox=FVh5H- z4E%2d-%dPlci61==TpJ=5|5t`ut@%N(s{i5iJz+RdVVSd&!@;$8n5?fwcwZ132KeT z>+!!T_)Cc2X5gO^d@J!UYP{Z`0GwB1;qkIxBS@F|DHS~Xh3DN^B)?kl>{pY4zd`Wq z7oPum#s8k**{>gJyq-_~9K_>gzkaRpdVUUy`0Ur)8n4ICq2n~i-$wZ#PCDjC=c@$I zeyz}Wy+7Lp&whQ&!0!<}`?c4=9~3<Mb;Q8u(f-ZjWxvLgF1Lp=!Lwg;HD1q8wcy#W zl^U<-XPw~LuXc^s<9}W7_<b%c-!$;Q7Cig)ZyK-nXA~VjI6v&y8KlenR0^K`!f)_l zk^DNrvtQi?{u_d4zwR~gj|-mtdRpW4eC`uG`}L;A>-qV!;MuQZ8n4HnK>lz(_fq|I zn#%oarQq4GwHmMY=PtpsU*9+IF9@Ffdd<N9S@7%^UqX@oo=O)odA#h`4ALc!Ka{}2 zJo|ON#_Rc9C3yBLs_}Y$HVU5oN@%<u|2u*|NaO#Wfqzr*?AN;*ulHvP4pbX2`&CZ5 z%#Zp3!$5x6uQdi9enaSr&wi<&AtdjQ_X(c;`iUX_F9pwjy{z$iJ`V_<{d!;H_5Aqp zgdGYt;~|{=3Xv}Nmoo)#Q{KxAd{pr4SBJ*y{dq|6?AH?pe!t+^ufqo3PZw5syzEy2 z>2iB07Ciek-@sogc=qda8n64+BzX3#OXKzY+$4DRt4HJY_&*gqelHly;|BhH!Lwg~ z)p)%>bLdhn=ac<fM7qppjo{g@Rs(;N;MuP`4E&>lXTP2`@V^y2`}GHn*YkNq@a)$o z8n5T4kZ#m)e%P<Eq|5#5Y{6HOU*{V5F2S>3U(tBIKTips{d&>Bzb$z7>n{erkS@{l zc-gNo>2iBmD0uekA_HG5c=oG7<8{Bf1<!tM(Re*ScM6{U>eYBX{x1YyLw^0zz<(lm z_G=j3WRUr(BAxTeeyuR@?Sf~&HW~Ok1<!sxVBnt<Jp1(<1OJZT*{}c9cs-wRbH*t= zUiK@ObeW$?f@i;qG+vLtRPcOWa;bseB6#-eR*l!UpI-}}{rWcpe@yV~SHStTM)LW? zB+@xQ>{qFQzgY0>*J=ZQmEhU0^%}3|bF1LluiG_V&(DK`XTNr9ydM8m!S~Ys^;-j< z3qK3N!uespP9a@xKPv^#eyug|3Bj{p+YS7Kf@i<>82Hx(&wd>=@E-}D{rXhn^?Vl4 z4QI{|`!$htnV(sLXTK^mUXT9;!S|70wFdrn!LwiYXuQ7tyeWA0>s<pMq8ki6UiNDg z=}F@iJo{B?;J+w%_G_Jizh3a{*9{u4=kpH1vtQrUcs)N)3ZDJy(|A4pA;BLYzuqzM z6GwaRU(-pK`HTvl{pv9AJ%VSy?lSOC3ZDIX!NC7X@a)&04SW`UVF?OvKkQc?={R0J zpJBnXUo$mc_iM4>*{^Di*W<Sc-su?h;VJ|FUBUDI^<$0K`}4lw*{{DE__6eb7tRm+ zHHCD!JuDVH`?cJ_#{|!QZ8Y#Z1kZkbL*w;)J|KAZ>k*CD^YfD6*{^*XugCvy!G|$X zP(Cv7GsmfR&L{hI7U?pdU4m!7zGC2e1<!sxWZ+*CJo~lZz<(%s_RCLStdsp8M>>y} z{W?|S^?a5Jp8Z;&@w#7^37-90rSW?FFAKhs{JP%2KO%Vc>*pG;_vaJAvtPsT*=bN@ zeu_xv{IFkh4E$w+XTNF;{I!B-ziu+{y9CdE-KX(-KKBTo{o1SXdVYQ<c=qdn#_RDj zCaAn|erm|CEYdNbI=?{h?AL`FulHw*;MuQR4g7AwvtLgc_}>Yh{d(KL2PeA6%YGG- zF1Md)f@i;qHD1q8rQq4GWg5Q#y1@6l>jck!HEFya|7O7_$gdp+ey`x!uYc9}1zLY{ z=?ksAJ+NP=kS_C6A$azy%D~qNp8aY!@V5w_{kqe@KP-6m>rsu@^ZA0{*{|0$UeC{a zf@i;uXuKYO<Y{7iBfrLxF88lxf@i<3)Ofu=w+o*Ay2rrx37-A>wSj+6@a)$y13x+} z#!L5^CXp_;pLv33zZPozIS`Wfm*s+Izt(8Ho}akj*{^Pm*W-U%@O|XhE(8CX;MuP~ zYP{Z`iKkmmk^9$l(q(?C1<!u1H1Ki3vtJ1Vf4AUy|9a5CKO=bd>p6|r^SNK}?AKw9 z*YoqS;Mp(h43#&`j~;(A>7364<kvI<zee!v*OxS2@6UGy&->Sp4g5aAvtMr-_>Tq8 zeuX9tj92f^RML68?AI&<zeMot*TovI=d(ue>{qMC>;2g*c=l_n#_REaAb9=?`@;tQ zu;AIR4>Vry&&<gxZ=4_Y>nzfJ(5&;T1kZj&4g6-ovtK<1{)d8Rzn(PkuLz#~dR^o7 ze7-Gs_UkViua7r-iaS5-R{`mmA3gqT!H4O-;5-B0DtPwm8jaWc^N8Ttub&(E1A=G2 z-Z${sQ{Cfbzs8a-w}-icXTKI3_$vg@etl8n^?bGqp8eXS@p^u46FmEMhsNvie<t`! z^6MD`{};itU%t<%yvh75AYJZX7aI5`!Lwgo2L3j|vtPXi{%OIpUoRQ>w*=3A{Ym5X zd>#`#`xPki&d+$#IX~=ISmX8h=Lx=s{90n*Hwm8ox>4ix?PssxdH?!X1Aj#D?AIp- ze*84={i}#{x&53kc=qcu1K%uo_A93GdOj0^XTP><yq=$X1<!sxpz(VAUkN@ze!XJg z1Jm94VZTO@F7vZY@a)%>2EJSH?AI0pf3M(q|JrTfUlu(3^*aN9RPgNAhZ?WvGc?1U zANFe$=`uev1kZkzYP=r*a>4gztMy%B;I|8&{rZ;1>)X$3f@i<}XyBb^q(K*k!7BhS z_AB>H)vu)SlFmH)Rbk*iCwTU&&cJUFJo|O6#_Rd)5j^{Km&WV)`HA4!uRR*C$N#<H z`?6JD-ZJo`W~z415Bqfn=`x>d1kZkb$-r+FJo|OKf&Yo%*{?nW{|CXdU+)=syVyNm z_A5v_j#tm;Si!SjQ#4-pYrf#wuS$*A<JTMbW&_`)=?kH+{JB1;hUM%RB{Ywd98E8W z`62@8w!g!pzS6Hiy6x7luOpo<t2@6?#T;>=!?wehu?SP@W`CSUYMW0}+}?1#Z&Cb3 zLcg8r%Y~kcJ3W+@YSJJ7o3;|x3Vja6=k@b?Gbm1{;IAQlgV6bR(KiTvVulj73!T3Q z|8=1sC;m>Mmrzpg5&AJ2*Zo4@N%fx!oi5v2j|;tkeE)^eCs6!Xgnl2@-x2z!#Q(R@ zCsEzmKwzHpJc{@nnzD}1BE~XS==}Te$wI${`p>`j;yC=fm$L<*N%bW{e}nwx-(mH~ zA+ApH)X#RIe@gw?B=oVQ-zfC0YPi-v3H<`9e@Ez96z5@~tH-*-)2oG!kM_mFzr*5j zEurmyzu><|+uLEGzfN&J5c)-w2Yem_7LGrQ>NymT^&ctB8YlG0l>ezhpF#R8p_h|h zDfD@yFB5tt=~oJUD~+pB=(}iKT|&PuQw`wDLZ3|atwKMQ*86p#FQ)wW3Y~w)^_I}z zCq9#=oX_dh&s@?m?X;-V(K5l0=DZ30`xNI3Lf=mMmxO+leC!tb1r+~Qq32SZUZHQI zIERIP1r6dT={PP5?JSW`@i-50;>VNDd@04BCwP302bL<qS1Z}NOz?ZD9}&S{N_?x} z4^wCH`3hLLKUb=%^)<os?*{qzV$9bO|FGa|DE?C-emn6m2|h~O?HhvcA^x!7Iqp%x z?<O7|aqJY%KR%ip%Xrec|1T=pnkM*f(|$Kc@cW48-&J$`dg{j|f`6U(H6s3Fq&Exx z_oRPK@H?q~o8bRQ{4T*SBmE)4A0hoo!9Rrwf%3fIKUK2D+Y68PM#|?=!52`R<0Aep z(z7YAoPT~_97j6G&!PBJ1izf(%o03x(>h1+{QkF0@C#`Fx<c?h6u(jM{Ch?IoiX=+ zH}N|JzlZ8~iTDSIe^T(jp#eNE_!{cxVZlF6`8_K51o8QlKh7t8jIzd)&i&`(`#iz( zzo%Fw_yZKbPVnbZy-o1^d-Lsr-$;4*rr_bBG){R;@c4WuEYAv_f8YCx;J-z2`1f%< zUVh%t$Aahe@}s|)@1r<VLTde-&sQi9Wu!CD&nM#F6Ept?^?$YC`TTr?h`)!{yG8K$ z+#xKt34R{M-zoS?;vW+HO41(}d=2Su2%fh;{+$_*m(P2T3jPDi&nF^&AH~nkQsdzK z#8lN9LpsOjH`OVE|A4mpQlazl;cP9=T#AhoTFf~Q<j;Dj7vLW#xL)eIQ$OzfP1eJt zBdhaPaePB7JarGIogHf0#B&|dmfGS@e3W8weQjs0RlGJ1kErixQx&JRKDxH6G144s zXamNXuU)&gBf1_iT$rSe+88`q)}`S;|Hq5qBO8nB+FDzq@C?Ud_~!zn#qh{Hc-A01 z$dDF_Ho@ar@j;R&Tfz_kbH;h)c$GB6&x2weS-s%blW>!$)J2$IRilI#W~=E4nBcOs zIraZTlv7Ek-9^Fh_etH{epSWLs?KFOjQRI2kJk?5HiPl|X#M|A*RfE;QtA91_=DF% zWKOVk=UIxWqU~7KlG%CC;FZ5HU5IGUQ%hq0&?A|@3qkW*|DnZdIa@S}s<p<j{NeM| z@}+9h|5q-*3R=AS-*c~fdF(%?LiYbE&}2+pa#R)mwX9ot0aZ<6TR`_(e;=)%zHSQ7 zI8)Em;c%?u=L1~79OwOX0*3!6i(a^|JlzV7Udu0|3q^7>=H+<0gO=CVf%6;rLX&9V z<ygKCW>9k-!=Rp^<trGZDUYA!T`=R7zx^Kh!(%Kj&-wFOH^$z>{ig#9{wxEJ<8pc2 iCj9V{WzTA*d<#3L6*>Ol(B`%L5$gYLZCRX^%l|KM0e7VU literal 0 HcmV?d00001 diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG2_avx2.o b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG2_avx2.o new file mode 100644 index 0000000000000000000000000000000000000000..248c7244cf105f023b1896cd4308aee4e0e8ce83 GIT binary patch literal 43688 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 XXCyiQK~R>i{^K<My+&Q!mG%E0HN226 literal 0 HcmV?d00001 diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_avx2 b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_avx2 index d2fd3730144602aa16b4728e7acbcaff53d6e823..8e7d6324bd6cb8fa9fbb81d57e9d9c56413530da 100755 GIT binary patch literal 119560 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 F{{dpV-Z%gN literal 119536 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%0A}ZfjvmZg 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 diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/main.o b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/main.o new file mode 100644 index 0000000000000000000000000000000000000000..c9ea8704ae2d57a0c36127605f696ab9b1febb99 GIT binary patch literal 3704 zcmbuB-A^1<6u|GDSzyb;%7;b>8plMNqB09xK&SyJ%L*uI2?n*kY-e|e-Hp35WOk@P zVl@&?NMEdpMiXP~n~(Zp`&3PQ023el5A?;vL=&s_!9<dJ&YgRf;qG9gp3TlZ_jk|7 z{hoO}yY!64IV0h0njO}NGPZf*P@fU%47->0vekv%9~X9h>DtTQLb{i|joy3NKQ&Pt zApCjmO7>vkgDZ1y-P+yz3CX{$?_>}7&T9wS<u7ia`!`?j!!w2|i;Lbib@^4%7(BFi z8!8%)i$V)(F$r4(*n))~YpFOs)8eAm@DnB?9dCaT?W9l={?V5}T2>hEKt;QHQFx%$ z^Y{R1sW9G&zS`9)V{NF#ZLBiJyZNKZ-h`eUNOtp{wyyhuKEe`-X+Y2=sY2glCV#qL zPo7CUm00XW)0w{aXZv|CL?2~(Jm6X%W335@*#qNi<9rdC;}5gN-c$n8JrShD?C?Jn z8p$CEv>X%~dk~(S|CQ{7r`Rhn-JI2|ienZ6yA!zFLiBdN6Mv3rG3{M^{DF_#4Nc$v z9dzFMY^$DFyP#<haKourN{(GLaOP#qs_T@DBMpVJ<*^14HMC{I5<Tl>*Yl71$hg9I z{@kjOF-FY^bIeE&kBkkEr%xNFRv_(y<p+G|^yHv1RI@H^rlIgR9DAx{JGNITAoU96 zsm+P;q47~;sALS){o+(%a#E(n4y4L%%}&*~QtrC#SQQVL?X6h_d#p4<Y$Ub3a3PgB zKeu>pKIM2zbIX}r(Jr_}+oP)Qy48A0B({9l%jKPA&n>WeW!v_*)?v%cXEJAuQ!t*v zyAOxK84ZMQ!|vSd;sYIR@poYP9srDg6tVbclU;9Xna)<t1B-x1J@KH$*l%~D+Vseq z1GX^yqC}TRSZ&jpIDRUIDB{RQ@aPWfti8z=fzCRP;c(s}L}&LzP>j>r#IYwmp?RQ# zg_d1S){L3Q@bkxT?-))eM;r>dvx2RYo1GuY9qy;IFT9jyszLf64VDXcjUh~$qCj8M z@JGS>0cZE%P9U=gL6GC@5??_Gf*j|Icpf1L@^1JOr;8R>nsiVbD~udpU26zI&=-X` zt>AqDZt#6s@0TU+d(2HTC>4wo-hIO%j(O?)J*n`=Wqn%V^Rk{*xU8}zg}*H8^q!${ z-IUx?>?vPa;U{r`AZ}1J=HaBQ`wE|w^~<tU=jWQj@fCtXYlQs_pK>}IYMjS}7rt(e z&c7i!u1R=Zm|5Sd`BolE-wVnzX`WrROyA!0nOU@ai<$X)otc6b?fgb5S8>){XcM}X z&wKWzBh8j)IVJn3OSR(I<N|q^S#WDL8(s&d<NCG<*EGB;timfYkX_ELc~%Xs@&73X z_~V?=d{Vd>snESc9Bsog02TbAnF&MC>C5G!<al1tm-aY(T?oN_fn2@WuLsRdPc=V& zh+xeB>OT&?YD`Q@`M<?VNL1SqXp0*ES8_r>lMXn3+^6dJXMw3P0kItkt5^w%YP$+; zDns*MC8T?VLa4UO&=A%Cb=gt!$NnQy`(FX3#stJ3l7~rt*C7(3+7^LE<^Mz`qJ4t- z!*?X{4d57)`U$F#H)Z~ml8~xYz5&)z{-4VYh40m{kRO%1&`5gN?t67Z%0|`pW9cuu z+X(T4^q**uK%x03{2?e&^LHa+{_y=s{xpBsA2m0|?!%xUw10a*$9J6SkME|aq3+8| Z`8{Y4i#mQ>*C_w*WTH>Q&Y-LQe*?<ae69ch literal 0 HcmV?d00001 diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/sauvegarde.tar.gz b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/sauvegarde.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..438d0b4b2111a33261ab02399920965505229458 GIT binary patch literal 9262 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 literal 0 HcmV?d00001 diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG1_avx512.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG1_avx512.c new file mode 100644 index 00000000000..09bd9952163 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG1_avx512.c @@ -0,0 +1,1768 @@ + + + + +#include <stdint.h> +#include <immintrin.h> +#include "../../nrLDPCdecoder_defs.h" +#include "../../nrLDPC_types.h" + + +void nrLDPC_bnProcPc_BG1_generator_AVX512(int R) +{ + const char *ratestr[3]={"13","23","89"}; + + if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} + + + + + char fname[50]; + sprintf(fname,"../ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG1_R%s_AVX512.h",ratestr[R]); + FILE *fd=fopen(fname,"w"); + if (fd == NULL) {printf("Cannot create \n");abort();} + + + + fprintf(fd,"static inline void nrLDPC_bnProcPc_BG1_R%s_AVX512(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; + 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();} + // 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; + + fprintf(fd," __m512i zmm0, zmm1, zmmRes0, zmmRes1; \n"); + + + fprintf(fd," __m256i* p_bnProcBuf; \n"); + fprintf(fd," __m256i* p_llrProcBuf;\n"); + fprintf(fd," __m512i* p_llrRes; \n"); + fprintf(fd," uint32_t M ;\n"); + + +fprintf(fd, "// Process group with 1 CNs \n"); + + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[0] > 0) + { + // If elements in group move to next address + // idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[0] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[0]*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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[j + 1]);\n"); + + // Loop over CNs + for (k=1; k<1; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + + fprintf(fd,"}\n"); + } + // ===================================================================== + // Process group with 2 CNs + + +fprintf(fd, "// Process group with 2 CNs \n"); + + // 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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[j + 1]);\n"); + + // Loop over CNs + for (k=1; k<2; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 3 CNs + + +fprintf(fd, "// Process group with 3 CNs \n"); + + // Process group with 3 CNs + + if (lut_numBnInBnGroups[2] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<3; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 4 CNs + +fprintf(fd, "// Process group with 4 CNs \n"); + + // Process group with 4 CNs + + if (lut_numBnInBnGroups[3] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<4; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 5 CNs + +fprintf(fd, "// Process group with 5 CNs \n"); + + // Process group with 5 CNs + + if (lut_numBnInBnGroups[4] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<5; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 6 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<6; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 7 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<7; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + //fprintf(fd," (__m512i*) &llrRes[%d + i] = _mm512_permutex_epi64(zmm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>6 ); + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 8 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<8; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + //fprintf(fd," (__m512i*) &llrRes[%d + i] = _mm512_permutex_epi64(zmm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>6 ); + + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 9 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<9; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + //fprintf(fd," (__m512i*) &llrRes[%d + i] = _mm512_permutex_epi64(zmm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>6 ); + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 10 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<10; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + +fprintf(fd, "// Process group with 11 CNs \n"); + + + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[10] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<11; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + // ===================================================================== + // Process group with 2 CNs + + +fprintf(fd, "// Process group with 12 CNs \n"); + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[11] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<12; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 13 CNs + + +fprintf(fd, "// Process group with 13 CNs \n"); + + // Process group with 3 CNs + + if (lut_numBnInBnGroups[12] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<13; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 4 CNs + +fprintf(fd, "// Process group with 14 CNs \n"); + + // Process group with 4 CNs + + if (lut_numBnInBnGroups[13] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<14; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 5 CNs + +fprintf(fd, "// Process group with 15 CNs \n"); + + // Process group with 5 CNs + + if (lut_numBnInBnGroups[14] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<15; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 6 CNs + +fprintf(fd, "// Process group with 16 CNs \n"); + + // Process group with 6 CNs + + if (lut_numBnInBnGroups[15] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<16; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<17; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 18 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<18; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 9 CNs + +fprintf(fd, "// Process group with 19 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[18] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<19; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 20 CNs + +fprintf(fd, "// Process group with 20 CNs \n"); + + // Process group with 20 CNs + + if (lut_numBnInBnGroups[19] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<20; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + + + // ===================================================================== + +fprintf(fd, "// Process group with 21 CNs \n"); + + + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[20] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<21; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + // ===================================================================== + // Process group with 2 CNs + + +fprintf(fd, "// Process group with 22 CNs \n"); + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[21] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<22; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 13 CNs + + +fprintf(fd, "// Process group with <23 CNs \n"); + + // Process group with 3 CNs + + if (lut_numBnInBnGroups[22] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<23; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 4 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<24; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 5 CNs + +fprintf(fd, "// Process group with 25 CNs \n"); + + // Process group with 5 CNs + + if (lut_numBnInBnGroups[24] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<25; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 6 CNs + +fprintf(fd, "// Process group with 26 CNs \n"); + + // Process group with 6 CNs + + if (lut_numBnInBnGroups[25] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<26; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 17 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<27; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 18 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<28; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 9 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<29; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 20 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<30; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);\n"); + // zmm0 = [zmmRes1[255:256] zmmRes0[255:256] zmmRes1[127:0] zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256] zmmRes1[127:0] zmmRes0[255:256] zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + fprintf(fd,"}\n"); + fclose(fd); +}//end of the function nrLDPC_bnProcPc_BG1 + + + + + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG2_avx512.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG2_avx512.c new file mode 100644 index 00000000000..a025ae8efb3 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG2_avx512.c @@ -0,0 +1,1770 @@ + + + +#include <stdint.h> +#include <immintrin.h> +#include "../../nrLDPCdecoder_defs.h" +#include "../../nrLDPC_types.h" + + +void nrLDPC_bnProcPc_BG2_generator_AVX512(int R) +{ + const char *ratestr[3]={"15","13","23"}; + + 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/bn_avx512/nrLDPC_bnProcPc_BG2_R%s_AVX512.h",ratestr[R]); + FILE *fd=fopen(fname,"w"); + if (fd == NULL) {printf("Cannot create \n");abort();} + +// fprintf(fd,"#include <stdint.h>\n"); + //fprintf(fd,"#include <immintrin.h>\n"); + + fprintf(fd,"static inline void nrLDPC_bnProcPc_BG2_R%s_AVX512(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; + if (R==0) { + + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R15; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R15; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R15; + + } + else if (R==1){ + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R13; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R13; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R13; + } + else if (R==2) { + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R23; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R23; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R23; + } + else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} + + + uint32_t k; + // Offset to each bit within a group in terms of 32 Byte + uint32_t cnOffsetInGroup; + uint8_t idxBnGroup = 0; + + fprintf(fd," __m512i zmm0,zmm1,zmmRes0,zmmRes1; \n"); + + + fprintf(fd," __m256i* p_bnProcBuf; \n"); + fprintf(fd," __m256i* p_llrProcBuf;\n"); + fprintf(fd," __m512i* p_llrRes; \n"); + fprintf(fd," uint32_t M ;\n"); + + +fprintf(fd, "// Process group with 1 CNs \n"); + + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[0] > 0) + { + // If elements in group move to next address + // idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[0] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[0]*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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + + // Loop over CNs + /*for (k=1; k<1; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } +*/ + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[j+1]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + + fprintf(fd,"}\n"); + } + // ===================================================================== + // Process group with 2 CNs + + +fprintf(fd, "// Process group with 2 CNs \n"); + + // 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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[j + 1]);\n"); + + // Loop over CNs + for (k=1; k<2; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 3 CNs + + +fprintf(fd, "// Process group with 3 CNs \n"); + + // Process group with 3 CNs + + if (lut_numBnInBnGroups[2] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<3; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 4 CNs + +fprintf(fd, "// Process group with 4 CNs \n"); + + // Process group with 4 CNs + + if (lut_numBnInBnGroups[3] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<4; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 5 CNs + +fprintf(fd, "// Process group with 5 CNs \n"); + + // Process group with 5 CNs + + if (lut_numBnInBnGroups[4] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<5; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 6 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<6; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 7 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<7; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + //fprintf(fd," (__m512i*) &llrRes[%d + i] = _mm512_permutex_epi64(zmm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 8 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<8; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + //fprintf(fd," (__m512i*) &llrRes[%d + i] = _mm512_permutex_epi64(zmm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); + + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 9 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<9; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + //fprintf(fd," (__m512i*) &llrRes[%d + i] = _mm512_permutex_epi64(zmm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 10 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<10; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + +fprintf(fd, "// Process group with 11 CNs \n"); + + + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[10] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<11; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + // ===================================================================== + // Process group with 2 CNs + + +fprintf(fd, "// Process group with 12 CNs \n"); + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[11] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<12; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 13 CNs + + +fprintf(fd, "// Process group with 13 CNs \n"); + + // Process group with 3 CNs + + if (lut_numBnInBnGroups[12] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<13; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 4 CNs + +fprintf(fd, "// Process group with 14 CNs \n"); + + // Process group with 4 CNs + + if (lut_numBnInBnGroups[13] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<14; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 5 CNs + +fprintf(fd, "// Process group with 15 CNs \n"); + + // Process group with 5 CNs + + if (lut_numBnInBnGroups[14] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<15; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 6 CNs + +fprintf(fd, "// Process group with 16 CNs \n"); + + // Process group with 6 CNs + + if (lut_numBnInBnGroups[15] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<16; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<17; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 18 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<18; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 9 CNs + +fprintf(fd, "// Process group with 19 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[18] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<19; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 20 CNs + +fprintf(fd, "// Process group with 20 CNs \n"); + + // Process group with 20 CNs + + if (lut_numBnInBnGroups[19] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<20; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + + + // ===================================================================== + +fprintf(fd, "// Process group with 21 CNs \n"); + + + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[20] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<21; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + // ===================================================================== + // Process group with 2 CNs + + +fprintf(fd, "// Process group with 22 CNs \n"); + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[21] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<22; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 13 CNs + + +fprintf(fd, "// Process group with <23 CNs \n"); + + // Process group with 3 CNs + + if (lut_numBnInBnGroups[22] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<23; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 4 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<24; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 5 CNs + +fprintf(fd, "// Process group with 25 CNs \n"); + + // Process group with 5 CNs + + if (lut_numBnInBnGroups[24] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<25; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + + // ===================================================================== + // Process group with 6 CNs + +fprintf(fd, "// Process group with 26 CNs \n"); + + // Process group with 6 CNs + + if (lut_numBnInBnGroups[25] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<26; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 17 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<27; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 18 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<28; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 9 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<29; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 20 CNs + +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 + fprintf(fd," M = (%d*Z + 63)>>6;\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_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); + // First 16 LLRs of first CN + fprintf(fd," zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]);\n"); + fprintf(fd," zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]);\n"); + + // Loop over CNs + for (k=1; k<30; k++) + { + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup); + + fprintf(fd, " zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); \n"); + } + + // Add LLR from receiver input + fprintf(fd," zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);\n"); + fprintf(fd," zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0);\n"); + + fprintf(fd," zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n"); + fprintf(fd," zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1);\n"); + + // Pack results back to epi8 + fprintf(fd," zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1);\n"); + //zmm0 = [zmmRes1[255:256]zmmRes0[255:256]zmmRes1[127:0]zmmRes0[127:0]] + // p_llrRes = [zmmRes1[255:256]zmmRes1[127:0]zmmRes0[255:256]zmmRes0[127:0]] + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + fprintf(fd,"}\n"); + fclose(fd); +}//end of the function nrLDPC_bnProcPc_BG2 + + + + + + + + + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProc_gen_avx512 b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProc_gen_avx512 index f686a271f18d31892f83a65819d96e3439325fd9..dabfabe18fdbb098b9ea9a0996079e0fde890445 100755 GIT binary patch literal 119632 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 VR2B4vmp1>hXSijV;b81K{}0~xtw{g? literal 57368 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 diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/main.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/main.c index 3b2bc3ede49..2bc870f17b1 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/main.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/main.c @@ -4,8 +4,8 @@ #define NB_R 3 void nrLDPC_bnProc_BG1_generator_AVX512(int); void nrLDPC_bnProc_BG2_generator_AVX512(int); -//void nrLDPC_bnProcPc_BG1_generator_AVX2(int); -//void nrLDPC_bnProcPc_BG2_generator_AVX2(int); +void nrLDPC_bnProcPc_BG1_generator_AVX512(int); +void nrLDPC_bnProcPc_BG2_generator_AVX512(int); int main() { @@ -15,8 +15,8 @@ int main() nrLDPC_bnProc_BG1_generator_AVX512(R[i]); nrLDPC_bnProc_BG2_generator_AVX512(R[i]); -// nrLDPC_bnProcPc_BG1_generator_AVX2(R[i]); -// nrLDPC_bnProcPc_BG2_generator_AVX2(R[i]); + nrLDPC_bnProcPc_BG1_generator_AVX512(R[i]); + nrLDPC_bnProcPc_BG2_generator_AVX512(R[i]); } diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProc/nrLDPC_bnProc_BG2_R13_AVX2.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProc/nrLDPC_bnProc_BG2_R13_AVX2.c new file mode 100644 index 00000000000..3f1c421cebd --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProc/nrLDPC_bnProc_BG2_R13_AVX2.c @@ -0,0 +1,440 @@ +#include <stdint.h> +#include <immintrin.h> +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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[12]; + p_llrRes = (__m256i*) &llrRes [6912]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]); +} +// Process group with 3 CNs +// Process group with 4 CNs + M = (2*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[24]; + p_llrRes = (__m256i*) &llrRes [7296]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]); +} + p_res = &p_bnProcBufRes[48]; + p_llrRes = (__m256i*) &llrRes [7296]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]); +} + p_res = &p_bnProcBufRes[72]; + p_llrRes = (__m256i*) &llrRes [7296]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]); +} +// Process group with 5 CNs + M = (1*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[12]; + p_llrRes = (__m256i*) &llrRes [8064]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]); +} + p_res = &p_bnProcBufRes[24]; + p_llrRes = (__m256i*) &llrRes [8064]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]); +} + p_res = &p_bnProcBufRes[36]; + p_llrRes = (__m256i*) &llrRes [8064]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]); +} + p_res = &p_bnProcBufRes[48]; + p_llrRes = (__m256i*) &llrRes [8064]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]); +} +// Process group with 6 CNs + M = (5*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[60]; + p_llrRes = (__m256i*) &llrRes [8448]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]); +} + p_res = &p_bnProcBufRes[120]; + p_llrRes = (__m256i*) &llrRes [8448]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]); +} + p_res = &p_bnProcBufRes[180]; + p_llrRes = (__m256i*) &llrRes [8448]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[180 + i]); +} + p_res = &p_bnProcBufRes[240]; + p_llrRes = (__m256i*) &llrRes [8448]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[240 + i]); +} + p_res = &p_bnProcBufRes[300]; + p_llrRes = (__m256i*) &llrRes [8448]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[300 + i]); +} +// Process group with 7 CNs + M = (1*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[12]; + p_llrRes = (__m256i*) &llrRes [10368]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]); +} + p_res = &p_bnProcBufRes[24]; + p_llrRes = (__m256i*) &llrRes [10368]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]); +} + p_res = &p_bnProcBufRes[36]; + p_llrRes = (__m256i*) &llrRes [10368]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]); +} + p_res = &p_bnProcBufRes[48]; + p_llrRes = (__m256i*) &llrRes [10368]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]); +} + p_res = &p_bnProcBufRes[60]; + p_llrRes = (__m256i*) &llrRes [10368]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]); +} + p_res = &p_bnProcBufRes[72]; + p_llrRes = (__m256i*) &llrRes [10368]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]); +} +// Process group with 8 CNs + M = (1*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[12]; + p_llrRes = (__m256i*) &llrRes [10752]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]); +} + p_res = &p_bnProcBufRes[24]; + p_llrRes = (__m256i*) &llrRes [10752]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]); +} + p_res = &p_bnProcBufRes[36]; + p_llrRes = (__m256i*) &llrRes [10752]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]); +} + p_res = &p_bnProcBufRes[48]; + p_llrRes = (__m256i*) &llrRes [10752]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]); +} + p_res = &p_bnProcBufRes[60]; + p_llrRes = (__m256i*) &llrRes [10752]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]); +} + p_res = &p_bnProcBufRes[72]; + p_llrRes = (__m256i*) &llrRes [10752]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]); +} + p_res = &p_bnProcBufRes[84]; + p_llrRes = (__m256i*) &llrRes [10752]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]); +} +// Process group with 9 CNs +// Process group with 10 CNs +// Process group with 11 CNs +// Process group with 12 CNs +// Process group with 13 CNs + M = (1*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[12]; + p_llrRes = (__m256i*) &llrRes [11136]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]); +} + p_res = &p_bnProcBufRes[24]; + p_llrRes = (__m256i*) &llrRes [11136]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]); +} + p_res = &p_bnProcBufRes[36]; + p_llrRes = (__m256i*) &llrRes [11136]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]); +} + p_res = &p_bnProcBufRes[48]; + p_llrRes = (__m256i*) &llrRes [11136]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]); +} + p_res = &p_bnProcBufRes[60]; + p_llrRes = (__m256i*) &llrRes [11136]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]); +} + p_res = &p_bnProcBufRes[72]; + p_llrRes = (__m256i*) &llrRes [11136]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]); +} + p_res = &p_bnProcBufRes[84]; + p_llrRes = (__m256i*) &llrRes [11136]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]); +} + p_res = &p_bnProcBufRes[96]; + p_llrRes = (__m256i*) &llrRes [11136]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]); +} + p_res = &p_bnProcBufRes[108]; + p_llrRes = (__m256i*) &llrRes [11136]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]); +} + p_res = &p_bnProcBufRes[120]; + p_llrRes = (__m256i*) &llrRes [11136]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]); +} + p_res = &p_bnProcBufRes[132]; + p_llrRes = (__m256i*) &llrRes [11136]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[132 + i]); +} + p_res = &p_bnProcBufRes[144]; + p_llrRes = (__m256i*) &llrRes [11136]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[144 + i]); +} +// Process group with 14 CNs + M = (1*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[12]; + p_llrRes = (__m256i*) &llrRes [11520]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]); +} + p_res = &p_bnProcBufRes[24]; + p_llrRes = (__m256i*) &llrRes [11520]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]); +} + p_res = &p_bnProcBufRes[36]; + p_llrRes = (__m256i*) &llrRes [11520]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]); +} + p_res = &p_bnProcBufRes[48]; + p_llrRes = (__m256i*) &llrRes [11520]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]); +} + p_res = &p_bnProcBufRes[60]; + p_llrRes = (__m256i*) &llrRes [11520]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]); +} + p_res = &p_bnProcBufRes[72]; + p_llrRes = (__m256i*) &llrRes [11520]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]); +} + p_res = &p_bnProcBufRes[84]; + p_llrRes = (__m256i*) &llrRes [11520]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]); +} + p_res = &p_bnProcBufRes[96]; + p_llrRes = (__m256i*) &llrRes [11520]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]); +} + p_res = &p_bnProcBufRes[108]; + p_llrRes = (__m256i*) &llrRes [11520]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]); +} + p_res = &p_bnProcBufRes[120]; + p_llrRes = (__m256i*) &llrRes [11520]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]); +} + p_res = &p_bnProcBufRes[132]; + p_llrRes = (__m256i*) &llrRes [11520]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[132 + i]); +} + p_res = &p_bnProcBufRes[144]; + p_llrRes = (__m256i*) &llrRes [11520]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[144 + i]); +} + p_res = &p_bnProcBufRes[156]; + p_llrRes = (__m256i*) &llrRes [11520]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[156 + i]); +} +// Process group with 15 CNs +// Process group with 16 CNs + M = (1*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[12]; + p_llrRes = (__m256i*) &llrRes [11904]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]); +} + p_res = &p_bnProcBufRes[24]; + p_llrRes = (__m256i*) &llrRes [11904]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]); +} + p_res = &p_bnProcBufRes[36]; + p_llrRes = (__m256i*) &llrRes [11904]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]); +} + p_res = &p_bnProcBufRes[48]; + p_llrRes = (__m256i*) &llrRes [11904]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]); +} + p_res = &p_bnProcBufRes[60]; + p_llrRes = (__m256i*) &llrRes [11904]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]); +} + p_res = &p_bnProcBufRes[72]; + p_llrRes = (__m256i*) &llrRes [11904]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]); +} + p_res = &p_bnProcBufRes[84]; + p_llrRes = (__m256i*) &llrRes [11904]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]); +} + p_res = &p_bnProcBufRes[96]; + p_llrRes = (__m256i*) &llrRes [11904]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]); +} + p_res = &p_bnProcBufRes[108]; + p_llrRes = (__m256i*) &llrRes [11904]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]); +} + p_res = &p_bnProcBufRes[120]; + p_llrRes = (__m256i*) &llrRes [11904]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]); +} + p_res = &p_bnProcBufRes[132]; + p_llrRes = (__m256i*) &llrRes [11904]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[132 + i]); +} + p_res = &p_bnProcBufRes[144]; + p_llrRes = (__m256i*) &llrRes [11904]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[144 + i]); +} + p_res = &p_bnProcBufRes[156]; + p_llrRes = (__m256i*) &llrRes [11904]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[156 + i]); +} + p_res = &p_bnProcBufRes[168]; + p_llrRes = (__m256i*) &llrRes [11904]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[168 + i]); +} + p_res = &p_bnProcBufRes[180]; + p_llrRes = (__m256i*) &llrRes [11904]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[180 + i]); +} +// Process group with 17 CNs +// Process group with 18 CNs +// Process group with 19 CNs +// Process group with 20 CNs +// Process group with 21 CNs +// Process group with 22 CNs +// Process group with <23 CNs +// Process group with 24 CNs +// Process group with 25 CNs +// Process group with 26 CNs +// Process group with 27 CNs +// Process group with 28 CNs +// Process group with 29 CNs +// Process group with 30 CNs +} diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProc/nrLDPC_bnProc_BG2_R15_AVX2.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProc/nrLDPC_bnProc_BG2_R15_AVX2.c new file mode 100644 index 00000000000..f649102df7a --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProc/nrLDPC_bnProc_BG2_R15_AVX2.c @@ -0,0 +1,799 @@ +#include <stdint.h> +#include <immintrin.h> +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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[24]; + p_llrRes = (__m256i*) &llrRes [14592]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]); +} + p_res = &p_bnProcBufRes[48]; + p_llrRes = (__m256i*) &llrRes [14592]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]); +} + p_res = &p_bnProcBufRes[72]; + p_llrRes = (__m256i*) &llrRes [14592]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]); +} + p_res = &p_bnProcBufRes[96]; + p_llrRes = (__m256i*) &llrRes [14592]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]); +} +// Process group with 6 CNs + M = (1*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[12]; + p_llrRes = (__m256i*) &llrRes [15360]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]); +} + p_res = &p_bnProcBufRes[24]; + p_llrRes = (__m256i*) &llrRes [15360]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]); +} + p_res = &p_bnProcBufRes[36]; + p_llrRes = (__m256i*) &llrRes [15360]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]); +} + p_res = &p_bnProcBufRes[48]; + p_llrRes = (__m256i*) &llrRes [15360]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]); +} + p_res = &p_bnProcBufRes[60]; + p_llrRes = (__m256i*) &llrRes [15360]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]); +} +// Process group with 7 CNs + M = (1*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[12]; + p_llrRes = (__m256i*) &llrRes [15744]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]); +} + p_res = &p_bnProcBufRes[24]; + p_llrRes = (__m256i*) &llrRes [15744]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]); +} + p_res = &p_bnProcBufRes[36]; + p_llrRes = (__m256i*) &llrRes [15744]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]); +} + p_res = &p_bnProcBufRes[48]; + p_llrRes = (__m256i*) &llrRes [15744]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]); +} + p_res = &p_bnProcBufRes[60]; + p_llrRes = (__m256i*) &llrRes [15744]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]); +} + p_res = &p_bnProcBufRes[72]; + p_llrRes = (__m256i*) &llrRes [15744]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]); +} +// Process group with 8 CNs + M = (1*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[12]; + p_llrRes = (__m256i*) &llrRes [16128]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]); +} + p_res = &p_bnProcBufRes[24]; + p_llrRes = (__m256i*) &llrRes [16128]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]); +} + p_res = &p_bnProcBufRes[36]; + p_llrRes = (__m256i*) &llrRes [16128]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]); +} + p_res = &p_bnProcBufRes[48]; + p_llrRes = (__m256i*) &llrRes [16128]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]); +} + p_res = &p_bnProcBufRes[60]; + p_llrRes = (__m256i*) &llrRes [16128]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]); +} + p_res = &p_bnProcBufRes[72]; + p_llrRes = (__m256i*) &llrRes [16128]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]); +} + p_res = &p_bnProcBufRes[84]; + p_llrRes = (__m256i*) &llrRes [16128]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]); +} +// Process group with 9 CNs + M = (2*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[24]; + p_llrRes = (__m256i*) &llrRes [16512]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]); +} + p_res = &p_bnProcBufRes[48]; + p_llrRes = (__m256i*) &llrRes [16512]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]); +} + p_res = &p_bnProcBufRes[72]; + p_llrRes = (__m256i*) &llrRes [16512]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]); +} + p_res = &p_bnProcBufRes[96]; + p_llrRes = (__m256i*) &llrRes [16512]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]); +} + p_res = &p_bnProcBufRes[120]; + p_llrRes = (__m256i*) &llrRes [16512]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]); +} + p_res = &p_bnProcBufRes[144]; + p_llrRes = (__m256i*) &llrRes [16512]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[144 + i]); +} + p_res = &p_bnProcBufRes[168]; + p_llrRes = (__m256i*) &llrRes [16512]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[168 + i]); +} + p_res = &p_bnProcBufRes[192]; + p_llrRes = (__m256i*) &llrRes [16512]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[192 + i]); +} +// Process group with 10 CNs + M = (1*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[12]; + p_llrRes = (__m256i*) &llrRes [17280]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]); +} + p_res = &p_bnProcBufRes[24]; + p_llrRes = (__m256i*) &llrRes [17280]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]); +} + p_res = &p_bnProcBufRes[36]; + p_llrRes = (__m256i*) &llrRes [17280]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]); +} + p_res = &p_bnProcBufRes[48]; + p_llrRes = (__m256i*) &llrRes [17280]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]); +} + p_res = &p_bnProcBufRes[60]; + p_llrRes = (__m256i*) &llrRes [17280]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]); +} + p_res = &p_bnProcBufRes[72]; + p_llrRes = (__m256i*) &llrRes [17280]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]); +} + p_res = &p_bnProcBufRes[84]; + p_llrRes = (__m256i*) &llrRes [17280]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]); +} + p_res = &p_bnProcBufRes[96]; + p_llrRes = (__m256i*) &llrRes [17280]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]); +} + p_res = &p_bnProcBufRes[108]; + p_llrRes = (__m256i*) &llrRes [17280]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]); +} +// Process group with 11 CNs +// Process group with 12 CNs + M = (1*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[12]; + p_llrRes = (__m256i*) &llrRes [17664]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]); +} + p_res = &p_bnProcBufRes[24]; + p_llrRes = (__m256i*) &llrRes [17664]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]); +} + p_res = &p_bnProcBufRes[36]; + p_llrRes = (__m256i*) &llrRes [17664]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]); +} + p_res = &p_bnProcBufRes[48]; + p_llrRes = (__m256i*) &llrRes [17664]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]); +} + p_res = &p_bnProcBufRes[60]; + p_llrRes = (__m256i*) &llrRes [17664]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]); +} + p_res = &p_bnProcBufRes[72]; + p_llrRes = (__m256i*) &llrRes [17664]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]); +} + p_res = &p_bnProcBufRes[84]; + p_llrRes = (__m256i*) &llrRes [17664]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]); +} + p_res = &p_bnProcBufRes[96]; + p_llrRes = (__m256i*) &llrRes [17664]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]); +} + p_res = &p_bnProcBufRes[108]; + p_llrRes = (__m256i*) &llrRes [17664]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]); +} + p_res = &p_bnProcBufRes[120]; + p_llrRes = (__m256i*) &llrRes [17664]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]); +} + p_res = &p_bnProcBufRes[132]; + p_llrRes = (__m256i*) &llrRes [17664]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[132 + i]); +} +// Process group with 13 CNs + M = (1*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[12]; + p_llrRes = (__m256i*) &llrRes [18048]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]); +} + p_res = &p_bnProcBufRes[24]; + p_llrRes = (__m256i*) &llrRes [18048]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]); +} + p_res = &p_bnProcBufRes[36]; + p_llrRes = (__m256i*) &llrRes [18048]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]); +} + p_res = &p_bnProcBufRes[48]; + p_llrRes = (__m256i*) &llrRes [18048]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]); +} + p_res = &p_bnProcBufRes[60]; + p_llrRes = (__m256i*) &llrRes [18048]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]); +} + p_res = &p_bnProcBufRes[72]; + p_llrRes = (__m256i*) &llrRes [18048]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]); +} + p_res = &p_bnProcBufRes[84]; + p_llrRes = (__m256i*) &llrRes [18048]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]); +} + p_res = &p_bnProcBufRes[96]; + p_llrRes = (__m256i*) &llrRes [18048]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]); +} + p_res = &p_bnProcBufRes[108]; + p_llrRes = (__m256i*) &llrRes [18048]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]); +} + p_res = &p_bnProcBufRes[120]; + p_llrRes = (__m256i*) &llrRes [18048]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]); +} + p_res = &p_bnProcBufRes[132]; + p_llrRes = (__m256i*) &llrRes [18048]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[132 + i]); +} + p_res = &p_bnProcBufRes[144]; + p_llrRes = (__m256i*) &llrRes [18048]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[144 + i]); +} +// Process group with 14 CNs + M = (1*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[12]; + p_llrRes = (__m256i*) &llrRes [18432]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]); +} + p_res = &p_bnProcBufRes[24]; + p_llrRes = (__m256i*) &llrRes [18432]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]); +} + p_res = &p_bnProcBufRes[36]; + p_llrRes = (__m256i*) &llrRes [18432]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]); +} + p_res = &p_bnProcBufRes[48]; + p_llrRes = (__m256i*) &llrRes [18432]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]); +} + p_res = &p_bnProcBufRes[60]; + p_llrRes = (__m256i*) &llrRes [18432]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]); +} + p_res = &p_bnProcBufRes[72]; + p_llrRes = (__m256i*) &llrRes [18432]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]); +} + p_res = &p_bnProcBufRes[84]; + p_llrRes = (__m256i*) &llrRes [18432]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]); +} + p_res = &p_bnProcBufRes[96]; + p_llrRes = (__m256i*) &llrRes [18432]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]); +} + p_res = &p_bnProcBufRes[108]; + p_llrRes = (__m256i*) &llrRes [18432]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]); +} + p_res = &p_bnProcBufRes[120]; + p_llrRes = (__m256i*) &llrRes [18432]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]); +} + p_res = &p_bnProcBufRes[132]; + p_llrRes = (__m256i*) &llrRes [18432]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[132 + i]); +} + p_res = &p_bnProcBufRes[144]; + p_llrRes = (__m256i*) &llrRes [18432]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[144 + i]); +} + p_res = &p_bnProcBufRes[156]; + p_llrRes = (__m256i*) &llrRes [18432]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[156 + i]); +} +// Process group with 15 CNs +// Process group with 16 CNs + M = (1*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[12]; + p_llrRes = (__m256i*) &llrRes [18816]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]); +} + p_res = &p_bnProcBufRes[24]; + p_llrRes = (__m256i*) &llrRes [18816]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]); +} + p_res = &p_bnProcBufRes[36]; + p_llrRes = (__m256i*) &llrRes [18816]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]); +} + p_res = &p_bnProcBufRes[48]; + p_llrRes = (__m256i*) &llrRes [18816]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]); +} + p_res = &p_bnProcBufRes[60]; + p_llrRes = (__m256i*) &llrRes [18816]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]); +} + p_res = &p_bnProcBufRes[72]; + p_llrRes = (__m256i*) &llrRes [18816]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]); +} + p_res = &p_bnProcBufRes[84]; + p_llrRes = (__m256i*) &llrRes [18816]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]); +} + p_res = &p_bnProcBufRes[96]; + p_llrRes = (__m256i*) &llrRes [18816]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]); +} + p_res = &p_bnProcBufRes[108]; + p_llrRes = (__m256i*) &llrRes [18816]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]); +} + p_res = &p_bnProcBufRes[120]; + p_llrRes = (__m256i*) &llrRes [18816]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]); +} + p_res = &p_bnProcBufRes[132]; + p_llrRes = (__m256i*) &llrRes [18816]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[132 + i]); +} + p_res = &p_bnProcBufRes[144]; + p_llrRes = (__m256i*) &llrRes [18816]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[144 + i]); +} + p_res = &p_bnProcBufRes[156]; + p_llrRes = (__m256i*) &llrRes [18816]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[156 + i]); +} + p_res = &p_bnProcBufRes[168]; + p_llrRes = (__m256i*) &llrRes [18816]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[168 + i]); +} + p_res = &p_bnProcBufRes[180]; + p_llrRes = (__m256i*) &llrRes [18816]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[180 + i]); +} +// Process group with 17 CNs +// Process group with 18 CNs +// Process group with 19 CNs +// Process group with 20 CNs +// Process group with 21 CNs +// Process group with 22 CNs + M = (1*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[12]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]); +} + p_res = &p_bnProcBufRes[24]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]); +} + p_res = &p_bnProcBufRes[36]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]); +} + p_res = &p_bnProcBufRes[48]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]); +} + p_res = &p_bnProcBufRes[60]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]); +} + p_res = &p_bnProcBufRes[72]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]); +} + p_res = &p_bnProcBufRes[84]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]); +} + p_res = &p_bnProcBufRes[96]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]); +} + p_res = &p_bnProcBufRes[108]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]); +} + p_res = &p_bnProcBufRes[120]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]); +} + p_res = &p_bnProcBufRes[132]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[132 + i]); +} + p_res = &p_bnProcBufRes[144]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[144 + i]); +} + p_res = &p_bnProcBufRes[156]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[156 + i]); +} + p_res = &p_bnProcBufRes[168]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[168 + i]); +} + p_res = &p_bnProcBufRes[180]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[180 + i]); +} + p_res = &p_bnProcBufRes[192]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[192 + i]); +} + p_res = &p_bnProcBufRes[204]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[204 + i]); +} + p_res = &p_bnProcBufRes[216]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[216 + i]); +} + p_res = &p_bnProcBufRes[228]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[228 + i]); +} + p_res = &p_bnProcBufRes[240]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[240 + i]); +} + p_res = &p_bnProcBufRes[252]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[252 + i]); +} +// Process group with <23 CNs + M = (1*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[12]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]); +} + p_res = &p_bnProcBufRes[24]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]); +} + p_res = &p_bnProcBufRes[36]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]); +} + p_res = &p_bnProcBufRes[48]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]); +} + p_res = &p_bnProcBufRes[60]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]); +} + p_res = &p_bnProcBufRes[72]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]); +} + p_res = &p_bnProcBufRes[84]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]); +} + p_res = &p_bnProcBufRes[96]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]); +} + p_res = &p_bnProcBufRes[108]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]); +} + p_res = &p_bnProcBufRes[120]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]); +} + p_res = &p_bnProcBufRes[132]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[132 + i]); +} + p_res = &p_bnProcBufRes[144]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[144 + i]); +} + p_res = &p_bnProcBufRes[156]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[156 + i]); +} + p_res = &p_bnProcBufRes[168]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[168 + i]); +} + p_res = &p_bnProcBufRes[180]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[180 + i]); +} + p_res = &p_bnProcBufRes[192]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[192 + i]); +} + p_res = &p_bnProcBufRes[204]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[204 + i]); +} + p_res = &p_bnProcBufRes[216]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[216 + i]); +} + p_res = &p_bnProcBufRes[228]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[228 + i]); +} + p_res = &p_bnProcBufRes[240]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[240 + i]); +} + p_res = &p_bnProcBufRes[252]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[252 + i]); +} + p_res = &p_bnProcBufRes[264]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[264 + i]); +} +// Process group with 24 CNs +// Process group with 25 CNs +// Process group with 26 CNs +// Process group with 27 CNs +// Process group with 28 CNs +// Process group with 29 CNs +// Process group with 30 CNs +} diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProc/nrLDPC_bnProc_BG2_R23_AVX2.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProc/nrLDPC_bnProc_BG2_R23_AVX2.c new file mode 100644 index 00000000000..59a1613099c --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProc/nrLDPC_bnProc_BG2_R23_AVX2.c @@ -0,0 +1,153 @@ +#include <stdint.h> +#include <immintrin.h> +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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[36]; + p_llrRes = (__m256i*) &llrRes [1152]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]); +} +// Process group with 3 CNs + M = (5*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[60]; + p_llrRes = (__m256i*) &llrRes [2304]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]); +} + p_res = &p_bnProcBufRes[120]; + p_llrRes = (__m256i*) &llrRes [2304]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]); +} +// Process group with 4 CNs + M = (3*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[36]; + p_llrRes = (__m256i*) &llrRes [4224]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]); +} + p_res = &p_bnProcBufRes[72]; + p_llrRes = (__m256i*) &llrRes [4224]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]); +} + p_res = &p_bnProcBufRes[108]; + p_llrRes = (__m256i*) &llrRes [4224]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]); +} +// Process group with 5 CNs + M = (2*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[24]; + p_llrRes = (__m256i*) &llrRes [5376]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]); +} + p_res = &p_bnProcBufRes[48]; + p_llrRes = (__m256i*) &llrRes [5376]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]); +} + p_res = &p_bnProcBufRes[72]; + p_llrRes = (__m256i*) &llrRes [5376]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]); +} + p_res = &p_bnProcBufRes[96]; + p_llrRes = (__m256i*) &llrRes [5376]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]); +} +// Process group with 6 CNs + M = (1*Z + 31)>>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<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]); +} + p_res = &p_bnProcBufRes[12]; + p_llrRes = (__m256i*) &llrRes [6144]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]); +} + p_res = &p_bnProcBufRes[24]; + p_llrRes = (__m256i*) &llrRes [6144]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]); +} + p_res = &p_bnProcBufRes[36]; + p_llrRes = (__m256i*) &llrRes [6144]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]); +} + p_res = &p_bnProcBufRes[48]; + p_llrRes = (__m256i*) &llrRes [6144]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]); +} + p_res = &p_bnProcBufRes[60]; + p_llrRes = (__m256i*) &llrRes [6144]; + for (i=0;i<M;i++) { + p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]); +} +// Process group with 7 CNs +// Process group with 8 CNs +// Process group with 9 CNs +// Process group with 10 CNs +// Process group with 11 CNs +// Process group with 12 CNs +// Process group with 13 CNs +// Process group with 14 CNs +// Process group with 15 CNs +// Process group with 16 CNs +// Process group with 17 CNs +// Process group with 18 CNs +// Process group with 19 CNs +// Process group with 20 CNs +// Process group with 21 CNs +// Process group with 22 CNs +// Process group with <23 CNs +// Process group with 24 CNs +// Process group with 25 CNs +// Process group with 26 CNs +// Process group with 27 CNs +// Process group with 28 CNs +// Process group with 29 CNs +// Process group with 30 CNs +} diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG1_R13_AVX2.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG1_R13_AVX2.h index a4508d2d7a3..b10a842171b 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG1_R13_AVX2.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG1_R13_AVX2.h @@ -5,20 +5,6 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* llrRes __m256i* p_llrRes; uint32_t M ; // Process group with 1 CNs - M = (42*Z + 31)>>5; - p_bnProcBuf = (__m128i*) &bnProcBuf [0]; - p_llrProcBuf = (__m128i*) &llrProcBuf [0]; - p_llrRes = (__m256i*) &llrRes [0]; - for (int i=0,j=0;i<M;i++,j+=2) { - ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]); - ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[j + 1]); - ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]); - ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0); - ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); - ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); - ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); -} // Process group with 2 CNs // Process group with 3 CNs // Process group with 4 CNs 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 47fd449fe44..8647e8cde6a 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 @@ -5,20 +5,6 @@ static inline void nrLDPC_bnProcPc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* llrRes __m256i* p_llrRes; uint32_t M ; // Process group with 1 CNs - M = (9*Z + 31)>>5; - p_bnProcBuf = (__m128i*) &bnProcBuf [0]; - p_llrProcBuf = (__m128i*) &llrProcBuf [0]; - p_llrRes = (__m256i*) &llrRes [0]; - for (int i=0,j=0;i<M;i++,j+=2) { - ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]); - ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[j + 1]); - ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]); - ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0); - ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); - ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); - ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); -} // Process group with 2 CNs M = (1*Z + 31)>>5; p_bnProcBuf = (__m128i*) &bnProcBuf [3456]; 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 8c7fa43f5d5..aee271db84d 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 @@ -5,20 +5,6 @@ static inline void nrLDPC_bnProcPc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* llrRes __m256i* p_llrRes; uint32_t M ; // Process group with 1 CNs - M = (1*Z + 31)>>5; - p_bnProcBuf = (__m128i*) &bnProcBuf [0]; - p_llrProcBuf = (__m128i*) &llrProcBuf [0]; - p_llrRes = (__m256i*) &llrRes [0]; - for (int i=0,j=0;i<M;i++,j+=2) { - ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]); - ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[j + 1]); - ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]); - ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0); - ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); - ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); - ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); - p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8); -} // Process group with 2 CNs M = (3*Z + 31)>>5; p_bnProcBuf = (__m128i*) &bnProcBuf [384]; diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG1_R13_AVX512.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG1_R13_AVX512.h new file mode 100644 index 00000000000..1db81b7a061 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG1_R13_AVX512.h @@ -0,0 +1,743 @@ +static inline void nrLDPC_bnProcPc_BG1_R13_AVX512(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { + __m512i zmm0, zmm1, zmmRes0, zmmRes1; + __m256i* p_bnProcBuf; + __m256i* p_llrProcBuf; + __m512i* p_llrRes; + uint32_t M ; +// Process group with 1 CNs + M = (42*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [0]; + p_llrProcBuf = (__m256i*) &llrProcBuf [0]; + p_llrRes = (__m512i*) &llrRes [0]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[j + 1]); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 2 CNs +// Process group with 3 CNs +// Process group with 4 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [16128]; + p_llrProcBuf = (__m256i*) &llrProcBuf [16128]; + p_llrRes = (__m512i*) &llrRes [16128]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 5 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [17664]; + p_llrProcBuf = (__m256i*) &llrProcBuf [16512]; + p_llrRes = (__m512i*) &llrRes [16512]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 6 CNs + M = (2*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [19584]; + p_llrProcBuf = (__m256i*) &llrProcBuf [16896]; + p_llrRes = (__m512i*) &llrRes [16896]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 7 CNs + M = (4*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [24192]; + p_llrProcBuf = (__m256i*) &llrProcBuf [17664]; + p_llrRes = (__m512i*) &llrRes [17664]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[192 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[192 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[240 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[240 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[288 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[288 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 8 CNs + M = (3*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [34944]; + p_llrProcBuf = (__m256i*) &llrProcBuf [19200]; + p_llrRes = (__m512i*) &llrRes [19200]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[180 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[180 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[216 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[216 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[252 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[252 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 9 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [44160]; + p_llrProcBuf = (__m256i*) &llrProcBuf [20352]; + p_llrRes = (__m512i*) &llrRes [20352]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 10 CNs + M = (4*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [47616]; + p_llrProcBuf = (__m256i*) &llrProcBuf [20736]; + p_llrRes = (__m512i*) &llrRes [20736]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[192 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[192 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[240 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[240 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[288 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[288 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[336 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[336 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[384 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[384 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[432 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[432 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 11 CNs + M = (3*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [62976]; + p_llrProcBuf = (__m256i*) &llrProcBuf [22272]; + p_llrRes = (__m512i*) &llrRes [22272]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[180 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[180 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[216 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[216 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[252 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[252 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[288 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[288 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[324 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[324 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[360 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[360 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 12 CNs + M = (4*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [75648]; + p_llrProcBuf = (__m256i*) &llrProcBuf [23424]; + p_llrRes = (__m512i*) &llrRes [23424]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[192 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[192 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[240 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[240 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[288 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[288 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[336 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[336 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[384 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[384 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[432 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[432 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[480 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[480 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[528 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[528 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 13 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [94080]; + p_llrProcBuf = (__m256i*) &llrProcBuf [24960]; + p_llrRes = (__m512i*) &llrRes [24960]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 14 CNs +// Process group with 15 CNs +// Process group with 16 CNs +// Process group with 17 CNs +// Process group with 18 CNs +// Process group with 19 CNs +// Process group with 20 CNs +// Process group with 21 CNs +// Process group with 22 CNs +// Process group with <23 CNs +// Process group with 24 CNs +// Process group with 25 CNs +// Process group with 26 CNs +// Process group with 27 CNs +// Process group with 28 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [99072]; + p_llrProcBuf = (__m256i*) &llrProcBuf [25344]; + p_llrRes = (__m512i*) &llrRes [25344]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[156 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[156 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[168 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[168 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[180 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[180 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[192 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[192 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[204 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[204 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[216 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[216 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[228 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[228 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[240 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[240 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[252 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[252 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[264 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[264 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[276 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[276 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[288 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[288 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[300 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[300 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[312 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[312 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[324 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[324 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 29 CNs +// Process group with 30 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [109824]; + p_llrProcBuf = (__m256i*) &llrProcBuf [25728]; + p_llrRes = (__m512i*) &llrRes [25728]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[156 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[156 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[168 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[168 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[180 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[180 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[192 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[192 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[204 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[204 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[216 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[216 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[228 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[228 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[240 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[240 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[252 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[252 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[264 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[264 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[276 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[276 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[288 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[288 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[300 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[300 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[312 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[312 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[324 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[324 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[336 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[336 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[348 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[348 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +} diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG1_R23_AVX512.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG1_R23_AVX512.h new file mode 100644 index 00000000000..902da267d9f --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG1_R23_AVX512.h @@ -0,0 +1,293 @@ +static inline void nrLDPC_bnProcPc_BG1_R23_AVX512(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { + __m512i zmm0, zmm1, zmmRes0, zmmRes1; + __m256i* p_bnProcBuf; + __m256i* p_llrProcBuf; + __m512i* p_llrRes; + uint32_t M ; +// Process group with 1 CNs + M = (9*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [0]; + p_llrProcBuf = (__m256i*) &llrProcBuf [0]; + p_llrRes = (__m512i*) &llrRes [0]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[j + 1]); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 2 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [3456]; + p_llrProcBuf = (__m256i*) &llrProcBuf [3456]; + p_llrRes = (__m512i*) &llrRes [3456]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[j + 1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 3 CNs + M = (5*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [4224]; + p_llrProcBuf = (__m256i*) &llrProcBuf [3840]; + p_llrRes = (__m512i*) &llrRes [3840]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 4 CNs + M = (3*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [9984]; + p_llrProcBuf = (__m256i*) &llrProcBuf [5760]; + p_llrRes = (__m512i*) &llrRes [5760]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 5 CNs + M = (7*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [14592]; + p_llrProcBuf = (__m256i*) &llrProcBuf [6912]; + p_llrRes = (__m512i*) &llrRes [6912]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[168 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[168 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[252 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[252 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[336 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[336 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 6 CNs + M = (8*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [28032]; + p_llrProcBuf = (__m256i*) &llrProcBuf [9600]; + p_llrRes = (__m512i*) &llrRes [9600]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[192 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[192 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[288 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[288 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[384 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[384 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[480 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[480 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 7 CNs +// Process group with 8 CNs +// Process group with 9 CNs +// Process group with 10 CNs +// Process group with 11 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [46464]; + p_llrProcBuf = (__m256i*) &llrProcBuf [12672]; + p_llrRes = (__m512i*) &llrRes [12672]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 12 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [50688]; + p_llrProcBuf = (__m256i*) &llrProcBuf [13056]; + p_llrRes = (__m512i*) &llrRes [13056]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 13 CNs +// Process group with 14 CNs +// Process group with 15 CNs +// Process group with 16 CNs +// Process group with 17 CNs +// Process group with 18 CNs +// Process group with 19 CNs +// Process group with 20 CNs +// Process group with 21 CNs +// Process group with 22 CNs +// Process group with <23 CNs +// Process group with 24 CNs +// Process group with 25 CNs +// Process group with 26 CNs +// Process group with 27 CNs +// Process group with 28 CNs +// Process group with 29 CNs +// Process group with 30 CNs +} diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG1_R89_AVX512.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG1_R89_AVX512.h new file mode 100644 index 00000000000..4731c417df7 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG1_R89_AVX512.h @@ -0,0 +1,147 @@ +static inline void nrLDPC_bnProcPc_BG1_R89_AVX512(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { + __m512i zmm0, zmm1, zmmRes0, zmmRes1; + __m256i* p_bnProcBuf; + __m256i* p_llrProcBuf; + __m512i* p_llrRes; + uint32_t M ; +// Process group with 1 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [0]; + p_llrProcBuf = (__m256i*) &llrProcBuf [0]; + p_llrRes = (__m512i*) &llrRes [0]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[j + 1]); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 2 CNs + M = (3*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [384]; + p_llrProcBuf = (__m256i*) &llrProcBuf [384]; + p_llrRes = (__m512i*) &llrRes [384]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[j + 1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 3 CNs + M = (21*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [2688]; + p_llrProcBuf = (__m256i*) &llrProcBuf [1536]; + p_llrRes = (__m512i*) &llrRes [1536]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[252 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[252 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[504 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[504 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 4 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [26880]; + p_llrProcBuf = (__m256i*) &llrProcBuf [9600]; + p_llrRes = (__m512i*) &llrRes [9600]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 5 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [28416]; + p_llrProcBuf = (__m256i*) &llrProcBuf [9984]; + p_llrRes = (__m512i*) &llrRes [9984]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 6 CNs +// Process group with 7 CNs +// Process group with 8 CNs +// Process group with 9 CNs +// Process group with 10 CNs +// Process group with 11 CNs +// Process group with 12 CNs +// Process group with 13 CNs +// Process group with 14 CNs +// Process group with 15 CNs +// Process group with 16 CNs +// Process group with 17 CNs +// Process group with 18 CNs +// Process group with 19 CNs +// Process group with 20 CNs +// Process group with 21 CNs +// Process group with 22 CNs +// Process group with <23 CNs +// Process group with 24 CNs +// Process group with 25 CNs +// Process group with 26 CNs +// Process group with 27 CNs +// Process group with 28 CNs +// Process group with 29 CNs +// Process group with 30 CNs +} diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG2_R13_AVX512.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG2_R13_AVX512.h new file mode 100644 index 00000000000..67fc3eea3d3 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG2_R13_AVX512.h @@ -0,0 +1,441 @@ +static inline void nrLDPC_bnProcPc_BG2_R13_AVX512(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { + __m512i zmm0,zmm1,zmmRes0,zmmRes1; + __m256i* p_bnProcBuf; + __m256i* p_llrProcBuf; + __m512i* p_llrRes; + uint32_t M ; +// Process group with 1 CNs + M = (18*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [0]; + p_llrProcBuf = (__m256i*) &llrProcBuf [0]; + p_llrRes = (__m512i*) &llrRes [0]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[j+1]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 2 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [6912]; + p_llrProcBuf = (__m256i*) &llrProcBuf [6912]; + p_llrRes = (__m512i*) &llrRes [6912]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[j + 1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 3 CNs +// Process group with 4 CNs + M = (2*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [7680]; + p_llrProcBuf = (__m256i*) &llrProcBuf [7296]; + p_llrRes = (__m512i*) &llrRes [7296]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 5 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [10752]; + p_llrProcBuf = (__m256i*) &llrProcBuf [8064]; + p_llrRes = (__m512i*) &llrRes [8064]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 6 CNs + M = (5*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [12672]; + p_llrProcBuf = (__m256i*) &llrProcBuf [8448]; + p_llrRes = (__m512i*) &llrRes [8448]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[180 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[180 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[240 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[240 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[300 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[300 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 7 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [24192]; + p_llrProcBuf = (__m256i*) &llrProcBuf [10368]; + p_llrRes = (__m512i*) &llrRes [10368]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 8 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [26880]; + p_llrProcBuf = (__m256i*) &llrProcBuf [10752]; + p_llrRes = (__m512i*) &llrRes [10752]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 9 CNs +// Process group with 10 CNs +// Process group with 11 CNs +// Process group with 12 CNs +// Process group with 13 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [29952]; + p_llrProcBuf = (__m256i*) &llrProcBuf [11136]; + p_llrRes = (__m512i*) &llrRes [11136]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 14 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [34944]; + p_llrProcBuf = (__m256i*) &llrProcBuf [11520]; + p_llrRes = (__m512i*) &llrRes [11520]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[156 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[156 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 15 CNs +// Process group with 16 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [40320]; + p_llrProcBuf = (__m256i*) &llrProcBuf [11904]; + p_llrRes = (__m512i*) &llrRes [11904]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[156 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[156 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[168 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[168 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[180 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[180 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 17 CNs +// Process group with 18 CNs +// Process group with 19 CNs +// Process group with 20 CNs +// Process group with 21 CNs +// Process group with 22 CNs +// Process group with <23 CNs +// Process group with 24 CNs +// Process group with 25 CNs +// Process group with 26 CNs +// Process group with 27 CNs +// Process group with 28 CNs +// Process group with 29 CNs +// Process group with 30 CNs +} diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG2_R15_AVX512.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG2_R15_AVX512.h new file mode 100644 index 00000000000..b6fce03ca4c --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG2_R15_AVX512.h @@ -0,0 +1,751 @@ +static inline void nrLDPC_bnProcPc_BG2_R15_AVX512(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { + __m512i zmm0,zmm1,zmmRes0,zmmRes1; + __m256i* p_bnProcBuf; + __m256i* p_llrProcBuf; + __m512i* p_llrRes; + uint32_t M ; +// Process group with 1 CNs + M = (38*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [0]; + p_llrProcBuf = (__m256i*) &llrProcBuf [0]; + p_llrRes = (__m512i*) &llrRes [0]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[j+1]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 2 CNs +// Process group with 3 CNs +// Process group with 4 CNs +// Process group with 5 CNs + M = (2*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [14592]; + p_llrProcBuf = (__m256i*) &llrProcBuf [14592]; + p_llrRes = (__m512i*) &llrRes [14592]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 6 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [18432]; + p_llrProcBuf = (__m256i*) &llrProcBuf [15360]; + p_llrRes = (__m512i*) &llrRes [15360]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 7 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [20736]; + p_llrProcBuf = (__m256i*) &llrProcBuf [15744]; + p_llrRes = (__m512i*) &llrRes [15744]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 8 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [23424]; + p_llrProcBuf = (__m256i*) &llrProcBuf [16128]; + p_llrRes = (__m512i*) &llrRes [16128]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 9 CNs + M = (2*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [26496]; + p_llrProcBuf = (__m256i*) &llrProcBuf [16512]; + p_llrRes = (__m512i*) &llrRes [16512]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[168 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[168 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[192 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[192 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 10 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [33408]; + p_llrProcBuf = (__m256i*) &llrProcBuf [17280]; + p_llrRes = (__m512i*) &llrRes [17280]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 11 CNs +// Process group with 12 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [37248]; + p_llrProcBuf = (__m256i*) &llrProcBuf [17664]; + p_llrRes = (__m512i*) &llrRes [17664]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 13 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [41856]; + p_llrProcBuf = (__m256i*) &llrProcBuf [18048]; + p_llrRes = (__m512i*) &llrRes [18048]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 14 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [46848]; + p_llrProcBuf = (__m256i*) &llrProcBuf [18432]; + p_llrRes = (__m512i*) &llrRes [18432]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[156 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[156 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 15 CNs +// Process group with 16 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [52224]; + p_llrProcBuf = (__m256i*) &llrProcBuf [18816]; + p_llrRes = (__m512i*) &llrRes [18816]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[156 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[156 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[168 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[168 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[180 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[180 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 17 CNs +// Process group with 18 CNs +// Process group with 19 CNs +// Process group with 20 CNs +// Process group with 21 CNs +// Process group with 22 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [58368]; + p_llrProcBuf = (__m256i*) &llrProcBuf [19200]; + p_llrRes = (__m512i*) &llrRes [19200]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[156 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[156 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[168 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[168 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[180 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[180 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[192 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[192 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[204 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[204 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[216 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[216 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[228 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[228 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[240 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[240 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[252 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[252 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with <23 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [66816]; + p_llrProcBuf = (__m256i*) &llrProcBuf [19584]; + p_llrRes = (__m512i*) &llrRes [19584]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[84 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[132 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[144 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[156 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[156 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[168 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[168 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[180 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[180 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[192 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[192 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[204 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[204 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[216 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[216 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[228 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[228 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[240 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[240 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[252 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[252 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[264 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[264 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 24 CNs +// Process group with 25 CNs +// Process group with 26 CNs +// Process group with 27 CNs +// Process group with 28 CNs +// Process group with 29 CNs +// Process group with 30 CNs +} diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG2_R23_AVX512.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG2_R23_AVX512.h new file mode 100644 index 00000000000..6330988dd3a --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG2_R23_AVX512.h @@ -0,0 +1,181 @@ +static inline void nrLDPC_bnProcPc_BG2_R23_AVX512(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { + __m512i zmm0,zmm1,zmmRes0,zmmRes1; + __m256i* p_bnProcBuf; + __m256i* p_llrProcBuf; + __m512i* p_llrRes; + uint32_t M ; +// Process group with 1 CNs + M = (3*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [0]; + p_llrProcBuf = (__m256i*) &llrProcBuf [0]; + p_llrRes = (__m512i*) &llrRes [0]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[j+1]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 2 CNs + M = (3*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [1152]; + p_llrProcBuf = (__m256i*) &llrProcBuf [1152]; + p_llrRes = (__m512i*) &llrRes [1152]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[j + 1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 3 CNs + M = (5*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [3456]; + p_llrProcBuf = (__m256i*) &llrProcBuf [2304]; + p_llrRes = (__m512i*) &llrRes [2304]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[120 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 4 CNs + M = (3*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [9216]; + p_llrProcBuf = (__m256i*) &llrProcBuf [4224]; + p_llrRes = (__m512i*) &llrRes [4224]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[108 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 5 CNs + M = (2*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [13824]; + p_llrProcBuf = (__m256i*) &llrProcBuf [5376]; + p_llrRes = (__m512i*) &llrRes [5376]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[96 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 6 CNs + M = (1*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [17664]; + p_llrProcBuf = (__m256i*) &llrProcBuf [6144]; + p_llrRes = (__m512i*) &llrRes [6144]; + for (int i=0,j=0;i<M;i++,j+=2) { + zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf [j]); + zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf [j +1]); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[12 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[36 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[48 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[60 + j +1]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]); + zmmRes0 = _mm512_adds_epi16(zmmRes0,zmm0); + zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j +1 ]); + zmmRes1 = _mm512_adds_epi16(zmmRes1,zmm1); + zmm0 = _mm512_packs_epi16(zmmRes0,zmmRes1); + p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8); +} +// Process group with 7 CNs +// Process group with 8 CNs +// Process group with 9 CNs +// Process group with 10 CNs +// Process group with 11 CNs +// Process group with 12 CNs +// Process group with 13 CNs +// Process group with 14 CNs +// Process group with 15 CNs +// Process group with 16 CNs +// Process group with 17 CNs +// Process group with 18 CNs +// Process group with 19 CNs +// Process group with 20 CNs +// Process group with 21 CNs +// Process group with 22 CNs +// Process group with <23 CNs +// Process group with 24 CNs +// Process group with 25 CNs +// Process group with 26 CNs +// Process group with 27 CNs +// Process group with 28 CNs +// Process group with 29 CNs +// Process group with 30 CNs +} -- GitLab