From fae74fb8d4ec90c5c0eaf96a5a169fefbefcf2c8 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Tue, 2 Oct 2018 09:24:28 +0200 Subject: [PATCH 1/3] add dlsch llr computation --- cmake_targets/CMakeLists.txt | 1 + .../NR_UE_TRANSPORT/nr_dlsch_demodulation.c | 68 +- .../nr_dlsch_llr_computation.c | 8641 +++++++++++++++++ .../NR_UE_TRANSPORT/nr_transport_proto_ue.h | 45 +- 4 files changed, 8693 insertions(+), 62 deletions(-) create mode 100644 openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 33f005e51a..8ed49c2f0c 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1326,6 +1326,7 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_pbch.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c + ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/ ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_nr.c diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c index de155a86ed..2851b27906 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c @@ -114,7 +114,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, unsigned char aatx,aarx; - unsigned short nb_rb = 0, round; + unsigned short nb_rb = 0, nb_re =0, round; int avgs = 0;// rb; NR_DL_UE_HARQ_t *dlsch0_harq,*dlsch1_harq = 0; @@ -839,6 +839,9 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, //i_mod should have been passed as a parameter } + nb_re= (symbol==2)? (nb_rb*6):(nb_rb*12); + pdsch_vars[eNB_id]->llr_offset[symbol] = nb_re*dlsch0_harq->Qm * 2; + #if UE_TIMING_TRACE stop_meas(&ue->generic_stat_bis[ue->current_thread_id[nr_tti_rx]][slot]); #if DISABLE_LOG_X @@ -879,29 +882,27 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, switch (dlsch0_harq->Qm) { case 2 : if ((rx_type==rx_standard) || (codeword_TB1 == -1)) { - dlsch_qpsk_llr(frame_parms, + nr_dlsch_qpsk_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, (int16_t*)pllr_symbol_cw0, symbol, first_symbol_flag, nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_tti_rx,symbol), beamforming_mode); } else if (codeword_TB0 == -1){ - dlsch_qpsk_llr(frame_parms, + nr_dlsch_qpsk_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, (int16_t*)pllr_symbol_cw1, symbol, first_symbol_flag, nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_tti_rx,symbol), beamforming_mode); } else if (rx_type >= rx_IC_single_stream) { if (dlsch1_harq->Qm == 2) { - dlsch_qpsk_qpsk_llr(frame_parms, + nr_dlsch_qpsk_qpsk_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, rxdataF_comp_ptr, pdsch_vars[eNB_id]->dl_ch_rho2_ext, @@ -910,7 +911,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr128); if (rx_type==rx_IC_dual_stream) { - dlsch_qpsk_qpsk_llr(frame_parms, + nr_dlsch_qpsk_qpsk_llr(frame_parms, rxdataF_comp_ptr, pdsch_vars[eNB_id]->rxdataF_comp0, pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], @@ -921,7 +922,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, } } else if (dlsch1_harq->Qm == 4) { - dlsch_qpsk_16qam_llr(frame_parms, + nr_dlsch_qpsk_16qam_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, rxdataF_comp_ptr,//i dl_ch_mag_ptr,//i @@ -931,7 +932,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr128); if (rx_type==rx_IC_dual_stream) { - dlsch_16qam_qpsk_llr(frame_parms, + nr_dlsch_16qam_qpsk_llr(frame_parms, rxdataF_comp_ptr, pdsch_vars[eNB_id]->rxdataF_comp0,//i dl_ch_mag_ptr, @@ -943,7 +944,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, } } else { - dlsch_qpsk_64qam_llr(frame_parms, + nr_dlsch_qpsk_64qam_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, rxdataF_comp_ptr,//i dl_ch_mag_ptr,//i @@ -953,7 +954,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr128); if (rx_type==rx_IC_dual_stream) { - dlsch_64qam_qpsk_llr(frame_parms, + nr_dlsch_64qam_qpsk_llr(frame_parms, rxdataF_comp_ptr, pdsch_vars[eNB_id]->rxdataF_comp0,//i dl_ch_mag_ptr, @@ -968,27 +969,25 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, break; case 4 : if ((rx_type==rx_standard ) || (codeword_TB1 == -1)) { - dlsch_16qam_llr(frame_parms, + nr_dlsch_16qam_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, pdsch_vars[eNB_id]->llr[0], pdsch_vars[eNB_id]->dl_ch_mag0, symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr128, beamforming_mode); } else if (codeword_TB0 == -1){ - dlsch_16qam_llr(frame_parms, + nr_dlsch_16qam_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, pdsch_vars[eNB_id]->llr[1], pdsch_vars[eNB_id]->dl_ch_mag0, symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr128_2ndstream, beamforming_mode); } else if (rx_type >= rx_IC_single_stream) { if (dlsch1_harq->Qm == 2) { - dlsch_16qam_qpsk_llr(frame_parms, + nr_dlsch_16qam_qpsk_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, rxdataF_comp_ptr,//i pdsch_vars[eNB_id]->dl_ch_mag0, @@ -998,7 +997,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr128); if (rx_type==rx_IC_dual_stream) { - dlsch_qpsk_16qam_llr(frame_parms, + nr_dlsch_qpsk_16qam_llr(frame_parms, rxdataF_comp_ptr, pdsch_vars[eNB_id]->rxdataF_comp0,//i pdsch_vars[eNB_id]->dl_ch_mag0,//i @@ -1010,7 +1009,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, } } else if (dlsch1_harq->Qm == 4) { - dlsch_16qam_16qam_llr(frame_parms, + nr_dlsch_16qam_16qam_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, rxdataF_comp_ptr,//i pdsch_vars[eNB_id]->dl_ch_mag0, @@ -1021,7 +1020,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr128); if (rx_type==rx_IC_dual_stream) { - dlsch_16qam_16qam_llr(frame_parms, + nr_dlsch_16qam_16qam_llr(frame_parms, rxdataF_comp_ptr, pdsch_vars[eNB_id]->rxdataF_comp0,//i dl_ch_mag_ptr, @@ -1034,7 +1033,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, } } else { - dlsch_16qam_64qam_llr(frame_parms, + nr_dlsch_16qam_64qam_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, rxdataF_comp_ptr,//i pdsch_vars[eNB_id]->dl_ch_mag0, @@ -1045,7 +1044,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr128); if (rx_type==rx_IC_dual_stream) { - dlsch_64qam_16qam_llr(frame_parms, + nr_dlsch_64qam_16qam_llr(frame_parms, rxdataF_comp_ptr, pdsch_vars[eNB_id]->rxdataF_comp0, dl_ch_mag_ptr, @@ -1061,29 +1060,27 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, break; case 6 : if ((rx_type==rx_standard) || (codeword_TB1 == -1)) { - dlsch_64qam_llr(frame_parms, + nr_dlsch_64qam_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, (int16_t*)pllr_symbol_cw0, pdsch_vars[eNB_id]->dl_ch_mag0, pdsch_vars[eNB_id]->dl_ch_magb0, symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr_offset[symbol], beamforming_mode); } else if (codeword_TB0 == -1){ - dlsch_64qam_llr(frame_parms, + nr_dlsch_64qam_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, (int16_t*)pllr_symbol_cw1, pdsch_vars[eNB_id]->dl_ch_mag0, pdsch_vars[eNB_id]->dl_ch_magb0, symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr_offset[symbol], beamforming_mode); } else if (rx_type >= rx_IC_single_stream) { if (dlsch1_harq->Qm == 2) { - dlsch_64qam_qpsk_llr(frame_parms, + nr_dlsch_64qam_qpsk_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, rxdataF_comp_ptr,//i pdsch_vars[eNB_id]->dl_ch_mag0, @@ -1093,7 +1090,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr128); if (rx_type==rx_IC_dual_stream) { - dlsch_qpsk_64qam_llr(frame_parms, + nr_dlsch_qpsk_64qam_llr(frame_parms, rxdataF_comp_ptr, pdsch_vars[eNB_id]->rxdataF_comp0,//i pdsch_vars[eNB_id]->dl_ch_mag0, @@ -1105,7 +1102,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, } } else if (dlsch1_harq->Qm == 4) { - dlsch_64qam_16qam_llr(frame_parms, + nr_dlsch_64qam_16qam_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, rxdataF_comp_ptr,//i pdsch_vars[eNB_id]->dl_ch_mag0, @@ -1116,7 +1113,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr128); if (rx_type==rx_IC_dual_stream) { - dlsch_16qam_64qam_llr(frame_parms, + nr_dlsch_16qam_64qam_llr(frame_parms, rxdataF_comp_ptr, pdsch_vars[eNB_id]->rxdataF_comp0,//i dl_ch_mag_ptr, @@ -1129,7 +1126,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, } } else { - dlsch_64qam_64qam_llr(frame_parms, + nr_dlsch_64qam_64qam_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, rxdataF_comp_ptr,//i pdsch_vars[eNB_id]->dl_ch_mag0, @@ -1140,7 +1137,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr_offset[symbol]); if (rx_type==rx_IC_dual_stream) { - dlsch_64qam_64qam_llr(frame_parms, + nr_dlsch_64qam_64qam_llr(frame_parms, rxdataF_comp_ptr, pdsch_vars[eNB_id]->rxdataF_comp0,//i dl_ch_mag_ptr, @@ -1163,35 +1160,32 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, switch (get_Qm(dlsch1_harq->mcs)) { case 2 : if (rx_type==rx_standard) { - dlsch_qpsk_llr(frame_parms, + nr_dlsch_qpsk_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, (int16_t*)pllr_symbol_cw0, symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,nr_tti_rx,symbol), beamforming_mode); } break; case 4: if (rx_type==rx_standard) { - dlsch_16qam_llr(frame_parms, + nr_dlsch_16qam_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, pdsch_vars[eNB_id]->llr[0], pdsch_vars[eNB_id]->dl_ch_mag0, symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr128, beamforming_mode); } break; case 6 : if (rx_type==rx_standard) { - dlsch_64qam_llr(frame_parms, + nr_dlsch_64qam_llr(frame_parms, pdsch_vars[eNB_id]->rxdataF_comp0, (int16_t*)pllr_symbol_cw0, pdsch_vars[eNB_id]->dl_ch_mag0, pdsch_vars[eNB_id]->dl_ch_magb0, symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,nr_tti_rx,symbol), pdsch_vars[eNB_id]->llr_offset[symbol], beamforming_mode); } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c new file mode 100644 index 0000000000..9c8ad75d92 --- /dev/null +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c @@ -0,0 +1,8641 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c + * \brief Top-level routines for LLR computation of the PDSCH physical channel + * \author H. WANG + * \date 2018 + * \version 0.1 + * \company Eurecom + * \email: + * \note + * \warning + */ + +#include "PHY/defs_nr_UE.h" +#include "PHY/phy_extern_nr_ue.h" +#include "nr_transport_proto_ue.h" +#include "PHY/TOOLS/tools_defs.h" +#include "PHY/sse_intrin.h" + +//#define DEBUG_LLR_SIC + + +int16_t zeros[8] __attribute__ ((aligned(16))) = {0,0,0,0,0,0,0,0}; +int16_t ones[8] __attribute__ ((aligned(16))) = {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff}; +#if defined(__x86_64__) || defined(__i386__) +__m128i rho_rpi __attribute__ ((aligned(16))); +__m128i rho_rmi __attribute__ ((aligned(16))); +__m128i rho_rpi_1_1 __attribute__ ((aligned(16))); +__m128i rho_rpi_1_3 __attribute__ ((aligned(16))); +__m128i rho_rpi_1_5 __attribute__ ((aligned(16))); +__m128i rho_rpi_1_7 __attribute__ ((aligned(16))); +__m128i rho_rpi_3_1 __attribute__ ((aligned(16))); +__m128i rho_rpi_3_3 __attribute__ ((aligned(16))); +__m128i rho_rpi_3_5 __attribute__ ((aligned(16))); +__m128i rho_rpi_3_7 __attribute__ ((aligned(16))); +__m128i rho_rpi_5_1 __attribute__ ((aligned(16))); +__m128i rho_rpi_5_3 __attribute__ ((aligned(16))); +__m128i rho_rpi_5_5 __attribute__ ((aligned(16))); +__m128i rho_rpi_5_7 __attribute__ ((aligned(16))); +__m128i rho_rpi_7_1 __attribute__ ((aligned(16))); +__m128i rho_rpi_7_3 __attribute__ ((aligned(16))); +__m128i rho_rpi_7_5 __attribute__ ((aligned(16))); +__m128i rho_rpi_7_7 __attribute__ ((aligned(16))); +__m128i rho_rmi_1_1 __attribute__ ((aligned(16))); +__m128i rho_rmi_1_3 __attribute__ ((aligned(16))); +__m128i rho_rmi_1_5 __attribute__ ((aligned(16))); +__m128i rho_rmi_1_7 __attribute__ ((aligned(16))); +__m128i rho_rmi_3_1 __attribute__ ((aligned(16))); +__m128i rho_rmi_3_3 __attribute__ ((aligned(16))); +__m128i rho_rmi_3_5 __attribute__ ((aligned(16))); +__m128i rho_rmi_3_7 __attribute__ ((aligned(16))); +__m128i rho_rmi_5_1 __attribute__ ((aligned(16))); +__m128i rho_rmi_5_3 __attribute__ ((aligned(16))); +__m128i rho_rmi_5_5 __attribute__ ((aligned(16))); +__m128i rho_rmi_5_7 __attribute__ ((aligned(16))); +__m128i rho_rmi_7_1 __attribute__ ((aligned(16))); +__m128i rho_rmi_7_3 __attribute__ ((aligned(16))); +__m128i rho_rmi_7_5 __attribute__ ((aligned(16))); +__m128i rho_rmi_7_7 __attribute__ ((aligned(16))); + +__m128i psi_r_m7_m7 __attribute__ ((aligned(16))); +__m128i psi_r_m7_m5 __attribute__ ((aligned(16))); +__m128i psi_r_m7_m3 __attribute__ ((aligned(16))); +__m128i psi_r_m7_m1 __attribute__ ((aligned(16))); +__m128i psi_r_m7_p1 __attribute__ ((aligned(16))); +__m128i psi_r_m7_p3 __attribute__ ((aligned(16))); +__m128i psi_r_m7_p5 __attribute__ ((aligned(16))); +__m128i psi_r_m7_p7 __attribute__ ((aligned(16))); +__m128i psi_r_m5_m7 __attribute__ ((aligned(16))); +__m128i psi_r_m5_m5 __attribute__ ((aligned(16))); +__m128i psi_r_m5_m3 __attribute__ ((aligned(16))); +__m128i psi_r_m5_m1 __attribute__ ((aligned(16))); +__m128i psi_r_m5_p1 __attribute__ ((aligned(16))); +__m128i psi_r_m5_p3 __attribute__ ((aligned(16))); +__m128i psi_r_m5_p5 __attribute__ ((aligned(16))); +__m128i psi_r_m5_p7 __attribute__ ((aligned(16))); +__m128i psi_r_m3_m7 __attribute__ ((aligned(16))); +__m128i psi_r_m3_m5 __attribute__ ((aligned(16))); +__m128i psi_r_m3_m3 __attribute__ ((aligned(16))); +__m128i psi_r_m3_m1 __attribute__ ((aligned(16))); +__m128i psi_r_m3_p1 __attribute__ ((aligned(16))); +__m128i psi_r_m3_p3 __attribute__ ((aligned(16))); +__m128i psi_r_m3_p5 __attribute__ ((aligned(16))); +__m128i psi_r_m3_p7 __attribute__ ((aligned(16))); +__m128i psi_r_m1_m7 __attribute__ ((aligned(16))); +__m128i psi_r_m1_m5 __attribute__ ((aligned(16))); +__m128i psi_r_m1_m3 __attribute__ ((aligned(16))); +__m128i psi_r_m1_m1 __attribute__ ((aligned(16))); +__m128i psi_r_m1_p1 __attribute__ ((aligned(16))); +__m128i psi_r_m1_p3 __attribute__ ((aligned(16))); +__m128i psi_r_m1_p5 __attribute__ ((aligned(16))); +__m128i psi_r_m1_p7 __attribute__ ((aligned(16))); +__m128i psi_r_p1_m7 __attribute__ ((aligned(16))); +__m128i psi_r_p1_m5 __attribute__ ((aligned(16))); +__m128i psi_r_p1_m3 __attribute__ ((aligned(16))); +__m128i psi_r_p1_m1 __attribute__ ((aligned(16))); +__m128i psi_r_p1_p1 __attribute__ ((aligned(16))); +__m128i psi_r_p1_p3 __attribute__ ((aligned(16))); +__m128i psi_r_p1_p5 __attribute__ ((aligned(16))); +__m128i psi_r_p1_p7 __attribute__ ((aligned(16))); +__m128i psi_r_p3_m7 __attribute__ ((aligned(16))); +__m128i psi_r_p3_m5 __attribute__ ((aligned(16))); +__m128i psi_r_p3_m3 __attribute__ ((aligned(16))); +__m128i psi_r_p3_m1 __attribute__ ((aligned(16))); +__m128i psi_r_p3_p1 __attribute__ ((aligned(16))); +__m128i psi_r_p3_p3 __attribute__ ((aligned(16))); +__m128i psi_r_p3_p5 __attribute__ ((aligned(16))); +__m128i psi_r_p3_p7 __attribute__ ((aligned(16))); +__m128i psi_r_p5_m7 __attribute__ ((aligned(16))); +__m128i psi_r_p5_m5 __attribute__ ((aligned(16))); +__m128i psi_r_p5_m3 __attribute__ ((aligned(16))); +__m128i psi_r_p5_m1 __attribute__ ((aligned(16))); +__m128i psi_r_p5_p1 __attribute__ ((aligned(16))); +__m128i psi_r_p5_p3 __attribute__ ((aligned(16))); +__m128i psi_r_p5_p5 __attribute__ ((aligned(16))); +__m128i psi_r_p5_p7 __attribute__ ((aligned(16))); +__m128i psi_r_p7_m7 __attribute__ ((aligned(16))); +__m128i psi_r_p7_m5 __attribute__ ((aligned(16))); +__m128i psi_r_p7_m3 __attribute__ ((aligned(16))); +__m128i psi_r_p7_m1 __attribute__ ((aligned(16))); +__m128i psi_r_p7_p1 __attribute__ ((aligned(16))); +__m128i psi_r_p7_p3 __attribute__ ((aligned(16))); +__m128i psi_r_p7_p5 __attribute__ ((aligned(16))); +__m128i psi_r_p7_p7 __attribute__ ((aligned(16))); + +__m128i psi_i_m7_m7 __attribute__ ((aligned(16))); +__m128i psi_i_m7_m5 __attribute__ ((aligned(16))); +__m128i psi_i_m7_m3 __attribute__ ((aligned(16))); +__m128i psi_i_m7_m1 __attribute__ ((aligned(16))); +__m128i psi_i_m7_p1 __attribute__ ((aligned(16))); +__m128i psi_i_m7_p3 __attribute__ ((aligned(16))); +__m128i psi_i_m7_p5 __attribute__ ((aligned(16))); +__m128i psi_i_m7_p7 __attribute__ ((aligned(16))); +__m128i psi_i_m5_m7 __attribute__ ((aligned(16))); +__m128i psi_i_m5_m5 __attribute__ ((aligned(16))); +__m128i psi_i_m5_m3 __attribute__ ((aligned(16))); +__m128i psi_i_m5_m1 __attribute__ ((aligned(16))); +__m128i psi_i_m5_p1 __attribute__ ((aligned(16))); +__m128i psi_i_m5_p3 __attribute__ ((aligned(16))); +__m128i psi_i_m5_p5 __attribute__ ((aligned(16))); +__m128i psi_i_m5_p7 __attribute__ ((aligned(16))); +__m128i psi_i_m3_m7 __attribute__ ((aligned(16))); +__m128i psi_i_m3_m5 __attribute__ ((aligned(16))); +__m128i psi_i_m3_m3 __attribute__ ((aligned(16))); +__m128i psi_i_m3_m1 __attribute__ ((aligned(16))); +__m128i psi_i_m3_p1 __attribute__ ((aligned(16))); +__m128i psi_i_m3_p3 __attribute__ ((aligned(16))); +__m128i psi_i_m3_p5 __attribute__ ((aligned(16))); +__m128i psi_i_m3_p7 __attribute__ ((aligned(16))); +__m128i psi_i_m1_m7 __attribute__ ((aligned(16))); +__m128i psi_i_m1_m5 __attribute__ ((aligned(16))); +__m128i psi_i_m1_m3 __attribute__ ((aligned(16))); +__m128i psi_i_m1_m1 __attribute__ ((aligned(16))); +__m128i psi_i_m1_p1 __attribute__ ((aligned(16))); +__m128i psi_i_m1_p3 __attribute__ ((aligned(16))); +__m128i psi_i_m1_p5 __attribute__ ((aligned(16))); +__m128i psi_i_m1_p7 __attribute__ ((aligned(16))); +__m128i psi_i_p1_m7 __attribute__ ((aligned(16))); +__m128i psi_i_p1_m5 __attribute__ ((aligned(16))); +__m128i psi_i_p1_m3 __attribute__ ((aligned(16))); +__m128i psi_i_p1_m1 __attribute__ ((aligned(16))); +__m128i psi_i_p1_p1 __attribute__ ((aligned(16))); +__m128i psi_i_p1_p3 __attribute__ ((aligned(16))); +__m128i psi_i_p1_p5 __attribute__ ((aligned(16))); +__m128i psi_i_p1_p7 __attribute__ ((aligned(16))); +__m128i psi_i_p3_m7 __attribute__ ((aligned(16))); +__m128i psi_i_p3_m5 __attribute__ ((aligned(16))); +__m128i psi_i_p3_m3 __attribute__ ((aligned(16))); +__m128i psi_i_p3_m1 __attribute__ ((aligned(16))); +__m128i psi_i_p3_p1 __attribute__ ((aligned(16))); +__m128i psi_i_p3_p3 __attribute__ ((aligned(16))); +__m128i psi_i_p3_p5 __attribute__ ((aligned(16))); +__m128i psi_i_p3_p7 __attribute__ ((aligned(16))); +__m128i psi_i_p5_m7 __attribute__ ((aligned(16))); +__m128i psi_i_p5_m5 __attribute__ ((aligned(16))); +__m128i psi_i_p5_m3 __attribute__ ((aligned(16))); +__m128i psi_i_p5_m1 __attribute__ ((aligned(16))); +__m128i psi_i_p5_p1 __attribute__ ((aligned(16))); +__m128i psi_i_p5_p3 __attribute__ ((aligned(16))); +__m128i psi_i_p5_p5 __attribute__ ((aligned(16))); +__m128i psi_i_p5_p7 __attribute__ ((aligned(16))); +__m128i psi_i_p7_m7 __attribute__ ((aligned(16))); +__m128i psi_i_p7_m5 __attribute__ ((aligned(16))); +__m128i psi_i_p7_m3 __attribute__ ((aligned(16))); +__m128i psi_i_p7_m1 __attribute__ ((aligned(16))); +__m128i psi_i_p7_p1 __attribute__ ((aligned(16))); +__m128i psi_i_p7_p3 __attribute__ ((aligned(16))); +__m128i psi_i_p7_p5 __attribute__ ((aligned(16))); +__m128i psi_i_p7_p7 __attribute__ ((aligned(16))); + +__m128i a_r_m7_m7 __attribute__ ((aligned(16))); +__m128i a_r_m7_m5 __attribute__ ((aligned(16))); +__m128i a_r_m7_m3 __attribute__ ((aligned(16))); +__m128i a_r_m7_m1 __attribute__ ((aligned(16))); +__m128i a_r_m7_p1 __attribute__ ((aligned(16))); +__m128i a_r_m7_p3 __attribute__ ((aligned(16))); +__m128i a_r_m7_p5 __attribute__ ((aligned(16))); +__m128i a_r_m7_p7 __attribute__ ((aligned(16))); +__m128i a_r_m5_m7 __attribute__ ((aligned(16))); +__m128i a_r_m5_m5 __attribute__ ((aligned(16))); +__m128i a_r_m5_m3 __attribute__ ((aligned(16))); +__m128i a_r_m5_m1 __attribute__ ((aligned(16))); +__m128i a_r_m5_p1 __attribute__ ((aligned(16))); +__m128i a_r_m5_p3 __attribute__ ((aligned(16))); +__m128i a_r_m5_p5 __attribute__ ((aligned(16))); +__m128i a_r_m5_p7 __attribute__ ((aligned(16))); +__m128i a_r_m3_m7 __attribute__ ((aligned(16))); +__m128i a_r_m3_m5 __attribute__ ((aligned(16))); +__m128i a_r_m3_m3 __attribute__ ((aligned(16))); +__m128i a_r_m3_m1 __attribute__ ((aligned(16))); +__m128i a_r_m3_p1 __attribute__ ((aligned(16))); +__m128i a_r_m3_p3 __attribute__ ((aligned(16))); +__m128i a_r_m3_p5 __attribute__ ((aligned(16))); +__m128i a_r_m3_p7 __attribute__ ((aligned(16))); +__m128i a_r_m1_m7 __attribute__ ((aligned(16))); +__m128i a_r_m1_m5 __attribute__ ((aligned(16))); +__m128i a_r_m1_m3 __attribute__ ((aligned(16))); +__m128i a_r_m1_m1 __attribute__ ((aligned(16))); +__m128i a_r_m1_p1 __attribute__ ((aligned(16))); +__m128i a_r_m1_p3 __attribute__ ((aligned(16))); +__m128i a_r_m1_p5 __attribute__ ((aligned(16))); +__m128i a_r_m1_p7 __attribute__ ((aligned(16))); +__m128i a_r_p1_m7 __attribute__ ((aligned(16))); +__m128i a_r_p1_m5 __attribute__ ((aligned(16))); +__m128i a_r_p1_m3 __attribute__ ((aligned(16))); +__m128i a_r_p1_m1 __attribute__ ((aligned(16))); +__m128i a_r_p1_p1 __attribute__ ((aligned(16))); +__m128i a_r_p1_p3 __attribute__ ((aligned(16))); +__m128i a_r_p1_p5 __attribute__ ((aligned(16))); +__m128i a_r_p1_p7 __attribute__ ((aligned(16))); +__m128i a_r_p3_m7 __attribute__ ((aligned(16))); +__m128i a_r_p3_m5 __attribute__ ((aligned(16))); +__m128i a_r_p3_m3 __attribute__ ((aligned(16))); +__m128i a_r_p3_m1 __attribute__ ((aligned(16))); +__m128i a_r_p3_p1 __attribute__ ((aligned(16))); +__m128i a_r_p3_p3 __attribute__ ((aligned(16))); +__m128i a_r_p3_p5 __attribute__ ((aligned(16))); +__m128i a_r_p3_p7 __attribute__ ((aligned(16))); +__m128i a_r_p5_m7 __attribute__ ((aligned(16))); +__m128i a_r_p5_m5 __attribute__ ((aligned(16))); +__m128i a_r_p5_m3 __attribute__ ((aligned(16))); +__m128i a_r_p5_m1 __attribute__ ((aligned(16))); +__m128i a_r_p5_p1 __attribute__ ((aligned(16))); +__m128i a_r_p5_p3 __attribute__ ((aligned(16))); +__m128i a_r_p5_p5 __attribute__ ((aligned(16))); +__m128i a_r_p5_p7 __attribute__ ((aligned(16))); +__m128i a_r_p7_m7 __attribute__ ((aligned(16))); +__m128i a_r_p7_m5 __attribute__ ((aligned(16))); +__m128i a_r_p7_m3 __attribute__ ((aligned(16))); +__m128i a_r_p7_m1 __attribute__ ((aligned(16))); +__m128i a_r_p7_p1 __attribute__ ((aligned(16))); +__m128i a_r_p7_p3 __attribute__ ((aligned(16))); +__m128i a_r_p7_p5 __attribute__ ((aligned(16))); +__m128i a_r_p7_p7 __attribute__ ((aligned(16))); + +__m128i a_i_m7_m7 __attribute__ ((aligned(16))); +__m128i a_i_m7_m5 __attribute__ ((aligned(16))); +__m128i a_i_m7_m3 __attribute__ ((aligned(16))); +__m128i a_i_m7_m1 __attribute__ ((aligned(16))); +__m128i a_i_m7_p1 __attribute__ ((aligned(16))); +__m128i a_i_m7_p3 __attribute__ ((aligned(16))); +__m128i a_i_m7_p5 __attribute__ ((aligned(16))); +__m128i a_i_m7_p7 __attribute__ ((aligned(16))); +__m128i a_i_m5_m7 __attribute__ ((aligned(16))); +__m128i a_i_m5_m5 __attribute__ ((aligned(16))); +__m128i a_i_m5_m3 __attribute__ ((aligned(16))); +__m128i a_i_m5_m1 __attribute__ ((aligned(16))); +__m128i a_i_m5_p1 __attribute__ ((aligned(16))); +__m128i a_i_m5_p3 __attribute__ ((aligned(16))); +__m128i a_i_m5_p5 __attribute__ ((aligned(16))); +__m128i a_i_m5_p7 __attribute__ ((aligned(16))); +__m128i a_i_m3_m7 __attribute__ ((aligned(16))); +__m128i a_i_m3_m5 __attribute__ ((aligned(16))); +__m128i a_i_m3_m3 __attribute__ ((aligned(16))); +__m128i a_i_m3_m1 __attribute__ ((aligned(16))); +__m128i a_i_m3_p1 __attribute__ ((aligned(16))); +__m128i a_i_m3_p3 __attribute__ ((aligned(16))); +__m128i a_i_m3_p5 __attribute__ ((aligned(16))); +__m128i a_i_m3_p7 __attribute__ ((aligned(16))); +__m128i a_i_m1_m7 __attribute__ ((aligned(16))); +__m128i a_i_m1_m5 __attribute__ ((aligned(16))); +__m128i a_i_m1_m3 __attribute__ ((aligned(16))); +__m128i a_i_m1_m1 __attribute__ ((aligned(16))); +__m128i a_i_m1_p1 __attribute__ ((aligned(16))); +__m128i a_i_m1_p3 __attribute__ ((aligned(16))); +__m128i a_i_m1_p5 __attribute__ ((aligned(16))); +__m128i a_i_m1_p7 __attribute__ ((aligned(16))); +__m128i a_i_p1_m7 __attribute__ ((aligned(16))); +__m128i a_i_p1_m5 __attribute__ ((aligned(16))); +__m128i a_i_p1_m3 __attribute__ ((aligned(16))); +__m128i a_i_p1_m1 __attribute__ ((aligned(16))); +__m128i a_i_p1_p1 __attribute__ ((aligned(16))); +__m128i a_i_p1_p3 __attribute__ ((aligned(16))); +__m128i a_i_p1_p5 __attribute__ ((aligned(16))); +__m128i a_i_p1_p7 __attribute__ ((aligned(16))); +__m128i a_i_p3_m7 __attribute__ ((aligned(16))); +__m128i a_i_p3_m5 __attribute__ ((aligned(16))); +__m128i a_i_p3_m3 __attribute__ ((aligned(16))); +__m128i a_i_p3_m1 __attribute__ ((aligned(16))); +__m128i a_i_p3_p1 __attribute__ ((aligned(16))); +__m128i a_i_p3_p3 __attribute__ ((aligned(16))); +__m128i a_i_p3_p5 __attribute__ ((aligned(16))); +__m128i a_i_p3_p7 __attribute__ ((aligned(16))); +__m128i a_i_p5_m7 __attribute__ ((aligned(16))); +__m128i a_i_p5_m5 __attribute__ ((aligned(16))); +__m128i a_i_p5_m3 __attribute__ ((aligned(16))); +__m128i a_i_p5_m1 __attribute__ ((aligned(16))); +__m128i a_i_p5_p1 __attribute__ ((aligned(16))); +__m128i a_i_p5_p3 __attribute__ ((aligned(16))); +__m128i a_i_p5_p5 __attribute__ ((aligned(16))); +__m128i a_i_p5_p7 __attribute__ ((aligned(16))); +__m128i a_i_p7_m7 __attribute__ ((aligned(16))); +__m128i a_i_p7_m5 __attribute__ ((aligned(16))); +__m128i a_i_p7_m3 __attribute__ ((aligned(16))); +__m128i a_i_p7_m1 __attribute__ ((aligned(16))); +__m128i a_i_p7_p1 __attribute__ ((aligned(16))); +__m128i a_i_p7_p3 __attribute__ ((aligned(16))); +__m128i a_i_p7_p5 __attribute__ ((aligned(16))); +__m128i a_i_p7_p7 __attribute__ ((aligned(16))); + +__m128i psi_a_m7_m7 __attribute__ ((aligned(16))); +__m128i psi_a_m7_m5 __attribute__ ((aligned(16))); +__m128i psi_a_m7_m3 __attribute__ ((aligned(16))); +__m128i psi_a_m7_m1 __attribute__ ((aligned(16))); +__m128i psi_a_m7_p1 __attribute__ ((aligned(16))); +__m128i psi_a_m7_p3 __attribute__ ((aligned(16))); +__m128i psi_a_m7_p5 __attribute__ ((aligned(16))); +__m128i psi_a_m7_p7 __attribute__ ((aligned(16))); +__m128i psi_a_m5_m7 __attribute__ ((aligned(16))); +__m128i psi_a_m5_m5 __attribute__ ((aligned(16))); +__m128i psi_a_m5_m3 __attribute__ ((aligned(16))); +__m128i psi_a_m5_m1 __attribute__ ((aligned(16))); +__m128i psi_a_m5_p1 __attribute__ ((aligned(16))); +__m128i psi_a_m5_p3 __attribute__ ((aligned(16))); +__m128i psi_a_m5_p5 __attribute__ ((aligned(16))); +__m128i psi_a_m5_p7 __attribute__ ((aligned(16))); +__m128i psi_a_m3_m7 __attribute__ ((aligned(16))); +__m128i psi_a_m3_m5 __attribute__ ((aligned(16))); +__m128i psi_a_m3_m3 __attribute__ ((aligned(16))); +__m128i psi_a_m3_m1 __attribute__ ((aligned(16))); +__m128i psi_a_m3_p1 __attribute__ ((aligned(16))); +__m128i psi_a_m3_p3 __attribute__ ((aligned(16))); +__m128i psi_a_m3_p5 __attribute__ ((aligned(16))); +__m128i psi_a_m3_p7 __attribute__ ((aligned(16))); +__m128i psi_a_m1_m7 __attribute__ ((aligned(16))); +__m128i psi_a_m1_m5 __attribute__ ((aligned(16))); +__m128i psi_a_m1_m3 __attribute__ ((aligned(16))); +__m128i psi_a_m1_m1 __attribute__ ((aligned(16))); +__m128i psi_a_m1_p1 __attribute__ ((aligned(16))); +__m128i psi_a_m1_p3 __attribute__ ((aligned(16))); +__m128i psi_a_m1_p5 __attribute__ ((aligned(16))); +__m128i psi_a_m1_p7 __attribute__ ((aligned(16))); +__m128i psi_a_p1_m7 __attribute__ ((aligned(16))); +__m128i psi_a_p1_m5 __attribute__ ((aligned(16))); +__m128i psi_a_p1_m3 __attribute__ ((aligned(16))); +__m128i psi_a_p1_m1 __attribute__ ((aligned(16))); +__m128i psi_a_p1_p1 __attribute__ ((aligned(16))); +__m128i psi_a_p1_p3 __attribute__ ((aligned(16))); +__m128i psi_a_p1_p5 __attribute__ ((aligned(16))); +__m128i psi_a_p1_p7 __attribute__ ((aligned(16))); +__m128i psi_a_p3_m7 __attribute__ ((aligned(16))); +__m128i psi_a_p3_m5 __attribute__ ((aligned(16))); +__m128i psi_a_p3_m3 __attribute__ ((aligned(16))); +__m128i psi_a_p3_m1 __attribute__ ((aligned(16))); +__m128i psi_a_p3_p1 __attribute__ ((aligned(16))); +__m128i psi_a_p3_p3 __attribute__ ((aligned(16))); +__m128i psi_a_p3_p5 __attribute__ ((aligned(16))); +__m128i psi_a_p3_p7 __attribute__ ((aligned(16))); +__m128i psi_a_p5_m7 __attribute__ ((aligned(16))); +__m128i psi_a_p5_m5 __attribute__ ((aligned(16))); +__m128i psi_a_p5_m3 __attribute__ ((aligned(16))); +__m128i psi_a_p5_m1 __attribute__ ((aligned(16))); +__m128i psi_a_p5_p1 __attribute__ ((aligned(16))); +__m128i psi_a_p5_p3 __attribute__ ((aligned(16))); +__m128i psi_a_p5_p5 __attribute__ ((aligned(16))); +__m128i psi_a_p5_p7 __attribute__ ((aligned(16))); +__m128i psi_a_p7_m7 __attribute__ ((aligned(16))); +__m128i psi_a_p7_m5 __attribute__ ((aligned(16))); +__m128i psi_a_p7_m3 __attribute__ ((aligned(16))); +__m128i psi_a_p7_m1 __attribute__ ((aligned(16))); +__m128i psi_a_p7_p1 __attribute__ ((aligned(16))); +__m128i psi_a_p7_p3 __attribute__ ((aligned(16))); +__m128i psi_a_p7_p5 __attribute__ ((aligned(16))); +__m128i psi_a_p7_p7 __attribute__ ((aligned(16))); + +__m128i a_sq_m7_m7 __attribute__ ((aligned(16))); +__m128i a_sq_m7_m5 __attribute__ ((aligned(16))); +__m128i a_sq_m7_m3 __attribute__ ((aligned(16))); +__m128i a_sq_m7_m1 __attribute__ ((aligned(16))); +__m128i a_sq_m7_p1 __attribute__ ((aligned(16))); +__m128i a_sq_m7_p3 __attribute__ ((aligned(16))); +__m128i a_sq_m7_p5 __attribute__ ((aligned(16))); +__m128i a_sq_m7_p7 __attribute__ ((aligned(16))); +__m128i a_sq_m5_m7 __attribute__ ((aligned(16))); +__m128i a_sq_m5_m5 __attribute__ ((aligned(16))); +__m128i a_sq_m5_m3 __attribute__ ((aligned(16))); +__m128i a_sq_m5_m1 __attribute__ ((aligned(16))); +__m128i a_sq_m5_p1 __attribute__ ((aligned(16))); +__m128i a_sq_m5_p3 __attribute__ ((aligned(16))); +__m128i a_sq_m5_p5 __attribute__ ((aligned(16))); +__m128i a_sq_m5_p7 __attribute__ ((aligned(16))); +__m128i a_sq_m3_m7 __attribute__ ((aligned(16))); +__m128i a_sq_m3_m5 __attribute__ ((aligned(16))); +__m128i a_sq_m3_m3 __attribute__ ((aligned(16))); +__m128i a_sq_m3_m1 __attribute__ ((aligned(16))); +__m128i a_sq_m3_p1 __attribute__ ((aligned(16))); +__m128i a_sq_m3_p3 __attribute__ ((aligned(16))); +__m128i a_sq_m3_p5 __attribute__ ((aligned(16))); +__m128i a_sq_m3_p7 __attribute__ ((aligned(16))); +__m128i a_sq_m1_m7 __attribute__ ((aligned(16))); +__m128i a_sq_m1_m5 __attribute__ ((aligned(16))); +__m128i a_sq_m1_m3 __attribute__ ((aligned(16))); +__m128i a_sq_m1_m1 __attribute__ ((aligned(16))); +__m128i a_sq_m1_p1 __attribute__ ((aligned(16))); +__m128i a_sq_m1_p3 __attribute__ ((aligned(16))); +__m128i a_sq_m1_p5 __attribute__ ((aligned(16))); +__m128i a_sq_m1_p7 __attribute__ ((aligned(16))); +__m128i a_sq_p1_m7 __attribute__ ((aligned(16))); +__m128i a_sq_p1_m5 __attribute__ ((aligned(16))); +__m128i a_sq_p1_m3 __attribute__ ((aligned(16))); +__m128i a_sq_p1_m1 __attribute__ ((aligned(16))); +__m128i a_sq_p1_p1 __attribute__ ((aligned(16))); +__m128i a_sq_p1_p3 __attribute__ ((aligned(16))); +__m128i a_sq_p1_p5 __attribute__ ((aligned(16))); +__m128i a_sq_p1_p7 __attribute__ ((aligned(16))); +__m128i a_sq_p3_m7 __attribute__ ((aligned(16))); +__m128i a_sq_p3_m5 __attribute__ ((aligned(16))); +__m128i a_sq_p3_m3 __attribute__ ((aligned(16))); +__m128i a_sq_p3_m1 __attribute__ ((aligned(16))); +__m128i a_sq_p3_p1 __attribute__ ((aligned(16))); +__m128i a_sq_p3_p3 __attribute__ ((aligned(16))); +__m128i a_sq_p3_p5 __attribute__ ((aligned(16))); +__m128i a_sq_p3_p7 __attribute__ ((aligned(16))); +__m128i a_sq_p5_m7 __attribute__ ((aligned(16))); +__m128i a_sq_p5_m5 __attribute__ ((aligned(16))); +__m128i a_sq_p5_m3 __attribute__ ((aligned(16))); +__m128i a_sq_p5_m1 __attribute__ ((aligned(16))); +__m128i a_sq_p5_p1 __attribute__ ((aligned(16))); +__m128i a_sq_p5_p3 __attribute__ ((aligned(16))); +__m128i a_sq_p5_p5 __attribute__ ((aligned(16))); +__m128i a_sq_p5_p7 __attribute__ ((aligned(16))); +__m128i a_sq_p7_m7 __attribute__ ((aligned(16))); +__m128i a_sq_p7_m5 __attribute__ ((aligned(16))); +__m128i a_sq_p7_m3 __attribute__ ((aligned(16))); +__m128i a_sq_p7_m1 __attribute__ ((aligned(16))); +__m128i a_sq_p7_p1 __attribute__ ((aligned(16))); +__m128i a_sq_p7_p3 __attribute__ ((aligned(16))); +__m128i a_sq_p7_p5 __attribute__ ((aligned(16))); +__m128i a_sq_p7_p7 __attribute__ ((aligned(16))); + +__m128i bit_met_m7_m7 __attribute__ ((aligned(16))); +__m128i bit_met_m7_m5 __attribute__ ((aligned(16))); +__m128i bit_met_m7_m3 __attribute__ ((aligned(16))); +__m128i bit_met_m7_m1 __attribute__ ((aligned(16))); +__m128i bit_met_m7_p1 __attribute__ ((aligned(16))); +__m128i bit_met_m7_p3 __attribute__ ((aligned(16))); +__m128i bit_met_m7_p5 __attribute__ ((aligned(16))); +__m128i bit_met_m7_p7 __attribute__ ((aligned(16))); +__m128i bit_met_m5_m7 __attribute__ ((aligned(16))); +__m128i bit_met_m5_m5 __attribute__ ((aligned(16))); +__m128i bit_met_m5_m3 __attribute__ ((aligned(16))); +__m128i bit_met_m5_m1 __attribute__ ((aligned(16))); +__m128i bit_met_m5_p1 __attribute__ ((aligned(16))); +__m128i bit_met_m5_p3 __attribute__ ((aligned(16))); +__m128i bit_met_m5_p5 __attribute__ ((aligned(16))); +__m128i bit_met_m5_p7 __attribute__ ((aligned(16))); +__m128i bit_met_m3_m7 __attribute__ ((aligned(16))); +__m128i bit_met_m3_m5 __attribute__ ((aligned(16))); +__m128i bit_met_m3_m3 __attribute__ ((aligned(16))); +__m128i bit_met_m3_m1 __attribute__ ((aligned(16))); +__m128i bit_met_m3_p1 __attribute__ ((aligned(16))); +__m128i bit_met_m3_p3 __attribute__ ((aligned(16))); +__m128i bit_met_m3_p5 __attribute__ ((aligned(16))); +__m128i bit_met_m3_p7 __attribute__ ((aligned(16))); +__m128i bit_met_m1_m7 __attribute__ ((aligned(16))); +__m128i bit_met_m1_m5 __attribute__ ((aligned(16))); +__m128i bit_met_m1_m3 __attribute__ ((aligned(16))); +__m128i bit_met_m1_m1 __attribute__ ((aligned(16))); +__m128i bit_met_m1_p1 __attribute__ ((aligned(16))); +__m128i bit_met_m1_p3 __attribute__ ((aligned(16))); +__m128i bit_met_m1_p5 __attribute__ ((aligned(16))); +__m128i bit_met_m1_p7 __attribute__ ((aligned(16))); +__m128i bit_met_p1_m7 __attribute__ ((aligned(16))); +__m128i bit_met_p1_m5 __attribute__ ((aligned(16))); +__m128i bit_met_p1_m3 __attribute__ ((aligned(16))); +__m128i bit_met_p1_m1 __attribute__ ((aligned(16))); +__m128i bit_met_p1_p1 __attribute__ ((aligned(16))); +__m128i bit_met_p1_p3 __attribute__ ((aligned(16))); +__m128i bit_met_p1_p5 __attribute__ ((aligned(16))); +__m128i bit_met_p1_p7 __attribute__ ((aligned(16))); +__m128i bit_met_p3_m7 __attribute__ ((aligned(16))); +__m128i bit_met_p3_m5 __attribute__ ((aligned(16))); +__m128i bit_met_p3_m3 __attribute__ ((aligned(16))); +__m128i bit_met_p3_m1 __attribute__ ((aligned(16))); +__m128i bit_met_p3_p1 __attribute__ ((aligned(16))); +__m128i bit_met_p3_p3 __attribute__ ((aligned(16))); +__m128i bit_met_p3_p5 __attribute__ ((aligned(16))); +__m128i bit_met_p3_p7 __attribute__ ((aligned(16))); +__m128i bit_met_p5_m7 __attribute__ ((aligned(16))); +__m128i bit_met_p5_m5 __attribute__ ((aligned(16))); +__m128i bit_met_p5_m3 __attribute__ ((aligned(16))); +__m128i bit_met_p5_m1 __attribute__ ((aligned(16))); +__m128i bit_met_p5_p1 __attribute__ ((aligned(16))); +__m128i bit_met_p5_p3 __attribute__ ((aligned(16))); +__m128i bit_met_p5_p5 __attribute__ ((aligned(16))); +__m128i bit_met_p5_p7 __attribute__ ((aligned(16))); +__m128i bit_met_p7_m7 __attribute__ ((aligned(16))); +__m128i bit_met_p7_m5 __attribute__ ((aligned(16))); +__m128i bit_met_p7_m3 __attribute__ ((aligned(16))); +__m128i bit_met_p7_m1 __attribute__ ((aligned(16))); +__m128i bit_met_p7_p1 __attribute__ ((aligned(16))); +__m128i bit_met_p7_p3 __attribute__ ((aligned(16))); +__m128i bit_met_p7_p5 __attribute__ ((aligned(16))); +__m128i bit_met_p7_p7 __attribute__ ((aligned(16))); + +__m128i y0_p_1_1 __attribute__ ((aligned(16))); +__m128i y0_p_1_3 __attribute__ ((aligned(16))); +__m128i y0_p_1_5 __attribute__ ((aligned(16))); +__m128i y0_p_1_7 __attribute__ ((aligned(16))); +__m128i y0_p_3_1 __attribute__ ((aligned(16))); +__m128i y0_p_3_3 __attribute__ ((aligned(16))); +__m128i y0_p_3_5 __attribute__ ((aligned(16))); +__m128i y0_p_3_7 __attribute__ ((aligned(16))); +__m128i y0_p_5_1 __attribute__ ((aligned(16))); +__m128i y0_p_5_3 __attribute__ ((aligned(16))); +__m128i y0_p_5_5 __attribute__ ((aligned(16))); +__m128i y0_p_5_7 __attribute__ ((aligned(16))); +__m128i y0_p_7_1 __attribute__ ((aligned(16))); +__m128i y0_p_7_3 __attribute__ ((aligned(16))); +__m128i y0_p_7_5 __attribute__ ((aligned(16))); +__m128i y0_p_7_7 __attribute__ ((aligned(16))); +__m128i y0_m_1_1 __attribute__ ((aligned(16))); +__m128i y0_m_1_3 __attribute__ ((aligned(16))); +__m128i y0_m_1_5 __attribute__ ((aligned(16))); +__m128i y0_m_1_7 __attribute__ ((aligned(16))); +__m128i y0_m_3_1 __attribute__ ((aligned(16))); +__m128i y0_m_3_3 __attribute__ ((aligned(16))); +__m128i y0_m_3_5 __attribute__ ((aligned(16))); +__m128i y0_m_3_7 __attribute__ ((aligned(16))); +__m128i y0_m_5_1 __attribute__ ((aligned(16))); +__m128i y0_m_5_3 __attribute__ ((aligned(16))); +__m128i y0_m_5_5 __attribute__ ((aligned(16))); +__m128i y0_m_5_7 __attribute__ ((aligned(16))); +__m128i y0_m_7_1 __attribute__ ((aligned(16))); +__m128i y0_m_7_3 __attribute__ ((aligned(16))); +__m128i y0_m_7_5 __attribute__ ((aligned(16))); +__m128i y0_m_7_7 __attribute__ ((aligned(16))); + +__m128i xmm0 __attribute__ ((aligned(16))); +__m128i xmm1 __attribute__ ((aligned(16))); +__m128i xmm2 __attribute__ ((aligned(16))); +__m128i xmm3 __attribute__ ((aligned(16))); +__m128i xmm4 __attribute__ ((aligned(16))); +__m128i xmm5 __attribute__ ((aligned(16))); +__m128i xmm6 __attribute__ ((aligned(16))); +__m128i xmm7 __attribute__ ((aligned(16))); +__m128i xmm8 __attribute__ ((aligned(16))); + +__m128i y0r __attribute__ ((aligned(16))); +__m128i y0i __attribute__ ((aligned(16))); +__m128i y1r __attribute__ ((aligned(16))); +__m128i y1i __attribute__ ((aligned(16))); +__m128i y2r __attribute__ ((aligned(16))); +__m128i y2i __attribute__ ((aligned(16))); + +__m128i logmax_num_re0 __attribute__ ((aligned(16))); +__m128i logmax_num_im0 __attribute__ ((aligned(16))); +__m128i logmax_den_re0 __attribute__ ((aligned(16))); +__m128i logmax_den_im0 __attribute__ ((aligned(16))); +__m128i logmax_num_re1 __attribute__ ((aligned(16))); +__m128i logmax_num_im1 __attribute__ ((aligned(16))); +__m128i logmax_den_re1 __attribute__ ((aligned(16))); +__m128i logmax_den_im1 __attribute__ ((aligned(16))); + +__m128i tmp_result __attribute__ ((aligned(16))); +__m128i tmp_result2 __attribute__ ((aligned(16))); +__m128i tmp_result3 __attribute__ ((aligned(16))); +__m128i tmp_result4 __attribute__ ((aligned(16))); + + +//============================================================================================== +// Auxiliary Makros + +// 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 = _mm_mulhi_epi16(psi_r,a_r); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result2 = _mm_mulhi_epi16(psi_i,a_i); tmp_result2 = _mm_slli_epi16(tmp_result2,1); psi_a = _mm_adds_epi16(tmp_result,tmp_result2); + +// calculate interference magnitude +#define interference_abs_epi16(psi,int_ch_mag,int_mag,c1,c2) tmp_result = _mm_cmplt_epi16(psi,int_ch_mag); tmp_result2 = _mm_xor_si128(tmp_result,(*(__m128i*)&ones[0])); tmp_result = _mm_and_si128(tmp_result,c1); tmp_result2 = _mm_and_si128(tmp_result2,c2); int_mag = _mm_or_si128(tmp_result,tmp_result2); + +// calculate interference magnitude +// tmp_result = ones in shorts corr. to interval 2<=x<=4, tmp_result2 interval < 2, tmp_result3 interval 46 +#define interference_abs_64qam_epi16(psi,int_ch_mag,int_two_ch_mag,int_three_ch_mag,a,c1,c3,c5,c7) tmp_result = _mm_cmplt_epi16(psi,int_two_ch_mag); tmp_result3 = _mm_xor_si128(tmp_result,(*(__m128i*)&ones[0])); tmp_result2 = _mm_cmplt_epi16(psi,int_ch_mag); tmp_result = _mm_xor_si128(tmp_result,tmp_result2); tmp_result4 = _mm_cmpgt_epi16(psi,int_three_ch_mag); tmp_result3 = _mm_xor_si128(tmp_result3,tmp_result4); tmp_result = _mm_and_si128(tmp_result,c3); tmp_result2 = _mm_and_si128(tmp_result2,c1); tmp_result3 = _mm_and_si128(tmp_result3,c5); tmp_result4 = _mm_and_si128(tmp_result4,c7); tmp_result = _mm_or_si128(tmp_result,tmp_result2); tmp_result3 = _mm_or_si128(tmp_result3,tmp_result4); a = _mm_or_si128(tmp_result,tmp_result3); + +// 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 = _mm_mulhi_epi16(a_r,a_r); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result = _mm_mulhi_epi16(tmp_result,scale_factor); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result = _mm_mulhi_epi16(tmp_result,int_ch_mag); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result2 = _mm_mulhi_epi16(a_i,a_i); tmp_result2 = _mm_slli_epi16(tmp_result2,1); tmp_result2 = _mm_mulhi_epi16(tmp_result2,scale_factor); tmp_result2 = _mm_slli_epi16(tmp_result2,1); tmp_result2 = _mm_mulhi_epi16(tmp_result2,int_ch_mag); tmp_result2 = _mm_slli_epi16(tmp_result2,1); a_sq = _mm_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(a_r,a_i,int_ch_mag,scale_factor,a_sq) tmp_result = _mm_mulhi_epi16(a_r,a_r); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result = _mm_mulhi_epi16(tmp_result,scale_factor); tmp_result = _mm_slli_epi16(tmp_result,3); tmp_result = _mm_mulhi_epi16(tmp_result,int_ch_mag); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result2 = _mm_mulhi_epi16(a_i,a_i); tmp_result2 = _mm_slli_epi16(tmp_result2,1); tmp_result2 = _mm_mulhi_epi16(tmp_result2,scale_factor); tmp_result2 = _mm_slli_epi16(tmp_result2,3); tmp_result2 = _mm_mulhi_epi16(tmp_result2,int_ch_mag); tmp_result2 = _mm_slli_epi16(tmp_result2,1); a_sq = _mm_adds_epi16(tmp_result,tmp_result2); + +#elif defined(__arm__) + +#endif + +//============================================================================================== +// SINGLE-STREAM +//============================================================================================== + +//---------------------------------------------------------------------------------------------- +// QPSK +//---------------------------------------------------------------------------------------------- + +int nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, + int32_t **rxdataF_comp, + int16_t *dlsch_llr, + uint8_t symbol, + uint8_t first_symbol_flag, + uint16_t nb_rb, + uint8_t beamforming_mode) +{ + + uint32_t *rxF = (uint32_t*)&rxdataF_comp[0][((int32_t)symbol*nb_rb*12)]; + uint32_t *llr32; + int i,len; + + llr32 = (uint32_t*)dlsch_llr; + if (!llr32) { + LOG_E(PHY,"nr_dlsch_qpsk_llr: llr is null, symbol %d, llr32=%p\n",symbol, llr32); + return(-1); + } + + if (symbol ==2) //to update from config + len = nb_rb*6; + else + len = nb_rb*12; + /* + LOG_I(PHY,"dlsch_qpsk_llr: [symb %d / Length %d]: @LLR Buff %x, @LLR Buff(symb) %x \n", + symbol, + len, + dlsch_llr, + llr32); + */ + for (i=0; i>=2; // length in quad words (4 REs) + // printf("len>>=2=%d\n", len); + len+=(len_mod4==0 ? 0 : 1); + // printf("len+=%d\n", len); + for (i=0; iN_RB_DL*12)]; + ch_magb = (__m128i*)&dl_ch_magb[0][(symbol*frame_parms->N_RB_DL*12)]; +#elif defined(__arm__) + ch_mag = (int16x8_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; + ch_magb = (int16x8_t*)&dl_ch_magb[0][(symbol*frame_parms->N_RB_DL*12)]; +#endif + + if (symbol ==2) //to update from config + len = nb_rb*6; + else + len = nb_rb*12; + +// printf("nr_dlsch_64qam_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust); + +/* LOG_I(PHY,"nr_dlsch_64qam_llr [symb %d / FirstSym %d / Length %d]: @LLR Buff %x \n", + symbol, + first_symbol_flag, + len, + dlsch_llr, + pllr_symbol);*/ + + llr2 = llr; + llr += (len*6); + + len_mod4 =len&3; + len2=len>>2; // length in quad words (4 REs) + len2+=((len_mod4==0)?0:1); + + for (i=0; iN_RB_DL*12]; + int16_t rho_rho_amp_x0[2*frame_parms->N_RB_DL*12]; + uint16_t amp_tmp; + uint16_t *llr32=(uint16_t*)dlsch_llr; + int i, len, nsymb, len2; + uint8_t symbol, symbol_mod; + int len_acc=0; + uint16_t *sic_data; + uint16_t pbch_pss_sss_adjust; + unsigned char len_mod4=0; + uint16_t *llr2; + __m128i *ch_mag,*ch_magb; + + nsymb = (frame_parms->Ncp==0) ? 14:12; + + for (symbol=num_pdcch_symbols; symbolN_RB_DL*12)]); + int16_t *rho_1=(int16_t*)(&rho_i[0][((int16_t)symbol*frame_parms->N_RB_DL*12)]); + ch_mag = (__m128i*)(&dl_ch_mag[0][((int16_t)symbol*frame_parms->N_RB_DL*12)]); + ch_magb = (__m128i*)(&dl_ch_magb[0][((int16_t)symbol*frame_parms->N_RB_DL*12)]); + sic_data = (uint16_t*)(&sic_buffer[0][((int16_t)len_acc)]); + + symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; + + pbch_pss_sss_adjust=adjust_G2(frame_parms,&rb_alloc,6,subframe,symbol); + + if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { + amp_tmp = 0x1fff;//dlsch0->sqrt_rho_b; already taken into account + if (frame_parms->nb_antenna_ports_eNB!=1) + len = nb_rb*8 - (2*pbch_pss_sss_adjust/3); + else + len = nb_rb*10 - (5*pbch_pss_sss_adjust/6); + } else { + amp_tmp = 0x1fff; //dlsch0->sqrt_rho_a; already taken into account + len = nb_rb*12 - pbch_pss_sss_adjust; + } + + if (mod_order_0==6) + amp_tmp=amp_tmp<<1; // to compensate for >> 1 shift in modulation + + len_acc+=len; + + multadd_complex_vector_real_scalar((int16_t *)sic_data, + amp_tmp, + (int16_t *)rho_amp_x0, //this is in Q13 + 1, + len); + + mult_cpx_vector((int16_t *)rho_1, //Q15 + (int16_t *)rho_amp_x0, //Q13 + (int16_t*)rho_rho_amp_x0, + len, + 13); + + sub_cpx_vector16((int16_t *)rxF, + (int16_t *)rho_rho_amp_x0, + //(int16_t *)clean_x1, + (int16_t *)rxF, + len*2); + + llr2 = llr32; + llr32 += (len*6); + + len_mod4 =len&3; + len2=len>>2; // length in quad words (4 REs) + len2+=(len_mod4?0:1); + + + + for (i=0; iN_RB_DL*12)]; + int16_t *rxF_i=(int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *rho=(int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *llr16; + int len; + uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; + + if (first_symbol_flag == 1) { + llr16 = (int16_t*)dlsch_llr; + } else { + llr16 = (int16_t*)(*llr16p); + } + + AssertFatal(llr16!=NULL,"nr_dlsch_qpsk_qpsk_llr: llr is null, symbol %d\n",symbol); + + if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { + // if symbol has pilots + if (frame_parms->nb_antenna_ports_eNB!=1) + // in 2 antenna ports we have 8 REs per symbol per RB + len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); + else + // for 1 antenna port we have 10 REs per symbol per RB + len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); + } else { + // symbol has no pilots + len = (nb_rb*12) - pbch_pss_sss_adjust; + } + + // printf("nr_dlsch_qpsk_qpsk_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust); + // printf("qpsk_qpsk: len %d, llr16 %p\n",len,llr16); + qpsk_qpsk((short *)rxF, + (short *)rxF_i, + (short *)llr16, + (short *)rho, + len); + + llr16 += (len<<1); + *llr16p = (short *)llr16; + + return(0); +} + +//__m128i ONE_OVER_SQRT_8 __attribute__((aligned(16))); + +void qpsk_qpsk(short *stream0_in, + short *stream1_in, + short *stream0_out, + short *rho01, + int length + ) +{ + + /* + This function computes the LLRs of stream 0 (s_0) in presence of the interfering stream 1 (s_1) assuming that both symbols are QPSK. It can be used for both MU-MIMO interference-aware receiver or for SU-MIMO receivers. + + Parameters: + stream0_in = Matched filter output y0' = (h0*g0)*y0 + stream1_in = Matched filter output y1' = (h0*g1)*y0 + stream0_out = LLRs + rho01 = Correlation between the two effective channels \rho_{10} = (h1*g1)*(h0*g0) + length = number of resource elements + */ + +#if defined(__x86_64__) || defined(__i386__) + __m128i *rho01_128i = (__m128i *)rho01; + __m128i *stream0_128i_in = (__m128i *)stream0_in; + __m128i *stream1_128i_in = (__m128i *)stream1_in; + __m128i *stream0_128i_out = (__m128i *)stream0_out; + __m128i ONE_OVER_SQRT_8 = _mm_set1_epi16(23170); //round(2^16/sqrt(8)) +#elif defined(__arm__) + int16x8_t *rho01_128i = (int16x8_t *)rho01; + int16x8_t *stream0_128i_in = (int16x8_t *)stream0_in; + int16x8_t *stream1_128i_in = (int16x8_t *)stream1_in; + int16x8_t *stream0_128i_out = (int16x8_t *)stream0_out; + int16x8_t ONE_OVER_SQRT_8 = vdupq_n_s16(23170); //round(2^16/sqrt(8)) +#endif + + int i; + + + for (i=0; i>2; i+=2) { + // in each iteration, we take 8 complex samples +#if defined(__x86_64__) || defined(__i386__) + xmm0 = rho01_128i[i]; // 4 symbols + xmm1 = rho01_128i[i+1]; + + // put (rho_r + rho_i)/2sqrt2 in rho_rpi + // put (rho_r - rho_i)/2sqrt2 in rho_rmi + + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho) + xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho) + rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho) + rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho) + + // divide by sqrt(8), no shift needed ONE_OVER_SQRT_8 = Q1.16 + rho_rpi = _mm_mulhi_epi16(rho_rpi,ONE_OVER_SQRT_8); + rho_rmi = _mm_mulhi_epi16(rho_rmi,ONE_OVER_SQRT_8); +#elif defined(__arm__) + + +#endif + // Compute LLR for first bit of stream 0 + + // Compute real and imaginary parts of MF output for stream 0 +#if defined(__x86_64__) || defined(__i386__) + xmm0 = stream0_128i_in[i]; + xmm1 = stream0_128i_in[i+1]; + + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] + y0i = _mm_unpackhi_epi64(xmm0,xmm1); + + y0r_over2 = _mm_srai_epi16(y0r,1); // divide by 2 + y0i_over2 = _mm_srai_epi16(y0i,1); // divide by 2 +#elif defined(__arm__) + + +#endif + // Compute real and imaginary parts of MF output for stream 1 +#if defined(__x86_64__) || defined(__i386__) + xmm0 = stream1_128i_in[i]; + xmm1 = stream1_128i_in[i+1]; + + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] + y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)] + + y1r_over2 = _mm_srai_epi16(y1r,1); // divide by 2 + y1i_over2 = _mm_srai_epi16(y1i,1); // divide by 2 + + // Compute the terms for the LLR of first bit + + xmm0 = _mm_setzero_si128(); // ZERO + + // 1 term for numerator of LLR + xmm3 = _mm_subs_epi16(y1r_over2,rho_rpi); + A = _mm_abs_epi16(xmm3); // A = |y1r/2 - rho/sqrt(8)| + xmm2 = _mm_adds_epi16(A,y0i_over2); // = |y1r/2 - rho/sqrt(8)| + y0i/2 + xmm3 = _mm_subs_epi16(y1i_over2,rho_rmi); + B = _mm_abs_epi16(xmm3); // B = |y1i/2 - rho*/sqrt(8)| + logmax_num_re0 = _mm_adds_epi16(B,xmm2); // = |y1r/2 - rho/sqrt(8)|+|y1i/2 - rho*/sqrt(8)| + y0i/2 + + // 2 term for numerator of LLR + xmm3 = _mm_subs_epi16(y1r_over2,rho_rmi); + C = _mm_abs_epi16(xmm3); // C = |y1r/2 - rho*/4| + xmm2 = _mm_subs_epi16(C,y0i_over2); // = |y1r/2 - rho*/4| - y0i/2 + xmm3 = _mm_adds_epi16(y1i_over2,rho_rpi); + D = _mm_abs_epi16(xmm3); // D = |y1i/2 + rho/4| + xmm2 = _mm_adds_epi16(xmm2,D); // |y1r/2 - rho*/4| + |y1i/2 + rho/4| - y0i/2 + logmax_num_re0 = _mm_max_epi16(logmax_num_re0,xmm2); // max, numerator done + + // 1 term for denominator of LLR + xmm3 = _mm_adds_epi16(y1r_over2,rho_rmi); + E = _mm_abs_epi16(xmm3); // E = |y1r/2 + rho*/4| + xmm2 = _mm_adds_epi16(E,y0i_over2); // = |y1r/2 + rho*/4| + y0i/2 + xmm3 = _mm_subs_epi16(y1i_over2,rho_rpi); + F = _mm_abs_epi16(xmm3); // F = |y1i/2 - rho/4| + logmax_den_re0 = _mm_adds_epi16(F,xmm2); // = |y1r/2 + rho*/4| + |y1i/2 - rho/4| + y0i/2 + + // 2 term for denominator of LLR + xmm3 = _mm_adds_epi16(y1r_over2,rho_rpi); + G = _mm_abs_epi16(xmm3); // G = |y1r/2 + rho/4| + xmm2 = _mm_subs_epi16(G,y0i_over2); // = |y1r/2 + rho/4| - y0i/2 + xmm3 = _mm_adds_epi16(y1i_over2,rho_rmi); + H = _mm_abs_epi16(xmm3); // H = |y1i/2 + rho*/4| + xmm2 = _mm_adds_epi16(xmm2,H); // = |y1r/2 + rho/4| + |y1i/2 + rho*/4| - y0i/2 + logmax_den_re0 = _mm_max_epi16(logmax_den_re0,xmm2); // max, denominator done + + // Compute the terms for the LLR of first bit + + // 1 term for nominator of LLR + xmm2 = _mm_adds_epi16(A,y0r_over2); + logmax_num_im0 = _mm_adds_epi16(B,xmm2); // = |y1r/2 - rho/4| + |y1i/2 - rho*/4| + y0r/2 + + // 2 term for nominator of LLR + xmm2 = _mm_subs_epi16(E,y0r_over2); + xmm2 = _mm_adds_epi16(xmm2,F); // = |y1r/2 + rho*/4| + |y1i/2 - rho/4| - y0r/2 + + logmax_num_im0 = _mm_max_epi16(logmax_num_im0,xmm2); // max, nominator done + + // 1 term for denominator of LLR + xmm2 = _mm_adds_epi16(C,y0r_over2); + logmax_den_im0 = _mm_adds_epi16(D,xmm2); // = |y1r/2 - rho*/4| + |y1i/2 + rho/4| - y0r/2 + + xmm2 = _mm_subs_epi16(G,y0r_over2); + xmm2 = _mm_adds_epi16(xmm2,H); // = |y1r/2 + rho/4| + |y1i/2 + rho*/4| - y0r/2 + + logmax_den_im0 = _mm_max_epi16(logmax_den_im0,xmm2); // max, denominator done + + // LLR of first bit [L1(1), L1(2), L1(3), L1(4)] + y0r = _mm_adds_epi16(y0r,logmax_num_re0); + y0r = _mm_subs_epi16(y0r,logmax_den_re0); + + // LLR of second bit [L2(1), L2(2), L2(3), L2(4)] + y0i = _mm_adds_epi16(y0i,logmax_num_im0); + y0i = _mm_subs_epi16(y0i,logmax_den_im0); + + _mm_storeu_si128(&stream0_128i_out[i],_mm_unpacklo_epi16(y0r,y0i)); // = [L1(1), L2(1), L1(2), L2(2)] + + if (i<((length>>1) - 1)) // false if only 2 REs remain + _mm_storeu_si128(&stream0_128i_out[i+1],_mm_unpackhi_epi16(y0r,y0i)); + +#elif defined(__x86_64__) + +#endif + } + +#if defined(__x86_64__) || defined(__i386__) + _mm_empty(); + _m_empty(); +#endif +} + +int nr_dlsch_qpsk_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, + int32_t **rxdataF_comp, + int32_t **rxdataF_comp_i, + int32_t **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10}) + int32_t **rho_i, + int16_t *dlsch_llr, + uint8_t symbol, + uint8_t first_symbol_flag, + uint16_t nb_rb, + uint16_t pbch_pss_sss_adjust, + int16_t **llr16p) +{ + + int16_t *rxF=(int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *rxF_i=(int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *rho=(int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *llr16; + int len; + uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; + + if (first_symbol_flag == 1) { + llr16 = (int16_t*)dlsch_llr; + } else { + llr16 = (int16_t*)(*llr16p); + } + + AssertFatal(llr16!=NULL,"nr_dlsch_qpsk_qpsk_llr: llr is null, symbol %d\n",symbol); + + + if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { + // if symbol has pilots + if (frame_parms->nb_antenna_ports_eNB!=1) + // in 2 antenna ports we have 8 REs per symbol per RB + len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); + else + // for 1 antenna port we have 10 REs per symbol per RB + len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); + } else { + // symbol has no pilots + len = (nb_rb*12) - pbch_pss_sss_adjust; + } + + qpsk_qam16((short *)rxF, + (short *)rxF_i, + (short *)ch_mag_i, + (short *)llr16, + (short *)rho, + len); + + llr16 += (len<<1); + *llr16p = (short *)llr16; + + return(0); +} + +/* +#if defined(__x86_64__) || defined(__i386__) +__m128i ONE_OVER_SQRT_2 __attribute__((aligned(16))); +__m128i ONE_OVER_SQRT_10 __attribute__((aligned(16))); +__m128i THREE_OVER_SQRT_10 __attribute__((aligned(16))); +__m128i ONE_OVER_SQRT_10_Q15 __attribute__((aligned(16))); +__m128i SQRT_10_OVER_FOUR __attribute__((aligned(16))); +__m128i ch_mag_int; +#endif +*/ +void qpsk_qam16(int16_t *stream0_in, + int16_t *stream1_in, + int16_t *ch_mag_i, + int16_t *stream0_out, + int16_t *rho01, + int32_t length + ) +{ + /* + This function computes the LLRs of stream 0 (s_0) in presence of the interfering stream 1 (s_1) assuming that both symbols are QPSK. It can be used for both MU-MIMO interference-aware receiver or for SU-MIMO receivers. + + Parameters: + stream0_in = Matched filter output y0' = (h0*g0)*y0 + stream1_in = Matched filter output y1' = (h0*g1)*y0 + stream0_out = LLRs + rho01 = Correlation between the two effective channels \rho_{10} = (h1*g1)*(h0*g0) + length = number of resource elements + */ + +#if defined(__x86_64__) || defined(__i386__) + __m128i *rho01_128i = (__m128i *)rho01; + __m128i *stream0_128i_in = (__m128i *)stream0_in; + __m128i *stream1_128i_in = (__m128i *)stream1_in; + __m128i *stream0_128i_out = (__m128i *)stream0_out; + __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i; + __m128i ONE_OVER_SQRT_2 = _mm_set1_epi16(23170); // round(1/sqrt(2)*2^15) + __m128i ONE_OVER_SQRT_10_Q15 = _mm_set1_epi16(10362); // round(1/sqrt(10)*2^15) + __m128i THREE_OVER_SQRT_10 = _mm_set1_epi16(31086); // round(3/sqrt(10)*2^15) + __m128i SQRT_10_OVER_FOUR = _mm_set1_epi16(25905); // round(sqrt(10)/4*2^15) + __m128i ch_mag_int __attribute__((aligned(16))); +#elif defined(__arm__) + int16x8_t *rho01_128i = (int16x8_t *)rho01; + int16x8_t *stream0_128i_in = (int16x8_t *)stream0_in; + int16x8_t *stream1_128i_in = (int16x8_t *)stream1_in; + int16x8_t *stream0_128i_out = (int16x8_t *)stream0_out; + int16x8_t *ch_mag_128i_i = (int16x8_t *)ch_mag_i; + int16x8_t ONE_OVER_SQRT_2 = vdupq_n_s16(23170); // round(1/sqrt(2)*2^15) + int16x8_t ONE_OVER_SQRT_10_Q15 = vdupq_n_s16(10362); // round(1/sqrt(10)*2^15) + int16x8_t THREE_OVER_SQRT_10 = vdupq_n_s16(31086); // round(3/sqrt(10)*2^15) + int16x8_t SQRT_10_OVER_FOUR = vdupq_n_s16(25905); // round(sqrt(10)/4*2^15) + int16x8_t ch_mag_int __attribute__((aligned(16))); +#endif + +#ifdef DEBUG_LLR + print_shorts2("rho01_128i:\n",rho01_128i); +#endif + + int i; + + + for (i=0; i>2; i+=2) { + // in each iteration, we take 8 complex samples + +#if defined(__x86_64__) || defined(__i386__) + + xmm0 = rho01_128i[i]; // 4 symbols + xmm1 = rho01_128i[i+1]; + + // put (rho_r + rho_i)/2sqrt2 in rho_rpi + // put (rho_r - rho_i)/2sqrt2 in rho_rmi + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho) + xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho) + rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho) + rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho) + + // divide by sqrt(2) + rho_rpi = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_2); + rho_rmi = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_2); + rho_rpi = _mm_slli_epi16(rho_rpi,1); + rho_rmi = _mm_slli_epi16(rho_rmi,1); + + // Compute LLR for first bit of stream 0 + + // Compute real and imaginary parts of MF output for stream 0 + xmm0 = stream0_128i_in[i]; + xmm1 = stream0_128i_in[i+1]; + + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] + y0i = _mm_unpackhi_epi64(xmm0,xmm1); + + // divide by sqrt(2) + y0r_over2 = _mm_mulhi_epi16(y0r, ONE_OVER_SQRT_2); + y0i_over2 = _mm_mulhi_epi16(y0i, ONE_OVER_SQRT_2); + y0r_over2 = _mm_slli_epi16(y0r,1); + y0i_over2 = _mm_slli_epi16(y0i,1); + + y0_p_1_1 = _mm_adds_epi16(y0r_over2, y0i_over2); + y0_m_1_1 = _mm_subs_epi16(y0r_over2, y0i_over2); + + // Compute real and imaginary parts of MF output for stream 1 + xmm0 = stream1_128i_in[i]; + xmm1 = stream1_128i_in[i+1]; + + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] + y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)] + + xmm0 = _mm_setzero_si128(); // ZERO + + // compute psi + xmm3 = _mm_subs_epi16(y1r,rho_rpi); + psi_r_p1_p1 = _mm_abs_epi16(xmm3); + xmm3 = _mm_subs_epi16(y1i,rho_rmi); + psi_i_p1_p1 = _mm_abs_epi16(xmm3); + xmm3 = _mm_subs_epi16(y1r,rho_rmi); + psi_r_p1_m1 = _mm_abs_epi16(xmm3); + xmm3 = _mm_adds_epi16(y1i,rho_rpi); + psi_i_p1_m1 = _mm_abs_epi16(xmm3); + xmm3 = _mm_adds_epi16(y1r,rho_rmi); + psi_r_m1_p1 = _mm_abs_epi16(xmm3); + xmm3 = _mm_subs_epi16(y1i,rho_rpi); + psi_i_m1_p1 = _mm_abs_epi16(xmm3); + xmm3 = _mm_adds_epi16(y1r,rho_rpi); + psi_r_m1_m1 = _mm_abs_epi16(xmm3); + xmm3 = _mm_adds_epi16(y1i,rho_rmi); + psi_i_m1_m1 = _mm_abs_epi16(xmm3); + + // Rearrange interfering channel magnitudes + xmm2 = ch_mag_128i_i[i]; + xmm3 = ch_mag_128i_i[i+1]; + + xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + + ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3); + + // calculate optimal interference amplitudes + interference_abs_epi16(psi_r_p1_p1 , ch_mag_int, a_r_p1_p1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p1_p1 , ch_mag_int, a_i_p1_p1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p1_m1 , ch_mag_int, a_r_p1_m1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p1_m1 , ch_mag_int, a_i_p1_m1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m1_p1 , ch_mag_int, a_r_m1_p1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m1_p1 , ch_mag_int, a_i_m1_p1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m1_m1 , ch_mag_int, a_r_m1_m1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m1_m1 , ch_mag_int, a_i_m1_m1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + + // prodsum + prodsum_psi_a_epi16(psi_r_p1_p1, a_r_p1_p1, psi_i_p1_p1, a_i_p1_p1, psi_a_p1_p1); + prodsum_psi_a_epi16(psi_r_p1_m1, a_r_p1_m1, psi_i_p1_m1, a_i_p1_m1, psi_a_p1_m1); + prodsum_psi_a_epi16(psi_r_m1_p1, a_r_m1_p1, psi_i_m1_p1, a_i_m1_p1, psi_a_m1_p1); + prodsum_psi_a_epi16(psi_r_m1_m1, a_r_m1_m1, psi_i_m1_m1, a_i_m1_m1, psi_a_m1_m1); + + // squares + square_a_epi16(a_r_p1_p1, a_i_p1_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_p1); + square_a_epi16(a_r_p1_m1, a_i_p1_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_m1); + square_a_epi16(a_r_m1_p1, a_i_m1_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_p1); + square_a_epi16(a_r_m1_m1, a_i_m1_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_m1); + + // Computing Metrics + xmm0 = _mm_subs_epi16(psi_a_p1_p1, a_sq_p1_p1); + bit_met_p1_p1 = _mm_adds_epi16(xmm0, y0_p_1_1); + + xmm0 = _mm_subs_epi16(psi_a_p1_m1, a_sq_p1_m1); + bit_met_p1_m1 = _mm_adds_epi16(xmm0, y0_m_1_1); + + xmm0 = _mm_subs_epi16(psi_a_m1_p1, a_sq_m1_p1); + bit_met_m1_p1 = _mm_subs_epi16(xmm0, y0_m_1_1); + + xmm0 = _mm_subs_epi16(psi_a_m1_m1, a_sq_m1_m1); + bit_met_m1_m1 = _mm_subs_epi16(xmm0, y0_p_1_1); + + // MSB + logmax_num_re0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_m1); // bit=0 + logmax_den_re0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_m1); // bit=1 + + y0r = _mm_subs_epi16(logmax_num_re0,logmax_den_re0); + + // LSB + logmax_num_im0 = _mm_max_epi16(bit_met_p1_p1,bit_met_m1_p1); // bit=0 + logmax_den_im0 = _mm_max_epi16(bit_met_p1_m1,bit_met_m1_m1); // bit=1 + + y0i = _mm_subs_epi16(logmax_num_im0,logmax_den_im0); + + stream0_128i_out[i] = _mm_unpacklo_epi16(y0r,y0i); // = [L1(1), L2(1), L1(2), L2(2)] + + if (i<((length>>1) - 1)) // false if only 2 REs remain + stream0_128i_out[i+1] = _mm_unpackhi_epi16(y0r,y0i); + +#elif defined(__arm__) + +#endif + } + +#if defined(__x86_64__) || defined(__i386__) + _mm_empty(); + _m_empty(); +#endif +} + +int nr_dlsch_qpsk_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, + int32_t **rxdataF_comp, + int32_t **rxdataF_comp_i, + int32_t **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10}) + int32_t **rho_i, + int16_t *dlsch_llr, + uint8_t symbol, + uint8_t first_symbol_flag, + uint16_t nb_rb, + uint16_t pbch_pss_sss_adjust, + int16_t **llr16p) +{ + + int16_t *rxF=(int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *rxF_i=(int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *rho=(int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *llr16; + int len; + uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; + + + if (first_symbol_flag == 1) { + llr16 = (int16_t*)dlsch_llr; + } else { + llr16 = (int16_t*)(*llr16p); + } + + AssertFatal(llr16!=NULL,"nr_dlsch_qpsk_qam64_llr: llr is null, symbol %d\n",symbol); + + if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { + // if symbol has pilots + if (frame_parms->nb_antenna_ports_eNB!=1) + // in 2 antenna ports we have 8 REs per symbol per RB + len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); + else + // for 1 antenna port we have 10 REs per symbol per RB + len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); + } else { + // symbol has no pilots + len = (nb_rb*12) - pbch_pss_sss_adjust; + } + + qpsk_qam64((short *)rxF, + (short *)rxF_i, + (short *)ch_mag_i, + (short *)llr16, + (short *)rho, + len); + + llr16 += (len<<1); + *llr16p = (short *)llr16; + + return(0); +} +/* +__m128i ONE_OVER_SQRT_2_42 __attribute__((aligned(16))); +__m128i THREE_OVER_SQRT_2_42 __attribute__((aligned(16))); +__m128i FIVE_OVER_SQRT_2_42 __attribute__((aligned(16))); +__m128i SEVEN_OVER_SQRT_2_42 __attribute__((aligned(16))); + +__m128i ch_mag_int_with_sigma2 __attribute__((aligned(16))); +__m128i two_ch_mag_int_with_sigma2 __attribute__((aligned(16))); +__m128i three_ch_mag_int_with_sigma2 __attribute__((aligned(16))); +__m128i SQRT_42_OVER_FOUR __attribute__((aligned(16))); +*/ +void qpsk_qam64(short *stream0_in, + short *stream1_in, + short *ch_mag_i, + short *stream0_out, + short *rho01, + int length + ) +{ + + /* + This function computes the LLRs of stream 0 (s_0) in presence of the interfering stream 1 (s_1) assuming that both symbols are QPSK. It can be used for both MU-MIMO interference-aware receiver or for SU-MIMO receivers. + + Parameters: + stream0_in = Matched filter output y0' = (h0*g0)*y0 + stream1_in = Matched filter output y1' = (h0*g1)*y0 + stream0_out = LLRs + rho01 = Correlation between the two effective channels \rho_{10} = (h1*g1)*(h0*g0) + length = number of resource elements + */ + +#if defined(__x86_64__) || defined(__i386__) + __m128i *rho01_128i = (__m128i *)rho01; + __m128i *stream0_128i_in = (__m128i *)stream0_in; + __m128i *stream1_128i_in = (__m128i *)stream1_in; + __m128i *stream0_128i_out = (__m128i *)stream0_out; + __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i; + __m128i ONE_OVER_SQRT_2 = _mm_set1_epi16(23170); // round(1/sqrt(2)*2^15) + __m128i ONE_OVER_SQRT_2_42 = _mm_set1_epi16(3575); // round(1/sqrt(2*42)*2^15) + __m128i THREE_OVER_SQRT_2_42 = _mm_set1_epi16(10726); // round(3/sqrt(2*42)*2^15) + __m128i FIVE_OVER_SQRT_2_42 = _mm_set1_epi16(17876); // round(5/sqrt(2*42)*2^15) + __m128i SEVEN_OVER_SQRT_2_42 = _mm_set1_epi16(25027); // round(7/sqrt(2*42)*2^15) + __m128i SQRT_42_OVER_FOUR = _mm_set1_epi16(13272); // round(sqrt(42)/4*2^13), Q3.1 + __m128i ch_mag_int; + __m128i ch_mag_int_with_sigma2; + __m128i two_ch_mag_int_with_sigma2; + __m128i three_ch_mag_int_with_sigma2; +#elif defined(__arm__) + +#endif + +#ifdef DEBUG_LLR + print_shorts2("rho01_128i:\n",rho01_128i); +#endif + + int i; + + + for (i=0; i>2; i+=2) { + // in each iteration, we take 8 complex samples + +#if defined(__x86_64__) || defined(__i386__) + + xmm0 = rho01_128i[i]; // 4 symbols + xmm1 = rho01_128i[i+1]; + + // put (rho_r + rho_i)/sqrt2 in rho_rpi + // put (rho_r - rho_i)/sqrt2 in rho_rmi + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho) + xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho) + rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho) + rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho) + + // divide by sqrt(2) + rho_rpi = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_2); + rho_rmi = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_2); + rho_rpi = _mm_slli_epi16(rho_rpi,1); + rho_rmi = _mm_slli_epi16(rho_rmi,1); + + // Compute LLR for first bit of stream 0 + + // Compute real and imaginary parts of MF output for stream 0 + xmm0 = stream0_128i_in[i]; + xmm1 = stream0_128i_in[i+1]; + + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] + y0i = _mm_unpackhi_epi64(xmm0,xmm1); + + // divide by sqrt(2) + y0r_over2 = _mm_mulhi_epi16(y0r, ONE_OVER_SQRT_2); + y0i_over2 = _mm_mulhi_epi16(y0i, ONE_OVER_SQRT_2); + y0r_over2 = _mm_slli_epi16(y0r,1); + y0i_over2 = _mm_slli_epi16(y0i,1); + + y0_p_1_1 = _mm_adds_epi16(y0r_over2, y0i_over2); + y0_m_1_1 = _mm_subs_epi16(y0r_over2, y0i_over2); + + // Compute real and imaginary parts of MF output for stream 1 + xmm0 = stream1_128i_in[i]; + xmm1 = stream1_128i_in[i+1]; + + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] + y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)] + + xmm0 = _mm_setzero_si128(); // ZERO + + // compute psi + xmm3 = _mm_subs_epi16(y1r,rho_rpi); + psi_r_p1_p1 = _mm_abs_epi16(xmm3); + xmm3 = _mm_subs_epi16(y1i,rho_rmi); + psi_i_p1_p1 = _mm_abs_epi16(xmm3); + xmm3 = _mm_subs_epi16(y1r,rho_rmi); + psi_r_p1_m1 = _mm_abs_epi16(xmm3); + xmm3 = _mm_adds_epi16(y1i,rho_rpi); + psi_i_p1_m1 = _mm_abs_epi16(xmm3); + xmm3 = _mm_adds_epi16(y1r,rho_rmi); + psi_r_m1_p1 = _mm_abs_epi16(xmm3); + xmm3 = _mm_subs_epi16(y1i,rho_rpi); + psi_i_m1_p1 = _mm_abs_epi16(xmm3); + xmm3 = _mm_adds_epi16(y1r,rho_rpi); + psi_r_m1_m1 = _mm_abs_epi16(xmm3); + xmm3 = _mm_adds_epi16(y1i,rho_rmi); + psi_i_m1_m1 = _mm_abs_epi16(xmm3); + + // Rearrange interfering channel magnitudes + xmm2 = ch_mag_128i_i[i]; + xmm3 = ch_mag_128i_i[i+1]; + + xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + + ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3); + ch_mag_int_with_sigma2 = _mm_srai_epi16(ch_mag_int, 1); // *2 + two_ch_mag_int_with_sigma2 = ch_mag_int; // *4 + three_ch_mag_int_with_sigma2 = _mm_adds_epi16(ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2); // *6 + + interference_abs_64qam_epi16(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(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(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(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(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(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(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(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); + + // prodsum + prodsum_psi_a_epi16(psi_r_p1_p1, a_r_p1_p1, psi_i_p1_p1, a_i_p1_p1, psi_a_p1_p1); + prodsum_psi_a_epi16(psi_r_p1_m1, a_r_p1_m1, psi_i_p1_m1, a_i_p1_m1, psi_a_p1_m1); + prodsum_psi_a_epi16(psi_r_m1_p1, a_r_m1_p1, psi_i_m1_p1, a_i_m1_p1, psi_a_m1_p1); + prodsum_psi_a_epi16(psi_r_m1_m1, a_r_m1_m1, psi_i_m1_m1, a_i_m1_m1, psi_a_m1_m1); + + // Multiply by sqrt(2) + psi_a_p1_p1 = _mm_mulhi_epi16(psi_a_p1_p1, ONE_OVER_SQRT_2); + psi_a_p1_p1 = _mm_slli_epi16(psi_a_p1_p1, 2); + psi_a_p1_m1 = _mm_mulhi_epi16(psi_a_p1_m1, ONE_OVER_SQRT_2); + psi_a_p1_m1 = _mm_slli_epi16(psi_a_p1_m1, 2); + psi_a_m1_p1 = _mm_mulhi_epi16(psi_a_m1_p1, ONE_OVER_SQRT_2); + psi_a_m1_p1 = _mm_slli_epi16(psi_a_m1_p1, 2); + psi_a_m1_m1 = _mm_mulhi_epi16(psi_a_m1_m1, ONE_OVER_SQRT_2); + psi_a_m1_m1 = _mm_slli_epi16(psi_a_m1_m1, 2); + + square_a_64qam_epi16(a_r_p1_p1, a_i_p1_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p1); + square_a_64qam_epi16(a_r_p1_m1, a_i_p1_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m1); + square_a_64qam_epi16(a_r_m1_p1, a_i_m1_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p1); + square_a_64qam_epi16(a_r_m1_m1, a_i_m1_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m1); + + // Computing Metrics + xmm0 = _mm_subs_epi16(psi_a_p1_p1, a_sq_p1_p1); + bit_met_p1_p1 = _mm_adds_epi16(xmm0, y0_p_1_1); + + xmm0 = _mm_subs_epi16(psi_a_p1_m1, a_sq_p1_m1); + bit_met_p1_m1 = _mm_adds_epi16(xmm0, y0_m_1_1); + + xmm0 = _mm_subs_epi16(psi_a_m1_p1, a_sq_m1_p1); + bit_met_m1_p1 = _mm_subs_epi16(xmm0, y0_m_1_1); + + xmm0 = _mm_subs_epi16(psi_a_m1_m1, a_sq_m1_m1); + bit_met_m1_m1 = _mm_subs_epi16(xmm0, y0_p_1_1); + + // MSB + logmax_num_re0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_m1); // bit=0 + logmax_den_re0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_m1); // bit=1 + + y0r = _mm_subs_epi16(logmax_num_re0,logmax_den_re0); + + // LSB + logmax_num_im0 = _mm_max_epi16(bit_met_p1_p1,bit_met_m1_p1); // bit=0 + logmax_den_im0 = _mm_max_epi16(bit_met_p1_m1,bit_met_m1_m1); // bit=1 + + y0i = _mm_subs_epi16(logmax_num_im0,logmax_den_im0); + + stream0_128i_out[i] = _mm_unpacklo_epi16(y0r,y0i); // = [L1(1), L2(1), L1(2), L2(2)] + + if (i<((length>>1) - 1)) // false if only 2 REs remain + stream0_128i_out[i+1] = _mm_unpackhi_epi16(y0r,y0i); + +#elif defined(__arm__) + +#endif + } + +#if defined(__x86_64__) || defined(__i386__) + _mm_empty(); + _m_empty(); +#endif +} + + +//---------------------------------------------------------------------------------------------- +// 16-QAM +//---------------------------------------------------------------------------------------------- + +/* +__m128i ONE_OVER_TWO_SQRT_10 __attribute__((aligned(16))); +__m128i NINE_OVER_TWO_SQRT_10 __attribute__((aligned(16))); + +__m128i y0r_over_sqrt10 __attribute__ ((aligned(16))); +__m128i y0i_over_sqrt10 __attribute__ ((aligned(16))); +__m128i y0r_three_over_sqrt10 __attribute__ ((aligned(16))); +__m128i y0i_three_over_sqrt10 __attribute__ ((aligned(16))); + +__m128i ch_mag_des __attribute__((aligned(16))); +__m128i ch_mag_over_10 __attribute__ ((aligned(16))); +__m128i ch_mag_over_2 __attribute__ ((aligned(16))); +__m128i ch_mag_9_over_10 __attribute__ ((aligned(16))); +*/ + +void qam16_qpsk(short *stream0_in, + short *stream1_in, + short *ch_mag, + short *stream0_out, + short *rho01, + int length + ) +{ + + /* + Author: Sebastian Wagner + Date: 2012-06-04 + + Input: + stream0_in: MF filter for 1st stream, i.e., y0=h0'*y + stream!_in: MF filter for 2nd stream, i.e., y1=h1'*y + ch_mag: 2*h0/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc + ch_mag_i: 2*h1/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc + rho01: Channel cross correlation, i.e., h1'*h0 + + Output: + stream0_out: output LLRs for 1st stream + */ + +#if defined(__x86_64__) || defined(__i386__) + __m128i *rho01_128i = (__m128i *)rho01; + __m128i *stream0_128i_in = (__m128i *)stream0_in; + __m128i *stream1_128i_in = (__m128i *)stream1_in; + __m128i *stream0_128i_out = (__m128i *)stream0_out; + __m128i *ch_mag_128i = (__m128i *)ch_mag; + __m128i ONE_OVER_SQRT_2 = _mm_set1_epi16(23170); // round(1/sqrt(2)*2^15) + __m128i ONE_OVER_SQRT_10 = _mm_set1_epi16(20724); // round(1/sqrt(10)*2^16) + __m128i THREE_OVER_SQRT_10 = _mm_set1_epi16(31086); // round(3/sqrt(10)*2^15) + __m128i SQRT_10_OVER_FOUR = _mm_set1_epi16(25905); // round(sqrt(10)/4*2^15) + __m128i ONE_OVER_TWO_SQRT_10 = _mm_set1_epi16(10362); // round(1/2/sqrt(10)*2^16) + __m128i NINE_OVER_TWO_SQRT_10 = _mm_set1_epi16(23315); // round(9/2/sqrt(10)*2^14) + __m128i y0r_over_sqrt10; + __m128i y0i_over_sqrt10; + __m128i y0r_three_over_sqrt10; + __m128i y0i_three_over_sqrt10; + + __m128i ch_mag_des; + __m128i ch_mag_over_10; + __m128i ch_mag_over_2; + __m128i ch_mag_9_over_10; +#elif defined(__arm__) + +#endif + + int i; + + + for (i=0; i>2; i+=2) { + // In one iteration, we deal with 8 REs + +#if defined(__x86_64__) || defined(__i386__) + // Get rho + xmm0 = rho01_128i[i]; + xmm1 = rho01_128i[i+1]; + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho) + xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho) + rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho) + rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho) + + // Compute the different rhos + rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi,ONE_OVER_SQRT_10); + rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi,ONE_OVER_SQRT_10); + rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi,THREE_OVER_SQRT_10); + rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi,THREE_OVER_SQRT_10); + rho_rpi_3_3 = _mm_slli_epi16(rho_rpi_3_3,1); + rho_rmi_3_3 = _mm_slli_epi16(rho_rmi_3_3,1); + + xmm4 = _mm_mulhi_epi16(xmm2,ONE_OVER_SQRT_10); // Re(rho) + xmm5 = _mm_mulhi_epi16(xmm3,THREE_OVER_SQRT_10); // Im(rho) + xmm5 = _mm_slli_epi16(xmm5,1); + + rho_rpi_1_3 = _mm_adds_epi16(xmm4,xmm5); + rho_rmi_1_3 = _mm_subs_epi16(xmm4,xmm5); + + xmm6 = _mm_mulhi_epi16(xmm2,THREE_OVER_SQRT_10); // Re(rho) + xmm7 = _mm_mulhi_epi16(xmm3,ONE_OVER_SQRT_10); // Im(rho) + xmm6 = _mm_slli_epi16(xmm6,1); + + rho_rpi_3_1 = _mm_adds_epi16(xmm6,xmm7); + rho_rmi_3_1 = _mm_subs_epi16(xmm6,xmm7); + + // Rearrange interfering MF output + xmm0 = stream1_128i_in[i]; + xmm1 = stream1_128i_in[i+1]; + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] + y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)] + + xmm0 = _mm_setzero_si128(); // ZERO + xmm2 = _mm_subs_epi16(rho_rpi_1_1,y1r); // = [Re(rho)+ Im(rho)]/sqrt(10) - y1r + psi_r_p1_p1 = _mm_abs_epi16(xmm2); // = |[Re(rho)+ Im(rho)]/sqrt(10) - y1r| + + xmm2= _mm_subs_epi16(rho_rmi_1_1,y1r); + psi_r_p1_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rmi_1_1,y1i); + psi_i_p1_p1 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rpi_1_3,y1r); + psi_r_p1_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rmi_1_3,y1r); + psi_r_p1_m3 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rmi_3_1,y1i); + psi_i_p1_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rpi_3_1,y1r); + psi_r_p3_p1 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rmi_3_1,y1r); + psi_r_p3_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rmi_1_3,y1i); + psi_i_p3_p1 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rpi_3_3,y1r); + psi_r_p3_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rmi_3_3,y1r); + psi_r_p3_m3 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rmi_3_3,y1i); + psi_i_p3_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rpi_1_1,y1i); + psi_i_m1_p1 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rpi_3_1,y1i); + psi_i_m1_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rpi_1_3,y1i); + psi_i_m3_p1 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rpi_3_3,y1i); + psi_i_m3_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_1_1,y1i); + psi_i_p1_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_3_1,y1i); + psi_i_p1_m3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_1_3,y1i); + psi_i_p3_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_3_3,y1i); + psi_i_p3_m3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_1_1,y1r); + psi_r_m1_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_1_3,y1r); + psi_r_m1_m3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_3_1,y1r); + psi_r_m3_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_3_3,y1r); + psi_r_m3_m3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1r,rho_rmi_1_1); + psi_r_m1_p1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1r,rho_rmi_1_3); + psi_r_m1_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1i,rho_rmi_1_1); + psi_i_m1_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1i,rho_rmi_3_1); + psi_i_m1_m3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1r,rho_rmi_3_1); + psi_r_m3_p1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1r,rho_rmi_3_3); + psi_r_m3_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1i,rho_rmi_1_3); + psi_i_m3_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1i,rho_rmi_3_3); + psi_i_m3_m3 = _mm_abs_epi16(xmm2); + + // Rearrange desired MF output + xmm0 = stream0_128i_in[i]; + xmm1 = stream0_128i_in[i+1]; + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] + y0i = _mm_unpackhi_epi64(xmm0,xmm1); + + // Rearrange desired channel magnitudes + xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10)) + xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10)) + xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + + ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3); // = [|h|^2(1),|h|^2(2),|h|^2(3),|h|^2(4)]*(2/sqrt(10)) + + // Scale MF output of desired signal + y0r_over_sqrt10 = _mm_mulhi_epi16(y0r,ONE_OVER_SQRT_10); + y0i_over_sqrt10 = _mm_mulhi_epi16(y0i,ONE_OVER_SQRT_10); + y0r_three_over_sqrt10 = _mm_mulhi_epi16(y0r,THREE_OVER_SQRT_10); + y0i_three_over_sqrt10 = _mm_mulhi_epi16(y0i,THREE_OVER_SQRT_10); + y0r_three_over_sqrt10 = _mm_slli_epi16(y0r_three_over_sqrt10,1); + y0i_three_over_sqrt10 = _mm_slli_epi16(y0i_three_over_sqrt10,1); + + // Compute necessary combination of required terms + y0_p_1_1 = _mm_adds_epi16(y0r_over_sqrt10,y0i_over_sqrt10); + y0_m_1_1 = _mm_subs_epi16(y0r_over_sqrt10,y0i_over_sqrt10); + + y0_p_1_3 = _mm_adds_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10); + y0_m_1_3 = _mm_subs_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10); + + y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10); + y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10); + + y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10); + y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10); + + // Add psi + psi_a_p1_p1 = _mm_adds_epi16(psi_r_p1_p1 ,psi_i_p1_p1); + psi_a_p1_p3 = _mm_adds_epi16(psi_r_p1_p3 ,psi_i_p1_p3); + psi_a_p3_p1 = _mm_adds_epi16(psi_r_p3_p1 ,psi_i_p3_p1); + psi_a_p3_p3 = _mm_adds_epi16(psi_r_p3_p3 ,psi_i_p3_p3); + psi_a_p1_m1 = _mm_adds_epi16(psi_r_p1_m1 ,psi_i_p1_m1); + psi_a_p1_m3 = _mm_adds_epi16(psi_r_p1_m3 ,psi_i_p1_m3); + psi_a_p3_m1 = _mm_adds_epi16(psi_r_p3_m1 ,psi_i_p3_m1); + psi_a_p3_m3 = _mm_adds_epi16(psi_r_p3_m3 ,psi_i_p3_m3); + psi_a_m1_p1 = _mm_adds_epi16(psi_r_m1_p1 ,psi_i_m1_p1); + psi_a_m1_p3 = _mm_adds_epi16(psi_r_m1_p3 ,psi_i_m1_p3); + psi_a_m3_p1 = _mm_adds_epi16(psi_r_m3_p1 ,psi_i_m3_p1); + psi_a_m3_p3 = _mm_adds_epi16(psi_r_m3_p3 ,psi_i_m3_p3); + psi_a_m1_m1 = _mm_adds_epi16(psi_r_m1_m1 ,psi_i_m1_m1); + psi_a_m1_m3 = _mm_adds_epi16(psi_r_m1_m3 ,psi_i_m1_m3); + psi_a_m3_m1 = _mm_adds_epi16(psi_r_m3_m1 ,psi_i_m3_m1); + psi_a_m3_m3 = _mm_adds_epi16(psi_r_m3_m3 ,psi_i_m3_m3); + + // scale by sqrt(2) + psi_a_p1_p1 = _mm_mulhi_epi16(psi_a_p1_p1,ONE_OVER_SQRT_2); + psi_a_p1_p1 = _mm_slli_epi16(psi_a_p1_p1,1); + psi_a_p1_p3 = _mm_mulhi_epi16(psi_a_p1_p3,ONE_OVER_SQRT_2); + psi_a_p1_p3 = _mm_slli_epi16(psi_a_p1_p3,1); + psi_a_p3_p1 = _mm_mulhi_epi16(psi_a_p3_p1,ONE_OVER_SQRT_2); + psi_a_p3_p1 = _mm_slli_epi16(psi_a_p3_p1,1); + psi_a_p3_p3 = _mm_mulhi_epi16(psi_a_p3_p3,ONE_OVER_SQRT_2); + psi_a_p3_p3 = _mm_slli_epi16(psi_a_p3_p3,1); + + psi_a_p1_m1 = _mm_mulhi_epi16(psi_a_p1_m1,ONE_OVER_SQRT_2); + psi_a_p1_m1 = _mm_slli_epi16(psi_a_p1_m1,1); + psi_a_p1_m3 = _mm_mulhi_epi16(psi_a_p1_m3,ONE_OVER_SQRT_2); + psi_a_p1_m3 = _mm_slli_epi16(psi_a_p1_m3,1); + psi_a_p3_m1 = _mm_mulhi_epi16(psi_a_p3_m1,ONE_OVER_SQRT_2); + psi_a_p3_m1 = _mm_slli_epi16(psi_a_p3_m1,1); + psi_a_p3_m3 = _mm_mulhi_epi16(psi_a_p3_m3,ONE_OVER_SQRT_2); + psi_a_p3_m3 = _mm_slli_epi16(psi_a_p3_m3,1); + + psi_a_m1_p1 = _mm_mulhi_epi16(psi_a_m1_p1,ONE_OVER_SQRT_2); + psi_a_m1_p1 = _mm_slli_epi16(psi_a_m1_p1,1); + psi_a_m1_p3 = _mm_mulhi_epi16(psi_a_m1_p3,ONE_OVER_SQRT_2); + psi_a_m1_p3 = _mm_slli_epi16(psi_a_m1_p3,1); + psi_a_m3_p1 = _mm_mulhi_epi16(psi_a_m3_p1,ONE_OVER_SQRT_2); + psi_a_m3_p1 = _mm_slli_epi16(psi_a_m3_p1,1); + psi_a_m3_p3 = _mm_mulhi_epi16(psi_a_m3_p3,ONE_OVER_SQRT_2); + psi_a_m3_p3 = _mm_slli_epi16(psi_a_m3_p3,1); + + psi_a_m1_m1 = _mm_mulhi_epi16(psi_a_m1_m1,ONE_OVER_SQRT_2); + psi_a_m1_m1 = _mm_slli_epi16(psi_a_m1_m1,1); + psi_a_m1_m3 = _mm_mulhi_epi16(psi_a_m1_m3,ONE_OVER_SQRT_2); + psi_a_m1_m3 = _mm_slli_epi16(psi_a_m1_m3,1); + psi_a_m3_m1 = _mm_mulhi_epi16(psi_a_m3_m1,ONE_OVER_SQRT_2); + psi_a_m3_m1 = _mm_slli_epi16(psi_a_m3_m1,1); + psi_a_m3_m3 = _mm_mulhi_epi16(psi_a_m3_m3,ONE_OVER_SQRT_2); + psi_a_m3_m3 = _mm_slli_epi16(psi_a_m3_m3,1); + + // Computing different multiples of channel norms + ch_mag_over_10=_mm_mulhi_epi16(ch_mag_des, ONE_OVER_TWO_SQRT_10); + ch_mag_over_2=_mm_mulhi_epi16(ch_mag_des, SQRT_10_OVER_FOUR); + ch_mag_over_2=_mm_slli_epi16(ch_mag_over_2, 1); + ch_mag_9_over_10=_mm_mulhi_epi16(ch_mag_des, NINE_OVER_TWO_SQRT_10); + ch_mag_9_over_10=_mm_slli_epi16(ch_mag_9_over_10, 2); + + // Computing Metrics + xmm1 = _mm_adds_epi16(psi_a_p1_p1, y0_p_1_1); + bit_met_p1_p1= _mm_subs_epi16(xmm1, ch_mag_over_10); + + xmm1 = _mm_adds_epi16(psi_a_p1_p3, y0_p_1_3); + bit_met_p1_p3= _mm_subs_epi16(xmm1, ch_mag_over_2); + + xmm1 = _mm_adds_epi16(psi_a_p1_m1, y0_m_1_1); + bit_met_p1_m1= _mm_subs_epi16(xmm1, ch_mag_over_10); + + xmm1 = _mm_adds_epi16(psi_a_p1_m3, y0_m_1_3); + bit_met_p1_m3= _mm_subs_epi16(xmm1, ch_mag_over_2); + + xmm1 = _mm_adds_epi16(psi_a_p3_p1, y0_p_3_1); + bit_met_p3_p1= _mm_subs_epi16(xmm1, ch_mag_over_2); + + xmm1 = _mm_adds_epi16(psi_a_p3_p3, y0_p_3_3); + bit_met_p3_p3= _mm_subs_epi16(xmm1, ch_mag_9_over_10); + + xmm1 = _mm_adds_epi16(psi_a_p3_m1, y0_m_3_1); + bit_met_p3_m1= _mm_subs_epi16(xmm1, ch_mag_over_2); + + xmm1 = _mm_adds_epi16(psi_a_p3_m3, y0_m_3_3); + bit_met_p3_m3= _mm_subs_epi16(xmm1, ch_mag_9_over_10); + + xmm1 = _mm_subs_epi16(psi_a_m1_p1, y0_m_1_1); + bit_met_m1_p1= _mm_subs_epi16(xmm1, ch_mag_over_10); + + xmm1 = _mm_subs_epi16(psi_a_m1_p3, y0_m_1_3); + bit_met_m1_p3= _mm_subs_epi16(xmm1, ch_mag_over_2); + + xmm1 = _mm_subs_epi16(psi_a_m1_m1, y0_p_1_1); + bit_met_m1_m1= _mm_subs_epi16(xmm1, ch_mag_over_10); + + xmm1 = _mm_subs_epi16(psi_a_m1_m3, y0_p_1_3); + bit_met_m1_m3= _mm_subs_epi16(xmm1, ch_mag_over_2); + + xmm1 = _mm_subs_epi16(psi_a_m3_p1, y0_m_3_1); + bit_met_m3_p1= _mm_subs_epi16(xmm1, ch_mag_over_2); + + xmm1 = _mm_subs_epi16(psi_a_m3_p3, y0_m_3_3); + bit_met_m3_p3= _mm_subs_epi16(xmm1, ch_mag_9_over_10); + + xmm1 = _mm_subs_epi16(psi_a_m3_m1, y0_p_3_1); + bit_met_m3_m1= _mm_subs_epi16(xmm1, ch_mag_over_2); + + xmm1 = _mm_subs_epi16(psi_a_m3_m3, y0_p_3_3); + bit_met_m3_m3= _mm_subs_epi16(xmm1, ch_mag_9_over_10); + + // LLR of the first bit + // Bit = 1 + xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3); + xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3); + xmm2 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3); + xmm3 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_num_re0= _mm_max_epi16(xmm4,xmm5); + + // Bit = 0 + xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3); + xmm1 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3); + xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3); + xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_den_re0 = _mm_max_epi16(xmm4,xmm5); + + // LLR of first bit [L1(1), L1(2), L1(3), L1(4), L1(5), L1(6), L1(7), L1(8)] + y0r = _mm_subs_epi16(logmax_den_re0,logmax_num_re0); + + // LLR of the second bit + // Bit = 1 + xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1); + xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1); + xmm2 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3); + xmm3 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_num_re1 = _mm_max_epi16(xmm4,xmm5); + + // Bit = 0 + xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1); + xmm1 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1); + xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3); + xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_den_re1 = _mm_max_epi16(xmm4,xmm5); + + // LLR of second bit [L2(1), L2(2), L2(3), L2(4)] + y1r = _mm_subs_epi16(logmax_den_re1,logmax_num_re1); + + // LLR of the third bit + // Bit = 1 + xmm0 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3); + xmm1 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3); + xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3); + xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_num_im0 = _mm_max_epi16(xmm4,xmm5); + + // Bit = 0 + xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3); + xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3); + xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3); + xmm3 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_den_im0 = _mm_max_epi16(xmm4,xmm5); + + // LLR of third bit [L3(1), L3(2), L3(3), L3(4)] + y0i = _mm_subs_epi16(logmax_den_im0,logmax_num_im0); + + // LLR of the fourth bit + // Bit = 1 + xmm0 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3); + xmm1 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3); + xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3); + xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_num_im1 = _mm_max_epi16(xmm4,xmm5); + + // Bit = 0 + xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1); + xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1); + xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1); + xmm3 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_den_im1 = _mm_max_epi16(xmm4,xmm5); + + // LLR of fourth bit [L4(1), L4(2), L4(3), L4(4)] + y1i = _mm_subs_epi16(logmax_den_im1,logmax_num_im1); + + // Pack LLRs in output + // [L1(1), L2(1), L1(2), L2(2), L1(3), L2(3), L1(4), L2(4)] + xmm0 = _mm_unpacklo_epi16(y0r,y1r); + // [L1(5), L2(5), L1(6), L2(6), L1(7), L2(7), L1(8), L2(8)] + xmm1 = _mm_unpackhi_epi16(y0r,y1r); + // [L3(1), L4(1), L3(2), L4(2), L3(3), L4(3), L3(4), L4(4)] + xmm2 = _mm_unpacklo_epi16(y0i,y1i); + // [L3(5), L4(5), L3(6), L4(6), L3(7), L4(7), L3(8), L4(8)] + xmm3 = _mm_unpackhi_epi16(y0i,y1i); + + stream0_128i_out[2*i+0] = _mm_unpacklo_epi32(xmm0,xmm2); // 8LLRs, 2REs + stream0_128i_out[2*i+1] = _mm_unpackhi_epi32(xmm0,xmm2); + stream0_128i_out[2*i+2] = _mm_unpacklo_epi32(xmm1,xmm3); + stream0_128i_out[2*i+3] = _mm_unpackhi_epi32(xmm1,xmm3); + +#elif defined(__arm__) + +#endif + } + +#if defined(__x86_64__) || defined(__i386__) + _mm_empty(); + _m_empty(); +#endif + +} + +int nr_dlsch_16qam_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, + int32_t **rxdataF_comp, + int32_t **rxdataF_comp_i, + int32_t **dl_ch_mag, //|h_0|^2*(2/sqrt{10}) + int32_t **rho_i, + int16_t *dlsch_llr, + uint8_t symbol, + uint8_t first_symbol_flag, + uint16_t nb_rb, + uint16_t pbch_pss_sss_adjust, + int16_t **llr16p) +{ + + int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *llr16; + int len; + uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; + + // first symbol has different structure due to more pilots + if (first_symbol_flag == 1) { + llr16 = (int16_t*)dlsch_llr; + } else { + llr16 = (int16_t*)(*llr16p); + } + + AssertFatal(llr16!=NULL,"nr_dlsch_16qam_qpsk_llr: llr is null, symbol %d\n",symbol); + + if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { + // if symbol has pilots + if (frame_parms->nb_antenna_ports_eNB!=1) + // in 2 antenna ports we have 8 REs per symbol per RB + len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); + else + // for 1 antenna port we have 10 REs per symbol per RB + len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); + } else { + // symbol has no pilots + len = (nb_rb*12) - pbch_pss_sss_adjust; + } + + // printf("symbol %d: qam16_llr, len %d (llr16 %p)\n",symbol,len,llr16); + + qam16_qpsk((short *)rxF, + (short *)rxF_i, + (short *)ch_mag, + (short *)llr16, + (short *)rho, + len); + + llr16 += (len<<2); + *llr16p = (short *)llr16; + + return(0); +} + +void qam16_qam16(short *stream0_in, + short *stream1_in, + short *ch_mag, + short *ch_mag_i, + short *stream0_out, + short *rho01, + int length + ) +{ + + /* + Author: Sebastian Wagner + Date: 2012-06-04 + + Input: + stream0_in: MF filter for 1st stream, i.e., y0=h0'*y + stream!_in: MF filter for 2nd stream, i.e., y1=h1'*y + ch_mag: 2*h0/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc + ch_mag_i: 2*h1/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc + rho01: Channel cross correlation, i.e., h1'*h0 + + Output: + stream0_out: output LLRs for 1st stream + */ +#if defined(__x86_64__) || defined(__i386__) + __m128i *rho01_128i = (__m128i *)rho01; + __m128i *stream0_128i_in = (__m128i *)stream0_in; + __m128i *stream1_128i_in = (__m128i *)stream1_in; + __m128i *stream0_128i_out = (__m128i *)stream0_out; + __m128i *ch_mag_128i = (__m128i *)ch_mag; + __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i; + + + + __m128i ONE_OVER_SQRT_10 = _mm_set1_epi16(20724); // round(1/sqrt(10)*2^16) + __m128i ONE_OVER_SQRT_10_Q15 = _mm_set1_epi16(10362); // round(1/sqrt(10)*2^15) + __m128i THREE_OVER_SQRT_10 = _mm_set1_epi16(31086); // round(3/sqrt(10)*2^15) + __m128i SQRT_10_OVER_FOUR = _mm_set1_epi16(25905); // round(sqrt(10)/4*2^15) + __m128i ONE_OVER_TWO_SQRT_10 = _mm_set1_epi16(10362); // round(1/2/sqrt(10)*2^16) + __m128i NINE_OVER_TWO_SQRT_10 = _mm_set1_epi16(23315); // round(9/2/sqrt(10)*2^14) + __m128i ch_mag_des,ch_mag_int; + __m128i y0r_over_sqrt10; + __m128i y0i_over_sqrt10; + __m128i y0r_three_over_sqrt10; + __m128i y0i_three_over_sqrt10; + __m128i ch_mag_over_10; + __m128i ch_mag_over_2; + __m128i ch_mag_9_over_10; +#elif defined(__arm__) + +#endif + + int i; + + for (i=0; i>2; i+=2) { + // In one iteration, we deal with 8 REs + +#if defined(__x86_64__) || defined(__i386__) + // Get rho + xmm0 = rho01_128i[i]; + xmm1 = rho01_128i[i+1]; + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho) + xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho) + rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho) + rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho) + + // Compute the different rhos + rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi,ONE_OVER_SQRT_10); + rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi,ONE_OVER_SQRT_10); + rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi,THREE_OVER_SQRT_10); + rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi,THREE_OVER_SQRT_10); + rho_rpi_3_3 = _mm_slli_epi16(rho_rpi_3_3,1); + rho_rmi_3_3 = _mm_slli_epi16(rho_rmi_3_3,1); + + xmm4 = _mm_mulhi_epi16(xmm2,ONE_OVER_SQRT_10); // Re(rho) + xmm5 = _mm_mulhi_epi16(xmm3,THREE_OVER_SQRT_10); // Im(rho) + xmm5 = _mm_slli_epi16(xmm5,1); + + rho_rpi_1_3 = _mm_adds_epi16(xmm4,xmm5); + rho_rmi_1_3 = _mm_subs_epi16(xmm4,xmm5); + + xmm6 = _mm_mulhi_epi16(xmm2,THREE_OVER_SQRT_10); // Re(rho) + xmm7 = _mm_mulhi_epi16(xmm3,ONE_OVER_SQRT_10); // Im(rho) + xmm6 = _mm_slli_epi16(xmm6,1); + + rho_rpi_3_1 = _mm_adds_epi16(xmm6,xmm7); + rho_rmi_3_1 = _mm_subs_epi16(xmm6,xmm7); + + // Rearrange interfering MF output + xmm0 = stream1_128i_in[i]; + xmm1 = stream1_128i_in[i+1]; + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] + y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)] + + xmm0 = _mm_setzero_si128(); // ZERO + xmm2 = _mm_subs_epi16(rho_rpi_1_1,y1r); // = [Re(rho)+ Im(rho)]/sqrt(10) - y1r + psi_r_p1_p1 = _mm_abs_epi16(xmm2); // = |[Re(rho)+ Im(rho)]/sqrt(10) - y1r| + + xmm2= _mm_subs_epi16(rho_rmi_1_1,y1r); + psi_r_p1_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rmi_1_1,y1i); + psi_i_p1_p1 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rpi_1_3,y1r); + psi_r_p1_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rmi_1_3,y1r); + psi_r_p1_m3 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rmi_3_1,y1i); + psi_i_p1_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rpi_3_1,y1r); + psi_r_p3_p1 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rmi_3_1,y1r); + psi_r_p3_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rmi_1_3,y1i); + psi_i_p3_p1 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rpi_3_3,y1r); + psi_r_p3_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rmi_3_3,y1r); + psi_r_p3_m3 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rmi_3_3,y1i); + psi_i_p3_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rpi_1_1,y1i); + psi_i_m1_p1 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rpi_3_1,y1i); + psi_i_m1_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rpi_1_3,y1i); + psi_i_m3_p1 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rpi_3_3,y1i); + psi_i_m3_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_1_1,y1i); + psi_i_p1_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_3_1,y1i); + psi_i_p1_m3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_1_3,y1i); + psi_i_p3_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_3_3,y1i); + psi_i_p3_m3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_1_1,y1r); + psi_r_m1_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_1_3,y1r); + psi_r_m1_m3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_3_1,y1r); + psi_r_m3_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_3_3,y1r); + psi_r_m3_m3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1r,rho_rmi_1_1); + psi_r_m1_p1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1r,rho_rmi_1_3); + psi_r_m1_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1i,rho_rmi_1_1); + psi_i_m1_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1i,rho_rmi_3_1); + psi_i_m1_m3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1r,rho_rmi_3_1); + psi_r_m3_p1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1r,rho_rmi_3_3); + psi_r_m3_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1i,rho_rmi_1_3); + psi_i_m3_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1i,rho_rmi_3_3); + psi_i_m3_m3 = _mm_abs_epi16(xmm2); + + // Rearrange desired MF output + xmm0 = stream0_128i_in[i]; + xmm1 = stream0_128i_in[i+1]; + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] + y0i = _mm_unpackhi_epi64(xmm0,xmm1); + + // Rearrange desired channel magnitudes + xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10)) + xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10)) + xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + + ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3); // = [|h|^2(1),|h|^2(2),|h|^2(3),|h|^2(4)]*(2/sqrt(10)) + + // Rearrange interfering channel magnitudes + xmm2 = ch_mag_128i_i[i]; + xmm3 = ch_mag_128i_i[i+1]; + + xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + + ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3); + + // Scale MF output of desired signal + y0r_over_sqrt10 = _mm_mulhi_epi16(y0r,ONE_OVER_SQRT_10); + y0i_over_sqrt10 = _mm_mulhi_epi16(y0i,ONE_OVER_SQRT_10); + y0r_three_over_sqrt10 = _mm_mulhi_epi16(y0r,THREE_OVER_SQRT_10); + y0i_three_over_sqrt10 = _mm_mulhi_epi16(y0i,THREE_OVER_SQRT_10); + y0r_three_over_sqrt10 = _mm_slli_epi16(y0r_three_over_sqrt10,1); + y0i_three_over_sqrt10 = _mm_slli_epi16(y0i_three_over_sqrt10,1); + + // Compute necessary combination of required terms + y0_p_1_1 = _mm_adds_epi16(y0r_over_sqrt10,y0i_over_sqrt10); + y0_m_1_1 = _mm_subs_epi16(y0r_over_sqrt10,y0i_over_sqrt10); + + y0_p_1_3 = _mm_adds_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10); + y0_m_1_3 = _mm_subs_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10); + + y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10); + y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10); + + y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10); + y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10); + + // Compute optimal interfering symbol magnitude + interference_abs_epi16(psi_r_p1_p1 ,ch_mag_int,a_r_p1_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p1_p1 ,ch_mag_int,a_i_p1_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p1_p3 ,ch_mag_int,a_r_p1_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p1_p3 ,ch_mag_int,a_i_p1_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p1_m1 ,ch_mag_int,a_r_p1_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p1_m1 ,ch_mag_int,a_i_p1_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p1_m3 ,ch_mag_int,a_r_p1_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p1_m3 ,ch_mag_int,a_i_p1_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p3_p1 ,ch_mag_int,a_r_p3_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p3_p1 ,ch_mag_int,a_i_p3_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p3_p3 ,ch_mag_int,a_r_p3_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p3_p3 ,ch_mag_int,a_i_p3_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p3_m1 ,ch_mag_int,a_r_p3_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p3_m1 ,ch_mag_int,a_i_p3_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p3_m3 ,ch_mag_int,a_r_p3_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p3_m3 ,ch_mag_int,a_i_p3_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m1_p1 ,ch_mag_int,a_r_m1_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m1_p1 ,ch_mag_int,a_i_m1_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m1_p3 ,ch_mag_int,a_r_m1_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m1_p3 ,ch_mag_int,a_i_m1_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m1_m1 ,ch_mag_int,a_r_m1_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m1_m1 ,ch_mag_int,a_i_m1_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m1_m3 ,ch_mag_int,a_r_m1_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m1_m3 ,ch_mag_int,a_i_m1_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m3_p1 ,ch_mag_int,a_r_m3_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m3_p1 ,ch_mag_int,a_i_m3_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m3_p3 ,ch_mag_int,a_r_m3_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m3_p3 ,ch_mag_int,a_i_m3_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m3_m1 ,ch_mag_int,a_r_m3_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m3_m1 ,ch_mag_int,a_i_m3_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m3_m3 ,ch_mag_int,a_r_m3_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m3_m3 ,ch_mag_int,a_i_m3_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + + // Calculation of groups of two terms in the bit metric involving product of psi and interference magnitude + prodsum_psi_a_epi16(psi_r_p1_p1,a_r_p1_p1,psi_i_p1_p1,a_i_p1_p1,psi_a_p1_p1); + prodsum_psi_a_epi16(psi_r_p1_p3,a_r_p1_p3,psi_i_p1_p3,a_i_p1_p3,psi_a_p1_p3); + prodsum_psi_a_epi16(psi_r_p3_p1,a_r_p3_p1,psi_i_p3_p1,a_i_p3_p1,psi_a_p3_p1); + prodsum_psi_a_epi16(psi_r_p3_p3,a_r_p3_p3,psi_i_p3_p3,a_i_p3_p3,psi_a_p3_p3); + prodsum_psi_a_epi16(psi_r_p1_m1,a_r_p1_m1,psi_i_p1_m1,a_i_p1_m1,psi_a_p1_m1); + prodsum_psi_a_epi16(psi_r_p1_m3,a_r_p1_m3,psi_i_p1_m3,a_i_p1_m3,psi_a_p1_m3); + prodsum_psi_a_epi16(psi_r_p3_m1,a_r_p3_m1,psi_i_p3_m1,a_i_p3_m1,psi_a_p3_m1); + prodsum_psi_a_epi16(psi_r_p3_m3,a_r_p3_m3,psi_i_p3_m3,a_i_p3_m3,psi_a_p3_m3); + prodsum_psi_a_epi16(psi_r_m1_p1,a_r_m1_p1,psi_i_m1_p1,a_i_m1_p1,psi_a_m1_p1); + prodsum_psi_a_epi16(psi_r_m1_p3,a_r_m1_p3,psi_i_m1_p3,a_i_m1_p3,psi_a_m1_p3); + prodsum_psi_a_epi16(psi_r_m3_p1,a_r_m3_p1,psi_i_m3_p1,a_i_m3_p1,psi_a_m3_p1); + prodsum_psi_a_epi16(psi_r_m3_p3,a_r_m3_p3,psi_i_m3_p3,a_i_m3_p3,psi_a_m3_p3); + prodsum_psi_a_epi16(psi_r_m1_m1,a_r_m1_m1,psi_i_m1_m1,a_i_m1_m1,psi_a_m1_m1); + prodsum_psi_a_epi16(psi_r_m1_m3,a_r_m1_m3,psi_i_m1_m3,a_i_m1_m3,psi_a_m1_m3); + prodsum_psi_a_epi16(psi_r_m3_m1,a_r_m3_m1,psi_i_m3_m1,a_i_m3_m1,psi_a_m3_m1); + prodsum_psi_a_epi16(psi_r_m3_m3,a_r_m3_m3,psi_i_m3_m3,a_i_m3_m3,psi_a_m3_m3); + + + // squared interference magnitude times int. ch. power + square_a_epi16(a_r_p1_p1,a_i_p1_p1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p1_p1); + square_a_epi16(a_r_p1_p3,a_i_p1_p3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p1_p3); + square_a_epi16(a_r_p3_p1,a_i_p3_p1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p3_p1); + square_a_epi16(a_r_p3_p3,a_i_p3_p3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p3_p3); + square_a_epi16(a_r_p1_m1,a_i_p1_m1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p1_m1); + square_a_epi16(a_r_p1_m3,a_i_p1_m3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p1_m3); + square_a_epi16(a_r_p3_m1,a_i_p3_m1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p3_m1); + square_a_epi16(a_r_p3_m3,a_i_p3_m3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p3_m3); + square_a_epi16(a_r_m1_p1,a_i_m1_p1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m1_p1); + square_a_epi16(a_r_m1_p3,a_i_m1_p3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m1_p3); + square_a_epi16(a_r_m3_p1,a_i_m3_p1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m3_p1); + square_a_epi16(a_r_m3_p3,a_i_m3_p3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m3_p3); + square_a_epi16(a_r_m1_m1,a_i_m1_m1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m1_m1); + square_a_epi16(a_r_m1_m3,a_i_m1_m3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m1_m3); + square_a_epi16(a_r_m3_m1,a_i_m3_m1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m3_m1); + square_a_epi16(a_r_m3_m3,a_i_m3_m3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m3_m3); + + // Computing different multiples of channel norms + ch_mag_over_10=_mm_mulhi_epi16(ch_mag_des, ONE_OVER_TWO_SQRT_10); + ch_mag_over_2=_mm_mulhi_epi16(ch_mag_des, SQRT_10_OVER_FOUR); + ch_mag_over_2=_mm_slli_epi16(ch_mag_over_2, 1); + ch_mag_9_over_10=_mm_mulhi_epi16(ch_mag_des, NINE_OVER_TWO_SQRT_10); + ch_mag_9_over_10=_mm_slli_epi16(ch_mag_9_over_10, 2); + + // Computing Metrics + xmm0 = _mm_subs_epi16(psi_a_p1_p1,a_sq_p1_p1); + xmm1 = _mm_adds_epi16(xmm0,y0_p_1_1); + bit_met_p1_p1= _mm_subs_epi16(xmm1,ch_mag_over_10); + + xmm0 = _mm_subs_epi16(psi_a_p1_p3,a_sq_p1_p3); + xmm1 = _mm_adds_epi16(xmm0,y0_p_1_3); + bit_met_p1_p3= _mm_subs_epi16(xmm1,ch_mag_over_2); + + xmm0 = _mm_subs_epi16(psi_a_p1_m1,a_sq_p1_m1); + xmm1 = _mm_adds_epi16(xmm0,y0_m_1_1); + bit_met_p1_m1= _mm_subs_epi16(xmm1,ch_mag_over_10); + + xmm0 = _mm_subs_epi16(psi_a_p1_m3,a_sq_p1_m3); + xmm1 = _mm_adds_epi16(xmm0,y0_m_1_3); + bit_met_p1_m3= _mm_subs_epi16(xmm1,ch_mag_over_2); + + xmm0 = _mm_subs_epi16(psi_a_p3_p1,a_sq_p3_p1); + xmm1 = _mm_adds_epi16(xmm0,y0_p_3_1); + bit_met_p3_p1= _mm_subs_epi16(xmm1,ch_mag_over_2); + + xmm0 = _mm_subs_epi16(psi_a_p3_p3,a_sq_p3_p3); + xmm1 = _mm_adds_epi16(xmm0,y0_p_3_3); + bit_met_p3_p3= _mm_subs_epi16(xmm1,ch_mag_9_over_10); + + xmm0 = _mm_subs_epi16(psi_a_p3_m1,a_sq_p3_m1); + xmm1 = _mm_adds_epi16(xmm0,y0_m_3_1); + bit_met_p3_m1= _mm_subs_epi16(xmm1,ch_mag_over_2); + + xmm0 = _mm_subs_epi16(psi_a_p3_m3,a_sq_p3_m3); + xmm1 = _mm_adds_epi16(xmm0,y0_m_3_3); + bit_met_p3_m3= _mm_subs_epi16(xmm1,ch_mag_9_over_10); + + xmm0 = _mm_subs_epi16(psi_a_m1_p1,a_sq_m1_p1); + xmm1 = _mm_subs_epi16(xmm0,y0_m_1_1); + bit_met_m1_p1= _mm_subs_epi16(xmm1,ch_mag_over_10); + + xmm0 = _mm_subs_epi16(psi_a_m1_p3,a_sq_m1_p3); + xmm1 = _mm_subs_epi16(xmm0,y0_m_1_3); + bit_met_m1_p3= _mm_subs_epi16(xmm1,ch_mag_over_2); + + xmm0 = _mm_subs_epi16(psi_a_m1_m1,a_sq_m1_m1); + xmm1 = _mm_subs_epi16(xmm0,y0_p_1_1); + bit_met_m1_m1= _mm_subs_epi16(xmm1,ch_mag_over_10); + + xmm0 = _mm_subs_epi16(psi_a_m1_m3,a_sq_m1_m3); + xmm1 = _mm_subs_epi16(xmm0,y0_p_1_3); + bit_met_m1_m3= _mm_subs_epi16(xmm1,ch_mag_over_2); + + xmm0 = _mm_subs_epi16(psi_a_m3_p1,a_sq_m3_p1); + xmm1 = _mm_subs_epi16(xmm0,y0_m_3_1); + bit_met_m3_p1= _mm_subs_epi16(xmm1,ch_mag_over_2); + + xmm0 = _mm_subs_epi16(psi_a_m3_p3,a_sq_m3_p3); + xmm1 = _mm_subs_epi16(xmm0,y0_m_3_3); + bit_met_m3_p3= _mm_subs_epi16(xmm1,ch_mag_9_over_10); + + xmm0 = _mm_subs_epi16(psi_a_m3_m1,a_sq_m3_m1); + xmm1 = _mm_subs_epi16(xmm0,y0_p_3_1); + bit_met_m3_m1= _mm_subs_epi16(xmm1,ch_mag_over_2); + + xmm0 = _mm_subs_epi16(psi_a_m3_m3,a_sq_m3_m3); + xmm1 = _mm_subs_epi16(xmm0,y0_p_3_3); + bit_met_m3_m3= _mm_subs_epi16(xmm1,ch_mag_9_over_10); + + // LLR of the first bit + // Bit = 1 + xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3); + xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3); + xmm2 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3); + xmm3 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_num_re0= _mm_max_epi16(xmm4,xmm5); + + // Bit = 0 + xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3); + xmm1 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3); + xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3); + xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_den_re0 = _mm_max_epi16(xmm4,xmm5); + + // LLR of first bit [L1(1), L1(2), L1(3), L1(4), L1(5), L1(6), L1(7), L1(8)] + y0r = _mm_subs_epi16(logmax_den_re0,logmax_num_re0); + + // LLR of the second bit + // Bit = 1 + xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1); + xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1); + xmm2 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3); + xmm3 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_num_re1 = _mm_max_epi16(xmm4,xmm5); + + // Bit = 0 + xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1); + xmm1 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1); + xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3); + xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_den_re1 = _mm_max_epi16(xmm4,xmm5); + + // LLR of second bit [L2(1), L2(2), L2(3), L2(4)] + y1r = _mm_subs_epi16(logmax_den_re1,logmax_num_re1); + + // LLR of the third bit + // Bit = 1 + xmm0 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3); + xmm1 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3); + xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3); + xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_num_im0 = _mm_max_epi16(xmm4,xmm5); + + // Bit = 0 + xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3); + xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3); + xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3); + xmm3 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_den_im0 = _mm_max_epi16(xmm4,xmm5); + + // LLR of third bit [L3(1), L3(2), L3(3), L3(4)] + y0i = _mm_subs_epi16(logmax_den_im0,logmax_num_im0); + + // LLR of the fourth bit + // Bit = 1 + xmm0 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3); + xmm1 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3); + xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3); + xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_num_im1 = _mm_max_epi16(xmm4,xmm5); + + // Bit = 0 + xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1); + xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1); + xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1); + xmm3 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_den_im1 = _mm_max_epi16(xmm4,xmm5); + + // LLR of fourth bit [L4(1), L4(2), L4(3), L4(4)] + y1i = _mm_subs_epi16(logmax_den_im1,logmax_num_im1); + + // Pack LLRs in output + // [L1(1), L2(1), L1(2), L2(2), L1(3), L2(3), L1(4), L2(4)] + xmm0 = _mm_unpacklo_epi16(y0r,y1r); + // [L1(5), L2(5), L1(6), L2(6), L1(7), L2(7), L1(8), L2(8)] + xmm1 = _mm_unpackhi_epi16(y0r,y1r); + // [L3(1), L4(1), L3(2), L4(2), L3(3), L4(3), L3(4), L4(4)] + xmm2 = _mm_unpacklo_epi16(y0i,y1i); + // [L3(5), L4(5), L3(6), L4(6), L3(7), L4(7), L3(8), L4(8)] + xmm3 = _mm_unpackhi_epi16(y0i,y1i); + + stream0_128i_out[2*i+0] = _mm_unpacklo_epi32(xmm0,xmm2); // 8LLRs, 2REs + stream0_128i_out[2*i+1] = _mm_unpackhi_epi32(xmm0,xmm2); + stream0_128i_out[2*i+2] = _mm_unpacklo_epi32(xmm1,xmm3); + stream0_128i_out[2*i+3] = _mm_unpackhi_epi32(xmm1,xmm3); +#elif defined(__arm__) + +#endif + + } + +#if defined(__x86_64__) || defined(__i386__) + _mm_empty(); + _m_empty(); +#endif +} + +int nr_dlsch_16qam_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, + int32_t **rxdataF_comp, + int32_t **rxdataF_comp_i, + int32_t **dl_ch_mag, //|h_0|^2*(2/sqrt{10}) + int32_t **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10}) + int32_t **rho_i, + int16_t *dlsch_llr, + uint8_t symbol, + uint8_t first_symbol_flag, + uint16_t nb_rb, + uint16_t pbch_pss_sss_adjust, + int16_t **llr16p) +{ + + int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *llr16; + int len; + uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; + + // first symbol has different structure due to more pilots + if (first_symbol_flag == 1) { + llr16 = (int16_t*)dlsch_llr; + } else { + llr16 = (int16_t*)(*llr16p); + } + + + AssertFatal(llr16!=NULL,"nr_dlsch_16qam_16qam_llr: llr is null, symbol %d\n",symbol); + + if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { + // if symbol has pilots + if (frame_parms->nb_antenna_ports_eNB!=1) + // in 2 antenna ports we have 8 REs per symbol per RB + len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); + else + // for 1 antenna port we have 10 REs per symbol per RB + len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); + } else { + // symbol has no pilots + len = (nb_rb*12) - pbch_pss_sss_adjust; + } + + // printf("symbol %d: qam16_llr, len %d (llr16 %p)\n",symbol,len,llr16); + + qam16_qam16((short *)rxF, + (short *)rxF_i, + (short *)ch_mag, + (short *)ch_mag_i, + (short *)llr16, + (short *)rho, + len); + + llr16 += (len<<2); + *llr16p = (short *)llr16; + + return(0); +} + +void qam16_qam64(int16_t *stream0_in, + int16_t *stream1_in, + int16_t *ch_mag, + int16_t *ch_mag_i, + int16_t *stream0_out, + int16_t *rho01, + int32_t length + ) +{ + + /* + Author: Sebastian Wagner + Date: 2012-06-04 + + Input: + stream0_in: MF filter for 1st stream, i.e., y0=h0'*y + stream!_in: MF filter for 2nd stream, i.e., y1=h1'*y + ch_mag: 2*h0/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc + ch_mag_i: 2*h1/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc + rho01: Channel cross correlation, i.e., h1'*h0 + + Output: + stream0_out: output LLRs for 1st stream + */ + +#if defined(__x86_64__) || defined(__i386__) + __m128i *rho01_128i = (__m128i *)rho01; + __m128i *stream0_128i_in = (__m128i *)stream0_in; + __m128i *stream1_128i_in = (__m128i *)stream1_in; + __m128i *stream0_128i_out = (__m128i *)stream0_out; + __m128i *ch_mag_128i = (__m128i *)ch_mag; + __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i; + + + __m128i ONE_OVER_SQRT_2 = _mm_set1_epi16(23170); // round(1/sqrt(2)*2^15) + __m128i ONE_OVER_SQRT_10 = _mm_set1_epi16(20724); // round(1/sqrt(10)*2^16) + __m128i THREE_OVER_SQRT_10 = _mm_set1_epi16(31086); // round(3/sqrt(10)*2^15) + __m128i SQRT_10_OVER_FOUR = _mm_set1_epi16(25905); // round(sqrt(10)/4*2^15) + __m128i ONE_OVER_TWO_SQRT_10 = _mm_set1_epi16(10362); // round(1/2/sqrt(10)*2^16) + __m128i NINE_OVER_TWO_SQRT_10 = _mm_set1_epi16(23315); // round(9/2/sqrt(10)*2^14) + __m128i ONE_OVER_SQRT_2_42 = _mm_set1_epi16(3575); // round(1/sqrt(2*42)*2^15) + __m128i THREE_OVER_SQRT_2_42 = _mm_set1_epi16(10726); // round(3/sqrt(2*42)*2^15) + __m128i FIVE_OVER_SQRT_2_42 = _mm_set1_epi16(17876); // round(5/sqrt(2*42)*2^15) + __m128i SEVEN_OVER_SQRT_2_42 = _mm_set1_epi16(25027); // round(7/sqrt(2*42)*2^15) + __m128i SQRT_42_OVER_FOUR = _mm_set1_epi16(13272); // round(sqrt(42)/4*2^13), Q3. + __m128i ch_mag_des,ch_mag_int; + __m128i y0r_over_sqrt10; + __m128i y0i_over_sqrt10; + __m128i y0r_three_over_sqrt10; + __m128i y0i_three_over_sqrt10; + __m128i ch_mag_over_10; + __m128i ch_mag_over_2; + __m128i ch_mag_9_over_10; + __m128i ch_mag_int_with_sigma2; + __m128i two_ch_mag_int_with_sigma2; + __m128i three_ch_mag_int_with_sigma2; + +#elif defined(__arm__) + +#endif + int i; + + for (i=0; i>2; i+=2) { + // In one iteration, we deal with 8 REs + +#if defined(__x86_64__) || defined(__i386__) + // Get rho + xmm0 = rho01_128i[i]; + xmm1 = rho01_128i[i+1]; + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho) + xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho) + rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho) + rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho) + + // Compute the different rhos + rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi,ONE_OVER_SQRT_10); + rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi,ONE_OVER_SQRT_10); + rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi,THREE_OVER_SQRT_10); + rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi,THREE_OVER_SQRT_10); + rho_rpi_3_3 = _mm_slli_epi16(rho_rpi_3_3,1); + rho_rmi_3_3 = _mm_slli_epi16(rho_rmi_3_3,1); + + xmm4 = _mm_mulhi_epi16(xmm2,ONE_OVER_SQRT_10); // Re(rho) + xmm5 = _mm_mulhi_epi16(xmm3,THREE_OVER_SQRT_10); // Im(rho) + xmm5 = _mm_slli_epi16(xmm5,1); + + rho_rpi_1_3 = _mm_adds_epi16(xmm4,xmm5); + rho_rmi_1_3 = _mm_subs_epi16(xmm4,xmm5); + + xmm6 = _mm_mulhi_epi16(xmm2,THREE_OVER_SQRT_10); // Re(rho) + xmm7 = _mm_mulhi_epi16(xmm3,ONE_OVER_SQRT_10); // Im(rho) + xmm6 = _mm_slli_epi16(xmm6,1); + + rho_rpi_3_1 = _mm_adds_epi16(xmm6,xmm7); + rho_rmi_3_1 = _mm_subs_epi16(xmm6,xmm7); + + // Rearrange interfering MF output + xmm0 = stream1_128i_in[i]; + xmm1 = stream1_128i_in[i+1]; + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] + y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)] + + xmm0 = _mm_setzero_si128(); // ZERO + xmm2 = _mm_subs_epi16(rho_rpi_1_1,y1r); // = [Re(rho)+ Im(rho)]/sqrt(10) - y1r + psi_r_p1_p1 = _mm_abs_epi16(xmm2); // = |[Re(rho)+ Im(rho)]/sqrt(10) - y1r| + + xmm2= _mm_subs_epi16(rho_rmi_1_1,y1r); + psi_r_p1_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rmi_1_1,y1i); + psi_i_p1_p1 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rpi_1_3,y1r); + psi_r_p1_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rmi_1_3,y1r); + psi_r_p1_m3 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rmi_3_1,y1i); + psi_i_p1_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rpi_3_1,y1r); + psi_r_p3_p1 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rmi_3_1,y1r); + psi_r_p3_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rmi_1_3,y1i); + psi_i_p3_p1 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rpi_3_3,y1r); + psi_r_p3_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rmi_3_3,y1r); + psi_r_p3_m3 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rmi_3_3,y1i); + psi_i_p3_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rpi_1_1,y1i); + psi_i_m1_p1 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rpi_3_1,y1i); + psi_i_m1_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rpi_1_3,y1i); + psi_i_m3_p1 = _mm_abs_epi16(xmm2); + xmm2= _mm_subs_epi16(rho_rpi_3_3,y1i); + psi_i_m3_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_1_1,y1i); + psi_i_p1_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_3_1,y1i); + psi_i_p1_m3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_1_3,y1i); + psi_i_p3_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_3_3,y1i); + psi_i_p3_m3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_1_1,y1r); + psi_r_m1_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_1_3,y1r); + psi_r_m1_m3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_3_1,y1r); + psi_r_m3_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(rho_rpi_3_3,y1r); + psi_r_m3_m3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1r,rho_rmi_1_1); + psi_r_m1_p1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1r,rho_rmi_1_3); + psi_r_m1_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1i,rho_rmi_1_1); + psi_i_m1_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1i,rho_rmi_3_1); + psi_i_m1_m3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1r,rho_rmi_3_1); + psi_r_m3_p1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1r,rho_rmi_3_3); + psi_r_m3_p3 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1i,rho_rmi_1_3); + psi_i_m3_m1 = _mm_abs_epi16(xmm2); + xmm2= _mm_adds_epi16(y1i,rho_rmi_3_3); + psi_i_m3_m3 = _mm_abs_epi16(xmm2); + + // Rearrange desired MF output + xmm0 = stream0_128i_in[i]; + xmm1 = stream0_128i_in[i+1]; + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] + y0i = _mm_unpackhi_epi64(xmm0,xmm1); + + // Rearrange desired channel magnitudes + xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10)) + xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10)) + xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + + ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3); // = [|h|^2(1),|h|^2(2),|h|^2(3),|h|^2(4)]*(2/sqrt(10)) + + // Rearrange interfering channel magnitudes + xmm2 = ch_mag_128i_i[i]; + xmm3 = ch_mag_128i_i[i+1]; + + xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + + ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3); + + // Scale MF output of desired signal + y0r_over_sqrt10 = _mm_mulhi_epi16(y0r,ONE_OVER_SQRT_10); + y0i_over_sqrt10 = _mm_mulhi_epi16(y0i,ONE_OVER_SQRT_10); + y0r_three_over_sqrt10 = _mm_mulhi_epi16(y0r,THREE_OVER_SQRT_10); + y0i_three_over_sqrt10 = _mm_mulhi_epi16(y0i,THREE_OVER_SQRT_10); + y0r_three_over_sqrt10 = _mm_slli_epi16(y0r_three_over_sqrt10,1); + y0i_three_over_sqrt10 = _mm_slli_epi16(y0i_three_over_sqrt10,1); + + // Compute necessary combination of required terms + y0_p_1_1 = _mm_adds_epi16(y0r_over_sqrt10,y0i_over_sqrt10); + y0_m_1_1 = _mm_subs_epi16(y0r_over_sqrt10,y0i_over_sqrt10); + + y0_p_1_3 = _mm_adds_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10); + y0_m_1_3 = _mm_subs_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10); + + y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10); + y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10); + + y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10); + y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10); + + // Compute optimal interfering symbol magnitude + ch_mag_int_with_sigma2 = _mm_srai_epi16(ch_mag_int, 1); // *2 + two_ch_mag_int_with_sigma2 = ch_mag_int; // *4 + three_ch_mag_int_with_sigma2 = _mm_adds_epi16(ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2); // *6 + + interference_abs_64qam_epi16(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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); + + // Calculation of groups of two terms in the bit metric involving product of psi and interference magnitude + prodsum_psi_a_epi16(psi_r_p1_p1,a_r_p1_p1,psi_i_p1_p1,a_i_p1_p1,psi_a_p1_p1); + prodsum_psi_a_epi16(psi_r_p1_p3,a_r_p1_p3,psi_i_p1_p3,a_i_p1_p3,psi_a_p1_p3); + prodsum_psi_a_epi16(psi_r_p3_p1,a_r_p3_p1,psi_i_p3_p1,a_i_p3_p1,psi_a_p3_p1); + prodsum_psi_a_epi16(psi_r_p3_p3,a_r_p3_p3,psi_i_p3_p3,a_i_p3_p3,psi_a_p3_p3); + prodsum_psi_a_epi16(psi_r_p1_m1,a_r_p1_m1,psi_i_p1_m1,a_i_p1_m1,psi_a_p1_m1); + prodsum_psi_a_epi16(psi_r_p1_m3,a_r_p1_m3,psi_i_p1_m3,a_i_p1_m3,psi_a_p1_m3); + prodsum_psi_a_epi16(psi_r_p3_m1,a_r_p3_m1,psi_i_p3_m1,a_i_p3_m1,psi_a_p3_m1); + prodsum_psi_a_epi16(psi_r_p3_m3,a_r_p3_m3,psi_i_p3_m3,a_i_p3_m3,psi_a_p3_m3); + prodsum_psi_a_epi16(psi_r_m1_p1,a_r_m1_p1,psi_i_m1_p1,a_i_m1_p1,psi_a_m1_p1); + prodsum_psi_a_epi16(psi_r_m1_p3,a_r_m1_p3,psi_i_m1_p3,a_i_m1_p3,psi_a_m1_p3); + prodsum_psi_a_epi16(psi_r_m3_p1,a_r_m3_p1,psi_i_m3_p1,a_i_m3_p1,psi_a_m3_p1); + prodsum_psi_a_epi16(psi_r_m3_p3,a_r_m3_p3,psi_i_m3_p3,a_i_m3_p3,psi_a_m3_p3); + prodsum_psi_a_epi16(psi_r_m1_m1,a_r_m1_m1,psi_i_m1_m1,a_i_m1_m1,psi_a_m1_m1); + prodsum_psi_a_epi16(psi_r_m1_m3,a_r_m1_m3,psi_i_m1_m3,a_i_m1_m3,psi_a_m1_m3); + prodsum_psi_a_epi16(psi_r_m3_m1,a_r_m3_m1,psi_i_m3_m1,a_i_m3_m1,psi_a_m3_m1); + prodsum_psi_a_epi16(psi_r_m3_m3,a_r_m3_m3,psi_i_m3_m3,a_i_m3_m3,psi_a_m3_m3); + + // Multiply by sqrt(2) + psi_a_p1_p1 = _mm_mulhi_epi16(psi_a_p1_p1, ONE_OVER_SQRT_2); + psi_a_p1_p1 = _mm_slli_epi16(psi_a_p1_p1, 2); + psi_a_p1_p3 = _mm_mulhi_epi16(psi_a_p1_p3, ONE_OVER_SQRT_2); + psi_a_p1_p3 = _mm_slli_epi16(psi_a_p1_p3, 2); + psi_a_p3_p1 = _mm_mulhi_epi16(psi_a_p3_p1, ONE_OVER_SQRT_2); + psi_a_p3_p1 = _mm_slli_epi16(psi_a_p3_p1, 2); + psi_a_p3_p3 = _mm_mulhi_epi16(psi_a_p3_p3, ONE_OVER_SQRT_2); + psi_a_p3_p3 = _mm_slli_epi16(psi_a_p3_p3, 2); + psi_a_p1_m1 = _mm_mulhi_epi16(psi_a_p1_m1, ONE_OVER_SQRT_2); + psi_a_p1_m1 = _mm_slli_epi16(psi_a_p1_m1, 2); + psi_a_p1_m3 = _mm_mulhi_epi16(psi_a_p1_m3, ONE_OVER_SQRT_2); + psi_a_p1_m3 = _mm_slli_epi16(psi_a_p1_m3, 2); + psi_a_p3_m1 = _mm_mulhi_epi16(psi_a_p3_m1, ONE_OVER_SQRT_2); + psi_a_p3_m1 = _mm_slli_epi16(psi_a_p3_m1, 2); + psi_a_p3_m3 = _mm_mulhi_epi16(psi_a_p3_m3, ONE_OVER_SQRT_2); + psi_a_p3_m3 = _mm_slli_epi16(psi_a_p3_m3, 2); + psi_a_m1_p1 = _mm_mulhi_epi16(psi_a_m1_p1, ONE_OVER_SQRT_2); + psi_a_m1_p1 = _mm_slli_epi16(psi_a_m1_p1, 2); + psi_a_m1_p3 = _mm_mulhi_epi16(psi_a_m1_p3, ONE_OVER_SQRT_2); + psi_a_m1_p3 = _mm_slli_epi16(psi_a_m1_p3, 2); + psi_a_m3_p1 = _mm_mulhi_epi16(psi_a_m3_p1, ONE_OVER_SQRT_2); + psi_a_m3_p1 = _mm_slli_epi16(psi_a_m3_p1, 2); + psi_a_m3_p3 = _mm_mulhi_epi16(psi_a_m3_p3, ONE_OVER_SQRT_2); + psi_a_m3_p3 = _mm_slli_epi16(psi_a_m3_p3, 2); + psi_a_m1_m1 = _mm_mulhi_epi16(psi_a_m1_m1, ONE_OVER_SQRT_2); + psi_a_m1_m1 = _mm_slli_epi16(psi_a_m1_m1, 2); + psi_a_m1_m3 = _mm_mulhi_epi16(psi_a_m1_m3, ONE_OVER_SQRT_2); + psi_a_m1_m3 = _mm_slli_epi16(psi_a_m1_m3, 2); + psi_a_m3_m1 = _mm_mulhi_epi16(psi_a_m3_m1, ONE_OVER_SQRT_2); + psi_a_m3_m1 = _mm_slli_epi16(psi_a_m3_m1, 2); + psi_a_m3_m3 = _mm_mulhi_epi16(psi_a_m3_m3, ONE_OVER_SQRT_2); + psi_a_m3_m3 = _mm_slli_epi16(psi_a_m3_m3, 2); + + // squared interference magnitude times int. ch. power + square_a_64qam_epi16(a_r_p1_p1,a_i_p1_p1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p1_p1); + square_a_64qam_epi16(a_r_p1_p3,a_i_p1_p3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p1_p3); + square_a_64qam_epi16(a_r_p3_p1,a_i_p3_p1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p3_p1); + square_a_64qam_epi16(a_r_p3_p3,a_i_p3_p3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p3_p3); + square_a_64qam_epi16(a_r_p1_m1,a_i_p1_m1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p1_m1); + square_a_64qam_epi16(a_r_p1_m3,a_i_p1_m3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p1_m3); + square_a_64qam_epi16(a_r_p3_m1,a_i_p3_m1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p3_m1); + square_a_64qam_epi16(a_r_p3_m3,a_i_p3_m3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p3_m3); + square_a_64qam_epi16(a_r_m1_p1,a_i_m1_p1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m1_p1); + square_a_64qam_epi16(a_r_m1_p3,a_i_m1_p3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m1_p3); + square_a_64qam_epi16(a_r_m3_p1,a_i_m3_p1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m3_p1); + square_a_64qam_epi16(a_r_m3_p3,a_i_m3_p3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m3_p3); + square_a_64qam_epi16(a_r_m1_m1,a_i_m1_m1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m1_m1); + square_a_64qam_epi16(a_r_m1_m3,a_i_m1_m3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m1_m3); + square_a_64qam_epi16(a_r_m3_m1,a_i_m3_m1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m3_m1); + square_a_64qam_epi16(a_r_m3_m3,a_i_m3_m3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m3_m3); + + // Computing different multiples of channel norms + ch_mag_over_10=_mm_mulhi_epi16(ch_mag_des, ONE_OVER_TWO_SQRT_10); + ch_mag_over_2=_mm_mulhi_epi16(ch_mag_des, SQRT_10_OVER_FOUR); + ch_mag_over_2=_mm_slli_epi16(ch_mag_over_2, 1); + ch_mag_9_over_10=_mm_mulhi_epi16(ch_mag_des, NINE_OVER_TWO_SQRT_10); + ch_mag_9_over_10=_mm_slli_epi16(ch_mag_9_over_10, 2); + + // Computing Metrics + xmm0 = _mm_subs_epi16(psi_a_p1_p1,a_sq_p1_p1); + xmm1 = _mm_adds_epi16(xmm0,y0_p_1_1); + bit_met_p1_p1= _mm_subs_epi16(xmm1,ch_mag_over_10); + + xmm0 = _mm_subs_epi16(psi_a_p1_p3,a_sq_p1_p3); + xmm1 = _mm_adds_epi16(xmm0,y0_p_1_3); + bit_met_p1_p3= _mm_subs_epi16(xmm1,ch_mag_over_2); + + xmm0 = _mm_subs_epi16(psi_a_p1_m1,a_sq_p1_m1); + xmm1 = _mm_adds_epi16(xmm0,y0_m_1_1); + bit_met_p1_m1= _mm_subs_epi16(xmm1,ch_mag_over_10); + + xmm0 = _mm_subs_epi16(psi_a_p1_m3,a_sq_p1_m3); + xmm1 = _mm_adds_epi16(xmm0,y0_m_1_3); + bit_met_p1_m3= _mm_subs_epi16(xmm1,ch_mag_over_2); + + xmm0 = _mm_subs_epi16(psi_a_p3_p1,a_sq_p3_p1); + xmm1 = _mm_adds_epi16(xmm0,y0_p_3_1); + bit_met_p3_p1= _mm_subs_epi16(xmm1,ch_mag_over_2); + + xmm0 = _mm_subs_epi16(psi_a_p3_p3,a_sq_p3_p3); + xmm1 = _mm_adds_epi16(xmm0,y0_p_3_3); + bit_met_p3_p3= _mm_subs_epi16(xmm1,ch_mag_9_over_10); + + xmm0 = _mm_subs_epi16(psi_a_p3_m1,a_sq_p3_m1); + xmm1 = _mm_adds_epi16(xmm0,y0_m_3_1); + bit_met_p3_m1= _mm_subs_epi16(xmm1,ch_mag_over_2); + + xmm0 = _mm_subs_epi16(psi_a_p3_m3,a_sq_p3_m3); + xmm1 = _mm_adds_epi16(xmm0,y0_m_3_3); + bit_met_p3_m3= _mm_subs_epi16(xmm1,ch_mag_9_over_10); + + xmm0 = _mm_subs_epi16(psi_a_m1_p1,a_sq_m1_p1); + xmm1 = _mm_subs_epi16(xmm0,y0_m_1_1); + bit_met_m1_p1= _mm_subs_epi16(xmm1,ch_mag_over_10); + + xmm0 = _mm_subs_epi16(psi_a_m1_p3,a_sq_m1_p3); + xmm1 = _mm_subs_epi16(xmm0,y0_m_1_3); + bit_met_m1_p3= _mm_subs_epi16(xmm1,ch_mag_over_2); + + xmm0 = _mm_subs_epi16(psi_a_m1_m1,a_sq_m1_m1); + xmm1 = _mm_subs_epi16(xmm0,y0_p_1_1); + bit_met_m1_m1= _mm_subs_epi16(xmm1,ch_mag_over_10); + + xmm0 = _mm_subs_epi16(psi_a_m1_m3,a_sq_m1_m3); + xmm1 = _mm_subs_epi16(xmm0,y0_p_1_3); + bit_met_m1_m3= _mm_subs_epi16(xmm1,ch_mag_over_2); + + xmm0 = _mm_subs_epi16(psi_a_m3_p1,a_sq_m3_p1); + xmm1 = _mm_subs_epi16(xmm0,y0_m_3_1); + bit_met_m3_p1= _mm_subs_epi16(xmm1,ch_mag_over_2); + + xmm0 = _mm_subs_epi16(psi_a_m3_p3,a_sq_m3_p3); + xmm1 = _mm_subs_epi16(xmm0,y0_m_3_3); + bit_met_m3_p3= _mm_subs_epi16(xmm1,ch_mag_9_over_10); + + xmm0 = _mm_subs_epi16(psi_a_m3_m1,a_sq_m3_m1); + xmm1 = _mm_subs_epi16(xmm0,y0_p_3_1); + bit_met_m3_m1= _mm_subs_epi16(xmm1,ch_mag_over_2); + + xmm0 = _mm_subs_epi16(psi_a_m3_m3,a_sq_m3_m3); + xmm1 = _mm_subs_epi16(xmm0,y0_p_3_3); + bit_met_m3_m3= _mm_subs_epi16(xmm1,ch_mag_9_over_10); + + // LLR of the first bit + // Bit = 1 + xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3); + xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3); + xmm2 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3); + xmm3 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_num_re0= _mm_max_epi16(xmm4,xmm5); + + // Bit = 0 + xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3); + xmm1 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3); + xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3); + xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_den_re0 = _mm_max_epi16(xmm4,xmm5); + + // LLR of first bit [L1(1), L1(2), L1(3), L1(4), L1(5), L1(6), L1(7), L1(8)] + y0r = _mm_subs_epi16(logmax_den_re0,logmax_num_re0); + + // LLR of the second bit + // Bit = 1 + xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1); + xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1); + xmm2 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3); + xmm3 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_num_re1 = _mm_max_epi16(xmm4,xmm5); + + // Bit = 0 + xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1); + xmm1 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1); + xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3); + xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_den_re1 = _mm_max_epi16(xmm4,xmm5); + + // LLR of second bit [L2(1), L2(2), L2(3), L2(4)] + y1r = _mm_subs_epi16(logmax_den_re1,logmax_num_re1); + + // LLR of the third bit + // Bit = 1 + xmm0 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3); + xmm1 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3); + xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3); + xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_num_im0 = _mm_max_epi16(xmm4,xmm5); + + // Bit = 0 + xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3); + xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3); + xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3); + xmm3 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_den_im0 = _mm_max_epi16(xmm4,xmm5); + + // LLR of third bit [L3(1), L3(2), L3(3), L3(4)] + y0i = _mm_subs_epi16(logmax_den_im0,logmax_num_im0); + + // LLR of the fourth bit + // Bit = 1 + xmm0 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3); + xmm1 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3); + xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3); + xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_num_im1 = _mm_max_epi16(xmm4,xmm5); + + // Bit = 0 + xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1); + xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1); + xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1); + xmm3 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1); + xmm4 = _mm_max_epi16(xmm0,xmm1); + xmm5 = _mm_max_epi16(xmm2,xmm3); + logmax_den_im1 = _mm_max_epi16(xmm4,xmm5); + + // LLR of fourth bit [L4(1), L4(2), L4(3), L4(4)] + y1i = _mm_subs_epi16(logmax_den_im1,logmax_num_im1); + + // Pack LLRs in output + // [L1(1), L2(1), L1(2), L2(2), L1(3), L2(3), L1(4), L2(4)] + xmm0 = _mm_unpacklo_epi16(y0r,y1r); + // [L1(5), L2(5), L1(6), L2(6), L1(7), L2(7), L1(8), L2(8)] + xmm1 = _mm_unpackhi_epi16(y0r,y1r); + // [L3(1), L4(1), L3(2), L4(2), L3(3), L4(3), L3(4), L4(4)] + xmm2 = _mm_unpacklo_epi16(y0i,y1i); + // [L3(5), L4(5), L3(6), L4(6), L3(7), L4(7), L3(8), L4(8)] + xmm3 = _mm_unpackhi_epi16(y0i,y1i); + + stream0_128i_out[2*i+0] = _mm_unpacklo_epi32(xmm0,xmm2); // 8LLRs, 2REs + stream0_128i_out[2*i+1] = _mm_unpackhi_epi32(xmm0,xmm2); + stream0_128i_out[2*i+2] = _mm_unpacklo_epi32(xmm1,xmm3); + stream0_128i_out[2*i+3] = _mm_unpackhi_epi32(xmm1,xmm3); +#elif defined(__arm__) + +#endif + + } + +#if defined(__x86_64__) || defined(__i386__) + _mm_empty(); + _m_empty(); +#endif +} + +int nr_dlsch_16qam_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, + int32_t **rxdataF_comp, + int32_t **rxdataF_comp_i, + int32_t **dl_ch_mag, //|h_0|^2*(2/sqrt{10}) + int32_t **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10}) + int32_t **rho_i, + int16_t *dlsch_llr, + uint8_t symbol, + uint8_t first_symbol_flag, + uint16_t nb_rb, + uint16_t pbch_pss_sss_adjust, + int16_t **llr16p) +{ + + int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *llr16; + int len; + uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; + + // first symbol has different structure due to more pilots + if (first_symbol_flag == 1) { + llr16 = (int16_t*)dlsch_llr; + } else { + llr16 = (int16_t*)(*llr16p); + } + + + AssertFatal(llr16!=NULL,"nr_dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol); + + + if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { + // if symbol has pilots + if (frame_parms->nb_antenna_ports_eNB!=1) + // in 2 antenna ports we have 8 REs per symbol per RB + len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); + else + // for 1 antenna port we have 10 REs per symbol per RB + len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); + } else { + // symbol has no pilots + len = (nb_rb*12) - pbch_pss_sss_adjust; + } + + // printf("symbol %d: qam16_llr, len %d (llr16 %p)\n",symbol,len,llr16); + + qam16_qam64((short *)rxF, + (short *)rxF_i, + (short *)ch_mag, + (short *)ch_mag_i, + (short *)llr16, + (short *)rho, + len); + + llr16 += (len<<2); + *llr16p = (short *)llr16; + + return(0); +} + +//---------------------------------------------------------------------------------------------- +// 64-QAM +//---------------------------------------------------------------------------------------------- + +/* +__m128i ONE_OVER_SQRT_42 __attribute__((aligned(16))); +__m128i THREE_OVER_SQRT_42 __attribute__((aligned(16))); +__m128i FIVE_OVER_SQRT_42 __attribute__((aligned(16))); +__m128i SEVEN_OVER_SQRT_42 __attribute__((aligned(16))); + +__m128i FORTYNINE_OVER_FOUR_SQRT_42 __attribute__((aligned(16))); +__m128i THIRTYSEVEN_OVER_FOUR_SQRT_42 __attribute__((aligned(16))); +__m128i TWENTYNINE_OVER_FOUR_SQRT_42 __attribute__((aligned(16))); +__m128i TWENTYFIVE_OVER_FOUR_SQRT_42 __attribute__((aligned(16))); +__m128i SEVENTEEN_OVER_FOUR_SQRT_42 __attribute__((aligned(16))); +__m128i NINE_OVER_FOUR_SQRT_42 __attribute__((aligned(16))); +__m128i THIRTEEN_OVER_FOUR_SQRT_42 __attribute__((aligned(16))); +__m128i FIVE_OVER_FOUR_SQRT_42 __attribute__((aligned(16))); +__m128i ONE_OVER_FOUR_SQRT_42 __attribute__((aligned(16))); + +__m128i y0r_one_over_sqrt_21 __attribute__((aligned(16))); +__m128i y0r_three_over_sqrt_21 __attribute__((aligned(16))); +__m128i y0r_five_over_sqrt_21 __attribute__((aligned(16))); +__m128i y0r_seven_over_sqrt_21 __attribute__((aligned(16))); +__m128i y0i_one_over_sqrt_21 __attribute__((aligned(16))); +__m128i y0i_three_over_sqrt_21 __attribute__((aligned(16))); +__m128i y0i_five_over_sqrt_21 __attribute__((aligned(16))); +__m128i y0i_seven_over_sqrt_21 __attribute__((aligned(16))); + +__m128i ch_mag_98_over_42_with_sigma2 __attribute__((aligned(16))); +__m128i ch_mag_74_over_42_with_sigma2 __attribute__((aligned(16))); +__m128i ch_mag_58_over_42_with_sigma2 __attribute__((aligned(16))); +__m128i ch_mag_50_over_42_with_sigma2 __attribute__((aligned(16))); +__m128i ch_mag_34_over_42_with_sigma2 __attribute__((aligned(16))); +__m128i ch_mag_18_over_42_with_sigma2 __attribute__((aligned(16))); +__m128i ch_mag_26_over_42_with_sigma2 __attribute__((aligned(16))); +__m128i ch_mag_10_over_42_with_sigma2 __attribute__((aligned(16))); +__m128i ch_mag_2_over_42_with_sigma2 __attribute__((aligned(16))); + +*/ + +void qam64_qpsk(int16_t *stream0_in, + int16_t *stream1_in, + int16_t *ch_mag, + int16_t *stream0_out, + int16_t *rho01, + int32_t length + ) +{ + + /* + Author: S. Wagner + Date: 31-07-12 + + Input: + stream0_in: MF filter for 1st stream, i.e., y0=h0'*y + stream1_in: MF filter for 2nd stream, i.e., y1=h1'*y + ch_mag: 4*h0/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc + ch_mag_i: 4*h1/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc + rho01: Channel cross correlation, i.e., h1'*h0 + + Output: + stream0_out: output LLRs for 1st stream + */ + +#if defined(__x86_64__) || defined(__i386__) + __m128i *rho01_128i = (__m128i *)rho01; + __m128i *stream0_128i_in = (__m128i *)stream0_in; + __m128i *stream1_128i_in = (__m128i *)stream1_in; + __m128i *ch_mag_128i = (__m128i *)ch_mag; + + + __m128i ONE_OVER_SQRT_42 = _mm_set1_epi16(10112); // round(1/sqrt(42)*2^16) + __m128i THREE_OVER_SQRT_42 = _mm_set1_epi16(30337); // round(3/sqrt(42)*2^16) + __m128i FIVE_OVER_SQRT_42 = _mm_set1_epi16(25281); // round(5/sqrt(42)*2^15) + __m128i SEVEN_OVER_SQRT_42 = _mm_set1_epi16(17697); // round(5/sqrt(42)*2^15) + __m128i ONE_OVER_SQRT_2 = _mm_set1_epi16(23170); // round(1/sqrt(2)*2^15) + __m128i FORTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(30969); // round(49/(4*sqrt(42))*2^14), Q2.14 + __m128i THIRTYSEVEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(23385); // round(37/(4*sqrt(42))*2^14), Q2.14 + __m128i TWENTYFIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(31601); // round(25/(4*sqrt(42))*2^15) + __m128i TWENTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(18329); // round(29/(4*sqrt(42))*2^15), Q2.14 + __m128i SEVENTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(21489); // round(17/(4*sqrt(42))*2^15) + __m128i NINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(11376); // round(9/(4*sqrt(42))*2^15) + __m128i THIRTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(16433); // round(13/(4*sqrt(42))*2^15) + __m128i FIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(6320); // round(5/(4*sqrt(42))*2^15) + __m128i ONE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(1264); // round(1/(4*sqrt(42))*2^15) + + + __m128i ch_mag_des; + __m128i ch_mag_98_over_42_with_sigma2; + __m128i ch_mag_74_over_42_with_sigma2; + __m128i ch_mag_58_over_42_with_sigma2; + __m128i ch_mag_50_over_42_with_sigma2; + __m128i ch_mag_34_over_42_with_sigma2; + __m128i ch_mag_18_over_42_with_sigma2; + __m128i ch_mag_26_over_42_with_sigma2; + __m128i ch_mag_10_over_42_with_sigma2; + __m128i ch_mag_2_over_42_with_sigma2; + __m128i y0r_one_over_sqrt_21; + __m128i y0r_three_over_sqrt_21; + __m128i y0r_five_over_sqrt_21; + __m128i y0r_seven_over_sqrt_21; + __m128i y0i_one_over_sqrt_21; + __m128i y0i_three_over_sqrt_21; + __m128i y0i_five_over_sqrt_21; + __m128i y0i_seven_over_sqrt_21; +#elif defined(__arm__) + +#endif + + int i,j; + + for (i=0; i>2; i+=2) { + +#if defined(__x86_64) || defined(__i386__) + // Get rho + xmm0 = rho01_128i[i]; + xmm1 = rho01_128i[i+1]; + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho) + xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho) + rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho) + rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho) + + // Compute the different rhos + rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42); + rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42); + rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42); + rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42); + rho_rpi_5_5 = _mm_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42); + rho_rmi_5_5 = _mm_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42); + rho_rpi_7_7 = _mm_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42); + rho_rmi_7_7 = _mm_mulhi_epi16(rho_rmi, SEVEN_OVER_SQRT_42); + + rho_rpi_5_5 = _mm_slli_epi16(rho_rpi_5_5, 1); + rho_rmi_5_5 = _mm_slli_epi16(rho_rmi_5_5, 1); + rho_rpi_7_7 = _mm_slli_epi16(rho_rpi_7_7, 2); + rho_rmi_7_7 = _mm_slli_epi16(rho_rmi_7_7, 2); + + xmm4 = _mm_mulhi_epi16(xmm2, ONE_OVER_SQRT_42); + xmm5 = _mm_mulhi_epi16(xmm3, ONE_OVER_SQRT_42); + xmm6 = _mm_mulhi_epi16(xmm3, THREE_OVER_SQRT_42); + xmm7 = _mm_mulhi_epi16(xmm3, FIVE_OVER_SQRT_42); + xmm8 = _mm_mulhi_epi16(xmm3, SEVEN_OVER_SQRT_42); + xmm7 = _mm_slli_epi16(xmm7, 1); + xmm8 = _mm_slli_epi16(xmm8, 2); + + rho_rpi_1_3 = _mm_adds_epi16(xmm4, xmm6); + rho_rmi_1_3 = _mm_subs_epi16(xmm4, xmm6); + rho_rpi_1_5 = _mm_adds_epi16(xmm4, xmm7); + rho_rmi_1_5 = _mm_subs_epi16(xmm4, xmm7); + rho_rpi_1_7 = _mm_adds_epi16(xmm4, xmm8); + rho_rmi_1_7 = _mm_subs_epi16(xmm4, xmm8); + + xmm4 = _mm_mulhi_epi16(xmm2, THREE_OVER_SQRT_42); + rho_rpi_3_1 = _mm_adds_epi16(xmm4, xmm5); + rho_rmi_3_1 = _mm_subs_epi16(xmm4, xmm5); + rho_rpi_3_5 = _mm_adds_epi16(xmm4, xmm7); + rho_rmi_3_5 = _mm_subs_epi16(xmm4, xmm7); + rho_rpi_3_7 = _mm_adds_epi16(xmm4, xmm8); + rho_rmi_3_7 = _mm_subs_epi16(xmm4, xmm8); + + xmm4 = _mm_mulhi_epi16(xmm2, FIVE_OVER_SQRT_42); + xmm4 = _mm_slli_epi16(xmm4, 1); + rho_rpi_5_1 = _mm_adds_epi16(xmm4, xmm5); + rho_rmi_5_1 = _mm_subs_epi16(xmm4, xmm5); + rho_rpi_5_3 = _mm_adds_epi16(xmm4, xmm6); + rho_rmi_5_3 = _mm_subs_epi16(xmm4, xmm6); + rho_rpi_5_7 = _mm_adds_epi16(xmm4, xmm8); + rho_rmi_5_7 = _mm_subs_epi16(xmm4, xmm8); + + xmm4 = _mm_mulhi_epi16(xmm2, SEVEN_OVER_SQRT_42); + xmm4 = _mm_slli_epi16(xmm4, 2); + rho_rpi_7_1 = _mm_adds_epi16(xmm4, xmm5); + rho_rmi_7_1 = _mm_subs_epi16(xmm4, xmm5); + rho_rpi_7_3 = _mm_adds_epi16(xmm4, xmm6); + rho_rmi_7_3 = _mm_subs_epi16(xmm4, xmm6); + rho_rpi_7_5 = _mm_adds_epi16(xmm4, xmm7); + rho_rmi_7_5 = _mm_subs_epi16(xmm4, xmm7); + + // Rearrange interfering MF output + xmm0 = stream1_128i_in[i]; + xmm1 = stream1_128i_in[i+1]; + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] + y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)] + + // Psi_r calculation from rho_rpi or rho_rmi + xmm0 = _mm_setzero_si128(); // ZERO for abs_pi16 + xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1r); + psi_r_p7_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1r); + psi_r_p7_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1r); + psi_r_p7_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1r); + psi_r_p7_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1r); + psi_r_p7_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1r); + psi_r_p7_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1r); + psi_r_p7_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1r); + psi_r_p7_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1r); + psi_r_p5_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1r); + psi_r_p5_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1r); + psi_r_p5_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1r); + psi_r_p5_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1r); + psi_r_p5_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1r); + psi_r_p5_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1r); + psi_r_p5_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1r); + psi_r_p5_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1r); + psi_r_p3_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1r); + psi_r_p3_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1r); + psi_r_p3_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1r); + psi_r_p3_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1r); + psi_r_p3_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1r); + psi_r_p3_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1r); + psi_r_p3_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1r); + psi_r_p3_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1r); + psi_r_p1_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1r); + psi_r_p1_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1r); + psi_r_p1_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1r); + psi_r_p1_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1r); + psi_r_p1_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1r); + psi_r_p1_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1r); + psi_r_p1_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1r); + psi_r_p1_m7 = _mm_abs_epi16(xmm2); + + xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1r); + psi_r_m1_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1r); + psi_r_m1_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1r); + psi_r_m1_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1r); + psi_r_m1_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1r); + psi_r_m1_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1r); + psi_r_m1_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1r); + psi_r_m1_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1r); + psi_r_m1_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1r); + psi_r_m3_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1r); + psi_r_m3_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1r); + psi_r_m3_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1r); + psi_r_m3_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1r); + psi_r_m3_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1r); + psi_r_m3_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1r); + psi_r_m3_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1r); + psi_r_m3_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1r); + psi_r_m5_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1r); + psi_r_m5_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1r); + psi_r_m5_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1r); + psi_r_m5_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1r); + psi_r_m5_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1r); + psi_r_m5_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1r); + psi_r_m5_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1r); + psi_r_m5_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1r); + psi_r_m7_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1r); + psi_r_m7_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1r); + psi_r_m7_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1r); + psi_r_m7_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1r); + psi_r_m7_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1r); + psi_r_m7_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1r); + psi_r_m7_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1r); + psi_r_m7_m7 = _mm_abs_epi16(xmm2); + + // Psi_i calculation from rho_rpi or rho_rmi + xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1i); + psi_i_p7_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1i); + psi_i_p7_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1i); + psi_i_p7_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1i); + psi_i_p7_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1i); + psi_i_p7_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1i); + psi_i_p7_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1i); + psi_i_p7_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1i); + psi_i_p7_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1i); + psi_i_p5_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1i); + psi_i_p5_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1i); + psi_i_p5_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1i); + psi_i_p5_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1i); + psi_i_p5_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1i); + psi_i_p5_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1i); + psi_i_p5_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1i); + psi_i_p5_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1i); + psi_i_p3_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1i); + psi_i_p3_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1i); + psi_i_p3_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1i); + psi_i_p3_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1i); + psi_i_p3_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1i); + psi_i_p3_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1i); + psi_i_p3_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1i); + psi_i_p3_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1i); + psi_i_p1_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1i); + psi_i_p1_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1i); + psi_i_p1_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1i); + psi_i_p1_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1i); + psi_i_p1_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1i); + psi_i_p1_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1i); + psi_i_p1_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1i); + psi_i_p1_m7 = _mm_abs_epi16(xmm2); + + xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1i); + psi_i_m1_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1i); + psi_i_m1_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1i); + psi_i_m1_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1i); + psi_i_m1_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1i); + psi_i_m1_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1i); + psi_i_m1_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1i); + psi_i_m1_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1i); + psi_i_m1_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1i); + psi_i_m3_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1i); + psi_i_m3_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1i); + psi_i_m3_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1i); + psi_i_m3_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1i); + psi_i_m3_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1i); + psi_i_m3_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1i); + psi_i_m3_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1i); + psi_i_m3_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1i); + psi_i_m5_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1i); + psi_i_m5_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1i); + psi_i_m5_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1i); + psi_i_m5_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1i); + psi_i_m5_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1i); + psi_i_m5_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1i); + psi_i_m5_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1i); + psi_i_m5_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1i); + psi_i_m7_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1i); + psi_i_m7_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1i); + psi_i_m7_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1i); + psi_i_m7_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1i); + psi_i_m7_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1i); + psi_i_m7_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1i); + psi_i_m7_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1i); + psi_i_m7_m7 = _mm_abs_epi16(xmm2); + + + // Rearrange desired MF output + xmm0 = stream0_128i_in[i]; + xmm1 = stream0_128i_in[i+1]; + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] + y0i = _mm_unpackhi_epi64(xmm0,xmm1); + + // Rearrange desired channel magnitudes + xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10)) + xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10)) + xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3); + + y0r_one_over_sqrt_21 = _mm_mulhi_epi16(y0r, ONE_OVER_SQRT_42); + y0r_three_over_sqrt_21 = _mm_mulhi_epi16(y0r, THREE_OVER_SQRT_42); + y0r_five_over_sqrt_21 = _mm_mulhi_epi16(y0r, FIVE_OVER_SQRT_42); + y0r_five_over_sqrt_21 = _mm_slli_epi16(y0r_five_over_sqrt_21, 1); + y0r_seven_over_sqrt_21 = _mm_mulhi_epi16(y0r, SEVEN_OVER_SQRT_42); + y0r_seven_over_sqrt_21 = _mm_slli_epi16(y0r_seven_over_sqrt_21, 2); // Q2.14 + + y0i_one_over_sqrt_21 = _mm_mulhi_epi16(y0i, ONE_OVER_SQRT_42); + y0i_three_over_sqrt_21 = _mm_mulhi_epi16(y0i, THREE_OVER_SQRT_42); + y0i_five_over_sqrt_21 = _mm_mulhi_epi16(y0i, FIVE_OVER_SQRT_42); + y0i_five_over_sqrt_21 = _mm_slli_epi16(y0i_five_over_sqrt_21, 1); + y0i_seven_over_sqrt_21 = _mm_mulhi_epi16(y0i, SEVEN_OVER_SQRT_42); + y0i_seven_over_sqrt_21 = _mm_slli_epi16(y0i_seven_over_sqrt_21, 2); // Q2.14 + + y0_p_7_1 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); + y0_p_7_3 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); + y0_p_7_5 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); + y0_p_7_7 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); + y0_p_5_1 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); + y0_p_5_3 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); + y0_p_5_5 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); + y0_p_5_7 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); + y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); + y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); + y0_p_3_5 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); + y0_p_3_7 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); + y0_p_1_1 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); + y0_p_1_3 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); + y0_p_1_5 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); + y0_p_1_7 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); + + y0_m_1_1 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); + y0_m_1_3 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); + y0_m_1_5 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); + y0_m_1_7 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); + y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); + y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); + y0_m_3_5 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); + y0_m_3_7 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); + y0_m_5_1 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); + y0_m_5_3 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); + y0_m_5_5 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); + y0_m_5_7 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); + y0_m_7_1 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); + y0_m_7_3 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); + y0_m_7_5 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); + y0_m_7_7 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); + + // divide by sqrt(2) + psi_r_p7_p7 = _mm_mulhi_epi16(psi_r_p7_p7, ONE_OVER_SQRT_2); + psi_r_p7_p7 = _mm_slli_epi16(psi_r_p7_p7, 1); + psi_r_p7_p5 = _mm_mulhi_epi16(psi_r_p7_p5, ONE_OVER_SQRT_2); + psi_r_p7_p5 = _mm_slli_epi16(psi_r_p7_p5, 1); + psi_r_p7_p3 = _mm_mulhi_epi16(psi_r_p7_p3, ONE_OVER_SQRT_2); + psi_r_p7_p3 = _mm_slli_epi16(psi_r_p7_p3, 1); + psi_r_p7_p1 = _mm_mulhi_epi16(psi_r_p7_p1, ONE_OVER_SQRT_2); + psi_r_p7_p1 = _mm_slli_epi16(psi_r_p7_p1, 1); + psi_r_p7_m1 = _mm_mulhi_epi16(psi_r_p7_m1, ONE_OVER_SQRT_2); + psi_r_p7_m1 = _mm_slli_epi16(psi_r_p7_m1, 1); + psi_r_p7_m3 = _mm_mulhi_epi16(psi_r_p7_m3, ONE_OVER_SQRT_2); + psi_r_p7_m3 = _mm_slli_epi16(psi_r_p7_m3, 1); + psi_r_p7_m5 = _mm_mulhi_epi16(psi_r_p7_m5, ONE_OVER_SQRT_2); + psi_r_p7_m5 = _mm_slli_epi16(psi_r_p7_m5, 1); + psi_r_p7_m7 = _mm_mulhi_epi16(psi_r_p7_m7, ONE_OVER_SQRT_2); + psi_r_p7_m7 = _mm_slli_epi16(psi_r_p7_m7, 1); + psi_r_p5_p7 = _mm_mulhi_epi16(psi_r_p5_p7, ONE_OVER_SQRT_2); + psi_r_p5_p7 = _mm_slli_epi16(psi_r_p5_p7, 1); + psi_r_p5_p5 = _mm_mulhi_epi16(psi_r_p5_p5, ONE_OVER_SQRT_2); + psi_r_p5_p5 = _mm_slli_epi16(psi_r_p5_p5, 1); + psi_r_p5_p3 = _mm_mulhi_epi16(psi_r_p5_p3, ONE_OVER_SQRT_2); + psi_r_p5_p3 = _mm_slli_epi16(psi_r_p5_p3, 1); + psi_r_p5_p1 = _mm_mulhi_epi16(psi_r_p5_p1, ONE_OVER_SQRT_2); + psi_r_p5_p1 = _mm_slli_epi16(psi_r_p5_p1, 1); + psi_r_p5_m1 = _mm_mulhi_epi16(psi_r_p5_m1, ONE_OVER_SQRT_2); + psi_r_p5_m1 = _mm_slli_epi16(psi_r_p5_m1, 1); + psi_r_p5_m3 = _mm_mulhi_epi16(psi_r_p5_m3, ONE_OVER_SQRT_2); + psi_r_p5_m3 = _mm_slli_epi16(psi_r_p5_m3, 1); + psi_r_p5_m5 = _mm_mulhi_epi16(psi_r_p5_m5, ONE_OVER_SQRT_2); + psi_r_p5_m5 = _mm_slli_epi16(psi_r_p5_m5, 1); + psi_r_p5_m7 = _mm_mulhi_epi16(psi_r_p5_m7, ONE_OVER_SQRT_2); + psi_r_p5_m7 = _mm_slli_epi16(psi_r_p5_m7, 1); + psi_r_p3_p7 = _mm_mulhi_epi16(psi_r_p3_p7, ONE_OVER_SQRT_2); + psi_r_p3_p7 = _mm_slli_epi16(psi_r_p3_p7, 1); + psi_r_p3_p5 = _mm_mulhi_epi16(psi_r_p3_p5, ONE_OVER_SQRT_2); + psi_r_p3_p5 = _mm_slli_epi16(psi_r_p3_p5, 1); + psi_r_p3_p3 = _mm_mulhi_epi16(psi_r_p3_p3, ONE_OVER_SQRT_2); + psi_r_p3_p3 = _mm_slli_epi16(psi_r_p3_p3, 1); + psi_r_p3_p1 = _mm_mulhi_epi16(psi_r_p3_p1, ONE_OVER_SQRT_2); + psi_r_p3_p1 = _mm_slli_epi16(psi_r_p3_p1, 1); + psi_r_p3_m1 = _mm_mulhi_epi16(psi_r_p3_m1, ONE_OVER_SQRT_2); + psi_r_p3_m1 = _mm_slli_epi16(psi_r_p3_m1, 1); + psi_r_p3_m3 = _mm_mulhi_epi16(psi_r_p3_m3, ONE_OVER_SQRT_2); + psi_r_p3_m3 = _mm_slli_epi16(psi_r_p3_m3, 1); + psi_r_p3_m5 = _mm_mulhi_epi16(psi_r_p3_m5, ONE_OVER_SQRT_2); + psi_r_p3_m5 = _mm_slli_epi16(psi_r_p3_m5, 1); + psi_r_p3_m7 = _mm_mulhi_epi16(psi_r_p3_m7, ONE_OVER_SQRT_2); + psi_r_p3_m7 = _mm_slli_epi16(psi_r_p3_m7, 1); + psi_r_p1_p7 = _mm_mulhi_epi16(psi_r_p1_p7, ONE_OVER_SQRT_2); + psi_r_p1_p7 = _mm_slli_epi16(psi_r_p1_p7, 1); + psi_r_p1_p5 = _mm_mulhi_epi16(psi_r_p1_p5, ONE_OVER_SQRT_2); + psi_r_p1_p5 = _mm_slli_epi16(psi_r_p1_p5, 1); + psi_r_p1_p3 = _mm_mulhi_epi16(psi_r_p1_p3, ONE_OVER_SQRT_2); + psi_r_p1_p3 = _mm_slli_epi16(psi_r_p1_p3, 1); + psi_r_p1_p1 = _mm_mulhi_epi16(psi_r_p1_p1, ONE_OVER_SQRT_2); + psi_r_p1_p1 = _mm_slli_epi16(psi_r_p1_p1, 1); + psi_r_p1_m1 = _mm_mulhi_epi16(psi_r_p1_m1, ONE_OVER_SQRT_2); + psi_r_p1_m1 = _mm_slli_epi16(psi_r_p1_m1, 1); + psi_r_p1_m3 = _mm_mulhi_epi16(psi_r_p1_m3, ONE_OVER_SQRT_2); + psi_r_p1_m3 = _mm_slli_epi16(psi_r_p1_m3, 1); + psi_r_p1_m5 = _mm_mulhi_epi16(psi_r_p1_m5, ONE_OVER_SQRT_2); + psi_r_p1_m5 = _mm_slli_epi16(psi_r_p1_m5, 1); + psi_r_p1_m7 = _mm_mulhi_epi16(psi_r_p1_m7, ONE_OVER_SQRT_2); + psi_r_p1_m7 = _mm_slli_epi16(psi_r_p1_m7, 1); + psi_r_m1_p7 = _mm_mulhi_epi16(psi_r_m1_p7, ONE_OVER_SQRT_2); + psi_r_m1_p7 = _mm_slli_epi16(psi_r_m1_p7, 1); + psi_r_m1_p5 = _mm_mulhi_epi16(psi_r_m1_p5, ONE_OVER_SQRT_2); + psi_r_m1_p5 = _mm_slli_epi16(psi_r_m1_p5, 1); + psi_r_m1_p3 = _mm_mulhi_epi16(psi_r_m1_p3, ONE_OVER_SQRT_2); + psi_r_m1_p3 = _mm_slli_epi16(psi_r_m1_p3, 1); + psi_r_m1_p1 = _mm_mulhi_epi16(psi_r_m1_p1, ONE_OVER_SQRT_2); + psi_r_m1_p1 = _mm_slli_epi16(psi_r_m1_p1, 1); + psi_r_m1_m1 = _mm_mulhi_epi16(psi_r_m1_m1, ONE_OVER_SQRT_2); + psi_r_m1_m1 = _mm_slli_epi16(psi_r_m1_m1, 1); + psi_r_m1_m3 = _mm_mulhi_epi16(psi_r_m1_m3, ONE_OVER_SQRT_2); + psi_r_m1_m3 = _mm_slli_epi16(psi_r_m1_m3, 1); + psi_r_m1_m5 = _mm_mulhi_epi16(psi_r_m1_m5, ONE_OVER_SQRT_2); + psi_r_m1_m5 = _mm_slli_epi16(psi_r_m1_m5, 1); + psi_r_m1_m7 = _mm_mulhi_epi16(psi_r_m1_m7, ONE_OVER_SQRT_2); + psi_r_m1_m7 = _mm_slli_epi16(psi_r_m1_m7, 1); + psi_r_m3_p7 = _mm_mulhi_epi16(psi_r_m3_p7, ONE_OVER_SQRT_2); + psi_r_m3_p7 = _mm_slli_epi16(psi_r_m3_p7, 1); + psi_r_m3_p5 = _mm_mulhi_epi16(psi_r_m3_p5, ONE_OVER_SQRT_2); + psi_r_m3_p5 = _mm_slli_epi16(psi_r_m3_p5, 1); + psi_r_m3_p3 = _mm_mulhi_epi16(psi_r_m3_p3, ONE_OVER_SQRT_2); + psi_r_m3_p3 = _mm_slli_epi16(psi_r_m3_p3, 1); + psi_r_m3_p1 = _mm_mulhi_epi16(psi_r_m3_p1, ONE_OVER_SQRT_2); + psi_r_m3_p1 = _mm_slli_epi16(psi_r_m3_p1, 1); + psi_r_m3_m1 = _mm_mulhi_epi16(psi_r_m3_m1, ONE_OVER_SQRT_2); + psi_r_m3_m1 = _mm_slli_epi16(psi_r_m3_m1, 1); + psi_r_m3_m3 = _mm_mulhi_epi16(psi_r_m3_m3, ONE_OVER_SQRT_2); + psi_r_m3_m3 = _mm_slli_epi16(psi_r_m3_m3, 1); + psi_r_m3_m5 = _mm_mulhi_epi16(psi_r_m3_m5, ONE_OVER_SQRT_2); + psi_r_m3_m5 = _mm_slli_epi16(psi_r_m3_m5, 1); + psi_r_m3_m7 = _mm_mulhi_epi16(psi_r_m3_m7, ONE_OVER_SQRT_2); + psi_r_m3_m7 = _mm_slli_epi16(psi_r_m3_m7, 1); + psi_r_m5_p7 = _mm_mulhi_epi16(psi_r_m5_p7, ONE_OVER_SQRT_2); + psi_r_m5_p7 = _mm_slli_epi16(psi_r_m5_p7, 1); + psi_r_m5_p5 = _mm_mulhi_epi16(psi_r_m5_p5, ONE_OVER_SQRT_2); + psi_r_m5_p5 = _mm_slli_epi16(psi_r_m5_p5, 1); + psi_r_m5_p3 = _mm_mulhi_epi16(psi_r_m5_p3, ONE_OVER_SQRT_2); + psi_r_m5_p3 = _mm_slli_epi16(psi_r_m5_p3, 1); + psi_r_m5_p1 = _mm_mulhi_epi16(psi_r_m5_p1, ONE_OVER_SQRT_2); + psi_r_m5_p1 = _mm_slli_epi16(psi_r_m5_p1, 1); + psi_r_m5_m1 = _mm_mulhi_epi16(psi_r_m5_m1, ONE_OVER_SQRT_2); + psi_r_m5_m1 = _mm_slli_epi16(psi_r_m5_m1, 1); + psi_r_m5_m3 = _mm_mulhi_epi16(psi_r_m5_m3, ONE_OVER_SQRT_2); + psi_r_m5_m3 = _mm_slli_epi16(psi_r_m5_m3, 1); + psi_r_m5_m5 = _mm_mulhi_epi16(psi_r_m5_m5, ONE_OVER_SQRT_2); + psi_r_m5_m5 = _mm_slli_epi16(psi_r_m5_m5, 1); + psi_r_m5_m7 = _mm_mulhi_epi16(psi_r_m5_m7, ONE_OVER_SQRT_2); + psi_r_m5_m7 = _mm_slli_epi16(psi_r_m5_m7, 1); + psi_r_m7_p7 = _mm_mulhi_epi16(psi_r_m7_p7, ONE_OVER_SQRT_2); + psi_r_m7_p7 = _mm_slli_epi16(psi_r_m7_p7, 1); + psi_r_m7_p5 = _mm_mulhi_epi16(psi_r_m7_p5, ONE_OVER_SQRT_2); + psi_r_m7_p5 = _mm_slli_epi16(psi_r_m7_p5, 1); + psi_r_m7_p3 = _mm_mulhi_epi16(psi_r_m7_p3, ONE_OVER_SQRT_2); + psi_r_m7_p3 = _mm_slli_epi16(psi_r_m7_p3, 1); + psi_r_m7_p1 = _mm_mulhi_epi16(psi_r_m7_p1, ONE_OVER_SQRT_2); + psi_r_m7_p1 = _mm_slli_epi16(psi_r_m7_p1, 1); + psi_r_m7_m1 = _mm_mulhi_epi16(psi_r_m7_m1, ONE_OVER_SQRT_2); + psi_r_m7_m1 = _mm_slli_epi16(psi_r_m7_m1, 1); + psi_r_m7_m3 = _mm_mulhi_epi16(psi_r_m7_m3, ONE_OVER_SQRT_2); + psi_r_m7_m3 = _mm_slli_epi16(psi_r_m7_m3, 1); + psi_r_m7_m5 = _mm_mulhi_epi16(psi_r_m7_m5, ONE_OVER_SQRT_2); + psi_r_m7_m5 = _mm_slli_epi16(psi_r_m7_m5, 1); + psi_r_m7_m7 = _mm_mulhi_epi16(psi_r_m7_m7, ONE_OVER_SQRT_2); + psi_r_m7_m7 = _mm_slli_epi16(psi_r_m7_m7, 1); + + psi_i_p7_p7 = _mm_mulhi_epi16(psi_i_p7_p7, ONE_OVER_SQRT_2); + psi_i_p7_p7 = _mm_slli_epi16(psi_i_p7_p7, 1); + psi_i_p7_p5 = _mm_mulhi_epi16(psi_i_p7_p5, ONE_OVER_SQRT_2); + psi_i_p7_p5 = _mm_slli_epi16(psi_i_p7_p5, 1); + psi_i_p7_p3 = _mm_mulhi_epi16(psi_i_p7_p3, ONE_OVER_SQRT_2); + psi_i_p7_p3 = _mm_slli_epi16(psi_i_p7_p3, 1); + psi_i_p7_p1 = _mm_mulhi_epi16(psi_i_p7_p1, ONE_OVER_SQRT_2); + psi_i_p7_p1 = _mm_slli_epi16(psi_i_p7_p1, 1); + psi_i_p7_m1 = _mm_mulhi_epi16(psi_i_p7_m1, ONE_OVER_SQRT_2); + psi_i_p7_m1 = _mm_slli_epi16(psi_i_p7_m1, 1); + psi_i_p7_m3 = _mm_mulhi_epi16(psi_i_p7_m3, ONE_OVER_SQRT_2); + psi_i_p7_m3 = _mm_slli_epi16(psi_i_p7_m3, 1); + psi_i_p7_m5 = _mm_mulhi_epi16(psi_i_p7_m5, ONE_OVER_SQRT_2); + psi_i_p7_m5 = _mm_slli_epi16(psi_i_p7_m5, 1); + psi_i_p7_m7 = _mm_mulhi_epi16(psi_i_p7_m7, ONE_OVER_SQRT_2); + psi_i_p7_m7 = _mm_slli_epi16(psi_i_p7_m7, 1); + psi_i_p5_p7 = _mm_mulhi_epi16(psi_i_p5_p7, ONE_OVER_SQRT_2); + psi_i_p5_p7 = _mm_slli_epi16(psi_i_p5_p7, 1); + psi_i_p5_p5 = _mm_mulhi_epi16(psi_i_p5_p5, ONE_OVER_SQRT_2); + psi_i_p5_p5 = _mm_slli_epi16(psi_i_p5_p5, 1); + psi_i_p5_p3 = _mm_mulhi_epi16(psi_i_p5_p3, ONE_OVER_SQRT_2); + psi_i_p5_p3 = _mm_slli_epi16(psi_i_p5_p3, 1); + psi_i_p5_p1 = _mm_mulhi_epi16(psi_i_p5_p1, ONE_OVER_SQRT_2); + psi_i_p5_p1 = _mm_slli_epi16(psi_i_p5_p1, 1); + psi_i_p5_m1 = _mm_mulhi_epi16(psi_i_p5_m1, ONE_OVER_SQRT_2); + psi_i_p5_m1 = _mm_slli_epi16(psi_i_p5_m1, 1); + psi_i_p5_m3 = _mm_mulhi_epi16(psi_i_p5_m3, ONE_OVER_SQRT_2); + psi_i_p5_m3 = _mm_slli_epi16(psi_i_p5_m3, 1); + psi_i_p5_m5 = _mm_mulhi_epi16(psi_i_p5_m5, ONE_OVER_SQRT_2); + psi_i_p5_m5 = _mm_slli_epi16(psi_i_p5_m5, 1); + psi_i_p5_m7 = _mm_mulhi_epi16(psi_i_p5_m7, ONE_OVER_SQRT_2); + psi_i_p5_m7 = _mm_slli_epi16(psi_i_p5_m7, 1); + psi_i_p3_p7 = _mm_mulhi_epi16(psi_i_p3_p7, ONE_OVER_SQRT_2); + psi_i_p3_p7 = _mm_slli_epi16(psi_i_p3_p7, 1); + psi_i_p3_p5 = _mm_mulhi_epi16(psi_i_p3_p5, ONE_OVER_SQRT_2); + psi_i_p3_p5 = _mm_slli_epi16(psi_i_p3_p5, 1); + psi_i_p3_p3 = _mm_mulhi_epi16(psi_i_p3_p3, ONE_OVER_SQRT_2); + psi_i_p3_p3 = _mm_slli_epi16(psi_i_p3_p3, 1); + psi_i_p3_p1 = _mm_mulhi_epi16(psi_i_p3_p1, ONE_OVER_SQRT_2); + psi_i_p3_p1 = _mm_slli_epi16(psi_i_p3_p1, 1); + psi_i_p3_m1 = _mm_mulhi_epi16(psi_i_p3_m1, ONE_OVER_SQRT_2); + psi_i_p3_m1 = _mm_slli_epi16(psi_i_p3_m1, 1); + psi_i_p3_m3 = _mm_mulhi_epi16(psi_i_p3_m3, ONE_OVER_SQRT_2); + psi_i_p3_m3 = _mm_slli_epi16(psi_i_p3_m3, 1); + psi_i_p3_m5 = _mm_mulhi_epi16(psi_i_p3_m5, ONE_OVER_SQRT_2); + psi_i_p3_m5 = _mm_slli_epi16(psi_i_p3_m5, 1); + psi_i_p3_m7 = _mm_mulhi_epi16(psi_i_p3_m7, ONE_OVER_SQRT_2); + psi_i_p3_m7 = _mm_slli_epi16(psi_i_p3_m7, 1); + psi_i_p1_p7 = _mm_mulhi_epi16(psi_i_p1_p7, ONE_OVER_SQRT_2); + psi_i_p1_p7 = _mm_slli_epi16(psi_i_p1_p7, 1); + psi_i_p1_p5 = _mm_mulhi_epi16(psi_i_p1_p5, ONE_OVER_SQRT_2); + psi_i_p1_p5 = _mm_slli_epi16(psi_i_p1_p5, 1); + psi_i_p1_p3 = _mm_mulhi_epi16(psi_i_p1_p3, ONE_OVER_SQRT_2); + psi_i_p1_p3 = _mm_slli_epi16(psi_i_p1_p3, 1); + psi_i_p1_p1 = _mm_mulhi_epi16(psi_i_p1_p1, ONE_OVER_SQRT_2); + psi_i_p1_p1 = _mm_slli_epi16(psi_i_p1_p1, 1); + psi_i_p1_m1 = _mm_mulhi_epi16(psi_i_p1_m1, ONE_OVER_SQRT_2); + psi_i_p1_m1 = _mm_slli_epi16(psi_i_p1_m1, 1); + psi_i_p1_m3 = _mm_mulhi_epi16(psi_i_p1_m3, ONE_OVER_SQRT_2); + psi_i_p1_m3 = _mm_slli_epi16(psi_i_p1_m3, 1); + psi_i_p1_m5 = _mm_mulhi_epi16(psi_i_p1_m5, ONE_OVER_SQRT_2); + psi_i_p1_m5 = _mm_slli_epi16(psi_i_p1_m5, 1); + psi_i_p1_m7 = _mm_mulhi_epi16(psi_i_p1_m7, ONE_OVER_SQRT_2); + psi_i_p1_m7 = _mm_slli_epi16(psi_i_p1_m7, 1); + psi_i_m1_p7 = _mm_mulhi_epi16(psi_i_m1_p7, ONE_OVER_SQRT_2); + psi_i_m1_p7 = _mm_slli_epi16(psi_i_m1_p7, 1); + psi_i_m1_p5 = _mm_mulhi_epi16(psi_i_m1_p5, ONE_OVER_SQRT_2); + psi_i_m1_p5 = _mm_slli_epi16(psi_i_m1_p5, 1); + psi_i_m1_p3 = _mm_mulhi_epi16(psi_i_m1_p3, ONE_OVER_SQRT_2); + psi_i_m1_p3 = _mm_slli_epi16(psi_i_m1_p3, 1); + psi_i_m1_p1 = _mm_mulhi_epi16(psi_i_m1_p1, ONE_OVER_SQRT_2); + psi_i_m1_p1 = _mm_slli_epi16(psi_i_m1_p1, 1); + psi_i_m1_m1 = _mm_mulhi_epi16(psi_i_m1_m1, ONE_OVER_SQRT_2); + psi_i_m1_m1 = _mm_slli_epi16(psi_i_m1_m1, 1); + psi_i_m1_m3 = _mm_mulhi_epi16(psi_i_m1_m3, ONE_OVER_SQRT_2); + psi_i_m1_m3 = _mm_slli_epi16(psi_i_m1_m3, 1); + psi_i_m1_m5 = _mm_mulhi_epi16(psi_i_m1_m5, ONE_OVER_SQRT_2); + psi_i_m1_m5 = _mm_slli_epi16(psi_i_m1_m5, 1); + psi_i_m1_m7 = _mm_mulhi_epi16(psi_i_m1_m7, ONE_OVER_SQRT_2); + psi_i_m1_m7 = _mm_slli_epi16(psi_i_m1_m7, 1); + psi_i_m3_p7 = _mm_mulhi_epi16(psi_i_m3_p7, ONE_OVER_SQRT_2); + psi_i_m3_p7 = _mm_slli_epi16(psi_i_m3_p7, 1); + psi_i_m3_p5 = _mm_mulhi_epi16(psi_i_m3_p5, ONE_OVER_SQRT_2); + psi_i_m3_p5 = _mm_slli_epi16(psi_i_m3_p5, 1); + psi_i_m3_p3 = _mm_mulhi_epi16(psi_i_m3_p3, ONE_OVER_SQRT_2); + psi_i_m3_p3 = _mm_slli_epi16(psi_i_m3_p3, 1); + psi_i_m3_p1 = _mm_mulhi_epi16(psi_i_m3_p1, ONE_OVER_SQRT_2); + psi_i_m3_p1 = _mm_slli_epi16(psi_i_m3_p1, 1); + psi_i_m3_m1 = _mm_mulhi_epi16(psi_i_m3_m1, ONE_OVER_SQRT_2); + psi_i_m3_m1 = _mm_slli_epi16(psi_i_m3_m1, 1); + psi_i_m3_m3 = _mm_mulhi_epi16(psi_i_m3_m3, ONE_OVER_SQRT_2); + psi_i_m3_m3 = _mm_slli_epi16(psi_i_m3_m3, 1); + psi_i_m3_m5 = _mm_mulhi_epi16(psi_i_m3_m5, ONE_OVER_SQRT_2); + psi_i_m3_m5 = _mm_slli_epi16(psi_i_m3_m5, 1); + psi_i_m3_m7 = _mm_mulhi_epi16(psi_i_m3_m7, ONE_OVER_SQRT_2); + psi_i_m3_m7 = _mm_slli_epi16(psi_i_m3_m7, 1); + psi_i_m5_p7 = _mm_mulhi_epi16(psi_i_m5_p7, ONE_OVER_SQRT_2); + psi_i_m5_p7 = _mm_slli_epi16(psi_i_m5_p7, 1); + psi_i_m5_p5 = _mm_mulhi_epi16(psi_i_m5_p5, ONE_OVER_SQRT_2); + psi_i_m5_p5 = _mm_slli_epi16(psi_i_m5_p5, 1); + psi_i_m5_p3 = _mm_mulhi_epi16(psi_i_m5_p3, ONE_OVER_SQRT_2); + psi_i_m5_p3 = _mm_slli_epi16(psi_i_m5_p3, 1); + psi_i_m5_p1 = _mm_mulhi_epi16(psi_i_m5_p1, ONE_OVER_SQRT_2); + psi_i_m5_p1 = _mm_slli_epi16(psi_i_m5_p1, 1); + psi_i_m5_m1 = _mm_mulhi_epi16(psi_i_m5_m1, ONE_OVER_SQRT_2); + psi_i_m5_m1 = _mm_slli_epi16(psi_i_m5_m1, 1); + psi_i_m5_m3 = _mm_mulhi_epi16(psi_i_m5_m3, ONE_OVER_SQRT_2); + psi_i_m5_m3 = _mm_slli_epi16(psi_i_m5_m3, 1); + psi_i_m5_m5 = _mm_mulhi_epi16(psi_i_m5_m5, ONE_OVER_SQRT_2); + psi_i_m5_m5 = _mm_slli_epi16(psi_i_m5_m5, 1); + psi_i_m5_m7 = _mm_mulhi_epi16(psi_i_m5_m7, ONE_OVER_SQRT_2); + psi_i_m5_m7 = _mm_slli_epi16(psi_i_m5_m7, 1); + psi_i_m7_p7 = _mm_mulhi_epi16(psi_i_m7_p7, ONE_OVER_SQRT_2); + psi_i_m7_p7 = _mm_slli_epi16(psi_i_m7_p7, 1); + psi_i_m7_p5 = _mm_mulhi_epi16(psi_i_m7_p5, ONE_OVER_SQRT_2); + psi_i_m7_p5 = _mm_slli_epi16(psi_i_m7_p5, 1); + psi_i_m7_p3 = _mm_mulhi_epi16(psi_i_m7_p3, ONE_OVER_SQRT_2); + psi_i_m7_p3 = _mm_slli_epi16(psi_i_m7_p3, 1); + psi_i_m7_p1 = _mm_mulhi_epi16(psi_i_m7_p1, ONE_OVER_SQRT_2); + psi_i_m7_p1 = _mm_slli_epi16(psi_i_m7_p1, 1); + psi_i_m7_m1 = _mm_mulhi_epi16(psi_i_m7_m1, ONE_OVER_SQRT_2); + psi_i_m7_m1 = _mm_slli_epi16(psi_i_m7_m1, 1); + psi_i_m7_m3 = _mm_mulhi_epi16(psi_i_m7_m3, ONE_OVER_SQRT_2); + psi_i_m7_m3 = _mm_slli_epi16(psi_i_m7_m3, 1); + psi_i_m7_m5 = _mm_mulhi_epi16(psi_i_m7_m5, ONE_OVER_SQRT_2); + psi_i_m7_m5 = _mm_slli_epi16(psi_i_m7_m5, 1); + psi_i_m7_m7 = _mm_mulhi_epi16(psi_i_m7_m7, ONE_OVER_SQRT_2); + psi_i_m7_m7 = _mm_slli_epi16(psi_i_m7_m7, 1); + + psi_a_p7_p7 = _mm_adds_epi16(psi_r_p7_p7, psi_i_p7_p7); + psi_a_p7_p5 = _mm_adds_epi16(psi_r_p7_p5, psi_i_p7_p5); + psi_a_p7_p3 = _mm_adds_epi16(psi_r_p7_p3, psi_i_p7_p3); + psi_a_p7_p1 = _mm_adds_epi16(psi_r_p7_p1, psi_i_p7_p1); + psi_a_p7_m1 = _mm_adds_epi16(psi_r_p7_m1, psi_i_p7_m1); + psi_a_p7_m3 = _mm_adds_epi16(psi_r_p7_m3, psi_i_p7_m3); + psi_a_p7_m5 = _mm_adds_epi16(psi_r_p7_m5, psi_i_p7_m5); + psi_a_p7_m7 = _mm_adds_epi16(psi_r_p7_m7, psi_i_p7_m7); + psi_a_p5_p7 = _mm_adds_epi16(psi_r_p5_p7, psi_i_p5_p7); + psi_a_p5_p5 = _mm_adds_epi16(psi_r_p5_p5, psi_i_p5_p5); + psi_a_p5_p3 = _mm_adds_epi16(psi_r_p5_p3, psi_i_p5_p3); + psi_a_p5_p1 = _mm_adds_epi16(psi_r_p5_p1, psi_i_p5_p1); + psi_a_p5_m1 = _mm_adds_epi16(psi_r_p5_m1, psi_i_p5_m1); + psi_a_p5_m3 = _mm_adds_epi16(psi_r_p5_m3, psi_i_p5_m3); + psi_a_p5_m5 = _mm_adds_epi16(psi_r_p5_m5, psi_i_p5_m5); + psi_a_p5_m7 = _mm_adds_epi16(psi_r_p5_m7, psi_i_p5_m7); + psi_a_p3_p7 = _mm_adds_epi16(psi_r_p3_p7, psi_i_p3_p7); + psi_a_p3_p5 = _mm_adds_epi16(psi_r_p3_p5, psi_i_p3_p5); + psi_a_p3_p3 = _mm_adds_epi16(psi_r_p3_p3, psi_i_p3_p3); + psi_a_p3_p1 = _mm_adds_epi16(psi_r_p3_p1, psi_i_p3_p1); + psi_a_p3_m1 = _mm_adds_epi16(psi_r_p3_m1, psi_i_p3_m1); + psi_a_p3_m3 = _mm_adds_epi16(psi_r_p3_m3, psi_i_p3_m3); + psi_a_p3_m5 = _mm_adds_epi16(psi_r_p3_m5, psi_i_p3_m5); + psi_a_p3_m7 = _mm_adds_epi16(psi_r_p3_m7, psi_i_p3_m7); + psi_a_p1_p7 = _mm_adds_epi16(psi_r_p1_p7, psi_i_p1_p7); + psi_a_p1_p5 = _mm_adds_epi16(psi_r_p1_p5, psi_i_p1_p5); + psi_a_p1_p3 = _mm_adds_epi16(psi_r_p1_p3, psi_i_p1_p3); + psi_a_p1_p1 = _mm_adds_epi16(psi_r_p1_p1, psi_i_p1_p1); + psi_a_p1_m1 = _mm_adds_epi16(psi_r_p1_m1, psi_i_p1_m1); + psi_a_p1_m3 = _mm_adds_epi16(psi_r_p1_m3, psi_i_p1_m3); + psi_a_p1_m5 = _mm_adds_epi16(psi_r_p1_m5, psi_i_p1_m5); + psi_a_p1_m7 = _mm_adds_epi16(psi_r_p1_m7, psi_i_p1_m7); + psi_a_m1_p7 = _mm_adds_epi16(psi_r_m1_p7, psi_i_m1_p7); + psi_a_m1_p5 = _mm_adds_epi16(psi_r_m1_p5, psi_i_m1_p5); + psi_a_m1_p3 = _mm_adds_epi16(psi_r_m1_p3, psi_i_m1_p3); + psi_a_m1_p1 = _mm_adds_epi16(psi_r_m1_p1, psi_i_m1_p1); + psi_a_m1_m1 = _mm_adds_epi16(psi_r_m1_m1, psi_i_m1_m1); + psi_a_m1_m3 = _mm_adds_epi16(psi_r_m1_m3, psi_i_m1_m3); + psi_a_m1_m5 = _mm_adds_epi16(psi_r_m1_m5, psi_i_m1_m5); + psi_a_m1_m7 = _mm_adds_epi16(psi_r_m1_m7, psi_i_m1_m7); + psi_a_m3_p7 = _mm_adds_epi16(psi_r_m3_p7, psi_i_m3_p7); + psi_a_m3_p5 = _mm_adds_epi16(psi_r_m3_p5, psi_i_m3_p5); + psi_a_m3_p3 = _mm_adds_epi16(psi_r_m3_p3, psi_i_m3_p3); + psi_a_m3_p1 = _mm_adds_epi16(psi_r_m3_p1, psi_i_m3_p1); + psi_a_m3_m1 = _mm_adds_epi16(psi_r_m3_m1, psi_i_m3_m1); + psi_a_m3_m3 = _mm_adds_epi16(psi_r_m3_m3, psi_i_m3_m3); + psi_a_m3_m5 = _mm_adds_epi16(psi_r_m3_m5, psi_i_m3_m5); + psi_a_m3_m7 = _mm_adds_epi16(psi_r_m3_m7, psi_i_m3_m7); + psi_a_m5_p7 = _mm_adds_epi16(psi_r_m5_p7, psi_i_m5_p7); + psi_a_m5_p5 = _mm_adds_epi16(psi_r_m5_p5, psi_i_m5_p5); + psi_a_m5_p3 = _mm_adds_epi16(psi_r_m5_p3, psi_i_m5_p3); + psi_a_m5_p1 = _mm_adds_epi16(psi_r_m5_p1, psi_i_m5_p1); + psi_a_m5_m1 = _mm_adds_epi16(psi_r_m5_m1, psi_i_m5_m1); + psi_a_m5_m3 = _mm_adds_epi16(psi_r_m5_m3, psi_i_m5_m3); + psi_a_m5_m5 = _mm_adds_epi16(psi_r_m5_m5, psi_i_m5_m5); + psi_a_m5_m7 = _mm_adds_epi16(psi_r_m5_m7, psi_i_m5_m7); + psi_a_m7_p7 = _mm_adds_epi16(psi_r_m7_p7, psi_i_m7_p7); + psi_a_m7_p5 = _mm_adds_epi16(psi_r_m7_p5, psi_i_m7_p5); + psi_a_m7_p3 = _mm_adds_epi16(psi_r_m7_p3, psi_i_m7_p3); + psi_a_m7_p1 = _mm_adds_epi16(psi_r_m7_p1, psi_i_m7_p1); + psi_a_m7_m1 = _mm_adds_epi16(psi_r_m7_m1, psi_i_m7_m1); + psi_a_m7_m3 = _mm_adds_epi16(psi_r_m7_m3, psi_i_m7_m3); + psi_a_m7_m5 = _mm_adds_epi16(psi_r_m7_m5, psi_i_m7_m5); + psi_a_m7_m7 = _mm_adds_epi16(psi_r_m7_m7, psi_i_m7_m7); + + // Computing different multiples of ||h0||^2 + // x=1, y=1 + ch_mag_2_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,ONE_OVER_FOUR_SQRT_42); + ch_mag_2_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_2_over_42_with_sigma2,1); + // x=1, y=3 + ch_mag_10_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FIVE_OVER_FOUR_SQRT_42); + ch_mag_10_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_10_over_42_with_sigma2,1); + // x=1, x=5 + ch_mag_26_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTEEN_OVER_FOUR_SQRT_42); + ch_mag_26_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_26_over_42_with_sigma2,1); + // x=1, y=7 + ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42); + ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1); + // x=3, y=3 + ch_mag_18_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,NINE_OVER_FOUR_SQRT_42); + ch_mag_18_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_18_over_42_with_sigma2,1); + // x=3, y=5 + ch_mag_34_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,SEVENTEEN_OVER_FOUR_SQRT_42); + ch_mag_34_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_34_over_42_with_sigma2,1); + // x=3, y=7 + ch_mag_58_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYNINE_OVER_FOUR_SQRT_42); + ch_mag_58_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_58_over_42_with_sigma2,2); + // x=5, y=5 + ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42); + ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1); + // x=5, y=7 + ch_mag_74_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTYSEVEN_OVER_FOUR_SQRT_42); + ch_mag_74_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_74_over_42_with_sigma2,2); + // x=7, y=7 + ch_mag_98_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FORTYNINE_OVER_FOUR_SQRT_42); + ch_mag_98_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_98_over_42_with_sigma2,2); + + // Computing Metrics + xmm1 = _mm_adds_epi16(psi_a_p7_p7, y0_p_7_7); + bit_met_p7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p7_p5, y0_p_7_5); + bit_met_p7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p7_p3, y0_p_7_3); + bit_met_p7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p7_p1, y0_p_7_1); + bit_met_p7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p7_m1, y0_m_7_1); + bit_met_p7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p7_m3, y0_m_7_3); + bit_met_p7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p7_m5, y0_m_7_5); + bit_met_p7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p7_m7, y0_m_7_7); + bit_met_p7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p5_p7, y0_p_5_7); + bit_met_p5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p5_p5, y0_p_5_5); + bit_met_p5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p5_p3, y0_p_5_3); + bit_met_p5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p5_p1, y0_p_5_1); + bit_met_p5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p5_m1, y0_m_5_1); + bit_met_p5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p5_m3, y0_m_5_3); + bit_met_p5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p5_m5, y0_m_5_5); + bit_met_p5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p5_m7, y0_m_5_7); + bit_met_p5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p3_p7, y0_p_3_7); + bit_met_p3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p3_p5, y0_p_3_5); + bit_met_p3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p3_p3, y0_p_3_3); + bit_met_p3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p3_p1, y0_p_3_1); + bit_met_p3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p3_m1, y0_m_3_1); + bit_met_p3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p3_m3, y0_m_3_3); + bit_met_p3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p3_m5, y0_m_3_5); + bit_met_p3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p3_m7, y0_m_3_7); + bit_met_p3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p1_p7, y0_p_1_7); + bit_met_p1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p1_p5, y0_p_1_5); + bit_met_p1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p1_p3, y0_p_1_3); + bit_met_p1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p1_p1, y0_p_1_1); + bit_met_p1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p1_m1, y0_m_1_1); + bit_met_p1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p1_m3, y0_m_1_3); + bit_met_p1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p1_m5, y0_m_1_5); + bit_met_p1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm1 = _mm_adds_epi16(psi_a_p1_m7, y0_m_1_7); + bit_met_p1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + + xmm1 = _mm_subs_epi16(psi_a_m1_p7, y0_m_1_7); + bit_met_m1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m1_p5, y0_m_1_5); + bit_met_m1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m1_p3, y0_m_1_3); + bit_met_m1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m1_p1, y0_m_1_1); + bit_met_m1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m1_m1, y0_p_1_1); + bit_met_m1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m1_m3, y0_p_1_3); + bit_met_m1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m1_m5, y0_p_1_5); + bit_met_m1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m1_m7, y0_p_1_7); + bit_met_m1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m3_p7, y0_m_3_7); + bit_met_m3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m3_p5, y0_m_3_5); + bit_met_m3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m3_p3, y0_m_3_3); + bit_met_m3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m3_p1, y0_m_3_1); + bit_met_m3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m3_m1, y0_p_3_1); + bit_met_m3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m3_m3, y0_p_3_3); + bit_met_m3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m3_m5, y0_p_3_5); + bit_met_m3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m3_m7, y0_p_3_7); + bit_met_m3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m5_p7, y0_m_5_7); + bit_met_m5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m5_p5, y0_m_5_5); + bit_met_m5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m5_p3, y0_m_5_3); + bit_met_m5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m5_p1, y0_m_5_1); + bit_met_m5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m5_m1, y0_p_5_1); + bit_met_m5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m5_m3, y0_p_5_3); + bit_met_m5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m5_m5, y0_p_5_5); + bit_met_m5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m5_m7, y0_p_5_7); + bit_met_m5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m7_p7, y0_m_7_7); + bit_met_m7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m7_p5, y0_m_7_5); + bit_met_m7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m7_p3, y0_m_7_3); + bit_met_m7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m7_p1, y0_m_7_1); + bit_met_m7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m7_m1, y0_p_7_1); + bit_met_m7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m7_m3, y0_p_7_3); + bit_met_m7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m7_m5, y0_p_7_5); + bit_met_m7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm1 = _mm_subs_epi16(psi_a_m7_m7, y0_p_7_7); + bit_met_m7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); + + // Detection for 1st bit (LTE mapping) + // bit = 1 + xmm0 = _mm_max_epi16(bit_met_m7_p7, bit_met_m7_p5); + xmm1 = _mm_max_epi16(bit_met_m7_p3, bit_met_m7_p1); + xmm2 = _mm_max_epi16(bit_met_m7_m1, bit_met_m7_m3); + xmm3 = _mm_max_epi16(bit_met_m7_m5, bit_met_m7_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_m5_p7, bit_met_m5_p5); + xmm1 = _mm_max_epi16(bit_met_m5_p3, bit_met_m5_p1); + xmm2 = _mm_max_epi16(bit_met_m5_m1, bit_met_m5_m3); + xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m5_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_m3_p7, bit_met_m3_p5); + xmm1 = _mm_max_epi16(bit_met_m3_p3, bit_met_m3_p1); + xmm2 = _mm_max_epi16(bit_met_m3_m1, bit_met_m3_m3); + xmm3 = _mm_max_epi16(bit_met_m3_m5, bit_met_m3_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_m1_p7, bit_met_m1_p5); + xmm1 = _mm_max_epi16(bit_met_m1_p3, bit_met_m1_p1); + xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m1_m3); + xmm3 = _mm_max_epi16(bit_met_m1_m5, bit_met_m1_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + + // bit = 0 + xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p7_p5); + xmm1 = _mm_max_epi16(bit_met_p7_p3, bit_met_p7_p1); + xmm2 = _mm_max_epi16(bit_met_p7_m1, bit_met_p7_m3); + xmm3 = _mm_max_epi16(bit_met_p7_m5, bit_met_p7_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_p5_p7, bit_met_p5_p5); + xmm1 = _mm_max_epi16(bit_met_p5_p3, bit_met_p5_p1); + xmm2 = _mm_max_epi16(bit_met_p5_m1, bit_met_p5_m3); + xmm3 = _mm_max_epi16(bit_met_p5_m5, bit_met_p5_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p3_p7, bit_met_p3_p5); + xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p3_p1); + xmm2 = _mm_max_epi16(bit_met_p3_m1, bit_met_p3_m3); + xmm3 = _mm_max_epi16(bit_met_p3_m5, bit_met_p3_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p1_p7, bit_met_p1_p5); + xmm1 = _mm_max_epi16(bit_met_p1_p3, bit_met_p1_p1); + xmm2 = _mm_max_epi16(bit_met_p1_m1, bit_met_p1_m3); + xmm3 = _mm_max_epi16(bit_met_p1_m5, bit_met_p1_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + + y0r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + // Detection for 2nd bit (LTE mapping) + // bit = 1 + xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1); + xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1); + xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1); + xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3); + xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3); + xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3); + xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5); + xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5); + xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5); + xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7); + xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7); + xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7); + xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + + // bit = 0 + xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1); + xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1); + xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1); + xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3); + xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3); + xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3); + xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5); + xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5); + xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5); + xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7); + xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7); + xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7); + xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + + y1r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + // Detection for 3rd bit (LTE mapping) + xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5); + xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1); + xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3); + xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5); + xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1); + xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3); + xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5); + xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1); + xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3); + xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5); + xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1); + xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3); + xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + + xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5); + xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1); + xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3); + xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5); + xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1); + xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3); + xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5); + xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1); + xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3); + xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5); + xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1); + xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3); + xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + + y2r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + // Detection for 4th bit (LTE mapping) + xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7); + xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7); + xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7); + xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5); + xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5); + xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5); + xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p5); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5); + xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5); + xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5); + xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7); + xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7); + xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7); + xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + + xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1); + xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1); + xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1); + xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3); + xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3); + xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3); + xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1); + xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1); + xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1); + xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3); + xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3); + xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3); + xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + + y0i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + + // Detection for 5th bit (LTE mapping) + xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5); + xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1); + xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3); + xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5); + xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1); + xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3); + xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5); + xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1); + xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3); + xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5); + xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1); + xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3); + xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + + xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5); + xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1); + xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3); + xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5); + xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1); + xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3); + xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5); + xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1); + xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3); + xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5); + xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1); + xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3); + xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + + y1i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + // Detection for 6th bit (LTE mapping) + xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7); + xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7); + xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7); + xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1); + xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1); + xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1); + xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p1); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1); + xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1); + xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1); + xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7); + xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7); + xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7); + xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + + xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5); + xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5); + xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5); + xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3); + xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3); + xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3); + xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3); + xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3); + xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3); + xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5); + xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5); + xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5); + xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + + y2i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + + // map to output stream, difficult to do in SIMD since we have 6 16bit LLRs + // RE 1 + j = 24*i; + stream0_out[j + 0] = ((short *)&y0r)[0]; + stream0_out[j + 1] = ((short *)&y1r)[0]; + stream0_out[j + 2] = ((short *)&y2r)[0]; + stream0_out[j + 3] = ((short *)&y0i)[0]; + stream0_out[j + 4] = ((short *)&y1i)[0]; + stream0_out[j + 5] = ((short *)&y2i)[0]; + // RE 2 + stream0_out[j + 6] = ((short *)&y0r)[1]; + stream0_out[j + 7] = ((short *)&y1r)[1]; + stream0_out[j + 8] = ((short *)&y2r)[1]; + stream0_out[j + 9] = ((short *)&y0i)[1]; + stream0_out[j + 10] = ((short *)&y1i)[1]; + stream0_out[j + 11] = ((short *)&y2i)[1]; + // RE 3 + stream0_out[j + 12] = ((short *)&y0r)[2]; + stream0_out[j + 13] = ((short *)&y1r)[2]; + stream0_out[j + 14] = ((short *)&y2r)[2]; + stream0_out[j + 15] = ((short *)&y0i)[2]; + stream0_out[j + 16] = ((short *)&y1i)[2]; + stream0_out[j + 17] = ((short *)&y2i)[2]; + // RE 4 + stream0_out[j + 18] = ((short *)&y0r)[3]; + stream0_out[j + 19] = ((short *)&y1r)[3]; + stream0_out[j + 20] = ((short *)&y2r)[3]; + stream0_out[j + 21] = ((short *)&y0i)[3]; + stream0_out[j + 22] = ((short *)&y1i)[3]; + stream0_out[j + 23] = ((short *)&y2i)[3]; + // RE 5 + stream0_out[j + 24] = ((short *)&y0r)[4]; + stream0_out[j + 25] = ((short *)&y1r)[4]; + stream0_out[j + 26] = ((short *)&y2r)[4]; + stream0_out[j + 27] = ((short *)&y0i)[4]; + stream0_out[j + 28] = ((short *)&y1i)[4]; + stream0_out[j + 29] = ((short *)&y2i)[4]; + // RE 6 + stream0_out[j + 30] = ((short *)&y0r)[5]; + stream0_out[j + 31] = ((short *)&y1r)[5]; + stream0_out[j + 32] = ((short *)&y2r)[5]; + stream0_out[j + 33] = ((short *)&y0i)[5]; + stream0_out[j + 34] = ((short *)&y1i)[5]; + stream0_out[j + 35] = ((short *)&y2i)[5]; + // RE 7 + stream0_out[j + 36] = ((short *)&y0r)[6]; + stream0_out[j + 37] = ((short *)&y1r)[6]; + stream0_out[j + 38] = ((short *)&y2r)[6]; + stream0_out[j + 39] = ((short *)&y0i)[6]; + stream0_out[j + 40] = ((short *)&y1i)[6]; + stream0_out[j + 41] = ((short *)&y2i)[6]; + // RE 8 + stream0_out[j + 42] = ((short *)&y0r)[7]; + stream0_out[j + 43] = ((short *)&y1r)[7]; + stream0_out[j + 44] = ((short *)&y2r)[7]; + stream0_out[j + 45] = ((short *)&y0i)[7]; + stream0_out[j + 46] = ((short *)&y1i)[7]; + stream0_out[j + 47] = ((short *)&y2i)[7]; +#elif defined(__arm__) + +#endif + } + +#if defined(__x86_64__) || defined(__i386__) + _mm_empty(); + _m_empty(); +#endif +} + + +int nr_dlsch_64qam_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, + int32_t **rxdataF_comp, + int32_t **rxdataF_comp_i, + int32_t **dl_ch_mag, + int32_t **rho_i, + int16_t *dlsch_llr, + uint8_t symbol, + uint8_t first_symbol_flag, + uint16_t nb_rb, + uint16_t pbch_pss_sss_adjust, + int16_t **llr16p) +{ + + int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *llr16; + int len; + uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; + + //first symbol has different structure due to more pilots + if (first_symbol_flag == 1) { + llr16 = (int16_t*)dlsch_llr; + } else { + llr16 = (int16_t*)(*llr16p); + } + + AssertFatal(llr16!=NULL,"nr_dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol); + + if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { + // if symbol has pilots + if (frame_parms->nb_antenna_ports_eNB!=1) + // in 2 antenna ports we have 8 REs per symbol per RB + len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); + else + // for 1 antenna port we have 10 REs per symbol per RB + len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); + } else { + // symbol has no pilots + len = (nb_rb*12) - pbch_pss_sss_adjust; + } + + qam64_qpsk((short *)rxF, + (short *)rxF_i, + (short *)ch_mag, + (short *)llr16, + (short *)rho, + len); + + llr16 += (6*len); + *llr16p = (short *)llr16; + return(0); +} + + + +void qam64_qam16(short *stream0_in, + short *stream1_in, + short *ch_mag, + short *ch_mag_i, + short *stream0_out, + short *rho01, + int length + ) +{ + + /* + Author: S. Wagner + Date: 31-07-12 + + Input: + stream0_in: MF filter for 1st stream, i.e., y0=h0'*y + stream1_in: MF filter for 2nd stream, i.e., y1=h1'*y + ch_mag: 4*h0/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc + ch_mag_i: 4*h1/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc + rho01: Channel cross correlation, i.e., h1'*h0 + + Output: + stream0_out: output LLRs for 1st stream + */ + +#if defined(__x86_64__) || defined(__i386__) + + __m128i *rho01_128i = (__m128i *)rho01; + __m128i *stream0_128i_in = (__m128i *)stream0_in; + __m128i *stream1_128i_in = (__m128i *)stream1_in; + __m128i *ch_mag_128i = (__m128i *)ch_mag; + __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i; + + __m128i ONE_OVER_SQRT_42 = _mm_set1_epi16(10112); // round(1/sqrt(42)*2^16) + __m128i THREE_OVER_SQRT_42 = _mm_set1_epi16(30337); // round(3/sqrt(42)*2^16) + __m128i FIVE_OVER_SQRT_42 = _mm_set1_epi16(25281); // round(5/sqrt(42)*2^15) + __m128i SEVEN_OVER_SQRT_42 = _mm_set1_epi16(17697); // round(5/sqrt(42)*2^15) + __m128i FORTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(30969); // round(49/(4*sqrt(42))*2^14), Q2.14 + __m128i THIRTYSEVEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(23385); // round(37/(4*sqrt(42))*2^14), Q2.14 + __m128i TWENTYFIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(31601); // round(25/(4*sqrt(42))*2^15) + __m128i TWENTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(18329); // round(29/(4*sqrt(42))*2^15), Q2.14 + __m128i SEVENTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(21489); // round(17/(4*sqrt(42))*2^15) + __m128i NINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(11376); // round(9/(4*sqrt(42))*2^15) + __m128i THIRTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(16433); // round(13/(4*sqrt(42))*2^15) + __m128i FIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(6320); // round(5/(4*sqrt(42))*2^15) + __m128i ONE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(1264); // round(1/(4*sqrt(42))*2^15) + __m128i ONE_OVER_SQRT_10_Q15 = _mm_set1_epi16(10362); // round(1/sqrt(10)*2^15) + __m128i THREE_OVER_SQRT_10 = _mm_set1_epi16(31086); // round(3/sqrt(10)*2^15) + __m128i SQRT_10_OVER_FOUR = _mm_set1_epi16(25905); // round(sqrt(10)/4*2^15) + + + __m128i ch_mag_int; + __m128i ch_mag_des; + __m128i ch_mag_98_over_42_with_sigma2; + __m128i ch_mag_74_over_42_with_sigma2; + __m128i ch_mag_58_over_42_with_sigma2; + __m128i ch_mag_50_over_42_with_sigma2; + __m128i ch_mag_34_over_42_with_sigma2; + __m128i ch_mag_18_over_42_with_sigma2; + __m128i ch_mag_26_over_42_with_sigma2; + __m128i ch_mag_10_over_42_with_sigma2; + __m128i ch_mag_2_over_42_with_sigma2; + __m128i y0r_one_over_sqrt_21; + __m128i y0r_three_over_sqrt_21; + __m128i y0r_five_over_sqrt_21; + __m128i y0r_seven_over_sqrt_21; + __m128i y0i_one_over_sqrt_21; + __m128i y0i_three_over_sqrt_21; + __m128i y0i_five_over_sqrt_21; + __m128i y0i_seven_over_sqrt_21; + +#elif defined(__arm__) + +#endif + int i,j; + + + + for (i=0; i>2; i+=2) { + +#if defined(__x86_64__) || defined(__i386__) + // Get rho + xmm0 = rho01_128i[i]; + xmm1 = rho01_128i[i+1]; + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho) + xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho) + rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho) + rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho) + + // Compute the different rhos + rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42); + rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42); + rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42); + rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42); + rho_rpi_5_5 = _mm_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42); + rho_rmi_5_5 = _mm_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42); + rho_rpi_7_7 = _mm_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42); + rho_rmi_7_7 = _mm_mulhi_epi16(rho_rmi, SEVEN_OVER_SQRT_42); + + rho_rpi_5_5 = _mm_slli_epi16(rho_rpi_5_5, 1); + rho_rmi_5_5 = _mm_slli_epi16(rho_rmi_5_5, 1); + rho_rpi_7_7 = _mm_slli_epi16(rho_rpi_7_7, 2); + rho_rmi_7_7 = _mm_slli_epi16(rho_rmi_7_7, 2); + + xmm4 = _mm_mulhi_epi16(xmm2, ONE_OVER_SQRT_42); + xmm5 = _mm_mulhi_epi16(xmm3, ONE_OVER_SQRT_42); + xmm6 = _mm_mulhi_epi16(xmm3, THREE_OVER_SQRT_42); + xmm7 = _mm_mulhi_epi16(xmm3, FIVE_OVER_SQRT_42); + xmm8 = _mm_mulhi_epi16(xmm3, SEVEN_OVER_SQRT_42); + xmm7 = _mm_slli_epi16(xmm7, 1); + xmm8 = _mm_slli_epi16(xmm8, 2); + + rho_rpi_1_3 = _mm_adds_epi16(xmm4, xmm6); + rho_rmi_1_3 = _mm_subs_epi16(xmm4, xmm6); + rho_rpi_1_5 = _mm_adds_epi16(xmm4, xmm7); + rho_rmi_1_5 = _mm_subs_epi16(xmm4, xmm7); + rho_rpi_1_7 = _mm_adds_epi16(xmm4, xmm8); + rho_rmi_1_7 = _mm_subs_epi16(xmm4, xmm8); + + xmm4 = _mm_mulhi_epi16(xmm2, THREE_OVER_SQRT_42); + rho_rpi_3_1 = _mm_adds_epi16(xmm4, xmm5); + rho_rmi_3_1 = _mm_subs_epi16(xmm4, xmm5); + rho_rpi_3_5 = _mm_adds_epi16(xmm4, xmm7); + rho_rmi_3_5 = _mm_subs_epi16(xmm4, xmm7); + rho_rpi_3_7 = _mm_adds_epi16(xmm4, xmm8); + rho_rmi_3_7 = _mm_subs_epi16(xmm4, xmm8); + + xmm4 = _mm_mulhi_epi16(xmm2, FIVE_OVER_SQRT_42); + xmm4 = _mm_slli_epi16(xmm4, 1); + rho_rpi_5_1 = _mm_adds_epi16(xmm4, xmm5); + rho_rmi_5_1 = _mm_subs_epi16(xmm4, xmm5); + rho_rpi_5_3 = _mm_adds_epi16(xmm4, xmm6); + rho_rmi_5_3 = _mm_subs_epi16(xmm4, xmm6); + rho_rpi_5_7 = _mm_adds_epi16(xmm4, xmm8); + rho_rmi_5_7 = _mm_subs_epi16(xmm4, xmm8); + + xmm4 = _mm_mulhi_epi16(xmm2, SEVEN_OVER_SQRT_42); + xmm4 = _mm_slli_epi16(xmm4, 2); + rho_rpi_7_1 = _mm_adds_epi16(xmm4, xmm5); + rho_rmi_7_1 = _mm_subs_epi16(xmm4, xmm5); + rho_rpi_7_3 = _mm_adds_epi16(xmm4, xmm6); + rho_rmi_7_3 = _mm_subs_epi16(xmm4, xmm6); + rho_rpi_7_5 = _mm_adds_epi16(xmm4, xmm7); + rho_rmi_7_5 = _mm_subs_epi16(xmm4, xmm7); + + // Rearrange interfering MF output + xmm0 = stream1_128i_in[i]; + xmm1 = stream1_128i_in[i+1]; + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] + y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)] + + // Psi_r calculation from rho_rpi or rho_rmi + xmm0 = _mm_setzero_si128(); // ZERO for abs_pi16 + xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1r); + psi_r_p7_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1r); + psi_r_p7_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1r); + psi_r_p7_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1r); + psi_r_p7_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1r); + psi_r_p7_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1r); + psi_r_p7_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1r); + psi_r_p7_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1r); + psi_r_p7_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1r); + psi_r_p5_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1r); + psi_r_p5_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1r); + psi_r_p5_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1r); + psi_r_p5_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1r); + psi_r_p5_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1r); + psi_r_p5_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1r); + psi_r_p5_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1r); + psi_r_p5_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1r); + psi_r_p3_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1r); + psi_r_p3_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1r); + psi_r_p3_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1r); + psi_r_p3_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1r); + psi_r_p3_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1r); + psi_r_p3_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1r); + psi_r_p3_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1r); + psi_r_p3_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1r); + psi_r_p1_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1r); + psi_r_p1_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1r); + psi_r_p1_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1r); + psi_r_p1_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1r); + psi_r_p1_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1r); + psi_r_p1_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1r); + psi_r_p1_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1r); + psi_r_p1_m7 = _mm_abs_epi16(xmm2); + + xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1r); + psi_r_m1_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1r); + psi_r_m1_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1r); + psi_r_m1_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1r); + psi_r_m1_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1r); + psi_r_m1_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1r); + psi_r_m1_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1r); + psi_r_m1_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1r); + psi_r_m1_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1r); + psi_r_m3_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1r); + psi_r_m3_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1r); + psi_r_m3_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1r); + psi_r_m3_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1r); + psi_r_m3_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1r); + psi_r_m3_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1r); + psi_r_m3_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1r); + psi_r_m3_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1r); + psi_r_m5_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1r); + psi_r_m5_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1r); + psi_r_m5_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1r); + psi_r_m5_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1r); + psi_r_m5_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1r); + psi_r_m5_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1r); + psi_r_m5_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1r); + psi_r_m5_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1r); + psi_r_m7_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1r); + psi_r_m7_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1r); + psi_r_m7_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1r); + psi_r_m7_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1r); + psi_r_m7_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1r); + psi_r_m7_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1r); + psi_r_m7_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1r); + psi_r_m7_m7 = _mm_abs_epi16(xmm2); + + // Psi_i calculation from rho_rpi or rho_rmi + xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1i); + psi_i_p7_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1i); + psi_i_p7_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1i); + psi_i_p7_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1i); + psi_i_p7_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1i); + psi_i_p7_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1i); + psi_i_p7_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1i); + psi_i_p7_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1i); + psi_i_p7_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1i); + psi_i_p5_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1i); + psi_i_p5_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1i); + psi_i_p5_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1i); + psi_i_p5_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1i); + psi_i_p5_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1i); + psi_i_p5_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1i); + psi_i_p5_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1i); + psi_i_p5_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1i); + psi_i_p3_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1i); + psi_i_p3_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1i); + psi_i_p3_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1i); + psi_i_p3_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1i); + psi_i_p3_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1i); + psi_i_p3_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1i); + psi_i_p3_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1i); + psi_i_p3_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1i); + psi_i_p1_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1i); + psi_i_p1_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1i); + psi_i_p1_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1i); + psi_i_p1_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1i); + psi_i_p1_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1i); + psi_i_p1_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1i); + psi_i_p1_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1i); + psi_i_p1_m7 = _mm_abs_epi16(xmm2); + + xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1i); + psi_i_m1_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1i); + psi_i_m1_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1i); + psi_i_m1_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1i); + psi_i_m1_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1i); + psi_i_m1_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1i); + psi_i_m1_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1i); + psi_i_m1_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1i); + psi_i_m1_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1i); + psi_i_m3_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1i); + psi_i_m3_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1i); + psi_i_m3_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1i); + psi_i_m3_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1i); + psi_i_m3_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1i); + psi_i_m3_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1i); + psi_i_m3_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1i); + psi_i_m3_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1i); + psi_i_m5_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1i); + psi_i_m5_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1i); + psi_i_m5_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1i); + psi_i_m5_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1i); + psi_i_m5_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1i); + psi_i_m5_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1i); + psi_i_m5_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1i); + psi_i_m5_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1i); + psi_i_m7_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1i); + psi_i_m7_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1i); + psi_i_m7_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1i); + psi_i_m7_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1i); + psi_i_m7_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1i); + psi_i_m7_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1i); + psi_i_m7_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1i); + psi_i_m7_m7 = _mm_abs_epi16(xmm2); + + + // Rearrange desired MF output + xmm0 = stream0_128i_in[i]; + xmm1 = stream0_128i_in[i+1]; + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] + y0i = _mm_unpackhi_epi64(xmm0,xmm1); + + // Rearrange desired channel magnitudes + xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10)) + xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10)) + xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3); + + // Rearrange interfering channel magnitudes + xmm2 = ch_mag_128i_i[i]; + xmm3 = ch_mag_128i_i[i+1]; + xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3); + + y0r_one_over_sqrt_21 = _mm_mulhi_epi16(y0r, ONE_OVER_SQRT_42); + y0r_three_over_sqrt_21 = _mm_mulhi_epi16(y0r, THREE_OVER_SQRT_42); + y0r_five_over_sqrt_21 = _mm_mulhi_epi16(y0r, FIVE_OVER_SQRT_42); + y0r_five_over_sqrt_21 = _mm_slli_epi16(y0r_five_over_sqrt_21, 1); + y0r_seven_over_sqrt_21 = _mm_mulhi_epi16(y0r, SEVEN_OVER_SQRT_42); + y0r_seven_over_sqrt_21 = _mm_slli_epi16(y0r_seven_over_sqrt_21, 2); // Q2.14 + + y0i_one_over_sqrt_21 = _mm_mulhi_epi16(y0i, ONE_OVER_SQRT_42); + y0i_three_over_sqrt_21 = _mm_mulhi_epi16(y0i, THREE_OVER_SQRT_42); + y0i_five_over_sqrt_21 = _mm_mulhi_epi16(y0i, FIVE_OVER_SQRT_42); + y0i_five_over_sqrt_21 = _mm_slli_epi16(y0i_five_over_sqrt_21, 1); + y0i_seven_over_sqrt_21 = _mm_mulhi_epi16(y0i, SEVEN_OVER_SQRT_42); + y0i_seven_over_sqrt_21 = _mm_slli_epi16(y0i_seven_over_sqrt_21, 2); // Q2.14 + + y0_p_7_1 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); + y0_p_7_3 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); + y0_p_7_5 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); + y0_p_7_7 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); + y0_p_5_1 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); + y0_p_5_3 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); + y0_p_5_5 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); + y0_p_5_7 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); + y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); + y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); + y0_p_3_5 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); + y0_p_3_7 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); + y0_p_1_1 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); + y0_p_1_3 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); + y0_p_1_5 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); + y0_p_1_7 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); + + y0_m_1_1 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); + y0_m_1_3 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); + y0_m_1_5 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); + y0_m_1_7 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); + y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); + y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); + y0_m_3_5 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); + y0_m_3_7 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); + y0_m_5_1 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); + y0_m_5_3 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); + y0_m_5_5 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); + y0_m_5_7 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); + y0_m_7_1 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); + y0_m_7_3 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); + y0_m_7_5 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); + y0_m_7_7 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); + + interference_abs_epi16(psi_r_p7_p7, ch_mag_int, a_r_p7_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p7_p5, ch_mag_int, a_r_p7_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p7_p3, ch_mag_int, a_r_p7_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p7_p1, ch_mag_int, a_r_p7_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p7_m1, ch_mag_int, a_r_p7_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p7_m3, ch_mag_int, a_r_p7_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p7_m5, ch_mag_int, a_r_p7_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p7_m7, ch_mag_int, a_r_p7_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p5_p7, ch_mag_int, a_r_p5_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p5_p5, ch_mag_int, a_r_p5_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p5_p3, ch_mag_int, a_r_p5_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p5_p1, ch_mag_int, a_r_p5_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p5_m1, ch_mag_int, a_r_p5_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p5_m3, ch_mag_int, a_r_p5_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p5_m5, ch_mag_int, a_r_p5_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p5_m7, ch_mag_int, a_r_p5_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p3_p7, ch_mag_int, a_r_p3_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p3_p5, ch_mag_int, a_r_p3_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p3_p3, ch_mag_int, a_r_p3_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p3_p1, ch_mag_int, a_r_p3_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p3_m1, ch_mag_int, a_r_p3_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p3_m3, ch_mag_int, a_r_p3_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p3_m5, ch_mag_int, a_r_p3_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p3_m7, ch_mag_int, a_r_p3_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p1_p7, ch_mag_int, a_r_p1_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p1_p5, ch_mag_int, a_r_p1_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p1_p3, ch_mag_int, a_r_p1_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p1_p1, ch_mag_int, a_r_p1_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p1_m1, ch_mag_int, a_r_p1_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p1_m3, ch_mag_int, a_r_p1_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p1_m5, ch_mag_int, a_r_p1_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_p1_m7, ch_mag_int, a_r_p1_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m1_p7, ch_mag_int, a_r_m1_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m1_p5, ch_mag_int, a_r_m1_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m1_p3, ch_mag_int, a_r_m1_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m1_p1, ch_mag_int, a_r_m1_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m1_m1, ch_mag_int, a_r_m1_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m1_m3, ch_mag_int, a_r_m1_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m1_m5, ch_mag_int, a_r_m1_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m1_m7, ch_mag_int, a_r_m1_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m3_p7, ch_mag_int, a_r_m3_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m3_p5, ch_mag_int, a_r_m3_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m3_p3, ch_mag_int, a_r_m3_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m3_p1, ch_mag_int, a_r_m3_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m3_m1, ch_mag_int, a_r_m3_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m3_m3, ch_mag_int, a_r_m3_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m3_m5, ch_mag_int, a_r_m3_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m3_m7, ch_mag_int, a_r_m3_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m5_p7, ch_mag_int, a_r_m5_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m5_p5, ch_mag_int, a_r_m5_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m5_p3, ch_mag_int, a_r_m5_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m5_p1, ch_mag_int, a_r_m5_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m5_m1, ch_mag_int, a_r_m5_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m5_m3, ch_mag_int, a_r_m5_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m5_m5, ch_mag_int, a_r_m5_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m5_m7, ch_mag_int, a_r_m5_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m7_p7, ch_mag_int, a_r_m7_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m7_p5, ch_mag_int, a_r_m7_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m7_p3, ch_mag_int, a_r_m7_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m7_p1, ch_mag_int, a_r_m7_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m7_m1, ch_mag_int, a_r_m7_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m7_m3, ch_mag_int, a_r_m7_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m7_m5, ch_mag_int, a_r_m7_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_r_m7_m7, ch_mag_int, a_r_m7_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + + interference_abs_epi16(psi_i_p7_p7, ch_mag_int, a_i_p7_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p7_p5, ch_mag_int, a_i_p7_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p7_p3, ch_mag_int, a_i_p7_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p7_p1, ch_mag_int, a_i_p7_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p7_m1, ch_mag_int, a_i_p7_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p7_m3, ch_mag_int, a_i_p7_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p7_m5, ch_mag_int, a_i_p7_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p7_m7, ch_mag_int, a_i_p7_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p5_p7, ch_mag_int, a_i_p5_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p5_p5, ch_mag_int, a_i_p5_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p5_p3, ch_mag_int, a_i_p5_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p5_p1, ch_mag_int, a_i_p5_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p5_m1, ch_mag_int, a_i_p5_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p5_m3, ch_mag_int, a_i_p5_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p5_m5, ch_mag_int, a_i_p5_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p5_m7, ch_mag_int, a_i_p5_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p3_p7, ch_mag_int, a_i_p3_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p3_p5, ch_mag_int, a_i_p3_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p3_p3, ch_mag_int, a_i_p3_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p3_p1, ch_mag_int, a_i_p3_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p3_m1, ch_mag_int, a_i_p3_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p3_m3, ch_mag_int, a_i_p3_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p3_m5, ch_mag_int, a_i_p3_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p3_m7, ch_mag_int, a_i_p3_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p1_p7, ch_mag_int, a_i_p1_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p1_p5, ch_mag_int, a_i_p1_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p1_p3, ch_mag_int, a_i_p1_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p1_p1, ch_mag_int, a_i_p1_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p1_m1, ch_mag_int, a_i_p1_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p1_m3, ch_mag_int, a_i_p1_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p1_m5, ch_mag_int, a_i_p1_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_p1_m7, ch_mag_int, a_i_p1_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m1_p7, ch_mag_int, a_i_m1_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m1_p5, ch_mag_int, a_i_m1_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m1_p3, ch_mag_int, a_i_m1_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m1_p1, ch_mag_int, a_i_m1_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m1_m1, ch_mag_int, a_i_m1_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m1_m3, ch_mag_int, a_i_m1_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m1_m5, ch_mag_int, a_i_m1_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m1_m7, ch_mag_int, a_i_m1_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m3_p7, ch_mag_int, a_i_m3_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m3_p5, ch_mag_int, a_i_m3_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m3_p3, ch_mag_int, a_i_m3_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m3_p1, ch_mag_int, a_i_m3_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m3_m1, ch_mag_int, a_i_m3_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m3_m3, ch_mag_int, a_i_m3_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m3_m5, ch_mag_int, a_i_m3_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m3_m7, ch_mag_int, a_i_m3_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m5_p7, ch_mag_int, a_i_m5_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m5_p5, ch_mag_int, a_i_m5_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m5_p3, ch_mag_int, a_i_m5_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m5_p1, ch_mag_int, a_i_m5_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m5_m1, ch_mag_int, a_i_m5_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m5_m3, ch_mag_int, a_i_m5_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m5_m5, ch_mag_int, a_i_m5_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m5_m7, ch_mag_int, a_i_m5_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m7_p7, ch_mag_int, a_i_m7_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m7_p5, ch_mag_int, a_i_m7_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m7_p3, ch_mag_int, a_i_m7_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m7_p1, ch_mag_int, a_i_m7_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m7_m1, ch_mag_int, a_i_m7_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m7_m3, ch_mag_int, a_i_m7_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m7_m5, ch_mag_int, a_i_m7_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + interference_abs_epi16(psi_i_m7_m7, ch_mag_int, a_i_m7_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10); + + // Calculation of a group of two terms in the bit metric involving product of psi and interference + prodsum_psi_a_epi16(psi_r_p7_p7, a_r_p7_p7, psi_i_p7_p7, a_i_p7_p7, psi_a_p7_p7); + prodsum_psi_a_epi16(psi_r_p7_p5, a_r_p7_p5, psi_i_p7_p5, a_i_p7_p5, psi_a_p7_p5); + prodsum_psi_a_epi16(psi_r_p7_p3, a_r_p7_p3, psi_i_p7_p3, a_i_p7_p3, psi_a_p7_p3); + prodsum_psi_a_epi16(psi_r_p7_p1, a_r_p7_p1, psi_i_p7_p1, a_i_p7_p1, psi_a_p7_p1); + prodsum_psi_a_epi16(psi_r_p7_m1, a_r_p7_m1, psi_i_p7_m1, a_i_p7_m1, psi_a_p7_m1); + prodsum_psi_a_epi16(psi_r_p7_m3, a_r_p7_m3, psi_i_p7_m3, a_i_p7_m3, psi_a_p7_m3); + prodsum_psi_a_epi16(psi_r_p7_m5, a_r_p7_m5, psi_i_p7_m5, a_i_p7_m5, psi_a_p7_m5); + prodsum_psi_a_epi16(psi_r_p7_m7, a_r_p7_m7, psi_i_p7_m7, a_i_p7_m7, psi_a_p7_m7); + prodsum_psi_a_epi16(psi_r_p5_p7, a_r_p5_p7, psi_i_p5_p7, a_i_p5_p7, psi_a_p5_p7); + prodsum_psi_a_epi16(psi_r_p5_p5, a_r_p5_p5, psi_i_p5_p5, a_i_p5_p5, psi_a_p5_p5); + prodsum_psi_a_epi16(psi_r_p5_p3, a_r_p5_p3, psi_i_p5_p3, a_i_p5_p3, psi_a_p5_p3); + prodsum_psi_a_epi16(psi_r_p5_p1, a_r_p5_p1, psi_i_p5_p1, a_i_p5_p1, psi_a_p5_p1); + prodsum_psi_a_epi16(psi_r_p5_m1, a_r_p5_m1, psi_i_p5_m1, a_i_p5_m1, psi_a_p5_m1); + prodsum_psi_a_epi16(psi_r_p5_m3, a_r_p5_m3, psi_i_p5_m3, a_i_p5_m3, psi_a_p5_m3); + prodsum_psi_a_epi16(psi_r_p5_m5, a_r_p5_m5, psi_i_p5_m5, a_i_p5_m5, psi_a_p5_m5); + prodsum_psi_a_epi16(psi_r_p5_m7, a_r_p5_m7, psi_i_p5_m7, a_i_p5_m7, psi_a_p5_m7); + prodsum_psi_a_epi16(psi_r_p3_p7, a_r_p3_p7, psi_i_p3_p7, a_i_p3_p7, psi_a_p3_p7); + prodsum_psi_a_epi16(psi_r_p3_p5, a_r_p3_p5, psi_i_p3_p5, a_i_p3_p5, psi_a_p3_p5); + prodsum_psi_a_epi16(psi_r_p3_p3, a_r_p3_p3, psi_i_p3_p3, a_i_p3_p3, psi_a_p3_p3); + prodsum_psi_a_epi16(psi_r_p3_p1, a_r_p3_p1, psi_i_p3_p1, a_i_p3_p1, psi_a_p3_p1); + prodsum_psi_a_epi16(psi_r_p3_m1, a_r_p3_m1, psi_i_p3_m1, a_i_p3_m1, psi_a_p3_m1); + prodsum_psi_a_epi16(psi_r_p3_m3, a_r_p3_m3, psi_i_p3_m3, a_i_p3_m3, psi_a_p3_m3); + prodsum_psi_a_epi16(psi_r_p3_m5, a_r_p3_m5, psi_i_p3_m5, a_i_p3_m5, psi_a_p3_m5); + prodsum_psi_a_epi16(psi_r_p3_m7, a_r_p3_m7, psi_i_p3_m7, a_i_p3_m7, psi_a_p3_m7); + prodsum_psi_a_epi16(psi_r_p1_p7, a_r_p1_p7, psi_i_p1_p7, a_i_p1_p7, psi_a_p1_p7); + prodsum_psi_a_epi16(psi_r_p1_p5, a_r_p1_p5, psi_i_p1_p5, a_i_p1_p5, psi_a_p1_p5); + prodsum_psi_a_epi16(psi_r_p1_p3, a_r_p1_p3, psi_i_p1_p3, a_i_p1_p3, psi_a_p1_p3); + prodsum_psi_a_epi16(psi_r_p1_p1, a_r_p1_p1, psi_i_p1_p1, a_i_p1_p1, psi_a_p1_p1); + prodsum_psi_a_epi16(psi_r_p1_m1, a_r_p1_m1, psi_i_p1_m1, a_i_p1_m1, psi_a_p1_m1); + prodsum_psi_a_epi16(psi_r_p1_m3, a_r_p1_m3, psi_i_p1_m3, a_i_p1_m3, psi_a_p1_m3); + prodsum_psi_a_epi16(psi_r_p1_m5, a_r_p1_m5, psi_i_p1_m5, a_i_p1_m5, psi_a_p1_m5); + prodsum_psi_a_epi16(psi_r_p1_m7, a_r_p1_m7, psi_i_p1_m7, a_i_p1_m7, psi_a_p1_m7); + prodsum_psi_a_epi16(psi_r_m1_p7, a_r_m1_p7, psi_i_m1_p7, a_i_m1_p7, psi_a_m1_p7); + prodsum_psi_a_epi16(psi_r_m1_p5, a_r_m1_p5, psi_i_m1_p5, a_i_m1_p5, psi_a_m1_p5); + prodsum_psi_a_epi16(psi_r_m1_p3, a_r_m1_p3, psi_i_m1_p3, a_i_m1_p3, psi_a_m1_p3); + prodsum_psi_a_epi16(psi_r_m1_p1, a_r_m1_p1, psi_i_m1_p1, a_i_m1_p1, psi_a_m1_p1); + prodsum_psi_a_epi16(psi_r_m1_m1, a_r_m1_m1, psi_i_m1_m1, a_i_m1_m1, psi_a_m1_m1); + prodsum_psi_a_epi16(psi_r_m1_m3, a_r_m1_m3, psi_i_m1_m3, a_i_m1_m3, psi_a_m1_m3); + prodsum_psi_a_epi16(psi_r_m1_m5, a_r_m1_m5, psi_i_m1_m5, a_i_m1_m5, psi_a_m1_m5); + prodsum_psi_a_epi16(psi_r_m1_m7, a_r_m1_m7, psi_i_m1_m7, a_i_m1_m7, psi_a_m1_m7); + prodsum_psi_a_epi16(psi_r_m3_p7, a_r_m3_p7, psi_i_m3_p7, a_i_m3_p7, psi_a_m3_p7); + prodsum_psi_a_epi16(psi_r_m3_p5, a_r_m3_p5, psi_i_m3_p5, a_i_m3_p5, psi_a_m3_p5); + prodsum_psi_a_epi16(psi_r_m3_p3, a_r_m3_p3, psi_i_m3_p3, a_i_m3_p3, psi_a_m3_p3); + prodsum_psi_a_epi16(psi_r_m3_p1, a_r_m3_p1, psi_i_m3_p1, a_i_m3_p1, psi_a_m3_p1); + prodsum_psi_a_epi16(psi_r_m3_m1, a_r_m3_m1, psi_i_m3_m1, a_i_m3_m1, psi_a_m3_m1); + prodsum_psi_a_epi16(psi_r_m3_m3, a_r_m3_m3, psi_i_m3_m3, a_i_m3_m3, psi_a_m3_m3); + prodsum_psi_a_epi16(psi_r_m3_m5, a_r_m3_m5, psi_i_m3_m5, a_i_m3_m5, psi_a_m3_m5); + prodsum_psi_a_epi16(psi_r_m3_m7, a_r_m3_m7, psi_i_m3_m7, a_i_m3_m7, psi_a_m3_m7); + prodsum_psi_a_epi16(psi_r_m5_p7, a_r_m5_p7, psi_i_m5_p7, a_i_m5_p7, psi_a_m5_p7); + prodsum_psi_a_epi16(psi_r_m5_p5, a_r_m5_p5, psi_i_m5_p5, a_i_m5_p5, psi_a_m5_p5); + prodsum_psi_a_epi16(psi_r_m5_p3, a_r_m5_p3, psi_i_m5_p3, a_i_m5_p3, psi_a_m5_p3); + prodsum_psi_a_epi16(psi_r_m5_p1, a_r_m5_p1, psi_i_m5_p1, a_i_m5_p1, psi_a_m5_p1); + prodsum_psi_a_epi16(psi_r_m5_m1, a_r_m5_m1, psi_i_m5_m1, a_i_m5_m1, psi_a_m5_m1); + prodsum_psi_a_epi16(psi_r_m5_m3, a_r_m5_m3, psi_i_m5_m3, a_i_m5_m3, psi_a_m5_m3); + prodsum_psi_a_epi16(psi_r_m5_m5, a_r_m5_m5, psi_i_m5_m5, a_i_m5_m5, psi_a_m5_m5); + prodsum_psi_a_epi16(psi_r_m5_m7, a_r_m5_m7, psi_i_m5_m7, a_i_m5_m7, psi_a_m5_m7); + prodsum_psi_a_epi16(psi_r_m7_p7, a_r_m7_p7, psi_i_m7_p7, a_i_m7_p7, psi_a_m7_p7); + prodsum_psi_a_epi16(psi_r_m7_p5, a_r_m7_p5, psi_i_m7_p5, a_i_m7_p5, psi_a_m7_p5); + prodsum_psi_a_epi16(psi_r_m7_p3, a_r_m7_p3, psi_i_m7_p3, a_i_m7_p3, psi_a_m7_p3); + prodsum_psi_a_epi16(psi_r_m7_p1, a_r_m7_p1, psi_i_m7_p1, a_i_m7_p1, psi_a_m7_p1); + prodsum_psi_a_epi16(psi_r_m7_m1, a_r_m7_m1, psi_i_m7_m1, a_i_m7_m1, psi_a_m7_m1); + prodsum_psi_a_epi16(psi_r_m7_m3, a_r_m7_m3, psi_i_m7_m3, a_i_m7_m3, psi_a_m7_m3); + prodsum_psi_a_epi16(psi_r_m7_m5, a_r_m7_m5, psi_i_m7_m5, a_i_m7_m5, psi_a_m7_m5); + prodsum_psi_a_epi16(psi_r_m7_m7, a_r_m7_m7, psi_i_m7_m7, a_i_m7_m7, psi_a_m7_m7); + + // Calculation of a group of two terms in the bit metric involving squares of interference + square_a_epi16(a_r_p7_p7, a_i_p7_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_p7); + square_a_epi16(a_r_p7_p5, a_i_p7_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_p5); + square_a_epi16(a_r_p7_p3, a_i_p7_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_p3); + square_a_epi16(a_r_p7_p1, a_i_p7_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_p1); + square_a_epi16(a_r_p7_m1, a_i_p7_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_m1); + square_a_epi16(a_r_p7_m3, a_i_p7_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_m3); + square_a_epi16(a_r_p7_m5, a_i_p7_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_m5); + square_a_epi16(a_r_p7_m7, a_i_p7_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_m7); + square_a_epi16(a_r_p5_p7, a_i_p5_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_p7); + square_a_epi16(a_r_p5_p5, a_i_p5_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_p5); + square_a_epi16(a_r_p5_p3, a_i_p5_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_p3); + square_a_epi16(a_r_p5_p1, a_i_p5_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_p1); + square_a_epi16(a_r_p5_m1, a_i_p5_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_m1); + square_a_epi16(a_r_p5_m3, a_i_p5_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_m3); + square_a_epi16(a_r_p5_m5, a_i_p5_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_m5); + square_a_epi16(a_r_p5_m7, a_i_p5_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_m7); + square_a_epi16(a_r_p3_p7, a_i_p3_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_p7); + square_a_epi16(a_r_p3_p5, a_i_p3_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_p5); + square_a_epi16(a_r_p3_p3, a_i_p3_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_p3); + square_a_epi16(a_r_p3_p1, a_i_p3_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_p1); + square_a_epi16(a_r_p3_m1, a_i_p3_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_m1); + square_a_epi16(a_r_p3_m3, a_i_p3_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_m3); + square_a_epi16(a_r_p3_m5, a_i_p3_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_m5); + square_a_epi16(a_r_p3_m7, a_i_p3_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_m7); + square_a_epi16(a_r_p1_p7, a_i_p1_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_p7); + square_a_epi16(a_r_p1_p5, a_i_p1_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_p5); + square_a_epi16(a_r_p1_p3, a_i_p1_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_p3); + square_a_epi16(a_r_p1_p1, a_i_p1_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_p1); + square_a_epi16(a_r_p1_m1, a_i_p1_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_m1); + square_a_epi16(a_r_p1_m3, a_i_p1_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_m3); + square_a_epi16(a_r_p1_m5, a_i_p1_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_m5); + square_a_epi16(a_r_p1_m7, a_i_p1_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_m7); + square_a_epi16(a_r_m1_p7, a_i_m1_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_p7); + square_a_epi16(a_r_m1_p5, a_i_m1_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_p5); + square_a_epi16(a_r_m1_p3, a_i_m1_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_p3); + square_a_epi16(a_r_m1_p1, a_i_m1_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_p1); + square_a_epi16(a_r_m1_m1, a_i_m1_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_m1); + square_a_epi16(a_r_m1_m3, a_i_m1_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_m3); + square_a_epi16(a_r_m1_m5, a_i_m1_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_m5); + square_a_epi16(a_r_m1_m7, a_i_m1_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_m7); + square_a_epi16(a_r_m3_p7, a_i_m3_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_p7); + square_a_epi16(a_r_m3_p5, a_i_m3_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_p5); + square_a_epi16(a_r_m3_p3, a_i_m3_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_p3); + square_a_epi16(a_r_m3_p1, a_i_m3_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_p1); + square_a_epi16(a_r_m3_m1, a_i_m3_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_m1); + square_a_epi16(a_r_m3_m3, a_i_m3_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_m3); + square_a_epi16(a_r_m3_m5, a_i_m3_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_m5); + square_a_epi16(a_r_m3_m7, a_i_m3_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_m7); + square_a_epi16(a_r_m5_p7, a_i_m5_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_p7); + square_a_epi16(a_r_m5_p5, a_i_m5_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_p5); + square_a_epi16(a_r_m5_p3, a_i_m5_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_p3); + square_a_epi16(a_r_m5_p1, a_i_m5_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_p1); + square_a_epi16(a_r_m5_m1, a_i_m5_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_m1); + square_a_epi16(a_r_m5_m3, a_i_m5_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_m3); + square_a_epi16(a_r_m5_m5, a_i_m5_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_m5); + square_a_epi16(a_r_m5_m7, a_i_m5_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_m7); + square_a_epi16(a_r_m7_p7, a_i_m7_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_p7); + square_a_epi16(a_r_m7_p5, a_i_m7_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_p5); + square_a_epi16(a_r_m7_p3, a_i_m7_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_p3); + square_a_epi16(a_r_m7_p1, a_i_m7_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_p1); + square_a_epi16(a_r_m7_m1, a_i_m7_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_m1); + square_a_epi16(a_r_m7_m3, a_i_m7_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_m3); + square_a_epi16(a_r_m7_m5, a_i_m7_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_m5); + square_a_epi16(a_r_m7_m7, a_i_m7_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_m7); + + // Computing different multiples of ||h0||^2 + // x=1, y=1 + ch_mag_2_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,ONE_OVER_FOUR_SQRT_42); + ch_mag_2_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_2_over_42_with_sigma2,1); + // x=1, y=3 + ch_mag_10_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FIVE_OVER_FOUR_SQRT_42); + ch_mag_10_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_10_over_42_with_sigma2,1); + // x=1, x=5 + ch_mag_26_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTEEN_OVER_FOUR_SQRT_42); + ch_mag_26_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_26_over_42_with_sigma2,1); + // x=1, y=7 + ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42); + ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1); + // x=3, y=3 + ch_mag_18_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,NINE_OVER_FOUR_SQRT_42); + ch_mag_18_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_18_over_42_with_sigma2,1); + // x=3, y=5 + ch_mag_34_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,SEVENTEEN_OVER_FOUR_SQRT_42); + ch_mag_34_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_34_over_42_with_sigma2,1); + // x=3, y=7 + ch_mag_58_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYNINE_OVER_FOUR_SQRT_42); + ch_mag_58_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_58_over_42_with_sigma2,2); + // x=5, y=5 + ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42); + ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1); + // x=5, y=7 + ch_mag_74_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTYSEVEN_OVER_FOUR_SQRT_42); + ch_mag_74_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_74_over_42_with_sigma2,2); + // x=7, y=7 + ch_mag_98_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FORTYNINE_OVER_FOUR_SQRT_42); + ch_mag_98_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_98_over_42_with_sigma2,2); + + // Computing Metrics + xmm0 = _mm_subs_epi16(psi_a_p7_p7, a_sq_p7_p7); + xmm1 = _mm_adds_epi16(xmm0, y0_p_7_7); + bit_met_p7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p7_p5, a_sq_p7_p5); + xmm1 = _mm_adds_epi16(xmm0, y0_p_7_5); + bit_met_p7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p7_p3, a_sq_p7_p3); + xmm1 = _mm_adds_epi16(xmm0, y0_p_7_3); + bit_met_p7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p7_p1, a_sq_p7_p1); + xmm1 = _mm_adds_epi16(xmm0, y0_p_7_1); + bit_met_p7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p7_m1, a_sq_p7_m1); + xmm1 = _mm_adds_epi16(xmm0, y0_m_7_1); + bit_met_p7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p7_m3, a_sq_p7_m3); + xmm1 = _mm_adds_epi16(xmm0, y0_m_7_3); + bit_met_p7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p7_m5, a_sq_p7_m5); + xmm1 = _mm_adds_epi16(xmm0, y0_m_7_5); + bit_met_p7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p7_m7, a_sq_p7_m7); + xmm1 = _mm_adds_epi16(xmm0, y0_m_7_7); + bit_met_p7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p5_p7, a_sq_p5_p7); + xmm1 = _mm_adds_epi16(xmm0, y0_p_5_7); + bit_met_p5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p5_p5, a_sq_p5_p5); + xmm1 = _mm_adds_epi16(xmm0, y0_p_5_5); + bit_met_p5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p5_p3, a_sq_p5_p3); + xmm1 = _mm_adds_epi16(xmm0, y0_p_5_3); + bit_met_p5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p5_p1, a_sq_p5_p1); + xmm1 = _mm_adds_epi16(xmm0, y0_p_5_1); + bit_met_p5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p5_m1, a_sq_p5_m1); + xmm1 = _mm_adds_epi16(xmm0, y0_m_5_1); + bit_met_p5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p5_m3, a_sq_p5_m3); + xmm1 = _mm_adds_epi16(xmm0, y0_m_5_3); + bit_met_p5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p5_m5, a_sq_p5_m5); + xmm1 = _mm_adds_epi16(xmm0, y0_m_5_5); + bit_met_p5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p5_m7, a_sq_p5_m7); + xmm1 = _mm_adds_epi16(xmm0, y0_m_5_7); + bit_met_p5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p3_p7, a_sq_p3_p7); + xmm1 = _mm_adds_epi16(xmm0, y0_p_3_7); + bit_met_p3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p3_p5, a_sq_p3_p5); + xmm1 = _mm_adds_epi16(xmm0, y0_p_3_5); + bit_met_p3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p3_p3, a_sq_p3_p3); + xmm1 = _mm_adds_epi16(xmm0, y0_p_3_3); + bit_met_p3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p3_p1, a_sq_p3_p1); + xmm1 = _mm_adds_epi16(xmm0, y0_p_3_1); + bit_met_p3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p3_m1, a_sq_p3_m1); + xmm1 = _mm_adds_epi16(xmm0, y0_m_3_1); + bit_met_p3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p3_m3, a_sq_p3_m3); + xmm1 = _mm_adds_epi16(xmm0, y0_m_3_3); + bit_met_p3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p3_m5, a_sq_p3_m5); + xmm1 = _mm_adds_epi16(xmm0, y0_m_3_5); + bit_met_p3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p3_m7, a_sq_p3_m7); + xmm1 = _mm_adds_epi16(xmm0, y0_m_3_7); + bit_met_p3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p1_p7, a_sq_p1_p7); + xmm1 = _mm_adds_epi16(xmm0, y0_p_1_7); + bit_met_p1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p1_p5, a_sq_p1_p5); + xmm1 = _mm_adds_epi16(xmm0, y0_p_1_5); + bit_met_p1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p1_p3, a_sq_p1_p3); + xmm1 = _mm_adds_epi16(xmm0, y0_p_1_3); + bit_met_p1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p1_p1, a_sq_p1_p1); + xmm1 = _mm_adds_epi16(xmm0, y0_p_1_1); + bit_met_p1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p1_m1, a_sq_p1_m1); + xmm1 = _mm_adds_epi16(xmm0, y0_m_1_1); + bit_met_p1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p1_m3, a_sq_p1_m3); + xmm1 = _mm_adds_epi16(xmm0, y0_m_1_3); + bit_met_p1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p1_m5, a_sq_p1_m5); + xmm1 = _mm_adds_epi16(xmm0, y0_m_1_5); + bit_met_p1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p1_m7, a_sq_p1_m7); + xmm1 = _mm_adds_epi16(xmm0, y0_m_1_7); + bit_met_p1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + + xmm0 = _mm_subs_epi16(psi_a_m1_p7, a_sq_m1_p7); + xmm1 = _mm_subs_epi16(xmm0, y0_m_1_7); + bit_met_m1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m1_p5, a_sq_m1_p5); + xmm1 = _mm_subs_epi16(xmm0, y0_m_1_5); + bit_met_m1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m1_p3, a_sq_m1_p3); + xmm1 = _mm_subs_epi16(xmm0, y0_m_1_3); + bit_met_m1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m1_p1, a_sq_m1_p1); + xmm1 = _mm_subs_epi16(xmm0, y0_m_1_1); + bit_met_m1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m1_m1, a_sq_m1_m1); + xmm1 = _mm_subs_epi16(xmm0, y0_p_1_1); + bit_met_m1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m1_m3, a_sq_m1_m3); + xmm1 = _mm_subs_epi16(xmm0, y0_p_1_3); + bit_met_m1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m1_m5, a_sq_m1_m5); + xmm1 = _mm_subs_epi16(xmm0, y0_p_1_5); + bit_met_m1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m1_m7, a_sq_m1_m7); + xmm1 = _mm_subs_epi16(xmm0, y0_p_1_7); + bit_met_m1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m3_p7, a_sq_m3_p7); + xmm1 = _mm_subs_epi16(xmm0, y0_m_3_7); + bit_met_m3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m3_p5, a_sq_m3_p5); + xmm1 = _mm_subs_epi16(xmm0, y0_m_3_5); + bit_met_m3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m3_p3, a_sq_m3_p3); + xmm1 = _mm_subs_epi16(xmm0, y0_m_3_3); + bit_met_m3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m3_p1, a_sq_m3_p1); + xmm1 = _mm_subs_epi16(xmm0, y0_m_3_1); + bit_met_m3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m3_m1, a_sq_m3_m1); + xmm1 = _mm_subs_epi16(xmm0, y0_p_3_1); + bit_met_m3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m3_m3, a_sq_m3_m3); + xmm1 = _mm_subs_epi16(xmm0, y0_p_3_3); + bit_met_m3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m3_m5, a_sq_m3_m5); + xmm1 = _mm_subs_epi16(xmm0, y0_p_3_5); + bit_met_m3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m3_m7, a_sq_m3_m7); + xmm1 = _mm_subs_epi16(xmm0, y0_p_3_7); + bit_met_m3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m5_p7, a_sq_m5_p7); + xmm1 = _mm_subs_epi16(xmm0, y0_m_5_7); + bit_met_m5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m5_p5, a_sq_m5_p5); + xmm1 = _mm_subs_epi16(xmm0, y0_m_5_5); + bit_met_m5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m5_p3, a_sq_m5_p3); + xmm1 = _mm_subs_epi16(xmm0, y0_m_5_3); + bit_met_m5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m5_p1, a_sq_m5_p1); + xmm1 = _mm_subs_epi16(xmm0, y0_m_5_1); + bit_met_m5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m5_m1, a_sq_m5_m1); + xmm1 = _mm_subs_epi16(xmm0, y0_p_5_1); + bit_met_m5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m5_m3, a_sq_m5_m3); + xmm1 = _mm_subs_epi16(xmm0, y0_p_5_3); + bit_met_m5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m5_m5, a_sq_m5_m5); + xmm1 = _mm_subs_epi16(xmm0, y0_p_5_5); + bit_met_m5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m5_m7, a_sq_m5_m7); + xmm1 = _mm_subs_epi16(xmm0, y0_p_5_7); + bit_met_m5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m7_p7, a_sq_m7_p7); + xmm1 = _mm_subs_epi16(xmm0, y0_m_7_7); + bit_met_m7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m7_p5, a_sq_m7_p5); + xmm1 = _mm_subs_epi16(xmm0, y0_m_7_5); + bit_met_m7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m7_p3, a_sq_m7_p3); + xmm1 = _mm_subs_epi16(xmm0, y0_m_7_3); + bit_met_m7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m7_p1, a_sq_m7_p1); + xmm1 = _mm_subs_epi16(xmm0, y0_m_7_1); + bit_met_m7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m7_m1, a_sq_m7_m1); + xmm1 = _mm_subs_epi16(xmm0, y0_p_7_1); + bit_met_m7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m7_m3, a_sq_m7_m3); + xmm1 = _mm_subs_epi16(xmm0, y0_p_7_3); + bit_met_m7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m7_m5, a_sq_m7_m5); + xmm1 = _mm_subs_epi16(xmm0, y0_p_7_5); + bit_met_m7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m7_m7, a_sq_m7_m7); + xmm1 = _mm_subs_epi16(xmm0, y0_p_7_7); + bit_met_m7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); + + // Detection for 1st bit (LTE mapping) + // bit = 1 + xmm0 = _mm_max_epi16(bit_met_m7_p7, bit_met_m7_p5); + xmm1 = _mm_max_epi16(bit_met_m7_p3, bit_met_m7_p1); + xmm2 = _mm_max_epi16(bit_met_m7_m1, bit_met_m7_m3); + xmm3 = _mm_max_epi16(bit_met_m7_m5, bit_met_m7_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_m5_p7, bit_met_m5_p5); + xmm1 = _mm_max_epi16(bit_met_m5_p3, bit_met_m5_p1); + xmm2 = _mm_max_epi16(bit_met_m5_m1, bit_met_m5_m3); + xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m5_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_m3_p7, bit_met_m3_p5); + xmm1 = _mm_max_epi16(bit_met_m3_p3, bit_met_m3_p1); + xmm2 = _mm_max_epi16(bit_met_m3_m1, bit_met_m3_m3); + xmm3 = _mm_max_epi16(bit_met_m3_m5, bit_met_m3_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_m1_p7, bit_met_m1_p5); + xmm1 = _mm_max_epi16(bit_met_m1_p3, bit_met_m1_p1); + xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m1_m3); + xmm3 = _mm_max_epi16(bit_met_m1_m5, bit_met_m1_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + + // bit = 0 + xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p7_p5); + xmm1 = _mm_max_epi16(bit_met_p7_p3, bit_met_p7_p1); + xmm2 = _mm_max_epi16(bit_met_p7_m1, bit_met_p7_m3); + xmm3 = _mm_max_epi16(bit_met_p7_m5, bit_met_p7_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_p5_p7, bit_met_p5_p5); + xmm1 = _mm_max_epi16(bit_met_p5_p3, bit_met_p5_p1); + xmm2 = _mm_max_epi16(bit_met_p5_m1, bit_met_p5_m3); + xmm3 = _mm_max_epi16(bit_met_p5_m5, bit_met_p5_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p3_p7, bit_met_p3_p5); + xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p3_p1); + xmm2 = _mm_max_epi16(bit_met_p3_m1, bit_met_p3_m3); + xmm3 = _mm_max_epi16(bit_met_p3_m5, bit_met_p3_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p1_p7, bit_met_p1_p5); + xmm1 = _mm_max_epi16(bit_met_p1_p3, bit_met_p1_p1); + xmm2 = _mm_max_epi16(bit_met_p1_m1, bit_met_p1_m3); + xmm3 = _mm_max_epi16(bit_met_p1_m5, bit_met_p1_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + + y0r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + // Detection for 2nd bit (LTE mapping) + // bit = 1 + xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1); + xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1); + xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1); + xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3); + xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3); + xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3); + xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5); + xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5); + xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5); + xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7); + xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7); + xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7); + xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + + // bit = 0 + xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1); + xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1); + xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1); + xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3); + xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3); + xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3); + xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5); + xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5); + xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5); + xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7); + xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7); + xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7); + xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + + y1r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + // Detection for 3rd bit (LTE mapping) + xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5); + xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1); + xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3); + xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5); + xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1); + xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3); + xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5); + xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1); + xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3); + xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5); + xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1); + xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3); + xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + + xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5); + xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1); + xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3); + xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5); + xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1); + xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3); + xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5); + xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1); + xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3); + xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5); + xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1); + xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3); + xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + + y2r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + // Detection for 4th bit (LTE mapping) + xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7); + xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7); + xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7); + xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5); + xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5); + xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5); + xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p5); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5); + xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5); + xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5); + xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7); + xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7); + xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7); + xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + + xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1); + xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1); + xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1); + xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3); + xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3); + xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3); + xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1); + xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1); + xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1); + xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3); + xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3); + xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3); + xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + + y0i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + + // Detection for 5th bit (LTE mapping) + xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5); + xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1); + xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3); + xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5); + xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1); + xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3); + xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5); + xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1); + xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3); + xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5); + xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1); + xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3); + xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + + xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5); + xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1); + xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3); + xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5); + xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1); + xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3); + xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5); + xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1); + xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3); + xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5); + xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1); + xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3); + xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + + y1i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + // Detection for 6th bit (LTE mapping) + xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7); + xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7); + xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7); + xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1); + xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1); + xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1); + xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p1); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1); + xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1); + xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1); + xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7); + xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7); + xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7); + xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + + xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5); + xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5); + xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5); + xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3); + xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3); + xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3); + xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3); + xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3); + xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3); + xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5); + xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5); + xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5); + xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + + y2i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + + // map to output stream, difficult to do in SIMD since we have 6 16bit LLRs + // RE 1 + j = 24*i; + stream0_out[j + 0] = ((short *)&y0r)[0]; + stream0_out[j + 1] = ((short *)&y1r)[0]; + stream0_out[j + 2] = ((short *)&y2r)[0]; + stream0_out[j + 3] = ((short *)&y0i)[0]; + stream0_out[j + 4] = ((short *)&y1i)[0]; + stream0_out[j + 5] = ((short *)&y2i)[0]; + // RE 2 + stream0_out[j + 6] = ((short *)&y0r)[1]; + stream0_out[j + 7] = ((short *)&y1r)[1]; + stream0_out[j + 8] = ((short *)&y2r)[1]; + stream0_out[j + 9] = ((short *)&y0i)[1]; + stream0_out[j + 10] = ((short *)&y1i)[1]; + stream0_out[j + 11] = ((short *)&y2i)[1]; + // RE 3 + stream0_out[j + 12] = ((short *)&y0r)[2]; + stream0_out[j + 13] = ((short *)&y1r)[2]; + stream0_out[j + 14] = ((short *)&y2r)[2]; + stream0_out[j + 15] = ((short *)&y0i)[2]; + stream0_out[j + 16] = ((short *)&y1i)[2]; + stream0_out[j + 17] = ((short *)&y2i)[2]; + // RE 4 + stream0_out[j + 18] = ((short *)&y0r)[3]; + stream0_out[j + 19] = ((short *)&y1r)[3]; + stream0_out[j + 20] = ((short *)&y2r)[3]; + stream0_out[j + 21] = ((short *)&y0i)[3]; + stream0_out[j + 22] = ((short *)&y1i)[3]; + stream0_out[j + 23] = ((short *)&y2i)[3]; + // RE 5 + stream0_out[j + 24] = ((short *)&y0r)[4]; + stream0_out[j + 25] = ((short *)&y1r)[4]; + stream0_out[j + 26] = ((short *)&y2r)[4]; + stream0_out[j + 27] = ((short *)&y0i)[4]; + stream0_out[j + 28] = ((short *)&y1i)[4]; + stream0_out[j + 29] = ((short *)&y2i)[4]; + // RE 6 + stream0_out[j + 30] = ((short *)&y0r)[5]; + stream0_out[j + 31] = ((short *)&y1r)[5]; + stream0_out[j + 32] = ((short *)&y2r)[5]; + stream0_out[j + 33] = ((short *)&y0i)[5]; + stream0_out[j + 34] = ((short *)&y1i)[5]; + stream0_out[j + 35] = ((short *)&y2i)[5]; + // RE 7 + stream0_out[j + 36] = ((short *)&y0r)[6]; + stream0_out[j + 37] = ((short *)&y1r)[6]; + stream0_out[j + 38] = ((short *)&y2r)[6]; + stream0_out[j + 39] = ((short *)&y0i)[6]; + stream0_out[j + 40] = ((short *)&y1i)[6]; + stream0_out[j + 41] = ((short *)&y2i)[6]; + // RE 8 + stream0_out[j + 42] = ((short *)&y0r)[7]; + stream0_out[j + 43] = ((short *)&y1r)[7]; + stream0_out[j + 44] = ((short *)&y2r)[7]; + stream0_out[j + 45] = ((short *)&y0i)[7]; + stream0_out[j + 46] = ((short *)&y1i)[7]; + stream0_out[j + 47] = ((short *)&y2i)[7]; + +#elif defined(__arm__) + +#endif + } + +#if defined(__x86_64__) || defined(__i386__) + _mm_empty(); + _m_empty(); +#endif + +} + + +int nr_dlsch_64qam_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, + int32_t **rxdataF_comp, + int32_t **rxdataF_comp_i, + int32_t **dl_ch_mag, + int32_t **dl_ch_mag_i, + int32_t **rho_i, + int16_t *dlsch_llr, + uint8_t symbol, + uint8_t first_symbol_flag, + uint16_t nb_rb, + uint16_t pbch_pss_sss_adjust, + int16_t **llr16p) +{ + + int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *llr16; + int len; + uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; + + //first symbol has different structure due to more pilots + if (first_symbol_flag == 1) { + llr16 = (int16_t*)dlsch_llr; + } else { + llr16 = (int16_t*)(*llr16p); + } + + AssertFatal(llr16!=NULL,"nr_dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol); + + if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { + // if symbol has pilots + if (frame_parms->nb_antenna_ports_eNB!=1) + // in 2 antenna ports we have 8 REs per symbol per RB + len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); + else + // for 1 antenna port we have 10 REs per symbol per RB + len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); + } else { + // symbol has no pilots + len = (nb_rb*12) - pbch_pss_sss_adjust; + } + + qam64_qam16((short *)rxF, + (short *)rxF_i, + (short *)ch_mag, + (short *)ch_mag_i, + (short *)llr16, + (short *)rho, + len); + + llr16 += (6*len); + *llr16p = (short *)llr16; + return(0); +} + +void qam64_qam64(short *stream0_in, + short *stream1_in, + short *ch_mag, + short *ch_mag_i, + short *stream0_out, + short *rho01, + int length + ) +{ + + /* + Author: S. Wagner + Date: 31-07-12 + + Input: + stream0_in: MF filter for 1st stream, i.e., y0=h0'*y + stream1_in: MF filter for 2nd stream, i.e., y1=h1'*y + ch_mag: 4*h0/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc + ch_mag_i: 4*h1/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc + rho01: Channel cross correlation, i.e., h1'*h0 + + Output: + stream0_out: output LLRs for 1st stream + */ + +#if defined(__x86_64__) || defined(__i386__) + + __m128i *rho01_128i = (__m128i *)rho01; + __m128i *stream0_128i_in = (__m128i *)stream0_in; + __m128i *stream1_128i_in = (__m128i *)stream1_in; + __m128i *ch_mag_128i = (__m128i *)ch_mag; + __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i; + + __m128i ONE_OVER_SQRT_42 = _mm_set1_epi16(10112); // round(1/sqrt(42)*2^16) + __m128i THREE_OVER_SQRT_42 = _mm_set1_epi16(30337); // round(3/sqrt(42)*2^16) + __m128i FIVE_OVER_SQRT_42 = _mm_set1_epi16(25281); // round(5/sqrt(42)*2^15) + __m128i SEVEN_OVER_SQRT_42 = _mm_set1_epi16(17697); // round(7/sqrt(42)*2^14) Q2.14 + __m128i ONE_OVER_SQRT_2 = _mm_set1_epi16(23170); // round(1/sqrt(2)*2^15) + __m128i ONE_OVER_SQRT_2_42 = _mm_set1_epi16(3575); // round(1/sqrt(2*42)*2^15) + __m128i THREE_OVER_SQRT_2_42 = _mm_set1_epi16(10726); // round(3/sqrt(2*42)*2^15) + __m128i FIVE_OVER_SQRT_2_42 = _mm_set1_epi16(17876); // round(5/sqrt(2*42)*2^15) + __m128i SEVEN_OVER_SQRT_2_42 = _mm_set1_epi16(25027); // round(7/sqrt(2*42)*2^15) + __m128i FORTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(30969); // round(49/(4*sqrt(42))*2^14), Q2.14 + __m128i THIRTYSEVEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(23385); // round(37/(4*sqrt(42))*2^14), Q2.14 + __m128i TWENTYFIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(31601); // round(25/(4*sqrt(42))*2^15) + __m128i TWENTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(18329); // round(29/(4*sqrt(42))*2^15), Q2.14 + __m128i SEVENTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(21489); // round(17/(4*sqrt(42))*2^15) + __m128i NINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(11376); // round(9/(4*sqrt(42))*2^15) + __m128i THIRTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(16433); // round(13/(4*sqrt(42))*2^15) + __m128i FIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(6320); // round(5/(4*sqrt(42))*2^15) + __m128i ONE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(1264); // round(1/(4*sqrt(42))*2^15) + __m128i SQRT_42_OVER_FOUR = _mm_set1_epi16(13272); // round(sqrt(42)/4*2^13), Q3.12 + + __m128i ch_mag_des; + __m128i ch_mag_int; + __m128i ch_mag_98_over_42_with_sigma2; + __m128i ch_mag_74_over_42_with_sigma2; + __m128i ch_mag_58_over_42_with_sigma2; + __m128i ch_mag_50_over_42_with_sigma2; + __m128i ch_mag_34_over_42_with_sigma2; + __m128i ch_mag_18_over_42_with_sigma2; + __m128i ch_mag_26_over_42_with_sigma2; + __m128i ch_mag_10_over_42_with_sigma2; + __m128i ch_mag_2_over_42_with_sigma2; + __m128i y0r_one_over_sqrt_21; + __m128i y0r_three_over_sqrt_21; + __m128i y0r_five_over_sqrt_21; + __m128i y0r_seven_over_sqrt_21; + __m128i y0i_one_over_sqrt_21; + __m128i y0i_three_over_sqrt_21; + __m128i y0i_five_over_sqrt_21; + __m128i y0i_seven_over_sqrt_21; + __m128i ch_mag_int_with_sigma2; + __m128i two_ch_mag_int_with_sigma2; + __m128i three_ch_mag_int_with_sigma2; +#elif defined(__arm__) + +#endif + + int i,j; + + + for (i=0; i>2; i+=2) { + +#if defined(__x86_64__) || defined(__i386__) + + // Get rho + xmm0 = rho01_128i[i]; + xmm1 = rho01_128i[i+1]; + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho) + xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho) + rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho) + rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho) + + // Compute the different rhos + rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42); + rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42); + rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42); + rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42); + rho_rpi_5_5 = _mm_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42); + rho_rmi_5_5 = _mm_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42); + rho_rpi_7_7 = _mm_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42); + rho_rmi_7_7 = _mm_mulhi_epi16(rho_rmi, SEVEN_OVER_SQRT_42); + + rho_rpi_5_5 = _mm_slli_epi16(rho_rpi_5_5, 1); + rho_rmi_5_5 = _mm_slli_epi16(rho_rmi_5_5, 1); + rho_rpi_7_7 = _mm_slli_epi16(rho_rpi_7_7, 2); + rho_rmi_7_7 = _mm_slli_epi16(rho_rmi_7_7, 2); + + xmm4 = _mm_mulhi_epi16(xmm2, ONE_OVER_SQRT_42); + xmm5 = _mm_mulhi_epi16(xmm3, ONE_OVER_SQRT_42); + xmm6 = _mm_mulhi_epi16(xmm3, THREE_OVER_SQRT_42); + xmm7 = _mm_mulhi_epi16(xmm3, FIVE_OVER_SQRT_42); + xmm8 = _mm_mulhi_epi16(xmm3, SEVEN_OVER_SQRT_42); + xmm7 = _mm_slli_epi16(xmm7, 1); + xmm8 = _mm_slli_epi16(xmm8, 2); + + rho_rpi_1_3 = _mm_adds_epi16(xmm4, xmm6); + rho_rmi_1_3 = _mm_subs_epi16(xmm4, xmm6); + rho_rpi_1_5 = _mm_adds_epi16(xmm4, xmm7); + rho_rmi_1_5 = _mm_subs_epi16(xmm4, xmm7); + rho_rpi_1_7 = _mm_adds_epi16(xmm4, xmm8); + rho_rmi_1_7 = _mm_subs_epi16(xmm4, xmm8); + + xmm4 = _mm_mulhi_epi16(xmm2, THREE_OVER_SQRT_42); + rho_rpi_3_1 = _mm_adds_epi16(xmm4, xmm5); + rho_rmi_3_1 = _mm_subs_epi16(xmm4, xmm5); + rho_rpi_3_5 = _mm_adds_epi16(xmm4, xmm7); + rho_rmi_3_5 = _mm_subs_epi16(xmm4, xmm7); + rho_rpi_3_7 = _mm_adds_epi16(xmm4, xmm8); + rho_rmi_3_7 = _mm_subs_epi16(xmm4, xmm8); + + xmm4 = _mm_mulhi_epi16(xmm2, FIVE_OVER_SQRT_42); + xmm4 = _mm_slli_epi16(xmm4, 1); + rho_rpi_5_1 = _mm_adds_epi16(xmm4, xmm5); + rho_rmi_5_1 = _mm_subs_epi16(xmm4, xmm5); + rho_rpi_5_3 = _mm_adds_epi16(xmm4, xmm6); + rho_rmi_5_3 = _mm_subs_epi16(xmm4, xmm6); + rho_rpi_5_7 = _mm_adds_epi16(xmm4, xmm8); + rho_rmi_5_7 = _mm_subs_epi16(xmm4, xmm8); + + xmm4 = _mm_mulhi_epi16(xmm2, SEVEN_OVER_SQRT_42); + xmm4 = _mm_slli_epi16(xmm4, 2); + rho_rpi_7_1 = _mm_adds_epi16(xmm4, xmm5); + rho_rmi_7_1 = _mm_subs_epi16(xmm4, xmm5); + rho_rpi_7_3 = _mm_adds_epi16(xmm4, xmm6); + rho_rmi_7_3 = _mm_subs_epi16(xmm4, xmm6); + rho_rpi_7_5 = _mm_adds_epi16(xmm4, xmm7); + rho_rmi_7_5 = _mm_subs_epi16(xmm4, xmm7); + + // Rearrange interfering MF output + xmm0 = stream1_128i_in[i]; + xmm1 = stream1_128i_in[i+1]; + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] + y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)] + + // Psi_r calculation from rho_rpi or rho_rmi + xmm0 = _mm_setzero_si128(); // ZERO for abs_pi16 + xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1r); + psi_r_p7_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1r); + psi_r_p7_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1r); + psi_r_p7_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1r); + psi_r_p7_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1r); + psi_r_p7_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1r); + psi_r_p7_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1r); + psi_r_p7_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1r); + psi_r_p7_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1r); + psi_r_p5_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1r); + psi_r_p5_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1r); + psi_r_p5_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1r); + psi_r_p5_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1r); + psi_r_p5_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1r); + psi_r_p5_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1r); + psi_r_p5_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1r); + psi_r_p5_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1r); + psi_r_p3_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1r); + psi_r_p3_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1r); + psi_r_p3_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1r); + psi_r_p3_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1r); + psi_r_p3_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1r); + psi_r_p3_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1r); + psi_r_p3_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1r); + psi_r_p3_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1r); + psi_r_p1_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1r); + psi_r_p1_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1r); + psi_r_p1_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1r); + psi_r_p1_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1r); + psi_r_p1_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1r); + psi_r_p1_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1r); + psi_r_p1_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1r); + psi_r_p1_m7 = _mm_abs_epi16(xmm2); + + xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1r); + psi_r_m1_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1r); + psi_r_m1_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1r); + psi_r_m1_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1r); + psi_r_m1_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1r); + psi_r_m1_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1r); + psi_r_m1_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1r); + psi_r_m1_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1r); + psi_r_m1_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1r); + psi_r_m3_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1r); + psi_r_m3_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1r); + psi_r_m3_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1r); + psi_r_m3_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1r); + psi_r_m3_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1r); + psi_r_m3_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1r); + psi_r_m3_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1r); + psi_r_m3_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1r); + psi_r_m5_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1r); + psi_r_m5_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1r); + psi_r_m5_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1r); + psi_r_m5_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1r); + psi_r_m5_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1r); + psi_r_m5_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1r); + psi_r_m5_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1r); + psi_r_m5_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1r); + psi_r_m7_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1r); + psi_r_m7_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1r); + psi_r_m7_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1r); + psi_r_m7_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1r); + psi_r_m7_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1r); + psi_r_m7_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1r); + psi_r_m7_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1r); + psi_r_m7_m7 = _mm_abs_epi16(xmm2); + + // Psi_i calculation from rho_rpi or rho_rmi + xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1i); + psi_i_p7_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1i); + psi_i_p7_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1i); + psi_i_p7_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1i); + psi_i_p7_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1i); + psi_i_p7_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1i); + psi_i_p7_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1i); + psi_i_p7_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1i); + psi_i_p7_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1i); + psi_i_p5_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1i); + psi_i_p5_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1i); + psi_i_p5_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1i); + psi_i_p5_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1i); + psi_i_p5_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1i); + psi_i_p5_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1i); + psi_i_p5_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1i); + psi_i_p5_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1i); + psi_i_p3_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1i); + psi_i_p3_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1i); + psi_i_p3_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1i); + psi_i_p3_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1i); + psi_i_p3_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1i); + psi_i_p3_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1i); + psi_i_p3_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1i); + psi_i_p3_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1i); + psi_i_p1_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1i); + psi_i_p1_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1i); + psi_i_p1_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1i); + psi_i_p1_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1i); + psi_i_p1_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1i); + psi_i_p1_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1i); + psi_i_p1_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1i); + psi_i_p1_m7 = _mm_abs_epi16(xmm2); + + xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1i); + psi_i_m1_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1i); + psi_i_m1_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1i); + psi_i_m1_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1i); + psi_i_m1_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1i); + psi_i_m1_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1i); + psi_i_m1_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1i); + psi_i_m1_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1i); + psi_i_m1_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1i); + psi_i_m3_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1i); + psi_i_m3_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1i); + psi_i_m3_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1i); + psi_i_m3_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1i); + psi_i_m3_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1i); + psi_i_m3_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1i); + psi_i_m3_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1i); + psi_i_m3_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1i); + psi_i_m5_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1i); + psi_i_m5_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1i); + psi_i_m5_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1i); + psi_i_m5_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1i); + psi_i_m5_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1i); + psi_i_m5_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1i); + psi_i_m5_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1i); + psi_i_m5_m7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1i); + psi_i_m7_p7 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1i); + psi_i_m7_p5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1i); + psi_i_m7_p3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1i); + psi_i_m7_p1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1i); + psi_i_m7_m1 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1i); + psi_i_m7_m3 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1i); + psi_i_m7_m5 = _mm_abs_epi16(xmm2); + xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1i); + psi_i_m7_m7 = _mm_abs_epi16(xmm2); + + + // Rearrange desired MF output + xmm0 = stream0_128i_in[i]; + xmm1 = stream0_128i_in[i+1]; + xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)] + //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)] + y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] + y0i = _mm_unpackhi_epi64(xmm0,xmm1); + + // Rearrange desired channel magnitudes + xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10)) + xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10)) + xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3); + + // Rearrange interfering channel magnitudes + xmm2 = ch_mag_128i_i[i]; + xmm3 = ch_mag_128i_i[i+1]; + xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); + ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3); + + y0r_one_over_sqrt_21 = _mm_mulhi_epi16(y0r, ONE_OVER_SQRT_42); + y0r_three_over_sqrt_21 = _mm_mulhi_epi16(y0r, THREE_OVER_SQRT_42); + y0r_five_over_sqrt_21 = _mm_mulhi_epi16(y0r, FIVE_OVER_SQRT_42); + y0r_five_over_sqrt_21 = _mm_slli_epi16(y0r_five_over_sqrt_21, 1); + y0r_seven_over_sqrt_21 = _mm_mulhi_epi16(y0r, SEVEN_OVER_SQRT_42); + y0r_seven_over_sqrt_21 = _mm_slli_epi16(y0r_seven_over_sqrt_21, 2); // Q2.14 + + y0i_one_over_sqrt_21 = _mm_mulhi_epi16(y0i, ONE_OVER_SQRT_42); + y0i_three_over_sqrt_21 = _mm_mulhi_epi16(y0i, THREE_OVER_SQRT_42); + y0i_five_over_sqrt_21 = _mm_mulhi_epi16(y0i, FIVE_OVER_SQRT_42); + y0i_five_over_sqrt_21 = _mm_slli_epi16(y0i_five_over_sqrt_21, 1); + y0i_seven_over_sqrt_21 = _mm_mulhi_epi16(y0i, SEVEN_OVER_SQRT_42); + y0i_seven_over_sqrt_21 = _mm_slli_epi16(y0i_seven_over_sqrt_21, 2); // Q2.14 + + y0_p_7_1 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); + y0_p_7_3 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); + y0_p_7_5 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); + y0_p_7_7 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); + y0_p_5_1 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); + y0_p_5_3 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); + y0_p_5_5 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); + y0_p_5_7 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); + y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); + y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); + y0_p_3_5 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); + y0_p_3_7 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); + y0_p_1_1 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); + y0_p_1_3 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); + y0_p_1_5 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); + y0_p_1_7 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); + + y0_m_1_1 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); + y0_m_1_3 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); + y0_m_1_5 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); + y0_m_1_7 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); + y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); + y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); + y0_m_3_5 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); + y0_m_3_7 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); + y0_m_5_1 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); + y0_m_5_3 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); + y0_m_5_5 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); + y0_m_5_7 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); + y0_m_7_1 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); + y0_m_7_3 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); + y0_m_7_5 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); + y0_m_7_7 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); + + // Detection of interference term + ch_mag_int_with_sigma2 = _mm_srai_epi16(ch_mag_int, 1); // *2 + two_ch_mag_int_with_sigma2 = ch_mag_int; // *4 + three_ch_mag_int_with_sigma2 = _mm_adds_epi16(ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2); // *6 + + interference_abs_64qam_epi16(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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); + + interference_abs_64qam_epi16(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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); + + // Calculation of a group of two terms in the bit metric involving product of psi and interference + prodsum_psi_a_epi16(psi_r_p7_p7, a_r_p7_p7, psi_i_p7_p7, a_i_p7_p7, psi_a_p7_p7); + prodsum_psi_a_epi16(psi_r_p7_p5, a_r_p7_p5, psi_i_p7_p5, a_i_p7_p5, psi_a_p7_p5); + prodsum_psi_a_epi16(psi_r_p7_p3, a_r_p7_p3, psi_i_p7_p3, a_i_p7_p3, psi_a_p7_p3); + prodsum_psi_a_epi16(psi_r_p7_p1, a_r_p7_p1, psi_i_p7_p1, a_i_p7_p1, psi_a_p7_p1); + prodsum_psi_a_epi16(psi_r_p7_m1, a_r_p7_m1, psi_i_p7_m1, a_i_p7_m1, psi_a_p7_m1); + prodsum_psi_a_epi16(psi_r_p7_m3, a_r_p7_m3, psi_i_p7_m3, a_i_p7_m3, psi_a_p7_m3); + prodsum_psi_a_epi16(psi_r_p7_m5, a_r_p7_m5, psi_i_p7_m5, a_i_p7_m5, psi_a_p7_m5); + prodsum_psi_a_epi16(psi_r_p7_m7, a_r_p7_m7, psi_i_p7_m7, a_i_p7_m7, psi_a_p7_m7); + prodsum_psi_a_epi16(psi_r_p5_p7, a_r_p5_p7, psi_i_p5_p7, a_i_p5_p7, psi_a_p5_p7); + prodsum_psi_a_epi16(psi_r_p5_p5, a_r_p5_p5, psi_i_p5_p5, a_i_p5_p5, psi_a_p5_p5); + prodsum_psi_a_epi16(psi_r_p5_p3, a_r_p5_p3, psi_i_p5_p3, a_i_p5_p3, psi_a_p5_p3); + prodsum_psi_a_epi16(psi_r_p5_p1, a_r_p5_p1, psi_i_p5_p1, a_i_p5_p1, psi_a_p5_p1); + prodsum_psi_a_epi16(psi_r_p5_m1, a_r_p5_m1, psi_i_p5_m1, a_i_p5_m1, psi_a_p5_m1); + prodsum_psi_a_epi16(psi_r_p5_m3, a_r_p5_m3, psi_i_p5_m3, a_i_p5_m3, psi_a_p5_m3); + prodsum_psi_a_epi16(psi_r_p5_m5, a_r_p5_m5, psi_i_p5_m5, a_i_p5_m5, psi_a_p5_m5); + prodsum_psi_a_epi16(psi_r_p5_m7, a_r_p5_m7, psi_i_p5_m7, a_i_p5_m7, psi_a_p5_m7); + prodsum_psi_a_epi16(psi_r_p3_p7, a_r_p3_p7, psi_i_p3_p7, a_i_p3_p7, psi_a_p3_p7); + prodsum_psi_a_epi16(psi_r_p3_p5, a_r_p3_p5, psi_i_p3_p5, a_i_p3_p5, psi_a_p3_p5); + prodsum_psi_a_epi16(psi_r_p3_p3, a_r_p3_p3, psi_i_p3_p3, a_i_p3_p3, psi_a_p3_p3); + prodsum_psi_a_epi16(psi_r_p3_p1, a_r_p3_p1, psi_i_p3_p1, a_i_p3_p1, psi_a_p3_p1); + prodsum_psi_a_epi16(psi_r_p3_m1, a_r_p3_m1, psi_i_p3_m1, a_i_p3_m1, psi_a_p3_m1); + prodsum_psi_a_epi16(psi_r_p3_m3, a_r_p3_m3, psi_i_p3_m3, a_i_p3_m3, psi_a_p3_m3); + prodsum_psi_a_epi16(psi_r_p3_m5, a_r_p3_m5, psi_i_p3_m5, a_i_p3_m5, psi_a_p3_m5); + prodsum_psi_a_epi16(psi_r_p3_m7, a_r_p3_m7, psi_i_p3_m7, a_i_p3_m7, psi_a_p3_m7); + prodsum_psi_a_epi16(psi_r_p1_p7, a_r_p1_p7, psi_i_p1_p7, a_i_p1_p7, psi_a_p1_p7); + prodsum_psi_a_epi16(psi_r_p1_p5, a_r_p1_p5, psi_i_p1_p5, a_i_p1_p5, psi_a_p1_p5); + prodsum_psi_a_epi16(psi_r_p1_p3, a_r_p1_p3, psi_i_p1_p3, a_i_p1_p3, psi_a_p1_p3); + prodsum_psi_a_epi16(psi_r_p1_p1, a_r_p1_p1, psi_i_p1_p1, a_i_p1_p1, psi_a_p1_p1); + prodsum_psi_a_epi16(psi_r_p1_m1, a_r_p1_m1, psi_i_p1_m1, a_i_p1_m1, psi_a_p1_m1); + prodsum_psi_a_epi16(psi_r_p1_m3, a_r_p1_m3, psi_i_p1_m3, a_i_p1_m3, psi_a_p1_m3); + prodsum_psi_a_epi16(psi_r_p1_m5, a_r_p1_m5, psi_i_p1_m5, a_i_p1_m5, psi_a_p1_m5); + prodsum_psi_a_epi16(psi_r_p1_m7, a_r_p1_m7, psi_i_p1_m7, a_i_p1_m7, psi_a_p1_m7); + prodsum_psi_a_epi16(psi_r_m1_p7, a_r_m1_p7, psi_i_m1_p7, a_i_m1_p7, psi_a_m1_p7); + prodsum_psi_a_epi16(psi_r_m1_p5, a_r_m1_p5, psi_i_m1_p5, a_i_m1_p5, psi_a_m1_p5); + prodsum_psi_a_epi16(psi_r_m1_p3, a_r_m1_p3, psi_i_m1_p3, a_i_m1_p3, psi_a_m1_p3); + prodsum_psi_a_epi16(psi_r_m1_p1, a_r_m1_p1, psi_i_m1_p1, a_i_m1_p1, psi_a_m1_p1); + prodsum_psi_a_epi16(psi_r_m1_m1, a_r_m1_m1, psi_i_m1_m1, a_i_m1_m1, psi_a_m1_m1); + prodsum_psi_a_epi16(psi_r_m1_m3, a_r_m1_m3, psi_i_m1_m3, a_i_m1_m3, psi_a_m1_m3); + prodsum_psi_a_epi16(psi_r_m1_m5, a_r_m1_m5, psi_i_m1_m5, a_i_m1_m5, psi_a_m1_m5); + prodsum_psi_a_epi16(psi_r_m1_m7, a_r_m1_m7, psi_i_m1_m7, a_i_m1_m7, psi_a_m1_m7); + prodsum_psi_a_epi16(psi_r_m3_p7, a_r_m3_p7, psi_i_m3_p7, a_i_m3_p7, psi_a_m3_p7); + prodsum_psi_a_epi16(psi_r_m3_p5, a_r_m3_p5, psi_i_m3_p5, a_i_m3_p5, psi_a_m3_p5); + prodsum_psi_a_epi16(psi_r_m3_p3, a_r_m3_p3, psi_i_m3_p3, a_i_m3_p3, psi_a_m3_p3); + prodsum_psi_a_epi16(psi_r_m3_p1, a_r_m3_p1, psi_i_m3_p1, a_i_m3_p1, psi_a_m3_p1); + prodsum_psi_a_epi16(psi_r_m3_m1, a_r_m3_m1, psi_i_m3_m1, a_i_m3_m1, psi_a_m3_m1); + prodsum_psi_a_epi16(psi_r_m3_m3, a_r_m3_m3, psi_i_m3_m3, a_i_m3_m3, psi_a_m3_m3); + prodsum_psi_a_epi16(psi_r_m3_m5, a_r_m3_m5, psi_i_m3_m5, a_i_m3_m5, psi_a_m3_m5); + prodsum_psi_a_epi16(psi_r_m3_m7, a_r_m3_m7, psi_i_m3_m7, a_i_m3_m7, psi_a_m3_m7); + prodsum_psi_a_epi16(psi_r_m5_p7, a_r_m5_p7, psi_i_m5_p7, a_i_m5_p7, psi_a_m5_p7); + prodsum_psi_a_epi16(psi_r_m5_p5, a_r_m5_p5, psi_i_m5_p5, a_i_m5_p5, psi_a_m5_p5); + prodsum_psi_a_epi16(psi_r_m5_p3, a_r_m5_p3, psi_i_m5_p3, a_i_m5_p3, psi_a_m5_p3); + prodsum_psi_a_epi16(psi_r_m5_p1, a_r_m5_p1, psi_i_m5_p1, a_i_m5_p1, psi_a_m5_p1); + prodsum_psi_a_epi16(psi_r_m5_m1, a_r_m5_m1, psi_i_m5_m1, a_i_m5_m1, psi_a_m5_m1); + prodsum_psi_a_epi16(psi_r_m5_m3, a_r_m5_m3, psi_i_m5_m3, a_i_m5_m3, psi_a_m5_m3); + prodsum_psi_a_epi16(psi_r_m5_m5, a_r_m5_m5, psi_i_m5_m5, a_i_m5_m5, psi_a_m5_m5); + prodsum_psi_a_epi16(psi_r_m5_m7, a_r_m5_m7, psi_i_m5_m7, a_i_m5_m7, psi_a_m5_m7); + prodsum_psi_a_epi16(psi_r_m7_p7, a_r_m7_p7, psi_i_m7_p7, a_i_m7_p7, psi_a_m7_p7); + prodsum_psi_a_epi16(psi_r_m7_p5, a_r_m7_p5, psi_i_m7_p5, a_i_m7_p5, psi_a_m7_p5); + prodsum_psi_a_epi16(psi_r_m7_p3, a_r_m7_p3, psi_i_m7_p3, a_i_m7_p3, psi_a_m7_p3); + prodsum_psi_a_epi16(psi_r_m7_p1, a_r_m7_p1, psi_i_m7_p1, a_i_m7_p1, psi_a_m7_p1); + prodsum_psi_a_epi16(psi_r_m7_m1, a_r_m7_m1, psi_i_m7_m1, a_i_m7_m1, psi_a_m7_m1); + prodsum_psi_a_epi16(psi_r_m7_m3, a_r_m7_m3, psi_i_m7_m3, a_i_m7_m3, psi_a_m7_m3); + prodsum_psi_a_epi16(psi_r_m7_m5, a_r_m7_m5, psi_i_m7_m5, a_i_m7_m5, psi_a_m7_m5); + prodsum_psi_a_epi16(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 = _mm_mulhi_epi16(psi_a_p7_p7, ONE_OVER_SQRT_2); + psi_a_p7_p7 = _mm_slli_epi16(psi_a_p7_p7, 2); + psi_a_p7_p5 = _mm_mulhi_epi16(psi_a_p7_p5, ONE_OVER_SQRT_2); + psi_a_p7_p5 = _mm_slli_epi16(psi_a_p7_p5, 2); + psi_a_p7_p3 = _mm_mulhi_epi16(psi_a_p7_p3, ONE_OVER_SQRT_2); + psi_a_p7_p3 = _mm_slli_epi16(psi_a_p7_p3, 2); + psi_a_p7_p1 = _mm_mulhi_epi16(psi_a_p7_p1, ONE_OVER_SQRT_2); + psi_a_p7_p1 = _mm_slli_epi16(psi_a_p7_p1, 2); + psi_a_p7_m1 = _mm_mulhi_epi16(psi_a_p7_m1, ONE_OVER_SQRT_2); + psi_a_p7_m1 = _mm_slli_epi16(psi_a_p7_m1, 2); + psi_a_p7_m3 = _mm_mulhi_epi16(psi_a_p7_m3, ONE_OVER_SQRT_2); + psi_a_p7_m3 = _mm_slli_epi16(psi_a_p7_m3, 2); + psi_a_p7_m5 = _mm_mulhi_epi16(psi_a_p7_m5, ONE_OVER_SQRT_2); + psi_a_p7_m5 = _mm_slli_epi16(psi_a_p7_m5, 2); + psi_a_p7_m7 = _mm_mulhi_epi16(psi_a_p7_m7, ONE_OVER_SQRT_2); + psi_a_p7_m7 = _mm_slli_epi16(psi_a_p7_m7, 2); + psi_a_p5_p7 = _mm_mulhi_epi16(psi_a_p5_p7, ONE_OVER_SQRT_2); + psi_a_p5_p7 = _mm_slli_epi16(psi_a_p5_p7, 2); + psi_a_p5_p5 = _mm_mulhi_epi16(psi_a_p5_p5, ONE_OVER_SQRT_2); + psi_a_p5_p5 = _mm_slli_epi16(psi_a_p5_p5, 2); + psi_a_p5_p3 = _mm_mulhi_epi16(psi_a_p5_p3, ONE_OVER_SQRT_2); + psi_a_p5_p3 = _mm_slli_epi16(psi_a_p5_p3, 2); + psi_a_p5_p1 = _mm_mulhi_epi16(psi_a_p5_p1, ONE_OVER_SQRT_2); + psi_a_p5_p1 = _mm_slli_epi16(psi_a_p5_p1, 2); + psi_a_p5_m1 = _mm_mulhi_epi16(psi_a_p5_m1, ONE_OVER_SQRT_2); + psi_a_p5_m1 = _mm_slli_epi16(psi_a_p5_m1, 2); + psi_a_p5_m3 = _mm_mulhi_epi16(psi_a_p5_m3, ONE_OVER_SQRT_2); + psi_a_p5_m3 = _mm_slli_epi16(psi_a_p5_m3, 2); + psi_a_p5_m5 = _mm_mulhi_epi16(psi_a_p5_m5, ONE_OVER_SQRT_2); + psi_a_p5_m5 = _mm_slli_epi16(psi_a_p5_m5, 2); + psi_a_p5_m7 = _mm_mulhi_epi16(psi_a_p5_m7, ONE_OVER_SQRT_2); + psi_a_p5_m7 = _mm_slli_epi16(psi_a_p5_m7, 2); + psi_a_p3_p7 = _mm_mulhi_epi16(psi_a_p3_p7, ONE_OVER_SQRT_2); + psi_a_p3_p7 = _mm_slli_epi16(psi_a_p3_p7, 2); + psi_a_p3_p5 = _mm_mulhi_epi16(psi_a_p3_p5, ONE_OVER_SQRT_2); + psi_a_p3_p5 = _mm_slli_epi16(psi_a_p3_p5, 2); + psi_a_p3_p3 = _mm_mulhi_epi16(psi_a_p3_p3, ONE_OVER_SQRT_2); + psi_a_p3_p3 = _mm_slli_epi16(psi_a_p3_p3, 2); + psi_a_p3_p1 = _mm_mulhi_epi16(psi_a_p3_p1, ONE_OVER_SQRT_2); + psi_a_p3_p1 = _mm_slli_epi16(psi_a_p3_p1, 2); + psi_a_p3_m1 = _mm_mulhi_epi16(psi_a_p3_m1, ONE_OVER_SQRT_2); + psi_a_p3_m1 = _mm_slli_epi16(psi_a_p3_m1, 2); + psi_a_p3_m3 = _mm_mulhi_epi16(psi_a_p3_m3, ONE_OVER_SQRT_2); + psi_a_p3_m3 = _mm_slli_epi16(psi_a_p3_m3, 2); + psi_a_p3_m5 = _mm_mulhi_epi16(psi_a_p3_m5, ONE_OVER_SQRT_2); + psi_a_p3_m5 = _mm_slli_epi16(psi_a_p3_m5, 2); + psi_a_p3_m7 = _mm_mulhi_epi16(psi_a_p3_m7, ONE_OVER_SQRT_2); + psi_a_p3_m7 = _mm_slli_epi16(psi_a_p3_m7, 2); + psi_a_p1_p7 = _mm_mulhi_epi16(psi_a_p1_p7, ONE_OVER_SQRT_2); + psi_a_p1_p7 = _mm_slli_epi16(psi_a_p1_p7, 2); + psi_a_p1_p5 = _mm_mulhi_epi16(psi_a_p1_p5, ONE_OVER_SQRT_2); + psi_a_p1_p5 = _mm_slli_epi16(psi_a_p1_p5, 2); + psi_a_p1_p3 = _mm_mulhi_epi16(psi_a_p1_p3, ONE_OVER_SQRT_2); + psi_a_p1_p3 = _mm_slli_epi16(psi_a_p1_p3, 2); + psi_a_p1_p1 = _mm_mulhi_epi16(psi_a_p1_p1, ONE_OVER_SQRT_2); + psi_a_p1_p1 = _mm_slli_epi16(psi_a_p1_p1, 2); + psi_a_p1_m1 = _mm_mulhi_epi16(psi_a_p1_m1, ONE_OVER_SQRT_2); + psi_a_p1_m1 = _mm_slli_epi16(psi_a_p1_m1, 2); + psi_a_p1_m3 = _mm_mulhi_epi16(psi_a_p1_m3, ONE_OVER_SQRT_2); + psi_a_p1_m3 = _mm_slli_epi16(psi_a_p1_m3, 2); + psi_a_p1_m5 = _mm_mulhi_epi16(psi_a_p1_m5, ONE_OVER_SQRT_2); + psi_a_p1_m5 = _mm_slli_epi16(psi_a_p1_m5, 2); + psi_a_p1_m7 = _mm_mulhi_epi16(psi_a_p1_m7, ONE_OVER_SQRT_2); + psi_a_p1_m7 = _mm_slli_epi16(psi_a_p1_m7, 2); + psi_a_m1_p7 = _mm_mulhi_epi16(psi_a_m1_p7, ONE_OVER_SQRT_2); + psi_a_m1_p7 = _mm_slli_epi16(psi_a_m1_p7, 2); + psi_a_m1_p5 = _mm_mulhi_epi16(psi_a_m1_p5, ONE_OVER_SQRT_2); + psi_a_m1_p5 = _mm_slli_epi16(psi_a_m1_p5, 2); + psi_a_m1_p3 = _mm_mulhi_epi16(psi_a_m1_p3, ONE_OVER_SQRT_2); + psi_a_m1_p3 = _mm_slli_epi16(psi_a_m1_p3, 2); + psi_a_m1_p1 = _mm_mulhi_epi16(psi_a_m1_p1, ONE_OVER_SQRT_2); + psi_a_m1_p1 = _mm_slli_epi16(psi_a_m1_p1, 2); + psi_a_m1_m1 = _mm_mulhi_epi16(psi_a_m1_m1, ONE_OVER_SQRT_2); + psi_a_m1_m1 = _mm_slli_epi16(psi_a_m1_m1, 2); + psi_a_m1_m3 = _mm_mulhi_epi16(psi_a_m1_m3, ONE_OVER_SQRT_2); + psi_a_m1_m3 = _mm_slli_epi16(psi_a_m1_m3, 2); + psi_a_m1_m5 = _mm_mulhi_epi16(psi_a_m1_m5, ONE_OVER_SQRT_2); + psi_a_m1_m5 = _mm_slli_epi16(psi_a_m1_m5, 2); + psi_a_m1_m7 = _mm_mulhi_epi16(psi_a_m1_m7, ONE_OVER_SQRT_2); + psi_a_m1_m7 = _mm_slli_epi16(psi_a_m1_m7, 2); + psi_a_m3_p7 = _mm_mulhi_epi16(psi_a_m3_p7, ONE_OVER_SQRT_2); + psi_a_m3_p7 = _mm_slli_epi16(psi_a_m3_p7, 2); + psi_a_m3_p5 = _mm_mulhi_epi16(psi_a_m3_p5, ONE_OVER_SQRT_2); + psi_a_m3_p5 = _mm_slli_epi16(psi_a_m3_p5, 2); + psi_a_m3_p3 = _mm_mulhi_epi16(psi_a_m3_p3, ONE_OVER_SQRT_2); + psi_a_m3_p3 = _mm_slli_epi16(psi_a_m3_p3, 2); + psi_a_m3_p1 = _mm_mulhi_epi16(psi_a_m3_p1, ONE_OVER_SQRT_2); + psi_a_m3_p1 = _mm_slli_epi16(psi_a_m3_p1, 2); + psi_a_m3_m1 = _mm_mulhi_epi16(psi_a_m3_m1, ONE_OVER_SQRT_2); + psi_a_m3_m1 = _mm_slli_epi16(psi_a_m3_m1, 2); + psi_a_m3_m3 = _mm_mulhi_epi16(psi_a_m3_m3, ONE_OVER_SQRT_2); + psi_a_m3_m3 = _mm_slli_epi16(psi_a_m3_m3, 2); + psi_a_m3_m5 = _mm_mulhi_epi16(psi_a_m3_m5, ONE_OVER_SQRT_2); + psi_a_m3_m5 = _mm_slli_epi16(psi_a_m3_m5, 2); + psi_a_m3_m7 = _mm_mulhi_epi16(psi_a_m3_m7, ONE_OVER_SQRT_2); + psi_a_m3_m7 = _mm_slli_epi16(psi_a_m3_m7, 2); + psi_a_m5_p7 = _mm_mulhi_epi16(psi_a_m5_p7, ONE_OVER_SQRT_2); + psi_a_m5_p7 = _mm_slli_epi16(psi_a_m5_p7, 2); + psi_a_m5_p5 = _mm_mulhi_epi16(psi_a_m5_p5, ONE_OVER_SQRT_2); + psi_a_m5_p5 = _mm_slli_epi16(psi_a_m5_p5, 2); + psi_a_m5_p3 = _mm_mulhi_epi16(psi_a_m5_p3, ONE_OVER_SQRT_2); + psi_a_m5_p3 = _mm_slli_epi16(psi_a_m5_p3, 2); + psi_a_m5_p1 = _mm_mulhi_epi16(psi_a_m5_p1, ONE_OVER_SQRT_2); + psi_a_m5_p1 = _mm_slli_epi16(psi_a_m5_p1, 2); + psi_a_m5_m1 = _mm_mulhi_epi16(psi_a_m5_m1, ONE_OVER_SQRT_2); + psi_a_m5_m1 = _mm_slli_epi16(psi_a_m5_m1, 2); + psi_a_m5_m3 = _mm_mulhi_epi16(psi_a_m5_m3, ONE_OVER_SQRT_2); + psi_a_m5_m3 = _mm_slli_epi16(psi_a_m5_m3, 2); + psi_a_m5_m5 = _mm_mulhi_epi16(psi_a_m5_m5, ONE_OVER_SQRT_2); + psi_a_m5_m5 = _mm_slli_epi16(psi_a_m5_m5, 2); + psi_a_m5_m7 = _mm_mulhi_epi16(psi_a_m5_m7, ONE_OVER_SQRT_2); + psi_a_m5_m7 = _mm_slli_epi16(psi_a_m5_m7, 2); + psi_a_m7_p7 = _mm_mulhi_epi16(psi_a_m7_p7, ONE_OVER_SQRT_2); + psi_a_m7_p7 = _mm_slli_epi16(psi_a_m7_p7, 2); + psi_a_m7_p5 = _mm_mulhi_epi16(psi_a_m7_p5, ONE_OVER_SQRT_2); + psi_a_m7_p5 = _mm_slli_epi16(psi_a_m7_p5, 2); + psi_a_m7_p3 = _mm_mulhi_epi16(psi_a_m7_p3, ONE_OVER_SQRT_2); + psi_a_m7_p3 = _mm_slli_epi16(psi_a_m7_p3, 2); + psi_a_m7_p1 = _mm_mulhi_epi16(psi_a_m7_p1, ONE_OVER_SQRT_2); + psi_a_m7_p1 = _mm_slli_epi16(psi_a_m7_p1, 2); + psi_a_m7_m1 = _mm_mulhi_epi16(psi_a_m7_m1, ONE_OVER_SQRT_2); + psi_a_m7_m1 = _mm_slli_epi16(psi_a_m7_m1, 2); + psi_a_m7_m3 = _mm_mulhi_epi16(psi_a_m7_m3, ONE_OVER_SQRT_2); + psi_a_m7_m3 = _mm_slli_epi16(psi_a_m7_m3, 2); + psi_a_m7_m5 = _mm_mulhi_epi16(psi_a_m7_m5, ONE_OVER_SQRT_2); + psi_a_m7_m5 = _mm_slli_epi16(psi_a_m7_m5, 2); + psi_a_m7_m7 = _mm_mulhi_epi16(psi_a_m7_m7, ONE_OVER_SQRT_2); + psi_a_m7_m7 = _mm_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(a_r_p7_p7, a_i_p7_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_p7); + square_a_64qam_epi16(a_r_p7_p5, a_i_p7_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_p5); + square_a_64qam_epi16(a_r_p7_p3, a_i_p7_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_p3); + square_a_64qam_epi16(a_r_p7_p1, a_i_p7_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_p1); + square_a_64qam_epi16(a_r_p7_m1, a_i_p7_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_m1); + square_a_64qam_epi16(a_r_p7_m3, a_i_p7_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_m3); + square_a_64qam_epi16(a_r_p7_m5, a_i_p7_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_m5); + square_a_64qam_epi16(a_r_p7_m7, a_i_p7_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_m7); + square_a_64qam_epi16(a_r_p5_p7, a_i_p5_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_p7); + square_a_64qam_epi16(a_r_p5_p5, a_i_p5_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_p5); + square_a_64qam_epi16(a_r_p5_p3, a_i_p5_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_p3); + square_a_64qam_epi16(a_r_p5_p1, a_i_p5_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_p1); + square_a_64qam_epi16(a_r_p5_m1, a_i_p5_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_m1); + square_a_64qam_epi16(a_r_p5_m3, a_i_p5_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_m3); + square_a_64qam_epi16(a_r_p5_m5, a_i_p5_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_m5); + square_a_64qam_epi16(a_r_p5_m7, a_i_p5_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_m7); + square_a_64qam_epi16(a_r_p3_p7, a_i_p3_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_p7); + square_a_64qam_epi16(a_r_p3_p5, a_i_p3_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_p5); + square_a_64qam_epi16(a_r_p3_p3, a_i_p3_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_p3); + square_a_64qam_epi16(a_r_p3_p1, a_i_p3_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_p1); + square_a_64qam_epi16(a_r_p3_m1, a_i_p3_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_m1); + square_a_64qam_epi16(a_r_p3_m3, a_i_p3_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_m3); + square_a_64qam_epi16(a_r_p3_m5, a_i_p3_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_m5); + square_a_64qam_epi16(a_r_p3_m7, a_i_p3_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_m7); + square_a_64qam_epi16(a_r_p1_p7, a_i_p1_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p7); + square_a_64qam_epi16(a_r_p1_p5, a_i_p1_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p5); + square_a_64qam_epi16(a_r_p1_p3, a_i_p1_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p3); + square_a_64qam_epi16(a_r_p1_p1, a_i_p1_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p1); + square_a_64qam_epi16(a_r_p1_m1, a_i_p1_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m1); + square_a_64qam_epi16(a_r_p1_m3, a_i_p1_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m3); + square_a_64qam_epi16(a_r_p1_m5, a_i_p1_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m5); + square_a_64qam_epi16(a_r_p1_m7, a_i_p1_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m7); + square_a_64qam_epi16(a_r_m1_p7, a_i_m1_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p7); + square_a_64qam_epi16(a_r_m1_p5, a_i_m1_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p5); + square_a_64qam_epi16(a_r_m1_p3, a_i_m1_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p3); + square_a_64qam_epi16(a_r_m1_p1, a_i_m1_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p1); + square_a_64qam_epi16(a_r_m1_m1, a_i_m1_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m1); + square_a_64qam_epi16(a_r_m1_m3, a_i_m1_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m3); + square_a_64qam_epi16(a_r_m1_m5, a_i_m1_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m5); + square_a_64qam_epi16(a_r_m1_m7, a_i_m1_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m7); + square_a_64qam_epi16(a_r_m3_p7, a_i_m3_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_p7); + square_a_64qam_epi16(a_r_m3_p5, a_i_m3_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_p5); + square_a_64qam_epi16(a_r_m3_p3, a_i_m3_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_p3); + square_a_64qam_epi16(a_r_m3_p1, a_i_m3_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_p1); + square_a_64qam_epi16(a_r_m3_m1, a_i_m3_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_m1); + square_a_64qam_epi16(a_r_m3_m3, a_i_m3_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_m3); + square_a_64qam_epi16(a_r_m3_m5, a_i_m3_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_m5); + square_a_64qam_epi16(a_r_m3_m7, a_i_m3_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_m7); + square_a_64qam_epi16(a_r_m5_p7, a_i_m5_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_p7); + square_a_64qam_epi16(a_r_m5_p5, a_i_m5_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_p5); + square_a_64qam_epi16(a_r_m5_p3, a_i_m5_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_p3); + square_a_64qam_epi16(a_r_m5_p1, a_i_m5_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_p1); + square_a_64qam_epi16(a_r_m5_m1, a_i_m5_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_m1); + square_a_64qam_epi16(a_r_m5_m3, a_i_m5_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_m3); + square_a_64qam_epi16(a_r_m5_m5, a_i_m5_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_m5); + square_a_64qam_epi16(a_r_m5_m7, a_i_m5_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_m7); + square_a_64qam_epi16(a_r_m7_p7, a_i_m7_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_p7); + square_a_64qam_epi16(a_r_m7_p5, a_i_m7_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_p5); + square_a_64qam_epi16(a_r_m7_p3, a_i_m7_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_p3); + square_a_64qam_epi16(a_r_m7_p1, a_i_m7_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_p1); + square_a_64qam_epi16(a_r_m7_m1, a_i_m7_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_m1); + square_a_64qam_epi16(a_r_m7_m3, a_i_m7_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_m3); + square_a_64qam_epi16(a_r_m7_m5, a_i_m7_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_m5); + square_a_64qam_epi16(a_r_m7_m7, a_i_m7_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_m7); + + // Computing different multiples of ||h0||^2 + // x=1, y=1 + ch_mag_2_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,ONE_OVER_FOUR_SQRT_42); + ch_mag_2_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_2_over_42_with_sigma2,1); + // x=1, y=3 + ch_mag_10_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FIVE_OVER_FOUR_SQRT_42); + ch_mag_10_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_10_over_42_with_sigma2,1); + // x=1, x=5 + ch_mag_26_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTEEN_OVER_FOUR_SQRT_42); + ch_mag_26_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_26_over_42_with_sigma2,1); + // x=1, y=7 + ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42); + ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1); + // x=3, y=3 + ch_mag_18_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,NINE_OVER_FOUR_SQRT_42); + ch_mag_18_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_18_over_42_with_sigma2,1); + // x=3, y=5 + ch_mag_34_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,SEVENTEEN_OVER_FOUR_SQRT_42); + ch_mag_34_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_34_over_42_with_sigma2,1); + // x=3, y=7 + ch_mag_58_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYNINE_OVER_FOUR_SQRT_42); + ch_mag_58_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_58_over_42_with_sigma2,2); + // x=5, y=5 + ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42); + ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1); + // x=5, y=7 + ch_mag_74_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTYSEVEN_OVER_FOUR_SQRT_42); + ch_mag_74_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_74_over_42_with_sigma2,2); + // x=7, y=7 + ch_mag_98_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FORTYNINE_OVER_FOUR_SQRT_42); + ch_mag_98_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_98_over_42_with_sigma2,2); + + // Computing Metrics + xmm0 = _mm_subs_epi16(psi_a_p7_p7, a_sq_p7_p7); + xmm1 = _mm_adds_epi16(xmm0, y0_p_7_7); + bit_met_p7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p7_p5, a_sq_p7_p5); + xmm1 = _mm_adds_epi16(xmm0, y0_p_7_5); + bit_met_p7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p7_p3, a_sq_p7_p3); + xmm1 = _mm_adds_epi16(xmm0, y0_p_7_3); + bit_met_p7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p7_p1, a_sq_p7_p1); + xmm1 = _mm_adds_epi16(xmm0, y0_p_7_1); + bit_met_p7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p7_m1, a_sq_p7_m1); + xmm1 = _mm_adds_epi16(xmm0, y0_m_7_1); + bit_met_p7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p7_m3, a_sq_p7_m3); + xmm1 = _mm_adds_epi16(xmm0, y0_m_7_3); + bit_met_p7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p7_m5, a_sq_p7_m5); + xmm1 = _mm_adds_epi16(xmm0, y0_m_7_5); + bit_met_p7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p7_m7, a_sq_p7_m7); + xmm1 = _mm_adds_epi16(xmm0, y0_m_7_7); + bit_met_p7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p5_p7, a_sq_p5_p7); + xmm1 = _mm_adds_epi16(xmm0, y0_p_5_7); + bit_met_p5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p5_p5, a_sq_p5_p5); + xmm1 = _mm_adds_epi16(xmm0, y0_p_5_5); + bit_met_p5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p5_p3, a_sq_p5_p3); + xmm1 = _mm_adds_epi16(xmm0, y0_p_5_3); + bit_met_p5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p5_p1, a_sq_p5_p1); + xmm1 = _mm_adds_epi16(xmm0, y0_p_5_1); + bit_met_p5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p5_m1, a_sq_p5_m1); + xmm1 = _mm_adds_epi16(xmm0, y0_m_5_1); + bit_met_p5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p5_m3, a_sq_p5_m3); + xmm1 = _mm_adds_epi16(xmm0, y0_m_5_3); + bit_met_p5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p5_m5, a_sq_p5_m5); + xmm1 = _mm_adds_epi16(xmm0, y0_m_5_5); + bit_met_p5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p5_m7, a_sq_p5_m7); + xmm1 = _mm_adds_epi16(xmm0, y0_m_5_7); + bit_met_p5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p3_p7, a_sq_p3_p7); + xmm1 = _mm_adds_epi16(xmm0, y0_p_3_7); + bit_met_p3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p3_p5, a_sq_p3_p5); + xmm1 = _mm_adds_epi16(xmm0, y0_p_3_5); + bit_met_p3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p3_p3, a_sq_p3_p3); + xmm1 = _mm_adds_epi16(xmm0, y0_p_3_3); + bit_met_p3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p3_p1, a_sq_p3_p1); + xmm1 = _mm_adds_epi16(xmm0, y0_p_3_1); + bit_met_p3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p3_m1, a_sq_p3_m1); + xmm1 = _mm_adds_epi16(xmm0, y0_m_3_1); + bit_met_p3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p3_m3, a_sq_p3_m3); + xmm1 = _mm_adds_epi16(xmm0, y0_m_3_3); + bit_met_p3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p3_m5, a_sq_p3_m5); + xmm1 = _mm_adds_epi16(xmm0, y0_m_3_5); + bit_met_p3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p3_m7, a_sq_p3_m7); + xmm1 = _mm_adds_epi16(xmm0, y0_m_3_7); + bit_met_p3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p1_p7, a_sq_p1_p7); + xmm1 = _mm_adds_epi16(xmm0, y0_p_1_7); + bit_met_p1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p1_p5, a_sq_p1_p5); + xmm1 = _mm_adds_epi16(xmm0, y0_p_1_5); + bit_met_p1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p1_p3, a_sq_p1_p3); + xmm1 = _mm_adds_epi16(xmm0, y0_p_1_3); + bit_met_p1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p1_p1, a_sq_p1_p1); + xmm1 = _mm_adds_epi16(xmm0, y0_p_1_1); + bit_met_p1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p1_m1, a_sq_p1_m1); + xmm1 = _mm_adds_epi16(xmm0, y0_m_1_1); + bit_met_p1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p1_m3, a_sq_p1_m3); + xmm1 = _mm_adds_epi16(xmm0, y0_m_1_3); + bit_met_p1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p1_m5, a_sq_p1_m5); + xmm1 = _mm_adds_epi16(xmm0, y0_m_1_5); + bit_met_p1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_p1_m7, a_sq_p1_m7); + xmm1 = _mm_adds_epi16(xmm0, y0_m_1_7); + bit_met_p1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + + xmm0 = _mm_subs_epi16(psi_a_m1_p7, a_sq_m1_p7); + xmm1 = _mm_subs_epi16(xmm0, y0_m_1_7); + bit_met_m1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m1_p5, a_sq_m1_p5); + xmm1 = _mm_subs_epi16(xmm0, y0_m_1_5); + bit_met_m1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m1_p3, a_sq_m1_p3); + xmm1 = _mm_subs_epi16(xmm0, y0_m_1_3); + bit_met_m1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m1_p1, a_sq_m1_p1); + xmm1 = _mm_subs_epi16(xmm0, y0_m_1_1); + bit_met_m1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m1_m1, a_sq_m1_m1); + xmm1 = _mm_subs_epi16(xmm0, y0_p_1_1); + bit_met_m1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m1_m3, a_sq_m1_m3); + xmm1 = _mm_subs_epi16(xmm0, y0_p_1_3); + bit_met_m1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m1_m5, a_sq_m1_m5); + xmm1 = _mm_subs_epi16(xmm0, y0_p_1_5); + bit_met_m1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m1_m7, a_sq_m1_m7); + xmm1 = _mm_subs_epi16(xmm0, y0_p_1_7); + bit_met_m1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m3_p7, a_sq_m3_p7); + xmm1 = _mm_subs_epi16(xmm0, y0_m_3_7); + bit_met_m3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m3_p5, a_sq_m3_p5); + xmm1 = _mm_subs_epi16(xmm0, y0_m_3_5); + bit_met_m3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m3_p3, a_sq_m3_p3); + xmm1 = _mm_subs_epi16(xmm0, y0_m_3_3); + bit_met_m3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m3_p1, a_sq_m3_p1); + xmm1 = _mm_subs_epi16(xmm0, y0_m_3_1); + bit_met_m3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m3_m1, a_sq_m3_m1); + xmm1 = _mm_subs_epi16(xmm0, y0_p_3_1); + bit_met_m3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m3_m3, a_sq_m3_m3); + xmm1 = _mm_subs_epi16(xmm0, y0_p_3_3); + bit_met_m3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m3_m5, a_sq_m3_m5); + xmm1 = _mm_subs_epi16(xmm0, y0_p_3_5); + bit_met_m3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m3_m7, a_sq_m3_m7); + xmm1 = _mm_subs_epi16(xmm0, y0_p_3_7); + bit_met_m3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m5_p7, a_sq_m5_p7); + xmm1 = _mm_subs_epi16(xmm0, y0_m_5_7); + bit_met_m5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m5_p5, a_sq_m5_p5); + xmm1 = _mm_subs_epi16(xmm0, y0_m_5_5); + bit_met_m5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m5_p3, a_sq_m5_p3); + xmm1 = _mm_subs_epi16(xmm0, y0_m_5_3); + bit_met_m5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m5_p1, a_sq_m5_p1); + xmm1 = _mm_subs_epi16(xmm0, y0_m_5_1); + bit_met_m5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m5_m1, a_sq_m5_m1); + xmm1 = _mm_subs_epi16(xmm0, y0_p_5_1); + bit_met_m5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m5_m3, a_sq_m5_m3); + xmm1 = _mm_subs_epi16(xmm0, y0_p_5_3); + bit_met_m5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m5_m5, a_sq_m5_m5); + xmm1 = _mm_subs_epi16(xmm0, y0_p_5_5); + bit_met_m5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m5_m7, a_sq_m5_m7); + xmm1 = _mm_subs_epi16(xmm0, y0_p_5_7); + bit_met_m5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m7_p7, a_sq_m7_p7); + xmm1 = _mm_subs_epi16(xmm0, y0_m_7_7); + bit_met_m7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m7_p5, a_sq_m7_p5); + xmm1 = _mm_subs_epi16(xmm0, y0_m_7_5); + bit_met_m7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m7_p3, a_sq_m7_p3); + xmm1 = _mm_subs_epi16(xmm0, y0_m_7_3); + bit_met_m7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m7_p1, a_sq_m7_p1); + xmm1 = _mm_subs_epi16(xmm0, y0_m_7_1); + bit_met_m7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m7_m1, a_sq_m7_m1); + xmm1 = _mm_subs_epi16(xmm0, y0_p_7_1); + bit_met_m7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m7_m3, a_sq_m7_m3); + xmm1 = _mm_subs_epi16(xmm0, y0_p_7_3); + bit_met_m7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m7_m5, a_sq_m7_m5); + xmm1 = _mm_subs_epi16(xmm0, y0_p_7_5); + bit_met_m7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + xmm0 = _mm_subs_epi16(psi_a_m7_m7, a_sq_m7_m7); + xmm1 = _mm_subs_epi16(xmm0, y0_p_7_7); + bit_met_m7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); + + // Detection for 1st bit (LTE mapping) + // bit = 1 + xmm0 = _mm_max_epi16(bit_met_m7_p7, bit_met_m7_p5); + xmm1 = _mm_max_epi16(bit_met_m7_p3, bit_met_m7_p1); + xmm2 = _mm_max_epi16(bit_met_m7_m1, bit_met_m7_m3); + xmm3 = _mm_max_epi16(bit_met_m7_m5, bit_met_m7_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_m5_p7, bit_met_m5_p5); + xmm1 = _mm_max_epi16(bit_met_m5_p3, bit_met_m5_p1); + xmm2 = _mm_max_epi16(bit_met_m5_m1, bit_met_m5_m3); + xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m5_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_m3_p7, bit_met_m3_p5); + xmm1 = _mm_max_epi16(bit_met_m3_p3, bit_met_m3_p1); + xmm2 = _mm_max_epi16(bit_met_m3_m1, bit_met_m3_m3); + xmm3 = _mm_max_epi16(bit_met_m3_m5, bit_met_m3_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_m1_p7, bit_met_m1_p5); + xmm1 = _mm_max_epi16(bit_met_m1_p3, bit_met_m1_p1); + xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m1_m3); + xmm3 = _mm_max_epi16(bit_met_m1_m5, bit_met_m1_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + + // bit = 0 + xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p7_p5); + xmm1 = _mm_max_epi16(bit_met_p7_p3, bit_met_p7_p1); + xmm2 = _mm_max_epi16(bit_met_p7_m1, bit_met_p7_m3); + xmm3 = _mm_max_epi16(bit_met_p7_m5, bit_met_p7_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_p5_p7, bit_met_p5_p5); + xmm1 = _mm_max_epi16(bit_met_p5_p3, bit_met_p5_p1); + xmm2 = _mm_max_epi16(bit_met_p5_m1, bit_met_p5_m3); + xmm3 = _mm_max_epi16(bit_met_p5_m5, bit_met_p5_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p3_p7, bit_met_p3_p5); + xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p3_p1); + xmm2 = _mm_max_epi16(bit_met_p3_m1, bit_met_p3_m3); + xmm3 = _mm_max_epi16(bit_met_p3_m5, bit_met_p3_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p1_p7, bit_met_p1_p5); + xmm1 = _mm_max_epi16(bit_met_p1_p3, bit_met_p1_p1); + xmm2 = _mm_max_epi16(bit_met_p1_m1, bit_met_p1_m3); + xmm3 = _mm_max_epi16(bit_met_p1_m5, bit_met_p1_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + + y0r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + // Detection for 2nd bit (LTE mapping) + // bit = 1 + xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1); + xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1); + xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1); + xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3); + xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3); + xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3); + xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5); + xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5); + xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5); + xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7); + xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7); + xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7); + xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + + // bit = 0 + xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1); + xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1); + xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1); + xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3); + xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3); + xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3); + xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5); + xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5); + xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5); + xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7); + xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7); + xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7); + xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + + y1r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + // Detection for 3rd bit (LTE mapping) + xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5); + xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1); + xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3); + xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5); + xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1); + xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3); + xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5); + xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1); + xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3); + xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5); + xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1); + xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3); + xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + + xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5); + xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1); + xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3); + xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5); + xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1); + xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3); + xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5); + xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1); + xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3); + xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5); + xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1); + xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3); + xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + + y2r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + // Detection for 4th bit (LTE mapping) + xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7); + xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7); + xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7); + xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5); + xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5); + xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5); + xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p5); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5); + xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5); + xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5); + xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7); + xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7); + xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7); + xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + + xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1); + xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1); + xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1); + xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3); + xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3); + xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3); + xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1); + xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1); + xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1); + xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3); + xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3); + xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3); + xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + + y0i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + + // Detection for 5th bit (LTE mapping) + xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5); + xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1); + xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3); + xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5); + xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1); + xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3); + xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5); + xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1); + xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3); + xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5); + xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1); + xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3); + xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + + xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5); + xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1); + xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3); + xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5); + xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1); + xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3); + xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5); + xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1); + xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3); + xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5); + xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1); + xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3); + xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + + y1i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + // Detection for 6th bit (LTE mapping) + xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7); + xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7); + xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7); + xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1); + xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1); + xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1); + xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p1); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1); + xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1); + xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1); + xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7); + xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7); + xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7); + xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4); + logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5); + + xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5); + xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5); + xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5); + xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3); + xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3); + xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3); + xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3); + xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3); + xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3); + xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5); + xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5); + xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5); + xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5); + xmm4 = _mm_max_epi16(xmm0, xmm1); + xmm5 = _mm_max_epi16(xmm2, xmm3); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4); + logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5); + + y2i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0); + + + // map to output stream, difficult to do in SIMD since we have 6 16bit LLRs + // RE 1 + j = 24*i; + stream0_out[j + 0] = ((short *)&y0r)[0]; + stream0_out[j + 1] = ((short *)&y1r)[0]; + stream0_out[j + 2] = ((short *)&y2r)[0]; + stream0_out[j + 3] = ((short *)&y0i)[0]; + stream0_out[j + 4] = ((short *)&y1i)[0]; + stream0_out[j + 5] = ((short *)&y2i)[0]; + // RE 2 + stream0_out[j + 6] = ((short *)&y0r)[1]; + stream0_out[j + 7] = ((short *)&y1r)[1]; + stream0_out[j + 8] = ((short *)&y2r)[1]; + stream0_out[j + 9] = ((short *)&y0i)[1]; + stream0_out[j + 10] = ((short *)&y1i)[1]; + stream0_out[j + 11] = ((short *)&y2i)[1]; + // RE 3 + stream0_out[j + 12] = ((short *)&y0r)[2]; + stream0_out[j + 13] = ((short *)&y1r)[2]; + stream0_out[j + 14] = ((short *)&y2r)[2]; + stream0_out[j + 15] = ((short *)&y0i)[2]; + stream0_out[j + 16] = ((short *)&y1i)[2]; + stream0_out[j + 17] = ((short *)&y2i)[2]; + // RE 4 + stream0_out[j + 18] = ((short *)&y0r)[3]; + stream0_out[j + 19] = ((short *)&y1r)[3]; + stream0_out[j + 20] = ((short *)&y2r)[3]; + stream0_out[j + 21] = ((short *)&y0i)[3]; + stream0_out[j + 22] = ((short *)&y1i)[3]; + stream0_out[j + 23] = ((short *)&y2i)[3]; + // RE 5 + stream0_out[j + 24] = ((short *)&y0r)[4]; + stream0_out[j + 25] = ((short *)&y1r)[4]; + stream0_out[j + 26] = ((short *)&y2r)[4]; + stream0_out[j + 27] = ((short *)&y0i)[4]; + stream0_out[j + 28] = ((short *)&y1i)[4]; + stream0_out[j + 29] = ((short *)&y2i)[4]; + // RE 6 + stream0_out[j + 30] = ((short *)&y0r)[5]; + stream0_out[j + 31] = ((short *)&y1r)[5]; + stream0_out[j + 32] = ((short *)&y2r)[5]; + stream0_out[j + 33] = ((short *)&y0i)[5]; + stream0_out[j + 34] = ((short *)&y1i)[5]; + stream0_out[j + 35] = ((short *)&y2i)[5]; + // RE 7 + stream0_out[j + 36] = ((short *)&y0r)[6]; + stream0_out[j + 37] = ((short *)&y1r)[6]; + stream0_out[j + 38] = ((short *)&y2r)[6]; + stream0_out[j + 39] = ((short *)&y0i)[6]; + stream0_out[j + 40] = ((short *)&y1i)[6]; + stream0_out[j + 41] = ((short *)&y2i)[6]; + // RE 8 + stream0_out[j + 42] = ((short *)&y0r)[7]; + stream0_out[j + 43] = ((short *)&y1r)[7]; + stream0_out[j + 44] = ((short *)&y2r)[7]; + stream0_out[j + 45] = ((short *)&y0i)[7]; + stream0_out[j + 46] = ((short *)&y1i)[7]; + stream0_out[j + 47] = ((short *)&y2i)[7]; + +#elif defined(__arm__) + +#endif + + } + +#if defined(__x86_64__) || defined(__i386__) + _mm_empty(); + _m_empty(); +#endif +} + + +int nr_dlsch_64qam_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, + int32_t **rxdataF_comp, + int32_t **rxdataF_comp_i, + int32_t **dl_ch_mag, + int32_t **dl_ch_mag_i, + int32_t **rho_i, + int16_t *dlsch_llr, + uint8_t symbol, + uint8_t first_symbol_flag, + uint16_t nb_rb, + uint16_t pbch_pss_sss_adjust, + //int16_t **llr16p, + uint32_t llr_offset) +{ + + int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)]; + int16_t *llr16; + int8_t *pllr_symbol; // pointer where llrs should filled for this ofdm symbol + int len; + uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; + + //first symbol has different structure due to more pilots + /*if (first_symbol_flag == 1) { + llr16 = (int16_t*)dlsch_llr; + } else { + llr16 = (int16_t*)(*llr16p); + }*/ + + llr16 = (int16_t*)dlsch_llr; + + AssertFatal(llr16!=NULL,"nr_dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol); + + + if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { + // if symbol has pilots + if (frame_parms->nb_antenna_ports_eNB!=1) + // in 2 antenna ports we have 8 REs per symbol per RB + len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); + else + // for 1 antenna port we have 10 REs per symbol per RB + len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); + } else { + // symbol has no pilots + len = (nb_rb*12) - pbch_pss_sss_adjust; + } + + pllr_symbol = (int8_t*)dlsch_llr; + pllr_symbol += llr_offset; + //printf("nr_dlsch_64qam_64qam_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust); + /*LOG_I(PHY,"nr_dlsch_64qam_64qam_llr [symb %d / FirstSym %d / Length %d / LLR Offset %d]: @LLR Buff %x, @LLR Buff(symb) %x, , @Compute LLR Buff(symb) %x \n", + symbol, + first_symbol_flag, + len, + llr_offset, + (int16_t*)dlsch_llr, + llr16, + pllr_symbol);*/ + +#ifdef __AVX2__ + + // Round length up to multiple of 16 words + uint32_t len256i = ((len+16)>>4)*16; + int32_t *rxF_256i = (int32_t*) malloc16_clear(len256i*4); + int32_t *rxF_i_256i = (int32_t*) malloc16_clear(len256i*4); + int32_t *ch_mag_256i = (int32_t*) malloc16_clear(len256i*4); + int32_t *ch_mag_i_256i = (int32_t*) malloc16_clear(len256i*4); + int32_t *rho_256i = (int32_t*) malloc16_clear(len256i*4); + + memcpy(rxF_256i, rxF, len*4); + memcpy(rxF_i_256i, rxF_i, len*4); + memcpy(ch_mag_256i, ch_mag, len*4); + memcpy(ch_mag_i_256i, ch_mag_i, len*4); + memcpy(rho_256i, rho, len*4); + +#if 0 + qam64_qam16_avx2((short *)rxF_256i, + (short *)rxF_i_256i, + (short *)ch_mag_256i, + (short *)ch_mag_i_256i, + (short *)llr16, + (short *) rho_256i, + len); +#else + qam64_qam64_avx2((int32_t *)rxF_256i, + (int32_t *)rxF_i_256i, + (int32_t *)ch_mag_256i, + (int32_t *)ch_mag_i_256i, + (int16_t *)llr16, + (int32_t *) rho_256i, + len); +#endif + + free16(rxF_256i, sizeof(rxF_256i)); + free16(rxF_i_256i, sizeof(rxF_i_256i)); + free16(ch_mag_256i, sizeof(ch_mag_256i)); + free16(ch_mag_i_256i, sizeof(ch_mag_i_256i)); + free16(rho_256i, sizeof(rho_256i)); + +#else + qam64_qam64((short *)rxF, + (short *)rxF_i, + (short *)ch_mag, + (short *)ch_mag_i, + (short *)llr16, + (short *)rho, + len); +#endif + + llr16 += (6*len); + //*llr16p = (short *)llr16; + + return(0); +} diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h index 6048dff163..b16e5a97de 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h @@ -106,7 +106,7 @@ void qpsk_qpsk(int16_t *stream0_in, @param nb_rb number of RBs for this allocation @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS @param llr128p pointer to pointer to symbol in dlsch_llr*/ -int32_t dlsch_qpsk_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, +int32_t nr_dlsch_qpsk_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, int32_t **rxdataF_comp_i, int32_t **rho_i, @@ -142,7 +142,7 @@ void qpsk_qam16(int16_t *stream0_in, @param nb_rb number of RBs for this allocation @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS @param llr128p pointer to pointer to symbol in dlsch_llr*/ -int32_t dlsch_qpsk_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, +int32_t nr_dlsch_qpsk_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, int32_t **rxdataF_comp_i, int **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10}) @@ -154,6 +154,7 @@ int32_t dlsch_qpsk_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, uint16_t pbch_pss_sss_adj, int16_t **llr128p); + /** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream QPSK/64QAM reception. @param stream0_in Input from channel compensated (MR combined) stream 0 @param stream1_in Input from channel compensated (MR combined) stream 1 @@ -179,7 +180,7 @@ void qpsk_qam64(int16_t *stream0_in, @param nb_rb number of RBs for this allocation @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS @param llr128p pointer to pointer to symbol in dlsch_llr*/ -int32_t dlsch_qpsk_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, +int32_t nr_dlsch_qpsk_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, int32_t **rxdataF_comp_i, int **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10}) @@ -217,7 +218,7 @@ void qam16_qpsk(short *stream0_in, @param nb_rb number of RBs for this allocation @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS @param llr16p pointer to pointer to symbol in dlsch_llr*/ -int dlsch_16qam_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, +int nr_dlsch_16qam_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, int **rxdataF_comp, int **rxdataF_comp_i, int **dl_ch_mag, //|h_0|^2*(2/sqrt{10}) @@ -258,7 +259,7 @@ void qam16_qam16(short *stream0_in, @param nb_rb number of RBs for this allocation @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS @param llr16p pointer to pointer to symbol in dlsch_llr*/ -int dlsch_16qam_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, +int nr_dlsch_16qam_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, int **rxdataF_comp, int **rxdataF_comp_i, int **dl_ch_mag, //|h_0|^2*(2/sqrt{10}) @@ -300,7 +301,7 @@ void qam16_qam64(short *stream0_in, @param nb_rb number of RBs for this allocation @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS @param llr16p pointer to pointer to symbol in dlsch_llr*/ -int dlsch_16qam_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, +int nr_dlsch_16qam_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, int **rxdataF_comp, int **rxdataF_comp_i, int **dl_ch_mag, //|h_0|^2*(2/sqrt{10}) @@ -480,15 +481,13 @@ int dlsch_64qam_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, @param llr128p pointer to pointer to symbol in dlsch_llr @param beamforming_mode beamforming mode */ -int32_t dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, - int32_t **rxdataF_comp, - int16_t *dlsch_llr, - uint8_t symbol, - uint8_t first_symbol_flag, - uint16_t nb_rb, - uint16_t pbch_pss_sss_adj, - //int16_t **llr128p, - uint8_t beamforming_mode); +int32_t nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, + int32_t **rxdataF_comp, + int16_t *dlsch_llr, + uint8_t symbol, + uint8_t first_symbol_flag, + uint16_t nb_rb, + uint8_t beamforming_mode); /** \brief This function generates log-likelihood ratios (decoder input) for single-stream 16QAM received waveforms @@ -504,7 +503,7 @@ int32_t dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, @param beamforming_mode beamforming mode */ -int32_t dlsch_qpsk_llr_SIC(NR_DL_FRAME_PARMS *frame_parms, +int32_t nr_dlsch_qpsk_llr_SIC(NR_DL_FRAME_PARMS *frame_parms, int **rxdataF_comp, int32_t **sic_buffer, int **rho_i, @@ -515,15 +514,14 @@ int32_t dlsch_qpsk_llr_SIC(NR_DL_FRAME_PARMS *frame_parms, uint16_t mod_order_0, uint32_t rb_alloc); -void dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, +void nr_dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, int16_t *dlsch_llr, int32_t **dl_ch_mag, uint8_t symbol, uint8_t first_symbol_flag, uint16_t nb_rb, - uint16_t pbch_pss_sss_adjust, - int16_t **llr128p, + int16_t **llr32p, uint8_t beamforming_mode); /** \brief This function generates log-likelihood ratios (decoder input) for single-stream 16QAM received waveforms @@ -538,7 +536,7 @@ void dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms, @param pbch_pss_sss_adjust PBCH/PSS/SSS RE adjustment (in REs) @param beamforming_mode beamforming mode */ -void dlsch_16qam_llr_SIC (NR_DL_FRAME_PARMS *frame_parms, +void nr_dlsch_16qam_llr_SIC (NR_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, int32_t **sic_buffer, //Q15 int32_t **rho_i, @@ -563,8 +561,7 @@ void dlsch_64qam_llr_SIC(NR_DL_FRAME_PARMS *frame_parms, uint16_t mod_order_0, uint32_t rb_alloc); - -void dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, +void nr_dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, int16_t *dlsch_llr, int32_t **dl_ch_mag, @@ -572,8 +569,6 @@ void dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms, uint8_t symbol, uint8_t first_symbol_flag, uint16_t nb_rb, - uint16_t pbch_pss_sss_adjust, - //int16_t **llr_save, uint32_t llr_offset, uint8_t beamforming_mode); @@ -1044,7 +1039,7 @@ int32_t nr_rx_pdsch(PHY_VARS_NR_UE *phy_vars_ue, uint8_t i_mod, uint8_t harq_pid); -int32_t rx_pdcch(PHY_VARS_NR_UE *ue, +int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue, uint32_t frame, uint8_t subframe, uint8_t eNB_id, From fac57fd7d7af14299eb1aa97c4586573e65437dc Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 4 Oct 2018 09:33:45 +0200 Subject: [PATCH 2/3] update dlsch coding and decoding --- cmake_targets/CMakeLists.txt | 2 + openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 5 +++ openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 41 +++++++++++-------- openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c | 6 +++ .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 18 +++++--- 5 files changed, 50 insertions(+), 22 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 8ed49c2f0c..e7dd97d132 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1294,6 +1294,7 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dci_tools.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dlsch.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dlsch_tools.c + ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_dlsch_coding.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_tbs_tools.c ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c ${OPENAIR1_DIR}/PHY/TOOLS/file_output.c @@ -1327,6 +1328,7 @@ set(PHY_SRC_UE ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c + ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_tbs_tools.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/ ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/dci_nr.c diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index 418af34b39..7bd89d6171 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -50,3 +50,8 @@ void nr_get_PRG_parms(NR_BWP_PARMS* bwp, NR_gNB_DCI_ALLOC_t dci_alloc, uint8_t p uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx); uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx); + +/** \brief Computes available bits G. + @param nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs */ +uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs); + diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index 819b3af823..b2dfe2403d 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -37,6 +37,7 @@ #include "PHY/CODING/lte_interleaver_inline.h" #include "PHY/NR_TRANSPORT/nr_transport.h" #include "PHY/NR_TRANSPORT/nr_transport_common_proto.h" +#include "PHY/NR_TRANSPORT/nr_dlsch.h" #include "SCHED_NR/sched_nr.h" #include "defs.h" #include "UTIL/LOG/vcd_signal_dumper.h" @@ -85,11 +86,11 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t *dlsch) #endif if (dlsch->harq_processes[i]->c[r]) { - free16(dlsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+1056); + free16(dlsch->harq_processes[i]->c[r],1056); dlsch->harq_processes[i]->c[r] = NULL; } if (dlsch->harq_processes[i]->d[r]) { - free16(dlsch->harq_processes[i]->d[r],(96+12+3+(3*8448))); + free16(dlsch->harq_processes[i]->d[r],3*8448); dlsch->harq_processes[i]->d[r] = NULL; } @@ -109,7 +110,7 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_t { NR_gNB_DLSCH_t *dlsch; - unsigned char exit_flag = 0,i,j,r,aa,layer; + unsigned char exit_flag = 0,i,r,aa,layer; int re; unsigned char bw_scaling =1; @@ -229,7 +230,7 @@ void clean_gNB_dlsch(NR_gNB_DLSCH_t *dlsch) for (i=0; iharq_processes[i]) { // dlsch->harq_processes[i]->Ndi = 0; - dlsch->harq_processes[i]->status = 0; + //dlsch->harq_processes[i]->status = 0; dlsch->harq_processes[i]->round = 0; for (j=0; j<96; j++) @@ -242,7 +243,7 @@ void clean_gNB_dlsch(NR_gNB_DLSCH_t *dlsch) } } -int dlsch_encoding(PHY_VARS_gNB *gNB, +int nr_dlsch_encoding(PHY_VARS_gNB *gNB, unsigned char *a, uint8_t num_pdcch_symbols, NR_gNB_DLSCH_t *dlsch, @@ -255,31 +256,39 @@ int dlsch_encoding(PHY_VARS_gNB *gNB, unsigned int G; unsigned int crc=1; - unsigned short iind; NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; - unsigned char harq_pid = dlsch->current_harq_pid; + unsigned char harq_pid = dlsch->harq_ids[subframe]; unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb; unsigned int A, Z; unsigned *pz = &Z; unsigned char mod_order; - unsigned int Kr=0,Kr_bytes,r,r_offset=0,Kr_int=0; - unsigned short m=dlsch->harq_processes[harq_pid]->mcs; - uint8_t beamforming_mode=0; + unsigned int Kr=0,r,r_offset=0;//Kr_bytes + //unsigned short m=dlsch->harq_processes[harq_pid]->mcs; + //uint8_t beamforming_mode=0; uint8_t *d_tmp[MAX_NUM_DLSCH_SEGMENTS]; - double rate = 0.33; - uint8_t kb,BG; + //double rate = 0.33; + uint8_t kb,BG=1; uint32_t E; uint8_t Ilbrm = 0; - uint32_t Tbslbrm = 950984; //to compute tbs + uint32_t Tbslbrm = 950984; //max tbs + uint16_t nb_symb_sch =2; + uint8_t nb_re_dmrs = 6; + uint16_t length_dmrs = 1; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN); + dlsch->harq_processes[harq_pid]->TBS= nr_compute_tbs(dlsch->harq_processes[harq_pid]->mcs, + nb_rb,nb_symb_sch,nb_re_dmrs,length_dmrs, + dlsch->harq_processes[harq_pid]->Nl); + A = dlsch->harq_processes[harq_pid]->TBS; //printf("Encoder: A: %d frame.subframe %d.%d \n",A, frame,subframe); mod_order = get_nr_Qm(dlsch->harq_processes[harq_pid]->mcs); - G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe,beamforming_mode); + G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs); + + Tbslbrm = nr_compute_tbs(28,nb_rb,frame_parms->symbols_per_slot,0,0, dlsch->harq_processes[harq_pid]->Nl); // if (dlsch->harq_processes[harq_pid]->Ndi == 1) { // this is a new packet if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet @@ -324,7 +333,7 @@ int dlsch_encoding(PHY_VARS_gNB *gNB, //printf("Encoder: B %d F %d \n",dlsch->harq_processes[harq_pid]->B, dlsch->harq_processes[harq_pid]->F); Kr = dlsch->harq_processes[harq_pid]->K; - Kr_bytes = Kr>>3; + //Kr_bytes = Kr>>3; start_meas(te_stats); for (r=0; rharq_processes[harq_pid]->C; r++) { @@ -394,7 +403,7 @@ int dlsch_encoding(PHY_VARS_gNB *gNB, start_meas(i_stats); nr_interleaving_ldpc(E, - &dlsch->harq_processes[harq_pid]->Qm, + dlsch->harq_processes[harq_pid]->Qm, dlsch->harq_processes[harq_pid]->e+r_offset, dlsch->harq_processes[harq_pid]->f+r_offset); stop_meas(i_stats); diff --git a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c index 84afa0d325..6c6c44ff35 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c @@ -79,3 +79,9 @@ uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx) { AssertFatal(0, "Invalid MCS table index %d (expected in range [1,3])\n", table_idx); } } + +uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs) { + uint32_t G; + G = ((12*nb_symb_sch)-(nb_re_dmrs*length_dmrs))*nb_rb; + return(G); +} diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index 9e732f63d1..924e207009 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -35,6 +35,7 @@ #include "PHY/CODING/coding_extern.h" #include "PHY/CODING/coding_defs.h" #include "PHY/NR_TRANSPORT/nr_transport_common_proto.h" +#include "PHY/NR_TRANSPORT/nr_dlsch.h" //#include "SCHED/extern.h" #include "SIMULATION/TOOLS/sim.h" #include "targets/RT/USER/nr-uesoftmodem.h" @@ -65,13 +66,13 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t *dlsch) } for (r=0; rharq_processes[i]->c[r],((r==0)?8:0) + 3+1056); + free16(dlsch->harq_processes[i]->c[r],1056); dlsch->harq_processes[i]->c[r] = NULL; } for (r=0; rharq_processes[i]->d[r]) { - free16(dlsch->harq_processes[i]->d[r],((3*8*8448)+12+96)*sizeof(short)); + free16(dlsch->harq_processes[i]->d[r],(3*8448)*sizeof(short)); dlsch->harq_processes[i]->d[r] = NULL; } @@ -201,8 +202,11 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, // int16_t *p_invd =&inv_d; uint8_t kb, kc; uint8_t Ilbrm = 0; - uint32_t Tbslbrm = 950984; //to compute tbs - uint16_t nb_prb = 106; //to update + uint32_t Tbslbrm = 950984; + uint16_t nb_rb = 106; //to update + uint16_t nb_symb_sch = 2; + uint8_t nb_re_dmrs = 6; + uint16_t length_dmrs = 1; uint32_t i,j; // uint32_t k; @@ -252,10 +256,12 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, harq_process->trials[harq_process->round]++; + harq_process->TBS = nr_compute_tbs(harq_process->mcs,nb_rb,nb_symb_sch,nb_re_dmrs,length_dmrs, harq_process->Nl); + A = harq_process->TBS; ret = dlsch->max_ldpc_iterations; - + harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs); G = harq_process->G; //get_G(frame_parms,nb_rb,dlsch->rb_alloc,mod_order,num_pdcch_symbols,phy_vars_ue->frame,subframe); @@ -326,7 +332,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, K_bytes_F = Kr_bytes-(harq_process->F>>3); - Tbslbrm = nr_compute_tbs(harq_process->mcs,nb_prb,frame_parms->symbols_per_slot,0,0, harq_process->Nl); + Tbslbrm = nr_compute_tbs(28,nb_rb,frame_parms->symbols_per_slot,0,0, harq_process->Nl); for (r=0; rC; r++) { From 6fc37985b95e469fb855aab65854ddd089da2b42 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 4 Oct 2018 09:55:55 +0200 Subject: [PATCH 3/3] update dlsch available bits --- openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 2 +- openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 2 +- openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c | 4 ++-- openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index 7bd89d6171..bba325ff08 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -53,5 +53,5 @@ uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx); /** \brief Computes available bits G. @param nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs */ -uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs); +uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs,uint8_t Qm); diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index b2dfe2403d..ab075edddc 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -286,7 +286,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB, //printf("Encoder: A: %d frame.subframe %d.%d \n",A, frame,subframe); mod_order = get_nr_Qm(dlsch->harq_processes[harq_pid]->mcs); - G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs); + G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,mod_order); Tbslbrm = nr_compute_tbs(28,nb_rb,frame_parms->symbols_per_slot,0,0, dlsch->harq_processes[harq_pid]->Nl); diff --git a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c index 6c6c44ff35..14b06d56ce 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c +++ b/openair1/PHY/NR_TRANSPORT/nr_tbs_tools.c @@ -80,8 +80,8 @@ uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx) { } } -uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs) { +uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch,uint8_t nb_re_dmrs,uint16_t length_dmrs, uint8_t Qm) { uint32_t G; - G = ((12*nb_symb_sch)-(nb_re_dmrs*length_dmrs))*nb_rb; + G = ((12*nb_symb_sch)-(nb_re_dmrs*length_dmrs))*nb_rb*Qm; return(G); } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index 924e207009..e1906011a9 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -261,7 +261,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, A = harq_process->TBS; ret = dlsch->max_ldpc_iterations; - harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs); + harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, harq_process->Qm); G = harq_process->G; //get_G(frame_parms,nb_rb,dlsch->rb_alloc,mod_order,num_pdcch_symbols,phy_vars_ue->frame,subframe);