diff --git a/docker/Dockerfile.build.ubuntu20.cross-arm64 b/docker/Dockerfile.build.ubuntu20.cross-arm64 index 058d9a091f..b5f770a485 100644 --- a/docker/Dockerfile.build.ubuntu20.cross-arm64 +++ b/docker/Dockerfile.build.ubuntu20.cross-arm64 @@ -34,14 +34,14 @@ COPY . . # build all targets so final targets can be created afterwards RUN /bin/sh oaienv && \ cd cmake_targets && \ - mkdir -p ran_build/build ran_build/build-cross && \ + mkdir -p log ran_build/build ran_build/build-cross && \ cd ran_build/build && \ cmake ../../.. -GNinja && \ echo "====== Start of log for host-tools ======" && \ - ninja ldpc_generators generate_T && \ + ninja ldpc_generators generate_T > ../../log/host-tools.txt 2>&1 && \ echo "====== End of log for host-tools ======" && \ cd ../build-cross/ && \ cmake ../../.. -GNinja -DCMAKE_TOOLCHAIN_FILE=../../../cmake_targets/cross-arm.cmake -DNATIVE_DIR=../build && \ echo "====== Start of log for cross-build executables ======" && \ - ninja dlsim ulsim ldpctest polartest smallblocktest nr_pbchsim nr_dlschsim nr_ulschsim nr_dlsim nr_ulsim nr_pucchsim nr_prachsim lte-softmodem nr-softmodem nr-cuup oairu lte-uesoftmodem nr-uesoftmodem params_libconfig coding rfsimulator && \ + ninja dlsim ulsim ldpctest polartest smallblocktest nr_pbchsim nr_dlschsim nr_ulschsim nr_dlsim nr_ulsim nr_pucchsim nr_prachsim lte-softmodem nr-softmodem nr-cuup oairu lte-uesoftmodem nr-uesoftmodem params_libconfig coding rfsimulator > ../../log/all.txt 2>&1 && \ echo "====== End of log for cross-build executables ======" diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 1d5b732529..bdec751f79 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -686,7 +686,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB) int n_buf = Prx*max_ul_mimo_layers; int nb_re_pusch = N_RB_UL * NR_NB_SC_PER_RB; - int nb_re_pusch2 = (nb_re_pusch + 7) & ~7; + int nb_re_pusch2 = (nb_re_pusch + 15) & ~15; gNB->pusch_vars = (NR_gNB_PUSCH *)malloc16_clear(gNB->max_nb_pusch * sizeof(NR_gNB_PUSCH)); for (int ULSCH_id = 0; ULSCH_id < gNB->max_nb_pusch; ULSCH_id++) { diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c index 18aea849f7..afa1dac143 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c @@ -1146,9 +1146,8 @@ static uint8_t nr_ulsch_mmse_2layers(NR_DL_FRAME_PARMS *frame_parms, simde__m128i *after_mf_c_128 = (simde__m128i *)af_mf_10; simde__m128i *after_mf_d_128 = (simde__m128i *)af_mf_11; - int rxComp_aligned = ((nb_rb * 12) % 8) ? (8 - (nb_rb * 12) % 8) : 0; - simde__m128i *rxdataF_comp128_0 = (simde__m128i *)&rxdataF_comp[0][symbol * (nb_rb * 12 + rxComp_aligned)]; - simde__m128i *rxdataF_comp128_1 = (simde__m128i *)&rxdataF_comp[n_rx][symbol * (nb_rb * 12 + rxComp_aligned)]; + simde__m128i *rxdataF_comp128_0 = (simde__m128i *)&rxdataF_comp[0][symbol * buffer_length]; + simde__m128i *rxdataF_comp128_1 = (simde__m128i *)&rxdataF_comp[n_rx][symbol * buffer_length]; if (mod_order > 2) { if (mod_order == 4) { @@ -1277,7 +1276,7 @@ static void inner_rx (PHY_VARS_gNB *gNB, int nb_layer = rel15_ul->nrOfLayers; int nb_rx_ant = frame_parms->nb_antennas_rx; int dmrs_symbol_flag = (rel15_ul->ul_dmrs_symb_pos >> symbol) & 0x01; - int buffer_length = (rel15_ul->rb_size * NR_NB_SC_PER_RB + 7) & ~7; + int buffer_length = (rel15_ul->rb_size * NR_NB_SC_PER_RB + 15) & ~15; c16_t rxFext[nb_rx_ant][buffer_length] __attribute__((aligned(32))); c16_t chFext[nb_layer][nb_rx_ant][buffer_length] __attribute__((aligned(32))); @@ -1578,8 +1577,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, // extract the data in the OFDM frame, to the start of the array int soffset = (slot&3)*frame_parms->symbols_per_slot*frame_parms->ofdm_symbol_size; - if (nb_re_pusch & 7) - nb_re_pusch += 8 - (nb_re_pusch & 7); + nb_re_pusch = (nb_re_pusch + 15) & ~15; for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) for (int aatx = 0; aatx < rel15_ul->nrOfLayers; aatx++) diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c index 1649f57878..de5639a149 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c @@ -35,7 +35,9 @@ #include "PHY/sse_intrin.h" #include "PHY/impl_defs_top.h" - +#ifdef __aarch64__ +#define USE_128BIT +#endif //---------------------------------------------------------------------------------------------- // QPSK @@ -63,6 +65,26 @@ void nr_ulsch_16qam_llr(int32_t *rxdataF_comp, uint32_t nb_re, uint8_t symbol) { +#ifdef USE_128BIT + simde__m128i *rxF = (simde__m128i*)rxdataF_comp; + simde__m128i *ch_mag; + simde__m128i *ulsch_llr_128 = (simde__m128i*) ulsch_llr; + int i; + + ch_mag = (simde__m128i*)ul_ch_mag; + nb_re >>= 2; // length in quad words (4 REs) + nb_re += ((nb_re&3) == 0 ? 0 : 1); + + // Each iteration does 4 RE (gives 16 16bit-llrs) + for (i=0; i |y_R|, registers of odd index in xmm0-> |y_I| + xmm0 = simde_mm_subs_epi16(ch_mag[i],xmm0); // registers of even index in xmm0-> |y_R|-|h|^2, registers of odd index in xmm0-> |y_I|-|h|^2 + + ulsch_llr_128[0] = simde_mm_unpacklo_epi32(rxF[i],xmm0); // llr128[0] contains the llrs of the 1st,2nd,5th and 6th REs + ulsch_llr_128[1] = simde_mm_unpackhi_epi32(rxF[i],xmm0); // llr128[1] contains the llrs of the 3rd, 4th, 7th and 8th REs + ulsch_llr_128 += 2; + } +#else simde__m256i *rxF_256 = (simde__m256i*)rxdataF_comp; simde__m256i *ch_mag = (simde__m256i*)ul_ch_mag; int64_t *llr_64 = (int64_t*)ulsch_llr; @@ -88,6 +110,8 @@ void nr_ulsch_16qam_llr(int32_t *rxdataF_comp, *llr_64++ = simde_mm256_extract_epi64(xmm2, 2); *llr_64++ = simde_mm256_extract_epi64(xmm2, 3); } +#endif + simde_mm_empty(); } //---------------------------------------------------------------------------------------------- @@ -101,6 +125,34 @@ void nr_ulsch_64qam_llr(int32_t *rxdataF_comp, uint32_t nb_re, uint8_t symbol) { +#ifdef USE_128BIT + simde__m128i *rxF = (simde__m128i*)rxdataF_comp; + simde__m128i *ch_mag = (simde__m128i*)ul_ch_mag; + simde__m128i *ch_magb = (simde__m128i*)ul_ch_magb; + int i; + + nb_re = nb_re>>2; // length in 128-bit words (4 REs) + nb_re += ((nb_re&3) == 0 ? 0 : 1); + simde__m64 *llr64 = (simde__m64 *) ulsch_llr; + + // Each iteration does 4 RE (gives 24 16bit-llrs) + for (i=0; i> 2; // length in 128-bit words (4 REs) + + for (int i=0; i |y_R|, registers of odd index in xmm0-> |y_I| + xmm0 = simde_mm_subs_epi16(ch_mag[i], xmm0); // registers of even index in xmm0-> |y_R|-|h|^2, registers of odd index in xmm0-> |y_I|-|h|^2 + xmm1 = simde_mm_abs_epi16(xmm0); + xmm1 = simde_mm_subs_epi16(ch_magb[i], xmm1); // contains 8 LLRs + xmm2 = simde_mm_abs_epi16(xmm1); + xmm2 = simde_mm_subs_epi16(ch_magc[i], xmm2); // contains 8 LLRs + // rxF[i] A0 A1 A2 A3 + // xmm0 B0 B1 B2 B3 + // xmm1 C0 C1 C2 C3 + // xmm2 D0 D1 D2 D3 + xmm3 = simde_mm_unpacklo_epi32(rxF[i], xmm0); // A0 B0 A1 B1 + xmm4 = simde_mm_unpackhi_epi32(rxF[i], xmm0); // A2 B2 A3 B3 + xmm5 = simde_mm_unpacklo_epi32(xmm1, xmm2); // C0 D0 C1 D1 + xmm6 = simde_mm_unpackhi_epi32(xmm1, xmm2); // C2 D2 C3 D3 + + llr128[0] = simde_mm_unpacklo_epi64(xmm3,xmm5); // A0 B0 C0 D0 + llr128[1] = simde_mm_unpackhi_epi64(xmm3,xmm5); // A1 B1 C1 D1 + llr128[2] = simde_mm_unpacklo_epi64(xmm4,xmm6); // A2 B2 C2 D2 + llr128[3] = simde_mm_unpackhi_epi64(xmm4,xmm6); // A3 B3 C3 D3 + llr128+=4; + } + + if (len_mod4) { + int last_2_re = (nb_re >> 1) - 1; + simde__m64 *llr64 = (simde__m64 *)llr128; + simde__m64 xmm0,xmm1,xmm2; + simde__m64 *rxF = (simde__m64*)rxdataF_comp; + simde__m64 *ch_mag = (simde__m64*)ul_ch_mag; + simde__m64 *ch_magb = (simde__m64*)ul_ch_magb; + simde__m64 *ch_magc = (simde__m64*)ul_ch_magc; + + xmm0 = simde_mm_abs_pi16(rxF[last_2_re]); // registers of even index in xmm0-> |y_R|, registers of odd index in xmm0-> |y_I| + xmm0 = simde_mm_subs_pi16(ch_mag[last_2_re],xmm0); // registers of even index in xmm0-> |y_R|-|h|^2, registers of odd index in xmm0-> |y_I|-|h|^2 + // xmmtmpD2 contains 4 LLRs + xmm1 = simde_mm_abs_pi16(xmm0); + xmm1 = simde_mm_subs_pi16(ch_magb[last_2_re],xmm1); // contains 4 LLRs + xmm2 = simde_mm_abs_pi16(xmm1); + xmm2 = simde_mm_subs_pi16(ch_magc[last_2_re],xmm2); // contains 4 LLRs + // rxF[i] A0 A1 + // xmm0 B0 B1 + // xmm1 C0 C1 + // xmm2 D0 D1 + llr64[0] = simde_mm_unpacklo_pi32(rxF[last_2_re],xmm0); // A0 B0 + llr64[2] = simde_mm_unpackhi_pi32(rxF[last_2_re],xmm0); // A1 B1 + llr64[1] = simde_mm_unpacklo_pi32(xmm1,xmm2); // C0 D0 + llr64[3] = simde_mm_unpackhi_pi32(xmm1,xmm2); // C1 D1 + } +#else simde__m256i *rxF = (simde__m256i*)rxdataF_comp; simde__m256i xmm0,xmm1,xmm2,xmm3,xmm4,xmm5,xmm6; simde__m256i *llr256=(simde__m256i*)ulsch_llr; @@ -195,6 +309,8 @@ void nr_ulsch_256qam_llr(int32_t *rxdataF_comp, *llr256++ = simde_mm256_permute2x128_si256(xmm0, xmm1, 0x31); // A4 B4 C4 D4 A5 B5 C5 D5 *llr256++ = simde_mm256_permute2x128_si256(xmm2, xmm3, 0x31); // A6 B6 C6 D6 A7 B7 C7 D7 } +#endif + simde_mm_empty(); } void nr_ulsch_compute_llr(int32_t *rxdataF_comp, @@ -258,6 +374,7 @@ void nr_ulsch_compute_llr(int32_t *rxdataF_comp, */ void nr_ulsch_qpsk_qpsk(c16_t *stream0_in, c16_t *stream1_in, c16_t *stream0_out, c16_t *rho01, uint32_t length) { +#ifdef USE_128BIT simde__m128i *rho01_128i = (simde__m128i *)rho01; simde__m128i *stream0_128i_in = (simde__m128i *)stream0_in; simde__m128i *stream1_128i_in = (simde__m128i *)stream1_in; @@ -406,46 +523,257 @@ void nr_ulsch_qpsk_qpsk(c16_t *stream0_in, c16_t *stream1_in, c16_t *stream0_out simde_mm_storeu_si128(&stream0_128i_out[i + 1], simde_mm_unpackhi_epi16(y0r, y0i)); } } +#else + simde__m256i *rho01_256i = (simde__m256i *)rho01; + simde__m256i *stream0_256i_in = (simde__m256i *)stream0_in; + simde__m256i *stream1_256i_in = (simde__m256i *)stream1_in; + simde__m256i *stream0_256i_out = (simde__m256i *)stream0_out; + simde__m256i ONE_OVER_2_SQRT_2 = simde_mm256_set1_epi16(23170); // round(2 ^ 16 / (2 * sqrt(2))) + + // In each iteration, we take 16 complex symbols + for (int i = 0; i < length >> 3; i += 2) { + + /// Compute real and imaginary parts of MF output for stream 0 (desired stream) + simde__m256i y0r, y0i; + simde_mm256_separate_real_imag_parts(&y0r, &y0i, stream0_256i_in[i], stream0_256i_in[i + 1]); + simde__m256i y0r_over2 = simde_mm256_mulhi_epi16(y0r, ONE_OVER_2_SQRT_2); + y0r_over2 = simde_mm256_slli_epi16(y0r_over2, 1); // y0r_over2 = Re(y0) / sqrt(2) + simde__m256i y0i_over2 = simde_mm256_mulhi_epi16(y0i, ONE_OVER_2_SQRT_2); + y0i_over2 = simde_mm256_slli_epi16(y0i_over2, 1); // y0i_over2 = Im(y0) / sqrt(2) + + /// Compute real and imaginary parts of MF output for stream 1 (interference stream) + simde__m256i y1r_over2, y1i_over2; + simde_mm256_separate_real_imag_parts(&y1r_over2, &y1i_over2, stream1_256i_in[i], stream1_256i_in[i + 1]); + y1r_over2 = simde_mm256_srai_epi16(y1r_over2, 1); // y1r_over2 = Re(y1) / 2 + y1i_over2 = simde_mm256_srai_epi16(y1i_over2, 1); // y1i_over2 = Im(y1) / 2 + + /// Get real and imaginary parts of rho + simde__m256i rhor, rhoi; + simde_mm256_separate_real_imag_parts(&rhor, &rhoi, rho01_256i[i], rho01_256i[i + 1]); + + /// Compute |psi_r| and |psi_i| + + // psi_r = rhor * xR + rhoi * xI + // psi_i = rhor * xI - rhoi * xR + + // Put (rho_r + rho_i)/(2*sqrt(2)) in rho_p + // rhor * xR + rhoi * xI --> xR = 1/sqrt(2) and xI = 1/sqrt(2) + // rhor * xI - rhoi * xR --> xR = -1/sqrt(2) and xI = 1/sqrt(2) + simde__m256i rho_p = simde_mm256_adds_epi16(rhor, rhoi); // rho_p = Re(rho) + Im(rho) + rho_p = simde_mm256_mulhi_epi16(rho_p, ONE_OVER_2_SQRT_2); // rho_p = rho_p / (2*sqrt(2)) + + // Put (rho_r - rho_i)/(2*sqrt(2)) in rho_m + // rhor * xR + rhoi * xI --> xR = 1/sqrt(2) and xI = -1/sqrt(2) + // rhor * xI - rhoi * xR --> xR = 1/sqrt(2) and xI = 1/sqrt(2) + simde__m256i rho_m = simde_mm256_subs_epi16(rhor, rhoi); // rho_m = Re(rho) - Im(rho) + rho_m = simde_mm256_mulhi_epi16(rho_m, ONE_OVER_2_SQRT_2); // rho_m = rho_m / (2*sqrt(2)) + + // xR = 1/sqrt(2) and xI = 1/sqrt(2) + simde__m256i abs_psi_rpm = simde_mm256_subs_epi16(rho_p, y1r_over2); // psi_rpm = rho_p - y1r/2 + abs_psi_rpm = simde_mm256_abs_epi16(abs_psi_rpm); // abs_psi_rpm = |psi_rpm| + + // xR = 1/sqrt(2) and xI = 1/sqrt(2) + simde__m256i abs_psi_imm = simde_mm256_subs_epi16(rho_m, y1i_over2); // psi_imm = rho_m - y1i/2 + abs_psi_imm = simde_mm256_abs_epi16(abs_psi_imm); // abs_psi_imm = |psi_imm| + + // xR = 1/sqrt(2) and xI = -1/sqrt(2) + simde__m256i abs_psi_rmm = simde_mm256_subs_epi16(rho_m, y1r_over2); // psi_rmm = rho_m - y1r/2 + abs_psi_rmm = simde_mm256_abs_epi16(abs_psi_rmm); // abs_psi_rmm = |psi_rmm| + + // xR = -1/sqrt(2) and xI = 1/sqrt(2) + simde__m256i abs_psi_ipm = simde_mm256_subs_epi16(rho_p, y1i_over2); // psi_ipm = rho_p - y1i/2 + abs_psi_ipm = simde_mm256_abs_epi16(abs_psi_ipm); // abs_psi_ipm = |psi_ipm| + + // xR = -1/sqrt(2) and xI = -1/sqrt(2) + simde__m256i abs_psi_rpp = simde_mm256_adds_epi16(rho_p, y1r_over2); // psi_rpp = rho_p + y1r/2 + abs_psi_rpp = simde_mm256_abs_epi16(abs_psi_rpp); // abs_psi_rpp = |psi_rpp| + + // xR = -1/sqrt(2) and xI = -1/sqrt(2) + simde__m256i abs_psi_imp = simde_mm256_adds_epi16(rho_m, y1i_over2); // psi_imp = rho_m + y1i/2 + abs_psi_imp = simde_mm256_abs_epi16(abs_psi_imp); // abs_psi_imp = |psi_imp| + + // xR = -1/sqrt(2) and xI = 1/sqrt(2) + simde__m256i abs_psi_rmp = simde_mm256_adds_epi16(rho_m, y1r_over2); // psi_rmp = rho_m + y1r/2 + abs_psi_rmp = simde_mm256_abs_epi16(abs_psi_rmp); // abs_psi_rmp = |psi_rmp| + + // xR = 1/sqrt(2) and xI = -1/sqrt(2) + simde__m256i abs_psi_ipp = simde_mm256_adds_epi16(rho_p, y1i_over2); // psi_ipm = rho_p + y1i/2 + abs_psi_ipp = simde_mm256_abs_epi16(abs_psi_ipp); // abs_psi_ipp = |psi_ipm| + + /// Compute bit metrics (lambda) + + // lambda = max { |psi_r - y1r| * |x2R| + |psi_i - y1i| * |x2I| + y0r * xR + y0i * xI} + + // xR = 1/sqrt(2) and xI = 1/sqrt(2) + // For numerator: bit_met_num_re_p = abs_psi_rpm + abs_psi_imm + y0r/sqrt(2) + y0i/sqrt(2) + simde__m256i bit_met_num_re_p = simde_mm256_adds_epi16(abs_psi_rpm, abs_psi_imm); + bit_met_num_re_p = simde_mm256_adds_epi16(bit_met_num_re_p, y0r_over2); + bit_met_num_re_p = simde_mm256_adds_epi16(bit_met_num_re_p, y0i_over2); + + // xR = 1/sqrt(2) and xI = -1/sqrt(2) + // For numerator: bit_met_num_re_m = abs_psi_rmm + abs_psi_ipp + y0r/sqrt(2) - y0i/sqrt(2) + simde__m256i bit_met_num_re_m = simde_mm256_adds_epi16(abs_psi_rmm, abs_psi_ipp); + bit_met_num_re_m = simde_mm256_adds_epi16(bit_met_num_re_m, y0r_over2); + bit_met_num_re_m = simde_mm256_subs_epi16(bit_met_num_re_m, y0i_over2); + + // xR = -1/sqrt(2) and xI = 1/sqrt(2) + // For denominator: bit_met_den_re_p = abs_psi_rmp + abs_psi_ipm - y0r/sqrt(2) + y0i/sqrt(2) + simde__m256i bit_met_den_re_p = simde_mm256_adds_epi16(abs_psi_rmp, abs_psi_ipm); + bit_met_den_re_p = simde_mm256_subs_epi16(bit_met_den_re_p, y0r_over2); + bit_met_den_re_p = simde_mm256_adds_epi16(bit_met_den_re_p, y0i_over2); + + // xR = -1/sqrt(2) and xI = -1/sqrt(2) + // For denominator: bit_met_den_re_m = abs_psi_rpp + abs_psi_imp - y0r/sqrt(2) - y0i/sqrt(2) + simde__m256i bit_met_den_re_m = simde_mm256_adds_epi16(abs_psi_rpp, abs_psi_imp); + bit_met_den_re_m = simde_mm256_subs_epi16(bit_met_den_re_m, y0r_over2); + bit_met_den_re_m = simde_mm256_subs_epi16(bit_met_den_re_m, y0i_over2); + + // xR = 1/sqrt(2) and xI = 1/sqrt(2) + // For numerator: bit_met_num_im_p = abs_psi_rpm + abs_psi_imm + y0r/sqrt(2) + y0i/sqrt(2) + simde__m256i bit_met_num_im_p = simde_mm256_adds_epi16(abs_psi_rpm, abs_psi_imm); + bit_met_num_im_p = simde_mm256_adds_epi16(bit_met_num_im_p, y0r_over2); + bit_met_num_im_p = simde_mm256_adds_epi16(bit_met_num_im_p, y0i_over2); + + // xR = -1/sqrt(2) and xI = 1/sqrt(2) + // For numerator: bit_met_num_im_m = abs_psi_rmp + abs_psi_ipm - y0r/sqrt(2) + y0i/sqrt(2) + simde__m256i bit_met_num_im_m = simde_mm256_adds_epi16(abs_psi_rmp, abs_psi_ipm); + bit_met_num_im_m = simde_mm256_subs_epi16(bit_met_num_im_m, y0r_over2); + bit_met_num_im_m = simde_mm256_adds_epi16(bit_met_num_im_m, y0i_over2); + + // xR = 1/sqrt(2) and xI = -1/sqrt(2) + // For denominator: bit_met_den_im_p = abs_psi_rmm + abs_psi_ipp + y0r/sqrt(2) - y0i/sqrt(2) + simde__m256i bit_met_den_im_p = simde_mm256_adds_epi16(abs_psi_rmm, abs_psi_ipp); + bit_met_den_im_p = simde_mm256_adds_epi16(bit_met_den_im_p, y0r_over2); + bit_met_den_im_p = simde_mm256_subs_epi16(bit_met_den_im_p, y0i_over2); + + // xR = -1/sqrt(2) and xI = -1/sqrt(2) + // For denominator: bit_met_den_im_m = abs_psi_rpp + abs_psi_imp - y0r/sqrt(2)- y0i/sqrt(2) + simde__m256i bit_met_den_im_m = simde_mm256_adds_epi16(abs_psi_rpp, abs_psi_imp); + bit_met_den_im_m = simde_mm256_subs_epi16(bit_met_den_im_m, y0r_over2); + bit_met_den_im_m = simde_mm256_subs_epi16(bit_met_den_im_m, y0i_over2); + + /// Compute the LLRs + + // LLR = lambda(c==1) - lambda(c==0) + + simde__m256i logmax_num_re0 = simde_mm256_max_epi16(bit_met_num_re_p, bit_met_num_re_m); // LLR of the first bit: Bit = 1 + simde__m256i logmax_den_re0 = simde_mm256_max_epi16(bit_met_den_re_p, bit_met_den_re_m); // LLR of the first bit: Bit = 0 + simde__m256i logmax_num_im0 = simde_mm256_max_epi16(bit_met_num_im_p, bit_met_num_im_m); // LLR of the second bit: Bit = 1 + simde__m256i logmax_den_im0 = simde_mm256_max_epi16(bit_met_den_im_p, bit_met_den_im_m); // LLR of the second bit: Bit = 0 + + y0r = simde_mm256_subs_epi16(logmax_num_re0, logmax_den_re0); // LLR of first bit [L1(1), L1(2), L1(3), L1(4), L1(5), L1(6), L1(7), L1(8)] + y0i = simde_mm256_subs_epi16(logmax_num_im0, logmax_den_im0); // LLR of second bit [L2(1), L2(2), L2(3), L2(4), L2(5), L2(6), L2(7), L2(8)] + + // [L1(1), L2(1), L1(2), L2(2) ...] + simde__m128i * stream0_128i_out = (simde__m128i *)&stream0_256i_out[i]; + simde__m128i * y0r_128 = (simde__m128i *) &y0r; + simde__m128i * y0i_128 = (simde__m128i *) &y0i; + simde_mm_storeu_si128(&stream0_128i_out[0], simde_mm_unpacklo_epi16(y0r_128[0], y0i_128[0])); + simde_mm_storeu_si128(&stream0_128i_out[1], simde_mm_unpackhi_epi16(y0r_128[0], y0i_128[0])); + + // false if only 4 REs remain + if (i < ((length >> 2) - 1)) + { + simde__m128i * stream0_128i_out = (simde__m128i *)&stream0_256i_out[i + 1]; + simde_mm_storeu_si128(&stream0_128i_out[0], simde_mm_unpacklo_epi16(y0r_128[1], y0i_128[1])); + simde_mm_storeu_si128(&stream0_128i_out[1], simde_mm_unpackhi_epi16(y0r_128[1], y0i_128[1])); + } + } +#endif simde_mm_empty(); - simde_m_empty(); } + + +#ifdef USE_128BIT + static const int16_t ones[8] __attribute__((aligned(16))) = {0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}; +// calculate interference magnitude +// tmp_result = ones in shorts corr. to interval 2<=x<=4, tmp_result2 interval < 2, tmp_result3 interval 46 +static inline simde__m128i interference_abs_64qam_epi16(simde__m128i psi, + simde__m128i int_ch_mag, + simde__m128i int_two_ch_mag, + simde__m128i int_three_ch_mag, + simde__m128i c1, + simde__m128i c3, + simde__m128i c5, + simde__m128i c7) +{ + simde__m128i tmp_result = simde_mm_cmpgt_epi16(int_two_ch_mag, psi); + simde__m128i tmp_result3 = simde_mm_xor_si128(tmp_result, (*(simde__m128i *)&ones[0])); + simde__m128i tmp_result2 = simde_mm_cmpgt_epi16(int_ch_mag, psi); + tmp_result = simde_mm_xor_si128(tmp_result, tmp_result2); + simde__m128i tmp_result4 = simde_mm_cmpgt_epi16(psi, int_three_ch_mag); + tmp_result3 = simde_mm_xor_si128(tmp_result3, tmp_result4); + tmp_result = simde_mm_and_si128(tmp_result, c3); + tmp_result2 = simde_mm_and_si128(tmp_result2, c1); + tmp_result3 = simde_mm_and_si128(tmp_result3, c5); + tmp_result4 = simde_mm_and_si128(tmp_result4, c7); + tmp_result = simde_mm_or_si128(tmp_result, tmp_result2); + tmp_result3 = simde_mm_or_si128(tmp_result3, tmp_result4); + return simde_mm_or_si128(tmp_result, tmp_result3); +} + // Calculates psi_a = psi_r * a_r + psi_i * a_i -#define prodsum_psi_a_epi16(psi_r, a_r, psi_i, a_i, psi_a) \ - tmp_result = simde_mm_mulhi_epi16(psi_r, a_r); \ - tmp_result = simde_mm_slli_epi16(tmp_result, 1); \ - tmp_result2 = simde_mm_mulhi_epi16(psi_i, a_i); \ - tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1); \ - psi_a = simde_mm_adds_epi16(tmp_result, tmp_result2); +static inline simde__m128i prodsum_psi_a_epi16(simde__m128i psi_r, simde__m128i a_r, simde__m128i psi_i, simde__m128i a_i) +{ + simde__m128i tmp_result = simde_mm_mulhi_epi16(psi_r, a_r); + tmp_result = simde_mm_slli_epi16(tmp_result, 1); + simde__m128i tmp_result2 = simde_mm_mulhi_epi16(psi_i, a_i); + tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1); + return simde_mm_adds_epi16(tmp_result, tmp_result2); +} // Calculate interference magnitude -#define interference_abs_epi16(psi, int_ch_mag, int_mag, c1, c2) \ - tmp_result = simde_mm_cmplt_epi16(psi, int_ch_mag); \ - tmp_result2 = simde_mm_xor_si128(tmp_result, (*(simde__m128i *)&ones[0])); \ - tmp_result = simde_mm_and_si128(tmp_result, c1); \ - tmp_result2 = simde_mm_and_si128(tmp_result2, c2); \ - int_mag = simde_mm_or_si128(tmp_result, tmp_result2); +static inline simde__m128i interference_abs_epi16(simde__m128i psi, simde__m128i int_ch_mag, simde__m128i c1, simde__m128i c2) +{ + simde__m128i tmp_result = simde_mm_cmplt_epi16(psi, int_ch_mag); + simde__m128i tmp_result2 = simde_mm_xor_si128(tmp_result, (*(simde__m128i *)&ones[0])); + tmp_result = simde_mm_and_si128(tmp_result, c1); + tmp_result2 = simde_mm_and_si128(tmp_result2, c2); + return simde_mm_or_si128(tmp_result, tmp_result2); +} // Calculates a_sq = int_ch_mag * (a_r^2 + a_i^2) * scale_factor -#define square_a_epi16(a_r, a_i, int_ch_mag, scale_factor, a_sq) \ - tmp_result = simde_mm_mulhi_epi16(a_r, a_r); \ - tmp_result = simde_mm_slli_epi16(tmp_result, 1); \ - tmp_result = simde_mm_mulhi_epi16(tmp_result, scale_factor); \ - tmp_result = simde_mm_slli_epi16(tmp_result, 1); \ - tmp_result = simde_mm_mulhi_epi16(tmp_result, int_ch_mag); \ - tmp_result = simde_mm_slli_epi16(tmp_result, 1); \ - tmp_result2 = simde_mm_mulhi_epi16(a_i, a_i); \ - tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1); \ - tmp_result2 = simde_mm_mulhi_epi16(tmp_result2, scale_factor); \ - tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1); \ - tmp_result2 = simde_mm_mulhi_epi16(tmp_result2, int_ch_mag); \ - tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1); \ - a_sq = simde_mm_adds_epi16(tmp_result, tmp_result2); +static inline simde__m128i square_a_epi16(simde__m128i a_r, simde__m128i a_i, simde__m128i int_ch_mag, simde__m128i scale_factor) +{ + simde__m128i tmp_result = simde_mm_mulhi_epi16(a_r, a_r); + tmp_result = simde_mm_slli_epi16(tmp_result, 1); + tmp_result = simde_mm_mulhi_epi16(tmp_result, scale_factor); + tmp_result = simde_mm_slli_epi16(tmp_result, 1); + tmp_result = simde_mm_mulhi_epi16(tmp_result, int_ch_mag); + tmp_result = simde_mm_slli_epi16(tmp_result, 1); + simde__m128i tmp_result2 = simde_mm_mulhi_epi16(a_i, a_i); + tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1); + tmp_result2 = simde_mm_mulhi_epi16(tmp_result2, scale_factor); + tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1); + tmp_result2 = simde_mm_mulhi_epi16(tmp_result2, int_ch_mag); + tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1); + return simde_mm_adds_epi16(tmp_result, tmp_result2); +} -simde__m128i max_epi16(simde__m128i m0, simde__m128i m1, simde__m128i m2, simde__m128i m3, simde__m128i m4, simde__m128i m5, simde__m128i m6, simde__m128i m7) +// calculates a_sq = int_ch_mag*(a_r^2 + a_i^2)*scale_factor for 64-QAM +static inline simde__m128i square_a_64qam_epi16(simde__m128i a_r, simde__m128i a_i, simde__m128i int_ch_mag, simde__m128i scale_factor) +{ + simde__m128i tmp_result = simde_mm_mulhi_epi16(a_r, a_r); + tmp_result = simde_mm_slli_epi16(tmp_result, 1); + tmp_result = simde_mm_mulhi_epi16(tmp_result, scale_factor); + tmp_result = simde_mm_slli_epi16(tmp_result, 3); + tmp_result = simde_mm_mulhi_epi16(tmp_result, int_ch_mag); + tmp_result = simde_mm_slli_epi16(tmp_result, 1); + simde__m128i tmp_result2 = simde_mm_mulhi_epi16(a_i, a_i); + tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1); + tmp_result2 = simde_mm_mulhi_epi16(tmp_result2, scale_factor); + tmp_result2 = simde_mm_slli_epi16(tmp_result2, 3); + tmp_result2 = simde_mm_mulhi_epi16(tmp_result2, int_ch_mag); + tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1); + return simde_mm_adds_epi16(tmp_result, tmp_result2); +} + +static inline simde__m128i max_epi16(simde__m128i m0, simde__m128i m1, simde__m128i m2, simde__m128i m3, simde__m128i m4, simde__m128i m5, simde__m128i m6, simde__m128i m7) { simde__m128i a0 = simde_mm_max_epi16(m0, m1); simde__m128i a1 = simde_mm_max_epi16(m2, m3); @@ -456,6 +784,107 @@ simde__m128i max_epi16(simde__m128i m0, simde__m128i m1, simde__m128i m2, simde_ return simde_mm_max_epi16(b0, b1); } +#else + +static const int16_t ones256[16] __attribute__((aligned(32))) = {0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}; + +// calculate interference magnitude +// tmp_result = ones in shorts corr. to interval 2<=x<=4, tmp_result2 interval < 2, tmp_result3 interval 46 +static inline simde__m256i interference_abs_64qam_epi16_256(simde__m256i psi, + simde__m256i int_ch_mag, + simde__m256i int_two_ch_mag, + simde__m256i int_three_ch_mag, + simde__m256i c1, + simde__m256i c3, + simde__m256i c5, + simde__m256i c7) +{ + simde__m256i tmp_result = simde_mm256_cmpgt_epi16(int_two_ch_mag, psi); + simde__m256i tmp_result3 = simde_mm256_xor_si256(tmp_result, (*(simde__m256i *)&ones256[0])); + simde__m256i tmp_result2 = simde_mm256_cmpgt_epi16(int_ch_mag, psi); + tmp_result = simde_mm256_xor_si256(tmp_result, tmp_result2); + simde__m256i tmp_result4 = simde_mm256_cmpgt_epi16(psi, int_three_ch_mag); + tmp_result3 = simde_mm256_xor_si256(tmp_result3, tmp_result4); + tmp_result = simde_mm256_and_si256(tmp_result, c3); + tmp_result2 = simde_mm256_and_si256(tmp_result2, c1); + tmp_result3 = simde_mm256_and_si256(tmp_result3, c5); + tmp_result4 = simde_mm256_and_si256(tmp_result4, c7); + tmp_result = simde_mm256_or_si256(tmp_result, tmp_result2); + tmp_result3 = simde_mm256_or_si256(tmp_result3, tmp_result4); + return simde_mm256_or_si256(tmp_result, tmp_result3); +} + +// calculates psi_a = psi_r*a_r + psi_i*a_i +static inline simde__m256i prodsum_psi_a_epi16_256(simde__m256i psi_r, simde__m256i a_r, simde__m256i psi_i, simde__m256i a_i) +{ + simde__m256i tmp_result = simde_mm256_mulhi_epi16(psi_r, a_r); + tmp_result = simde_mm256_slli_epi16(tmp_result, 1); + simde__m256i tmp_result2 = simde_mm256_mulhi_epi16(psi_i, a_i); + tmp_result2 = simde_mm256_slli_epi16(tmp_result2, 1); + return simde_mm256_adds_epi16(tmp_result, tmp_result2); +} + +// Calculate interference magnitude +static inline simde__m256i interference_abs_epi16_256(simde__m256i psi, simde__m256i int_ch_mag, simde__m256i c1, simde__m256i c2) +{ + simde__m256i tmp_result = simde_mm256_cmpgt_epi16(int_ch_mag, psi); + simde__m256i tmp_result2 = simde_mm256_xor_si256(tmp_result, (*(simde__m256i *)&ones256[0])); + tmp_result = simde_mm256_and_si256(tmp_result, c1); + tmp_result2 = simde_mm256_and_si256(tmp_result2, c2); + return simde_mm256_or_si256(tmp_result, tmp_result2); +} + +// Calculates a_sq = int_ch_mag * (a_r^2 + a_i^2) * scale_factor +static inline simde__m256i square_a_epi16_256(simde__m256i a_r, simde__m256i a_i, simde__m256i int_ch_mag, simde__m256i scale_factor) +{ + simde__m256i tmp_result = simde_mm256_mulhi_epi16(a_r, a_r); + tmp_result = simde_mm256_slli_epi16(tmp_result, 1); + tmp_result = simde_mm256_mulhi_epi16(tmp_result, scale_factor); + tmp_result = simde_mm256_slli_epi16(tmp_result, 1); + tmp_result = simde_mm256_mulhi_epi16(tmp_result, int_ch_mag); + tmp_result = simde_mm256_slli_epi16(tmp_result, 1); + simde__m256i tmp_result2 = simde_mm256_mulhi_epi16(a_i, a_i); + tmp_result2 = simde_mm256_slli_epi16(tmp_result2, 1); + tmp_result2 = simde_mm256_mulhi_epi16(tmp_result2, scale_factor); + tmp_result2 = simde_mm256_slli_epi16(tmp_result2, 1); + tmp_result2 = simde_mm256_mulhi_epi16(tmp_result2, int_ch_mag); + tmp_result2 = simde_mm256_slli_epi16(tmp_result2, 1); + return simde_mm256_adds_epi16(tmp_result, tmp_result2); +} + +// calculates a_sq = int_ch_mag*(a_r^2 + a_i^2)*scale_factor for 64-QAM +static inline simde__m256i square_a_64qam_epi16_256(simde__m256i a_r, simde__m256i a_i, simde__m256i int_ch_mag, simde__m256i scale_factor) +{ + simde__m256i tmp_result = simde_mm256_mulhi_epi16(a_r, a_r); + tmp_result = simde_mm256_slli_epi16(tmp_result, 1); + tmp_result = simde_mm256_mulhi_epi16(tmp_result, scale_factor); + tmp_result = simde_mm256_slli_epi16(tmp_result, 3); + tmp_result = simde_mm256_mulhi_epi16(tmp_result, int_ch_mag); + tmp_result = simde_mm256_slli_epi16(tmp_result, 1); + simde__m256i tmp_result2 = simde_mm256_mulhi_epi16(a_i, a_i); + tmp_result2 = simde_mm256_slli_epi16(tmp_result2, 1); + tmp_result2 = simde_mm256_mulhi_epi16(tmp_result2, scale_factor); + tmp_result2 = simde_mm256_slli_epi16(tmp_result2, 3); + tmp_result2 = simde_mm256_mulhi_epi16(tmp_result2, int_ch_mag); + tmp_result2 = simde_mm256_slli_epi16(tmp_result2, 1); + return simde_mm256_adds_epi16(tmp_result, tmp_result2); +} + +static inline simde__m256i max_epi16_256(simde__m256i m0, simde__m256i m1, simde__m256i m2, simde__m256i m3, simde__m256i m4, simde__m256i m5, simde__m256i m6, simde__m256i m7) +{ + simde__m256i a0 = simde_mm256_max_epi16(m0, m1); + simde__m256i a1 = simde_mm256_max_epi16(m2, m3); + simde__m256i a2 = simde_mm256_max_epi16(m4, m5); + simde__m256i a3 = simde_mm256_max_epi16(m6, m7); + simde__m256i b0 = simde_mm256_max_epi16(a0, a1); + simde__m256i b1 = simde_mm256_max_epi16(a2, a3); + return simde_mm256_max_epi16(b0, b1); +} + +#endif + /* * This function computes the LLRs of stream 0 (s_0) in presence of the interfering stream 1 (s_1) assuming that both symbols are * 16QAM. It can be used for both MU-MIMO interference-aware receiver or for SU-MIMO receivers. @@ -479,6 +908,7 @@ void nr_ulsch_qam16_qam16(c16_t *stream0_in, c16_t *rho01, uint32_t length) { +#ifdef USE_128BIT simde__m128i *rho01_128i = (simde__m128i *)rho01; simde__m128i *stream0_128i_in = (simde__m128i *)stream0_in; simde__m128i *stream1_128i_in = (simde__m128i *)stream1_in; @@ -501,144 +931,30 @@ void nr_ulsch_qam16_qam16(c16_t *stream0_in, simde__m128i ch_mag_over_2; simde__m128i ch_mag_9_over_10; - simde__m128i xmm0 __attribute__((aligned(16))); - simde__m128i xmm1 __attribute__((aligned(16))); - simde__m128i xmm2 __attribute__((aligned(16))); - simde__m128i xmm3 __attribute__((aligned(16))); - simde__m128i xmm4 __attribute__((aligned(16))); - simde__m128i xmm5 __attribute__((aligned(16))); - simde__m128i xmm6 __attribute__((aligned(16))); - simde__m128i xmm7 __attribute__((aligned(16))); + simde__m128i xmm0; + simde__m128i xmm1; + simde__m128i xmm2; + simde__m128i xmm3; + simde__m128i xmm4; + simde__m128i xmm5; + simde__m128i xmm6; + simde__m128i xmm7; - simde__m128i rho_rpi __attribute__((aligned(16))); - simde__m128i rho_rmi __attribute__((aligned(16))); - simde__m128i rho_rpi_1_1 __attribute__((aligned(16))); - simde__m128i rho_rpi_1_3 __attribute__((aligned(16))); - simde__m128i rho_rpi_3_1 __attribute__((aligned(16))); - simde__m128i rho_rpi_3_3 __attribute__((aligned(16))); - simde__m128i rho_rmi_1_1 __attribute__((aligned(16))); - simde__m128i rho_rmi_1_3 __attribute__((aligned(16))); - simde__m128i rho_rmi_3_1 __attribute__((aligned(16))); - simde__m128i rho_rmi_3_3 __attribute__((aligned(16))); + simde__m128i rho_rpi; + simde__m128i rho_rmi; + simde__m128i rho_rs[8]; + simde__m128i psi_rs[16]; + simde__m128i psi_is[16]; + simde__m128i a_rs[16]; + simde__m128i a_is[16]; + simde__m128i psi_as[16]; + simde__m128i a_sqs[16]; + simde__m128i y0_s[8]; - simde__m128i psi_r_m3_m3 __attribute__((aligned(16))); - simde__m128i psi_r_m3_m1 __attribute__((aligned(16))); - simde__m128i psi_r_m3_p1 __attribute__((aligned(16))); - simde__m128i psi_r_m3_p3 __attribute__((aligned(16))); - simde__m128i psi_r_m1_m3 __attribute__((aligned(16))); - simde__m128i psi_r_m1_m1 __attribute__((aligned(16))); - simde__m128i psi_r_m1_p1 __attribute__((aligned(16))); - simde__m128i psi_r_m1_p3 __attribute__((aligned(16))); - simde__m128i psi_r_p1_m3 __attribute__((aligned(16))); - simde__m128i psi_r_p1_m1 __attribute__((aligned(16))); - simde__m128i psi_r_p1_p1 __attribute__((aligned(16))); - simde__m128i psi_r_p1_p3 __attribute__((aligned(16))); - simde__m128i psi_r_p3_m3 __attribute__((aligned(16))); - simde__m128i psi_r_p3_m1 __attribute__((aligned(16))); - simde__m128i psi_r_p3_p1 __attribute__((aligned(16))); - simde__m128i psi_r_p3_p3 __attribute__((aligned(16))); - - simde__m128i psi_i_m3_m3 __attribute__((aligned(16))); - simde__m128i psi_i_m3_m1 __attribute__((aligned(16))); - simde__m128i psi_i_m3_p1 __attribute__((aligned(16))); - simde__m128i psi_i_m3_p3 __attribute__((aligned(16))); - simde__m128i psi_i_m1_m3 __attribute__((aligned(16))); - simde__m128i psi_i_m1_m1 __attribute__((aligned(16))); - simde__m128i psi_i_m1_p1 __attribute__((aligned(16))); - simde__m128i psi_i_m1_p3 __attribute__((aligned(16))); - simde__m128i psi_i_p1_m3 __attribute__((aligned(16))); - simde__m128i psi_i_p1_m1 __attribute__((aligned(16))); - simde__m128i psi_i_p1_p1 __attribute__((aligned(16))); - simde__m128i psi_i_p1_p3 __attribute__((aligned(16))); - simde__m128i psi_i_p3_m3 __attribute__((aligned(16))); - simde__m128i psi_i_p3_m1 __attribute__((aligned(16))); - simde__m128i psi_i_p3_p1 __attribute__((aligned(16))); - simde__m128i psi_i_p3_p3 __attribute__((aligned(16))); - - simde__m128i a_r_m3_m3 __attribute__((aligned(16))); - simde__m128i a_r_m3_m1 __attribute__((aligned(16))); - simde__m128i a_r_m3_p1 __attribute__((aligned(16))); - simde__m128i a_r_m3_p3 __attribute__((aligned(16))); - simde__m128i a_r_m1_m3 __attribute__((aligned(16))); - simde__m128i a_r_m1_m1 __attribute__((aligned(16))); - simde__m128i a_r_m1_p1 __attribute__((aligned(16))); - simde__m128i a_r_m1_p3 __attribute__((aligned(16))); - simde__m128i a_r_p1_m3 __attribute__((aligned(16))); - simde__m128i a_r_p1_m1 __attribute__((aligned(16))); - simde__m128i a_r_p1_p1 __attribute__((aligned(16))); - simde__m128i a_r_p1_p3 __attribute__((aligned(16))); - simde__m128i a_r_p3_m3 __attribute__((aligned(16))); - simde__m128i a_r_p3_m1 __attribute__((aligned(16))); - simde__m128i a_r_p3_p1 __attribute__((aligned(16))); - simde__m128i a_r_p3_p3 __attribute__((aligned(16))); - - simde__m128i a_i_m3_m3 __attribute__((aligned(16))); - simde__m128i a_i_m3_m1 __attribute__((aligned(16))); - simde__m128i a_i_m3_p1 __attribute__((aligned(16))); - simde__m128i a_i_m3_p3 __attribute__((aligned(16))); - simde__m128i a_i_m1_m3 __attribute__((aligned(16))); - simde__m128i a_i_m1_m1 __attribute__((aligned(16))); - simde__m128i a_i_m1_p1 __attribute__((aligned(16))); - simde__m128i a_i_m1_p3 __attribute__((aligned(16))); - simde__m128i a_i_p1_m3 __attribute__((aligned(16))); - simde__m128i a_i_p1_m1 __attribute__((aligned(16))); - simde__m128i a_i_p1_p1 __attribute__((aligned(16))); - simde__m128i a_i_p1_p3 __attribute__((aligned(16))); - simde__m128i a_i_p3_m3 __attribute__((aligned(16))); - simde__m128i a_i_p3_m1 __attribute__((aligned(16))); - simde__m128i a_i_p3_p1 __attribute__((aligned(16))); - simde__m128i a_i_p3_p3 __attribute__((aligned(16))); - - simde__m128i psi_a_m3_m3 __attribute__((aligned(16))); - simde__m128i psi_a_m3_m1 __attribute__((aligned(16))); - simde__m128i psi_a_m3_p1 __attribute__((aligned(16))); - simde__m128i psi_a_m3_p3 __attribute__((aligned(16))); - simde__m128i psi_a_m1_m3 __attribute__((aligned(16))); - simde__m128i psi_a_m1_m1 __attribute__((aligned(16))); - simde__m128i psi_a_m1_p1 __attribute__((aligned(16))); - simde__m128i psi_a_m1_p3 __attribute__((aligned(16))); - simde__m128i psi_a_p1_m3 __attribute__((aligned(16))); - simde__m128i psi_a_p1_m1 __attribute__((aligned(16))); - simde__m128i psi_a_p1_p1 __attribute__((aligned(16))); - simde__m128i psi_a_p1_p3 __attribute__((aligned(16))); - simde__m128i psi_a_p3_m3 __attribute__((aligned(16))); - simde__m128i psi_a_p3_m1 __attribute__((aligned(16))); - simde__m128i psi_a_p3_p1 __attribute__((aligned(16))); - simde__m128i psi_a_p3_p3 __attribute__((aligned(16))); - - simde__m128i a_sq_m3_m3 __attribute__((aligned(16))); - simde__m128i a_sq_m3_m1 __attribute__((aligned(16))); - simde__m128i a_sq_m3_p1 __attribute__((aligned(16))); - simde__m128i a_sq_m3_p3 __attribute__((aligned(16))); - simde__m128i a_sq_m1_m3 __attribute__((aligned(16))); - simde__m128i a_sq_m1_m1 __attribute__((aligned(16))); - simde__m128i a_sq_m1_p1 __attribute__((aligned(16))); - simde__m128i a_sq_m1_p3 __attribute__((aligned(16))); - simde__m128i a_sq_p1_m3 __attribute__((aligned(16))); - simde__m128i a_sq_p1_m1 __attribute__((aligned(16))); - simde__m128i a_sq_p1_p1 __attribute__((aligned(16))); - simde__m128i a_sq_p1_p3 __attribute__((aligned(16))); - simde__m128i a_sq_p3_m3 __attribute__((aligned(16))); - simde__m128i a_sq_p3_m1 __attribute__((aligned(16))); - simde__m128i a_sq_p3_p1 __attribute__((aligned(16))); - simde__m128i a_sq_p3_p3 __attribute__((aligned(16))); - - simde__m128i y0_p_1_1 __attribute__((aligned(16))); - simde__m128i y0_p_1_3 __attribute__((aligned(16))); - simde__m128i y0_p_3_1 __attribute__((aligned(16))); - simde__m128i y0_p_3_3 __attribute__((aligned(16))); - simde__m128i y0_m_1_1 __attribute__((aligned(16))); - simde__m128i y0_m_1_3 __attribute__((aligned(16))); - simde__m128i y0_m_3_1 __attribute__((aligned(16))); - simde__m128i y0_m_3_3 __attribute__((aligned(16))); - - simde__m128i y0r __attribute__((aligned(16))); - simde__m128i y0i __attribute__((aligned(16))); - simde__m128i y1r __attribute__((aligned(16))); - simde__m128i y1i __attribute__((aligned(16))); - - simde__m128i tmp_result __attribute__((aligned(16))); - simde__m128i tmp_result2 __attribute__((aligned(16))); + simde__m128i y0r; + simde__m128i y0i; + simde__m128i y1r; + simde__m128i y1i; // In one iteration, we deal with 8 REs for (int i = 0; i < length >> 2; i += 2) { @@ -649,96 +965,42 @@ void nr_ulsch_qam16_qam16(c16_t *stream0_in, rho_rmi = simde_mm_subs_epi16(xmm2, xmm3); // rho* = Re(rho) - Im(rho) // Compute the different rhos - rho_rpi_1_1 = simde_mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_10); - rho_rmi_1_1 = simde_mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_10); - rho_rpi_3_3 = simde_mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_10); - rho_rmi_3_3 = simde_mm_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_10); - rho_rpi_3_3 = simde_mm_slli_epi16(rho_rpi_3_3, 1); - rho_rmi_3_3 = simde_mm_slli_epi16(rho_rmi_3_3, 1); + rho_rs[0] = simde_mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_10); + rho_rs[4] = simde_mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_10); + rho_rs[3] = simde_mm_slli_epi16(simde_mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_10), 1); + rho_rs[7] = simde_mm_slli_epi16(simde_mm_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_10), 1); xmm4 = simde_mm_mulhi_epi16(xmm2, ONE_OVER_SQRT_10); // Re(rho) xmm5 = simde_mm_mulhi_epi16(xmm3, THREE_OVER_SQRT_10); // Im(rho) xmm5 = simde_mm_slli_epi16(xmm5, 1); - rho_rpi_1_3 = simde_mm_adds_epi16(xmm4, xmm5); - rho_rmi_1_3 = simde_mm_subs_epi16(xmm4, xmm5); + rho_rs[1] = simde_mm_adds_epi16(xmm4, xmm5); + rho_rs[5] = simde_mm_subs_epi16(xmm4, xmm5); xmm6 = simde_mm_mulhi_epi16(xmm2, THREE_OVER_SQRT_10); // Re(rho) xmm7 = simde_mm_mulhi_epi16(xmm3, ONE_OVER_SQRT_10); // Im(rho) xmm6 = simde_mm_slli_epi16(xmm6, 1); - rho_rpi_3_1 = simde_mm_adds_epi16(xmm6, xmm7); - rho_rmi_3_1 = simde_mm_subs_epi16(xmm6, xmm7); + rho_rs[2] = simde_mm_adds_epi16(xmm6, xmm7); + rho_rs[6] = simde_mm_subs_epi16(xmm6, xmm7); // Rearrange interfering MF output simde_mm128_separate_real_imag_parts(&y1r, &y1i, stream1_128i_in[i], stream1_128i_in[i + 1]); - xmm0 = simde_mm_setzero_si128(); // ZERO - xmm2 = simde_mm_subs_epi16(rho_rpi_1_1, y1r); // = [Re(rho)+ Im(rho)]/sqrt(10) - y1r - psi_r_p1_p1 = simde_mm_abs_epi16(xmm2); // = |[Re(rho)+ Im(rho)]/sqrt(10) - y1r| - - xmm2 = simde_mm_subs_epi16(rho_rmi_1_1, y1r); - psi_r_p1_m1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rmi_1_1, y1i); - psi_i_p1_p1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rpi_1_3, y1r); - psi_r_p1_p3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rmi_1_3, y1r); - psi_r_p1_m3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rmi_3_1, y1i); - psi_i_p1_p3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rpi_3_1, y1r); - psi_r_p3_p1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rmi_3_1, y1r); - psi_r_p3_m1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rmi_1_3, y1i); - psi_i_p3_p1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rpi_3_3, y1r); - psi_r_p3_p3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rmi_3_3, y1r); - psi_r_p3_m3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rmi_3_3, y1i); - psi_i_p3_p3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rpi_1_1, y1i); - psi_i_m1_p1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rpi_3_1, y1i); - psi_i_m1_p3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rpi_1_3, y1i); - psi_i_m3_p1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rpi_3_3, y1i); - psi_i_m3_p3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(rho_rpi_1_1, y1i); - psi_i_p1_m1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(rho_rpi_3_1, y1i); - psi_i_p1_m3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(rho_rpi_1_3, y1i); - psi_i_p3_m1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(rho_rpi_3_3, y1i); - psi_i_p3_m3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(rho_rpi_1_1, y1r); - psi_r_m1_m1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(rho_rpi_1_3, y1r); - psi_r_m1_m3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(rho_rpi_3_1, y1r); - psi_r_m3_m1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(rho_rpi_3_3, y1r); - psi_r_m3_m3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(y1r, rho_rmi_1_1); - psi_r_m1_p1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(y1r, rho_rmi_1_3); - psi_r_m1_p3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(y1i, rho_rmi_1_1); - psi_i_m1_m1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(y1i, rho_rmi_3_1); - psi_i_m1_m3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(y1r, rho_rmi_3_1); - psi_r_m3_p1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(y1r, rho_rmi_3_3); - psi_r_m3_p3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(y1i, rho_rmi_1_3); - psi_i_m3_m1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(y1i, rho_rmi_3_3); - psi_i_m3_m3 = simde_mm_abs_epi16(xmm2); + // | [Re(rho)+ Im(rho)]/sqrt(10) - y1r | + for(int j=0; j<8; j++){ // psi_rs[0~7], rho_rs[0~7] + psi_rs[j] = simde_mm_abs_epi16( simde_mm_subs_epi16(rho_rs[j], y1r) ); + } + for(int j=8; j<16; j++){ // psi_rs[8~16], rho_rs[4,5,6,7,0,1,2,3] + psi_rs[j] = simde_mm_abs_epi16( simde_mm_adds_epi16(rho_rs[(j-4) & 7], y1r) ); + } + const uint8_t rho_rs_indexes[16] = {4,6,5,7,0,2,1,3,0,2,1,3,4,6,5,7}; + for(int k=0; k<16; k+=8){ // psi_is[0~15], sub(rho_rs[4,6,5,7]), add(rho_rs[0,2,1,3]), sub(rho_rs[0,2,1,3]), add(rho_rs[4,6,5,7]) + for(int j=k; j> 3; i += 2) { + + // Get rho + simde_mm256_separate_real_imag_parts(&xmm2, &xmm3, rho01_256i[i], rho01_256i[i + 1]); + rho_rpi = simde_mm256_adds_epi16(xmm2, xmm3); // rho = Re(rho) + Im(rho) + rho_rmi = simde_mm256_subs_epi16(xmm2, xmm3); // rho* = Re(rho) - Im(rho) + + // Compute the different rhos + rho_rs[0] = simde_mm256_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_10); + rho_rs[4] = simde_mm256_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_10); + rho_rs[3] = simde_mm256_slli_epi16(simde_mm256_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_10), 1); + rho_rs[7] = simde_mm256_slli_epi16(simde_mm256_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_10), 1); + + xmm4 = simde_mm256_mulhi_epi16(xmm2, ONE_OVER_SQRT_10); // Re(rho) + xmm5 = simde_mm256_mulhi_epi16(xmm3, THREE_OVER_SQRT_10); // Im(rho) + xmm5 = simde_mm256_slli_epi16(xmm5, 1); + + rho_rs[1] = simde_mm256_adds_epi16(xmm4, xmm5); + rho_rs[5] = simde_mm256_subs_epi16(xmm4, xmm5); + + xmm6 = simde_mm256_mulhi_epi16(xmm2, THREE_OVER_SQRT_10); // Re(rho) + xmm7 = simde_mm256_mulhi_epi16(xmm3, ONE_OVER_SQRT_10); // Im(rho) + xmm6 = simde_mm256_slli_epi16(xmm6, 1); + + rho_rs[2] = simde_mm256_adds_epi16(xmm6, xmm7); + rho_rs[6] = simde_mm256_subs_epi16(xmm6, xmm7); + + // Rearrange interfering MF output + simde_mm256_separate_real_imag_parts(&y1r, &y1i, stream1_256i_in[i], stream1_256i_in[i + 1]); + + // | [Re(rho)+ Im(rho)]/sqrt(10) - y1r | + for(int j=0; j<8; j++){ // psi_rs[0~7], rho_rs[0~7] + psi_rs[j] = simde_mm256_abs_epi16( simde_mm256_subs_epi16(rho_rs[j], y1r) ); + } + for(int j=8; j<16; j++){ // psi_rs[8~16], rho_rs[4,5,6,7,0,1,2,3] + psi_rs[j] = simde_mm256_abs_epi16( simde_mm256_adds_epi16(rho_rs[(j-4) & 7], y1r) ); + } + const uint8_t rho_rs_indexes[16] = {4,6,5,7,0,2,1,3,0,2,1,3,4,6,5,7}; + for(int k=0; k<16; k+=8){ // psi_is[0~15], sub(rho_rs[4,6,5,7]), add(rho_rs[0,2,1,3]), sub(rho_rs[0,2,1,3]), add(rho_rs[4,6,5,7]) + for(int j=k; j6 -#define interference_abs_64qam_epi16_256(psi, int_ch_mag, int_two_ch_mag, int_three_ch_mag, a, c1, c3, c5, c7) \ - tmp_result = simde_mm256_cmpgt_epi16(int_two_ch_mag, psi); \ - tmp_result3 = simde_mm256_xor_si256(tmp_result, (*(simde__m256i *)&ones256[0])); \ - tmp_result2 = simde_mm256_cmpgt_epi16(int_ch_mag, psi); \ - tmp_result = simde_mm256_xor_si256(tmp_result, tmp_result2); \ - tmp_result4 = simde_mm256_cmpgt_epi16(psi, int_three_ch_mag); \ - tmp_result3 = simde_mm256_xor_si256(tmp_result3, tmp_result4); \ - tmp_result = simde_mm256_and_si256(tmp_result, c3); \ - tmp_result2 = simde_mm256_and_si256(tmp_result2, c1); \ - tmp_result3 = simde_mm256_and_si256(tmp_result3, c5); \ - tmp_result4 = simde_mm256_and_si256(tmp_result4, c7); \ - tmp_result = simde_mm256_or_si256(tmp_result, tmp_result2); \ - tmp_result3 = simde_mm256_or_si256(tmp_result3, tmp_result4); \ - const simde__m256i a = simde_mm256_or_si256(tmp_result, tmp_result3); - -// calculates psi_a = psi_r*a_r + psi_i*a_i -#define prodsum_psi_a_epi16_256(psi_r, a_r, psi_i, a_i, psi_a) \ - tmp_result = simde_mm256_mulhi_epi16(psi_r, a_r); \ - tmp_result = simde_mm256_slli_epi16(tmp_result, 1); \ - tmp_result2 = simde_mm256_mulhi_epi16(psi_i, a_i); \ - tmp_result2 = simde_mm256_slli_epi16(tmp_result2, 1); \ - simde__m256i psi_a = simde_mm256_adds_epi16(tmp_result, tmp_result2); - -// calculates a_sq = int_ch_mag*(a_r^2 + a_i^2)*scale_factor for 64-QAM -#define square_a_64qam_epi16_256(a_r, a_i, int_ch_mag, scale_factor, a_sq) \ - tmp_result = simde_mm256_mulhi_epi16(a_r, a_r); \ - tmp_result = simde_mm256_slli_epi16(tmp_result, 1); \ - tmp_result = simde_mm256_mulhi_epi16(tmp_result, scale_factor); \ - tmp_result = simde_mm256_slli_epi16(tmp_result, 3); \ - tmp_result = simde_mm256_mulhi_epi16(tmp_result, int_ch_mag); \ - tmp_result = simde_mm256_slli_epi16(tmp_result, 1); \ - tmp_result2 = simde_mm256_mulhi_epi16(a_i, a_i); \ - tmp_result2 = simde_mm256_slli_epi16(tmp_result2, 1); \ - tmp_result2 = simde_mm256_mulhi_epi16(tmp_result2, scale_factor); \ - tmp_result2 = simde_mm256_slli_epi16(tmp_result2, 3); \ - tmp_result2 = simde_mm256_mulhi_epi16(tmp_result2, int_ch_mag); \ - tmp_result2 = simde_mm256_slli_epi16(tmp_result2, 1); \ - const simde__m256i a_sq = simde_mm256_adds_epi16(tmp_result, tmp_result2); - /* * This function computes the LLRs of stream 0 (s_0) in presence of the interfering stream 1 (s_1) assuming that both symbols are * 64QAM. It can be used for both MU-MIMO interference-aware receiver or for SU-MIMO receivers. @@ -1102,6 +1375,353 @@ void nr_ulsch_qam64_qam64(c16_t *stream0_in, c16_t *rho01, uint32_t length) { +#ifdef USE_128BIT + simde__m128i *rho01_128i = (simde__m128i *)rho01; + simde__m128i *stream0_128i_in = (simde__m128i *)stream0_in; + simde__m128i *stream1_128i_in = (simde__m128i *)stream1_in; + simde__m128i *ch_mag_128i = (simde__m128i *)ch_mag; + simde__m128i *ch_mag_128i_i = (simde__m128i *)ch_mag_i; + + simde__m128i ONE_OVER_SQRT_42 = simde_mm_set1_epi16(10112); // round(1/sqrt(42)*2^16) + simde__m128i THREE_OVER_SQRT_42 = simde_mm_set1_epi16(30337); // round(3/sqrt(42)*2^16) + simde__m128i FIVE_OVER_SQRT_42 = simde_mm_set1_epi16(25281); // round(5/sqrt(42)*2^15) + simde__m128i SEVEN_OVER_SQRT_42 = simde_mm_set1_epi16(17697); // round(7/sqrt(42)*2^14) Q2.14 + simde__m128i ONE_OVER_SQRT_2 = simde_mm_set1_epi16(23170); // round(1/sqrt(2)*2^15) + simde__m128i ONE_OVER_SQRT_2_42 = simde_mm_set1_epi16(3575); // round(1/sqrt(2*42)*2^15) + simde__m128i THREE_OVER_SQRT_2_42 = simde_mm_set1_epi16(10726); // round(3/sqrt(2*42)*2^15) + simde__m128i FIVE_OVER_SQRT_2_42 = simde_mm_set1_epi16(17876); // round(5/sqrt(2*42)*2^15) + simde__m128i SEVEN_OVER_SQRT_2_42 = simde_mm_set1_epi16(25027); // round(7/sqrt(2*42)*2^15) + simde__m128i FORTYNINE_OVER_FOUR_SQRT_42 = simde_mm_set1_epi16(30969); // round(49/(4*sqrt(42))*2^14), Q2.14 + simde__m128i THIRTYSEVEN_OVER_FOUR_SQRT_42 = simde_mm_set1_epi16(23385); // round(37/(4*sqrt(42))*2^14), Q2.14 + simde__m128i TWENTYFIVE_OVER_FOUR_SQRT_42 = simde_mm_set1_epi16(31601); // round(25/(4*sqrt(42))*2^15) + simde__m128i TWENTYNINE_OVER_FOUR_SQRT_42 = simde_mm_set1_epi16(18329); // round(29/(4*sqrt(42))*2^15), Q2.14 + simde__m128i SEVENTEEN_OVER_FOUR_SQRT_42 = simde_mm_set1_epi16(21489); // round(17/(4*sqrt(42))*2^15) + simde__m128i NINE_OVER_FOUR_SQRT_42 = simde_mm_set1_epi16(11376); // round(9/(4*sqrt(42))*2^15) + simde__m128i THIRTEEN_OVER_FOUR_SQRT_42 = simde_mm_set1_epi16(16433); // round(13/(4*sqrt(42))*2^15) + simde__m128i FIVE_OVER_FOUR_SQRT_42 = simde_mm_set1_epi16(6320); // round(5/(4*sqrt(42))*2^15) + simde__m128i ONE_OVER_FOUR_SQRT_42 = simde_mm_set1_epi16(1264); // round(1/(4*sqrt(42))*2^15) + simde__m128i SQRT_42_OVER_FOUR = simde_mm_set1_epi16(13272); // round(sqrt(42)/4*2^13), Q3.12 + + simde__m128i ch_mag_des; + simde__m128i ch_mag_int; + simde__m128i y0r_one_over_sqrt_21; + simde__m128i y0r_three_over_sqrt_21; + simde__m128i y0r_five_over_sqrt_21; + simde__m128i y0r_seven_over_sqrt_21; + simde__m128i y0i_one_over_sqrt_21; + simde__m128i y0i_three_over_sqrt_21; + simde__m128i y0i_five_over_sqrt_21; + simde__m128i y0i_seven_over_sqrt_21; + simde__m128i ch_mag_int_with_sigma2; + simde__m128i two_ch_mag_int_with_sigma2; + simde__m128i three_ch_mag_int_with_sigma2; + + for (int i = 0; i < length >> 2; i += 2) { + + // Get rho + simde__m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8; + simde_mm128_separate_real_imag_parts(&xmm2, &xmm3, rho01_128i[i], rho01_128i[i + 1]); + + simde__m128i rho_rpi = simde_mm_adds_epi16(xmm2, xmm3); // rho = Re(rho) + Im(rho) + simde__m128i rho_rmi = simde_mm_subs_epi16(xmm2, xmm3); // rho* = Re(rho) - Im(rho) + + // Compute the different rhos + simde__m128i rho_rs[32]; + rho_rs[27] = simde_mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42); + rho_rs[28] = simde_mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42); + rho_rs[18] = simde_mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42); + rho_rs[21] = simde_mm_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42); + rho_rs[9] = simde_mm_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42); + rho_rs[14] = simde_mm_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42); + rho_rs[0] = simde_mm_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42); + rho_rs[7] = simde_mm_mulhi_epi16(rho_rmi, SEVEN_OVER_SQRT_42); + + rho_rs[9] = simde_mm_slli_epi16(rho_rs[9], 1); + rho_rs[14] = simde_mm_slli_epi16(rho_rs[14], 1); + rho_rs[0] = simde_mm_slli_epi16(rho_rs[0], 2); + rho_rs[7] = simde_mm_slli_epi16(rho_rs[7], 2); + + xmm4 = simde_mm_mulhi_epi16(xmm2, ONE_OVER_SQRT_42); + xmm5 = simde_mm_mulhi_epi16(xmm3, ONE_OVER_SQRT_42); + xmm6 = simde_mm_mulhi_epi16(xmm3, THREE_OVER_SQRT_42); + xmm7 = simde_mm_mulhi_epi16(xmm3, FIVE_OVER_SQRT_42); + xmm8 = simde_mm_mulhi_epi16(xmm3, SEVEN_OVER_SQRT_42); + xmm7 = simde_mm_slli_epi16(xmm7, 1); + xmm8 = simde_mm_slli_epi16(xmm8, 2); + + rho_rs[26] = simde_mm_adds_epi16(xmm4, xmm6); + rho_rs[29] = simde_mm_subs_epi16(xmm4, xmm6); + rho_rs[25] = simde_mm_adds_epi16(xmm4, xmm7); + rho_rs[30] = simde_mm_subs_epi16(xmm4, xmm7); + rho_rs[24] = simde_mm_adds_epi16(xmm4, xmm8); + rho_rs[31] = simde_mm_subs_epi16(xmm4, xmm8); + + xmm4 = simde_mm_mulhi_epi16(xmm2, THREE_OVER_SQRT_42); + rho_rs[19] = simde_mm_adds_epi16(xmm4, xmm5); + rho_rs[20] = simde_mm_subs_epi16(xmm4, xmm5); + rho_rs[17] = simde_mm_adds_epi16(xmm4, xmm7); + rho_rs[22] = simde_mm_subs_epi16(xmm4, xmm7); + rho_rs[16] = simde_mm_adds_epi16(xmm4, xmm8); + rho_rs[23] = simde_mm_subs_epi16(xmm4, xmm8); + + xmm4 = simde_mm_mulhi_epi16(xmm2, FIVE_OVER_SQRT_42); + xmm4 = simde_mm_slli_epi16(xmm4, 1); + rho_rs[11] = simde_mm_adds_epi16(xmm4, xmm5); + rho_rs[12] = simde_mm_subs_epi16(xmm4, xmm5); + rho_rs[10] = simde_mm_adds_epi16(xmm4, xmm6); + rho_rs[13] = simde_mm_subs_epi16(xmm4, xmm6); + rho_rs[8] = simde_mm_adds_epi16(xmm4, xmm8); + rho_rs[15] = simde_mm_subs_epi16(xmm4, xmm8); + + xmm4 = simde_mm_mulhi_epi16(xmm2, SEVEN_OVER_SQRT_42); + xmm4 = simde_mm_slli_epi16(xmm4, 2); + rho_rs[3] = simde_mm_adds_epi16(xmm4, xmm5); + rho_rs[4] = simde_mm_subs_epi16(xmm4, xmm5); + rho_rs[2] = simde_mm_adds_epi16(xmm4, xmm6); + rho_rs[5] = simde_mm_subs_epi16(xmm4, xmm6); + rho_rs[1] = simde_mm_adds_epi16(xmm4, xmm7); + rho_rs[6] = simde_mm_subs_epi16(xmm4, xmm7); + + // Rearrange interfering MF output + simde__m128i y1r, y1i; + simde_mm128_separate_real_imag_parts(&y1r, &y1i, stream1_128i_in[i], stream1_128i_in[i + 1]); + + // Psi_r calculation from rho_rpi or rho_rmi + xmm0 = simde_mm_set1_epi16(0); // ZERO for abs_pi16 + xmm2 = simde_mm_subs_epi16(rho_rs[0], y1r); + + simde__m128i psi_r_s[64]; + for(int j=0; j<32; j++) // psi_r_s[0~31], rho_rs[0~31] + psi_r_s[j] = simde_mm_abs_epi16(simde_mm_subs_epi16(rho_rs[j], y1r)); + for(int j=32; j<64; j++) // psi_r_s[32~64], rho_rs[31~0] + psi_r_s[j] = simde_mm_abs_epi16(simde_mm_adds_epi16(rho_rs[63 - j], y1r)); + + // simde__m128i psi_i calculation from rho_rpi or rho_rmi + simde__m128i psi_i_s[64]; + const uint8_t rho_rs_index[32] = {7,15,23,31,24,16,8,0,6,14,22,30,25,17,9,1,5,13,21,29,26,18,10,2,4,12,20,28,27,19,11,3}; + for(int k=0; k<32; k+=8){ // psi_i_s[0~31] + for(int j=k; j>3], y0i_seven_over_sqrt_21); + y0_s[j+1] = simde_mm_adds_epi16(y0r_over_s[j>>3], y0i_five_over_sqrt_21); + y0_s[j+2] = simde_mm_adds_epi16(y0r_over_s[j>>3], y0i_three_over_sqrt_21); + y0_s[j+3] = simde_mm_adds_epi16(y0r_over_s[j>>3], y0i_one_over_sqrt_21); + y0_s[j+4] = simde_mm_subs_epi16(y0r_over_s[j>>3], y0i_one_over_sqrt_21); + y0_s[j+5] = simde_mm_subs_epi16(y0r_over_s[j>>3], y0i_three_over_sqrt_21); + y0_s[j+6] = simde_mm_subs_epi16(y0r_over_s[j>>3], y0i_five_over_sqrt_21); + y0_s[j+7] = simde_mm_subs_epi16(y0r_over_s[j>>3], y0i_seven_over_sqrt_21); + } + + ch_mag_int_with_sigma2 = simde_mm_srai_epi16(ch_mag_int, 1); // *2 + two_ch_mag_int_with_sigma2 = ch_mag_int; // *4 + three_ch_mag_int_with_sigma2 = simde_mm_adds_epi16(ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2); // *6 + simde__m128i a_r_s[64]; + simde__m128i a_i_s[64]; + simde__m128i psi_a_s[64]; + simde__m128i a_sq_s[64]; + for(int j=0; j<64; j++){ + // Detection of interference term + a_r_s[j] = interference_abs_64qam_epi16(psi_r_s[j], ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, SEVEN_OVER_SQRT_2_42); + a_i_s[j] = interference_abs_64qam_epi16(psi_i_s[j], ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, SEVEN_OVER_SQRT_2_42); + + // Calculation of a group of two terms in the bit metric involving product of psi and interference + psi_a_s[j] = prodsum_psi_a_epi16(psi_r_s[j], a_r_s[j], psi_i_s[j], a_i_s[j]); + + // Multiply by sqrt(2) + psi_a_s[j] = simde_mm_slli_epi16(simde_mm_mulhi_epi16(psi_a_s[j], ONE_OVER_SQRT_2), 2); + + // Calculation of a group of two terms in the bit metric involving squares of interference + a_sq_s[j] = square_a_64qam_epi16(a_r_s[j], a_i_s[j], ch_mag_int, SQRT_42_OVER_FOUR); + } + + // Computing different multiples of ||h0||^2 + simde__m128i ch_mag_with_sigma2[10]; + enum ch_mag_over_42with_sigma2_vals {mag2=0, mag10, mag26, mag18, mag34, mag58, mag50, mag74, mag98}; + // x=1, y=1 + ch_mag_with_sigma2[mag2] = simde_mm_slli_epi16(simde_mm_mulhi_epi16(ch_mag_des, ONE_OVER_FOUR_SQRT_42), 1); + // x=1, y=3 + ch_mag_with_sigma2[mag10] = simde_mm_slli_epi16(simde_mm_mulhi_epi16(ch_mag_des, FIVE_OVER_FOUR_SQRT_42), 1); + // x=1, x=5 + ch_mag_with_sigma2[mag26] = simde_mm_slli_epi16(simde_mm_mulhi_epi16(ch_mag_des, THIRTEEN_OVER_FOUR_SQRT_42), 1); + // x=1, y=7 + ch_mag_with_sigma2[mag50] = simde_mm_slli_epi16(simde_mm_mulhi_epi16(ch_mag_des, TWENTYFIVE_OVER_FOUR_SQRT_42), 1); + // x=3, y=3 + ch_mag_with_sigma2[mag18] = simde_mm_slli_epi16(simde_mm_mulhi_epi16(ch_mag_des, NINE_OVER_FOUR_SQRT_42), 1); + // x=3, y=5 + ch_mag_with_sigma2[mag34] = simde_mm_slli_epi16(simde_mm_mulhi_epi16(ch_mag_des, SEVENTEEN_OVER_FOUR_SQRT_42), 1); + // x=3, y=7 + ch_mag_with_sigma2[mag58] = simde_mm_slli_epi16(simde_mm_mulhi_epi16(ch_mag_des, TWENTYNINE_OVER_FOUR_SQRT_42), 2); + // x=5, y=5 + ch_mag_with_sigma2[mag50] = simde_mm_slli_epi16(simde_mm_mulhi_epi16(ch_mag_des, TWENTYFIVE_OVER_FOUR_SQRT_42), 1); + // x=5, y=7 + ch_mag_with_sigma2[mag74] = simde_mm_slli_epi16(simde_mm_mulhi_epi16(ch_mag_des, THIRTYSEVEN_OVER_FOUR_SQRT_42), 2); + // x=7, y=7 + ch_mag_with_sigma2[mag98] = simde_mm_slli_epi16(simde_mm_mulhi_epi16(ch_mag_des, FORTYNINE_OVER_FOUR_SQRT_42), 2); + + // Computing Metrics + simde__m128i bit_met_s[64]; + const enum ch_mag_over_42with_sigma2_vals table[] = { + mag98, mag74, mag58, mag50, mag50, mag58, mag74, mag98, mag74, mag50, mag34, mag26, mag26, mag34, mag50, mag74, + mag58, mag34, mag18, mag10, mag10, mag18, mag34, mag58, mag50, mag26, mag10, mag2, mag2, mag10, mag26, mag50}; + + for(int i=0; i<32; i++){ + const simde__m128i x = simde_mm_adds_epi16(simde_mm_subs_epi16(psi_a_s[i], a_sq_s[i]), y0_s[i]); + bit_met_s[i] = simde_mm_subs_epi16(x, ch_mag_with_sigma2[table[i]]); + } + for(int i=0; i<32; i++){ + const simde__m128i x = simde_mm_subs_epi16(simde_mm_subs_epi16(psi_a_s[32 + i], a_sq_s[32 + i]), y0_s[31 - i]); + bit_met_s[32 + i] = simde_mm_subs_epi16(x, ch_mag_with_sigma2[table[31 - i]]); + } + + // Detection for bits + simde__m128i logmax_den_re0; + simde__m128i logmax_num_re0; + // Detection for 1st bit + // bit = 1 + xmm0 = max_epi16(bit_met_s[56],bit_met_s[57],bit_met_s[58],bit_met_s[59],bit_met_s[60],bit_met_s[61],bit_met_s[62],bit_met_s[63]); + xmm1 = max_epi16(bit_met_s[48],bit_met_s[49],bit_met_s[50],bit_met_s[51],bit_met_s[52],bit_met_s[53],bit_met_s[54],bit_met_s[55]); + xmm2 = max_epi16(bit_met_s[40],bit_met_s[41],bit_met_s[42],bit_met_s[43],bit_met_s[44],bit_met_s[45],bit_met_s[46],bit_met_s[47]); + xmm3 = max_epi16(bit_met_s[32],bit_met_s[33],bit_met_s[34],bit_met_s[35],bit_met_s[36],bit_met_s[37],bit_met_s[38],bit_met_s[39]); + logmax_den_re0 = simde_mm_max_epi16(simde_mm_max_epi16(xmm0, xmm1), simde_mm_max_epi16(xmm2, xmm3)); + + // bit = 0 + xmm0 = max_epi16(bit_met_s[0],bit_met_s[1],bit_met_s[2],bit_met_s[3],bit_met_s[4],bit_met_s[5],bit_met_s[6],bit_met_s[7]); + xmm1 = max_epi16(bit_met_s[8],bit_met_s[9],bit_met_s[10],bit_met_s[11],bit_met_s[12],bit_met_s[13],bit_met_s[14],bit_met_s[15]); + xmm2 = max_epi16(bit_met_s[16],bit_met_s[17],bit_met_s[18],bit_met_s[19],bit_met_s[20],bit_met_s[21],bit_met_s[22],bit_met_s[23]); + xmm3 = max_epi16(bit_met_s[24],bit_met_s[25],bit_met_s[26],bit_met_s[27],bit_met_s[28],bit_met_s[29],bit_met_s[30],bit_met_s[31]); + logmax_num_re0 = simde_mm_max_epi16(simde_mm_max_epi16(xmm0, xmm1), simde_mm_max_epi16(xmm2, xmm3)); + + y0r = simde_mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + // Detection for 2nd bit + // bit = 1 + xmm0 = max_epi16(bit_met_s[4],bit_met_s[12],bit_met_s[20],bit_met_s[28],bit_met_s[36],bit_met_s[44],bit_met_s[52],bit_met_s[60]); + xmm1 = max_epi16(bit_met_s[5],bit_met_s[13],bit_met_s[21],bit_met_s[29],bit_met_s[37],bit_met_s[45],bit_met_s[53],bit_met_s[61]); + xmm2 = max_epi16(bit_met_s[6],bit_met_s[14],bit_met_s[22],bit_met_s[30],bit_met_s[38],bit_met_s[46],bit_met_s[54],bit_met_s[62]); + xmm3 = max_epi16(bit_met_s[7],bit_met_s[15],bit_met_s[23],bit_met_s[31],bit_met_s[39],bit_met_s[47],bit_met_s[55],bit_met_s[63]); + logmax_den_re0 = simde_mm_max_epi16(simde_mm_max_epi16(xmm0, xmm1), simde_mm_max_epi16(xmm2, xmm3)); + + // bit = 0 + xmm0 = max_epi16(bit_met_s[3],bit_met_s[11],bit_met_s[19],bit_met_s[27],bit_met_s[35],bit_met_s[43],bit_met_s[51],bit_met_s[59]); + xmm1 = max_epi16(bit_met_s[2],bit_met_s[10],bit_met_s[18],bit_met_s[26],bit_met_s[34],bit_met_s[42],bit_met_s[50],bit_met_s[58]); + xmm2 = max_epi16(bit_met_s[1],bit_met_s[9],bit_met_s[17],bit_met_s[25],bit_met_s[33],bit_met_s[41],bit_met_s[49],bit_met_s[57]); + xmm3 = max_epi16(bit_met_s[0],bit_met_s[8],bit_met_s[16],bit_met_s[24],bit_met_s[32],bit_met_s[40],bit_met_s[48],bit_met_s[56]); + logmax_num_re0 = simde_mm_max_epi16(simde_mm_max_epi16(xmm0, xmm1), simde_mm_max_epi16(xmm2, xmm3)); + + y1r = simde_mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + // Detection for 3rd bit + xmm0 = max_epi16(bit_met_s[63],bit_met_s[62],bit_met_s[61],bit_met_s[60],bit_met_s[59],bit_met_s[58],bit_met_s[57],bit_met_s[56]); + xmm1 = max_epi16(bit_met_s[55],bit_met_s[54],bit_met_s[53],bit_met_s[52],bit_met_s[51],bit_met_s[50],bit_met_s[49],bit_met_s[48]); + xmm2 = max_epi16(bit_met_s[15],bit_met_s[14],bit_met_s[13],bit_met_s[12],bit_met_s[11],bit_met_s[10],bit_met_s[9],bit_met_s[8]); + xmm3 = max_epi16(bit_met_s[7],bit_met_s[6],bit_met_s[5],bit_met_s[4],bit_met_s[3],bit_met_s[2],bit_met_s[1],bit_met_s[0]); + logmax_den_re0 = simde_mm_max_epi16(simde_mm_max_epi16(xmm0, xmm1), simde_mm_max_epi16(xmm2, xmm3)); + + xmm0 = max_epi16(bit_met_s[47],bit_met_s[46],bit_met_s[45],bit_met_s[44],bit_met_s[43],bit_met_s[42],bit_met_s[41],bit_met_s[40]); + xmm1 = max_epi16(bit_met_s[39],bit_met_s[38],bit_met_s[37],bit_met_s[36],bit_met_s[35],bit_met_s[34],bit_met_s[33],bit_met_s[32]); + xmm2 = max_epi16(bit_met_s[31],bit_met_s[30],bit_met_s[29],bit_met_s[28],bit_met_s[27],bit_met_s[26],bit_met_s[25],bit_met_s[24]); + xmm3 = max_epi16(bit_met_s[23],bit_met_s[22],bit_met_s[21],bit_met_s[20],bit_met_s[19],bit_met_s[18],bit_met_s[17],bit_met_s[16]); + logmax_num_re0 = simde_mm_max_epi16(simde_mm_max_epi16(xmm0, xmm1), simde_mm_max_epi16(xmm2, xmm3)); + + simde__m128i y2r = simde_mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + // Detection for 4th bit + xmm0 = max_epi16(bit_met_s[0],bit_met_s[8],bit_met_s[16],bit_met_s[24],bit_met_s[32],bit_met_s[40],bit_met_s[48],bit_met_s[56]); + xmm1 = max_epi16(bit_met_s[1],bit_met_s[9],bit_met_s[17],bit_met_s[25],bit_met_s[33],bit_met_s[41],bit_met_s[49],bit_met_s[57]); + xmm2 = max_epi16(bit_met_s[6],bit_met_s[14],bit_met_s[22],bit_met_s[30],bit_met_s[38],bit_met_s[46],bit_met_s[54],bit_met_s[62]); + xmm3 = max_epi16(bit_met_s[7],bit_met_s[15],bit_met_s[23],bit_met_s[31],bit_met_s[39],bit_met_s[47],bit_met_s[55],bit_met_s[63]); + logmax_den_re0 = simde_mm_max_epi16(simde_mm_max_epi16(xmm0, xmm1), simde_mm_max_epi16(xmm2, xmm3)); + + xmm0 = max_epi16(bit_met_s[4],bit_met_s[12],bit_met_s[20],bit_met_s[28],bit_met_s[36],bit_met_s[44],bit_met_s[52],bit_met_s[60]); + xmm1 = max_epi16(bit_met_s[5],bit_met_s[13],bit_met_s[21],bit_met_s[29],bit_met_s[37],bit_met_s[45],bit_met_s[53],bit_met_s[61]); + xmm2 = max_epi16(bit_met_s[3],bit_met_s[11],bit_met_s[19],bit_met_s[27],bit_met_s[35],bit_met_s[43],bit_met_s[51],bit_met_s[59]); + xmm3 = max_epi16(bit_met_s[2],bit_met_s[10],bit_met_s[18],bit_met_s[26],bit_met_s[34],bit_met_s[42],bit_met_s[50],bit_met_s[58]); + logmax_num_re0 = simde_mm_max_epi16(simde_mm_max_epi16(xmm0, xmm1), simde_mm_max_epi16(xmm2, xmm3)); + + y0i = simde_mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + // Detection for 5th bit + xmm0 = max_epi16(bit_met_s[63],bit_met_s[62],bit_met_s[61],bit_met_s[60],bit_met_s[59],bit_met_s[58],bit_met_s[57],bit_met_s[56]); + xmm1 = max_epi16(bit_met_s[39],bit_met_s[38],bit_met_s[37],bit_met_s[36],bit_met_s[35],bit_met_s[34],bit_met_s[33],bit_met_s[32]); + xmm2 = max_epi16(bit_met_s[31],bit_met_s[30],bit_met_s[29],bit_met_s[28],bit_met_s[27],bit_met_s[26],bit_met_s[25],bit_met_s[24]); + xmm3 = max_epi16(bit_met_s[7],bit_met_s[6],bit_met_s[5],bit_met_s[4],bit_met_s[3],bit_met_s[2],bit_met_s[1],bit_met_s[0]); + logmax_den_re0 = simde_mm_max_epi16(simde_mm_max_epi16(xmm0, xmm1), simde_mm_max_epi16(xmm2, xmm3)); + + xmm0 = max_epi16(bit_met_s[55],bit_met_s[54],bit_met_s[53],bit_met_s[52],bit_met_s[51],bit_met_s[50],bit_met_s[49],bit_met_s[48]); + xmm1 = max_epi16(bit_met_s[47],bit_met_s[46],bit_met_s[45],bit_met_s[44],bit_met_s[43],bit_met_s[42],bit_met_s[41],bit_met_s[40]); + xmm2 = max_epi16(bit_met_s[23],bit_met_s[22],bit_met_s[21],bit_met_s[20],bit_met_s[19],bit_met_s[18],bit_met_s[17],bit_met_s[16]); + xmm3 = max_epi16(bit_met_s[15],bit_met_s[14],bit_met_s[13],bit_met_s[12],bit_met_s[11],bit_met_s[10],bit_met_s[9],bit_met_s[8]); + logmax_num_re0 = simde_mm_max_epi16(simde_mm_max_epi16(xmm0, xmm1), simde_mm_max_epi16(xmm2, xmm3)); + + y1i = simde_mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + // Detection for 6th bit + xmm0 = max_epi16(bit_met_s[0],bit_met_s[8],bit_met_s[16],bit_met_s[24],bit_met_s[32],bit_met_s[40],bit_met_s[48],bit_met_s[56]); + xmm1 = max_epi16(bit_met_s[3],bit_met_s[11],bit_met_s[19],bit_met_s[27],bit_met_s[35],bit_met_s[43],bit_met_s[51],bit_met_s[59]); + xmm2 = max_epi16(bit_met_s[4],bit_met_s[12],bit_met_s[20],bit_met_s[28],bit_met_s[36],bit_met_s[44],bit_met_s[52],bit_met_s[60]); + xmm3 = max_epi16(bit_met_s[7],bit_met_s[15],bit_met_s[23],bit_met_s[31],bit_met_s[39],bit_met_s[47],bit_met_s[55],bit_met_s[63]); + logmax_den_re0 = simde_mm_max_epi16(simde_mm_max_epi16(xmm0, xmm1), simde_mm_max_epi16(xmm2, xmm3)); + + xmm0 = max_epi16(bit_met_s[6],bit_met_s[14],bit_met_s[22],bit_met_s[30],bit_met_s[38],bit_met_s[46],bit_met_s[54],bit_met_s[62]); + xmm1 = max_epi16(bit_met_s[5],bit_met_s[13],bit_met_s[21],bit_met_s[29],bit_met_s[37],bit_met_s[45],bit_met_s[53],bit_met_s[61]); + xmm2 = max_epi16(bit_met_s[2],bit_met_s[10],bit_met_s[18],bit_met_s[26],bit_met_s[34],bit_met_s[42],bit_met_s[50],bit_met_s[58]); + xmm3 = max_epi16(bit_met_s[1],bit_met_s[9],bit_met_s[17],bit_met_s[25],bit_met_s[33],bit_met_s[41],bit_met_s[49],bit_met_s[57]); + logmax_num_re0 = simde_mm_max_epi16(simde_mm_max_epi16(xmm0, xmm1), simde_mm_max_epi16(xmm2, xmm3)); + + simde__m128i y2i = simde_mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + // Map to output stream, difficult to do in SIMD since we have 6 16bit LLRs + int idx0 = 12 * i; + for (int re = 0; re < 8; re++) { + stream0_out[idx0 + 0].r = ((short *)&y0r)[re]; + stream0_out[idx0 + 0].i = ((short *)&y1r)[re]; + stream0_out[idx0 + 1].r = ((short *)&y2r)[re]; + stream0_out[idx0 + 1].i = ((short *)&y0i)[re]; + stream0_out[idx0 + 2].r = ((short *)&y1i)[re]; + stream0_out[idx0 + 2].i = ((short *)&y2i)[re]; + idx0 += 3; + } + } +#else simde__m256i *rho01_256i = (simde__m256i *)rho01; simde__m256i *stream0_256i_in = (simde__m256i *)stream0_in; simde__m256i *stream1_256i_in = (simde__m256i *)stream1_in; @@ -1130,15 +1750,6 @@ void nr_ulsch_qam64_qam64(c16_t *stream0_in, simde__m256i ch_mag_des; simde__m256i ch_mag_int; - simde__m256i ch_mag_98_over_42_with_sigma2; - simde__m256i ch_mag_74_over_42_with_sigma2; - simde__m256i ch_mag_58_over_42_with_sigma2; - simde__m256i ch_mag_50_over_42_with_sigma2; - simde__m256i ch_mag_34_over_42_with_sigma2; - simde__m256i ch_mag_18_over_42_with_sigma2; - simde__m256i ch_mag_26_over_42_with_sigma2; - simde__m256i ch_mag_10_over_42_with_sigma2; - simde__m256i ch_mag_2_over_42_with_sigma2; simde__m256i y0r_one_over_sqrt_21; simde__m256i y0r_three_over_sqrt_21; simde__m256i y0r_five_over_sqrt_21; @@ -1156,26 +1767,27 @@ void nr_ulsch_qam64_qam64(c16_t *stream0_in, for (int i = 0; i < len256; i += 2) { // Get rho - simde__m256i xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8; + simde__m256i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8; simde_mm256_separate_real_imag_parts(&xmm2, &xmm3, rho01_256i[i], rho01_256i[i + 1]); simde__m256i rho_rpi = simde_mm256_adds_epi16(xmm2, xmm3); // rho = Re(rho) + Im(rho) simde__m256i rho_rmi = simde_mm256_subs_epi16(xmm2, xmm3); // rho* = Re(rho) - Im(rho) // Compute the different rhos - simde__m256i rho_rpi_1_1 = simde_mm256_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42); - simde__m256i rho_rmi_1_1 = simde_mm256_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42); - simde__m256i rho_rpi_3_3 = simde_mm256_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42); - simde__m256i rho_rmi_3_3 = simde_mm256_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42); - simde__m256i rho_rpi_5_5 = simde_mm256_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42); - simde__m256i rho_rmi_5_5 = simde_mm256_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42); - simde__m256i rho_rpi_7_7 = simde_mm256_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42); - simde__m256i rho_rmi_7_7 = simde_mm256_mulhi_epi16(rho_rmi, SEVEN_OVER_SQRT_42); + simde__m256i rho_rs[32]; + rho_rs[27] = simde_mm256_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42); + rho_rs[28] = simde_mm256_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42); + rho_rs[18] = simde_mm256_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42); + rho_rs[21] = simde_mm256_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42); + rho_rs[9] = simde_mm256_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42); + rho_rs[14] = simde_mm256_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42); + rho_rs[0] = simde_mm256_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42); + rho_rs[7] = simde_mm256_mulhi_epi16(rho_rmi, SEVEN_OVER_SQRT_42); - rho_rpi_5_5 = simde_mm256_slli_epi16(rho_rpi_5_5, 1); - rho_rmi_5_5 = simde_mm256_slli_epi16(rho_rmi_5_5, 1); - rho_rpi_7_7 = simde_mm256_slli_epi16(rho_rpi_7_7, 2); - rho_rmi_7_7 = simde_mm256_slli_epi16(rho_rmi_7_7, 2); + rho_rs[9] = simde_mm256_slli_epi16(rho_rs[9], 1); + rho_rs[14] = simde_mm256_slli_epi16(rho_rs[14], 1); + rho_rs[0] = simde_mm256_slli_epi16(rho_rs[0], 2); + rho_rs[7] = simde_mm256_slli_epi16(rho_rs[7], 2); xmm4 = simde_mm256_mulhi_epi16(xmm2, ONE_OVER_SQRT_42); xmm5 = simde_mm256_mulhi_epi16(xmm3, ONE_OVER_SQRT_42); @@ -1185,306 +1797,68 @@ void nr_ulsch_qam64_qam64(c16_t *stream0_in, xmm7 = simde_mm256_slli_epi16(xmm7, 1); xmm8 = simde_mm256_slli_epi16(xmm8, 2); - simde__m256i rho_rpi_1_3 = simde_mm256_adds_epi16(xmm4, xmm6); - simde__m256i rho_rmi_1_3 = simde_mm256_subs_epi16(xmm4, xmm6); - simde__m256i rho_rpi_1_5 = simde_mm256_adds_epi16(xmm4, xmm7); - simde__m256i rho_rmi_1_5 = simde_mm256_subs_epi16(xmm4, xmm7); - simde__m256i rho_rpi_1_7 = simde_mm256_adds_epi16(xmm4, xmm8); - simde__m256i rho_rmi_1_7 = simde_mm256_subs_epi16(xmm4, xmm8); + rho_rs[26] = simde_mm256_adds_epi16(xmm4, xmm6); + rho_rs[29] = simde_mm256_subs_epi16(xmm4, xmm6); + rho_rs[25] = simde_mm256_adds_epi16(xmm4, xmm7); + rho_rs[30] = simde_mm256_subs_epi16(xmm4, xmm7); + rho_rs[24] = simde_mm256_adds_epi16(xmm4, xmm8); + rho_rs[31] = simde_mm256_subs_epi16(xmm4, xmm8); xmm4 = simde_mm256_mulhi_epi16(xmm2, THREE_OVER_SQRT_42); - simde__m256i rho_rpi_3_1 = simde_mm256_adds_epi16(xmm4, xmm5); - simde__m256i rho_rmi_3_1 = simde_mm256_subs_epi16(xmm4, xmm5); - simde__m256i rho_rpi_3_5 = simde_mm256_adds_epi16(xmm4, xmm7); - simde__m256i rho_rmi_3_5 = simde_mm256_subs_epi16(xmm4, xmm7); - simde__m256i rho_rpi_3_7 = simde_mm256_adds_epi16(xmm4, xmm8); - simde__m256i rho_rmi_3_7 = simde_mm256_subs_epi16(xmm4, xmm8); + rho_rs[19] = simde_mm256_adds_epi16(xmm4, xmm5); + rho_rs[20] = simde_mm256_subs_epi16(xmm4, xmm5); + rho_rs[17] = simde_mm256_adds_epi16(xmm4, xmm7); + rho_rs[22] = simde_mm256_subs_epi16(xmm4, xmm7); + rho_rs[16] = simde_mm256_adds_epi16(xmm4, xmm8); + rho_rs[23] = simde_mm256_subs_epi16(xmm4, xmm8); xmm4 = simde_mm256_mulhi_epi16(xmm2, FIVE_OVER_SQRT_42); xmm4 = simde_mm256_slli_epi16(xmm4, 1); - simde__m256i rho_rpi_5_1 = simde_mm256_adds_epi16(xmm4, xmm5); - simde__m256i rho_rmi_5_1 = simde_mm256_subs_epi16(xmm4, xmm5); - simde__m256i rho_rpi_5_3 = simde_mm256_adds_epi16(xmm4, xmm6); - simde__m256i rho_rmi_5_3 = simde_mm256_subs_epi16(xmm4, xmm6); - simde__m256i rho_rpi_5_7 = simde_mm256_adds_epi16(xmm4, xmm8); - simde__m256i rho_rmi_5_7 = simde_mm256_subs_epi16(xmm4, xmm8); + rho_rs[11] = simde_mm256_adds_epi16(xmm4, xmm5); + rho_rs[12] = simde_mm256_subs_epi16(xmm4, xmm5); + rho_rs[10] = simde_mm256_adds_epi16(xmm4, xmm6); + rho_rs[13] = simde_mm256_subs_epi16(xmm4, xmm6); + rho_rs[8] = simde_mm256_adds_epi16(xmm4, xmm8); + rho_rs[15] = simde_mm256_subs_epi16(xmm4, xmm8); xmm4 = simde_mm256_mulhi_epi16(xmm2, SEVEN_OVER_SQRT_42); xmm4 = simde_mm256_slli_epi16(xmm4, 2); - simde__m256i rho_rpi_7_1 = simde_mm256_adds_epi16(xmm4, xmm5); - simde__m256i rho_rmi_7_1 = simde_mm256_subs_epi16(xmm4, xmm5); - simde__m256i rho_rpi_7_3 = simde_mm256_adds_epi16(xmm4, xmm6); - simde__m256i rho_rmi_7_3 = simde_mm256_subs_epi16(xmm4, xmm6); - simde__m256i rho_rpi_7_5 = simde_mm256_adds_epi16(xmm4, xmm7); - simde__m256i rho_rmi_7_5 = simde_mm256_subs_epi16(xmm4, xmm7); + rho_rs[3] = simde_mm256_adds_epi16(xmm4, xmm5); + rho_rs[4] = simde_mm256_subs_epi16(xmm4, xmm5); + rho_rs[2] = simde_mm256_adds_epi16(xmm4, xmm6); + rho_rs[5] = simde_mm256_subs_epi16(xmm4, xmm6); + rho_rs[1] = simde_mm256_adds_epi16(xmm4, xmm7); + rho_rs[6] = simde_mm256_subs_epi16(xmm4, xmm7); // Rearrange interfering MF output - simde__m256i y1r, y1i, xmm0; + simde__m256i y1r, y1i; simde_mm256_separate_real_imag_parts(&y1r, &y1i, stream1_256i_in[i], stream1_256i_in[i + 1]); // Psi_r calculation from rho_rpi or rho_rmi xmm0 = simde_mm256_broadcastw_epi16(simde_mm_set1_epi16(0)); // ZERO for abs_pi16 - xmm2 = simde_mm256_subs_epi16(rho_rpi_7_7, y1r); + xmm2 = simde_mm256_subs_epi16(rho_rs[0], y1r); - simde__m256i psi_r_p7_p7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_7_5, y1r); - simde__m256i psi_r_p7_p5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_7_3, y1r); - simde__m256i psi_r_p7_p3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_7_1, y1r); - simde__m256i psi_r_p7_p1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_7_1, y1r); - simde__m256i psi_r_p7_m1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_7_3, y1r); - simde__m256i psi_r_p7_m3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_7_5, y1r); - simde__m256i psi_r_p7_m5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_7_7, y1r); - simde__m256i psi_r_p7_m7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_5_7, y1r); - simde__m256i psi_r_p5_p7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_5_5, y1r); - simde__m256i psi_r_p5_p5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_5_3, y1r); - simde__m256i psi_r_p5_p3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_5_1, y1r); - simde__m256i psi_r_p5_p1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_5_1, y1r); - simde__m256i psi_r_p5_m1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_5_3, y1r); - simde__m256i psi_r_p5_m3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_5_5, y1r); - simde__m256i psi_r_p5_m5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_5_7, y1r); - simde__m256i psi_r_p5_m7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_3_7, y1r); - simde__m256i psi_r_p3_p7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_3_5, y1r); - simde__m256i psi_r_p3_p5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_3_3, y1r); - simde__m256i psi_r_p3_p3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_3_1, y1r); - simde__m256i psi_r_p3_p1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_3_1, y1r); - simde__m256i psi_r_p3_m1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_3_3, y1r); - simde__m256i psi_r_p3_m3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_3_5, y1r); - simde__m256i psi_r_p3_m5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_3_7, y1r); - simde__m256i psi_r_p3_m7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_1_7, y1r); - simde__m256i psi_r_p1_p7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_1_5, y1r); - simde__m256i psi_r_p1_p5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_1_3, y1r); - simde__m256i psi_r_p1_p3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_1_1, y1r); - simde__m256i psi_r_p1_p1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_1_1, y1r); - simde__m256i psi_r_p1_m1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_1_3, y1r); - simde__m256i psi_r_p1_m3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_1_5, y1r); - simde__m256i psi_r_p1_m5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_1_7, y1r); - simde__m256i psi_r_p1_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_s[64]; + for(int j=0; j<32; j++) // psi_r_s[0~31], rho_rs[0~31] + psi_r_s[j] = simde_mm256_abs_epi16(simde_mm256_subs_epi16(rho_rs[j], y1r)); + for(int j=32; j<64; j++) // psi_r_s[32~64], rho_rs[31~0] + psi_r_s[j] = simde_mm256_abs_epi16(simde_mm256_adds_epi16(rho_rs[63 - j], y1r)); - xmm2 = simde_mm256_adds_epi16(rho_rmi_1_7, y1r); - simde__m256i psi_r_m1_p7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_1_5, y1r); - simde__m256i psi_r_m1_p5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_1_3, y1r); - simde__m256i psi_r_m1_p3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_1_1, y1r); - simde__m256i psi_r_m1_p1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_1_1, y1r); - simde__m256i psi_r_m1_m1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_1_3, y1r); - simde__m256i psi_r_m1_m3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_1_5, y1r); - simde__m256i psi_r_m1_m5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_1_7, y1r); - simde__m256i psi_r_m1_m7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_3_7, y1r); - simde__m256i psi_r_m3_p7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_3_5, y1r); - simde__m256i psi_r_m3_p5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_3_3, y1r); - simde__m256i psi_r_m3_p3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_3_1, y1r); - simde__m256i psi_r_m3_p1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_3_1, y1r); - simde__m256i psi_r_m3_m1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_3_3, y1r); - simde__m256i psi_r_m3_m3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_3_5, y1r); - simde__m256i psi_r_m3_m5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_3_7, y1r); - simde__m256i psi_r_m3_m7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_5_7, y1r); - simde__m256i psi_r_m5_p7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_5_5, y1r); - simde__m256i psi_r_m5_p5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_5_3, y1r); - simde__m256i psi_r_m5_p3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_5_1, y1r); - simde__m256i psi_r_m5_p1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_5_1, y1r); - simde__m256i psi_r_m5_m1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_5_3, y1r); - simde__m256i psi_r_m5_m3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_5_5, y1r); - simde__m256i psi_r_m5_m5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_5_7, y1r); - simde__m256i psi_r_m5_m7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_7_7, y1r); - simde__m256i psi_r_m7_p7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_7_5, y1r); - simde__m256i psi_r_m7_p5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_7_3, y1r); - simde__m256i psi_r_m7_p3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_7_1, y1r); - simde__m256i psi_r_m7_p1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_7_1, y1r); - simde__m256i psi_r_m7_m1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_7_3, y1r); - simde__m256i psi_r_m7_m3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_7_5, y1r); - simde__m256i psi_r_m7_m5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_7_7, y1r); - simde__m256i psi_r_m7_m7 = simde_mm256_abs_epi16(xmm2); - - // Simde__M256i Psi_i calculation from rho_rpi or rho_rmi - xmm2 = simde_mm256_subs_epi16(rho_rmi_7_7, y1i); - simde__m256i psi_i_p7_p7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_5_7, y1i); - simde__m256i psi_i_p7_p5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_3_7, y1i); - simde__m256i psi_i_p7_p3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_1_7, y1i); - simde__m256i psi_i_p7_p1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_1_7, y1i); - simde__m256i psi_i_p7_m1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_3_7, y1i); - simde__m256i psi_i_p7_m3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_5_7, y1i); - simde__m256i psi_i_p7_m5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_7_7, y1i); - simde__m256i psi_i_p7_m7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_7_5, y1i); - simde__m256i psi_i_p5_p7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_5_5, y1i); - simde__m256i psi_i_p5_p5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_3_5, y1i); - simde__m256i psi_i_p5_p3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_1_5, y1i); - simde__m256i psi_i_p5_p1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_1_5, y1i); - simde__m256i psi_i_p5_m1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_3_5, y1i); - simde__m256i psi_i_p5_m3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_5_5, y1i); - simde__m256i psi_i_p5_m5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_7_5, y1i); - simde__m256i psi_i_p5_m7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_7_3, y1i); - simde__m256i psi_i_p3_p7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_5_3, y1i); - simde__m256i psi_i_p3_p5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_3_3, y1i); - simde__m256i psi_i_p3_p3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_1_3, y1i); - simde__m256i psi_i_p3_p1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_1_3, y1i); - simde__m256i psi_i_p3_m1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_3_3, y1i); - simde__m256i psi_i_p3_m3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_5_3, y1i); - simde__m256i psi_i_p3_m5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_7_3, y1i); - simde__m256i psi_i_p3_m7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_7_1, y1i); - simde__m256i psi_i_p1_p7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_5_1, y1i); - simde__m256i psi_i_p1_p5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_3_1, y1i); - simde__m256i psi_i_p1_p3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rmi_1_1, y1i); - simde__m256i psi_i_p1_p1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_1_1, y1i); - simde__m256i psi_i_p1_m1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_3_1, y1i); - simde__m256i psi_i_p1_m3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_5_1, y1i); - simde__m256i psi_i_p1_m5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rpi_7_1, y1i); - simde__m256i psi_i_p1_m7 = simde_mm256_abs_epi16(xmm2); - - xmm2 = simde_mm256_subs_epi16(rho_rpi_7_1, y1i); - simde__m256i psi_i_m1_p7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_5_1, y1i); - simde__m256i psi_i_m1_p5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_3_1, y1i); - simde__m256i psi_i_m1_p3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_1_1, y1i); - simde__m256i psi_i_m1_p1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_1_1, y1i); - simde__m256i psi_i_m1_m1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_3_1, y1i); - simde__m256i psi_i_m1_m3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_5_1, y1i); - simde__m256i psi_i_m1_m5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_7_1, y1i); - simde__m256i psi_i_m1_m7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_7_3, y1i); - simde__m256i psi_i_m3_p7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_5_3, y1i); - simde__m256i psi_i_m3_p5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_3_3, y1i); - simde__m256i psi_i_m3_p3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_1_3, y1i); - simde__m256i psi_i_m3_p1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_1_3, y1i); - simde__m256i psi_i_m3_m1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_3_3, y1i); - simde__m256i psi_i_m3_m3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_5_3, y1i); - simde__m256i psi_i_m3_m5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_7_3, y1i); - simde__m256i psi_i_m3_m7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_7_5, y1i); - simde__m256i psi_i_m5_p7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_5_5, y1i); - simde__m256i psi_i_m5_p5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_3_5, y1i); - simde__m256i psi_i_m5_p3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_1_5, y1i); - simde__m256i psi_i_m5_p1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_1_5, y1i); - simde__m256i psi_i_m5_m1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_3_5, y1i); - simde__m256i psi_i_m5_m3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_5_5, y1i); - simde__m256i psi_i_m5_m5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_7_5, y1i); - simde__m256i psi_i_m5_m7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_7_7, y1i); - simde__m256i psi_i_m7_p7 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_5_7, y1i); - simde__m256i psi_i_m7_p5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_3_7, y1i); - simde__m256i psi_i_m7_p3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_subs_epi16(rho_rpi_1_7, y1i); - simde__m256i psi_i_m7_p1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_1_7, y1i); - simde__m256i psi_i_m7_m1 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_3_7, y1i); - simde__m256i psi_i_m7_m3 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_5_7, y1i); - simde__m256i psi_i_m7_m5 = simde_mm256_abs_epi16(xmm2); - xmm2 = simde_mm256_adds_epi16(rho_rmi_7_7, y1i); - simde__m256i psi_i_m7_m7 = simde_mm256_abs_epi16(xmm2); + // simde__m256i psi_i calculation from rho_rpi or rho_rmi + simde__m256i psi_i_s[64]; + const uint8_t rho_rs_index[32] = {7,15,23,31,24,16,8,0,6,14,22,30,25,17,9,1,5,13,21,29,26,18,10,2,4,12,20,28,27,19,11,3}; + for(int k=0; k<32; k+=8){ // psi_i_s[0~31] + for(int j=k; j>3], y0i_seven_over_sqrt_21); + y0_s[j+1] = simde_mm256_adds_epi16(y0r_over_s[j>>3], y0i_five_over_sqrt_21); + y0_s[j+2] = simde_mm256_adds_epi16(y0r_over_s[j>>3], y0i_three_over_sqrt_21); + y0_s[j+3] = simde_mm256_adds_epi16(y0r_over_s[j>>3], y0i_one_over_sqrt_21); + y0_s[j+4] = simde_mm256_subs_epi16(y0r_over_s[j>>3], y0i_one_over_sqrt_21); + y0_s[j+5] = simde_mm256_subs_epi16(y0r_over_s[j>>3], y0i_three_over_sqrt_21); + y0_s[j+6] = simde_mm256_subs_epi16(y0r_over_s[j>>3], y0i_five_over_sqrt_21); + y0_s[j+7] = simde_mm256_subs_epi16(y0r_over_s[j>>3], y0i_seven_over_sqrt_21); + } - simde__m256i y0_m_1_1 = simde_mm256_subs_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); - simde__m256i y0_m_1_3 = simde_mm256_subs_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); - simde__m256i y0_m_1_5 = simde_mm256_subs_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); - simde__m256i y0_m_1_7 = simde_mm256_subs_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); - simde__m256i y0_m_3_1 = simde_mm256_subs_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); - simde__m256i y0_m_3_3 = simde_mm256_subs_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); - simde__m256i y0_m_3_5 = simde_mm256_subs_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); - simde__m256i y0_m_3_7 = simde_mm256_subs_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); - simde__m256i y0_m_5_1 = simde_mm256_subs_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); - simde__m256i y0_m_5_3 = simde_mm256_subs_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); - simde__m256i y0_m_5_5 = simde_mm256_subs_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); - simde__m256i y0_m_5_7 = simde_mm256_subs_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); - simde__m256i y0_m_7_1 = simde_mm256_subs_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); - simde__m256i y0_m_7_3 = simde_mm256_subs_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); - simde__m256i y0_m_7_5 = simde_mm256_subs_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); - simde__m256i y0_m_7_7 = simde_mm256_subs_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); - - // Detection of interference term ch_mag_int_with_sigma2 = simde_mm256_srai_epi16(ch_mag_int, 1); // *2 two_ch_mag_int_with_sigma2 = ch_mag_int; // *4 three_ch_mag_int_with_sigma2 = simde_mm256_adds_epi16(ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2); // *6 - simde__m256i tmp_result, tmp_result2, tmp_result3, tmp_result4; - interference_abs_64qam_epi16_256(psi_r_p7_p7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p7_p7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p7_p5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p7_p5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p7_p3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p7_p3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p7_p1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p7_p1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p7_m1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p7_m1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p7_m3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p7_m3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p7_m5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p7_m5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p7_m7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p7_m7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p5_p7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p5_p7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p5_p5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p5_p5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p5_p3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p5_p3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p5_p1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p5_p1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p5_m1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p5_m1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p5_m3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p5_m3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p5_m5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p5_m5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p5_m7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p5_m7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p3_p7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p3_p7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p3_p5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p3_p5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p3_p3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p3_p3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p3_p1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p3_p1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p3_m1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p3_m1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p3_m3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p3_m3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p3_m5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p3_m5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p3_m7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p3_m7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p1_p7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p1_p7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p1_p5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p1_p5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p1_p3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p1_p3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p1_p1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p1_p1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p1_m1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p1_m1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p1_m3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p1_m3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p1_m5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p1_m5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_p1_m7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_p1_m7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m1_p7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m1_p7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m1_p5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m1_p5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m1_p3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m1_p3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m1_p1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m1_p1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m1_m1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m1_m1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m1_m3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m1_m3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m1_m5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m1_m5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m1_m7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m1_m7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m3_p7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m3_p7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m3_p5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m3_p5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m3_p3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m3_p3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m3_p1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m3_p1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m3_m1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m3_m1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m3_m3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m3_m3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m3_m5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m3_m5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m3_m7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m3_m7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m5_p7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m5_p7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m5_p5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m5_p5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m5_p3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m5_p3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m5_p1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m5_p1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m5_m1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m5_m1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m5_m3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m5_m3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m5_m5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m5_m5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m5_m7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m5_m7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m7_p7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m7_p7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m7_p5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m7_p5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m7_p3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m7_p3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m7_p1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m7_p1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m7_m1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m7_m1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m7_m3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m7_m3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m7_m5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m7_m5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_r_m7_m7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_r_m7_m7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); + simde__m256i a_r_s[64]; + simde__m256i a_i_s[64]; + simde__m256i psi_a_s[64]; + simde__m256i a_sq_s[64]; + for(int j=0; j<64; j++){ + // Detection of interference term + a_r_s[j] = interference_abs_64qam_epi16_256(psi_r_s[j], ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, SEVEN_OVER_SQRT_2_42); + a_i_s[j] = interference_abs_64qam_epi16_256(psi_i_s[j], ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42, SEVEN_OVER_SQRT_2_42); + + // Calculation of a group of two terms in the bit metric involving product of psi and interference + psi_a_s[j] = prodsum_psi_a_epi16_256(psi_r_s[j], a_r_s[j], psi_i_s[j], a_i_s[j]); - interference_abs_64qam_epi16_256(psi_i_p7_p7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p7_p7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p7_p5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p7_p5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p7_p3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p7_p3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p7_p1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p7_p1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p7_m1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p7_m1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p7_m3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p7_m3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p7_m5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p7_m5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p7_m7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p7_m7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p5_p7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p5_p7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p5_p5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p5_p5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p5_p3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p5_p3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p5_p1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p5_p1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p5_m1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p5_m1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p5_m3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p5_m3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p5_m5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p5_m5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p5_m7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p5_m7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p3_p7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p3_p7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p3_p5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p3_p5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p3_p3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p3_p3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p3_p1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p3_p1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p3_m1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p3_m1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p3_m3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p3_m3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p3_m5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p3_m5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p3_m7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p3_m7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p1_p7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p1_p7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p1_p5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p1_p5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p1_p3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p1_p3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p1_p1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p1_p1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p1_m1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p1_m1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p1_m3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p1_m3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p1_m5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p1_m5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_p1_m7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_p1_m7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m1_p7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m1_p7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m1_p5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m1_p5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m1_p3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m1_p3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m1_p1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m1_p1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m1_m1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m1_m1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m1_m3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m1_m3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m1_m5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m1_m5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m1_m7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m1_m7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m3_p7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m3_p7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m3_p5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m3_p5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m3_p3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m3_p3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m3_p1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m3_p1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m3_m1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m3_m1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m3_m3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m3_m3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m3_m5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m3_m5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m3_m7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m3_m7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m5_p7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m5_p7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m5_p5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m5_p5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m5_p3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m5_p3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m5_p1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m5_p1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m5_m1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m5_m1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m5_m3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m5_m3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m5_m5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m5_m5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m5_m7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m5_m7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m7_p7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m7_p7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m7_p5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m7_p5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m7_p3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m7_p3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m7_p1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m7_p1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m7_m1, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m7_m1, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m7_m3, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m7_m3, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m7_m5, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m7_m5, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); - interference_abs_64qam_epi16_256(psi_i_m7_m7, - ch_mag_int_with_sigma2, - two_ch_mag_int_with_sigma2, - three_ch_mag_int_with_sigma2, - a_i_m7_m7, - ONE_OVER_SQRT_2_42, - THREE_OVER_SQRT_2_42, - FIVE_OVER_SQRT_2_42, - SEVEN_OVER_SQRT_2_42); + // Multiply by sqrt(2) + psi_a_s[j] = simde_mm256_slli_epi16(simde_mm256_mulhi_epi16(psi_a_s[j], ONE_OVER_SQRT_2), 2); - // Calculation of a group of two terms in the bit metric involving product of psi and interference - prodsum_psi_a_epi16_256(psi_r_p7_p7, a_r_p7_p7, psi_i_p7_p7, a_i_p7_p7, psi_a_p7_p7); - prodsum_psi_a_epi16_256(psi_r_p7_p5, a_r_p7_p5, psi_i_p7_p5, a_i_p7_p5, psi_a_p7_p5); - prodsum_psi_a_epi16_256(psi_r_p7_p3, a_r_p7_p3, psi_i_p7_p3, a_i_p7_p3, psi_a_p7_p3); - prodsum_psi_a_epi16_256(psi_r_p7_p1, a_r_p7_p1, psi_i_p7_p1, a_i_p7_p1, psi_a_p7_p1); - prodsum_psi_a_epi16_256(psi_r_p7_m1, a_r_p7_m1, psi_i_p7_m1, a_i_p7_m1, psi_a_p7_m1); - prodsum_psi_a_epi16_256(psi_r_p7_m3, a_r_p7_m3, psi_i_p7_m3, a_i_p7_m3, psi_a_p7_m3); - prodsum_psi_a_epi16_256(psi_r_p7_m5, a_r_p7_m5, psi_i_p7_m5, a_i_p7_m5, psi_a_p7_m5); - prodsum_psi_a_epi16_256(psi_r_p7_m7, a_r_p7_m7, psi_i_p7_m7, a_i_p7_m7, psi_a_p7_m7); - prodsum_psi_a_epi16_256(psi_r_p5_p7, a_r_p5_p7, psi_i_p5_p7, a_i_p5_p7, psi_a_p5_p7); - prodsum_psi_a_epi16_256(psi_r_p5_p5, a_r_p5_p5, psi_i_p5_p5, a_i_p5_p5, psi_a_p5_p5); - prodsum_psi_a_epi16_256(psi_r_p5_p3, a_r_p5_p3, psi_i_p5_p3, a_i_p5_p3, psi_a_p5_p3); - prodsum_psi_a_epi16_256(psi_r_p5_p1, a_r_p5_p1, psi_i_p5_p1, a_i_p5_p1, psi_a_p5_p1); - prodsum_psi_a_epi16_256(psi_r_p5_m1, a_r_p5_m1, psi_i_p5_m1, a_i_p5_m1, psi_a_p5_m1); - prodsum_psi_a_epi16_256(psi_r_p5_m3, a_r_p5_m3, psi_i_p5_m3, a_i_p5_m3, psi_a_p5_m3); - prodsum_psi_a_epi16_256(psi_r_p5_m5, a_r_p5_m5, psi_i_p5_m5, a_i_p5_m5, psi_a_p5_m5); - prodsum_psi_a_epi16_256(psi_r_p5_m7, a_r_p5_m7, psi_i_p5_m7, a_i_p5_m7, psi_a_p5_m7); - prodsum_psi_a_epi16_256(psi_r_p3_p7, a_r_p3_p7, psi_i_p3_p7, a_i_p3_p7, psi_a_p3_p7); - prodsum_psi_a_epi16_256(psi_r_p3_p5, a_r_p3_p5, psi_i_p3_p5, a_i_p3_p5, psi_a_p3_p5); - prodsum_psi_a_epi16_256(psi_r_p3_p3, a_r_p3_p3, psi_i_p3_p3, a_i_p3_p3, psi_a_p3_p3); - prodsum_psi_a_epi16_256(psi_r_p3_p1, a_r_p3_p1, psi_i_p3_p1, a_i_p3_p1, psi_a_p3_p1); - prodsum_psi_a_epi16_256(psi_r_p3_m1, a_r_p3_m1, psi_i_p3_m1, a_i_p3_m1, psi_a_p3_m1); - prodsum_psi_a_epi16_256(psi_r_p3_m3, a_r_p3_m3, psi_i_p3_m3, a_i_p3_m3, psi_a_p3_m3); - prodsum_psi_a_epi16_256(psi_r_p3_m5, a_r_p3_m5, psi_i_p3_m5, a_i_p3_m5, psi_a_p3_m5); - prodsum_psi_a_epi16_256(psi_r_p3_m7, a_r_p3_m7, psi_i_p3_m7, a_i_p3_m7, psi_a_p3_m7); - prodsum_psi_a_epi16_256(psi_r_p1_p7, a_r_p1_p7, psi_i_p1_p7, a_i_p1_p7, psi_a_p1_p7); - prodsum_psi_a_epi16_256(psi_r_p1_p5, a_r_p1_p5, psi_i_p1_p5, a_i_p1_p5, psi_a_p1_p5); - prodsum_psi_a_epi16_256(psi_r_p1_p3, a_r_p1_p3, psi_i_p1_p3, a_i_p1_p3, psi_a_p1_p3); - prodsum_psi_a_epi16_256(psi_r_p1_p1, a_r_p1_p1, psi_i_p1_p1, a_i_p1_p1, psi_a_p1_p1); - prodsum_psi_a_epi16_256(psi_r_p1_m1, a_r_p1_m1, psi_i_p1_m1, a_i_p1_m1, psi_a_p1_m1); - prodsum_psi_a_epi16_256(psi_r_p1_m3, a_r_p1_m3, psi_i_p1_m3, a_i_p1_m3, psi_a_p1_m3); - prodsum_psi_a_epi16_256(psi_r_p1_m5, a_r_p1_m5, psi_i_p1_m5, a_i_p1_m5, psi_a_p1_m5); - prodsum_psi_a_epi16_256(psi_r_p1_m7, a_r_p1_m7, psi_i_p1_m7, a_i_p1_m7, psi_a_p1_m7); - prodsum_psi_a_epi16_256(psi_r_m1_p7, a_r_m1_p7, psi_i_m1_p7, a_i_m1_p7, psi_a_m1_p7); - prodsum_psi_a_epi16_256(psi_r_m1_p5, a_r_m1_p5, psi_i_m1_p5, a_i_m1_p5, psi_a_m1_p5); - prodsum_psi_a_epi16_256(psi_r_m1_p3, a_r_m1_p3, psi_i_m1_p3, a_i_m1_p3, psi_a_m1_p3); - prodsum_psi_a_epi16_256(psi_r_m1_p1, a_r_m1_p1, psi_i_m1_p1, a_i_m1_p1, psi_a_m1_p1); - prodsum_psi_a_epi16_256(psi_r_m1_m1, a_r_m1_m1, psi_i_m1_m1, a_i_m1_m1, psi_a_m1_m1); - prodsum_psi_a_epi16_256(psi_r_m1_m3, a_r_m1_m3, psi_i_m1_m3, a_i_m1_m3, psi_a_m1_m3); - prodsum_psi_a_epi16_256(psi_r_m1_m5, a_r_m1_m5, psi_i_m1_m5, a_i_m1_m5, psi_a_m1_m5); - prodsum_psi_a_epi16_256(psi_r_m1_m7, a_r_m1_m7, psi_i_m1_m7, a_i_m1_m7, psi_a_m1_m7); - prodsum_psi_a_epi16_256(psi_r_m3_p7, a_r_m3_p7, psi_i_m3_p7, a_i_m3_p7, psi_a_m3_p7); - prodsum_psi_a_epi16_256(psi_r_m3_p5, a_r_m3_p5, psi_i_m3_p5, a_i_m3_p5, psi_a_m3_p5); - prodsum_psi_a_epi16_256(psi_r_m3_p3, a_r_m3_p3, psi_i_m3_p3, a_i_m3_p3, psi_a_m3_p3); - prodsum_psi_a_epi16_256(psi_r_m3_p1, a_r_m3_p1, psi_i_m3_p1, a_i_m3_p1, psi_a_m3_p1); - prodsum_psi_a_epi16_256(psi_r_m3_m1, a_r_m3_m1, psi_i_m3_m1, a_i_m3_m1, psi_a_m3_m1); - prodsum_psi_a_epi16_256(psi_r_m3_m3, a_r_m3_m3, psi_i_m3_m3, a_i_m3_m3, psi_a_m3_m3); - prodsum_psi_a_epi16_256(psi_r_m3_m5, a_r_m3_m5, psi_i_m3_m5, a_i_m3_m5, psi_a_m3_m5); - prodsum_psi_a_epi16_256(psi_r_m3_m7, a_r_m3_m7, psi_i_m3_m7, a_i_m3_m7, psi_a_m3_m7); - prodsum_psi_a_epi16_256(psi_r_m5_p7, a_r_m5_p7, psi_i_m5_p7, a_i_m5_p7, psi_a_m5_p7); - prodsum_psi_a_epi16_256(psi_r_m5_p5, a_r_m5_p5, psi_i_m5_p5, a_i_m5_p5, psi_a_m5_p5); - prodsum_psi_a_epi16_256(psi_r_m5_p3, a_r_m5_p3, psi_i_m5_p3, a_i_m5_p3, psi_a_m5_p3); - prodsum_psi_a_epi16_256(psi_r_m5_p1, a_r_m5_p1, psi_i_m5_p1, a_i_m5_p1, psi_a_m5_p1); - prodsum_psi_a_epi16_256(psi_r_m5_m1, a_r_m5_m1, psi_i_m5_m1, a_i_m5_m1, psi_a_m5_m1); - prodsum_psi_a_epi16_256(psi_r_m5_m3, a_r_m5_m3, psi_i_m5_m3, a_i_m5_m3, psi_a_m5_m3); - prodsum_psi_a_epi16_256(psi_r_m5_m5, a_r_m5_m5, psi_i_m5_m5, a_i_m5_m5, psi_a_m5_m5); - prodsum_psi_a_epi16_256(psi_r_m5_m7, a_r_m5_m7, psi_i_m5_m7, a_i_m5_m7, psi_a_m5_m7); - prodsum_psi_a_epi16_256(psi_r_m7_p7, a_r_m7_p7, psi_i_m7_p7, a_i_m7_p7, psi_a_m7_p7); - prodsum_psi_a_epi16_256(psi_r_m7_p5, a_r_m7_p5, psi_i_m7_p5, a_i_m7_p5, psi_a_m7_p5); - prodsum_psi_a_epi16_256(psi_r_m7_p3, a_r_m7_p3, psi_i_m7_p3, a_i_m7_p3, psi_a_m7_p3); - prodsum_psi_a_epi16_256(psi_r_m7_p1, a_r_m7_p1, psi_i_m7_p1, a_i_m7_p1, psi_a_m7_p1); - prodsum_psi_a_epi16_256(psi_r_m7_m1, a_r_m7_m1, psi_i_m7_m1, a_i_m7_m1, psi_a_m7_m1); - prodsum_psi_a_epi16_256(psi_r_m7_m3, a_r_m7_m3, psi_i_m7_m3, a_i_m7_m3, psi_a_m7_m3); - prodsum_psi_a_epi16_256(psi_r_m7_m5, a_r_m7_m5, psi_i_m7_m5, a_i_m7_m5, psi_a_m7_m5); - prodsum_psi_a_epi16_256(psi_r_m7_m7, a_r_m7_m7, psi_i_m7_m7, a_i_m7_m7, psi_a_m7_m7); - - // Multiply by sqrt(2) - psi_a_p7_p7 = simde_mm256_mulhi_epi16(psi_a_p7_p7, ONE_OVER_SQRT_2); - psi_a_p7_p7 = simde_mm256_slli_epi16(psi_a_p7_p7, 2); - psi_a_p7_p5 = simde_mm256_mulhi_epi16(psi_a_p7_p5, ONE_OVER_SQRT_2); - psi_a_p7_p5 = simde_mm256_slli_epi16(psi_a_p7_p5, 2); - psi_a_p7_p3 = simde_mm256_mulhi_epi16(psi_a_p7_p3, ONE_OVER_SQRT_2); - psi_a_p7_p3 = simde_mm256_slli_epi16(psi_a_p7_p3, 2); - psi_a_p7_p1 = simde_mm256_mulhi_epi16(psi_a_p7_p1, ONE_OVER_SQRT_2); - psi_a_p7_p1 = simde_mm256_slli_epi16(psi_a_p7_p1, 2); - psi_a_p7_m1 = simde_mm256_mulhi_epi16(psi_a_p7_m1, ONE_OVER_SQRT_2); - psi_a_p7_m1 = simde_mm256_slli_epi16(psi_a_p7_m1, 2); - psi_a_p7_m3 = simde_mm256_mulhi_epi16(psi_a_p7_m3, ONE_OVER_SQRT_2); - psi_a_p7_m3 = simde_mm256_slli_epi16(psi_a_p7_m3, 2); - psi_a_p7_m5 = simde_mm256_mulhi_epi16(psi_a_p7_m5, ONE_OVER_SQRT_2); - psi_a_p7_m5 = simde_mm256_slli_epi16(psi_a_p7_m5, 2); - psi_a_p7_m7 = simde_mm256_mulhi_epi16(psi_a_p7_m7, ONE_OVER_SQRT_2); - psi_a_p7_m7 = simde_mm256_slli_epi16(psi_a_p7_m7, 2); - psi_a_p5_p7 = simde_mm256_mulhi_epi16(psi_a_p5_p7, ONE_OVER_SQRT_2); - psi_a_p5_p7 = simde_mm256_slli_epi16(psi_a_p5_p7, 2); - psi_a_p5_p5 = simde_mm256_mulhi_epi16(psi_a_p5_p5, ONE_OVER_SQRT_2); - psi_a_p5_p5 = simde_mm256_slli_epi16(psi_a_p5_p5, 2); - psi_a_p5_p3 = simde_mm256_mulhi_epi16(psi_a_p5_p3, ONE_OVER_SQRT_2); - psi_a_p5_p3 = simde_mm256_slli_epi16(psi_a_p5_p3, 2); - psi_a_p5_p1 = simde_mm256_mulhi_epi16(psi_a_p5_p1, ONE_OVER_SQRT_2); - psi_a_p5_p1 = simde_mm256_slli_epi16(psi_a_p5_p1, 2); - psi_a_p5_m1 = simde_mm256_mulhi_epi16(psi_a_p5_m1, ONE_OVER_SQRT_2); - psi_a_p5_m1 = simde_mm256_slli_epi16(psi_a_p5_m1, 2); - psi_a_p5_m3 = simde_mm256_mulhi_epi16(psi_a_p5_m3, ONE_OVER_SQRT_2); - psi_a_p5_m3 = simde_mm256_slli_epi16(psi_a_p5_m3, 2); - psi_a_p5_m5 = simde_mm256_mulhi_epi16(psi_a_p5_m5, ONE_OVER_SQRT_2); - psi_a_p5_m5 = simde_mm256_slli_epi16(psi_a_p5_m5, 2); - psi_a_p5_m7 = simde_mm256_mulhi_epi16(psi_a_p5_m7, ONE_OVER_SQRT_2); - psi_a_p5_m7 = simde_mm256_slli_epi16(psi_a_p5_m7, 2); - psi_a_p3_p7 = simde_mm256_mulhi_epi16(psi_a_p3_p7, ONE_OVER_SQRT_2); - psi_a_p3_p7 = simde_mm256_slli_epi16(psi_a_p3_p7, 2); - psi_a_p3_p5 = simde_mm256_mulhi_epi16(psi_a_p3_p5, ONE_OVER_SQRT_2); - psi_a_p3_p5 = simde_mm256_slli_epi16(psi_a_p3_p5, 2); - psi_a_p3_p3 = simde_mm256_mulhi_epi16(psi_a_p3_p3, ONE_OVER_SQRT_2); - psi_a_p3_p3 = simde_mm256_slli_epi16(psi_a_p3_p3, 2); - psi_a_p3_p1 = simde_mm256_mulhi_epi16(psi_a_p3_p1, ONE_OVER_SQRT_2); - psi_a_p3_p1 = simde_mm256_slli_epi16(psi_a_p3_p1, 2); - psi_a_p3_m1 = simde_mm256_mulhi_epi16(psi_a_p3_m1, ONE_OVER_SQRT_2); - psi_a_p3_m1 = simde_mm256_slli_epi16(psi_a_p3_m1, 2); - psi_a_p3_m3 = simde_mm256_mulhi_epi16(psi_a_p3_m3, ONE_OVER_SQRT_2); - psi_a_p3_m3 = simde_mm256_slli_epi16(psi_a_p3_m3, 2); - psi_a_p3_m5 = simde_mm256_mulhi_epi16(psi_a_p3_m5, ONE_OVER_SQRT_2); - psi_a_p3_m5 = simde_mm256_slli_epi16(psi_a_p3_m5, 2); - psi_a_p3_m7 = simde_mm256_mulhi_epi16(psi_a_p3_m7, ONE_OVER_SQRT_2); - psi_a_p3_m7 = simde_mm256_slli_epi16(psi_a_p3_m7, 2); - psi_a_p1_p7 = simde_mm256_mulhi_epi16(psi_a_p1_p7, ONE_OVER_SQRT_2); - psi_a_p1_p7 = simde_mm256_slli_epi16(psi_a_p1_p7, 2); - psi_a_p1_p5 = simde_mm256_mulhi_epi16(psi_a_p1_p5, ONE_OVER_SQRT_2); - psi_a_p1_p5 = simde_mm256_slli_epi16(psi_a_p1_p5, 2); - psi_a_p1_p3 = simde_mm256_mulhi_epi16(psi_a_p1_p3, ONE_OVER_SQRT_2); - psi_a_p1_p3 = simde_mm256_slli_epi16(psi_a_p1_p3, 2); - psi_a_p1_p1 = simde_mm256_mulhi_epi16(psi_a_p1_p1, ONE_OVER_SQRT_2); - psi_a_p1_p1 = simde_mm256_slli_epi16(psi_a_p1_p1, 2); - psi_a_p1_m1 = simde_mm256_mulhi_epi16(psi_a_p1_m1, ONE_OVER_SQRT_2); - psi_a_p1_m1 = simde_mm256_slli_epi16(psi_a_p1_m1, 2); - psi_a_p1_m3 = simde_mm256_mulhi_epi16(psi_a_p1_m3, ONE_OVER_SQRT_2); - psi_a_p1_m3 = simde_mm256_slli_epi16(psi_a_p1_m3, 2); - psi_a_p1_m5 = simde_mm256_mulhi_epi16(psi_a_p1_m5, ONE_OVER_SQRT_2); - psi_a_p1_m5 = simde_mm256_slli_epi16(psi_a_p1_m5, 2); - psi_a_p1_m7 = simde_mm256_mulhi_epi16(psi_a_p1_m7, ONE_OVER_SQRT_2); - psi_a_p1_m7 = simde_mm256_slli_epi16(psi_a_p1_m7, 2); - psi_a_m1_p7 = simde_mm256_mulhi_epi16(psi_a_m1_p7, ONE_OVER_SQRT_2); - psi_a_m1_p7 = simde_mm256_slli_epi16(psi_a_m1_p7, 2); - psi_a_m1_p5 = simde_mm256_mulhi_epi16(psi_a_m1_p5, ONE_OVER_SQRT_2); - psi_a_m1_p5 = simde_mm256_slli_epi16(psi_a_m1_p5, 2); - psi_a_m1_p3 = simde_mm256_mulhi_epi16(psi_a_m1_p3, ONE_OVER_SQRT_2); - psi_a_m1_p3 = simde_mm256_slli_epi16(psi_a_m1_p3, 2); - psi_a_m1_p1 = simde_mm256_mulhi_epi16(psi_a_m1_p1, ONE_OVER_SQRT_2); - psi_a_m1_p1 = simde_mm256_slli_epi16(psi_a_m1_p1, 2); - psi_a_m1_m1 = simde_mm256_mulhi_epi16(psi_a_m1_m1, ONE_OVER_SQRT_2); - psi_a_m1_m1 = simde_mm256_slli_epi16(psi_a_m1_m1, 2); - psi_a_m1_m3 = simde_mm256_mulhi_epi16(psi_a_m1_m3, ONE_OVER_SQRT_2); - psi_a_m1_m3 = simde_mm256_slli_epi16(psi_a_m1_m3, 2); - psi_a_m1_m5 = simde_mm256_mulhi_epi16(psi_a_m1_m5, ONE_OVER_SQRT_2); - psi_a_m1_m5 = simde_mm256_slli_epi16(psi_a_m1_m5, 2); - psi_a_m1_m7 = simde_mm256_mulhi_epi16(psi_a_m1_m7, ONE_OVER_SQRT_2); - psi_a_m1_m7 = simde_mm256_slli_epi16(psi_a_m1_m7, 2); - psi_a_m3_p7 = simde_mm256_mulhi_epi16(psi_a_m3_p7, ONE_OVER_SQRT_2); - psi_a_m3_p7 = simde_mm256_slli_epi16(psi_a_m3_p7, 2); - psi_a_m3_p5 = simde_mm256_mulhi_epi16(psi_a_m3_p5, ONE_OVER_SQRT_2); - psi_a_m3_p5 = simde_mm256_slli_epi16(psi_a_m3_p5, 2); - psi_a_m3_p3 = simde_mm256_mulhi_epi16(psi_a_m3_p3, ONE_OVER_SQRT_2); - psi_a_m3_p3 = simde_mm256_slli_epi16(psi_a_m3_p3, 2); - psi_a_m3_p1 = simde_mm256_mulhi_epi16(psi_a_m3_p1, ONE_OVER_SQRT_2); - psi_a_m3_p1 = simde_mm256_slli_epi16(psi_a_m3_p1, 2); - psi_a_m3_m1 = simde_mm256_mulhi_epi16(psi_a_m3_m1, ONE_OVER_SQRT_2); - psi_a_m3_m1 = simde_mm256_slli_epi16(psi_a_m3_m1, 2); - psi_a_m3_m3 = simde_mm256_mulhi_epi16(psi_a_m3_m3, ONE_OVER_SQRT_2); - psi_a_m3_m3 = simde_mm256_slli_epi16(psi_a_m3_m3, 2); - psi_a_m3_m5 = simde_mm256_mulhi_epi16(psi_a_m3_m5, ONE_OVER_SQRT_2); - psi_a_m3_m5 = simde_mm256_slli_epi16(psi_a_m3_m5, 2); - psi_a_m3_m7 = simde_mm256_mulhi_epi16(psi_a_m3_m7, ONE_OVER_SQRT_2); - psi_a_m3_m7 = simde_mm256_slli_epi16(psi_a_m3_m7, 2); - psi_a_m5_p7 = simde_mm256_mulhi_epi16(psi_a_m5_p7, ONE_OVER_SQRT_2); - psi_a_m5_p7 = simde_mm256_slli_epi16(psi_a_m5_p7, 2); - psi_a_m5_p5 = simde_mm256_mulhi_epi16(psi_a_m5_p5, ONE_OVER_SQRT_2); - psi_a_m5_p5 = simde_mm256_slli_epi16(psi_a_m5_p5, 2); - psi_a_m5_p3 = simde_mm256_mulhi_epi16(psi_a_m5_p3, ONE_OVER_SQRT_2); - psi_a_m5_p3 = simde_mm256_slli_epi16(psi_a_m5_p3, 2); - psi_a_m5_p1 = simde_mm256_mulhi_epi16(psi_a_m5_p1, ONE_OVER_SQRT_2); - psi_a_m5_p1 = simde_mm256_slli_epi16(psi_a_m5_p1, 2); - psi_a_m5_m1 = simde_mm256_mulhi_epi16(psi_a_m5_m1, ONE_OVER_SQRT_2); - psi_a_m5_m1 = simde_mm256_slli_epi16(psi_a_m5_m1, 2); - psi_a_m5_m3 = simde_mm256_mulhi_epi16(psi_a_m5_m3, ONE_OVER_SQRT_2); - psi_a_m5_m3 = simde_mm256_slli_epi16(psi_a_m5_m3, 2); - psi_a_m5_m5 = simde_mm256_mulhi_epi16(psi_a_m5_m5, ONE_OVER_SQRT_2); - psi_a_m5_m5 = simde_mm256_slli_epi16(psi_a_m5_m5, 2); - psi_a_m5_m7 = simde_mm256_mulhi_epi16(psi_a_m5_m7, ONE_OVER_SQRT_2); - psi_a_m5_m7 = simde_mm256_slli_epi16(psi_a_m5_m7, 2); - psi_a_m7_p7 = simde_mm256_mulhi_epi16(psi_a_m7_p7, ONE_OVER_SQRT_2); - psi_a_m7_p7 = simde_mm256_slli_epi16(psi_a_m7_p7, 2); - psi_a_m7_p5 = simde_mm256_mulhi_epi16(psi_a_m7_p5, ONE_OVER_SQRT_2); - psi_a_m7_p5 = simde_mm256_slli_epi16(psi_a_m7_p5, 2); - psi_a_m7_p3 = simde_mm256_mulhi_epi16(psi_a_m7_p3, ONE_OVER_SQRT_2); - psi_a_m7_p3 = simde_mm256_slli_epi16(psi_a_m7_p3, 2); - psi_a_m7_p1 = simde_mm256_mulhi_epi16(psi_a_m7_p1, ONE_OVER_SQRT_2); - psi_a_m7_p1 = simde_mm256_slli_epi16(psi_a_m7_p1, 2); - psi_a_m7_m1 = simde_mm256_mulhi_epi16(psi_a_m7_m1, ONE_OVER_SQRT_2); - psi_a_m7_m1 = simde_mm256_slli_epi16(psi_a_m7_m1, 2); - psi_a_m7_m3 = simde_mm256_mulhi_epi16(psi_a_m7_m3, ONE_OVER_SQRT_2); - psi_a_m7_m3 = simde_mm256_slli_epi16(psi_a_m7_m3, 2); - psi_a_m7_m5 = simde_mm256_mulhi_epi16(psi_a_m7_m5, ONE_OVER_SQRT_2); - psi_a_m7_m5 = simde_mm256_slli_epi16(psi_a_m7_m5, 2); - psi_a_m7_m7 = simde_mm256_mulhi_epi16(psi_a_m7_m7, ONE_OVER_SQRT_2); - psi_a_m7_m7 = simde_mm256_slli_epi16(psi_a_m7_m7, 2); - - // Calculation of a group of two terms in the bit metric involving squares of interference - square_a_64qam_epi16_256(a_r_p7_p7, a_i_p7_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_p7); - square_a_64qam_epi16_256(a_r_p7_p5, a_i_p7_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_p5); - square_a_64qam_epi16_256(a_r_p7_p3, a_i_p7_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_p3); - square_a_64qam_epi16_256(a_r_p7_p1, a_i_p7_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_p1); - square_a_64qam_epi16_256(a_r_p7_m1, a_i_p7_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_m1); - square_a_64qam_epi16_256(a_r_p7_m3, a_i_p7_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_m3); - square_a_64qam_epi16_256(a_r_p7_m5, a_i_p7_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_m5); - square_a_64qam_epi16_256(a_r_p7_m7, a_i_p7_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_m7); - square_a_64qam_epi16_256(a_r_p5_p7, a_i_p5_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_p7); - square_a_64qam_epi16_256(a_r_p5_p5, a_i_p5_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_p5); - square_a_64qam_epi16_256(a_r_p5_p3, a_i_p5_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_p3); - square_a_64qam_epi16_256(a_r_p5_p1, a_i_p5_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_p1); - square_a_64qam_epi16_256(a_r_p5_m1, a_i_p5_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_m1); - square_a_64qam_epi16_256(a_r_p5_m3, a_i_p5_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_m3); - square_a_64qam_epi16_256(a_r_p5_m5, a_i_p5_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_m5); - square_a_64qam_epi16_256(a_r_p5_m7, a_i_p5_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_m7); - square_a_64qam_epi16_256(a_r_p3_p7, a_i_p3_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_p7); - square_a_64qam_epi16_256(a_r_p3_p5, a_i_p3_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_p5); - square_a_64qam_epi16_256(a_r_p3_p3, a_i_p3_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_p3); - square_a_64qam_epi16_256(a_r_p3_p1, a_i_p3_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_p1); - square_a_64qam_epi16_256(a_r_p3_m1, a_i_p3_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_m1); - square_a_64qam_epi16_256(a_r_p3_m3, a_i_p3_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_m3); - square_a_64qam_epi16_256(a_r_p3_m5, a_i_p3_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_m5); - square_a_64qam_epi16_256(a_r_p3_m7, a_i_p3_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_m7); - square_a_64qam_epi16_256(a_r_p1_p7, a_i_p1_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p7); - square_a_64qam_epi16_256(a_r_p1_p5, a_i_p1_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p5); - square_a_64qam_epi16_256(a_r_p1_p3, a_i_p1_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p3); - square_a_64qam_epi16_256(a_r_p1_p1, a_i_p1_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p1); - square_a_64qam_epi16_256(a_r_p1_m1, a_i_p1_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m1); - square_a_64qam_epi16_256(a_r_p1_m3, a_i_p1_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m3); - square_a_64qam_epi16_256(a_r_p1_m5, a_i_p1_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m5); - square_a_64qam_epi16_256(a_r_p1_m7, a_i_p1_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m7); - square_a_64qam_epi16_256(a_r_m1_p7, a_i_m1_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p7); - square_a_64qam_epi16_256(a_r_m1_p5, a_i_m1_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p5); - square_a_64qam_epi16_256(a_r_m1_p3, a_i_m1_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p3); - square_a_64qam_epi16_256(a_r_m1_p1, a_i_m1_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p1); - square_a_64qam_epi16_256(a_r_m1_m1, a_i_m1_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m1); - square_a_64qam_epi16_256(a_r_m1_m3, a_i_m1_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m3); - square_a_64qam_epi16_256(a_r_m1_m5, a_i_m1_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m5); - square_a_64qam_epi16_256(a_r_m1_m7, a_i_m1_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m7); - square_a_64qam_epi16_256(a_r_m3_p7, a_i_m3_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_p7); - square_a_64qam_epi16_256(a_r_m3_p5, a_i_m3_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_p5); - square_a_64qam_epi16_256(a_r_m3_p3, a_i_m3_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_p3); - square_a_64qam_epi16_256(a_r_m3_p1, a_i_m3_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_p1); - square_a_64qam_epi16_256(a_r_m3_m1, a_i_m3_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_m1); - square_a_64qam_epi16_256(a_r_m3_m3, a_i_m3_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_m3); - square_a_64qam_epi16_256(a_r_m3_m5, a_i_m3_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_m5); - square_a_64qam_epi16_256(a_r_m3_m7, a_i_m3_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_m7); - square_a_64qam_epi16_256(a_r_m5_p7, a_i_m5_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_p7); - square_a_64qam_epi16_256(a_r_m5_p5, a_i_m5_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_p5); - square_a_64qam_epi16_256(a_r_m5_p3, a_i_m5_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_p3); - square_a_64qam_epi16_256(a_r_m5_p1, a_i_m5_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_p1); - square_a_64qam_epi16_256(a_r_m5_m1, a_i_m5_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_m1); - square_a_64qam_epi16_256(a_r_m5_m3, a_i_m5_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_m3); - square_a_64qam_epi16_256(a_r_m5_m5, a_i_m5_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_m5); - square_a_64qam_epi16_256(a_r_m5_m7, a_i_m5_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_m7); - square_a_64qam_epi16_256(a_r_m7_p7, a_i_m7_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_p7); - square_a_64qam_epi16_256(a_r_m7_p5, a_i_m7_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_p5); - square_a_64qam_epi16_256(a_r_m7_p3, a_i_m7_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_p3); - square_a_64qam_epi16_256(a_r_m7_p1, a_i_m7_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_p1); - square_a_64qam_epi16_256(a_r_m7_m1, a_i_m7_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_m1); - square_a_64qam_epi16_256(a_r_m7_m3, a_i_m7_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_m3); - square_a_64qam_epi16_256(a_r_m7_m5, a_i_m7_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_m5); - square_a_64qam_epi16_256(a_r_m7_m7, a_i_m7_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_m7); + // Calculation of a group of two terms in the bit metric involving squares of interference + a_sq_s[j] = square_a_64qam_epi16_256(a_r_s[j], a_i_s[j], ch_mag_int, SQRT_42_OVER_FOUR); + } // Computing different multiples of ||h0||^2 - // x=1, y=1 - ch_mag_2_over_42_with_sigma2 = simde_mm256_mulhi_epi16(ch_mag_des, ONE_OVER_FOUR_SQRT_42); - ch_mag_2_over_42_with_sigma2 = simde_mm256_slli_epi16(ch_mag_2_over_42_with_sigma2, 1); + simde__m256i ch_mag_with_sigma2[10]; + enum ch_mag_over_42with_sigma2_vals {mag2=0, mag10, mag26, mag18, mag34, mag58, mag50, mag74, mag98}; + // x=1, y=1 + ch_mag_with_sigma2[mag2] = simde_mm256_slli_epi16(simde_mm256_mulhi_epi16(ch_mag_des, ONE_OVER_FOUR_SQRT_42), 1); // x=1, y=3 - ch_mag_10_over_42_with_sigma2 = simde_mm256_mulhi_epi16(ch_mag_des, FIVE_OVER_FOUR_SQRT_42); - ch_mag_10_over_42_with_sigma2 = simde_mm256_slli_epi16(ch_mag_10_over_42_with_sigma2, 1); + ch_mag_with_sigma2[mag10] = simde_mm256_slli_epi16(simde_mm256_mulhi_epi16(ch_mag_des, FIVE_OVER_FOUR_SQRT_42), 1); // x=1, x=5 - ch_mag_26_over_42_with_sigma2 = simde_mm256_mulhi_epi16(ch_mag_des, THIRTEEN_OVER_FOUR_SQRT_42); - ch_mag_26_over_42_with_sigma2 = simde_mm256_slli_epi16(ch_mag_26_over_42_with_sigma2, 1); + ch_mag_with_sigma2[mag26] = simde_mm256_slli_epi16(simde_mm256_mulhi_epi16(ch_mag_des, THIRTEEN_OVER_FOUR_SQRT_42), 1); // x=1, y=7 - ch_mag_50_over_42_with_sigma2 = simde_mm256_mulhi_epi16(ch_mag_des, TWENTYFIVE_OVER_FOUR_SQRT_42); - ch_mag_50_over_42_with_sigma2 = simde_mm256_slli_epi16(ch_mag_50_over_42_with_sigma2, 1); + ch_mag_with_sigma2[mag50] = simde_mm256_slli_epi16(simde_mm256_mulhi_epi16(ch_mag_des, TWENTYFIVE_OVER_FOUR_SQRT_42), 1); // x=3, y=3 - ch_mag_18_over_42_with_sigma2 = simde_mm256_mulhi_epi16(ch_mag_des, NINE_OVER_FOUR_SQRT_42); - ch_mag_18_over_42_with_sigma2 = simde_mm256_slli_epi16(ch_mag_18_over_42_with_sigma2, 1); + ch_mag_with_sigma2[mag18] = simde_mm256_slli_epi16(simde_mm256_mulhi_epi16(ch_mag_des, NINE_OVER_FOUR_SQRT_42), 1); // x=3, y=5 - ch_mag_34_over_42_with_sigma2 = simde_mm256_mulhi_epi16(ch_mag_des, SEVENTEEN_OVER_FOUR_SQRT_42); - ch_mag_34_over_42_with_sigma2 = simde_mm256_slli_epi16(ch_mag_34_over_42_with_sigma2, 1); + ch_mag_with_sigma2[mag34] = simde_mm256_slli_epi16(simde_mm256_mulhi_epi16(ch_mag_des, SEVENTEEN_OVER_FOUR_SQRT_42), 1); // x=3, y=7 - ch_mag_58_over_42_with_sigma2 = simde_mm256_mulhi_epi16(ch_mag_des, TWENTYNINE_OVER_FOUR_SQRT_42); - ch_mag_58_over_42_with_sigma2 = simde_mm256_slli_epi16(ch_mag_58_over_42_with_sigma2, 2); + ch_mag_with_sigma2[mag58] = simde_mm256_slli_epi16(simde_mm256_mulhi_epi16(ch_mag_des, TWENTYNINE_OVER_FOUR_SQRT_42), 2); // x=5, y=5 - ch_mag_50_over_42_with_sigma2 = simde_mm256_mulhi_epi16(ch_mag_des, TWENTYFIVE_OVER_FOUR_SQRT_42); - ch_mag_50_over_42_with_sigma2 = simde_mm256_slli_epi16(ch_mag_50_over_42_with_sigma2, 1); + ch_mag_with_sigma2[mag50] = simde_mm256_slli_epi16(simde_mm256_mulhi_epi16(ch_mag_des, TWENTYFIVE_OVER_FOUR_SQRT_42), 1); // x=5, y=7 - ch_mag_74_over_42_with_sigma2 = simde_mm256_mulhi_epi16(ch_mag_des, THIRTYSEVEN_OVER_FOUR_SQRT_42); - ch_mag_74_over_42_with_sigma2 = simde_mm256_slli_epi16(ch_mag_74_over_42_with_sigma2, 2); + ch_mag_with_sigma2[mag74] = simde_mm256_slli_epi16(simde_mm256_mulhi_epi16(ch_mag_des, THIRTYSEVEN_OVER_FOUR_SQRT_42), 2); // x=7, y=7 - ch_mag_98_over_42_with_sigma2 = simde_mm256_mulhi_epi16(ch_mag_des, FORTYNINE_OVER_FOUR_SQRT_42); - ch_mag_98_over_42_with_sigma2 = simde_mm256_slli_epi16(ch_mag_98_over_42_with_sigma2, 2); + ch_mag_with_sigma2[mag98] = simde_mm256_slli_epi16(simde_mm256_mulhi_epi16(ch_mag_des, FORTYNINE_OVER_FOUR_SQRT_42), 2); // Computing Metrics - xmm0 = simde_mm256_subs_epi16(psi_a_p7_p7, a_sq_p7_p7); - simde__m256i xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_7_7); - simde__m256i bit_met_p7_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p7_p5, a_sq_p7_p5); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_7_5); - simde__m256i bit_met_p7_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p7_p3, a_sq_p7_p3); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_7_3); - simde__m256i bit_met_p7_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p7_p1, a_sq_p7_p1); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_7_1); - simde__m256i bit_met_p7_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p7_m1, a_sq_p7_m1); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_7_1); - simde__m256i bit_met_p7_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p7_m3, a_sq_p7_m3); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_7_3); - simde__m256i bit_met_p7_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p7_m5, a_sq_p7_m5); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_7_5); - simde__m256i bit_met_p7_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p7_m7, a_sq_p7_m7); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_7_7); - simde__m256i bit_met_p7_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p5_p7, a_sq_p5_p7); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_5_7); - simde__m256i bit_met_p5_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p5_p5, a_sq_p5_p5); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_5_5); - simde__m256i bit_met_p5_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p5_p3, a_sq_p5_p3); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_5_3); - simde__m256i bit_met_p5_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p5_p1, a_sq_p5_p1); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_5_1); - simde__m256i bit_met_p5_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p5_m1, a_sq_p5_m1); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_5_1); - simde__m256i bit_met_p5_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p5_m3, a_sq_p5_m3); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_5_3); - simde__m256i bit_met_p5_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p5_m5, a_sq_p5_m5); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_5_5); - simde__m256i bit_met_p5_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p5_m7, a_sq_p5_m7); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_5_7); - simde__m256i bit_met_p5_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p3_p7, a_sq_p3_p7); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_3_7); - simde__m256i bit_met_p3_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p3_p5, a_sq_p3_p5); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_3_5); - simde__m256i bit_met_p3_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p3_p3, a_sq_p3_p3); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_3_3); - simde__m256i bit_met_p3_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p3_p1, a_sq_p3_p1); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_3_1); - simde__m256i bit_met_p3_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p3_m1, a_sq_p3_m1); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_3_1); - simde__m256i bit_met_p3_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p3_m3, a_sq_p3_m3); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_3_3); - simde__m256i bit_met_p3_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p3_m5, a_sq_p3_m5); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_3_5); - simde__m256i bit_met_p3_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p3_m7, a_sq_p3_m7); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_3_7); - simde__m256i bit_met_p3_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p1_p7, a_sq_p1_p7); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_1_7); - simde__m256i bit_met_p1_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p1_p5, a_sq_p1_p5); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_1_5); - simde__m256i bit_met_p1_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p1_p3, a_sq_p1_p3); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_1_3); - simde__m256i bit_met_p1_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p1_p1, a_sq_p1_p1); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_1_1); - simde__m256i bit_met_p1_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p1_m1, a_sq_p1_m1); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_1_1); - simde__m256i bit_met_p1_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p1_m3, a_sq_p1_m3); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_1_3); - simde__m256i bit_met_p1_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p1_m5, a_sq_p1_m5); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_1_5); - simde__m256i bit_met_p1_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_p1_m7, a_sq_p1_m7); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_1_7); - simde__m256i bit_met_p1_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_s[64]; + const enum ch_mag_over_42with_sigma2_vals table[] = { + mag98, mag74, mag58, mag50, mag50, mag58, mag74, mag98, mag74, mag50, mag34, mag26, mag26, mag34, mag50, mag74, + mag58, mag34, mag18, mag10, mag10, mag18, mag34, mag58, mag50, mag26, mag10, mag2, mag2, mag10, mag26, mag50}; - xmm0 = simde_mm256_subs_epi16(psi_a_m1_p7, a_sq_m1_p7); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_1_7); - simde__m256i bit_met_m1_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m1_p5, a_sq_m1_p5); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_1_5); - simde__m256i bit_met_m1_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m1_p3, a_sq_m1_p3); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_1_3); - simde__m256i bit_met_m1_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m1_p1, a_sq_m1_p1); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_1_1); - simde__m256i bit_met_m1_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m1_m1, a_sq_m1_m1); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_1_1); - simde__m256i bit_met_m1_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m1_m3, a_sq_m1_m3); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_1_3); - simde__m256i bit_met_m1_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m1_m5, a_sq_m1_m5); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_1_5); - simde__m256i bit_met_m1_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m1_m7, a_sq_m1_m7); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_1_7); - simde__m256i bit_met_m1_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m3_p7, a_sq_m3_p7); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_3_7); - simde__m256i bit_met_m3_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m3_p5, a_sq_m3_p5); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_3_5); - simde__m256i bit_met_m3_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m3_p3, a_sq_m3_p3); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_3_3); - simde__m256i bit_met_m3_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m3_p1, a_sq_m3_p1); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_3_1); - simde__m256i bit_met_m3_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m3_m1, a_sq_m3_m1); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_3_1); - simde__m256i bit_met_m3_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m3_m3, a_sq_m3_m3); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_3_3); - simde__m256i bit_met_m3_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m3_m5, a_sq_m3_m5); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_3_5); - simde__m256i bit_met_m3_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m3_m7, a_sq_m3_m7); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_3_7); - simde__m256i bit_met_m3_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m5_p7, a_sq_m5_p7); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_5_7); - simde__m256i bit_met_m5_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m5_p5, a_sq_m5_p5); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_5_5); - simde__m256i bit_met_m5_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m5_p3, a_sq_m5_p3); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_5_3); - simde__m256i bit_met_m5_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m5_p1, a_sq_m5_p1); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_5_1); - simde__m256i bit_met_m5_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m5_m1, a_sq_m5_m1); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_5_1); - simde__m256i bit_met_m5_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m5_m3, a_sq_m5_m3); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_5_3); - simde__m256i bit_met_m5_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m5_m5, a_sq_m5_m5); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_5_5); - simde__m256i bit_met_m5_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m5_m7, a_sq_m5_m7); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_5_7); - simde__m256i bit_met_m5_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m7_p7, a_sq_m7_p7); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_7_7); - simde__m256i bit_met_m7_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m7_p5, a_sq_m7_p5); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_7_5); - simde__m256i bit_met_m7_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m7_p3, a_sq_m7_p3); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_7_3); - simde__m256i bit_met_m7_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m7_p1, a_sq_m7_p1); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_7_1); - simde__m256i bit_met_m7_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m7_m1, a_sq_m7_m1); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_7_1); - simde__m256i bit_met_m7_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m7_m3, a_sq_m7_m3); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_7_3); - simde__m256i bit_met_m7_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m7_m5, a_sq_m7_m5); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_7_5); - simde__m256i bit_met_m7_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); - xmm0 = simde_mm256_subs_epi16(psi_a_m7_m7, a_sq_m7_m7); - xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_7_7); - simde__m256i bit_met_m7_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); + for(int i=0; i<32; i++){ + const simde__m256i x = simde_mm256_adds_epi16(simde_mm256_subs_epi16(psi_a_s[i], a_sq_s[i]), y0_s[i]); + bit_met_s[i] = simde_mm256_subs_epi16(x, ch_mag_with_sigma2[table[i]]); + } + for(int i=0; i<32; i++){ + const simde__m256i x = simde_mm256_subs_epi16(simde_mm256_subs_epi16(psi_a_s[32 + i], a_sq_s[32 + i]), y0_s[31 - i]); + bit_met_s[32 + i] = simde_mm256_subs_epi16(x, ch_mag_with_sigma2[table[31 - i]]); + } + // Detection for bits + simde__m256i logmax_den_re0; + simde__m256i logmax_num_re0; // Detection for 1st bit // bit = 1 - xmm0 = simde_mm256_max_epi16(bit_met_m7_p7, bit_met_m7_p5); - xmm1 = simde_mm256_max_epi16(bit_met_m7_p3, bit_met_m7_p1); - xmm2 = simde_mm256_max_epi16(bit_met_m7_m1, bit_met_m7_m3); - xmm3 = simde_mm256_max_epi16(bit_met_m7_m5, bit_met_m7_m7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - simde__m256i logmax_den_re0 = simde_mm256_max_epi16(xmm4, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_m5_p7, bit_met_m5_p5); - xmm1 = simde_mm256_max_epi16(bit_met_m5_p3, bit_met_m5_p1); - xmm2 = simde_mm256_max_epi16(bit_met_m5_m1, bit_met_m5_m3); - xmm3 = simde_mm256_max_epi16(bit_met_m5_m5, bit_met_m5_m7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_m3_p7, bit_met_m3_p5); - xmm1 = simde_mm256_max_epi16(bit_met_m3_p3, bit_met_m3_p1); - xmm2 = simde_mm256_max_epi16(bit_met_m3_m1, bit_met_m3_m3); - xmm3 = simde_mm256_max_epi16(bit_met_m3_m5, bit_met_m3_m7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_m1_p7, bit_met_m1_p5); - xmm1 = simde_mm256_max_epi16(bit_met_m1_p3, bit_met_m1_p1); - xmm2 = simde_mm256_max_epi16(bit_met_m1_m1, bit_met_m1_m3); - xmm3 = simde_mm256_max_epi16(bit_met_m1_m5, bit_met_m1_m7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm5); + xmm0 = max_epi16_256(bit_met_s[56],bit_met_s[57],bit_met_s[58],bit_met_s[59],bit_met_s[60],bit_met_s[61],bit_met_s[62],bit_met_s[63]); + xmm1 = max_epi16_256(bit_met_s[48],bit_met_s[49],bit_met_s[50],bit_met_s[51],bit_met_s[52],bit_met_s[53],bit_met_s[54],bit_met_s[55]); + xmm2 = max_epi16_256(bit_met_s[40],bit_met_s[41],bit_met_s[42],bit_met_s[43],bit_met_s[44],bit_met_s[45],bit_met_s[46],bit_met_s[47]); + xmm3 = max_epi16_256(bit_met_s[32],bit_met_s[33],bit_met_s[34],bit_met_s[35],bit_met_s[36],bit_met_s[37],bit_met_s[38],bit_met_s[39]); + logmax_den_re0 = simde_mm256_max_epi16(simde_mm256_max_epi16(xmm0, xmm1), simde_mm256_max_epi16(xmm2, xmm3)); // bit = 0 - xmm0 = simde_mm256_max_epi16(bit_met_p7_p7, bit_met_p7_p5); - xmm1 = simde_mm256_max_epi16(bit_met_p7_p3, bit_met_p7_p1); - xmm2 = simde_mm256_max_epi16(bit_met_p7_m1, bit_met_p7_m3); - xmm3 = simde_mm256_max_epi16(bit_met_p7_m5, bit_met_p7_m7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - simde__m256i logmax_num_re0 = simde_mm256_max_epi16(xmm4, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p5_p7, bit_met_p5_p5); - xmm1 = simde_mm256_max_epi16(bit_met_p5_p3, bit_met_p5_p1); - xmm2 = simde_mm256_max_epi16(bit_met_p5_m1, bit_met_p5_m3); - xmm3 = simde_mm256_max_epi16(bit_met_p5_m5, bit_met_p5_m7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p3_p7, bit_met_p3_p5); - xmm1 = simde_mm256_max_epi16(bit_met_p3_p3, bit_met_p3_p1); - xmm2 = simde_mm256_max_epi16(bit_met_p3_m1, bit_met_p3_m3); - xmm3 = simde_mm256_max_epi16(bit_met_p3_m5, bit_met_p3_m7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p1_p7, bit_met_p1_p5); - xmm1 = simde_mm256_max_epi16(bit_met_p1_p3, bit_met_p1_p1); - xmm2 = simde_mm256_max_epi16(bit_met_p1_m1, bit_met_p1_m3); - xmm3 = simde_mm256_max_epi16(bit_met_p1_m5, bit_met_p1_m7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); + xmm0 = max_epi16_256(bit_met_s[0],bit_met_s[1],bit_met_s[2],bit_met_s[3],bit_met_s[4],bit_met_s[5],bit_met_s[6],bit_met_s[7]); + xmm1 = max_epi16_256(bit_met_s[8],bit_met_s[9],bit_met_s[10],bit_met_s[11],bit_met_s[12],bit_met_s[13],bit_met_s[14],bit_met_s[15]); + xmm2 = max_epi16_256(bit_met_s[16],bit_met_s[17],bit_met_s[18],bit_met_s[19],bit_met_s[20],bit_met_s[21],bit_met_s[22],bit_met_s[23]); + xmm3 = max_epi16_256(bit_met_s[24],bit_met_s[25],bit_met_s[26],bit_met_s[27],bit_met_s[28],bit_met_s[29],bit_met_s[30],bit_met_s[31]); + logmax_num_re0 = simde_mm256_max_epi16(simde_mm256_max_epi16(xmm0, xmm1), simde_mm256_max_epi16(xmm2, xmm3)); y0r = simde_mm256_subs_epi16(logmax_num_re0, logmax_den_re0); // Detection for 2nd bit // bit = 1 - xmm0 = simde_mm256_max_epi16(bit_met_p7_m1, bit_met_p5_m1); - xmm1 = simde_mm256_max_epi16(bit_met_p3_m1, bit_met_p1_m1); - xmm2 = simde_mm256_max_epi16(bit_met_m1_m1, bit_met_m3_m1); - xmm3 = simde_mm256_max_epi16(bit_met_m5_m1, bit_met_m7_m1); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(xmm4, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p7_m3, bit_met_p5_m3); - xmm1 = simde_mm256_max_epi16(bit_met_p3_m3, bit_met_p1_m3); - xmm2 = simde_mm256_max_epi16(bit_met_m1_m3, bit_met_m3_m3); - xmm3 = simde_mm256_max_epi16(bit_met_m5_m3, bit_met_m7_m3); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p7_m5, bit_met_p5_m5); - xmm1 = simde_mm256_max_epi16(bit_met_p3_m5, bit_met_p1_m5); - xmm2 = simde_mm256_max_epi16(bit_met_m1_m5, bit_met_m3_m5); - xmm3 = simde_mm256_max_epi16(bit_met_m5_m5, bit_met_m7_m5); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p7_m7, bit_met_p5_m7); - xmm1 = simde_mm256_max_epi16(bit_met_p3_m7, bit_met_p1_m7); - xmm2 = simde_mm256_max_epi16(bit_met_m1_m7, bit_met_m3_m7); - xmm3 = simde_mm256_max_epi16(bit_met_m5_m7, bit_met_m7_m7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm5); + xmm0 = max_epi16_256(bit_met_s[4],bit_met_s[12],bit_met_s[20],bit_met_s[28],bit_met_s[36],bit_met_s[44],bit_met_s[52],bit_met_s[60]); + xmm1 = max_epi16_256(bit_met_s[5],bit_met_s[13],bit_met_s[21],bit_met_s[29],bit_met_s[37],bit_met_s[45],bit_met_s[53],bit_met_s[61]); + xmm2 = max_epi16_256(bit_met_s[6],bit_met_s[14],bit_met_s[22],bit_met_s[30],bit_met_s[38],bit_met_s[46],bit_met_s[54],bit_met_s[62]); + xmm3 = max_epi16_256(bit_met_s[7],bit_met_s[15],bit_met_s[23],bit_met_s[31],bit_met_s[39],bit_met_s[47],bit_met_s[55],bit_met_s[63]); + logmax_den_re0 = simde_mm256_max_epi16(simde_mm256_max_epi16(xmm0, xmm1), simde_mm256_max_epi16(xmm2, xmm3)); // bit = 0 - xmm0 = simde_mm256_max_epi16(bit_met_p7_p1, bit_met_p5_p1); - xmm1 = simde_mm256_max_epi16(bit_met_p3_p1, bit_met_p1_p1); - xmm2 = simde_mm256_max_epi16(bit_met_m1_p1, bit_met_m3_p1); - xmm3 = simde_mm256_max_epi16(bit_met_m5_p1, bit_met_m7_p1); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(xmm4, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p7_p3, bit_met_p5_p3); - xmm1 = simde_mm256_max_epi16(bit_met_p3_p3, bit_met_p1_p3); - xmm2 = simde_mm256_max_epi16(bit_met_m1_p3, bit_met_m3_p3); - xmm3 = simde_mm256_max_epi16(bit_met_m5_p3, bit_met_m7_p3); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p7_p5, bit_met_p5_p5); - xmm1 = simde_mm256_max_epi16(bit_met_p3_p5, bit_met_p1_p5); - xmm2 = simde_mm256_max_epi16(bit_met_m1_p5, bit_met_m3_p5); - xmm3 = simde_mm256_max_epi16(bit_met_m5_p5, bit_met_m7_p5); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p7_p7, bit_met_p5_p7); - xmm1 = simde_mm256_max_epi16(bit_met_p3_p7, bit_met_p1_p7); - xmm2 = simde_mm256_max_epi16(bit_met_m1_p7, bit_met_m3_p7); - xmm3 = simde_mm256_max_epi16(bit_met_m5_p7, bit_met_m7_p7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); + xmm0 = max_epi16_256(bit_met_s[3],bit_met_s[11],bit_met_s[19],bit_met_s[27],bit_met_s[35],bit_met_s[43],bit_met_s[51],bit_met_s[59]); + xmm1 = max_epi16_256(bit_met_s[2],bit_met_s[10],bit_met_s[18],bit_met_s[26],bit_met_s[34],bit_met_s[42],bit_met_s[50],bit_met_s[58]); + xmm2 = max_epi16_256(bit_met_s[1],bit_met_s[9],bit_met_s[17],bit_met_s[25],bit_met_s[33],bit_met_s[41],bit_met_s[49],bit_met_s[57]); + xmm3 = max_epi16_256(bit_met_s[0],bit_met_s[8],bit_met_s[16],bit_met_s[24],bit_met_s[32],bit_met_s[40],bit_met_s[48],bit_met_s[56]); + logmax_num_re0 = simde_mm256_max_epi16(simde_mm256_max_epi16(xmm0, xmm1), simde_mm256_max_epi16(xmm2, xmm3)); y1r = simde_mm256_subs_epi16(logmax_num_re0, logmax_den_re0); // Detection for 3rd bit - xmm0 = simde_mm256_max_epi16(bit_met_m7_m7, bit_met_m7_m5); - xmm1 = simde_mm256_max_epi16(bit_met_m7_m3, bit_met_m7_m1); - xmm2 = simde_mm256_max_epi16(bit_met_m7_p1, bit_met_m7_p3); - xmm3 = simde_mm256_max_epi16(bit_met_m7_p5, bit_met_m7_p7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(xmm4, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_m5_m7, bit_met_m5_m5); - xmm1 = simde_mm256_max_epi16(bit_met_m5_m3, bit_met_m5_m1); - xmm2 = simde_mm256_max_epi16(bit_met_m5_p1, bit_met_m5_p3); - xmm3 = simde_mm256_max_epi16(bit_met_m5_p5, bit_met_m5_p7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p5_m7, bit_met_p5_m5); - xmm1 = simde_mm256_max_epi16(bit_met_p5_m3, bit_met_p5_m1); - xmm2 = simde_mm256_max_epi16(bit_met_p5_p1, bit_met_p5_p3); - xmm3 = simde_mm256_max_epi16(bit_met_p5_p5, bit_met_p5_p7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p7_m7, bit_met_p7_m5); - xmm1 = simde_mm256_max_epi16(bit_met_p7_m3, bit_met_p7_m1); - xmm2 = simde_mm256_max_epi16(bit_met_p7_p1, bit_met_p7_p3); - xmm3 = simde_mm256_max_epi16(bit_met_p7_p5, bit_met_p7_p7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm5); + xmm0 = max_epi16_256(bit_met_s[63],bit_met_s[62],bit_met_s[61],bit_met_s[60],bit_met_s[59],bit_met_s[58],bit_met_s[57],bit_met_s[56]); + xmm1 = max_epi16_256(bit_met_s[55],bit_met_s[54],bit_met_s[53],bit_met_s[52],bit_met_s[51],bit_met_s[50],bit_met_s[49],bit_met_s[48]); + xmm2 = max_epi16_256(bit_met_s[15],bit_met_s[14],bit_met_s[13],bit_met_s[12],bit_met_s[11],bit_met_s[10],bit_met_s[9],bit_met_s[8]); + xmm3 = max_epi16_256(bit_met_s[7],bit_met_s[6],bit_met_s[5],bit_met_s[4],bit_met_s[3],bit_met_s[2],bit_met_s[1],bit_met_s[0]); + logmax_den_re0 = simde_mm256_max_epi16(simde_mm256_max_epi16(xmm0, xmm1), simde_mm256_max_epi16(xmm2, xmm3)); - xmm0 = simde_mm256_max_epi16(bit_met_m3_m7, bit_met_m3_m5); - xmm1 = simde_mm256_max_epi16(bit_met_m3_m3, bit_met_m3_m1); - xmm2 = simde_mm256_max_epi16(bit_met_m3_p1, bit_met_m3_p3); - xmm3 = simde_mm256_max_epi16(bit_met_m3_p5, bit_met_m3_p7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(xmm4, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_m1_m7, bit_met_m1_m5); - xmm1 = simde_mm256_max_epi16(bit_met_m1_m3, bit_met_m1_m1); - xmm2 = simde_mm256_max_epi16(bit_met_m1_p1, bit_met_m1_p3); - xmm3 = simde_mm256_max_epi16(bit_met_m1_p5, bit_met_m1_p7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p1_m7, bit_met_p1_m5); - xmm1 = simde_mm256_max_epi16(bit_met_p1_m3, bit_met_p1_m1); - xmm2 = simde_mm256_max_epi16(bit_met_p1_p1, bit_met_p1_p3); - xmm3 = simde_mm256_max_epi16(bit_met_p1_p5, bit_met_p1_p7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p3_m7, bit_met_p3_m5); - xmm1 = simde_mm256_max_epi16(bit_met_p3_m3, bit_met_p3_m1); - xmm2 = simde_mm256_max_epi16(bit_met_p3_p1, bit_met_p3_p3); - xmm3 = simde_mm256_max_epi16(bit_met_p3_p5, bit_met_p3_p7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); + xmm0 = max_epi16_256(bit_met_s[47],bit_met_s[46],bit_met_s[45],bit_met_s[44],bit_met_s[43],bit_met_s[42],bit_met_s[41],bit_met_s[40]); + xmm1 = max_epi16_256(bit_met_s[39],bit_met_s[38],bit_met_s[37],bit_met_s[36],bit_met_s[35],bit_met_s[34],bit_met_s[33],bit_met_s[32]); + xmm2 = max_epi16_256(bit_met_s[31],bit_met_s[30],bit_met_s[29],bit_met_s[28],bit_met_s[27],bit_met_s[26],bit_met_s[25],bit_met_s[24]); + xmm3 = max_epi16_256(bit_met_s[23],bit_met_s[22],bit_met_s[21],bit_met_s[20],bit_met_s[19],bit_met_s[18],bit_met_s[17],bit_met_s[16]); + logmax_num_re0 = simde_mm256_max_epi16(simde_mm256_max_epi16(xmm0, xmm1), simde_mm256_max_epi16(xmm2, xmm3)); simde__m256i y2r = simde_mm256_subs_epi16(logmax_num_re0, logmax_den_re0); // Detection for 4th bit - xmm0 = simde_mm256_max_epi16(bit_met_p7_p7, bit_met_p5_p7); - xmm1 = simde_mm256_max_epi16(bit_met_p3_p7, bit_met_p1_p7); - xmm2 = simde_mm256_max_epi16(bit_met_m1_p7, bit_met_m3_p7); - xmm3 = simde_mm256_max_epi16(bit_met_m5_p7, bit_met_m7_p7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(xmm4, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p7_p5, bit_met_p5_p5); - xmm1 = simde_mm256_max_epi16(bit_met_p3_p5, bit_met_p1_p5); - xmm2 = simde_mm256_max_epi16(bit_met_m1_p5, bit_met_m3_p5); - xmm3 = simde_mm256_max_epi16(bit_met_m5_p5, bit_met_m5_p5); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p7_m5, bit_met_p5_m5); - xmm1 = simde_mm256_max_epi16(bit_met_p3_m5, bit_met_p1_m5); - xmm2 = simde_mm256_max_epi16(bit_met_m1_m5, bit_met_m3_m5); - xmm3 = simde_mm256_max_epi16(bit_met_m5_m5, bit_met_m7_m5); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p7_m7, bit_met_p5_m7); - xmm1 = simde_mm256_max_epi16(bit_met_p3_m7, bit_met_p1_m7); - xmm2 = simde_mm256_max_epi16(bit_met_m1_m7, bit_met_m3_m7); - xmm3 = simde_mm256_max_epi16(bit_met_m5_m7, bit_met_m7_m7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm5); + xmm0 = max_epi16_256(bit_met_s[0],bit_met_s[8],bit_met_s[16],bit_met_s[24],bit_met_s[32],bit_met_s[40],bit_met_s[48],bit_met_s[56]); + xmm1 = max_epi16_256(bit_met_s[1],bit_met_s[9],bit_met_s[17],bit_met_s[25],bit_met_s[33],bit_met_s[41],bit_met_s[49],bit_met_s[57]); + xmm2 = max_epi16_256(bit_met_s[6],bit_met_s[14],bit_met_s[22],bit_met_s[30],bit_met_s[38],bit_met_s[46],bit_met_s[54],bit_met_s[62]); + xmm3 = max_epi16_256(bit_met_s[7],bit_met_s[15],bit_met_s[23],bit_met_s[31],bit_met_s[39],bit_met_s[47],bit_met_s[55],bit_met_s[63]); + logmax_den_re0 = simde_mm256_max_epi16(simde_mm256_max_epi16(xmm0, xmm1), simde_mm256_max_epi16(xmm2, xmm3)); - xmm0 = simde_mm256_max_epi16(bit_met_p7_m1, bit_met_p5_m1); - xmm1 = simde_mm256_max_epi16(bit_met_p3_m1, bit_met_p1_m1); - xmm2 = simde_mm256_max_epi16(bit_met_m1_m1, bit_met_m3_m1); - xmm3 = simde_mm256_max_epi16(bit_met_m5_m1, bit_met_m7_m1); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(xmm4, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p7_m3, bit_met_p5_m3); - xmm1 = simde_mm256_max_epi16(bit_met_p3_m3, bit_met_p1_m3); - xmm2 = simde_mm256_max_epi16(bit_met_m1_m3, bit_met_m3_m3); - xmm3 = simde_mm256_max_epi16(bit_met_m5_m3, bit_met_m7_m3); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p7_p1, bit_met_p5_p1); - xmm1 = simde_mm256_max_epi16(bit_met_p3_p1, bit_met_p1_p1); - xmm2 = simde_mm256_max_epi16(bit_met_m1_p1, bit_met_m3_p1); - xmm3 = simde_mm256_max_epi16(bit_met_m5_p1, bit_met_m7_p1); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p7_p3, bit_met_p5_p3); - xmm1 = simde_mm256_max_epi16(bit_met_p3_p3, bit_met_p1_p3); - xmm2 = simde_mm256_max_epi16(bit_met_m1_p3, bit_met_m3_p3); - xmm3 = simde_mm256_max_epi16(bit_met_m5_p3, bit_met_m7_p3); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); + xmm0 = max_epi16_256(bit_met_s[4],bit_met_s[12],bit_met_s[20],bit_met_s[28],bit_met_s[36],bit_met_s[44],bit_met_s[52],bit_met_s[60]); + xmm1 = max_epi16_256(bit_met_s[5],bit_met_s[13],bit_met_s[21],bit_met_s[29],bit_met_s[37],bit_met_s[45],bit_met_s[53],bit_met_s[61]); + xmm2 = max_epi16_256(bit_met_s[3],bit_met_s[11],bit_met_s[19],bit_met_s[27],bit_met_s[35],bit_met_s[43],bit_met_s[51],bit_met_s[59]); + xmm3 = max_epi16_256(bit_met_s[2],bit_met_s[10],bit_met_s[18],bit_met_s[26],bit_met_s[34],bit_met_s[42],bit_met_s[50],bit_met_s[58]); + logmax_num_re0 = simde_mm256_max_epi16(simde_mm256_max_epi16(xmm0, xmm1), simde_mm256_max_epi16(xmm2, xmm3)); y0i = simde_mm256_subs_epi16(logmax_num_re0, logmax_den_re0); // Detection for 5th bit - xmm0 = simde_mm256_max_epi16(bit_met_m7_m7, bit_met_m7_m5); - xmm1 = simde_mm256_max_epi16(bit_met_m7_m3, bit_met_m7_m1); - xmm2 = simde_mm256_max_epi16(bit_met_m7_p1, bit_met_m7_p3); - xmm3 = simde_mm256_max_epi16(bit_met_m7_p5, bit_met_m7_p7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(xmm4, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_m1_m7, bit_met_m1_m5); - xmm1 = simde_mm256_max_epi16(bit_met_m1_m3, bit_met_m1_m1); - xmm2 = simde_mm256_max_epi16(bit_met_m1_p1, bit_met_m1_p3); - xmm3 = simde_mm256_max_epi16(bit_met_m1_p5, bit_met_m1_p7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p1_m7, bit_met_p1_m5); - xmm1 = simde_mm256_max_epi16(bit_met_p1_m3, bit_met_p1_m1); - xmm2 = simde_mm256_max_epi16(bit_met_p1_p1, bit_met_p1_p3); - xmm3 = simde_mm256_max_epi16(bit_met_p1_p5, bit_met_p1_p7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p7_m7, bit_met_p7_m5); - xmm1 = simde_mm256_max_epi16(bit_met_p7_m3, bit_met_p7_m1); - xmm2 = simde_mm256_max_epi16(bit_met_p7_p1, bit_met_p7_p3); - xmm3 = simde_mm256_max_epi16(bit_met_p7_p5, bit_met_p7_p7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm5); + xmm0 = max_epi16_256(bit_met_s[63],bit_met_s[62],bit_met_s[61],bit_met_s[60],bit_met_s[59],bit_met_s[58],bit_met_s[57],bit_met_s[56]); + xmm1 = max_epi16_256(bit_met_s[39],bit_met_s[38],bit_met_s[37],bit_met_s[36],bit_met_s[35],bit_met_s[34],bit_met_s[33],bit_met_s[32]); + xmm2 = max_epi16_256(bit_met_s[31],bit_met_s[30],bit_met_s[29],bit_met_s[28],bit_met_s[27],bit_met_s[26],bit_met_s[25],bit_met_s[24]); + xmm3 = max_epi16_256(bit_met_s[7],bit_met_s[6],bit_met_s[5],bit_met_s[4],bit_met_s[3],bit_met_s[2],bit_met_s[1],bit_met_s[0]); + logmax_den_re0 = simde_mm256_max_epi16(simde_mm256_max_epi16(xmm0, xmm1), simde_mm256_max_epi16(xmm2, xmm3)); - xmm0 = simde_mm256_max_epi16(bit_met_m5_m7, bit_met_m5_m5); - xmm1 = simde_mm256_max_epi16(bit_met_m5_m3, bit_met_m5_m1); - xmm2 = simde_mm256_max_epi16(bit_met_m5_p1, bit_met_m5_p3); - xmm3 = simde_mm256_max_epi16(bit_met_m5_p5, bit_met_m5_p7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(xmm4, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_m3_m7, bit_met_m3_m5); - xmm1 = simde_mm256_max_epi16(bit_met_m3_m3, bit_met_m3_m1); - xmm2 = simde_mm256_max_epi16(bit_met_m3_p1, bit_met_m3_p3); - xmm3 = simde_mm256_max_epi16(bit_met_m3_p5, bit_met_m3_p7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p3_m7, bit_met_p3_m5); - xmm1 = simde_mm256_max_epi16(bit_met_p3_m3, bit_met_p3_m1); - xmm2 = simde_mm256_max_epi16(bit_met_p3_p1, bit_met_p3_p3); - xmm3 = simde_mm256_max_epi16(bit_met_p3_p5, bit_met_p3_p7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p5_m7, bit_met_p5_m5); - xmm1 = simde_mm256_max_epi16(bit_met_p5_m3, bit_met_p5_m1); - xmm2 = simde_mm256_max_epi16(bit_met_p5_p1, bit_met_p5_p3); - xmm3 = simde_mm256_max_epi16(bit_met_p5_p5, bit_met_p5_p7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); + xmm0 = max_epi16_256(bit_met_s[55],bit_met_s[54],bit_met_s[53],bit_met_s[52],bit_met_s[51],bit_met_s[50],bit_met_s[49],bit_met_s[48]); + xmm1 = max_epi16_256(bit_met_s[47],bit_met_s[46],bit_met_s[45],bit_met_s[44],bit_met_s[43],bit_met_s[42],bit_met_s[41],bit_met_s[40]); + xmm2 = max_epi16_256(bit_met_s[23],bit_met_s[22],bit_met_s[21],bit_met_s[20],bit_met_s[19],bit_met_s[18],bit_met_s[17],bit_met_s[16]); + xmm3 = max_epi16_256(bit_met_s[15],bit_met_s[14],bit_met_s[13],bit_met_s[12],bit_met_s[11],bit_met_s[10],bit_met_s[9],bit_met_s[8]); + logmax_num_re0 = simde_mm256_max_epi16(simde_mm256_max_epi16(xmm0, xmm1), simde_mm256_max_epi16(xmm2, xmm3)); y1i = simde_mm256_subs_epi16(logmax_num_re0, logmax_den_re0); // Detection for 6th bit - xmm0 = simde_mm256_max_epi16(bit_met_p7_p7, bit_met_p5_p7); - xmm1 = simde_mm256_max_epi16(bit_met_p3_p7, bit_met_p1_p7); - xmm2 = simde_mm256_max_epi16(bit_met_m1_p7, bit_met_m3_p7); - xmm3 = simde_mm256_max_epi16(bit_met_m5_p7, bit_met_m7_p7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(xmm4, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p7_p1, bit_met_p5_p1); - xmm1 = simde_mm256_max_epi16(bit_met_p3_p1, bit_met_p1_p1); - xmm2 = simde_mm256_max_epi16(bit_met_m1_p1, bit_met_m3_p1); - xmm3 = simde_mm256_max_epi16(bit_met_m5_p1, bit_met_m5_p1); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p7_m1, bit_met_p5_m1); - xmm1 = simde_mm256_max_epi16(bit_met_p3_m1, bit_met_p1_m1); - xmm2 = simde_mm256_max_epi16(bit_met_m1_m1, bit_met_m3_m1); - xmm3 = simde_mm256_max_epi16(bit_met_m5_m1, bit_met_m7_m1); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p7_m7, bit_met_p5_m7); - xmm1 = simde_mm256_max_epi16(bit_met_p3_m7, bit_met_p1_m7); - xmm2 = simde_mm256_max_epi16(bit_met_m1_m7, bit_met_m3_m7); - xmm3 = simde_mm256_max_epi16(bit_met_m5_m7, bit_met_m7_m7); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm4); - logmax_den_re0 = simde_mm256_max_epi16(logmax_den_re0, xmm5); + xmm0 = max_epi16_256(bit_met_s[0],bit_met_s[8],bit_met_s[16],bit_met_s[24],bit_met_s[32],bit_met_s[40],bit_met_s[48],bit_met_s[56]); + xmm1 = max_epi16_256(bit_met_s[3],bit_met_s[11],bit_met_s[19],bit_met_s[27],bit_met_s[35],bit_met_s[43],bit_met_s[51],bit_met_s[59]); + xmm2 = max_epi16_256(bit_met_s[4],bit_met_s[12],bit_met_s[20],bit_met_s[28],bit_met_s[36],bit_met_s[44],bit_met_s[52],bit_met_s[60]); + xmm3 = max_epi16_256(bit_met_s[7],bit_met_s[15],bit_met_s[23],bit_met_s[31],bit_met_s[39],bit_met_s[47],bit_met_s[55],bit_met_s[63]); + logmax_den_re0 = simde_mm256_max_epi16(simde_mm256_max_epi16(xmm0, xmm1), simde_mm256_max_epi16(xmm2, xmm3)); - xmm0 = simde_mm256_max_epi16(bit_met_p7_m5, bit_met_p5_m5); - xmm1 = simde_mm256_max_epi16(bit_met_p3_m5, bit_met_p1_m5); - xmm2 = simde_mm256_max_epi16(bit_met_m1_m5, bit_met_m3_m5); - xmm3 = simde_mm256_max_epi16(bit_met_m5_m5, bit_met_m7_m5); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(xmm4, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p7_m3, bit_met_p5_m3); - xmm1 = simde_mm256_max_epi16(bit_met_p3_m3, bit_met_p1_m3); - xmm2 = simde_mm256_max_epi16(bit_met_m1_m3, bit_met_m3_m3); - xmm3 = simde_mm256_max_epi16(bit_met_m5_m3, bit_met_m7_m3); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p7_p3, bit_met_p5_p3); - xmm1 = simde_mm256_max_epi16(bit_met_p3_p3, bit_met_p1_p3); - xmm2 = simde_mm256_max_epi16(bit_met_m1_p3, bit_met_m3_p3); - xmm3 = simde_mm256_max_epi16(bit_met_m5_p3, bit_met_m7_p3); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); - xmm0 = simde_mm256_max_epi16(bit_met_p7_p5, bit_met_p5_p5); - xmm1 = simde_mm256_max_epi16(bit_met_p3_p5, bit_met_p1_p5); - xmm2 = simde_mm256_max_epi16(bit_met_m1_p5, bit_met_m3_p5); - xmm3 = simde_mm256_max_epi16(bit_met_m5_p5, bit_met_m7_p5); - xmm4 = simde_mm256_max_epi16(xmm0, xmm1); - xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); - logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); + xmm0 = max_epi16_256(bit_met_s[6],bit_met_s[14],bit_met_s[22],bit_met_s[30],bit_met_s[38],bit_met_s[46],bit_met_s[54],bit_met_s[62]); + xmm1 = max_epi16_256(bit_met_s[5],bit_met_s[13],bit_met_s[21],bit_met_s[29],bit_met_s[37],bit_met_s[45],bit_met_s[53],bit_met_s[61]); + xmm2 = max_epi16_256(bit_met_s[2],bit_met_s[10],bit_met_s[18],bit_met_s[26],bit_met_s[34],bit_met_s[42],bit_met_s[50],bit_met_s[58]); + xmm3 = max_epi16_256(bit_met_s[1],bit_met_s[9],bit_met_s[17],bit_met_s[25],bit_met_s[33],bit_met_s[41],bit_met_s[49],bit_met_s[57]); + logmax_num_re0 = simde_mm256_max_epi16(simde_mm256_max_epi16(xmm0, xmm1), simde_mm256_max_epi16(xmm2, xmm3)); simde__m256i y2i = simde_mm256_subs_epi16(logmax_num_re0, logmax_den_re0); @@ -3612,9 +2069,8 @@ void nr_ulsch_qam64_qam64(c16_t *stream0_in, idx0 += 3; } } - +#endif simde_mm_empty(); - simde_m_empty(); } static void nr_ulsch_shift_llr(int16_t **llr_layers, uint32_t nb_re, uint32_t rxdataF_ext_offset, uint8_t mod_order, int shift)