diff --git a/CMakeLists.txt b/CMakeLists.txt index 4d76434190..26eb35eb51 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -189,12 +189,17 @@ elseif(${CPUARCH} NOT STREQUAL "x86_64") message(FATAL_ERROR "Cannot compile for CPU architecture ${CPUARCH}") endif() -set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -fno-var-tracking-assignments -march=native") +set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=native") # add autotools definitions that were maybe used! add_definitions("-DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP") -set(commonOpts "-pipe -Wno-packed-bitfield-compat -fPIC -Wall -fno-strict-aliasing -rdynamic") +set(commonOpts "-pipe -fPIC -Wall -fno-strict-aliasing") +# GNU C/C++ Compiler might throw many warnings without packed-bitfield-compat, see man page +# also, we need -rdynamic to incorporate all symbols in shared objects, again, see man page +if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(commonOpts "${commonOpts} -Wno-packed-bitfield-compat -rdynamic") +endif() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${C_FLAGS_PROCESSOR} ${commonOpts} -std=gnu11 -funroll-loops") @@ -1513,6 +1518,7 @@ set (MAC_NR_SRC_UE ${NR_UE_MAC_DIR}/nr_ue_scheduler.c ${NR_UE_MAC_DIR}/nr_ue_dci_configuration.c ${NR_UE_MAC_DIR}/nr_ra_procedures.c + ${NR_UE_MAC_DIR}/nr_ue_power_procedures.c ) set (ENB_APP_SRC diff --git a/cmake_targets/at_commands/CMakeLists.txt b/cmake_targets/at_commands/CMakeLists.txt index d2d5db704e..9e16576ba9 100755 --- a/cmake_targets/at_commands/CMakeLists.txt +++ b/cmake_targets/at_commands/CMakeLists.txt @@ -82,7 +82,7 @@ endif() set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release RelWithDebInfo MinSizeRel) # -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.2 -std=gnu99 -Wall -Wstrict-prototypes -fno-strict-aliasing -rdynamic -funroll-loops -Wno-packed-bitfield-compat ") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.2 -std=gnu99 -Wall -Wstrict-prototypes -fno-strict-aliasing -rdynamic -funroll-loops") set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -ggdb -DMALLOC_CHECK_=3") set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -ggdb -DMALLOC_CHECK_=3 -O2") diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 24b18e41dc..7840e89e28 100755 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -443,7 +443,10 @@ (Test22: 3GPP G-FR1-A5-14, PUSCH Type B, 100 MHz BW, 30 kHz SCS, 2 RX Antennas Requirements Test), (Test23: 3GPP G-FR1-A5-14, PUSCH Type B, 100 MHz BW, 30 kHz SCS, 4 RX Antennas Requirements Test), (Test24: 3GPP G-FR1-A5-14, PUSCH Type B, 100 MHz BW, 30 kHz SCS, 8 RX Antennas Requirements Test), - (Test25: 3GPP G-FR1-A4-27, PUSCH Type B, 40 MHz BW, 30 kHz SCS, 2 RX Antennas Requirements Test, 2 layers) + (Test25: 3GPP G-FR1-A3-27, PUSCH Type B, 40 MHz BW, 30 kHz SCS, 2 RX Antennas Requirements Test, 2 layers), + (Test26: 3GPP G-FR1-A3-27, PUSCH Type B, 40 MHz BW, 30 kHz SCS, 4 RX Antennas Requirements Test, 2 layers), + (Test27: 3GPP G-FR1-A4-27, PUSCH Type B, 40 MHz BW, 30 kHz SCS, 2 RX Antennas Requirements Test, 2 layers), + (Test28: 3GPP G-FR1-A4-27, PUSCH Type B, 40 MHz BW, 30 kHz SCS, 4 RX Antennas Requirements Test, 2 layers) nr_ulsim -n100 -b14 -I7 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R106 -r106 -U 0,1,1,2 -z2 -s12.4 -S12.4 -n100 -b14 -I7 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R106 -r106 -U 0,1,1,2 -z4 -s8.5 -S8.5 @@ -469,8 +472,11 @@ -n100 -b14 -I7 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R273 -r273 -U 1,1,1,2 -z2 -s13.1 -S13.1 -n100 -b14 -I7 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R273 -r273 -U 1,1,1,2 -z4 -s9.2 -S9.2 -n100 -b14 -I8 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R273 -r273 -U 1,1,1,2 -z8 -s5.9 -S5.9 - -n100 -b14 -I15 -i 0,1 -g C,l -t70 -u 1 -m16 -R106 -r106 -U 1,1,1,2 -W2 -y2 -z2 -s18.7 -S18.7 - test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 test13 test14 test15 test16 test17 test18 test19 test20 test21 test22 test23 test24 test25 + -n100 -b14 -I15 -i 0,1 -g B,l -t70 -u 1 -m2 -R106 -r106 -U 1,1,1,2 -W2 -y2 -z2 -s1.7 -S1.7 + -n100 -b14 -I15 -i 0,1 -g B,l -t70 -u 1 -m2 -R106 -r106 -U 1,1,1,2 -W2 -y2 -z4 -s-2.1 -S-2.1 + -n100 -b14 -I15 -i 0,1 -g C,l -t70 -u 1 -m16 -R106 -r106 -U 1,1,1,2 -W2 -y2 -z2 -s18.7 -S18.7 + -n100 -b14 -I15 -i 0,1 -g C,l -t70 -u 1 -m16 -R106 -r106 -U 1,1,1,2 -W2 -y2 -z4 -s11.2 -S11.2 + test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 test13 test14 test15 test16 test17 test18 test19 test20 test21 test22 test23 test24 test25 test26 test27 test28 PUSCH test OK segmentation fault|assertion|exiting|fatal 3 diff --git a/cmake_targets/nas_sim_tools/CMakeLists.txt b/cmake_targets/nas_sim_tools/CMakeLists.txt index 739e55a33e..05d7a42712 100755 --- a/cmake_targets/nas_sim_tools/CMakeLists.txt +++ b/cmake_targets/nas_sim_tools/CMakeLists.txt @@ -10,7 +10,7 @@ add_definitions(-std=gnu99) ENABLE_LANGUAGE(C) set(CMAKE_C_FLAGS - "${CMAKE_C_FLAGS} ${C_FLAGS_PROCESSOR} -Werror -Wall -Wstrict-prototypes -Wno-packed-bitfield-compat -g") + "${CMAKE_C_FLAGS} ${C_FLAGS_PROCESSOR} -Werror -Wall -Wstrict-prototypes -g") set(OPENAIR_DIR $ENV{OPENAIR_DIR}) set(OPENAIR3_DIR $ENV{OPENAIR_DIR}/openair3) diff --git a/common/utils/nr/nr_common.c b/common/utils/nr/nr_common.c index ca9d735fca..25586abe82 100644 --- a/common/utils/nr/nr_common.c +++ b/common/utils/nr/nr_common.c @@ -36,20 +36,20 @@ const char *duplex_mode[]={"FDD","TDD"}; -int tables_5_3_2[5][11] = { - {25, 52, 79, 106, 133, 160, 216, 270, -1, -1, -1}, // 15 FR1 - {11, 24, 38, 51, 65, 78, 106, 133, 162, 217, 273}, // 30 FR1 - {-1, 11, 18, 24, 31, 38, 51, 65, 79, 107, 135}, // 60 FR1 - {66, 132, 264, -1 , -1, -1, -1, -1, -1, -1, -1}, // 60 FR2 - {32, 66, 132, 264, -1, -1, -1, -1, -1, -1, -1} // 120FR2 +int tables_5_3_2[5][12] = { + {25, 52, 79, 106, 133, 160, 216, 270, -1, -1, -1, -1}, // 15 FR1 + {11, 24, 38, 51, 65, 78, 106, 133, 162, 217, 245, 273},// 30 FR1 + {-1, 11, 18, 24, 31, 38, 51, 65, 79, 107, 121, 135}, // 60 FR1 + {66, 132, 264, -1 , -1, -1, -1, -1, -1, -1, -1, -1}, // 60 FR2 + {32, 66, 132, 264, -1, -1, -1, -1, -1, -1, -1, -1} // 120FR2 }; -int get_supported_band_index(int scs, int band, int n_rbs){ - +int get_supported_band_index(int scs, int band, int n_rbs) +{ int scs_index = scs; - if (band>256) + if (band > 256) scs_index++; - for (int i=0; i<11; i++) { + for (int i = 0; i < 11; i++) { if(n_rbs == tables_5_3_2[scs][i]) return i; } @@ -130,6 +130,66 @@ const nr_bandentry_t nr_bandtable[] = { {261,27500040,28350000,27500040,28350000, 2,2070833, 120} }; +int get_supported_bw_khz(frequency_range_t frequency_range, int bw_index) +{ + if (frequency_range == FR1) { + switch (bw_index) { + case 0 : + return 5000; // 5MHz + case 1 : + return 10000; + case 2 : + return 15000; + case 3 : + return 20000; + case 4 : + return 25000; + case 5 : + return 30000; + case 6 : + return 40000; + case 7 : + return 50000; + case 8 : + return 60000; + case 9 : + return 80000; + case 10 : + return 90000; + case 11 : + return 100000; + default : + AssertFatal(false, "Invalid band index for FR1 %d\n", bw_index); + } + } + else { + switch (bw_index) { + case 0 : + return 50000; // 50MHz + case 1 : + return 100000; + case 2 : + return 200000; + case 3 : + return 400000; + default : + AssertFatal(false, "Invalid band index for FR2 %d\n", bw_index); + } + } +} + +bool compare_relative_ul_channel_bw(int nr_band, int scs, int nb_ul, frame_type_t frame_type) +{ + // 38.101-1 section 6.2.2 + // Relative channel bandwidth <= 4% for TDD bands and <= 3% for FDD bands + int index = get_nr_table_idx(nr_band, scs); + int bw_index = get_supported_band_index(scs, nr_band, nb_ul); + int band_size_khz = get_supported_bw_khz(nr_band > 256 ? FR2 : FR1, bw_index); + float limit = frame_type == TDD ? 0.04 : 0.03; + float rel_bw = (float) (2 * band_size_khz) / (float) (nr_bandtable[index].ul_max + nr_bandtable[index].ul_min); + return rel_bw <= limit; +} + uint16_t get_band(uint64_t downlink_frequency, int32_t delta_duplex) { const int64_t dl_freq_khz = downlink_frequency / 1000; diff --git a/common/utils/nr/nr_common.h b/common/utils/nr/nr_common.h index fc3e5c3fa4..9c3ba88be2 100644 --- a/common/utils/nr/nr_common.h +++ b/common/utils/nr/nr_common.h @@ -93,6 +93,7 @@ int get_nb_periods_per_frame(uint8_t tdd_period); int get_supported_band_index(int scs, int band, int n_rbs); long rrc_get_max_nr_csrs(const int max_rbs, long b_SRS); void get_K1_K2(int N1, int N2, int *K1, int *K2); +bool compare_relative_ul_channel_bw(int nr_band, int scs, int nb_ul, frame_type_t frame_type); void get_samplerate_and_bw(int mu, int n_rb, int8_t threequarter_fs, diff --git a/common/utils/ocp_itti/intertask_interface.h b/common/utils/ocp_itti/intertask_interface.h index 19b0ba32a9..131606f6fe 100644 --- a/common/utils/ocp_itti/intertask_interface.h +++ b/common/utils/ocp_itti/intertask_interface.h @@ -64,6 +64,9 @@ typedef struct itti_lte_time_s { typedef struct IttiMsgEmpty_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } IttiMsgEmpty; typedef struct IttiMsgText_s { diff --git a/doc/SW_archi.md b/doc/SW_archi.md index 6b509cc627..cccead370b 100644 --- a/doc/SW_archi.md +++ b/doc/SW_archi.md @@ -340,8 +340,6 @@ At Rx side, pdcp_data_ind() is the entry point that receives the data from RLC. nr_pdcp_config_set_security(): sets the keys for AS security of a UE -nr_DRB_preconfiguration(): the mac layer calls this for configuration in phy-test/do-ra mode - nr_pdcp_add_srbs() adds UE SRBs in pdcp, nr_pdcp_remove_UE() removes it nr_pdcp_add_drbs() adds UE DRBs in pdcp, nr_pdcp_remove_UE() removes it diff --git a/docker/Dockerfile.phySim.rhel8.2 b/docker/Dockerfile.phySim.rhel8.2 index 6abbd52832..ad0944f02b 100644 --- a/docker/Dockerfile.phySim.rhel8.2 +++ b/docker/Dockerfile.phySim.rhel8.2 @@ -31,14 +31,16 @@ RUN rm -Rf /oai-ran WORKDIR /oai-ran COPY . . -#only install address sanitizer for this container, the others don't need it -RUN yum install -y libasan +#only install address sanitizer and LLVM (clang, ...) for this container, the others don't need it +RUN yum install -y libasan llvm-toolset #run build_oai to build the target image RUN /bin/sh oaienv && \ cd cmake_targets && \ mkdir -p log && \ - ./build_oai --phy_simulators --ninja --verbose-ci --sanitize-address --noavx512 -c + export CC=/usr/bin/clang && \ + export CXX=/usr/bin/clang++ && \ + ./build_oai --phy_simulators --gNB --eNB --nrUE --UE --ninja --verbose-ci --sanitize-address --noavx512 -c --cmake-opt -DCMAKE_C_FLAGS=-Werror --cmake-opt -DCMAKE_CXX_FLAGS=-Werror #start from scratch for target executable FROM registry.access.redhat.com/ubi8/ubi:latest as oai-physim diff --git a/executables/lte-enb.c b/executables/lte-enb.c index b9f0816764..516fafd336 100644 --- a/executables/lte-enb.c +++ b/executables/lte-enb.c @@ -206,7 +206,7 @@ static inline int rxtx(PHY_VARS_eNB *eNB, T(T_ENB_PHY_DL_TICK, T_INT(eNB->Mod_id), T_INT(proc->frame_tx), T_INT(proc->subframe_tx)); // if this is IF5 or 3GPP_eNB - if (eNB->RU_list && eNB->RU_list[0] && eNB->RU_list[0]->function < NGFI_RAU_IF4p5) { + if (eNB->RU_list[0] && eNB->RU_list[0]->function < NGFI_RAU_IF4p5) { wakeup_prach_eNB(eNB,NULL,proc->frame_rx,proc->subframe_rx); wakeup_prach_eNB_br(eNB,NULL,proc->frame_rx,proc->subframe_rx); } diff --git a/executables/lte-ru.c b/executables/lte-ru.c index a784ee5a09..23e2a3e4b4 100644 --- a/executables/lte-ru.c +++ b/executables/lte-ru.c @@ -1126,7 +1126,7 @@ static void do_ru_synch(RU_t *ru) { int check_sync(RU_t *ru, RU_t *ru_master, int subframe) { - if (fabs(ru_master->proc.t[subframe].tv_nsec - ru->proc.t[subframe].tv_nsec) > 500000) + if (labs(ru_master->proc.t[subframe].tv_nsec - ru->proc.t[subframe].tv_nsec) > 500000) return 0; return 1; @@ -1178,12 +1178,12 @@ void wakeup_L1s(RU_t *ru) { if (ru->is_slave == 0 && ( (proc->RU_mask[ru->proc.tti_rx]&(1<RU_list[i]->state == RU_RUN) { //This is master & the RRU has already been received if (check_sync(eNB->RU_list[i],eNB->RU_list[0],ru->proc.tti_rx) == 0) - LOG_E(PHY,"RU %d is not SYNC, subframe %d, time %f this is master\n", - eNB->RU_list[i]->idx, ru->proc.tti_rx, fabs(eNB->RU_list[i]->proc.t[ru->proc.tti_rx].tv_nsec - eNB->RU_list[0]->proc.t[ru->proc.tti_rx].tv_nsec)); + LOG_E(PHY,"RU %d is not SYNC, subframe %d, time %ld this is master\n", + eNB->RU_list[i]->idx, ru->proc.tti_rx, labs(eNB->RU_list[i]->proc.t[ru->proc.tti_rx].tv_nsec - eNB->RU_list[0]->proc.t[ru->proc.tti_rx].tv_nsec)); } else if (ru->is_slave == 1 && ru->state == RU_RUN && ( (proc->RU_mask[ru->proc.tti_rx]&(1<<0)) == 1)) { // master already received. TODO: we assume that RU0 is master. if (check_sync(ru,eNB->RU_list[0],ru->proc.tti_rx) == 0) - LOG_E(PHY,"RU %d is not SYNC time, subframe %d, time %f\n", - ru->idx, ru->proc.tti_rx, fabs(ru->proc.t[ru->proc.tti_rx].tv_nsec - eNB->RU_list[0]->proc.t[ru->proc.tti_rx].tv_nsec)); + LOG_E(PHY,"RU %d is not SYNC time, subframe %d, time %ld\n", + ru->idx, ru->proc.tti_rx, labs(ru->proc.t[ru->proc.tti_rx].tv_nsec - eNB->RU_list[0]->proc.t[ru->proc.tti_rx].tv_nsec)); } } diff --git a/executables/lte-softmodem.h b/executables/lte-softmodem.h index e9fc35ed1a..4143bce3a4 100644 --- a/executables/lte-softmodem.h +++ b/executables/lte-softmodem.h @@ -41,13 +41,13 @@ /* optname helpstr paramflags XXXptr defXXXval type numelt */ /*------------------------------------------------------------------------------------------------------------------------------------------*/ #define CMDLINE_UEMODEPARAMS_DESC { \ - {"calib-ue-rx", CONFIG_HLP_CALUER, 0, iptr:&rx_input_level_dBm, defintval:0, TYPE_INT, 0}, \ - {"calib-ue-rx-med", CONFIG_HLP_CALUERM, 0, iptr:&rx_input_level_dBm, defintval:0, TYPE_INT, 0}, \ - {"calib-ue-rx-byp", CONFIG_HLP_CALUERB, 0, iptr:&rx_input_level_dBm, defintval:0, TYPE_INT, 0}, \ - {"debug-ue-prach", CONFIG_HLP_DBGUEPR, PARAMFLAG_BOOL, uptr:NULL, defuintval:1, TYPE_INT, 0}, \ - {"no-L2-connect", CONFIG_HLP_NOL2CN, PARAMFLAG_BOOL, uptr:NULL, defuintval:1, TYPE_INT, 0}, \ - {"calib-prach-tx", CONFIG_HLP_CALPRACH, PARAMFLAG_BOOL, uptr:NULL, defuintval:1, TYPE_INT, 0}, \ - {"ue-dump-frame", CONFIG_HLP_DUMPFRAME, PARAMFLAG_BOOL, iptr:&dumpframe, defintval:0, TYPE_INT, 0}, \ + {"calib-ue-rx", CONFIG_HLP_CALUER, 0, .iptr=&rx_input_level_dBm, .defintval=0, TYPE_INT, 0}, \ + {"calib-ue-rx-med", CONFIG_HLP_CALUERM, 0, .iptr=&rx_input_level_dBm, .defintval=0, TYPE_INT, 0}, \ + {"calib-ue-rx-byp", CONFIG_HLP_CALUERB, 0, .iptr=&rx_input_level_dBm, .defintval=0, TYPE_INT, 0}, \ + {"debug-ue-prach", CONFIG_HLP_DBGUEPR, PARAMFLAG_BOOL, .uptr=NULL, .defuintval=1, TYPE_INT, 0}, \ + {"no-L2-connect", CONFIG_HLP_NOL2CN, PARAMFLAG_BOOL, .uptr=NULL, .defuintval=1, TYPE_INT, 0}, \ + {"calib-prach-tx", CONFIG_HLP_CALPRACH, PARAMFLAG_BOOL, .uptr=NULL, .defuintval=1, TYPE_INT, 0}, \ + {"ue-dump-frame", CONFIG_HLP_DUMPFRAME, PARAMFLAG_BOOL, .iptr=&dumpframe, .defintval=0, TYPE_INT, 0}, \ } #define CMDLINE_CALIBUERX_IDX 0 #define CMDLINE_CALIBUERXMED_IDX 1 @@ -90,25 +90,25 @@ /*-------------------------------------------------------------------------------------------------------------------------------------------------------*/ // clang-format off #define CMDLINE_UEPARAMS_DESC { \ - {"U", CONFIG_HLP_NUMUE, 0, iptr:&NB_UE_INST, defuintval:1, TYPE_INT, 0}, \ - {"ue-rxgain", CONFIG_HLP_UERXG, 0, dblptr:&(rx_gain[0][0]), defdblval:130, TYPE_DOUBLE, 0}, \ - {"ue-rxgain-off", CONFIG_HLP_UERXGOFF, 0, dblptr:&rx_gain_off, defdblval:0, TYPE_DOUBLE, 0}, \ - {"ue-txgain", CONFIG_HLP_UETXG, 0, dblptr:&(tx_gain[0][0]), defdblval:0, TYPE_DOUBLE, 0}, \ - {"ue-nb-ant-rx", CONFIG_HLP_UENANTR, 0, u8ptr:&nb_antenna_rx, defuintval:1, TYPE_UINT8, 0}, \ - {"ue-nb-ant-tx", CONFIG_HLP_UENANTT, 0, u8ptr:&nb_antenna_tx, defuintval:1, TYPE_UINT8, 0}, \ - {"ue-scan-carrier", CONFIG_HLP_UESCAN, PARAMFLAG_BOOL, iptr:&UE_scan_carrier, defintval:0, TYPE_INT, 0}, \ - {"ue-max-power", NULL, 0, iptr:&(tx_max_power[0]), defintval:23, TYPE_INT, 0}, \ - {"emul-iface", CONFIG_HLP_EMULIFACE, 0, strptr:&emul_iface, defstrval:"lo", TYPE_STRING, 100}, \ - {"L2-emul", NULL, 0, u8ptr:&nfapi_mode, defuintval:3, TYPE_UINT8, 0}, \ - {"num-ues", NULL, 0, iptr:&(NB_UE_INST), defuintval:1, TYPE_INT, 0}, \ - {"r" , CONFIG_HLP_PRB, 0, u8ptr:&(frame_parms[0]->N_RB_DL), defintval:25, TYPE_UINT8, 0}, \ - {"dlsch-demod-shift", CONFIG_HLP_DLSHIFT, 0, iptr:(int32_t *)&dlsch_demod_shift, defintval:0, TYPE_INT, 0}, \ - {"usrp-args", CONFIG_HLP_USRP_ARGS, 0, strptr:&usrp_args, defstrval:"type=b200",TYPE_STRING, 0}, \ - {"mmapped-dma", CONFIG_HLP_DMAMAP, PARAMFLAG_BOOL, uptr:&mmapped_dma, defintval:0, TYPE_INT, 0}, \ - {"T" , CONFIG_HLP_TDD, PARAMFLAG_BOOL, iptr:&tddflag, defintval:0, TYPE_INT, 0}, \ - {"A", CONFIG_HLP_TADV, 0, iptr:&(timingadv), defintval:0, TYPE_INT, 0}, \ - {"ue-idx-standalone", NULL, 0, u16ptr:&ue_idx_standalone, defuintval:0xFFFF, TYPE_UINT16, 0}, \ - {"node-number", NULL, 0, u16ptr:&node_number, defuintval:2, TYPE_UINT16, 0}, \ + {"U", CONFIG_HLP_NUMUE, 0, .iptr=&NB_UE_INST, .defuintval=1, TYPE_INT, 0}, \ + {"ue-rxgain", CONFIG_HLP_UERXG, 0, .dblptr=&(rx_gain[0][0]), .defdblval=130, TYPE_DOUBLE, 0}, \ + {"ue-rxgain-off", CONFIG_HLP_UERXGOFF, 0, .dblptr=&rx_gain_off, .defdblval=0, TYPE_DOUBLE, 0}, \ + {"ue-txgain", CONFIG_HLP_UETXG, 0, .dblptr=&(tx_gain[0][0]), .defdblval=0, TYPE_DOUBLE, 0}, \ + {"ue-nb-ant-rx", CONFIG_HLP_UENANTR, 0, .u8ptr=&nb_antenna_rx, .defuintval=1, TYPE_UINT8, 0}, \ + {"ue-nb-ant-tx", CONFIG_HLP_UENANTT, 0, .u8ptr=&nb_antenna_tx, .defuintval=1, TYPE_UINT8, 0}, \ + {"ue-scan-carrier", CONFIG_HLP_UESCAN, PARAMFLAG_BOOL, .iptr=&UE_scan_carrier, .defintval=0, TYPE_INT, 0}, \ + {"ue-max-power", NULL, 0, .iptr=&(tx_max_power[0]), .defintval=23, TYPE_INT, 0}, \ + {"emul-iface", CONFIG_HLP_EMULIFACE, 0, .strptr=&emul_iface, .defstrval="lo", TYPE_STRING, 100}, \ + {"L2-emul", NULL, 0, .u8ptr=&nfapi_mode, .defuintval=3, TYPE_UINT8, 0}, \ + {"num-ues", NULL, 0, .iptr=&(NB_UE_INST), .defuintval=1, TYPE_INT, 0}, \ + {"r" , CONFIG_HLP_PRB, 0, .u8ptr=&(frame_parms[0]->N_RB_DL), .defintval=25, TYPE_UINT8, 0}, \ + {"dlsch-demod-shift", CONFIG_HLP_DLSHIFT, 0, .iptr=(int32_t *)&dlsch_demod_shift, .defintval=0, TYPE_INT, 0}, \ + {"usrp-args", CONFIG_HLP_USRP_ARGS, 0, .strptr=&usrp_args, .defstrval="type=b200",TYPE_STRING, 0}, \ + {"mmapped-dma", CONFIG_HLP_DMAMAP, PARAMFLAG_BOOL, .uptr=&mmapped_dma, .defintval=0, TYPE_INT, 0}, \ + {"T" , CONFIG_HLP_TDD, PARAMFLAG_BOOL, .iptr=&tddflag, .defintval=0, TYPE_INT, 0}, \ + {"A", CONFIG_HLP_TADV, 0, .iptr=&(timingadv), .defintval=0, TYPE_INT, 0}, \ + {"ue-idx-standalone", NULL, 0, .u16ptr=&ue_idx_standalone, .defuintval=0xFFFF, TYPE_UINT16, 0}, \ + {"node-number", NULL, 0, .u16ptr=&node_number, .defuintval=2, TYPE_UINT16, 0}, \ } // clang-format on diff --git a/executables/lte-uesoftmodem.c b/executables/lte-uesoftmodem.c index 8e0161c1b6..7e6f779095 100644 --- a/executables/lte-uesoftmodem.c +++ b/executables/lte-uesoftmodem.c @@ -482,7 +482,7 @@ void init_openair0(LTE_DL_FRAME_PARMS *frame_parms,int rxgain) { void terminate_task(task_id_t task_id, module_id_t mod_id) { LOG_I(ENB_APP, "sending TERMINATE_MESSAGE to task %s (%d)\n", itti_get_task_name(task_id), task_id); MessageDef *msg; - msg = itti_alloc_new_message (ENB_APP, 0, TERMINATE_MESSAGE); + msg = itti_alloc_new_message (TASK_ENB_APP, 0, TERMINATE_MESSAGE); itti_send_msg_to_task (task_id, ENB_MODULE_ID_TO_INSTANCE(mod_id), msg); } diff --git a/executables/nr-cuup.c b/executables/nr-cuup.c index 352eed9f4a..90490e327f 100644 --- a/executables/nr-cuup.c +++ b/executables/nr-cuup.c @@ -84,21 +84,11 @@ int nr_rlc_get_available_tx_space(const rnti_t rntiP, const logical_chan_id_t ch return 0; } -void nr_rlc_bearer_init(NR_RLC_BearerConfig_t *RLC_BearerConfig, NR_RLC_BearerConfig__servedRadioBearer_PR rb_type) -{ - abort(); -} - void rrc_gNB_generate_dedicatedRRCReconfiguration(const protocol_ctxt_t *const ctxt_pP, rrc_gNB_ue_context_t *ue_context_pP, NR_CellGroupConfig_t *cell_groupConfig_from_DU) { abort(); } -void nr_rlc_bearer_init_ul_spec(struct NR_LogicalChannelConfig *mac_LogicalChannelConfig) -{ - abort(); -} - void nr_rlc_add_drb(int rnti, int drb_id, const NR_RLC_BearerConfig_t *rlc_BearerConfig) { abort(); @@ -110,11 +100,6 @@ int nr_rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(const protocol_ctxt_t *const ct return 0; } -void nr_drb_config(struct NR_RLC_Config *rlc_Config, NR_RLC_Config_PR rlc_config_pr) -{ - abort(); -} - void prepare_and_send_ue_context_modification_f1(rrc_gNB_ue_context_t *ue_context_p, e1ap_bearer_setup_resp_t *e1ap_resp) { abort(); diff --git a/executables/nr-ue.c b/executables/nr-ue.c index 4024075651..b4510b1f53 100644 --- a/executables/nr-ue.c +++ b/executables/nr-ue.c @@ -356,9 +356,8 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg) mac->scc->tdd_UL_DL_ConfigurationCommon : mac->scc_SIB->tdd_UL_DL_ConfigurationCommon, ul_info.slot_tx, mac->frame_type)) { - LOG_D(NR_MAC, "Slot %d. calling nr_ue_ul_ind() and nr_ue_pucch_scheduler() from %s\n", ul_info.slot_tx, __FUNCTION__); + LOG_D(NR_MAC, "Slot %d. calling nr_ue_ul_ind()\n", ul_info.slot_tx); nr_ue_ul_scheduler(&ul_info); - nr_ue_pucch_scheduler(mod_id, ul_info.frame_tx, ul_info.slot_tx, NULL); } process_queued_nr_nfapi_msgs(mac, sfn_slot); } diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h index 5e8fde4487..7ce7da2290 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h @@ -1897,6 +1897,9 @@ typedef struct { } nfapi_ul_config_periodic_cqi_pmi_ri_report_re13_t; typedef struct { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } nfapi_ul_config_aperiodic_cqi_pmi_ri_report_re13_t; typedef struct { @@ -3020,9 +3023,15 @@ typedef struct { #define NFAPI_LBT_DL_INDICATION_BODY_TAG 0x2058 typedef struct { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } nfapi_error_indication_msg_invalid_state; typedef struct { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } nfapi_error_indication_msg_bch_missing; typedef struct { diff --git a/openair1/PHY/CODING/TESTBENCH/polartest.c b/openair1/PHY/CODING/TESTBENCH/polartest.c index 9dd5e45958..72762ba441 100644 --- a/openair1/PHY/CODING/TESTBENCH/polartest.c +++ b/openair1/PHY/CODING/TESTBENCH/polartest.c @@ -29,7 +29,6 @@ int main(int argc, char *argv[]) uint32_t decoderState=0, blockErrorState=0; //0 = Success, -1 = Decoding failed, 1 = Block Error. uint16_t testLength = NR_POLAR_PBCH_PAYLOAD_BITS, coderLength = NR_POLAR_PBCH_E; uint16_t blockErrorCumulative=0, bitErrorCumulative=0; - double timeEncoderCumulative = 0, timeDecoderCumulative = 0; uint8_t aggregation_level = 8, decoderListSize = 8, logFlag = 0; uint16_t rnti=0; @@ -326,8 +325,6 @@ int main(int argc, char *argv[]) #endif //Iteration times are in microseconds. - timeEncoderCumulative+=(timeEncoder.diff/(get_cpu_freq_GHz()*1000.0)); - timeDecoderCumulative+=(timeDecoder.diff/(get_cpu_freq_GHz()*1000.0)); if (logFlag) fprintf(logFile,",%f,%d,%u,%f,%f\n", SNR, nBitError, blockErrorState, (timeEncoder.diff/(get_cpu_freq_GHz()*1000.0)), (timeDecoder.diff/(get_cpu_freq_GHz()*1000.0))); if (nBitError<0) { @@ -351,14 +348,11 @@ int main(int argc, char *argv[]) decoderListSize, SNR, ((double)blockErrorCumulative/iterations), ((double)bitErrorCumulative / (iterations*testLength)), (double)timeEncoder.diff/timeEncoder.trials/(get_cpu_freq_GHz()*1000.0),(double)timeDecoder.diff/timeDecoder.trials/(get_cpu_freq_GHz()*1000.0)); - //(timeEncoderCumulative/iterations),timeDecoderCumulative/iterations); if (blockErrorCumulative==0 && bitErrorCumulative==0) break; blockErrorCumulative = 0; bitErrorCumulative = 0; - timeEncoderCumulative = 0; - timeDecoderCumulative = 0; } print_meas(&timeEncoder,"polar_encoder",NULL,NULL); diff --git a/openair1/PHY/CODING/lte_rate_matching.c b/openair1/PHY/CODING/lte_rate_matching.c index 548b7bfcba..37298623c5 100644 --- a/openair1/PHY/CODING/lte_rate_matching.c +++ b/openair1/PHY/CODING/lte_rate_matching.c @@ -174,7 +174,7 @@ uint32_t sub_block_interleaving_cc(uint32_t D, uint8_t *d,uint8_t *w) { void sub_block_deinterleaving_turbo(uint32_t D,int16_t *d,int16_t *w) { uint32_t RTC = (D>>5), ND, ND3; - uint32_t row,col,Kpi,index; + uint32_t row,col,Kpi; uint32_t index3,k,k2; int16_t *d1,*d2,*d3; @@ -200,7 +200,6 @@ void sub_block_deinterleaving_turbo(uint32_t D,int16_t *d,int16_t *w) { #ifdef RM_DEBUG2 printf("Col %d\n",col); #endif - index = bitrev[col]; index3 = bitrev_x3[col];//3*index; for (row=0; rowN_RB_DL*12]; ul_ch_mag128 = (__m128i *)&ul_ch_mag[aarx][symbol*frame_parms->N_RB_DL*12]; - ul_ch_mag128b = (__m128i *)&ul_ch_magb[aarx][symbol*frame_parms->N_RB_DL*12]; rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12]; rxdataF_comp128 = (__m128i *)&rxdataF_comp[aarx][symbol*frame_parms->N_RB_DL*12]; #elif defined(__arm__) || defined(__aarch64__) ul_ch128 = (int16x4_t *)&ul_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; ul_ch_mag128 = (int16x8_t *)&ul_ch_mag[aarx][symbol*frame_parms->N_RB_DL*12]; - ul_ch_mag128b = (int16x8_t *)&ul_ch_magb[aarx][symbol*frame_parms->N_RB_DL*12]; rxdataF128 = (int16x4_t *)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12]; rxdataF_comp128 = (int16x8_t *)&rxdataF_comp[aarx][symbol*frame_parms->N_RB_DL*12]; #endif @@ -912,7 +909,6 @@ void ulsch_channel_compensation(int32_t **rxdataF_ext, ul_ch128+=3; ul_ch_mag128+=3; - ul_ch_mag128b+=3; rxdataF128+=3; rxdataF_comp128+=3; #elif defined(__arm__) || defined(__aarch64__) @@ -962,7 +958,6 @@ void ulsch_channel_compensation(int32_t **rxdataF_ext, ul_ch128+=6; ul_ch_mag128+=3; - ul_ch_mag128b+=3; rxdataF128+=6; rxdataF_comp128+=3; #endif @@ -1169,7 +1164,6 @@ void rx_ulsch(PHY_VARS_eNB *eNB, pusch_vars->rxdataF_ext, pusch_vars->drs_ch_estimates, pusch_vars->ul_ch_mag, - pusch_vars->ul_ch_magb, pusch_vars->rxdataF_comp, frame_parms, l, diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c index 8c0681e162..9e646bd793 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c +++ b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c @@ -4550,12 +4550,11 @@ void dlsch_alamouti(LTE_DL_FRAME_PARMS *frame_parms, unsigned short nb_rb) { #if defined(__x86_64__)||defined(__i386__) short *rxF0,*rxF1; - __m128i *ch_mag0,*ch_mag1,*ch_mag0b,*ch_mag1b, *rxF0_128; + __m128i *ch_mag0,*ch_mag1,*ch_mag0b,*ch_mag1b; unsigned char rb,re; int jj = (symbol*frame_parms->N_RB_DL*12); uint8_t symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; uint8_t pilots = ((symbol_mod==0)||(symbol_mod==(4-frame_parms->Ncp))) ? 1 : 0; - rxF0_128 = (__m128i *) &rxdataF_comp[0][jj]; //amp = _mm_set1_epi16(ONE_OVER_2_Q15); // printf("Doing alamouti!\n"); rxF0 = (short *)&rxdataF_comp[0][jj]; //tx antenna 0 h0*y @@ -4590,33 +4589,20 @@ void dlsch_alamouti(LTE_DL_FRAME_PARMS *frame_parms, //ch_mag0b[0] = _mm_srai_epi16(ch_mag0b[0],1); //ch_mag0b[1] = _mm_srai_epi16(ch_mag0b[1],1); - //rxF0_128[0] = _mm_mulhi_epi16(rxF0_128[0],amp); - //rxF0_128[0] = _mm_slli_epi16(rxF0_128[0],1); - //rxF0_128[1] = _mm_mulhi_epi16(rxF0_128[1],amp); - //rxF0_128[1] = _mm_slli_epi16(rxF0_128[1],1); - - //rxF0_128[0] = _mm_srai_epi16(rxF0_128[0],1); - //rxF0_128[1] = _mm_srai_epi16(rxF0_128[1],1); - if (pilots==0) { ch_mag0[2] = _mm_adds_epi16(ch_mag0[2],ch_mag1[2]); ch_mag0b[2] = _mm_adds_epi16(ch_mag0b[2],ch_mag1b[2]); //ch_mag0[2] = _mm_srai_epi16(ch_mag0[2],1); //ch_mag0b[2] = _mm_srai_epi16(ch_mag0b[2],1); - //rxF0_128[2] = _mm_mulhi_epi16(rxF0_128[2],amp); - //rxF0_128[2] = _mm_slli_epi16(rxF0_128[2],1); - //rxF0_128[2] = _mm_srai_epi16(rxF0_128[2],1); ch_mag0+=3; ch_mag1+=3; ch_mag0b+=3; ch_mag1b+=3; - rxF0_128+=3; } else { ch_mag0+=2; ch_mag1+=2; ch_mag0b+=2; ch_mag1b+=2; - rxF0_128+=2; } } diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c index b1ff7357da..c5478a6340 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c +++ b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c @@ -40,583 +40,76 @@ //#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}; +const int16_t zeros[8] __attribute__((aligned(16))) = {0, 0, 0, 0, 0, 0, 0, 0}; +const 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); +#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); \ + simde__m128i 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); +#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); \ + simde__m128i 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); +#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); \ + simde__m128i 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); +#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); \ + simde__m128i 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); +#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); \ + simde__m128i a_sq = _mm_adds_epi16(tmp_result, tmp_result2); #elif defined(__arm__) || defined(__aarch64__) @@ -897,8 +390,8 @@ void qam16_llr(int16_t *stream0_in, for (i=0; i=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { @@ -1104,15 +593,6 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, len = (nb_rb*12) - pbch_pss_sss_adjust; } -// printf("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,"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); @@ -1154,9 +634,9 @@ void qam64_llr(int16_t *stream0_in, 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]; + simde__m128i xmm0 = rho01_128i[i]; // 4 symbols + simde__m128i xmm1 = rho01_128i[i + 1]; // put (rho_r + rho_i)/2sqrt2 in rho_rpi // put (rho_r - rho_i)/2sqrt2 in rho_rmi @@ -1528,10 +1008,10 @@ void qpsk_qpsk(short *stream0_in, 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) + simde__m128i xmm2 = _mm_unpacklo_epi64(xmm0, xmm1); // Re(rho) + simde__m128i xmm3 = _mm_unpackhi_epi64(xmm0, xmm1); // Im(rho) + simde__m128i rho_rpi = _mm_adds_epi16(xmm2, xmm3); // rho = Re(rho) + Im(rho) + simde__m128i 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); @@ -1555,8 +1035,8 @@ void qpsk_qpsk(short *stream0_in, 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); + simde__m128i y0r = _mm_unpacklo_epi64(xmm0, xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] + simde__m128i 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 @@ -1577,8 +1057,8 @@ void qpsk_qpsk(short *stream0_in, 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)] + simde__m128i y1r = _mm_unpacklo_epi64(xmm0, xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] + simde__m128i 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 @@ -1593,7 +1073,7 @@ void qpsk_qpsk(short *stream0_in, 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 + simde__m128i 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); @@ -1610,7 +1090,7 @@ void qpsk_qpsk(short *stream0_in, 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 + simde__m128i 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); @@ -1625,7 +1105,7 @@ void qpsk_qpsk(short *stream0_in, // 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 + simde__m128i 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); @@ -1635,7 +1115,7 @@ void qpsk_qpsk(short *stream0_in, // 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 + simde__m128i 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 @@ -1787,8 +1267,8 @@ void qpsk_qam16(int16_t *stream0_in, #if defined(__x86_64__) || defined(__i386__) - xmm0 = rho01_128i[i]; // 4 symbols - xmm1 = rho01_128i[i+1]; + simde__m128i xmm0 = rho01_128i[i]; // 4 symbols + simde__m128i xmm1 = rho01_128i[i + 1]; // put (rho_r + rho_i)/2sqrt2 in rho_rpi // put (rho_r - rho_i)/2sqrt2 in rho_rmi @@ -1800,10 +1280,10 @@ void qpsk_qam16(int16_t *stream0_in, 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) + simde__m128i xmm2 = _mm_unpacklo_epi64(xmm0, xmm1); // Re(rho) + simde__m128i xmm3 = _mm_unpackhi_epi64(xmm0, xmm1); // Im(rho) + simde__m128i rho_rpi = _mm_adds_epi16(xmm2, xmm3); // rho = Re(rho) + Im(rho) + simde__m128i 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); @@ -1825,8 +1305,8 @@ void qpsk_qam16(int16_t *stream0_in, 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); + simde__m128i y0r = _mm_unpacklo_epi64(xmm0, xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] + simde__m128i y0i = _mm_unpackhi_epi64(xmm0, xmm1); // divide by sqrt(2) y0r_over2 = _mm_mulhi_epi16(y0r, ONE_OVER_SQRT_2); @@ -1834,8 +1314,8 @@ void qpsk_qam16(int16_t *stream0_in, 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); + simde__m128i y0_p_1_1 = _mm_adds_epi16(y0r_over2, y0i_over2); + simde__m128i 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]; @@ -1849,28 +1329,28 @@ void qpsk_qam16(int16_t *stream0_in, 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)] + simde__m128i y1r = _mm_unpacklo_epi64(xmm0, xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] + simde__m128i 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); + simde__m128i psi_r_p1_p1 = _mm_abs_epi16(xmm3); xmm3 = _mm_subs_epi16(y1i,rho_rmi); - psi_i_p1_p1 = _mm_abs_epi16(xmm3); + simde__m128i psi_i_p1_p1 = _mm_abs_epi16(xmm3); xmm3 = _mm_subs_epi16(y1r,rho_rmi); - psi_r_p1_m1 = _mm_abs_epi16(xmm3); + simde__m128i psi_r_p1_m1 = _mm_abs_epi16(xmm3); xmm3 = _mm_adds_epi16(y1i,rho_rpi); - psi_i_p1_m1 = _mm_abs_epi16(xmm3); + simde__m128i psi_i_p1_m1 = _mm_abs_epi16(xmm3); xmm3 = _mm_adds_epi16(y1r,rho_rmi); - psi_r_m1_p1 = _mm_abs_epi16(xmm3); + simde__m128i psi_r_m1_p1 = _mm_abs_epi16(xmm3); xmm3 = _mm_subs_epi16(y1i,rho_rpi); - psi_i_m1_p1 = _mm_abs_epi16(xmm3); + simde__m128i psi_i_m1_p1 = _mm_abs_epi16(xmm3); xmm3 = _mm_adds_epi16(y1r,rho_rpi); - psi_r_m1_m1 = _mm_abs_epi16(xmm3); + simde__m128i psi_r_m1_m1 = _mm_abs_epi16(xmm3); xmm3 = _mm_adds_epi16(y1i,rho_rmi); - psi_i_m1_m1 = _mm_abs_epi16(xmm3); + simde__m128i psi_i_m1_m1 = _mm_abs_epi16(xmm3); // Rearrange interfering channel magnitudes xmm2 = ch_mag_128i_i[i]; @@ -1884,7 +1364,7 @@ void qpsk_qam16(int16_t *stream0_in, xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3)); ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3); - + simde__m128i tmp_result, tmp_result2; // 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); @@ -1909,26 +1389,26 @@ void qpsk_qam16(int16_t *stream0_in, // 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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 + simde__m128i logmax_num_re0 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_m1); // bit=0 + simde__m128i 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 + simde__m128i logmax_num_im0 = _mm_max_epi16(bit_met_p1_p1, bit_met_m1_p1); // bit=0 + simde__m128i 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); @@ -2066,8 +1546,8 @@ void qpsk_qam64(short *stream0_in, #if defined(__x86_64__) || defined(__i386__) - xmm0 = rho01_128i[i]; // 4 symbols - xmm1 = rho01_128i[i+1]; + simde__m128i xmm0 = rho01_128i[i]; // 4 symbols + simde__m128i xmm1 = rho01_128i[i + 1]; // put (rho_r + rho_i)/sqrt2 in rho_rpi // put (rho_r - rho_i)/sqrt2 in rho_rmi @@ -2079,10 +1559,10 @@ void qpsk_qam64(short *stream0_in, 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) + simde__m128i xmm2 = _mm_unpacklo_epi64(xmm0, xmm1); // Re(rho) + simde__m128i xmm3 = _mm_unpackhi_epi64(xmm0, xmm1); // Im(rho) + simde__m128i rho_rpi = _mm_adds_epi16(xmm2, xmm3); // rho = Re(rho) + Im(rho) + simde__m128i 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); @@ -2104,8 +1584,8 @@ void qpsk_qam64(short *stream0_in, 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); + simde__m128i y0r = _mm_unpacklo_epi64(xmm0, xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] + simde__m128i y0i = _mm_unpackhi_epi64(xmm0, xmm1); // divide by sqrt(2) y0r_over2 = _mm_mulhi_epi16(y0r, ONE_OVER_SQRT_2); @@ -2113,8 +1593,8 @@ void qpsk_qam64(short *stream0_in, 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); + simde__m128i y0_p_1_1 = _mm_adds_epi16(y0r_over2, y0i_over2); + simde__m128i 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]; @@ -2128,28 +1608,28 @@ void qpsk_qam64(short *stream0_in, 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)] + simde__m128i y1r = _mm_unpacklo_epi64(xmm0, xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] + simde__m128i 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); + simde__m128i psi_r_p1_p1 = _mm_abs_epi16(xmm3); xmm3 = _mm_subs_epi16(y1i,rho_rmi); - psi_i_p1_p1 = _mm_abs_epi16(xmm3); + simde__m128i psi_i_p1_p1 = _mm_abs_epi16(xmm3); xmm3 = _mm_subs_epi16(y1r,rho_rmi); - psi_r_p1_m1 = _mm_abs_epi16(xmm3); + simde__m128i psi_r_p1_m1 = _mm_abs_epi16(xmm3); xmm3 = _mm_adds_epi16(y1i,rho_rpi); - psi_i_p1_m1 = _mm_abs_epi16(xmm3); + simde__m128i psi_i_p1_m1 = _mm_abs_epi16(xmm3); xmm3 = _mm_adds_epi16(y1r,rho_rmi); - psi_r_m1_p1 = _mm_abs_epi16(xmm3); + simde__m128i psi_r_m1_p1 = _mm_abs_epi16(xmm3); xmm3 = _mm_subs_epi16(y1i,rho_rpi); - psi_i_m1_p1 = _mm_abs_epi16(xmm3); + simde__m128i psi_i_m1_p1 = _mm_abs_epi16(xmm3); xmm3 = _mm_adds_epi16(y1r,rho_rpi); - psi_r_m1_m1 = _mm_abs_epi16(xmm3); + simde__m128i psi_r_m1_m1 = _mm_abs_epi16(xmm3); xmm3 = _mm_adds_epi16(y1i,rho_rmi); - psi_i_m1_m1 = _mm_abs_epi16(xmm3); + simde__m128i psi_i_m1_m1 = _mm_abs_epi16(xmm3); // Rearrange interfering channel magnitudes xmm2 = ch_mag_128i_i[i]; @@ -2166,7 +1646,7 @@ void qpsk_qam64(short *stream0_in, 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 - + simde__m128i tmp_result, tmp_result2, tmp_result3, tmp_result4; 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, @@ -2207,26 +1687,26 @@ void qpsk_qam64(short *stream0_in, // 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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 + simde__m128i logmax_num_re0 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_m1); // bit=0 + simde__m128i 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 + simde__m128i logmax_num_im0 = _mm_max_epi16(bit_met_p1_p1, bit_met_m1_p1); // bit=0 + simde__m128i 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); @@ -2323,8 +1803,8 @@ void qam16_qpsk(short *stream0_in, #if defined(__x86_64__) || defined(__i386__) // Get rho - xmm0 = rho01_128i[i]; - xmm1 = rho01_128i[i+1]; + simde__m128i xmm0 = rho01_128i[i]; + simde__m128i 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)); @@ -2333,32 +1813,32 @@ void qam16_qpsk(short *stream0_in, 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) + simde__m128i xmm2 = _mm_unpacklo_epi64(xmm0, xmm1); // Re(rho) + simde__m128i xmm3 = _mm_unpackhi_epi64(xmm0, xmm1); // Im(rho) + simde__m128i rho_rpi = _mm_adds_epi16(xmm2, xmm3); // rho = Re(rho) + Im(rho) + simde__m128i 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); + simde__m128i rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_10); + simde__m128i rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_10); + simde__m128i rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_10); + simde__m128i 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); + simde__m128i xmm4 = _mm_mulhi_epi16(xmm2, ONE_OVER_SQRT_10); // Re(rho) + simde__m128i 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); + simde__m128i rho_rpi_1_3 = _mm_adds_epi16(xmm4, xmm5); + simde__m128i 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) + simde__m128i xmm6 = _mm_mulhi_epi16(xmm2, THREE_OVER_SQRT_10); // Re(rho) + simde__m128i 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); + simde__m128i rho_rpi_3_1 = _mm_adds_epi16(xmm6, xmm7); + simde__m128i rho_rmi_3_1 = _mm_subs_epi16(xmm6, xmm7); // Rearrange interfering MF output xmm0 = stream1_128i_in[i]; @@ -2371,75 +1851,75 @@ void qam16_qpsk(short *stream0_in, 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)] + simde__m128i y1r = _mm_unpacklo_epi64(xmm0, xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] + simde__m128i 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| + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i psi_i_m3_m3 = _mm_abs_epi16(xmm2); // Rearrange desired MF output xmm0 = stream0_128i_in[i]; @@ -2452,8 +1932,8 @@ void qam16_qpsk(short *stream0_in, 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); + simde__m128i y0r = _mm_unpacklo_epi64(xmm0, xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] + simde__m128i 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)) @@ -2476,35 +1956,35 @@ void qam16_qpsk(short *stream0_in, 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); + simde__m128i y0_p_1_1 = _mm_adds_epi16(y0r_over_sqrt10, y0i_over_sqrt10); + simde__m128i 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); + simde__m128i y0_p_1_3 = _mm_adds_epi16(y0r_over_sqrt10, y0i_three_over_sqrt10); + simde__m128i 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); + simde__m128i y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt10, y0i_over_sqrt10); + simde__m128i 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); + simde__m128i y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt10, y0i_three_over_sqrt10); + simde__m128i 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); + simde__m128i psi_a_p1_p1 = _mm_adds_epi16(psi_r_p1_p1, psi_i_p1_p1); + simde__m128i psi_a_p1_p3 = _mm_adds_epi16(psi_r_p1_p3, psi_i_p1_p3); + simde__m128i psi_a_p3_p1 = _mm_adds_epi16(psi_r_p3_p1, psi_i_p3_p1); + simde__m128i psi_a_p3_p3 = _mm_adds_epi16(psi_r_p3_p3, psi_i_p3_p3); + simde__m128i psi_a_p1_m1 = _mm_adds_epi16(psi_r_p1_m1, psi_i_p1_m1); + simde__m128i psi_a_p1_m3 = _mm_adds_epi16(psi_r_p1_m3, psi_i_p1_m3); + simde__m128i psi_a_p3_m1 = _mm_adds_epi16(psi_r_p3_m1, psi_i_p3_m1); + simde__m128i psi_a_p3_m3 = _mm_adds_epi16(psi_r_p3_m3, psi_i_p3_m3); + simde__m128i psi_a_m1_p1 = _mm_adds_epi16(psi_r_m1_p1, psi_i_m1_p1); + simde__m128i psi_a_m1_p3 = _mm_adds_epi16(psi_r_m1_p3, psi_i_m1_p3); + simde__m128i psi_a_m3_p1 = _mm_adds_epi16(psi_r_m3_p1, psi_i_m3_p1); + simde__m128i psi_a_m3_p3 = _mm_adds_epi16(psi_r_m3_p3, psi_i_m3_p3); + simde__m128i psi_a_m1_m1 = _mm_adds_epi16(psi_r_m1_m1, psi_i_m1_m1); + simde__m128i psi_a_m1_m3 = _mm_adds_epi16(psi_r_m1_m3, psi_i_m1_m3); + simde__m128i psi_a_m3_m1 = _mm_adds_epi16(psi_r_m3_m1, psi_i_m3_m1); + simde__m128i 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); @@ -2552,52 +2032,52 @@ void qam16_qpsk(short *stream0_in, // 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i bit_met_m3_m3 = _mm_subs_epi16(xmm1, ch_mag_9_over_10); // LLR of the first bit // Bit = 1 @@ -2607,7 +2087,7 @@ void qam16_qpsk(short *stream0_in, 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); + simde__m128i logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); // Bit = 0 xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3); @@ -2616,7 +2096,7 @@ void qam16_qpsk(short *stream0_in, 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); + simde__m128i 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); @@ -2629,7 +2109,7 @@ void qam16_qpsk(short *stream0_in, 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); + simde__m128i logmax_num_re1 = _mm_max_epi16(xmm4, xmm5); // Bit = 0 xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1); @@ -2638,7 +2118,7 @@ void qam16_qpsk(short *stream0_in, 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); + simde__m128i 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); @@ -2651,7 +2131,7 @@ void qam16_qpsk(short *stream0_in, 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); + simde__m128i logmax_num_im0 = _mm_max_epi16(xmm4, xmm5); // Bit = 0 xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3); @@ -2660,7 +2140,7 @@ void qam16_qpsk(short *stream0_in, 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); + simde__m128i 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); @@ -2673,7 +2153,7 @@ void qam16_qpsk(short *stream0_in, 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); + simde__m128i logmax_num_im1 = _mm_max_epi16(xmm4, xmm5); // Bit = 0 xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1); @@ -2682,7 +2162,7 @@ void qam16_qpsk(short *stream0_in, 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); + simde__m128i 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); @@ -2831,8 +2311,8 @@ void qam16_qam16(short *stream0_in, #if defined(__x86_64__) || defined(__i386__) // Get rho - xmm0 = rho01_128i[i]; - xmm1 = rho01_128i[i+1]; + simde__m128i xmm0 = rho01_128i[i]; + simde__m128i 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)); @@ -2841,32 +2321,32 @@ void qam16_qam16(short *stream0_in, 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) + simde__m128i xmm2 = _mm_unpacklo_epi64(xmm0, xmm1); // Re(rho) + simde__m128i xmm3 = _mm_unpackhi_epi64(xmm0, xmm1); // Im(rho) + simde__m128i rho_rpi = _mm_adds_epi16(xmm2, xmm3); // rho = Re(rho) + Im(rho) + simde__m128i 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); + simde__m128i rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_10); + simde__m128i rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_10); + simde__m128i rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_10); + simde__m128i 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) + simde__m128i xmm4 = _mm_mulhi_epi16(xmm2, ONE_OVER_SQRT_10); // Re(rho) + simde__m128i 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); + simde__m128i rho_rpi_1_3 = _mm_adds_epi16(xmm4, xmm5); + simde__m128i 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) + simde__m128i xmm6 = _mm_mulhi_epi16(xmm2, THREE_OVER_SQRT_10); // Re(rho) + simde__m128i 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); + simde__m128i rho_rpi_3_1 = _mm_adds_epi16(xmm6, xmm7); + simde__m128i rho_rmi_3_1 = _mm_subs_epi16(xmm6, xmm7); // Rearrange interfering MF output xmm0 = stream1_128i_in[i]; @@ -2879,75 +2359,75 @@ void qam16_qam16(short *stream0_in, 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)] + simde__m128i y1r = _mm_unpacklo_epi64(xmm0, xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] + simde__m128i 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| + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i psi_i_m3_m3 = _mm_abs_epi16(xmm2); // Rearrange desired MF output xmm0 = stream0_128i_in[i]; @@ -2960,8 +2440,8 @@ void qam16_qam16(short *stream0_in, 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); + simde__m128i y0r = _mm_unpacklo_epi64(xmm0, xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] + simde__m128i 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)) @@ -2997,18 +2477,18 @@ void qam16_qam16(short *stream0_in, 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); + simde__m128i y0_p_1_1 = _mm_adds_epi16(y0r_over_sqrt10, y0i_over_sqrt10); + simde__m128i 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); + simde__m128i y0_p_1_3 = _mm_adds_epi16(y0r_over_sqrt10, y0i_three_over_sqrt10); + simde__m128i 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); + simde__m128i y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt10, y0i_over_sqrt10); + simde__m128i y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt10, y0i_over_sqrt10); + simde__m128i y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt10, y0i_three_over_sqrt10); + simde__m128i y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt10, y0i_three_over_sqrt10); + simde__m128i tmp_result, tmp_result2; // 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); @@ -3090,67 +2570,67 @@ void qam16_qam16(short *stream0_in, // 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i bit_met_m3_m3 = _mm_subs_epi16(xmm1, ch_mag_9_over_10); // LLR of the first bit // Bit = 1 @@ -3160,7 +2640,7 @@ void qam16_qam16(short *stream0_in, 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); + simde__m128i logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); // Bit = 0 xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3); @@ -3169,7 +2649,7 @@ void qam16_qam16(short *stream0_in, 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); + simde__m128i 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); @@ -3182,7 +2662,7 @@ void qam16_qam16(short *stream0_in, 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); + simde__m128i logmax_num_re1 = _mm_max_epi16(xmm4, xmm5); // Bit = 0 xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1); @@ -3191,7 +2671,7 @@ void qam16_qam16(short *stream0_in, 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); + simde__m128i 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); @@ -3204,7 +2684,7 @@ void qam16_qam16(short *stream0_in, 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); + simde__m128i logmax_num_im0 = _mm_max_epi16(xmm4, xmm5); // Bit = 0 xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3); @@ -3213,7 +2693,7 @@ void qam16_qam16(short *stream0_in, 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); + simde__m128i 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); @@ -3226,7 +2706,7 @@ void qam16_qam16(short *stream0_in, 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); + simde__m128i logmax_num_im1 = _mm_max_epi16(xmm4, xmm5); // Bit = 0 xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1); @@ -3235,7 +2715,7 @@ void qam16_qam16(short *stream0_in, 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); + simde__m128i 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); @@ -3395,8 +2875,8 @@ void qam16_qam64(int16_t *stream0_in, #if defined(__x86_64__) || defined(__i386__) // Get rho - xmm0 = rho01_128i[i]; - xmm1 = rho01_128i[i+1]; + simde__m128i xmm0 = rho01_128i[i]; + simde__m128i 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)); @@ -3405,32 +2885,32 @@ void qam16_qam64(int16_t *stream0_in, 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) + simde__m128i xmm2 = _mm_unpacklo_epi64(xmm0, xmm1); // Re(rho) + simde__m128i xmm3 = _mm_unpackhi_epi64(xmm0, xmm1); // Im(rho) + simde__m128i rho_rpi = _mm_adds_epi16(xmm2, xmm3); // rho = Re(rho) + Im(rho) + simde__m128i 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); + simde__m128i rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_10); + simde__m128i rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_10); + simde__m128i rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_10); + simde__m128i 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) + simde__m128i xmm4 = _mm_mulhi_epi16(xmm2, ONE_OVER_SQRT_10); // Re(rho) + simde__m128i 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); + simde__m128i rho_rpi_1_3 = _mm_adds_epi16(xmm4, xmm5); + simde__m128i 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) + simde__m128i xmm6 = _mm_mulhi_epi16(xmm2, THREE_OVER_SQRT_10); // Re(rho) + simde__m128i 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); + simde__m128i rho_rpi_3_1 = _mm_adds_epi16(xmm6, xmm7); + simde__m128i rho_rmi_3_1 = _mm_subs_epi16(xmm6, xmm7); // Rearrange interfering MF output xmm0 = stream1_128i_in[i]; @@ -3443,75 +2923,75 @@ void qam16_qam64(int16_t *stream0_in, 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)] + simde__m128i y1r = _mm_unpacklo_epi64(xmm0, xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] + simde__m128i 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| + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i psi_i_m3_m3 = _mm_abs_epi16(xmm2); // Rearrange desired MF output xmm0 = stream0_128i_in[i]; @@ -3524,8 +3004,8 @@ void qam16_qam64(int16_t *stream0_in, 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); + simde__m128i y0r = _mm_unpacklo_epi64(xmm0, xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] + simde__m128i 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)) @@ -3561,21 +3041,22 @@ void qam16_qam64(int16_t *stream0_in, 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); + simde__m128i y0_p_1_1 = _mm_adds_epi16(y0r_over_sqrt10, y0i_over_sqrt10); + simde__m128i 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); + simde__m128i y0_p_1_3 = _mm_adds_epi16(y0r_over_sqrt10, y0i_three_over_sqrt10); + simde__m128i 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); + simde__m128i y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt10, y0i_over_sqrt10); + simde__m128i 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); + simde__m128i y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt10, y0i_three_over_sqrt10); + simde__m128i 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 + simde__m128i tmp_result, tmp_result2, tmp_result3, tmp_result4; 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, @@ -3723,67 +3204,67 @@ void qam16_qam64(int16_t *stream0_in, // 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i bit_met_m3_m3 = _mm_subs_epi16(xmm1, ch_mag_9_over_10); // LLR of the first bit // Bit = 1 @@ -3793,7 +3274,7 @@ void qam16_qam64(int16_t *stream0_in, 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); + simde__m128i logmax_num_re0 = _mm_max_epi16(xmm4, xmm5); // Bit = 0 xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3); @@ -3802,7 +3283,7 @@ void qam16_qam64(int16_t *stream0_in, 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); + simde__m128i 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); @@ -3815,7 +3296,7 @@ void qam16_qam64(int16_t *stream0_in, 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); + simde__m128i logmax_num_re1 = _mm_max_epi16(xmm4, xmm5); // Bit = 0 xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1); @@ -3824,7 +3305,7 @@ void qam16_qam64(int16_t *stream0_in, 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); + simde__m128i 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); @@ -3837,7 +3318,7 @@ void qam16_qam64(int16_t *stream0_in, 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); + simde__m128i logmax_num_im0 = _mm_max_epi16(xmm4, xmm5); // Bit = 0 xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3); @@ -3846,7 +3327,7 @@ void qam16_qam64(int16_t *stream0_in, 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); + simde__m128i 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); @@ -3859,7 +3340,7 @@ void qam16_qam64(int16_t *stream0_in, 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); + simde__m128i logmax_num_im1 = _mm_max_epi16(xmm4, xmm5); // Bit = 0 xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1); @@ -3868,7 +3349,7 @@ void qam16_qam64(int16_t *stream0_in, 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); + simde__m128i 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); @@ -4078,8 +3559,8 @@ void qam64_qpsk(int16_t *stream0_in, #if defined(__x86_64) || defined(__i386__) // Get rho - xmm0 = rho01_128i[i]; - xmm1 = rho01_128i[i+1]; + simde__m128i xmm0 = rho01_128i[i]; + simde__m128i 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)); @@ -4088,66 +3569,66 @@ void qam64_qpsk(int16_t *stream0_in, 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) + simde__m128i xmm2 = _mm_unpacklo_epi64(xmm0, xmm1); // Re(rho) + simde__m128i xmm3 = _mm_unpackhi_epi64(xmm0, xmm1); // Im(rho) + simde__m128i rho_rpi = _mm_adds_epi16(xmm2, xmm3); // rho = Re(rho) + Im(rho) + simde__m128i 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); + simde__m128i rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42); + simde__m128i rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42); + simde__m128i rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42); + simde__m128i rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42); + simde__m128i rho_rpi_5_5 = _mm_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42); + simde__m128i rho_rmi_5_5 = _mm_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42); + simde__m128i rho_rpi_7_7 = _mm_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42); + simde__m128i 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); + simde__m128i xmm4 = _mm_mulhi_epi16(xmm2, ONE_OVER_SQRT_42); + simde__m128i xmm5 = _mm_mulhi_epi16(xmm3, ONE_OVER_SQRT_42); + simde__m128i xmm6 = _mm_mulhi_epi16(xmm3, THREE_OVER_SQRT_42); + simde__m128i xmm7 = _mm_mulhi_epi16(xmm3, FIVE_OVER_SQRT_42); + simde__m128i 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); + simde__m128i rho_rpi_1_3 = _mm_adds_epi16(xmm4, xmm6); + simde__m128i rho_rmi_1_3 = _mm_subs_epi16(xmm4, xmm6); + simde__m128i rho_rpi_1_5 = _mm_adds_epi16(xmm4, xmm7); + simde__m128i rho_rmi_1_5 = _mm_subs_epi16(xmm4, xmm7); + simde__m128i rho_rpi_1_7 = _mm_adds_epi16(xmm4, xmm8); + simde__m128i 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); + simde__m128i rho_rpi_3_1 = _mm_adds_epi16(xmm4, xmm5); + simde__m128i rho_rmi_3_1 = _mm_subs_epi16(xmm4, xmm5); + simde__m128i rho_rpi_3_5 = _mm_adds_epi16(xmm4, xmm7); + simde__m128i rho_rmi_3_5 = _mm_subs_epi16(xmm4, xmm7); + simde__m128i rho_rpi_3_7 = _mm_adds_epi16(xmm4, xmm8); + simde__m128i 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); + simde__m128i rho_rpi_5_1 = _mm_adds_epi16(xmm4, xmm5); + simde__m128i rho_rmi_5_1 = _mm_subs_epi16(xmm4, xmm5); + simde__m128i rho_rpi_5_3 = _mm_adds_epi16(xmm4, xmm6); + simde__m128i rho_rmi_5_3 = _mm_subs_epi16(xmm4, xmm6); + simde__m128i rho_rpi_5_7 = _mm_adds_epi16(xmm4, xmm8); + simde__m128i 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); + simde__m128i rho_rpi_7_1 = _mm_adds_epi16(xmm4, xmm5); + simde__m128i rho_rmi_7_1 = _mm_subs_epi16(xmm4, xmm5); + simde__m128i rho_rpi_7_3 = _mm_adds_epi16(xmm4, xmm6); + simde__m128i rho_rmi_7_3 = _mm_subs_epi16(xmm4, xmm6); + simde__m128i rho_rpi_7_5 = _mm_adds_epi16(xmm4, xmm7); + simde__m128i rho_rmi_7_5 = _mm_subs_epi16(xmm4, xmm7); // Rearrange interfering MF output xmm0 = stream1_128i_in[i]; @@ -4160,272 +3641,271 @@ void qam64_qpsk(int16_t *stream0_in, 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)] + simde__m128i y1r = _mm_unpacklo_epi64(xmm0, xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i psi_r_m7_m7 = _mm_abs_epi16(xmm2); - // Psi_i calculation from rho_rpi or rho_rmi + // Simde__M128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); - + simde__m128i psi_i_m7_m7 = _mm_abs_epi16(xmm2); // Rearrange desired MF output xmm0 = stream0_128i_in[i]; @@ -4438,8 +3918,8 @@ void qam64_qpsk(int16_t *stream0_in, 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); + simde__m128i y0r = _mm_unpacklo_epi64(xmm0, xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] + simde__m128i 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)) @@ -4466,39 +3946,39 @@ void qam64_qpsk(int16_t *stream0_in, 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); + simde__m128i y0_p_7_1 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_p_7_3 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_p_7_5 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i y0_p_7_7 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m128i y0_p_5_1 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_p_5_3 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_p_5_5 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i y0_p_5_7 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m128i y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_p_3_5 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i y0_p_3_7 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m128i y0_p_1_1 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_p_1_3 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_p_1_5 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i 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); + simde__m128i y0_m_1_1 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_m_1_3 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_m_1_5 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i y0_m_1_7 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m128i y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_m_3_5 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i y0_m_3_7 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m128i y0_m_5_1 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_m_5_3 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_m_5_5 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i y0_m_5_7 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m128i y0_m_7_1 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_m_7_3 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_m_7_5 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i 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); @@ -4759,70 +4239,70 @@ void qam64_qpsk(int16_t *stream0_in, 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); + simde__m128i psi_a_p7_p7 = _mm_adds_epi16(psi_r_p7_p7, psi_i_p7_p7); + simde__m128i psi_a_p7_p5 = _mm_adds_epi16(psi_r_p7_p5, psi_i_p7_p5); + simde__m128i psi_a_p7_p3 = _mm_adds_epi16(psi_r_p7_p3, psi_i_p7_p3); + simde__m128i psi_a_p7_p1 = _mm_adds_epi16(psi_r_p7_p1, psi_i_p7_p1); + simde__m128i psi_a_p7_m1 = _mm_adds_epi16(psi_r_p7_m1, psi_i_p7_m1); + simde__m128i psi_a_p7_m3 = _mm_adds_epi16(psi_r_p7_m3, psi_i_p7_m3); + simde__m128i psi_a_p7_m5 = _mm_adds_epi16(psi_r_p7_m5, psi_i_p7_m5); + simde__m128i psi_a_p7_m7 = _mm_adds_epi16(psi_r_p7_m7, psi_i_p7_m7); + simde__m128i psi_a_p5_p7 = _mm_adds_epi16(psi_r_p5_p7, psi_i_p5_p7); + simde__m128i psi_a_p5_p5 = _mm_adds_epi16(psi_r_p5_p5, psi_i_p5_p5); + simde__m128i psi_a_p5_p3 = _mm_adds_epi16(psi_r_p5_p3, psi_i_p5_p3); + simde__m128i psi_a_p5_p1 = _mm_adds_epi16(psi_r_p5_p1, psi_i_p5_p1); + simde__m128i psi_a_p5_m1 = _mm_adds_epi16(psi_r_p5_m1, psi_i_p5_m1); + simde__m128i psi_a_p5_m3 = _mm_adds_epi16(psi_r_p5_m3, psi_i_p5_m3); + simde__m128i psi_a_p5_m5 = _mm_adds_epi16(psi_r_p5_m5, psi_i_p5_m5); + simde__m128i psi_a_p5_m7 = _mm_adds_epi16(psi_r_p5_m7, psi_i_p5_m7); + simde__m128i psi_a_p3_p7 = _mm_adds_epi16(psi_r_p3_p7, psi_i_p3_p7); + simde__m128i psi_a_p3_p5 = _mm_adds_epi16(psi_r_p3_p5, psi_i_p3_p5); + simde__m128i psi_a_p3_p3 = _mm_adds_epi16(psi_r_p3_p3, psi_i_p3_p3); + simde__m128i psi_a_p3_p1 = _mm_adds_epi16(psi_r_p3_p1, psi_i_p3_p1); + simde__m128i psi_a_p3_m1 = _mm_adds_epi16(psi_r_p3_m1, psi_i_p3_m1); + simde__m128i psi_a_p3_m3 = _mm_adds_epi16(psi_r_p3_m3, psi_i_p3_m3); + simde__m128i psi_a_p3_m5 = _mm_adds_epi16(psi_r_p3_m5, psi_i_p3_m5); + simde__m128i psi_a_p3_m7 = _mm_adds_epi16(psi_r_p3_m7, psi_i_p3_m7); + simde__m128i psi_a_p1_p7 = _mm_adds_epi16(psi_r_p1_p7, psi_i_p1_p7); + simde__m128i psi_a_p1_p5 = _mm_adds_epi16(psi_r_p1_p5, psi_i_p1_p5); + simde__m128i psi_a_p1_p3 = _mm_adds_epi16(psi_r_p1_p3, psi_i_p1_p3); + simde__m128i psi_a_p1_p1 = _mm_adds_epi16(psi_r_p1_p1, psi_i_p1_p1); + simde__m128i psi_a_p1_m1 = _mm_adds_epi16(psi_r_p1_m1, psi_i_p1_m1); + simde__m128i psi_a_p1_m3 = _mm_adds_epi16(psi_r_p1_m3, psi_i_p1_m3); + simde__m128i psi_a_p1_m5 = _mm_adds_epi16(psi_r_p1_m5, psi_i_p1_m5); + simde__m128i psi_a_p1_m7 = _mm_adds_epi16(psi_r_p1_m7, psi_i_p1_m7); + simde__m128i psi_a_m1_p7 = _mm_adds_epi16(psi_r_m1_p7, psi_i_m1_p7); + simde__m128i psi_a_m1_p5 = _mm_adds_epi16(psi_r_m1_p5, psi_i_m1_p5); + simde__m128i psi_a_m1_p3 = _mm_adds_epi16(psi_r_m1_p3, psi_i_m1_p3); + simde__m128i psi_a_m1_p1 = _mm_adds_epi16(psi_r_m1_p1, psi_i_m1_p1); + simde__m128i psi_a_m1_m1 = _mm_adds_epi16(psi_r_m1_m1, psi_i_m1_m1); + simde__m128i psi_a_m1_m3 = _mm_adds_epi16(psi_r_m1_m3, psi_i_m1_m3); + simde__m128i psi_a_m1_m5 = _mm_adds_epi16(psi_r_m1_m5, psi_i_m1_m5); + simde__m128i psi_a_m1_m7 = _mm_adds_epi16(psi_r_m1_m7, psi_i_m1_m7); + simde__m128i psi_a_m3_p7 = _mm_adds_epi16(psi_r_m3_p7, psi_i_m3_p7); + simde__m128i psi_a_m3_p5 = _mm_adds_epi16(psi_r_m3_p5, psi_i_m3_p5); + simde__m128i psi_a_m3_p3 = _mm_adds_epi16(psi_r_m3_p3, psi_i_m3_p3); + simde__m128i psi_a_m3_p1 = _mm_adds_epi16(psi_r_m3_p1, psi_i_m3_p1); + simde__m128i psi_a_m3_m1 = _mm_adds_epi16(psi_r_m3_m1, psi_i_m3_m1); + simde__m128i psi_a_m3_m3 = _mm_adds_epi16(psi_r_m3_m3, psi_i_m3_m3); + simde__m128i psi_a_m3_m5 = _mm_adds_epi16(psi_r_m3_m5, psi_i_m3_m5); + simde__m128i psi_a_m3_m7 = _mm_adds_epi16(psi_r_m3_m7, psi_i_m3_m7); + simde__m128i psi_a_m5_p7 = _mm_adds_epi16(psi_r_m5_p7, psi_i_m5_p7); + simde__m128i psi_a_m5_p5 = _mm_adds_epi16(psi_r_m5_p5, psi_i_m5_p5); + simde__m128i psi_a_m5_p3 = _mm_adds_epi16(psi_r_m5_p3, psi_i_m5_p3); + simde__m128i psi_a_m5_p1 = _mm_adds_epi16(psi_r_m5_p1, psi_i_m5_p1); + simde__m128i psi_a_m5_m1 = _mm_adds_epi16(psi_r_m5_m1, psi_i_m5_m1); + simde__m128i psi_a_m5_m3 = _mm_adds_epi16(psi_r_m5_m3, psi_i_m5_m3); + simde__m128i psi_a_m5_m5 = _mm_adds_epi16(psi_r_m5_m5, psi_i_m5_m5); + simde__m128i psi_a_m5_m7 = _mm_adds_epi16(psi_r_m5_m7, psi_i_m5_m7); + simde__m128i psi_a_m7_p7 = _mm_adds_epi16(psi_r_m7_p7, psi_i_m7_p7); + simde__m128i psi_a_m7_p5 = _mm_adds_epi16(psi_r_m7_p5, psi_i_m7_p5); + simde__m128i psi_a_m7_p3 = _mm_adds_epi16(psi_r_m7_p3, psi_i_m7_p3); + simde__m128i psi_a_m7_p1 = _mm_adds_epi16(psi_r_m7_p1, psi_i_m7_p1); + simde__m128i psi_a_m7_m1 = _mm_adds_epi16(psi_r_m7_m1, psi_i_m7_m1); + simde__m128i psi_a_m7_m3 = _mm_adds_epi16(psi_r_m7_m3, psi_i_m7_m3); + simde__m128i psi_a_m7_m5 = _mm_adds_epi16(psi_r_m7_m5, psi_i_m7_m5); + simde__m128i 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 @@ -4858,134 +4338,134 @@ void qam64_qpsk(int16_t *stream0_in, // 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i bit_met_m7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); // Detection for 1st bit (LTE mapping) // bit = 1 @@ -4995,7 +4475,7 @@ void qam64_qpsk(int16_t *stream0_in, 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); + simde__m128i 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); @@ -5028,7 +4508,7 @@ void qam64_qpsk(int16_t *stream0_in, 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); + simde__m128i 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); @@ -5190,7 +4670,7 @@ void qam64_qpsk(int16_t *stream0_in, 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); + simde__m128i 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); @@ -5392,8 +4872,7 @@ void qam64_qpsk(int16_t *stream0_in, 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); - + simde__m128i 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 @@ -5604,8 +5083,8 @@ void qam64_qam16(short *stream0_in, #if defined(__x86_64__) || defined(__i386__) // Get rho - xmm0 = rho01_128i[i]; - xmm1 = rho01_128i[i+1]; + simde__m128i xmm0 = rho01_128i[i]; + simde__m128i 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)); @@ -5614,66 +5093,66 @@ void qam64_qam16(short *stream0_in, 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) + simde__m128i xmm2 = _mm_unpacklo_epi64(xmm0, xmm1); // Re(rho) + simde__m128i xmm3 = _mm_unpackhi_epi64(xmm0, xmm1); // Im(rho) + simde__m128i rho_rpi = _mm_adds_epi16(xmm2, xmm3); // rho = Re(rho) + Im(rho) + simde__m128i 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); + simde__m128i rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42); + simde__m128i rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42); + simde__m128i rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42); + simde__m128i rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42); + simde__m128i rho_rpi_5_5 = _mm_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42); + simde__m128i rho_rmi_5_5 = _mm_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42); + simde__m128i rho_rpi_7_7 = _mm_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42); + simde__m128i 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); + simde__m128i xmm4 = _mm_mulhi_epi16(xmm2, ONE_OVER_SQRT_42); + simde__m128i xmm5 = _mm_mulhi_epi16(xmm3, ONE_OVER_SQRT_42); + simde__m128i xmm6 = _mm_mulhi_epi16(xmm3, THREE_OVER_SQRT_42); + simde__m128i xmm7 = _mm_mulhi_epi16(xmm3, FIVE_OVER_SQRT_42); + simde__m128i 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); + simde__m128i rho_rpi_1_3 = _mm_adds_epi16(xmm4, xmm6); + simde__m128i rho_rmi_1_3 = _mm_subs_epi16(xmm4, xmm6); + simde__m128i rho_rpi_1_5 = _mm_adds_epi16(xmm4, xmm7); + simde__m128i rho_rmi_1_5 = _mm_subs_epi16(xmm4, xmm7); + simde__m128i rho_rpi_1_7 = _mm_adds_epi16(xmm4, xmm8); + simde__m128i 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); + simde__m128i rho_rpi_3_1 = _mm_adds_epi16(xmm4, xmm5); + simde__m128i rho_rmi_3_1 = _mm_subs_epi16(xmm4, xmm5); + simde__m128i rho_rpi_3_5 = _mm_adds_epi16(xmm4, xmm7); + simde__m128i rho_rmi_3_5 = _mm_subs_epi16(xmm4, xmm7); + simde__m128i rho_rpi_3_7 = _mm_adds_epi16(xmm4, xmm8); + simde__m128i 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); + simde__m128i rho_rpi_5_1 = _mm_adds_epi16(xmm4, xmm5); + simde__m128i rho_rmi_5_1 = _mm_subs_epi16(xmm4, xmm5); + simde__m128i rho_rpi_5_3 = _mm_adds_epi16(xmm4, xmm6); + simde__m128i rho_rmi_5_3 = _mm_subs_epi16(xmm4, xmm6); + simde__m128i rho_rpi_5_7 = _mm_adds_epi16(xmm4, xmm8); + simde__m128i 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); + simde__m128i rho_rpi_7_1 = _mm_adds_epi16(xmm4, xmm5); + simde__m128i rho_rmi_7_1 = _mm_subs_epi16(xmm4, xmm5); + simde__m128i rho_rpi_7_3 = _mm_adds_epi16(xmm4, xmm6); + simde__m128i rho_rmi_7_3 = _mm_subs_epi16(xmm4, xmm6); + simde__m128i rho_rpi_7_5 = _mm_adds_epi16(xmm4, xmm7); + simde__m128i rho_rmi_7_5 = _mm_subs_epi16(xmm4, xmm7); // Rearrange interfering MF output xmm0 = stream1_128i_in[i]; @@ -5686,272 +5165,271 @@ void qam64_qam16(short *stream0_in, 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)] + simde__m128i y1r = _mm_unpacklo_epi64(xmm0, xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i psi_r_m7_m7 = _mm_abs_epi16(xmm2); - // Psi_i calculation from rho_rpi or rho_rmi + // Simde__M128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); - + simde__m128i psi_i_m7_m7 = _mm_abs_epi16(xmm2); // Rearrange desired MF output xmm0 = stream0_128i_in[i]; @@ -5964,8 +5442,8 @@ void qam64_qam16(short *stream0_in, 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); + simde__m128i y0r = _mm_unpacklo_epi64(xmm0, xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] + simde__m128i 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)) @@ -6003,40 +5481,40 @@ void qam64_qam16(short *stream0_in, 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); + simde__m128i y0_p_7_1 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_p_7_3 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_p_7_5 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i y0_p_7_7 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m128i y0_p_5_1 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_p_5_3 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_p_5_5 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i y0_p_5_7 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m128i y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_p_3_5 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i y0_p_3_7 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m128i y0_p_1_1 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_p_1_3 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_p_1_5 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i y0_p_1_7 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m128i y0_m_1_1 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_m_1_3 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_m_1_5 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i y0_m_1_7 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m128i y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_m_3_5 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i y0_m_3_7 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m128i y0_m_5_1 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_m_5_3 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_m_5_5 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i y0_m_5_7 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m128i y0_m_7_1 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_m_7_3 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_m_7_5 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i y0_m_7_7 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m128i tmp_result, tmp_result2; 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); @@ -6334,197 +5812,197 @@ void qam64_qam16(short *stream0_in, // 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i bit_met_m7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); // Detection for 1st bit (LTE mapping) // bit = 1 @@ -6534,7 +6012,7 @@ void qam64_qam16(short *stream0_in, 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); + simde__m128i 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); @@ -6567,7 +6045,7 @@ void qam64_qam16(short *stream0_in, 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); + simde__m128i 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); @@ -6729,7 +6207,7 @@ void qam64_qam16(short *stream0_in, 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); + simde__m128i 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); @@ -6931,8 +6409,7 @@ void qam64_qam16(short *stream0_in, 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); - + simde__m128i 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 @@ -7151,8 +6628,8 @@ void qam64_qam64(short *stream0_in, #if defined(__x86_64__) || defined(__i386__) // Get rho - xmm0 = rho01_128i[i]; - xmm1 = rho01_128i[i+1]; + simde__m128i xmm0 = rho01_128i[i]; + simde__m128i 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)); @@ -7161,66 +6638,66 @@ void qam64_qam64(short *stream0_in, 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) + simde__m128i xmm2 = _mm_unpacklo_epi64(xmm0, xmm1); // Re(rho) + simde__m128i xmm3 = _mm_unpackhi_epi64(xmm0, xmm1); // Im(rho) + simde__m128i rho_rpi = _mm_adds_epi16(xmm2, xmm3); // rho = Re(rho) + Im(rho) + simde__m128i 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); + simde__m128i rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42); + simde__m128i rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42); + simde__m128i rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42); + simde__m128i rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42); + simde__m128i rho_rpi_5_5 = _mm_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42); + simde__m128i rho_rmi_5_5 = _mm_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42); + simde__m128i rho_rpi_7_7 = _mm_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42); + simde__m128i 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); + simde__m128i xmm4 = _mm_mulhi_epi16(xmm2, ONE_OVER_SQRT_42); + simde__m128i xmm5 = _mm_mulhi_epi16(xmm3, ONE_OVER_SQRT_42); + simde__m128i xmm6 = _mm_mulhi_epi16(xmm3, THREE_OVER_SQRT_42); + simde__m128i xmm7 = _mm_mulhi_epi16(xmm3, FIVE_OVER_SQRT_42); + simde__m128i 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); + simde__m128i rho_rpi_1_3 = _mm_adds_epi16(xmm4, xmm6); + simde__m128i rho_rmi_1_3 = _mm_subs_epi16(xmm4, xmm6); + simde__m128i rho_rpi_1_5 = _mm_adds_epi16(xmm4, xmm7); + simde__m128i rho_rmi_1_5 = _mm_subs_epi16(xmm4, xmm7); + simde__m128i rho_rpi_1_7 = _mm_adds_epi16(xmm4, xmm8); + simde__m128i 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); + simde__m128i rho_rpi_3_1 = _mm_adds_epi16(xmm4, xmm5); + simde__m128i rho_rmi_3_1 = _mm_subs_epi16(xmm4, xmm5); + simde__m128i rho_rpi_3_5 = _mm_adds_epi16(xmm4, xmm7); + simde__m128i rho_rmi_3_5 = _mm_subs_epi16(xmm4, xmm7); + simde__m128i rho_rpi_3_7 = _mm_adds_epi16(xmm4, xmm8); + simde__m128i 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); + simde__m128i rho_rpi_5_1 = _mm_adds_epi16(xmm4, xmm5); + simde__m128i rho_rmi_5_1 = _mm_subs_epi16(xmm4, xmm5); + simde__m128i rho_rpi_5_3 = _mm_adds_epi16(xmm4, xmm6); + simde__m128i rho_rmi_5_3 = _mm_subs_epi16(xmm4, xmm6); + simde__m128i rho_rpi_5_7 = _mm_adds_epi16(xmm4, xmm8); + simde__m128i 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); + simde__m128i rho_rpi_7_1 = _mm_adds_epi16(xmm4, xmm5); + simde__m128i rho_rmi_7_1 = _mm_subs_epi16(xmm4, xmm5); + simde__m128i rho_rpi_7_3 = _mm_adds_epi16(xmm4, xmm6); + simde__m128i rho_rmi_7_3 = _mm_subs_epi16(xmm4, xmm6); + simde__m128i rho_rpi_7_5 = _mm_adds_epi16(xmm4, xmm7); + simde__m128i rho_rmi_7_5 = _mm_subs_epi16(xmm4, xmm7); // Rearrange interfering MF output xmm0 = stream1_128i_in[i]; @@ -7233,272 +6710,271 @@ void qam64_qam64(short *stream0_in, 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)] + simde__m128i y1r = _mm_unpacklo_epi64(xmm0, xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)] + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i psi_r_m7_m7 = _mm_abs_epi16(xmm2); - // Psi_i calculation from rho_rpi or rho_rmi + // Simde__M128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); - + simde__m128i psi_i_m7_m7 = _mm_abs_epi16(xmm2); // Rearrange desired MF output xmm0 = stream0_128i_in[i]; @@ -7511,8 +6987,8 @@ void qam64_qam64(short *stream0_in, 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); + simde__m128i y0r = _mm_unpacklo_epi64(xmm0, xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] + simde__m128i 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)) @@ -7550,45 +7026,45 @@ void qam64_qam64(short *stream0_in, 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); + simde__m128i y0_p_7_1 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_p_7_3 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_p_7_5 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i y0_p_7_7 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m128i y0_p_5_1 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_p_5_3 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_p_5_5 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i y0_p_5_7 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m128i y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_p_3_5 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i y0_p_3_7 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m128i y0_p_1_1 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_p_1_3 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_p_1_5 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i 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); + simde__m128i y0_m_1_1 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_m_1_3 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_m_1_5 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i y0_m_1_7 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m128i y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_m_3_5 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i y0_m_3_7 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m128i y0_m_5_1 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_m_5_3 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_m_5_5 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i y0_m_5_7 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m128i y0_m_7_1 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m128i y0_m_7_3 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m128i y0_m_7_5 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m128i 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 - + simde__m128i tmp_result, tmp_result2, tmp_result3, tmp_result4; 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, @@ -8144,197 +7620,197 @@ void qam64_qam64(short *stream0_in, // 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i 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); + simde__m128i bit_met_m7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); // Detection for 1st bit (LTE mapping) // bit = 1 @@ -8344,7 +7820,7 @@ void qam64_qam64(short *stream0_in, 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); + simde__m128i 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); @@ -8377,7 +7853,7 @@ void qam64_qam64(short *stream0_in, 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); + simde__m128i 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); @@ -8539,7 +8015,7 @@ void qam64_qam64(short *stream0_in, 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); + simde__m128i 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); @@ -8741,8 +8217,7 @@ void qam64_qam64(short *stream0_in, 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); - + simde__m128i 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 @@ -8837,7 +8312,6 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, 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; @@ -8866,18 +8340,6 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, len = (nb_rb*12) - pbch_pss_sss_adjust; } - pllr_symbol = (int8_t*)dlsch_llr; - pllr_symbol += llr_offset; - //printf("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,"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);*/ - // 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); diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c index 719295a5ef..c00040f668 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c +++ b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c @@ -35,604 +35,118 @@ #include "PHY/phy_extern_ue.h" #include "PHY/sse_intrin.h" -int16_t ones256[16] __attribute__ ((aligned(32))) = {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff}; + static const int16_t ones256[16] __attribute__((aligned(32))) = {0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff}; -static __m256i rho_rpi __attribute__ ((aligned(32))); -static __m256i rho_rmi __attribute__ ((aligned(32))); -static __m256i rho_rpi_1_1 __attribute__ ((aligned(32))); -static __m256i rho_rpi_1_3 __attribute__ ((aligned(32))); -static __m256i rho_rpi_1_5 __attribute__ ((aligned(32))); -static __m256i rho_rpi_1_7 __attribute__ ((aligned(32))); -static __m256i rho_rpi_3_1 __attribute__ ((aligned(32))); -static __m256i rho_rpi_3_3 __attribute__ ((aligned(32))); -static __m256i rho_rpi_3_5 __attribute__ ((aligned(32))); -static __m256i rho_rpi_3_7 __attribute__ ((aligned(32))); -static __m256i rho_rpi_5_1 __attribute__ ((aligned(32))); -static __m256i rho_rpi_5_3 __attribute__ ((aligned(32))); -static __m256i rho_rpi_5_5 __attribute__ ((aligned(32))); -static __m256i rho_rpi_5_7 __attribute__ ((aligned(32))); -static __m256i rho_rpi_7_1 __attribute__ ((aligned(32))); -static __m256i rho_rpi_7_3 __attribute__ ((aligned(32))); -static __m256i rho_rpi_7_5 __attribute__ ((aligned(32))); -static __m256i rho_rpi_7_7 __attribute__ ((aligned(32))); -static __m256i rho_rmi_1_1 __attribute__ ((aligned(32))); -static __m256i rho_rmi_1_3 __attribute__ ((aligned(32))); -static __m256i rho_rmi_1_5 __attribute__ ((aligned(32))); -static __m256i rho_rmi_1_7 __attribute__ ((aligned(32))); -static __m256i rho_rmi_3_1 __attribute__ ((aligned(32))); -static __m256i rho_rmi_3_3 __attribute__ ((aligned(32))); -static __m256i rho_rmi_3_5 __attribute__ ((aligned(32))); -static __m256i rho_rmi_3_7 __attribute__ ((aligned(32))); -static __m256i rho_rmi_5_1 __attribute__ ((aligned(32))); -static __m256i rho_rmi_5_3 __attribute__ ((aligned(32))); -static __m256i rho_rmi_5_5 __attribute__ ((aligned(32))); -static __m256i rho_rmi_5_7 __attribute__ ((aligned(32))); -static __m256i rho_rmi_7_1 __attribute__ ((aligned(32))); -static __m256i rho_rmi_7_3 __attribute__ ((aligned(32))); -static __m256i rho_rmi_7_5 __attribute__ ((aligned(32))); -static __m256i rho_rmi_7_7 __attribute__ ((aligned(32))); + //============================================================================================== + // Auxiliary Makros -static __m256i psi_r_m7_m7 __attribute__ ((aligned(32))); -static __m256i psi_r_m7_m5 __attribute__ ((aligned(32))); -static __m256i psi_r_m7_m3 __attribute__ ((aligned(32))); -static __m256i psi_r_m7_m1 __attribute__ ((aligned(32))); -static __m256i psi_r_m7_p1 __attribute__ ((aligned(32))); -static __m256i psi_r_m7_p3 __attribute__ ((aligned(32))); -static __m256i psi_r_m7_p5 __attribute__ ((aligned(32))); -static __m256i psi_r_m7_p7 __attribute__ ((aligned(32))); -static __m256i psi_r_m5_m7 __attribute__ ((aligned(32))); -static __m256i psi_r_m5_m5 __attribute__ ((aligned(32))); -static __m256i psi_r_m5_m3 __attribute__ ((aligned(32))); -static __m256i psi_r_m5_m1 __attribute__ ((aligned(32))); -static __m256i psi_r_m5_p1 __attribute__ ((aligned(32))); -static __m256i psi_r_m5_p3 __attribute__ ((aligned(32))); -static __m256i psi_r_m5_p5 __attribute__ ((aligned(32))); -static __m256i psi_r_m5_p7 __attribute__ ((aligned(32))); -static __m256i psi_r_m3_m7 __attribute__ ((aligned(32))); -static __m256i psi_r_m3_m5 __attribute__ ((aligned(32))); -static __m256i psi_r_m3_m3 __attribute__ ((aligned(32))); -static __m256i psi_r_m3_m1 __attribute__ ((aligned(32))); -static __m256i psi_r_m3_p1 __attribute__ ((aligned(32))); -static __m256i psi_r_m3_p3 __attribute__ ((aligned(32))); -static __m256i psi_r_m3_p5 __attribute__ ((aligned(32))); -static __m256i psi_r_m3_p7 __attribute__ ((aligned(32))); -static __m256i psi_r_m1_m7 __attribute__ ((aligned(32))); -static __m256i psi_r_m1_m5 __attribute__ ((aligned(32))); -static __m256i psi_r_m1_m3 __attribute__ ((aligned(32))); -static __m256i psi_r_m1_m1 __attribute__ ((aligned(32))); -static __m256i psi_r_m1_p1 __attribute__ ((aligned(32))); -static __m256i psi_r_m1_p3 __attribute__ ((aligned(32))); -static __m256i psi_r_m1_p5 __attribute__ ((aligned(32))); -static __m256i psi_r_m1_p7 __attribute__ ((aligned(32))); -static __m256i psi_r_p1_m7 __attribute__ ((aligned(32))); -static __m256i psi_r_p1_m5 __attribute__ ((aligned(32))); -static __m256i psi_r_p1_m3 __attribute__ ((aligned(32))); -static __m256i psi_r_p1_m1 __attribute__ ((aligned(32))); -static __m256i psi_r_p1_p1 __attribute__ ((aligned(32))); -static __m256i psi_r_p1_p3 __attribute__ ((aligned(32))); -static __m256i psi_r_p1_p5 __attribute__ ((aligned(32))); -static __m256i psi_r_p1_p7 __attribute__ ((aligned(32))); -static __m256i psi_r_p3_m7 __attribute__ ((aligned(32))); -static __m256i psi_r_p3_m5 __attribute__ ((aligned(32))); -static __m256i psi_r_p3_m3 __attribute__ ((aligned(32))); -static __m256i psi_r_p3_m1 __attribute__ ((aligned(32))); -static __m256i psi_r_p3_p1 __attribute__ ((aligned(32))); -static __m256i psi_r_p3_p3 __attribute__ ((aligned(32))); -static __m256i psi_r_p3_p5 __attribute__ ((aligned(32))); -static __m256i psi_r_p3_p7 __attribute__ ((aligned(32))); -static __m256i psi_r_p5_m7 __attribute__ ((aligned(32))); -static __m256i psi_r_p5_m5 __attribute__ ((aligned(32))); -static __m256i psi_r_p5_m3 __attribute__ ((aligned(32))); -static __m256i psi_r_p5_m1 __attribute__ ((aligned(32))); -static __m256i psi_r_p5_p1 __attribute__ ((aligned(32))); -static __m256i psi_r_p5_p3 __attribute__ ((aligned(32))); -static __m256i psi_r_p5_p5 __attribute__ ((aligned(32))); -static __m256i psi_r_p5_p7 __attribute__ ((aligned(32))); -static __m256i psi_r_p7_m7 __attribute__ ((aligned(32))); -static __m256i psi_r_p7_m5 __attribute__ ((aligned(32))); -static __m256i psi_r_p7_m3 __attribute__ ((aligned(32))); -static __m256i psi_r_p7_m1 __attribute__ ((aligned(32))); -static __m256i psi_r_p7_p1 __attribute__ ((aligned(32))); -static __m256i psi_r_p7_p3 __attribute__ ((aligned(32))); -static __m256i psi_r_p7_p5 __attribute__ ((aligned(32))); -static __m256i psi_r_p7_p7 __attribute__ ((aligned(32))); + // calculate interference magnitude +#define interference_abs_epi16(psi, int_ch_mag, int_mag, c1, c2) \ + tmp_result = simde_mm256_cmpgt_epi16(int_ch_mag, psi); \ + tmp_result2 = simde_mm256_xor_si256(tmp_result, (*(__m256i *)&ones256[0])); \ + tmp_result = simde_mm256_and_si256(tmp_result, c1); \ + tmp_result2 = simde_mm256_and_si256(tmp_result2, c2); \ + const simde__m256i int_mag = simde_mm256_or_si256(tmp_result, tmp_result2); -static __m256i psi_i_m7_m7 __attribute__ ((aligned(32))); -static __m256i psi_i_m7_m5 __attribute__ ((aligned(32))); -static __m256i psi_i_m7_m3 __attribute__ ((aligned(32))); -static __m256i psi_i_m7_m1 __attribute__ ((aligned(32))); -static __m256i psi_i_m7_p1 __attribute__ ((aligned(32))); -static __m256i psi_i_m7_p3 __attribute__ ((aligned(32))); -static __m256i psi_i_m7_p5 __attribute__ ((aligned(32))); -static __m256i psi_i_m7_p7 __attribute__ ((aligned(32))); -static __m256i psi_i_m5_m7 __attribute__ ((aligned(32))); -static __m256i psi_i_m5_m5 __attribute__ ((aligned(32))); -static __m256i psi_i_m5_m3 __attribute__ ((aligned(32))); -static __m256i psi_i_m5_m1 __attribute__ ((aligned(32))); -static __m256i psi_i_m5_p1 __attribute__ ((aligned(32))); -static __m256i psi_i_m5_p3 __attribute__ ((aligned(32))); -static __m256i psi_i_m5_p5 __attribute__ ((aligned(32))); -static __m256i psi_i_m5_p7 __attribute__ ((aligned(32))); -static __m256i psi_i_m3_m7 __attribute__ ((aligned(32))); -static __m256i psi_i_m3_m5 __attribute__ ((aligned(32))); -static __m256i psi_i_m3_m3 __attribute__ ((aligned(32))); -static __m256i psi_i_m3_m1 __attribute__ ((aligned(32))); -static __m256i psi_i_m3_p1 __attribute__ ((aligned(32))); -static __m256i psi_i_m3_p3 __attribute__ ((aligned(32))); -static __m256i psi_i_m3_p5 __attribute__ ((aligned(32))); -static __m256i psi_i_m3_p7 __attribute__ ((aligned(32))); -static __m256i psi_i_m1_m7 __attribute__ ((aligned(32))); -static __m256i psi_i_m1_m5 __attribute__ ((aligned(32))); -static __m256i psi_i_m1_m3 __attribute__ ((aligned(32))); -static __m256i psi_i_m1_m1 __attribute__ ((aligned(32))); -static __m256i psi_i_m1_p1 __attribute__ ((aligned(32))); -static __m256i psi_i_m1_p3 __attribute__ ((aligned(32))); -static __m256i psi_i_m1_p5 __attribute__ ((aligned(32))); -static __m256i psi_i_m1_p7 __attribute__ ((aligned(32))); -static __m256i psi_i_p1_m7 __attribute__ ((aligned(32))); -static __m256i psi_i_p1_m5 __attribute__ ((aligned(32))); -static __m256i psi_i_p1_m3 __attribute__ ((aligned(32))); -static __m256i psi_i_p1_m1 __attribute__ ((aligned(32))); -static __m256i psi_i_p1_p1 __attribute__ ((aligned(32))); -static __m256i psi_i_p1_p3 __attribute__ ((aligned(32))); -static __m256i psi_i_p1_p5 __attribute__ ((aligned(32))); -static __m256i psi_i_p1_p7 __attribute__ ((aligned(32))); -static __m256i psi_i_p3_m7 __attribute__ ((aligned(32))); -static __m256i psi_i_p3_m5 __attribute__ ((aligned(32))); -static __m256i psi_i_p3_m3 __attribute__ ((aligned(32))); -static __m256i psi_i_p3_m1 __attribute__ ((aligned(32))); -static __m256i psi_i_p3_p1 __attribute__ ((aligned(32))); -static __m256i psi_i_p3_p3 __attribute__ ((aligned(32))); -static __m256i psi_i_p3_p5 __attribute__ ((aligned(32))); -static __m256i psi_i_p3_p7 __attribute__ ((aligned(32))); -static __m256i psi_i_p5_m7 __attribute__ ((aligned(32))); -static __m256i psi_i_p5_m5 __attribute__ ((aligned(32))); -static __m256i psi_i_p5_m3 __attribute__ ((aligned(32))); -static __m256i psi_i_p5_m1 __attribute__ ((aligned(32))); -static __m256i psi_i_p5_p1 __attribute__ ((aligned(32))); -static __m256i psi_i_p5_p3 __attribute__ ((aligned(32))); -static __m256i psi_i_p5_p5 __attribute__ ((aligned(32))); -static __m256i psi_i_p5_p7 __attribute__ ((aligned(32))); -static __m256i psi_i_p7_m7 __attribute__ ((aligned(32))); -static __m256i psi_i_p7_m5 __attribute__ ((aligned(32))); -static __m256i psi_i_p7_m3 __attribute__ ((aligned(32))); -static __m256i psi_i_p7_m1 __attribute__ ((aligned(32))); -static __m256i psi_i_p7_p1 __attribute__ ((aligned(32))); -static __m256i psi_i_p7_p3 __attribute__ ((aligned(32))); -static __m256i psi_i_p7_p5 __attribute__ ((aligned(32))); -static __m256i psi_i_p7_p7 __attribute__ ((aligned(32))); + // 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 = simde_mm256_cmpgt_epi16(int_two_ch_mag, psi); \ + tmp_result3 = simde_mm256_xor_si256(tmp_result, (*(__m256i *)&ones256[0])); \ + tmp_result2 = simde_mm256_cmpgt_epi16(int_ch_mag, psi); \ + tmp_result = simde_mm256_xor_si256(tmp_result, tmp_result2); \ + tmp_result4 = simde_mm256_cmpgt_epi16(psi, int_three_ch_mag); \ + tmp_result3 = simde_mm256_xor_si256(tmp_result3, tmp_result4); \ + tmp_result = simde_mm256_and_si256(tmp_result, c3); \ + tmp_result2 = simde_mm256_and_si256(tmp_result2, c1); \ + tmp_result3 = simde_mm256_and_si256(tmp_result3, c5); \ + tmp_result4 = simde_mm256_and_si256(tmp_result4, c7); \ + tmp_result = simde_mm256_or_si256(tmp_result, tmp_result2); \ + tmp_result3 = simde_mm256_or_si256(tmp_result3, tmp_result4); \ + const simde__m256i a = simde_mm256_or_si256(tmp_result, tmp_result3); -static __m256i a_r_m7_m7 __attribute__ ((aligned(32))); -static __m256i a_r_m7_m5 __attribute__ ((aligned(32))); -static __m256i a_r_m7_m3 __attribute__ ((aligned(32))); -static __m256i a_r_m7_m1 __attribute__ ((aligned(32))); -static __m256i a_r_m7_p1 __attribute__ ((aligned(32))); -static __m256i a_r_m7_p3 __attribute__ ((aligned(32))); -static __m256i a_r_m7_p5 __attribute__ ((aligned(32))); -static __m256i a_r_m7_p7 __attribute__ ((aligned(32))); -static __m256i a_r_m5_m7 __attribute__ ((aligned(32))); -static __m256i a_r_m5_m5 __attribute__ ((aligned(32))); -static __m256i a_r_m5_m3 __attribute__ ((aligned(32))); -static __m256i a_r_m5_m1 __attribute__ ((aligned(32))); -static __m256i a_r_m5_p1 __attribute__ ((aligned(32))); -static __m256i a_r_m5_p3 __attribute__ ((aligned(32))); -static __m256i a_r_m5_p5 __attribute__ ((aligned(32))); -static __m256i a_r_m5_p7 __attribute__ ((aligned(32))); -static __m256i a_r_m3_m7 __attribute__ ((aligned(32))); -static __m256i a_r_m3_m5 __attribute__ ((aligned(32))); -static __m256i a_r_m3_m3 __attribute__ ((aligned(32))); -static __m256i a_r_m3_m1 __attribute__ ((aligned(32))); -static __m256i a_r_m3_p1 __attribute__ ((aligned(32))); -static __m256i a_r_m3_p3 __attribute__ ((aligned(32))); -static __m256i a_r_m3_p5 __attribute__ ((aligned(32))); -static __m256i a_r_m3_p7 __attribute__ ((aligned(32))); -static __m256i a_r_m1_m7 __attribute__ ((aligned(32))); -static __m256i a_r_m1_m5 __attribute__ ((aligned(32))); -static __m256i a_r_m1_m3 __attribute__ ((aligned(32))); -static __m256i a_r_m1_m1 __attribute__ ((aligned(32))); -static __m256i a_r_m1_p1 __attribute__ ((aligned(32))); -static __m256i a_r_m1_p3 __attribute__ ((aligned(32))); -static __m256i a_r_m1_p5 __attribute__ ((aligned(32))); -static __m256i a_r_m1_p7 __attribute__ ((aligned(32))); -static __m256i a_r_p1_m7 __attribute__ ((aligned(32))); -static __m256i a_r_p1_m5 __attribute__ ((aligned(32))); -static __m256i a_r_p1_m3 __attribute__ ((aligned(32))); -static __m256i a_r_p1_m1 __attribute__ ((aligned(32))); -static __m256i a_r_p1_p1 __attribute__ ((aligned(32))); -static __m256i a_r_p1_p3 __attribute__ ((aligned(32))); -static __m256i a_r_p1_p5 __attribute__ ((aligned(32))); -static __m256i a_r_p1_p7 __attribute__ ((aligned(32))); -static __m256i a_r_p3_m7 __attribute__ ((aligned(32))); -static __m256i a_r_p3_m5 __attribute__ ((aligned(32))); -static __m256i a_r_p3_m3 __attribute__ ((aligned(32))); -static __m256i a_r_p3_m1 __attribute__ ((aligned(32))); -static __m256i a_r_p3_p1 __attribute__ ((aligned(32))); -static __m256i a_r_p3_p3 __attribute__ ((aligned(32))); -static __m256i a_r_p3_p5 __attribute__ ((aligned(32))); -static __m256i a_r_p3_p7 __attribute__ ((aligned(32))); -static __m256i a_r_p5_m7 __attribute__ ((aligned(32))); -static __m256i a_r_p5_m5 __attribute__ ((aligned(32))); -static __m256i a_r_p5_m3 __attribute__ ((aligned(32))); -static __m256i a_r_p5_m1 __attribute__ ((aligned(32))); -static __m256i a_r_p5_p1 __attribute__ ((aligned(32))); -static __m256i a_r_p5_p3 __attribute__ ((aligned(32))); -static __m256i a_r_p5_p5 __attribute__ ((aligned(32))); -static __m256i a_r_p5_p7 __attribute__ ((aligned(32))); -static __m256i a_r_p7_m7 __attribute__ ((aligned(32))); -static __m256i a_r_p7_m5 __attribute__ ((aligned(32))); -static __m256i a_r_p7_m3 __attribute__ ((aligned(32))); -static __m256i a_r_p7_m1 __attribute__ ((aligned(32))); -static __m256i a_r_p7_p1 __attribute__ ((aligned(32))); -static __m256i a_r_p7_p3 __attribute__ ((aligned(32))); -static __m256i a_r_p7_p5 __attribute__ ((aligned(32))); -static __m256i a_r_p7_p7 __attribute__ ((aligned(32))); + // calculates psi_a = psi_r*a_r + psi_i*a_i +#define prodsum_psi_a_epi16(psi_r, a_r, psi_i, a_i, psi_a) \ + tmp_result = simde_mm256_mulhi_epi16(psi_r, a_r); \ + tmp_result = simde_mm256_slli_epi16(tmp_result, 1); \ + tmp_result2 = simde_mm256_mulhi_epi16(psi_i, a_i); \ + tmp_result2 = simde_mm256_slli_epi16(tmp_result2, 1); \ + simde__m256i psi_a = simde_mm256_adds_epi16(tmp_result, tmp_result2); -static __m256i a_i_m7_m7 __attribute__ ((aligned(32))); -static __m256i a_i_m7_m5 __attribute__ ((aligned(32))); -static __m256i a_i_m7_m3 __attribute__ ((aligned(32))); -static __m256i a_i_m7_m1 __attribute__ ((aligned(32))); -static __m256i a_i_m7_p1 __attribute__ ((aligned(32))); -static __m256i a_i_m7_p3 __attribute__ ((aligned(32))); -static __m256i a_i_m7_p5 __attribute__ ((aligned(32))); -static __m256i a_i_m7_p7 __attribute__ ((aligned(32))); -static __m256i a_i_m5_m7 __attribute__ ((aligned(32))); -static __m256i a_i_m5_m5 __attribute__ ((aligned(32))); -static __m256i a_i_m5_m3 __attribute__ ((aligned(32))); -static __m256i a_i_m5_m1 __attribute__ ((aligned(32))); -static __m256i a_i_m5_p1 __attribute__ ((aligned(32))); -static __m256i a_i_m5_p3 __attribute__ ((aligned(32))); -static __m256i a_i_m5_p5 __attribute__ ((aligned(32))); -static __m256i a_i_m5_p7 __attribute__ ((aligned(32))); -static __m256i a_i_m3_m7 __attribute__ ((aligned(32))); -static __m256i a_i_m3_m5 __attribute__ ((aligned(32))); -static __m256i a_i_m3_m3 __attribute__ ((aligned(32))); -static __m256i a_i_m3_m1 __attribute__ ((aligned(32))); -static __m256i a_i_m3_p1 __attribute__ ((aligned(32))); -static __m256i a_i_m3_p3 __attribute__ ((aligned(32))); -static __m256i a_i_m3_p5 __attribute__ ((aligned(32))); -static __m256i a_i_m3_p7 __attribute__ ((aligned(32))); -static __m256i a_i_m1_m7 __attribute__ ((aligned(32))); -static __m256i a_i_m1_m5 __attribute__ ((aligned(32))); -static __m256i a_i_m1_m3 __attribute__ ((aligned(32))); -static __m256i a_i_m1_m1 __attribute__ ((aligned(32))); -static __m256i a_i_m1_p1 __attribute__ ((aligned(32))); -static __m256i a_i_m1_p3 __attribute__ ((aligned(32))); -static __m256i a_i_m1_p5 __attribute__ ((aligned(32))); -static __m256i a_i_m1_p7 __attribute__ ((aligned(32))); -static __m256i a_i_p1_m7 __attribute__ ((aligned(32))); -static __m256i a_i_p1_m5 __attribute__ ((aligned(32))); -static __m256i a_i_p1_m3 __attribute__ ((aligned(32))); -static __m256i a_i_p1_m1 __attribute__ ((aligned(32))); -static __m256i a_i_p1_p1 __attribute__ ((aligned(32))); -static __m256i a_i_p1_p3 __attribute__ ((aligned(32))); -static __m256i a_i_p1_p5 __attribute__ ((aligned(32))); -static __m256i a_i_p1_p7 __attribute__ ((aligned(32))); -static __m256i a_i_p3_m7 __attribute__ ((aligned(32))); -static __m256i a_i_p3_m5 __attribute__ ((aligned(32))); -static __m256i a_i_p3_m3 __attribute__ ((aligned(32))); -static __m256i a_i_p3_m1 __attribute__ ((aligned(32))); -static __m256i a_i_p3_p1 __attribute__ ((aligned(32))); -static __m256i a_i_p3_p3 __attribute__ ((aligned(32))); -static __m256i a_i_p3_p5 __attribute__ ((aligned(32))); -static __m256i a_i_p3_p7 __attribute__ ((aligned(32))); -static __m256i a_i_p5_m7 __attribute__ ((aligned(32))); -static __m256i a_i_p5_m5 __attribute__ ((aligned(32))); -static __m256i a_i_p5_m3 __attribute__ ((aligned(32))); -static __m256i a_i_p5_m1 __attribute__ ((aligned(32))); -static __m256i a_i_p5_p1 __attribute__ ((aligned(32))); -static __m256i a_i_p5_p3 __attribute__ ((aligned(32))); -static __m256i a_i_p5_p5 __attribute__ ((aligned(32))); -static __m256i a_i_p5_p7 __attribute__ ((aligned(32))); -static __m256i a_i_p7_m7 __attribute__ ((aligned(32))); -static __m256i a_i_p7_m5 __attribute__ ((aligned(32))); -static __m256i a_i_p7_m3 __attribute__ ((aligned(32))); -static __m256i a_i_p7_m1 __attribute__ ((aligned(32))); -static __m256i a_i_p7_p1 __attribute__ ((aligned(32))); -static __m256i a_i_p7_p3 __attribute__ ((aligned(32))); -static __m256i a_i_p7_p5 __attribute__ ((aligned(32))); -static __m256i a_i_p7_p7 __attribute__ ((aligned(32))); + // calculates a_sq = int_ch_mag*(a_r^2 + a_i^2)*scale_factor +#define square_a_epi16(a_r, a_i, int_ch_mag, scale_factor, a_sq) \ + tmp_result = simde_mm256_mulhi_epi16(a_r, a_r); \ + tmp_result = simde_mm256_slli_epi16(tmp_result, 1); \ + tmp_result = simde_mm256_mulhi_epi16(tmp_result, scale_factor); \ + tmp_result = simde_mm256_slli_epi16(tmp_result, 1); \ + tmp_result = simde_mm256_mulhi_epi16(tmp_result, int_ch_mag); \ + tmp_result = simde_mm256_slli_epi16(tmp_result, 1); \ + tmp_result2 = simde_mm256_mulhi_epi16(a_i, a_i); \ + tmp_result2 = simde_mm256_slli_epi16(tmp_result2, 1); \ + tmp_result2 = simde_mm256_mulhi_epi16(tmp_result2, scale_factor); \ + tmp_result2 = simde_mm256_slli_epi16(tmp_result2, 1); \ + tmp_result2 = simde_mm256_mulhi_epi16(tmp_result2, int_ch_mag); \ + tmp_result2 = simde_mm256_slli_epi16(tmp_result2, 1); \ + const simde__m256i a_sq = simde_mm256_adds_epi16(tmp_result, tmp_result2); -static __m256i psi_a_m7_m7 __attribute__ ((aligned(32))); -static __m256i psi_a_m7_m5 __attribute__ ((aligned(32))); -static __m256i psi_a_m7_m3 __attribute__ ((aligned(32))); -static __m256i psi_a_m7_m1 __attribute__ ((aligned(32))); -static __m256i psi_a_m7_p1 __attribute__ ((aligned(32))); -static __m256i psi_a_m7_p3 __attribute__ ((aligned(32))); -static __m256i psi_a_m7_p5 __attribute__ ((aligned(32))); -static __m256i psi_a_m7_p7 __attribute__ ((aligned(32))); -static __m256i psi_a_m5_m7 __attribute__ ((aligned(32))); -static __m256i psi_a_m5_m5 __attribute__ ((aligned(32))); -static __m256i psi_a_m5_m3 __attribute__ ((aligned(32))); -static __m256i psi_a_m5_m1 __attribute__ ((aligned(32))); -static __m256i psi_a_m5_p1 __attribute__ ((aligned(32))); -static __m256i psi_a_m5_p3 __attribute__ ((aligned(32))); -static __m256i psi_a_m5_p5 __attribute__ ((aligned(32))); -static __m256i psi_a_m5_p7 __attribute__ ((aligned(32))); -static __m256i psi_a_m3_m7 __attribute__ ((aligned(32))); -static __m256i psi_a_m3_m5 __attribute__ ((aligned(32))); -static __m256i psi_a_m3_m3 __attribute__ ((aligned(32))); -static __m256i psi_a_m3_m1 __attribute__ ((aligned(32))); -static __m256i psi_a_m3_p1 __attribute__ ((aligned(32))); -static __m256i psi_a_m3_p3 __attribute__ ((aligned(32))); -static __m256i psi_a_m3_p5 __attribute__ ((aligned(32))); -static __m256i psi_a_m3_p7 __attribute__ ((aligned(32))); -static __m256i psi_a_m1_m7 __attribute__ ((aligned(32))); -static __m256i psi_a_m1_m5 __attribute__ ((aligned(32))); -static __m256i psi_a_m1_m3 __attribute__ ((aligned(32))); -static __m256i psi_a_m1_m1 __attribute__ ((aligned(32))); -static __m256i psi_a_m1_p1 __attribute__ ((aligned(32))); -static __m256i psi_a_m1_p3 __attribute__ ((aligned(32))); -static __m256i psi_a_m1_p5 __attribute__ ((aligned(32))); -static __m256i psi_a_m1_p7 __attribute__ ((aligned(32))); -static __m256i psi_a_p1_m7 __attribute__ ((aligned(32))); -static __m256i psi_a_p1_m5 __attribute__ ((aligned(32))); -static __m256i psi_a_p1_m3 __attribute__ ((aligned(32))); -static __m256i psi_a_p1_m1 __attribute__ ((aligned(32))); -static __m256i psi_a_p1_p1 __attribute__ ((aligned(32))); -static __m256i psi_a_p1_p3 __attribute__ ((aligned(32))); -static __m256i psi_a_p1_p5 __attribute__ ((aligned(32))); -static __m256i psi_a_p1_p7 __attribute__ ((aligned(32))); -static __m256i psi_a_p3_m7 __attribute__ ((aligned(32))); -static __m256i psi_a_p3_m5 __attribute__ ((aligned(32))); -static __m256i psi_a_p3_m3 __attribute__ ((aligned(32))); -static __m256i psi_a_p3_m1 __attribute__ ((aligned(32))); -static __m256i psi_a_p3_p1 __attribute__ ((aligned(32))); -static __m256i psi_a_p3_p3 __attribute__ ((aligned(32))); -static __m256i psi_a_p3_p5 __attribute__ ((aligned(32))); -static __m256i psi_a_p3_p7 __attribute__ ((aligned(32))); -static __m256i psi_a_p5_m7 __attribute__ ((aligned(32))); -static __m256i psi_a_p5_m5 __attribute__ ((aligned(32))); -static __m256i psi_a_p5_m3 __attribute__ ((aligned(32))); -static __m256i psi_a_p5_m1 __attribute__ ((aligned(32))); -static __m256i psi_a_p5_p1 __attribute__ ((aligned(32))); -static __m256i psi_a_p5_p3 __attribute__ ((aligned(32))); -static __m256i psi_a_p5_p5 __attribute__ ((aligned(32))); -static __m256i psi_a_p5_p7 __attribute__ ((aligned(32))); -static __m256i psi_a_p7_m7 __attribute__ ((aligned(32))); -static __m256i psi_a_p7_m5 __attribute__ ((aligned(32))); -static __m256i psi_a_p7_m3 __attribute__ ((aligned(32))); -static __m256i psi_a_p7_m1 __attribute__ ((aligned(32))); -static __m256i psi_a_p7_p1 __attribute__ ((aligned(32))); -static __m256i psi_a_p7_p3 __attribute__ ((aligned(32))); -static __m256i psi_a_p7_p5 __attribute__ ((aligned(32))); -static __m256i psi_a_p7_p7 __attribute__ ((aligned(32))); + // 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 = simde_mm256_mulhi_epi16(a_r, a_r); \ + tmp_result = simde_mm256_slli_epi16(tmp_result, 1); \ + tmp_result = simde_mm256_mulhi_epi16(tmp_result, scale_factor); \ + tmp_result = simde_mm256_slli_epi16(tmp_result, 3); \ + tmp_result = simde_mm256_mulhi_epi16(tmp_result, int_ch_mag); \ + tmp_result = simde_mm256_slli_epi16(tmp_result, 1); \ + tmp_result2 = simde_mm256_mulhi_epi16(a_i, a_i); \ + tmp_result2 = simde_mm256_slli_epi16(tmp_result2, 1); \ + tmp_result2 = simde_mm256_mulhi_epi16(tmp_result2, scale_factor); \ + tmp_result2 = simde_mm256_slli_epi16(tmp_result2, 3); \ + tmp_result2 = simde_mm256_mulhi_epi16(tmp_result2, int_ch_mag); \ + tmp_result2 = simde_mm256_slli_epi16(tmp_result2, 1); \ + const simde__m256i a_sq = simde_mm256_adds_epi16(tmp_result, tmp_result2); -static __m256i a_sq_m7_m7 __attribute__ ((aligned(32))); -static __m256i a_sq_m7_m5 __attribute__ ((aligned(32))); -static __m256i a_sq_m7_m3 __attribute__ ((aligned(32))); -static __m256i a_sq_m7_m1 __attribute__ ((aligned(32))); -static __m256i a_sq_m7_p1 __attribute__ ((aligned(32))); -static __m256i a_sq_m7_p3 __attribute__ ((aligned(32))); -static __m256i a_sq_m7_p5 __attribute__ ((aligned(32))); -static __m256i a_sq_m7_p7 __attribute__ ((aligned(32))); -static __m256i a_sq_m5_m7 __attribute__ ((aligned(32))); -static __m256i a_sq_m5_m5 __attribute__ ((aligned(32))); -static __m256i a_sq_m5_m3 __attribute__ ((aligned(32))); -static __m256i a_sq_m5_m1 __attribute__ ((aligned(32))); -static __m256i a_sq_m5_p1 __attribute__ ((aligned(32))); -static __m256i a_sq_m5_p3 __attribute__ ((aligned(32))); -static __m256i a_sq_m5_p5 __attribute__ ((aligned(32))); -static __m256i a_sq_m5_p7 __attribute__ ((aligned(32))); -static __m256i a_sq_m3_m7 __attribute__ ((aligned(32))); -static __m256i a_sq_m3_m5 __attribute__ ((aligned(32))); -static __m256i a_sq_m3_m3 __attribute__ ((aligned(32))); -static __m256i a_sq_m3_m1 __attribute__ ((aligned(32))); -static __m256i a_sq_m3_p1 __attribute__ ((aligned(32))); -static __m256i a_sq_m3_p3 __attribute__ ((aligned(32))); -static __m256i a_sq_m3_p5 __attribute__ ((aligned(32))); -static __m256i a_sq_m3_p7 __attribute__ ((aligned(32))); -static __m256i a_sq_m1_m7 __attribute__ ((aligned(32))); -static __m256i a_sq_m1_m5 __attribute__ ((aligned(32))); -static __m256i a_sq_m1_m3 __attribute__ ((aligned(32))); -static __m256i a_sq_m1_m1 __attribute__ ((aligned(32))); -static __m256i a_sq_m1_p1 __attribute__ ((aligned(32))); -static __m256i a_sq_m1_p3 __attribute__ ((aligned(32))); -static __m256i a_sq_m1_p5 __attribute__ ((aligned(32))); -static __m256i a_sq_m1_p7 __attribute__ ((aligned(32))); -static __m256i a_sq_p1_m7 __attribute__ ((aligned(32))); -static __m256i a_sq_p1_m5 __attribute__ ((aligned(32))); -static __m256i a_sq_p1_m3 __attribute__ ((aligned(32))); -static __m256i a_sq_p1_m1 __attribute__ ((aligned(32))); -static __m256i a_sq_p1_p1 __attribute__ ((aligned(32))); -static __m256i a_sq_p1_p3 __attribute__ ((aligned(32))); -static __m256i a_sq_p1_p5 __attribute__ ((aligned(32))); -static __m256i a_sq_p1_p7 __attribute__ ((aligned(32))); -static __m256i a_sq_p3_m7 __attribute__ ((aligned(32))); -static __m256i a_sq_p3_m5 __attribute__ ((aligned(32))); -static __m256i a_sq_p3_m3 __attribute__ ((aligned(32))); -static __m256i a_sq_p3_m1 __attribute__ ((aligned(32))); -static __m256i a_sq_p3_p1 __attribute__ ((aligned(32))); -static __m256i a_sq_p3_p3 __attribute__ ((aligned(32))); -static __m256i a_sq_p3_p5 __attribute__ ((aligned(32))); -static __m256i a_sq_p3_p7 __attribute__ ((aligned(32))); -static __m256i a_sq_p5_m7 __attribute__ ((aligned(32))); -static __m256i a_sq_p5_m5 __attribute__ ((aligned(32))); -static __m256i a_sq_p5_m3 __attribute__ ((aligned(32))); -static __m256i a_sq_p5_m1 __attribute__ ((aligned(32))); -static __m256i a_sq_p5_p1 __attribute__ ((aligned(32))); -static __m256i a_sq_p5_p3 __attribute__ ((aligned(32))); -static __m256i a_sq_p5_p5 __attribute__ ((aligned(32))); -static __m256i a_sq_p5_p7 __attribute__ ((aligned(32))); -static __m256i a_sq_p7_m7 __attribute__ ((aligned(32))); -static __m256i a_sq_p7_m5 __attribute__ ((aligned(32))); -static __m256i a_sq_p7_m3 __attribute__ ((aligned(32))); -static __m256i a_sq_p7_m1 __attribute__ ((aligned(32))); -static __m256i a_sq_p7_p1 __attribute__ ((aligned(32))); -static __m256i a_sq_p7_p3 __attribute__ ((aligned(32))); -static __m256i a_sq_p7_p5 __attribute__ ((aligned(32))); -static __m256i a_sq_p7_p7 __attribute__ ((aligned(32))); + void seperate_real_imag_parts(__m256i *out_re, __m256i *out_im, __m256i in0, __m256i in1) + { + __m256i tmp0; + __m256i tmp1; -static __m256i bit_met_m7_m7 __attribute__ ((aligned(32))); -static __m256i bit_met_m7_m5 __attribute__ ((aligned(32))); -static __m256i bit_met_m7_m3 __attribute__ ((aligned(32))); -static __m256i bit_met_m7_m1 __attribute__ ((aligned(32))); -static __m256i bit_met_m7_p1 __attribute__ ((aligned(32))); -static __m256i bit_met_m7_p3 __attribute__ ((aligned(32))); -static __m256i bit_met_m7_p5 __attribute__ ((aligned(32))); -static __m256i bit_met_m7_p7 __attribute__ ((aligned(32))); -static __m256i bit_met_m5_m7 __attribute__ ((aligned(32))); -static __m256i bit_met_m5_m5 __attribute__ ((aligned(32))); -static __m256i bit_met_m5_m3 __attribute__ ((aligned(32))); -static __m256i bit_met_m5_m1 __attribute__ ((aligned(32))); -static __m256i bit_met_m5_p1 __attribute__ ((aligned(32))); -static __m256i bit_met_m5_p3 __attribute__ ((aligned(32))); -static __m256i bit_met_m5_p5 __attribute__ ((aligned(32))); -static __m256i bit_met_m5_p7 __attribute__ ((aligned(32))); -static __m256i bit_met_m3_m7 __attribute__ ((aligned(32))); -static __m256i bit_met_m3_m5 __attribute__ ((aligned(32))); -static __m256i bit_met_m3_m3 __attribute__ ((aligned(32))); -static __m256i bit_met_m3_m1 __attribute__ ((aligned(32))); -static __m256i bit_met_m3_p1 __attribute__ ((aligned(32))); -static __m256i bit_met_m3_p3 __attribute__ ((aligned(32))); -static __m256i bit_met_m3_p5 __attribute__ ((aligned(32))); -static __m256i bit_met_m3_p7 __attribute__ ((aligned(32))); -static __m256i bit_met_m1_m7 __attribute__ ((aligned(32))); -static __m256i bit_met_m1_m5 __attribute__ ((aligned(32))); -static __m256i bit_met_m1_m3 __attribute__ ((aligned(32))); -static __m256i bit_met_m1_m1 __attribute__ ((aligned(32))); -static __m256i bit_met_m1_p1 __attribute__ ((aligned(32))); -static __m256i bit_met_m1_p3 __attribute__ ((aligned(32))); -static __m256i bit_met_m1_p5 __attribute__ ((aligned(32))); -static __m256i bit_met_m1_p7 __attribute__ ((aligned(32))); -static __m256i bit_met_p1_m7 __attribute__ ((aligned(32))); -static __m256i bit_met_p1_m5 __attribute__ ((aligned(32))); -static __m256i bit_met_p1_m3 __attribute__ ((aligned(32))); -static __m256i bit_met_p1_m1 __attribute__ ((aligned(32))); -static __m256i bit_met_p1_p1 __attribute__ ((aligned(32))); -static __m256i bit_met_p1_p3 __attribute__ ((aligned(32))); -static __m256i bit_met_p1_p5 __attribute__ ((aligned(32))); -static __m256i bit_met_p1_p7 __attribute__ ((aligned(32))); -static __m256i bit_met_p3_m7 __attribute__ ((aligned(32))); -static __m256i bit_met_p3_m5 __attribute__ ((aligned(32))); -static __m256i bit_met_p3_m3 __attribute__ ((aligned(32))); -static __m256i bit_met_p3_m1 __attribute__ ((aligned(32))); -static __m256i bit_met_p3_p1 __attribute__ ((aligned(32))); -static __m256i bit_met_p3_p3 __attribute__ ((aligned(32))); -static __m256i bit_met_p3_p5 __attribute__ ((aligned(32))); -static __m256i bit_met_p3_p7 __attribute__ ((aligned(32))); -static __m256i bit_met_p5_m7 __attribute__ ((aligned(32))); -static __m256i bit_met_p5_m5 __attribute__ ((aligned(32))); -static __m256i bit_met_p5_m3 __attribute__ ((aligned(32))); -static __m256i bit_met_p5_m1 __attribute__ ((aligned(32))); -static __m256i bit_met_p5_p1 __attribute__ ((aligned(32))); -static __m256i bit_met_p5_p3 __attribute__ ((aligned(32))); -static __m256i bit_met_p5_p5 __attribute__ ((aligned(32))); -static __m256i bit_met_p5_p7 __attribute__ ((aligned(32))); -static __m256i bit_met_p7_m7 __attribute__ ((aligned(32))); -static __m256i bit_met_p7_m5 __attribute__ ((aligned(32))); -static __m256i bit_met_p7_m3 __attribute__ ((aligned(32))); -static __m256i bit_met_p7_m1 __attribute__ ((aligned(32))); -static __m256i bit_met_p7_p1 __attribute__ ((aligned(32))); -static __m256i bit_met_p7_p3 __attribute__ ((aligned(32))); -static __m256i bit_met_p7_p5 __attribute__ ((aligned(32))); -static __m256i bit_met_p7_p7 __attribute__ ((aligned(32))); + in0 = simde_mm256_shufflelo_epi16(in0, 0xd8); //_MM_SHUFFLE(0,2,1,3)); + in0 = simde_mm256_shufflehi_epi16(in0, 0xd8); //_MM_SHUFFLE(0,2,1,3)); + in0 = simde_mm256_shuffle_epi32(in0, 0xd8); //_MM_SHUFFLE(0,2,1,3)); -static __m256i y0_p_1_1 __attribute__ ((aligned(32))); -static __m256i y0_p_1_3 __attribute__ ((aligned(32))); -static __m256i y0_p_1_5 __attribute__ ((aligned(32))); -static __m256i y0_p_1_7 __attribute__ ((aligned(32))); -static __m256i y0_p_3_1 __attribute__ ((aligned(32))); -static __m256i y0_p_3_3 __attribute__ ((aligned(32))); -static __m256i y0_p_3_5 __attribute__ ((aligned(32))); -static __m256i y0_p_3_7 __attribute__ ((aligned(32))); -static __m256i y0_p_5_1 __attribute__ ((aligned(32))); -static __m256i y0_p_5_3 __attribute__ ((aligned(32))); -static __m256i y0_p_5_5 __attribute__ ((aligned(32))); -static __m256i y0_p_5_7 __attribute__ ((aligned(32))); -static __m256i y0_p_7_1 __attribute__ ((aligned(32))); -static __m256i y0_p_7_3 __attribute__ ((aligned(32))); -static __m256i y0_p_7_5 __attribute__ ((aligned(32))); -static __m256i y0_p_7_7 __attribute__ ((aligned(32))); -static __m256i y0_m_1_1 __attribute__ ((aligned(32))); -static __m256i y0_m_1_3 __attribute__ ((aligned(32))); -static __m256i y0_m_1_5 __attribute__ ((aligned(32))); -static __m256i y0_m_1_7 __attribute__ ((aligned(32))); -static __m256i y0_m_3_1 __attribute__ ((aligned(32))); -static __m256i y0_m_3_3 __attribute__ ((aligned(32))); -static __m256i y0_m_3_5 __attribute__ ((aligned(32))); -static __m256i y0_m_3_7 __attribute__ ((aligned(32))); -static __m256i y0_m_5_1 __attribute__ ((aligned(32))); -static __m256i y0_m_5_3 __attribute__ ((aligned(32))); -static __m256i y0_m_5_5 __attribute__ ((aligned(32))); -static __m256i y0_m_5_7 __attribute__ ((aligned(32))); -static __m256i y0_m_7_1 __attribute__ ((aligned(32))); -static __m256i y0_m_7_3 __attribute__ ((aligned(32))); -static __m256i y0_m_7_5 __attribute__ ((aligned(32))); -static __m256i y0_m_7_7 __attribute__ ((aligned(32))); + in1 = simde_mm256_shufflelo_epi16(in1, 0xd8); //_MM_SHUFFLE(0,2,1,3)); + in1 = simde_mm256_shufflehi_epi16(in1, 0xd8); //_MM_SHUFFLE(0,2,1,3)); + in1 = simde_mm256_shuffle_epi32(in1, 0xd8); //_MM_SHUFFLE(0,2,1,3)); -static __m256i xmm0 __attribute__ ((aligned(32))); -static __m256i xmm1 __attribute__ ((aligned(32))); -static __m256i xmm2 __attribute__ ((aligned(32))); -static __m256i xmm3 __attribute__ ((aligned(32))); -static __m256i xmm4 __attribute__ ((aligned(32))); -static __m256i xmm5 __attribute__ ((aligned(32))); -static __m256i xmm6 __attribute__ ((aligned(32))); -static __m256i xmm7 __attribute__ ((aligned(32))); -static __m256i xmm8 __attribute__ ((aligned(32))); + // in0 = [Re(0,1,2,3) Im(0,1,2,3) Re(4,5,6,7) Im(4,5,6,7)] + // in0 = [Re(8,9,10,11) Im(8,9,10,11) Re(12,13,14,15) Im(12,13,14,15)] -static __m256i y0r __attribute__ ((aligned(32))); -static __m256i y0i __attribute__ ((aligned(32))); -static __m256i y1r __attribute__ ((aligned(32))); -static __m256i y1i __attribute__ ((aligned(32))); -static __m256i y2r __attribute__ ((aligned(32))); -static __m256i y2i __attribute__ ((aligned(32))); + tmp0 = simde_mm256_unpacklo_epi64(in0, in1); + // axmm2 = [Re(0,1,2,3) Re(8,9,10,11) Re(4,5,6,7) Re(12,13,14,15)] + tmp0 = simde_mm256_permute4x64_epi64(tmp0, 0xd8); // Re(rho) -static __m256i logmax_num_re0 __attribute__ ((aligned(32))); -static __m256i logmax_den_re0 __attribute__ ((aligned(32))); + tmp1 = simde_mm256_unpackhi_epi64(in0, in1); + // axmm3 = [Im(0,1,2,3) Im(8,9,10,11) Im(4,5,6,7) Im(12,13,14,15)] + tmp1 = simde_mm256_permute4x64_epi64(tmp1, 0xd8); // Im(rho) -static __m256i tmp_result __attribute__ ((aligned(32))); -static __m256i tmp_result2 __attribute__ ((aligned(32))); -static __m256i tmp_result3 __attribute__ ((aligned(32))); -static __m256i tmp_result4 __attribute__ ((aligned(32))); - -//============================================================================================== -// Auxiliary Makros - -// calculate interference magnitude -#define interference_abs_epi16(psi,int_ch_mag,int_mag,c1,c2) tmp_result = simde_mm256_cmpgt_epi16(int_ch_mag,psi); tmp_result2 = simde_mm256_xor_si256(tmp_result,(*(__m256i*)&ones256[0])); tmp_result = simde_mm256_and_si256(tmp_result,c1); tmp_result2 = simde_mm256_and_si256(tmp_result2,c2); int_mag = simde_mm256_or_si256(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 = simde_mm256_cmpgt_epi16(int_two_ch_mag,psi); tmp_result3 = simde_mm256_xor_si256(tmp_result,(*(__m256i*)&ones256[0])); tmp_result2 = simde_mm256_cmpgt_epi16(int_ch_mag,psi); tmp_result = simde_mm256_xor_si256(tmp_result,tmp_result2); tmp_result4 = simde_mm256_cmpgt_epi16(psi,int_three_ch_mag); tmp_result3 = simde_mm256_xor_si256(tmp_result3,tmp_result4); tmp_result = simde_mm256_and_si256(tmp_result,c3); tmp_result2 = simde_mm256_and_si256(tmp_result2,c1); tmp_result3 = simde_mm256_and_si256(tmp_result3,c5); tmp_result4 = simde_mm256_and_si256(tmp_result4,c7); tmp_result = simde_mm256_or_si256(tmp_result,tmp_result2); tmp_result3 = simde_mm256_or_si256(tmp_result3,tmp_result4); a = simde_mm256_or_si256(tmp_result,tmp_result3); - -// calculates psi_a = psi_r*a_r + psi_i*a_i -#define prodsum_psi_a_epi16(psi_r,a_r,psi_i,a_i,psi_a) tmp_result = simde_mm256_mulhi_epi16(psi_r,a_r); tmp_result = simde_mm256_slli_epi16(tmp_result,1); tmp_result2 = simde_mm256_mulhi_epi16(psi_i,a_i); tmp_result2 = simde_mm256_slli_epi16(tmp_result2,1); psi_a = simde_mm256_adds_epi16(tmp_result,tmp_result2); - -// calculates a_sq = int_ch_mag*(a_r^2 + a_i^2)*scale_factor -#define square_a_epi16(a_r,a_i,int_ch_mag,scale_factor,a_sq) tmp_result = simde_mm256_mulhi_epi16(a_r,a_r); tmp_result = simde_mm256_slli_epi16(tmp_result,1); tmp_result = simde_mm256_mulhi_epi16(tmp_result,scale_factor); tmp_result = simde_mm256_slli_epi16(tmp_result,1); tmp_result = simde_mm256_mulhi_epi16(tmp_result,int_ch_mag); tmp_result = simde_mm256_slli_epi16(tmp_result,1); tmp_result2 = simde_mm256_mulhi_epi16(a_i,a_i); tmp_result2 = simde_mm256_slli_epi16(tmp_result2,1); tmp_result2 = simde_mm256_mulhi_epi16(tmp_result2,scale_factor); tmp_result2 = simde_mm256_slli_epi16(tmp_result2,1); tmp_result2 = simde_mm256_mulhi_epi16(tmp_result2,int_ch_mag); tmp_result2 = simde_mm256_slli_epi16(tmp_result2,1); a_sq = simde_mm256_adds_epi16(tmp_result,tmp_result2); - -// calculates a_sq = int_ch_mag*(a_r^2 + a_i^2)*scale_factor for 64-QAM -#define square_a_64qam_epi16(a_r,a_i,int_ch_mag,scale_factor,a_sq) tmp_result = simde_mm256_mulhi_epi16(a_r,a_r); tmp_result = simde_mm256_slli_epi16(tmp_result,1); tmp_result = simde_mm256_mulhi_epi16(tmp_result,scale_factor); tmp_result = simde_mm256_slli_epi16(tmp_result,3); tmp_result = simde_mm256_mulhi_epi16(tmp_result,int_ch_mag); tmp_result = simde_mm256_slli_epi16(tmp_result,1); tmp_result2 = simde_mm256_mulhi_epi16(a_i,a_i); tmp_result2 = simde_mm256_slli_epi16(tmp_result2,1); tmp_result2 = simde_mm256_mulhi_epi16(tmp_result2,scale_factor); tmp_result2 = simde_mm256_slli_epi16(tmp_result2,3); tmp_result2 = simde_mm256_mulhi_epi16(tmp_result2,int_ch_mag); tmp_result2 = simde_mm256_slli_epi16(tmp_result2,1); a_sq = simde_mm256_adds_epi16(tmp_result,tmp_result2); - -void seperate_real_imag_parts(__m256i *out_re, - __m256i *out_im, - __m256i in0, - __m256i in1) -{ - __m256i tmp0; - __m256i tmp1; - - in0 = simde_mm256_shufflelo_epi16(in0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - in0 = simde_mm256_shufflehi_epi16(in0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - in0 = simde_mm256_shuffle_epi32(in0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - - in1 = simde_mm256_shufflelo_epi16(in1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - in1 = simde_mm256_shufflehi_epi16(in1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - in1 = simde_mm256_shuffle_epi32(in1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - - //in0 = [Re(0,1,2,3) Im(0,1,2,3) Re(4,5,6,7) Im(4,5,6,7)] - //in0 = [Re(8,9,10,11) Im(8,9,10,11) Re(12,13,14,15) Im(12,13,14,15)] - - tmp0 = simde_mm256_unpacklo_epi64(in0, in1); - //axmm2 = [Re(0,1,2,3) Re(8,9,10,11) Re(4,5,6,7) Re(12,13,14,15)] - tmp0 = simde_mm256_permute4x64_epi64(tmp0,0xd8); // Re(rho) - - tmp1 = simde_mm256_unpackhi_epi64(in0, in1); - //axmm3 = [Im(0,1,2,3) Im(8,9,10,11) Im(4,5,6,7) Im(12,13,14,15)] - tmp1 = simde_mm256_permute4x64_epi64(tmp1,0xd8); // Im(rho) - - *out_re = tmp0; - *out_im = tmp1; + *out_re = tmp0; + *out_im = tmp1; } void qam64_qam16_avx2(short *stream0_in, @@ -730,20 +244,21 @@ void qam64_qam16_avx2(short *stream0_in, xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho) xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho) */ + simde__m256i xmm0, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8; seperate_real_imag_parts(&xmm2, &xmm3, rho01_256i[i], rho01_256i[i+1]); - rho_rpi = simde_mm256_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho) - rho_rmi = simde_mm256_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho) + const simde__m256i rho_rpi = simde_mm256_adds_epi16(xmm2, xmm3); // rho = Re(rho) + Im(rho) + const simde__m256i rho_rmi = simde_mm256_subs_epi16(xmm2, xmm3); // rho* = Re(rho) - Im(rho) // Compute the different rhos - rho_rpi_1_1 = simde_mm256_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42); - rho_rmi_1_1 = simde_mm256_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42); - rho_rpi_3_3 = simde_mm256_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42); - rho_rmi_3_3 = simde_mm256_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42); - rho_rpi_5_5 = simde_mm256_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42); - rho_rmi_5_5 = simde_mm256_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42); - rho_rpi_7_7 = simde_mm256_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42); - rho_rmi_7_7 = simde_mm256_mulhi_epi16(rho_rmi, SEVEN_OVER_SQRT_42); + simde__m256i rho_rpi_1_1 = simde_mm256_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42); + simde__m256i rho_rmi_1_1 = simde_mm256_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42); + simde__m256i rho_rpi_3_3 = simde_mm256_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42); + simde__m256i rho_rmi_3_3 = simde_mm256_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42); + simde__m256i rho_rpi_5_5 = simde_mm256_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42); + simde__m256i rho_rmi_5_5 = simde_mm256_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42); + simde__m256i rho_rpi_7_7 = simde_mm256_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42); + simde__m256i rho_rmi_7_7 = simde_mm256_mulhi_epi16(rho_rmi, SEVEN_OVER_SQRT_42); rho_rpi_5_5 = simde_mm256_slli_epi16(rho_rpi_5_5, 1); rho_rmi_5_5 = simde_mm256_slli_epi16(rho_rmi_5_5, 1); @@ -758,38 +273,38 @@ void qam64_qam16_avx2(short *stream0_in, xmm7 = simde_mm256_slli_epi16(xmm7, 1); xmm8 = simde_mm256_slli_epi16(xmm8, 2); - rho_rpi_1_3 = simde_mm256_adds_epi16(xmm4, xmm6); - rho_rmi_1_3 = simde_mm256_subs_epi16(xmm4, xmm6); - rho_rpi_1_5 = simde_mm256_adds_epi16(xmm4, xmm7); - rho_rmi_1_5 = simde_mm256_subs_epi16(xmm4, xmm7); - rho_rpi_1_7 = simde_mm256_adds_epi16(xmm4, xmm8); - rho_rmi_1_7 = simde_mm256_subs_epi16(xmm4, xmm8); + simde__m256i rho_rpi_1_3 = simde_mm256_adds_epi16(xmm4, xmm6); + simde__m256i rho_rmi_1_3 = simde_mm256_subs_epi16(xmm4, xmm6); + simde__m256i rho_rpi_1_5 = simde_mm256_adds_epi16(xmm4, xmm7); + simde__m256i rho_rmi_1_5 = simde_mm256_subs_epi16(xmm4, xmm7); + simde__m256i rho_rpi_1_7 = simde_mm256_adds_epi16(xmm4, xmm8); + simde__m256i rho_rmi_1_7 = simde_mm256_subs_epi16(xmm4, xmm8); xmm4 = simde_mm256_mulhi_epi16(xmm2, THREE_OVER_SQRT_42); - rho_rpi_3_1 = simde_mm256_adds_epi16(xmm4, xmm5); - rho_rmi_3_1 = simde_mm256_subs_epi16(xmm4, xmm5); - rho_rpi_3_5 = simde_mm256_adds_epi16(xmm4, xmm7); - rho_rmi_3_5 = simde_mm256_subs_epi16(xmm4, xmm7); - rho_rpi_3_7 = simde_mm256_adds_epi16(xmm4, xmm8); - rho_rmi_3_7 = simde_mm256_subs_epi16(xmm4, xmm8); + simde__m256i rho_rpi_3_1 = simde_mm256_adds_epi16(xmm4, xmm5); + simde__m256i rho_rmi_3_1 = simde_mm256_subs_epi16(xmm4, xmm5); + simde__m256i rho_rpi_3_5 = simde_mm256_adds_epi16(xmm4, xmm7); + simde__m256i rho_rmi_3_5 = simde_mm256_subs_epi16(xmm4, xmm7); + simde__m256i rho_rpi_3_7 = simde_mm256_adds_epi16(xmm4, xmm8); + simde__m256i rho_rmi_3_7 = simde_mm256_subs_epi16(xmm4, xmm8); xmm4 = simde_mm256_mulhi_epi16(xmm2, FIVE_OVER_SQRT_42); xmm4 = simde_mm256_slli_epi16(xmm4, 1); - rho_rpi_5_1 = simde_mm256_adds_epi16(xmm4, xmm5); - rho_rmi_5_1 = simde_mm256_subs_epi16(xmm4, xmm5); - rho_rpi_5_3 = simde_mm256_adds_epi16(xmm4, xmm6); - rho_rmi_5_3 = simde_mm256_subs_epi16(xmm4, xmm6); - rho_rpi_5_7 = simde_mm256_adds_epi16(xmm4, xmm8); - rho_rmi_5_7 = simde_mm256_subs_epi16(xmm4, xmm8); + simde__m256i rho_rpi_5_1 = simde_mm256_adds_epi16(xmm4, xmm5); + simde__m256i rho_rmi_5_1 = simde_mm256_subs_epi16(xmm4, xmm5); + simde__m256i rho_rpi_5_3 = simde_mm256_adds_epi16(xmm4, xmm6); + simde__m256i rho_rmi_5_3 = simde_mm256_subs_epi16(xmm4, xmm6); + simde__m256i rho_rpi_5_7 = simde_mm256_adds_epi16(xmm4, xmm8); + simde__m256i rho_rmi_5_7 = simde_mm256_subs_epi16(xmm4, xmm8); xmm4 = simde_mm256_mulhi_epi16(xmm2, SEVEN_OVER_SQRT_42); xmm4 = simde_mm256_slli_epi16(xmm4, 2); - rho_rpi_7_1 = simde_mm256_adds_epi16(xmm4, xmm5); - rho_rmi_7_1 = simde_mm256_subs_epi16(xmm4, xmm5); - rho_rpi_7_3 = simde_mm256_adds_epi16(xmm4, xmm6); - rho_rmi_7_3 = simde_mm256_subs_epi16(xmm4, xmm6); - rho_rpi_7_5 = simde_mm256_adds_epi16(xmm4, xmm7); - rho_rmi_7_5 = simde_mm256_subs_epi16(xmm4, xmm7); + simde__m256i rho_rpi_7_1 = simde_mm256_adds_epi16(xmm4, xmm5); + simde__m256i rho_rmi_7_1 = simde_mm256_subs_epi16(xmm4, xmm5); + simde__m256i rho_rpi_7_3 = simde_mm256_adds_epi16(xmm4, xmm6); + simde__m256i rho_rmi_7_3 = simde_mm256_subs_epi16(xmm4, xmm6); + simde__m256i rho_rpi_7_5 = simde_mm256_adds_epi16(xmm4, xmm7); + simde__m256i rho_rmi_7_5 = simde_mm256_subs_epi16(xmm4, xmm7); // Rearrange interfering MF output /* @@ -807,286 +322,288 @@ void qam64_qam16_avx2(short *stream0_in, y1i = simde_mm256_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)] */ + simde__m256i y1r, y1i; seperate_real_imag_parts(&y1r, &y1i, stream1_256i_in[i], stream1_256i_in[i+1]); // Psi_r calculation from rho_rpi or rho_rmi xmm0 = simde_mm256_broadcastw_epi16(_mm_set1_epi16(0));// ZERO for abs_pi16 xmm2 = simde_mm256_subs_epi16(rho_rpi_7_7, y1r); - psi_r_p7_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p7_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_7_5, y1r); - psi_r_p7_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p7_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_7_3, y1r); - psi_r_p7_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p7_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_7_1, y1r); - psi_r_p7_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p7_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_7_1, y1r); - psi_r_p7_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p7_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_7_3, y1r); - psi_r_p7_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p7_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_7_5, y1r); - psi_r_p7_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p7_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_7_7, y1r); - psi_r_p7_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p7_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_5_7, y1r); - psi_r_p5_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p5_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_5_5, y1r); - psi_r_p5_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p5_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_5_3, y1r); - psi_r_p5_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p5_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_5_1, y1r); - psi_r_p5_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p5_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_5_1, y1r); - psi_r_p5_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p5_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_5_3, y1r); - psi_r_p5_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p5_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_5_5, y1r); - psi_r_p5_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p5_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_5_7, y1r); - psi_r_p5_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p5_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_3_7, y1r); - psi_r_p3_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p3_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_3_5, y1r); - psi_r_p3_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p3_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_3_3, y1r); - psi_r_p3_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p3_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_3_1, y1r); - psi_r_p3_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p3_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_3_1, y1r); - psi_r_p3_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p3_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_3_3, y1r); - psi_r_p3_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p3_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_3_5, y1r); - psi_r_p3_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p3_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_3_7, y1r); - psi_r_p3_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p3_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_1_7, y1r); - psi_r_p1_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p1_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_1_5, y1r); - psi_r_p1_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p1_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_1_3, y1r); - psi_r_p1_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p1_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_1_1, y1r); - psi_r_p1_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p1_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_1_1, y1r); - psi_r_p1_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p1_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_1_3, y1r); - psi_r_p1_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p1_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_1_5, y1r); - psi_r_p1_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p1_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_1_7, y1r); - psi_r_p1_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p1_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_1_7, y1r); - psi_r_m1_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m1_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_1_5, y1r); - psi_r_m1_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m1_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_1_3, y1r); - psi_r_m1_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m1_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_1_1, y1r); - psi_r_m1_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m1_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_1_1, y1r); - psi_r_m1_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m1_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_1_3, y1r); - psi_r_m1_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m1_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_1_5, y1r); - psi_r_m1_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m1_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_1_7, y1r); - psi_r_m1_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m1_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_3_7, y1r); - psi_r_m3_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m3_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_3_5, y1r); - psi_r_m3_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m3_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_3_3, y1r); - psi_r_m3_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m3_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_3_1, y1r); - psi_r_m3_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m3_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_3_1, y1r); - psi_r_m3_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m3_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_3_3, y1r); - psi_r_m3_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m3_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_3_5, y1r); - psi_r_m3_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m3_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_3_7, y1r); - psi_r_m3_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m3_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_5_7, y1r); - psi_r_m5_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m5_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_5_5, y1r); - psi_r_m5_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m5_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_5_3, y1r); - psi_r_m5_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m5_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_5_1, y1r); - psi_r_m5_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m5_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_5_1, y1r); - psi_r_m5_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m5_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_5_3, y1r); - psi_r_m5_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m5_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_5_5, y1r); - psi_r_m5_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m5_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_5_7, y1r); - psi_r_m5_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m5_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_7_7, y1r); - psi_r_m7_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m7_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_7_5, y1r); - psi_r_m7_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m7_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_7_3, y1r); - psi_r_m7_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m7_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_7_1, y1r); - psi_r_m7_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m7_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_7_1, y1r); - psi_r_m7_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m7_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_7_3, y1r); - psi_r_m7_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m7_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_7_5, y1r); - psi_r_m7_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m7_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_7_7, y1r); - psi_r_m7_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m7_m7 = simde_mm256_abs_epi16(xmm2); // Psi_i calculation from rho_rpi or rho_rmi xmm2 = simde_mm256_subs_epi16(rho_rmi_7_7, y1i); - psi_i_p7_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p7_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_5_7, y1i); - psi_i_p7_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p7_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_3_7, y1i); - psi_i_p7_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p7_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_1_7, y1i); - psi_i_p7_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p7_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_1_7, y1i); - psi_i_p7_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p7_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_3_7, y1i); - psi_i_p7_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p7_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_5_7, y1i); - psi_i_p7_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p7_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_7_7, y1i); - psi_i_p7_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p7_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_7_5, y1i); - psi_i_p5_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p5_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_5_5, y1i); - psi_i_p5_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p5_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_3_5, y1i); - psi_i_p5_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p5_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_1_5, y1i); - psi_i_p5_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p5_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_1_5, y1i); - psi_i_p5_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p5_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_3_5, y1i); - psi_i_p5_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p5_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_5_5, y1i); - psi_i_p5_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p5_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_7_5, y1i); - psi_i_p5_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p5_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_7_3, y1i); - psi_i_p3_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p3_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_5_3, y1i); - psi_i_p3_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p3_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_3_3, y1i); - psi_i_p3_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p3_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_1_3, y1i); - psi_i_p3_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p3_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_1_3, y1i); - psi_i_p3_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p3_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_3_3, y1i); - psi_i_p3_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p3_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_5_3, y1i); - psi_i_p3_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p3_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_7_3, y1i); - psi_i_p3_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p3_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_7_1, y1i); - psi_i_p1_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p1_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_5_1, y1i); - psi_i_p1_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p1_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_3_1, y1i); - psi_i_p1_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p1_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_1_1, y1i); - psi_i_p1_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p1_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_1_1, y1i); - psi_i_p1_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p1_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_3_1, y1i); - psi_i_p1_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p1_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_5_1, y1i); - psi_i_p1_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p1_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_7_1, y1i); - psi_i_p1_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p1_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_7_1, y1i); - psi_i_m1_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m1_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_5_1, y1i); - psi_i_m1_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m1_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_3_1, y1i); - psi_i_m1_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m1_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_1_1, y1i); - psi_i_m1_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m1_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_1_1, y1i); - psi_i_m1_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m1_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_3_1, y1i); - psi_i_m1_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m1_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_5_1, y1i); - psi_i_m1_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m1_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_7_1, y1i); - psi_i_m1_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m1_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_7_3, y1i); - psi_i_m3_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m3_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_5_3, y1i); - psi_i_m3_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m3_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_3_3, y1i); - psi_i_m3_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m3_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_1_3, y1i); - psi_i_m3_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m3_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_1_3, y1i); - psi_i_m3_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m3_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_3_3, y1i); - psi_i_m3_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m3_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_5_3, y1i); - psi_i_m3_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m3_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_7_3, y1i); - psi_i_m3_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m3_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_7_5, y1i); - psi_i_m5_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m5_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_5_5, y1i); - psi_i_m5_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m5_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_3_5, y1i); - psi_i_m5_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m5_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_1_5, y1i); - psi_i_m5_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m5_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_1_5, y1i); - psi_i_m5_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m5_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_3_5, y1i); - psi_i_m5_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m5_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_5_5, y1i); - psi_i_m5_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m5_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_7_5, y1i); - psi_i_m5_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m5_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_7_7, y1i); - psi_i_m7_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m7_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_5_7, y1i); - psi_i_m7_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m7_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_3_7, y1i); - psi_i_m7_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m7_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_1_7, y1i); - psi_i_m7_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m7_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_1_7, y1i); - psi_i_m7_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m7_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_3_7, y1i); - psi_i_m7_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m7_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_5_7, y1i); - psi_i_m7_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m7_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_7_7, y1i); - psi_i_m7_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m7_m7 = simde_mm256_abs_epi16(xmm2); -/* - // Rearrange desired MF output - xmm0 = stream0_128i_in[i]; - xmm1 = stream0_128i_in[i+1]; - xmm0 = simde_mm256_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = simde_mm256_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm0 = simde_mm256_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = simde_mm256_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = simde_mm256_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); - xmm1 = simde_mm256_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 = simde_mm256_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] - y0i = simde_mm256_unpackhi_epi64(xmm0,xmm1); -*/ + /* + // Rearrange desired MF output + xmm0 = stream0_128i_in[i]; + xmm1 = stream0_128i_in[i+1]; + xmm0 = simde_mm256_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = simde_mm256_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm0 = simde_mm256_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = simde_mm256_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = simde_mm256_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + xmm1 = simde_mm256_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 = simde_mm256_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] + y0i = simde_mm256_unpackhi_epi64(xmm0,xmm1); + */ + simde__m256i y0r, y0i; seperate_real_imag_parts(&y0r, &y0i, stream0_256i_in[i], stream0_256i_in[i+1]); /* @@ -1133,40 +650,40 @@ void qam64_qam16_avx2(short *stream0_in, y0i_seven_over_sqrt_21 = simde_mm256_mulhi_epi16(y0i, SEVEN_OVER_SQRT_42); y0i_seven_over_sqrt_21 = simde_mm256_slli_epi16(y0i_seven_over_sqrt_21, 2); // Q2.14 - y0_p_7_1 = simde_mm256_adds_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); - y0_p_7_3 = simde_mm256_adds_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); - y0_p_7_5 = simde_mm256_adds_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); - y0_p_7_7 = simde_mm256_adds_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_p_5_1 = simde_mm256_adds_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); - y0_p_5_3 = simde_mm256_adds_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); - y0_p_5_5 = simde_mm256_adds_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); - y0_p_5_7 = simde_mm256_adds_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_p_3_1 = simde_mm256_adds_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); - y0_p_3_3 = simde_mm256_adds_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); - y0_p_3_5 = simde_mm256_adds_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); - y0_p_3_7 = simde_mm256_adds_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_p_1_1 = simde_mm256_adds_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); - y0_p_1_3 = simde_mm256_adds_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); - y0_p_1_5 = simde_mm256_adds_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); - y0_p_1_7 = simde_mm256_adds_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); - - y0_m_1_1 = simde_mm256_subs_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); - y0_m_1_3 = simde_mm256_subs_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); - y0_m_1_5 = simde_mm256_subs_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); - y0_m_1_7 = simde_mm256_subs_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_m_3_1 = simde_mm256_subs_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); - y0_m_3_3 = simde_mm256_subs_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); - y0_m_3_5 = simde_mm256_subs_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); - y0_m_3_7 = simde_mm256_subs_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_m_5_1 = simde_mm256_subs_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); - y0_m_5_3 = simde_mm256_subs_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); - y0_m_5_5 = simde_mm256_subs_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); - y0_m_5_7 = simde_mm256_subs_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_m_7_1 = simde_mm256_subs_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); - y0_m_7_3 = simde_mm256_subs_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); - y0_m_7_5 = simde_mm256_subs_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); - y0_m_7_7 = simde_mm256_subs_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m256i y0_p_7_1 = simde_mm256_adds_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m256i y0_p_7_3 = simde_mm256_adds_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m256i y0_p_7_5 = simde_mm256_adds_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m256i y0_p_7_7 = simde_mm256_adds_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m256i y0_p_5_1 = simde_mm256_adds_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m256i y0_p_5_3 = simde_mm256_adds_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m256i y0_p_5_5 = simde_mm256_adds_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m256i y0_p_5_7 = simde_mm256_adds_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m256i y0_p_3_1 = simde_mm256_adds_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m256i y0_p_3_3 = simde_mm256_adds_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m256i y0_p_3_5 = simde_mm256_adds_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m256i y0_p_3_7 = simde_mm256_adds_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m256i y0_p_1_1 = simde_mm256_adds_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m256i y0_p_1_3 = simde_mm256_adds_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m256i y0_p_1_5 = simde_mm256_adds_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m256i y0_p_1_7 = simde_mm256_adds_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m256i y0_m_1_1 = simde_mm256_subs_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m256i y0_m_1_3 = simde_mm256_subs_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m256i y0_m_1_5 = simde_mm256_subs_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m256i y0_m_1_7 = simde_mm256_subs_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m256i y0_m_3_1 = simde_mm256_subs_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m256i y0_m_3_3 = simde_mm256_subs_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m256i y0_m_3_5 = simde_mm256_subs_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m256i y0_m_3_7 = simde_mm256_subs_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m256i y0_m_5_1 = simde_mm256_subs_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m256i y0_m_5_3 = simde_mm256_subs_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m256i y0_m_5_5 = simde_mm256_subs_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m256i y0_m_5_7 = simde_mm256_subs_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m256i y0_m_7_1 = simde_mm256_subs_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m256i y0_m_7_3 = simde_mm256_subs_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m256i y0_m_7_5 = simde_mm256_subs_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m256i y0_m_7_7 = simde_mm256_subs_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m256i tmp_result, tmp_result2; 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); @@ -1461,200 +978,201 @@ void qam64_qam16_avx2(short *stream0_in, ch_mag_98_over_42_with_sigma2 = simde_mm256_mulhi_epi16(ch_mag_des,FORTYNINE_OVER_FOUR_SQRT_42); ch_mag_98_over_42_with_sigma2 = simde_mm256_slli_epi16(ch_mag_98_over_42_with_sigma2,2); + simde__m256i xmm1; // Computing Metrics xmm0 = simde_mm256_subs_epi16(psi_a_p7_p7, a_sq_p7_p7); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_7_7); - bit_met_p7_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); + simde__m256i bit_met_p7_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p7_p5, a_sq_p7_p5); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_7_5); - bit_met_p7_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + simde__m256i bit_met_p7_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p7_p3, a_sq_p7_p3); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_7_3); - bit_met_p7_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + simde__m256i bit_met_p7_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p7_p1, a_sq_p7_p1); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_7_1); - bit_met_p7_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_p7_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p7_m1, a_sq_p7_m1); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_7_1); - bit_met_p7_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_p7_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p7_m3, a_sq_p7_m3); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_7_3); - bit_met_p7_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + simde__m256i bit_met_p7_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p7_m5, a_sq_p7_m5); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_7_5); - bit_met_p7_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + simde__m256i bit_met_p7_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p7_m7, a_sq_p7_m7); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_7_7); - bit_met_p7_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); + simde__m256i bit_met_p7_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p5_p7, a_sq_p5_p7); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_5_7); - bit_met_p5_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + simde__m256i bit_met_p5_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p5_p5, a_sq_p5_p5); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_5_5); - bit_met_p5_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_p5_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p5_p3, a_sq_p5_p3); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_5_3); - bit_met_p5_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + simde__m256i bit_met_p5_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p5_p1, a_sq_p5_p1); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_5_1); - bit_met_p5_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + simde__m256i bit_met_p5_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p5_m1, a_sq_p5_m1); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_5_1); - bit_met_p5_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + simde__m256i bit_met_p5_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p5_m3, a_sq_p5_m3); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_5_3); - bit_met_p5_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + simde__m256i bit_met_p5_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p5_m5, a_sq_p5_m5); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_5_5); - bit_met_p5_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_p5_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p5_m7, a_sq_p5_m7); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_5_7); - bit_met_p5_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + simde__m256i bit_met_p5_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p3_p7, a_sq_p3_p7); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_3_7); - bit_met_p3_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + simde__m256i bit_met_p3_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p3_p5, a_sq_p3_p5); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_3_5); - bit_met_p3_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + simde__m256i bit_met_p3_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p3_p3, a_sq_p3_p3); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_3_3); - bit_met_p3_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); + simde__m256i bit_met_p3_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p3_p1, a_sq_p3_p1); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_3_1); - bit_met_p3_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + simde__m256i bit_met_p3_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p3_m1, a_sq_p3_m1); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_3_1); - bit_met_p3_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + simde__m256i bit_met_p3_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p3_m3, a_sq_p3_m3); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_3_3); - bit_met_p3_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); + simde__m256i bit_met_p3_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p3_m5, a_sq_p3_m5); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_3_5); - bit_met_p3_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + simde__m256i bit_met_p3_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p3_m7, a_sq_p3_m7); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_3_7); - bit_met_p3_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + simde__m256i bit_met_p3_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p1_p7, a_sq_p1_p7); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_1_7); - bit_met_p1_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_p1_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p1_p5, a_sq_p1_p5); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_1_5); - bit_met_p1_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + simde__m256i bit_met_p1_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p1_p3, a_sq_p1_p3); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_1_3); - bit_met_p1_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + simde__m256i bit_met_p1_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p1_p1, a_sq_p1_p1); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_1_1); - bit_met_p1_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); + simde__m256i bit_met_p1_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p1_m1, a_sq_p1_m1); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_1_1); - bit_met_p1_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); + simde__m256i bit_met_p1_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p1_m3, a_sq_p1_m3); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_1_3); - bit_met_p1_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + simde__m256i bit_met_p1_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p1_m5, a_sq_p1_m5); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_1_5); - bit_met_p1_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + simde__m256i bit_met_p1_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p1_m7, a_sq_p1_m7); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_1_7); - bit_met_p1_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_p1_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m1_p7, a_sq_m1_p7); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_1_7); - bit_met_m1_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_m1_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m1_p5, a_sq_m1_p5); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_1_5); - bit_met_m1_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + simde__m256i bit_met_m1_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m1_p3, a_sq_m1_p3); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_1_3); - bit_met_m1_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + simde__m256i bit_met_m1_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m1_p1, a_sq_m1_p1); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_1_1); - bit_met_m1_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); + simde__m256i bit_met_m1_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m1_m1, a_sq_m1_m1); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_1_1); - bit_met_m1_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); + simde__m256i bit_met_m1_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m1_m3, a_sq_m1_m3); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_1_3); - bit_met_m1_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + simde__m256i bit_met_m1_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m1_m5, a_sq_m1_m5); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_1_5); - bit_met_m1_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + simde__m256i bit_met_m1_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m1_m7, a_sq_m1_m7); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_1_7); - bit_met_m1_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_m1_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m3_p7, a_sq_m3_p7); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_3_7); - bit_met_m3_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + simde__m256i bit_met_m3_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m3_p5, a_sq_m3_p5); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_3_5); - bit_met_m3_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + simde__m256i bit_met_m3_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m3_p3, a_sq_m3_p3); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_3_3); - bit_met_m3_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); + simde__m256i bit_met_m3_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m3_p1, a_sq_m3_p1); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_3_1); - bit_met_m3_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + simde__m256i bit_met_m3_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m3_m1, a_sq_m3_m1); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_3_1); - bit_met_m3_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + simde__m256i bit_met_m3_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m3_m3, a_sq_m3_m3); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_3_3); - bit_met_m3_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); + simde__m256i bit_met_m3_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m3_m5, a_sq_m3_m5); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_3_5); - bit_met_m3_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + simde__m256i bit_met_m3_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m3_m7, a_sq_m3_m7); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_3_7); - bit_met_m3_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + simde__m256i bit_met_m3_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m5_p7, a_sq_m5_p7); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_5_7); - bit_met_m5_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + simde__m256i bit_met_m5_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m5_p5, a_sq_m5_p5); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_5_5); - bit_met_m5_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_m5_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m5_p3, a_sq_m5_p3); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_5_3); - bit_met_m5_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + simde__m256i bit_met_m5_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m5_p1, a_sq_m5_p1); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_5_1); - bit_met_m5_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + simde__m256i bit_met_m5_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m5_m1, a_sq_m5_m1); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_5_1); - bit_met_m5_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + simde__m256i bit_met_m5_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m5_m3, a_sq_m5_m3); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_5_3); - bit_met_m5_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + simde__m256i bit_met_m5_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m5_m5, a_sq_m5_m5); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_5_5); - bit_met_m5_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_m5_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m5_m7, a_sq_m5_m7); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_5_7); - bit_met_m5_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + simde__m256i bit_met_m5_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m7_p7, a_sq_m7_p7); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_7_7); - bit_met_m7_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); + simde__m256i bit_met_m7_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m7_p5, a_sq_m7_p5); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_7_5); - bit_met_m7_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + simde__m256i bit_met_m7_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m7_p3, a_sq_m7_p3); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_7_3); - bit_met_m7_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + simde__m256i bit_met_m7_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m7_p1, a_sq_m7_p1); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_7_1); - bit_met_m7_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_m7_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m7_m1, a_sq_m7_m1); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_7_1); - bit_met_m7_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_m7_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m7_m3, a_sq_m7_m3); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_7_3); - bit_met_m7_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + simde__m256i bit_met_m7_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m7_m5, a_sq_m7_m5); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_7_5); - bit_met_m7_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + simde__m256i bit_met_m7_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m7_m7, a_sq_m7_m7); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_7_7); - bit_met_m7_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); + simde__m256i bit_met_m7_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); // Detection for 1st bit (LTE mapping) // bit = 1 @@ -1664,7 +1182,7 @@ void qam64_qam16_avx2(short *stream0_in, xmm3 = simde_mm256_max_epi16(bit_met_m7_m5, bit_met_m7_m7); xmm4 = simde_mm256_max_epi16(xmm0, xmm1); xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(xmm4, xmm5); + simde__m256i logmax_den_re0 = simde_mm256_max_epi16(xmm4, xmm5); xmm0 = simde_mm256_max_epi16(bit_met_m5_p7, bit_met_m5_p5); xmm1 = simde_mm256_max_epi16(bit_met_m5_p3, bit_met_m5_p1); xmm2 = simde_mm256_max_epi16(bit_met_m5_m1, bit_met_m5_m3); @@ -1697,7 +1215,7 @@ void qam64_qam16_avx2(short *stream0_in, xmm3 = simde_mm256_max_epi16(bit_met_p7_m5, bit_met_p7_m7); xmm4 = simde_mm256_max_epi16(xmm0, xmm1); xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(xmm4, xmm5); + simde__m256i logmax_num_re0 = simde_mm256_max_epi16(xmm4, xmm5); xmm0 = simde_mm256_max_epi16(bit_met_p5_p7, bit_met_p5_p5); xmm1 = simde_mm256_max_epi16(bit_met_p5_p3, bit_met_p5_p1); xmm2 = simde_mm256_max_epi16(bit_met_p5_m1, bit_met_p5_m3); @@ -1859,7 +1377,7 @@ void qam64_qam16_avx2(short *stream0_in, logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); - y2r = simde_mm256_subs_epi16(logmax_num_re0, logmax_den_re0); + simde__m256i y2r = simde_mm256_subs_epi16(logmax_num_re0, logmax_den_re0); // Detection for 4th bit (LTE mapping) xmm0 = simde_mm256_max_epi16(bit_met_p7_p7, bit_met_p5_p7); @@ -2061,7 +1579,7 @@ void qam64_qam16_avx2(short *stream0_in, logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); - y2i = simde_mm256_subs_epi16(logmax_num_re0, logmax_den_re0); + simde__m256i y2i = simde_mm256_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 @@ -2300,21 +1818,21 @@ void qam64_qam64_avx2(int32_t *stream0_in, //xmm3 = [Im(0,1,2,3) Im(8,9,10,11) Im(4,5,6,7) Im(12,13,14,15)] xmm3 = simde_mm256_permute4x64_epi64(xmm3,0xd8); // Im(rho) */ - + simde__m256i xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8; seperate_real_imag_parts(&xmm2, &xmm3, rho01_256i[i], rho01_256i[i+1]); - rho_rpi = simde_mm256_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho) - rho_rmi = simde_mm256_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho) + simde__m256i rho_rpi = simde_mm256_adds_epi16(xmm2, xmm3); // rho = Re(rho) + Im(rho) + simde__m256i rho_rmi = simde_mm256_subs_epi16(xmm2, xmm3); // rho* = Re(rho) - Im(rho) // Compute the different rhos - rho_rpi_1_1 = simde_mm256_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42); - rho_rmi_1_1 = simde_mm256_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42); - rho_rpi_3_3 = simde_mm256_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42); - rho_rmi_3_3 = simde_mm256_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42); - rho_rpi_5_5 = simde_mm256_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42); - rho_rmi_5_5 = simde_mm256_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42); - rho_rpi_7_7 = simde_mm256_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42); - rho_rmi_7_7 = simde_mm256_mulhi_epi16(rho_rmi, SEVEN_OVER_SQRT_42); + simde__m256i rho_rpi_1_1 = simde_mm256_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42); + simde__m256i rho_rmi_1_1 = simde_mm256_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42); + simde__m256i rho_rpi_3_3 = simde_mm256_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42); + simde__m256i rho_rmi_3_3 = simde_mm256_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42); + simde__m256i rho_rpi_5_5 = simde_mm256_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42); + simde__m256i rho_rmi_5_5 = simde_mm256_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42); + simde__m256i rho_rpi_7_7 = simde_mm256_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42); + simde__m256i rho_rmi_7_7 = simde_mm256_mulhi_epi16(rho_rmi, SEVEN_OVER_SQRT_42); rho_rpi_5_5 = simde_mm256_slli_epi16(rho_rpi_5_5, 1); rho_rmi_5_5 = simde_mm256_slli_epi16(rho_rmi_5_5, 1); @@ -2329,38 +1847,38 @@ void qam64_qam64_avx2(int32_t *stream0_in, xmm7 = simde_mm256_slli_epi16(xmm7, 1); xmm8 = simde_mm256_slli_epi16(xmm8, 2); - rho_rpi_1_3 = simde_mm256_adds_epi16(xmm4, xmm6); - rho_rmi_1_3 = simde_mm256_subs_epi16(xmm4, xmm6); - rho_rpi_1_5 = simde_mm256_adds_epi16(xmm4, xmm7); - rho_rmi_1_5 = simde_mm256_subs_epi16(xmm4, xmm7); - rho_rpi_1_7 = simde_mm256_adds_epi16(xmm4, xmm8); - rho_rmi_1_7 = simde_mm256_subs_epi16(xmm4, xmm8); + simde__m256i rho_rpi_1_3 = simde_mm256_adds_epi16(xmm4, xmm6); + simde__m256i rho_rmi_1_3 = simde_mm256_subs_epi16(xmm4, xmm6); + simde__m256i rho_rpi_1_5 = simde_mm256_adds_epi16(xmm4, xmm7); + simde__m256i rho_rmi_1_5 = simde_mm256_subs_epi16(xmm4, xmm7); + simde__m256i rho_rpi_1_7 = simde_mm256_adds_epi16(xmm4, xmm8); + simde__m256i rho_rmi_1_7 = simde_mm256_subs_epi16(xmm4, xmm8); xmm4 = simde_mm256_mulhi_epi16(xmm2, THREE_OVER_SQRT_42); - rho_rpi_3_1 = simde_mm256_adds_epi16(xmm4, xmm5); - rho_rmi_3_1 = simde_mm256_subs_epi16(xmm4, xmm5); - rho_rpi_3_5 = simde_mm256_adds_epi16(xmm4, xmm7); - rho_rmi_3_5 = simde_mm256_subs_epi16(xmm4, xmm7); - rho_rpi_3_7 = simde_mm256_adds_epi16(xmm4, xmm8); - rho_rmi_3_7 = simde_mm256_subs_epi16(xmm4, xmm8); + simde__m256i rho_rpi_3_1 = simde_mm256_adds_epi16(xmm4, xmm5); + simde__m256i rho_rmi_3_1 = simde_mm256_subs_epi16(xmm4, xmm5); + simde__m256i rho_rpi_3_5 = simde_mm256_adds_epi16(xmm4, xmm7); + simde__m256i rho_rmi_3_5 = simde_mm256_subs_epi16(xmm4, xmm7); + simde__m256i rho_rpi_3_7 = simde_mm256_adds_epi16(xmm4, xmm8); + simde__m256i rho_rmi_3_7 = simde_mm256_subs_epi16(xmm4, xmm8); xmm4 = simde_mm256_mulhi_epi16(xmm2, FIVE_OVER_SQRT_42); xmm4 = simde_mm256_slli_epi16(xmm4, 1); - rho_rpi_5_1 = simde_mm256_adds_epi16(xmm4, xmm5); - rho_rmi_5_1 = simde_mm256_subs_epi16(xmm4, xmm5); - rho_rpi_5_3 = simde_mm256_adds_epi16(xmm4, xmm6); - rho_rmi_5_3 = simde_mm256_subs_epi16(xmm4, xmm6); - rho_rpi_5_7 = simde_mm256_adds_epi16(xmm4, xmm8); - rho_rmi_5_7 = simde_mm256_subs_epi16(xmm4, xmm8); + simde__m256i rho_rpi_5_1 = simde_mm256_adds_epi16(xmm4, xmm5); + simde__m256i rho_rmi_5_1 = simde_mm256_subs_epi16(xmm4, xmm5); + simde__m256i rho_rpi_5_3 = simde_mm256_adds_epi16(xmm4, xmm6); + simde__m256i rho_rmi_5_3 = simde_mm256_subs_epi16(xmm4, xmm6); + simde__m256i rho_rpi_5_7 = simde_mm256_adds_epi16(xmm4, xmm8); + simde__m256i rho_rmi_5_7 = simde_mm256_subs_epi16(xmm4, xmm8); xmm4 = simde_mm256_mulhi_epi16(xmm2, SEVEN_OVER_SQRT_42); xmm4 = simde_mm256_slli_epi16(xmm4, 2); - rho_rpi_7_1 = simde_mm256_adds_epi16(xmm4, xmm5); - rho_rmi_7_1 = simde_mm256_subs_epi16(xmm4, xmm5); - rho_rpi_7_3 = simde_mm256_adds_epi16(xmm4, xmm6); - rho_rmi_7_3 = simde_mm256_subs_epi16(xmm4, xmm6); - rho_rpi_7_5 = simde_mm256_adds_epi16(xmm4, xmm7); - rho_rmi_7_5 = simde_mm256_subs_epi16(xmm4, xmm7); + simde__m256i rho_rpi_7_1 = simde_mm256_adds_epi16(xmm4, xmm5); + simde__m256i rho_rmi_7_1 = simde_mm256_subs_epi16(xmm4, xmm5); + simde__m256i rho_rpi_7_3 = simde_mm256_adds_epi16(xmm4, xmm6); + simde__m256i rho_rmi_7_3 = simde_mm256_subs_epi16(xmm4, xmm6); + simde__m256i rho_rpi_7_5 = simde_mm256_adds_epi16(xmm4, xmm7); + simde__m256i rho_rmi_7_5 = simde_mm256_subs_epi16(xmm4, xmm7); // Rearrange interfering MF output /* @@ -2380,272 +1898,272 @@ void qam64_qam64_avx2(int32_t *stream0_in, y1i = simde_mm256_unpackhi_epi64(xmm0, xmm1); y1i = simde_mm256_permute4x64_epi64(y1i,0xd8); // Im(y1) */ - + simde__m256i y1r, y1i, xmm0; seperate_real_imag_parts(&y1r, &y1i, stream1_256i_in[i], stream1_256i_in[i+1]); // Psi_r calculation from rho_rpi or rho_rmi xmm0 = simde_mm256_broadcastw_epi16(_mm_set1_epi16(0));// ZERO for abs_pi16 xmm2 = simde_mm256_subs_epi16(rho_rpi_7_7, y1r); - psi_r_p7_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p7_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_7_5, y1r); - psi_r_p7_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p7_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_7_3, y1r); - psi_r_p7_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p7_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_7_1, y1r); - psi_r_p7_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p7_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_7_1, y1r); - psi_r_p7_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p7_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_7_3, y1r); - psi_r_p7_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p7_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_7_5, y1r); - psi_r_p7_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p7_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_7_7, y1r); - psi_r_p7_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p7_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_5_7, y1r); - psi_r_p5_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p5_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_5_5, y1r); - psi_r_p5_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p5_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_5_3, y1r); - psi_r_p5_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p5_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_5_1, y1r); - psi_r_p5_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p5_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_5_1, y1r); - psi_r_p5_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p5_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_5_3, y1r); - psi_r_p5_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p5_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_5_5, y1r); - psi_r_p5_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p5_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_5_7, y1r); - psi_r_p5_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p5_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_3_7, y1r); - psi_r_p3_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p3_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_3_5, y1r); - psi_r_p3_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p3_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_3_3, y1r); - psi_r_p3_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p3_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_3_1, y1r); - psi_r_p3_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p3_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_3_1, y1r); - psi_r_p3_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p3_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_3_3, y1r); - psi_r_p3_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p3_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_3_5, y1r); - psi_r_p3_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p3_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_3_7, y1r); - psi_r_p3_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p3_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_1_7, y1r); - psi_r_p1_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p1_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_1_5, y1r); - psi_r_p1_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p1_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_1_3, y1r); - psi_r_p1_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p1_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_1_1, y1r); - psi_r_p1_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p1_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_1_1, y1r); - psi_r_p1_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p1_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_1_3, y1r); - psi_r_p1_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p1_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_1_5, y1r); - psi_r_p1_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p1_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_1_7, y1r); - psi_r_p1_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_p1_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_1_7, y1r); - psi_r_m1_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m1_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_1_5, y1r); - psi_r_m1_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m1_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_1_3, y1r); - psi_r_m1_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m1_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_1_1, y1r); - psi_r_m1_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m1_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_1_1, y1r); - psi_r_m1_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m1_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_1_3, y1r); - psi_r_m1_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m1_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_1_5, y1r); - psi_r_m1_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m1_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_1_7, y1r); - psi_r_m1_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m1_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_3_7, y1r); - psi_r_m3_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m3_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_3_5, y1r); - psi_r_m3_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m3_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_3_3, y1r); - psi_r_m3_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m3_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_3_1, y1r); - psi_r_m3_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m3_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_3_1, y1r); - psi_r_m3_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m3_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_3_3, y1r); - psi_r_m3_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m3_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_3_5, y1r); - psi_r_m3_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m3_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_3_7, y1r); - psi_r_m3_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m3_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_5_7, y1r); - psi_r_m5_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m5_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_5_5, y1r); - psi_r_m5_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m5_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_5_3, y1r); - psi_r_m5_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m5_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_5_1, y1r); - psi_r_m5_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m5_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_5_1, y1r); - psi_r_m5_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m5_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_5_3, y1r); - psi_r_m5_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m5_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_5_5, y1r); - psi_r_m5_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m5_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_5_7, y1r); - psi_r_m5_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m5_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_7_7, y1r); - psi_r_m7_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m7_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_7_5, y1r); - psi_r_m7_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m7_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_7_3, y1r); - psi_r_m7_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m7_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_7_1, y1r); - psi_r_m7_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m7_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_7_1, y1r); - psi_r_m7_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m7_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_7_3, y1r); - psi_r_m7_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m7_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_7_5, y1r); - psi_r_m7_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m7_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_7_7, y1r); - psi_r_m7_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_r_m7_m7 = simde_mm256_abs_epi16(xmm2); - // Psi_i calculation from rho_rpi or rho_rmi + // Simde__M256i Psi_i calculation from rho_rpi or rho_rmi xmm2 = simde_mm256_subs_epi16(rho_rmi_7_7, y1i); - psi_i_p7_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p7_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_5_7, y1i); - psi_i_p7_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p7_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_3_7, y1i); - psi_i_p7_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p7_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_1_7, y1i); - psi_i_p7_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p7_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_1_7, y1i); - psi_i_p7_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p7_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_3_7, y1i); - psi_i_p7_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p7_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_5_7, y1i); - psi_i_p7_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p7_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_7_7, y1i); - psi_i_p7_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p7_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_7_5, y1i); - psi_i_p5_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p5_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_5_5, y1i); - psi_i_p5_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p5_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_3_5, y1i); - psi_i_p5_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p5_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_1_5, y1i); - psi_i_p5_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p5_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_1_5, y1i); - psi_i_p5_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p5_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_3_5, y1i); - psi_i_p5_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p5_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_5_5, y1i); - psi_i_p5_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p5_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_7_5, y1i); - psi_i_p5_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p5_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_7_3, y1i); - psi_i_p3_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p3_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_5_3, y1i); - psi_i_p3_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p3_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_3_3, y1i); - psi_i_p3_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p3_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_1_3, y1i); - psi_i_p3_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p3_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_1_3, y1i); - psi_i_p3_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p3_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_3_3, y1i); - psi_i_p3_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p3_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_5_3, y1i); - psi_i_p3_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p3_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_7_3, y1i); - psi_i_p3_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p3_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_7_1, y1i); - psi_i_p1_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p1_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_5_1, y1i); - psi_i_p1_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p1_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_3_1, y1i); - psi_i_p1_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p1_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rmi_1_1, y1i); - psi_i_p1_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p1_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_1_1, y1i); - psi_i_p1_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p1_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_3_1, y1i); - psi_i_p1_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p1_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_5_1, y1i); - psi_i_p1_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p1_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rpi_7_1, y1i); - psi_i_p1_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_p1_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_7_1, y1i); - psi_i_m1_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m1_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_5_1, y1i); - psi_i_m1_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m1_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_3_1, y1i); - psi_i_m1_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m1_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_1_1, y1i); - psi_i_m1_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m1_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_1_1, y1i); - psi_i_m1_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m1_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_3_1, y1i); - psi_i_m1_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m1_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_5_1, y1i); - psi_i_m1_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m1_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_7_1, y1i); - psi_i_m1_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m1_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_7_3, y1i); - psi_i_m3_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m3_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_5_3, y1i); - psi_i_m3_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m3_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_3_3, y1i); - psi_i_m3_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m3_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_1_3, y1i); - psi_i_m3_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m3_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_1_3, y1i); - psi_i_m3_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m3_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_3_3, y1i); - psi_i_m3_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m3_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_5_3, y1i); - psi_i_m3_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m3_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_7_3, y1i); - psi_i_m3_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m3_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_7_5, y1i); - psi_i_m5_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m5_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_5_5, y1i); - psi_i_m5_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m5_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_3_5, y1i); - psi_i_m5_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m5_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_1_5, y1i); - psi_i_m5_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m5_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_1_5, y1i); - psi_i_m5_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m5_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_3_5, y1i); - psi_i_m5_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m5_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_5_5, y1i); - psi_i_m5_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m5_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_7_5, y1i); - psi_i_m5_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m5_m7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_7_7, y1i); - psi_i_m7_p7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m7_p7 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_5_7, y1i); - psi_i_m7_p5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m7_p5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_3_7, y1i); - psi_i_m7_p3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m7_p3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_subs_epi16(rho_rpi_1_7, y1i); - psi_i_m7_p1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m7_p1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_1_7, y1i); - psi_i_m7_m1 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m7_m1 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_3_7, y1i); - psi_i_m7_m3 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m7_m3 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_5_7, y1i); - psi_i_m7_m5 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m7_m5 = simde_mm256_abs_epi16(xmm2); xmm2 = simde_mm256_adds_epi16(rho_rmi_7_7, y1i); - psi_i_m7_m7 = simde_mm256_abs_epi16(xmm2); + simde__m256i psi_i_m7_m7 = simde_mm256_abs_epi16(xmm2); /* // Rearrange desired MF output @@ -2662,6 +2180,7 @@ void qam64_qam64_avx2(int32_t *stream0_in, y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)] y0i = _mm_unpackhi_epi64(xmm0,xmm1); */ + simde__m256i y0r, y0i; seperate_real_imag_parts(&y0r, &y0i, stream0_256i_in[i], stream0_256i_in[i+1]); // Rearrange desired channel magnitudes @@ -2709,46 +2228,45 @@ void qam64_qam64_avx2(int32_t *stream0_in, y0i_seven_over_sqrt_21 = simde_mm256_mulhi_epi16(y0i, SEVEN_OVER_SQRT_42); y0i_seven_over_sqrt_21 = simde_mm256_slli_epi16(y0i_seven_over_sqrt_21, 2); // Q2.14 + simde__m256i y0_p_7_1 = simde_mm256_adds_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m256i y0_p_7_3 = simde_mm256_adds_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m256i y0_p_7_5 = simde_mm256_adds_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m256i y0_p_7_7 = simde_mm256_adds_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m256i y0_p_5_1 = simde_mm256_adds_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m256i y0_p_5_3 = simde_mm256_adds_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m256i y0_p_5_5 = simde_mm256_adds_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m256i y0_p_5_7 = simde_mm256_adds_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m256i y0_p_3_1 = simde_mm256_adds_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m256i y0_p_3_3 = simde_mm256_adds_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m256i y0_p_3_5 = simde_mm256_adds_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m256i y0_p_3_7 = simde_mm256_adds_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m256i y0_p_1_1 = simde_mm256_adds_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m256i y0_p_1_3 = simde_mm256_adds_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m256i y0_p_1_5 = simde_mm256_adds_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m256i y0_p_1_7 = simde_mm256_adds_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_p_7_1 = simde_mm256_adds_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); - y0_p_7_3 = simde_mm256_adds_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); - y0_p_7_5 = simde_mm256_adds_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); - y0_p_7_7 = simde_mm256_adds_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_p_5_1 = simde_mm256_adds_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); - y0_p_5_3 = simde_mm256_adds_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); - y0_p_5_5 = simde_mm256_adds_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); - y0_p_5_7 = simde_mm256_adds_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_p_3_1 = simde_mm256_adds_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); - y0_p_3_3 = simde_mm256_adds_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); - y0_p_3_5 = simde_mm256_adds_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); - y0_p_3_7 = simde_mm256_adds_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_p_1_1 = simde_mm256_adds_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); - y0_p_1_3 = simde_mm256_adds_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); - y0_p_1_5 = simde_mm256_adds_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); - y0_p_1_7 = simde_mm256_adds_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); - - y0_m_1_1 = simde_mm256_subs_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); - y0_m_1_3 = simde_mm256_subs_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); - y0_m_1_5 = simde_mm256_subs_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); - y0_m_1_7 = simde_mm256_subs_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_m_3_1 = simde_mm256_subs_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); - y0_m_3_3 = simde_mm256_subs_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); - y0_m_3_5 = simde_mm256_subs_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); - y0_m_3_7 = simde_mm256_subs_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_m_5_1 = simde_mm256_subs_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); - y0_m_5_3 = simde_mm256_subs_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); - y0_m_5_5 = simde_mm256_subs_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); - y0_m_5_7 = simde_mm256_subs_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); - y0_m_7_1 = simde_mm256_subs_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); - y0_m_7_3 = simde_mm256_subs_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); - y0_m_7_5 = simde_mm256_subs_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); - y0_m_7_7 = simde_mm256_subs_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m256i y0_m_1_1 = simde_mm256_subs_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m256i y0_m_1_3 = simde_mm256_subs_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m256i y0_m_1_5 = simde_mm256_subs_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m256i y0_m_1_7 = simde_mm256_subs_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m256i y0_m_3_1 = simde_mm256_subs_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m256i y0_m_3_3 = simde_mm256_subs_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m256i y0_m_3_5 = simde_mm256_subs_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m256i y0_m_3_7 = simde_mm256_subs_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m256i y0_m_5_1 = simde_mm256_subs_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m256i y0_m_5_3 = simde_mm256_subs_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m256i y0_m_5_5 = simde_mm256_subs_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m256i y0_m_5_7 = simde_mm256_subs_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21); + simde__m256i y0_m_7_1 = simde_mm256_subs_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21); + simde__m256i y0_m_7_3 = simde_mm256_subs_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21); + simde__m256i y0_m_7_5 = simde_mm256_subs_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21); + simde__m256i y0_m_7_7 = simde_mm256_subs_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21); // Detection of interference term ch_mag_int_with_sigma2 = simde_mm256_srai_epi16(ch_mag_int, 1); // *2 two_ch_mag_int_with_sigma2 = ch_mag_int; // *4 three_ch_mag_int_with_sigma2 = simde_mm256_adds_epi16(ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2); // *6 - + simde__m256i tmp_result, tmp_result2, tmp_result3, tmp_result4; interference_abs_64qam_epi16(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, @@ -3303,198 +2821,198 @@ void qam64_qam64_avx2(int32_t *stream0_in, // Computing Metrics xmm0 = simde_mm256_subs_epi16(psi_a_p7_p7, a_sq_p7_p7); - xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_7_7); - bit_met_p7_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); + simde__m256i xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_7_7); + simde__m256i bit_met_p7_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p7_p5, a_sq_p7_p5); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_7_5); - bit_met_p7_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + simde__m256i bit_met_p7_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p7_p3, a_sq_p7_p3); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_7_3); - bit_met_p7_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + simde__m256i bit_met_p7_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p7_p1, a_sq_p7_p1); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_7_1); - bit_met_p7_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_p7_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p7_m1, a_sq_p7_m1); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_7_1); - bit_met_p7_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_p7_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p7_m3, a_sq_p7_m3); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_7_3); - bit_met_p7_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + simde__m256i bit_met_p7_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p7_m5, a_sq_p7_m5); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_7_5); - bit_met_p7_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + simde__m256i bit_met_p7_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p7_m7, a_sq_p7_m7); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_7_7); - bit_met_p7_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); + simde__m256i bit_met_p7_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p5_p7, a_sq_p5_p7); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_5_7); - bit_met_p5_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + simde__m256i bit_met_p5_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p5_p5, a_sq_p5_p5); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_5_5); - bit_met_p5_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_p5_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p5_p3, a_sq_p5_p3); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_5_3); - bit_met_p5_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + simde__m256i bit_met_p5_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p5_p1, a_sq_p5_p1); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_5_1); - bit_met_p5_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + simde__m256i bit_met_p5_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p5_m1, a_sq_p5_m1); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_5_1); - bit_met_p5_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + simde__m256i bit_met_p5_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p5_m3, a_sq_p5_m3); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_5_3); - bit_met_p5_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + simde__m256i bit_met_p5_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p5_m5, a_sq_p5_m5); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_5_5); - bit_met_p5_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_p5_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p5_m7, a_sq_p5_m7); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_5_7); - bit_met_p5_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + simde__m256i bit_met_p5_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p3_p7, a_sq_p3_p7); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_3_7); - bit_met_p3_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + simde__m256i bit_met_p3_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p3_p5, a_sq_p3_p5); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_3_5); - bit_met_p3_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + simde__m256i bit_met_p3_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p3_p3, a_sq_p3_p3); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_3_3); - bit_met_p3_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); + simde__m256i bit_met_p3_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p3_p1, a_sq_p3_p1); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_3_1); - bit_met_p3_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + simde__m256i bit_met_p3_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p3_m1, a_sq_p3_m1); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_3_1); - bit_met_p3_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + simde__m256i bit_met_p3_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p3_m3, a_sq_p3_m3); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_3_3); - bit_met_p3_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); + simde__m256i bit_met_p3_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p3_m5, a_sq_p3_m5); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_3_5); - bit_met_p3_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + simde__m256i bit_met_p3_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p3_m7, a_sq_p3_m7); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_3_7); - bit_met_p3_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + simde__m256i bit_met_p3_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p1_p7, a_sq_p1_p7); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_1_7); - bit_met_p1_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_p1_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p1_p5, a_sq_p1_p5); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_1_5); - bit_met_p1_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + simde__m256i bit_met_p1_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p1_p3, a_sq_p1_p3); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_1_3); - bit_met_p1_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + simde__m256i bit_met_p1_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p1_p1, a_sq_p1_p1); xmm1 = simde_mm256_adds_epi16(xmm0, y0_p_1_1); - bit_met_p1_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); + simde__m256i bit_met_p1_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p1_m1, a_sq_p1_m1); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_1_1); - bit_met_p1_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); + simde__m256i bit_met_p1_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p1_m3, a_sq_p1_m3); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_1_3); - bit_met_p1_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + simde__m256i bit_met_p1_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p1_m5, a_sq_p1_m5); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_1_5); - bit_met_p1_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + simde__m256i bit_met_p1_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_p1_m7, a_sq_p1_m7); xmm1 = simde_mm256_adds_epi16(xmm0, y0_m_1_7); - bit_met_p1_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_p1_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m1_p7, a_sq_m1_p7); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_1_7); - bit_met_m1_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_m1_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m1_p5, a_sq_m1_p5); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_1_5); - bit_met_m1_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + simde__m256i bit_met_m1_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m1_p3, a_sq_m1_p3); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_1_3); - bit_met_m1_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + simde__m256i bit_met_m1_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m1_p1, a_sq_m1_p1); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_1_1); - bit_met_m1_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); + simde__m256i bit_met_m1_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m1_m1, a_sq_m1_m1); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_1_1); - bit_met_m1_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); + simde__m256i bit_met_m1_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m1_m3, a_sq_m1_m3); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_1_3); - bit_met_m1_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + simde__m256i bit_met_m1_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m1_m5, a_sq_m1_m5); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_1_5); - bit_met_m1_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + simde__m256i bit_met_m1_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m1_m7, a_sq_m1_m7); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_1_7); - bit_met_m1_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_m1_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m3_p7, a_sq_m3_p7); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_3_7); - bit_met_m3_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + simde__m256i bit_met_m3_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m3_p5, a_sq_m3_p5); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_3_5); - bit_met_m3_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + simde__m256i bit_met_m3_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m3_p3, a_sq_m3_p3); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_3_3); - bit_met_m3_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); + simde__m256i bit_met_m3_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m3_p1, a_sq_m3_p1); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_3_1); - bit_met_m3_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + simde__m256i bit_met_m3_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m3_m1, a_sq_m3_m1); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_3_1); - bit_met_m3_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); + simde__m256i bit_met_m3_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m3_m3, a_sq_m3_m3); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_3_3); - bit_met_m3_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); + simde__m256i bit_met_m3_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m3_m5, a_sq_m3_m5); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_3_5); - bit_met_m3_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + simde__m256i bit_met_m3_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m3_m7, a_sq_m3_m7); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_3_7); - bit_met_m3_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + simde__m256i bit_met_m3_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m5_p7, a_sq_m5_p7); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_5_7); - bit_met_m5_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + simde__m256i bit_met_m5_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m5_p5, a_sq_m5_p5); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_5_5); - bit_met_m5_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_m5_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m5_p3, a_sq_m5_p3); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_5_3); - bit_met_m5_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + simde__m256i bit_met_m5_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m5_p1, a_sq_m5_p1); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_5_1); - bit_met_m5_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + simde__m256i bit_met_m5_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m5_m1, a_sq_m5_m1); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_5_1); - bit_met_m5_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); + simde__m256i bit_met_m5_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m5_m3, a_sq_m5_m3); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_5_3); - bit_met_m5_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); + simde__m256i bit_met_m5_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m5_m5, a_sq_m5_m5); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_5_5); - bit_met_m5_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_m5_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m5_m7, a_sq_m5_m7); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_5_7); - bit_met_m5_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + simde__m256i bit_met_m5_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m7_p7, a_sq_m7_p7); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_7_7); - bit_met_m7_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); + simde__m256i bit_met_m7_p7 = simde_mm256_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m7_p5, a_sq_m7_p5); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_7_5); - bit_met_m7_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + simde__m256i bit_met_m7_p5 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m7_p3, a_sq_m7_p3); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_7_3); - bit_met_m7_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + simde__m256i bit_met_m7_p3 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m7_p1, a_sq_m7_p1); xmm1 = simde_mm256_subs_epi16(xmm0, y0_m_7_1); - bit_met_m7_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_m7_p1 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m7_m1, a_sq_m7_m1); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_7_1); - bit_met_m7_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); + simde__m256i bit_met_m7_m1 = simde_mm256_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m7_m3, a_sq_m7_m3); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_7_3); - bit_met_m7_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); + simde__m256i bit_met_m7_m3 = simde_mm256_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m7_m5, a_sq_m7_m5); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_7_5); - bit_met_m7_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); + simde__m256i bit_met_m7_m5 = simde_mm256_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2); xmm0 = simde_mm256_subs_epi16(psi_a_m7_m7, a_sq_m7_m7); xmm1 = simde_mm256_subs_epi16(xmm0, y0_p_7_7); - bit_met_m7_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); + simde__m256i bit_met_m7_m7 = simde_mm256_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2); // Detection for 1st bit (LTE mapping) // bit = 1 @@ -3504,7 +3022,7 @@ void qam64_qam64_avx2(int32_t *stream0_in, xmm3 = simde_mm256_max_epi16(bit_met_m7_m5, bit_met_m7_m7); xmm4 = simde_mm256_max_epi16(xmm0, xmm1); xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_den_re0 = simde_mm256_max_epi16(xmm4, xmm5); + simde__m256i logmax_den_re0 = simde_mm256_max_epi16(xmm4, xmm5); xmm0 = simde_mm256_max_epi16(bit_met_m5_p7, bit_met_m5_p5); xmm1 = simde_mm256_max_epi16(bit_met_m5_p3, bit_met_m5_p1); xmm2 = simde_mm256_max_epi16(bit_met_m5_m1, bit_met_m5_m3); @@ -3537,7 +3055,7 @@ void qam64_qam64_avx2(int32_t *stream0_in, xmm3 = simde_mm256_max_epi16(bit_met_p7_m5, bit_met_p7_m7); xmm4 = simde_mm256_max_epi16(xmm0, xmm1); xmm5 = simde_mm256_max_epi16(xmm2, xmm3); - logmax_num_re0 = simde_mm256_max_epi16(xmm4, xmm5); + simde__m256i logmax_num_re0 = simde_mm256_max_epi16(xmm4, xmm5); xmm0 = simde_mm256_max_epi16(bit_met_p5_p7, bit_met_p5_p5); xmm1 = simde_mm256_max_epi16(bit_met_p5_p3, bit_met_p5_p1); xmm2 = simde_mm256_max_epi16(bit_met_p5_m1, bit_met_p5_m3); @@ -3699,7 +3217,7 @@ void qam64_qam64_avx2(int32_t *stream0_in, logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); - y2r = simde_mm256_subs_epi16(logmax_num_re0, logmax_den_re0); + simde__m256i y2r = simde_mm256_subs_epi16(logmax_num_re0, logmax_den_re0); // Detection for 4th bit (LTE mapping) xmm0 = simde_mm256_max_epi16(bit_met_p7_p7, bit_met_p5_p7); @@ -3901,7 +3419,7 @@ void qam64_qam64_avx2(int32_t *stream0_in, logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm4); logmax_num_re0 = simde_mm256_max_epi16(logmax_num_re0, xmm5); - y2i = simde_mm256_subs_epi16(logmax_num_re0, logmax_den_re0); + simde__m256i y2i = simde_mm256_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 diff --git a/openair1/PHY/LTE_UE_TRANSPORT/pmch_ue.c b/openair1/PHY/LTE_UE_TRANSPORT/pmch_ue.c index eb9e3bc742..fe82120e2f 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/pmch_ue.c +++ b/openair1/PHY/LTE_UE_TRANSPORT/pmch_ue.c @@ -145,7 +145,7 @@ void mch_extract_rbs_khz_1dot25(int **rxdataF, /*unsigned char symbol,*/ unsigned char subframe, LTE_DL_FRAME_PARMS *frame_parms) { - int i,j,offset,aarx,numext; + int i, j, offset, aarx; if( (subframe&0x1) == 0) { offset=0; @@ -153,8 +153,6 @@ void mch_extract_rbs_khz_1dot25(int **rxdataF, offset=3; } - numext=0; - for (aarx=0; aarxnb_antennas_rx; aarx++) { for (i=0,j=0; iN_RB_DL*72; i++) { if( ((i-offset)%6) != 0 ) { @@ -163,7 +161,6 @@ void mch_extract_rbs_khz_1dot25(int **rxdataF, rxdataF_ext[aarx][(frame_parms->N_RB_DL*60)+j+0] = rxdataF[aarx][i+1+0]; //DC dl_ch_estimates_ext[aarx][j+0] = dl_ch_estimates[aarx][i+0]; dl_ch_estimates_ext[aarx][(frame_parms->N_RB_DL*60)+j+0] = dl_ch_estimates[aarx][i+(frame_parms->N_RB_DL*72)+0]; - numext+=2; j++; } } diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index e953d8a4a0..ad7b364119 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -120,7 +120,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, int ul_id, unsigned short bwp_start_subcarrier, nfapi_nr_pusch_pdu_t *pusch_pdu, - int *max_ch) { + int *max_ch, + uint32_t *nvar) { c16_t pilot[3280] __attribute__((aligned(32))); const int chest_freq = gNB->chest_freq; @@ -186,6 +187,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, #endif + int nest_count = 0; + uint64_t noise_amp2 = 0; c16_t ul_ls_est[symbolSize] __attribute__((aligned(32))); memset(ul_ls_est, 0, sizeof(c16_t) * symbolSize); NR_ULSCH_delay_t *delay = &gNB->ulsch[ul_id].delay; @@ -284,12 +287,16 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, int k = pilot_cnt << 1; ul_ch[k] = c16mulShift(ul_ch[k], ul_inv_delay_table[k], 8); ul_ch[k + 1] = c16mulShift(ul_ch[k + 1], ul_inv_delay_table[k + 1], 8); + noise_amp2 += c16amp2(c16sub(ul_ls_est[k], ul_ch[k])); + noise_amp2 += c16amp2(c16sub(ul_ls_est[k + 1], ul_ch[k + 1])); + #ifdef DEBUG_PUSCH re_offset = (k0 + (n << 2) + (k_line << 1)) % symbolSize; c16_t *rxF = &rxdataF[soffset + re_offset]; printf("ch -> (%4d,%4d), ch_inter -> (%4d,%4d)\n", ul_ls_est[k].r, ul_ls_est[k].i, ul_ch[k].r, ul_ch[k].i); #endif pilot_cnt++; + nest_count += 2; } } @@ -307,6 +314,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, multadd_real_four_symbols_vector_complex_scalar(filt8_rep4, &ch, &ul_ls_est[n]); ul_ls_est[n + 4] = ch; ul_ls_est[n + 5] = ch; + noise_amp2 += c16amp2(c16sub(ch0, ch)); + nest_count++; } // Delay compensation @@ -501,7 +510,12 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, #ifdef DEBUG_CH fclose(debug_ch_est); #endif - return(0); + + if (nvar && nest_count > 0) { + *nvar = (uint32_t)(noise_amp2 / nest_count); + } + + return 0; } diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h index 41f841a975..9dc6edf8d2 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h @@ -47,7 +47,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, int ul_id, unsigned short bwp_start_subcarrier, nfapi_nr_pusch_pdu_t *pusch_pdu, - int *max_ch); + int *max_ch, + uint32_t *nvar); void dump_nr_I0_stats(FILE *fd,PHY_VARS_gNB *gNB); diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c index f0a52b9c8e..bb213c595b 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c @@ -1468,21 +1468,21 @@ void nr_ulsch_construct_HhH_elements(int *conjch00_ch00, _m_empty(); } -/* Zero Forcing Rx function: nr_ulsch_zero_forcing_rx_2layers() - * - * - * */ -uint8_t nr_ulsch_zero_forcing_rx_2layers(NR_DL_FRAME_PARMS *frame_parms, - int **rxdataF_comp, - int **ul_ch_mag, - int **ul_ch_magb, - int **ul_ch_estimates_ext, - unsigned short nb_rb, - unsigned char n_rx, - unsigned char mod_order, - int shift, - unsigned char symbol, - int length) +/* + * MMSE Rx function: nr_ulsch_mmse_2layers() + */ +uint8_t nr_ulsch_mmse_2layers(NR_DL_FRAME_PARMS *frame_parms, + int **rxdataF_comp, + int **ul_ch_mag, + int **ul_ch_magb, + int **ul_ch_estimates_ext, + unsigned short nb_rb, + unsigned char n_rx, + unsigned char mod_order, + int shift, + unsigned char symbol, + int length, + uint32_t noise_var) { int *ch00, *ch01, *ch10, *ch11; int *ch20, *ch30, *ch21, *ch31; @@ -1702,6 +1702,20 @@ uint8_t nr_ulsch_zero_forcing_rx_2layers(NR_DL_FRAME_PARMS *frame_parms, nb_rb_0, symbol); } + + // Add noise_var such that: H^h * H + noise_var * I + if (noise_var != 0) { + __m128i nvar_128i = simde_mm_set1_epi32(noise_var); + __m128i *af_mf_00_128i = (__m128i *)af_mf_00; + __m128i *af_mf_11_128i = (__m128i *)af_mf_11; + for (int k = 0; k < 3 * nb_rb_0; k++) { + af_mf_00_128i[0] = simde_mm_add_epi32(af_mf_00_128i[0], nvar_128i); + af_mf_11_128i[0] = simde_mm_add_epi32(af_mf_11_128i[0], nvar_128i); + af_mf_00_128i++; + af_mf_11_128i++; + } + } + //det_HhH = ad -bc nr_ulsch_det_HhH(af_mf_00,//a af_mf_01,//b @@ -1867,6 +1881,7 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB, //---------------------------------------------------------- start_meas(&gNB->ulsch_channel_estimation_stats); int max_ch = 0; + uint32_t nvar = 0; for(uint8_t symbol = rel15_ul->start_symbol_index; symbol < (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols); symbol++) { uint8_t dmrs_symbol_flag = (rel15_ul->ul_dmrs_symb_pos >> symbol) & 0x01; LOG_D(PHY, "symbol %d, dmrs_symbol_flag :%d\n", symbol, dmrs_symbol_flag); @@ -1876,7 +1891,7 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB, pusch_vars->dmrs_symbol = symbol; for (int nl=0; nlnrOfLayers; nl++) { - + uint32_t nvar_tmp = 0; nr_pusch_channel_estimation(gNB, slot, get_dmrs_port(nl,rel15_ul->dmrs_ports), @@ -1884,7 +1899,9 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB, ulsch_id, bwp_start_subcarrier, rel15_ul, - &max_ch); + &max_ch, + &nvar_tmp); + nvar += nvar_tmp; } nr_gnb_measurements(gNB, ulsch, pusch_vars, symbol, rel15_ul->nrOfLayers); @@ -1915,6 +1932,8 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB, } } + nvar /= (rel15_ul->nr_of_symbols * rel15_ul->nrOfLayers * frame_parms->nb_antennas_rx); + if (gNB->chest_time == 1) { // averaging time domain channel estimates nr_chest_time_domain_avg(frame_parms, pusch_vars->ul_ch_estimates, @@ -2039,19 +2058,20 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB, rel15_ul->rb_size, nb_re_pusch); - //Apply zero forcing for 2 Tx layers + // Apply MMSE for 2 Tx layers if (rel15_ul->nrOfLayers == 2) { - nr_ulsch_zero_forcing_rx_2layers(frame_parms, - pusch_vars->rxdataF_comp, - pusch_vars->ul_ch_mag0, - pusch_vars->ul_ch_magb0, - pusch_vars->ul_ch_estimates_ext, - rel15_ul->rb_size, - frame_parms->nb_antennas_rx, - rel15_ul->qam_mod_order, - pusch_vars->log2_maxh, - symbol, - nb_re_pusch); + nr_ulsch_mmse_2layers(frame_parms, + pusch_vars->rxdataF_comp, + pusch_vars->ul_ch_mag0, + pusch_vars->ul_ch_magb0, + pusch_vars->ul_ch_estimates_ext, + rel15_ul->rb_size, + frame_parms->nb_antennas_rx, + rel15_ul->qam_mod_order, + pusch_vars->log2_maxh, + symbol, + nb_re_pusch, + nvar); } stop_meas(&gNB->ulsch_mrc_stats); diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h index aa3ea6fc41..3079e5029c 100644 --- a/openair1/PHY/TOOLS/tools_defs.h +++ b/openair1/PHY/TOOLS/tools_defs.h @@ -97,6 +97,17 @@ extern "C" { #define squaredMod(a) ((a).r*(a).r + (a).i*(a).i) #define csum(res, i1, i2) (res).r = (i1).r + (i2).r ; (res).i = (i1).i + (i2).i + __attribute__((always_inline)) inline uint32_t c16amp2(const c16_t a) { + return a.r * a.r + a.i * a.i; + } + + __attribute__((always_inline)) inline c16_t c16sub(const c16_t a, const c16_t b) { + return (c16_t) { + .r = (int16_t) (a.r - b.r), + .i = (int16_t) (a.i - b.i) + }; + } + __attribute__((always_inline)) inline c16_t c16Shift(const c16_t a, const int Shift) { return (c16_t) { .r = (int16_t)(a.r >> Shift), diff --git a/openair1/SCHED/ru_procedures.c b/openair1/SCHED/ru_procedures.c index fc566db485..fdeb58ead1 100644 --- a/openair1/SCHED/ru_procedures.c +++ b/openair1/SCHED/ru_procedures.c @@ -618,7 +618,7 @@ void init_fep_thread(RU_t *ru, void kill_fep_thread(RU_t *ru) { RU_proc_t *proc = &ru->proc; - if (proc->pthread_fep == 0) + if (proc->pthread_fep[0] == 0) return; pthread_mutex_lock( &proc->mutex_fep[0] ); proc->instance_cnt_fep[0] = 0; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 7060d13e51..24cacd092f 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -602,9 +602,8 @@ void fill_ul_rb_mask(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { for (int ULSCH_id = 0; ULSCH_id < gNB->max_nb_pusch; ULSCH_id++) { NR_gNB_ULSCH_t *ulsch = &gNB->ulsch[ULSCH_id]; - int harq_pid; NR_UL_gNB_HARQ_t *ulsch_harq = ulsch->harq_process; - AssertFatal(ulsch_harq != NULL, "harq_pid %d is not allocated\n", harq_pid); + AssertFatal(ulsch_harq != NULL, "harq_pid %d is not allocated\n", ulsch->harq_pid); if ((ulsch->active == true) && (ulsch->frame == frame_rx) && (ulsch->slot == slot_rx) && (ulsch->handled == 0)) { uint8_t symbol_start = ulsch_harq->ulsch_pdu.start_symbol_index; uint8_t symbol_end = symbol_start + ulsch_harq->ulsch_pdu.nr_of_symbols; diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c index 64ec900b2a..adc5a013e6 100644 --- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c +++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c @@ -255,7 +255,6 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response pdu_0_1->ul_cqi = 255; pdu_0_1->timing_advance = 0; pdu_0_1->rssi = 0; - if (mac->nr_ue_emul_l1.num_harqs > 0) { int harq_index = 0; pdu_0_1->pduBitmap = 2; // (value->pduBitmap >> 1) & 0x01) == HARQ and (value->pduBitmap) & 0x01) == SR diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index 5f9beb9ddc..4cdc6e1882 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -58,7 +58,7 @@ //#include "openair2/LAYER2/NR_MAC_UE/mac_proto.h" #include "LAYER2/NR_MAC_gNB/mac_proto.h" #include "NR_asn_constant.h" -#include "RRC/NR/MESSAGES/asn1_msg.h" +#include "RRC/NR/nr_rrc_config.h" #include "openair1/SIMULATION/RF/rf.h" #include "openair1/SIMULATION/TOOLS/sim.h" #include "openair1/SIMULATION/NR_PHY/nr_unitary_defs.h" @@ -641,8 +641,6 @@ int main(int argc, char **argv) RC.nb_nr_mac_CC[i] = 1; mac_top_init_gNB(ngran_gNB); gNB_mac = RC.nrmac[0]; - gNB_RRC_INST rrc; - memset((void*)&rrc,0,sizeof(rrc)); gNB_mac->dl_bler.harq_round_max = num_rounds; @@ -688,20 +686,16 @@ int main(int argc, char **argv) NR_ServingCellConfigCommon_t *scc = secondaryCellGroup->spCellConfig->reconfigurationWithSync->spCellConfigCommon; */ + NR_ServingCellConfigCommon_t *scc = calloc(1,sizeof(*scc));; + prepare_scc(scc); + uint64_t ssb_bitmap = 1; // Enable only first SSB with index ssb_indx=0 + fill_scc_sim(scc, &ssb_bitmap, N_RB_DL, N_RB_DL, mu, mu); + fix_scc(scc, ssb_bitmap); - rrc.carrier.servingcellconfigcommon = calloc(1,sizeof(*rrc.carrier.servingcellconfigcommon)); - - NR_ServingCellConfigCommon_t *scc = rrc.carrier.servingcellconfigcommon; - NR_ServingCellConfig_t *scd = calloc(1,sizeof(NR_ServingCellConfig_t)); - NR_CellGroupConfig_t *secondaryCellGroup=calloc(1,sizeof(*secondaryCellGroup)); - prepare_scc(rrc.carrier.servingcellconfigcommon); - uint64_t ssb_bitmap = 1; - fill_scc_sim(rrc.carrier.servingcellconfigcommon,&ssb_bitmap,N_RB_DL,N_RB_DL,mu,mu); - ssb_bitmap = 1;// Enable only first SSB with index ssb_indx=0 - fix_scc(scc,ssb_bitmap); + NR_ServingCellConfig_t *scd = calloc(1,sizeof(*scd)); prepare_scd(scd); - rrc_pdsch_AntennaPorts_t pdsch_AntennaPorts; + rrc_pdsch_AntennaPorts_t pdsch_AntennaPorts = {0}; pdsch_AntennaPorts.N1 = n_tx>1 ? n_tx>>1 : 1; pdsch_AntennaPorts.N2 = 1; pdsch_AntennaPorts.XP = n_tx>1 ? 2 : 1; @@ -723,10 +717,11 @@ int main(int argc, char **argv) .do_SRS = 0, .force_256qam_off = false }; - fill_default_secondaryCellGroup(scc, scd, secondaryCellGroup, UE_Capability_nr, 0, 1, &conf, 0); + NR_CellGroupConfig_t *secondaryCellGroup = get_default_secondaryCellGroup(scc, scd, UE_Capability_nr, 0, 1, &conf, 0); /* RRC parameter validation for secondaryCellGroup */ fix_scd(scd); + /* -U option modify DMRS */ if(modify_dmrs) { update_dmrs_config(secondaryCellGroup, dmrs_arg); @@ -891,11 +886,8 @@ int main(int argc, char **argv) AssertFatal(input_fd==NULL,"Not ready for input signal file\n"); //Configure UE - rrc.carrier.MIB = (uint8_t*) malloc(4); - rrc.carrier.sizeof_MIB = do_MIB_NR(&rrc,0); - - nr_rrc_mac_config_req_ue(0,0,0,rrc.carrier.mib.message.choice.mib, NULL, NULL, secondaryCellGroup); - + NR_BCCH_BCH_Message_t *mib = get_new_MIB_NR(scc); + nr_rrc_mac_config_req_ue(0, 0, 0, mib->message.choice.mib, NULL, NULL, secondaryCellGroup); nr_dcireq_t dcireq; nr_scheduled_response_t scheduled_response; diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index d8ffdcc55e..f660e9559c 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -53,7 +53,7 @@ #include "openair1/SIMULATION/TOOLS/sim.h" #include "openair1/SIMULATION/RF/rf.h" #include "openair1/SIMULATION/NR_PHY/nr_unitary_defs.h" -#include "openair2/RRC/NR/MESSAGES/asn1_msg.h" +#include "openair2/RRC/NR/nr_rrc_config.h" #include "openair2/LAYER2/NR_MAC_UE/mac_proto.h" #include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h" #include "common/utils/threadPool/thread-pool.h" @@ -621,21 +621,14 @@ int main(int argc, char **argv) for (i = 0; i < RC.nb_nr_macrlc_inst; i++) RC.nb_nr_mac_CC[i] = 1; mac_top_init_gNB(ngran_gNB); - //gNB_MAC_INST* gNB_mac = RC.nrmac[0]; - gNB_RRC_INST rrc; - memset((void*)&rrc,0,sizeof(rrc)); - rrc.carrier.servingcellconfigcommon = calloc(1,sizeof(*rrc.carrier.servingcellconfigcommon)); - - NR_ServingCellConfigCommon_t *scc = rrc.carrier.servingcellconfigcommon; - NR_ServingCellConfig_t *scd = calloc(1,sizeof(NR_ServingCellConfig_t)); - NR_CellGroupConfig_t *secondaryCellGroup=calloc(1,sizeof(*secondaryCellGroup)); - prepare_scc(rrc.carrier.servingcellconfigcommon); + NR_ServingCellConfigCommon_t *scc = calloc(1,sizeof(*scc));; + prepare_scc(scc); uint64_t ssb_bitmap; - fill_scc_sim(rrc.carrier.servingcellconfigcommon,&ssb_bitmap,N_RB_DL,N_RB_DL,mu,mu); - + fill_scc_sim(scc, &ssb_bitmap, N_RB_DL, N_RB_DL, mu, mu); fix_scc(scc,ssb_bitmap); + NR_ServingCellConfig_t *scd = calloc(1,sizeof(NR_ServingCellConfig_t)); prepare_scd(scd); // TODO do a UECAP for phy-sim @@ -647,19 +640,19 @@ int main(int argc, char **argv) .do_SRS = 0, .force_256qam_off = false }; - fill_default_secondaryCellGroup(scc, scd, secondaryCellGroup, NULL, 0, 1, &conf, 0); - - // xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)secondaryCellGroup); + NR_CellGroupConfig_t *secondaryCellGroup = get_default_secondaryCellGroup(scc, scd, NULL, 0, 1, &conf, 0); /* RRC parameter validation for secondaryCellGroup */ fix_scd(scd); + NR_BCCH_BCH_Message_t *mib = get_new_MIB_NR(scc); + AssertFatal((gNB->if_inst = NR_IF_Module_init(0))!=NULL,"Cannot register interface"); gNB->if_inst->NR_PHY_config_req = nr_phy_config_request; // common configuration nr_mac_config_scc(RC.nrmac[0], conf.pdsch_AntennaPorts, n_tx, 0, 6, scc); - nr_mac_config_mib(RC.nrmac[0], &rrc.carrier.mib); + nr_mac_config_mib(RC.nrmac[0], mib); // UE dedicated configuration nr_mac_add_test_ue(RC.nrmac[0], secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity, secondaryCellGroup); frame_parms->nb_antennas_tx = 1; @@ -731,12 +724,9 @@ int main(int argc, char **argv) } //Configure UE - NR_UE_RRC_INST_t rrcue; - memset(&rrcue,0,sizeof(NR_UE_RRC_INST_t)); - rrc.carrier.MIB = (uint8_t*) malloc(4); - rrc.carrier.sizeof_MIB = do_MIB_NR(&rrc,0); - rrcue.mib = rrc.carrier.mib.message.choice.mib; - rrcue.scell_group_config=secondaryCellGroup; + NR_UE_RRC_INST_t rrcue = {0}; + rrcue.mib = mib->message.choice.mib; + rrcue.scell_group_config = secondaryCellGroup; nr_l2_init_ue(&rrcue); NR_UE_MAC_INST_t* UE_mac = get_mac_inst(0); @@ -1225,7 +1215,7 @@ int main(int argc, char **argv) tx_offset = frame_parms->get_samples_slot_timestamp(slot, frame_parms, 0); txlev_sum = 0; for (int aa = 0; aa < UE->frame_parms.nb_antennas_tx; aa++) { - atxlev[aa] = signal_energy((int32_t*)&UE->common_vars.txdata[aa][tx_offset + 5 * frame_parms->ofdm_symbol_size + 4 * frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0], + atxlev[aa] = signal_energy((int32_t *)&UE->common_vars.txdata[aa][tx_offset + 5 * frame_parms->ofdm_symbol_size + 4 * frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0], frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples); txlev_sum += atxlev[aa]; @@ -1670,7 +1660,8 @@ int main(int argc, char **argv) mapping_type, length_dmrs, num_dmrs_cdm_grps_no_data); - + + free_MIB_NR(mib); free(test_input_bit); free(estimated_output_bit); if (gNB->ldpc_offload_flag) diff --git a/openair2/COMMON/as_message.h b/openair2/COMMON/as_message.h index ef7314697f..0848714c2c 100644 --- a/openair2/COMMON/as_message.h +++ b/openair2/COMMON/as_message.h @@ -331,7 +331,9 @@ typedef struct nas_establish_req_s { * fill me */ typedef struct nas_deregistration_req_s { - // fill me + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } nas_deregistration_req_t; /* @@ -469,7 +471,11 @@ typedef ul_info_transfer_ind_t dl_info_transfer_ind_t; */ /* TODO: Quality of Service parameters */ -typedef struct {} as_qos_t; +typedef struct { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; +} as_qos_t; /* * NAS->AS - Radio access bearer establishment request diff --git a/openair2/COMMON/f1ap_messages_types.h b/openair2/COMMON/f1ap_messages_types.h index d8aac0fff1..9d507df8f3 100644 --- a/openair2/COMMON/f1ap_messages_types.h +++ b/openair2/COMMON/f1ap_messages_types.h @@ -73,7 +73,9 @@ typedef struct f1ap_net_ip_address_s { } f1ap_net_ip_address_t; typedef struct f1ap_cu_setup_req_s { - // + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } f1ap_cu_setup_req_t; typedef struct cellIDs_s { diff --git a/openair2/COMMON/m2ap_messages_types.h b/openair2/COMMON/m2ap_messages_types.h index 90d1cd386d..4187f1736c 100644 --- a/openair2/COMMON/m2ap_messages_types.h +++ b/openair2/COMMON/m2ap_messages_types.h @@ -90,7 +90,9 @@ typedef struct m2ap_net_ip_address_s { } m2ap_net_ip_address_t; typedef struct m2ap_enb_setup_req_s { - // + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_enb_setup_req_t; @@ -449,6 +451,9 @@ typedef struct m2ap_register_enb_req_s { typedef struct m2ap_subframe_process_s { /* nothing, we simply use the module ID in the header */ + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_subframe_process_t; //-------------------------------------------------------------------------------------------// @@ -533,48 +538,114 @@ typedef struct m2ap_enb_sctp_req_s { typedef struct m2ap_mbms_scheduling_information_resp_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_mbms_scheduling_information_resp_t; typedef struct m2ap_session_start_req_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_session_start_req_t; typedef struct m2ap_session_start_resp_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_session_start_resp_t; typedef struct m2ap_session_start_failure_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_session_start_failure_t; typedef struct m2ap_session_stop_req_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_session_stop_req_t; typedef struct m2ap_session_stop_resp_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_session_stop_resp_t; typedef struct m2ap_reset_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_reset_t; typedef struct m2ap_enb_configuration_update_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_enb_configuration_update_t; typedef struct m2ap_enb_configuration_update_ack_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_enb_configuration_update_ack_t; typedef struct m2ap_enb_configuration_update_failure_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_enb_configuration_update_failure_t; typedef struct m2ap_mce_configuration_update_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_mce_configuration_update_t; typedef struct m2ap_mce_configuration_update_ack_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_mce_configuration_update_ack_t; typedef struct m2ap_mce_configuration_update_failure_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_mce_configuration_update_failure_t; typedef struct m2ap_error_indication_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; }m2ap_error_indication_t; typedef struct m2ap_mbms_session_update_req_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_mbms_session_update_req_t; typedef struct m2ap_mbms_session_update_resp_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_mbms_session_update_resp_t; typedef struct m2ap_mbms_session_update_failure_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_mbms_session_update_failure_t; typedef struct m2ap_mbms_service_counting_report_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_mbms_service_counting_report_t; typedef struct m2ap_mbms_overload_notification_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_mbms_overload_notification_t; typedef struct m2ap_mbms_service_counting_req_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_mbms_service_counting_req_t; typedef struct m2ap_mbms_service_counting_resp_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_mbms_service_counting_resp_t; typedef struct m2ap_mbms_service_counting_failure_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m2ap_mbms_service_counting_failure_t; diff --git a/openair2/COMMON/m3ap_messages_types.h b/openair2/COMMON/m3ap_messages_types.h index 36ac8fcc9a..815f8b6df4 100644 --- a/openair2/COMMON/m3ap_messages_types.h +++ b/openair2/COMMON/m3ap_messages_types.h @@ -160,6 +160,9 @@ typedef struct m3ap_register_mce_req_s { typedef struct m3ap_subframe_process_s { /* nothing, we simply use the module ID in the header */ + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } m3ap_subframe_process_t; //-------------------------------------------------------------------------------------------// @@ -270,28 +273,64 @@ typedef struct m3ap_mme_sctp_req_s { typedef struct m3ap_session_start_req_s{ + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; }m3ap_session_start_req_t; typedef struct m3ap_session_start_resp_s{ + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; }m3ap_session_start_resp_t; typedef struct m3ap_session_start_failure_s{ + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; }m3ap_session_start_failure_t; typedef struct m3ap_session_stop_req_s{ + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; }m3ap_session_stop_req_t; typedef struct m3ap_session_stop_resp_s{ + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; }m3ap_session_stop_resp_t; typedef struct m3ap_session_stop_failure_s{ + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; }m3ap_session_stop_failure_t; typedef struct m3ap_error_indication_s{ + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; }m3ap_error_indication_t; typedef struct m3ap_reset_s{ + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; }m3ap_reset_t; typedef struct m3ap_reset_ack_s{ + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; }m3ap_reset_ack_t; typedef struct m3ap_mbms_session_update_req_s{ + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; }m3ap_mbms_session_update_req_t; typedef struct m3ap_mbms_session_update_resp_s{ + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; }m3ap_mbms_session_update_resp_t; typedef struct m3ap_mbms_session_update_failure_s{ + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; }m3ap_mbms_session_update_failure_t; typedef struct m3ap_setup_req_s{ /* Connexion id used between SCTP/M3AP */ @@ -306,14 +345,29 @@ typedef struct m3ap_setup_req_s{ uint16_t default_sctp_stream_id; }m3ap_setup_req_t; typedef struct m3ap_setup_resp_s{ + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; }m3ap_setup_resp_t; typedef struct m3ap_setup_failure_s{ + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; }m3ap_setup_failure_t; typedef struct m3ap_mce_configuration_update_s{ + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; }m3ap_mce_configuration_update_t; typedef struct m3ap_mce_configuration_update_ack_s{ + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; }m3ap_mce_configuration_update_ack_t; typedef struct m3ap_mce_configuration_update_failure_s{ + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; }m3ap_mce_configuration_update_failure_t; diff --git a/openair2/COMMON/phy_messages_types.h b/openair2/COMMON/phy_messages_types.h index 40e4678228..aef018db76 100644 --- a/openair2/COMMON/phy_messages_types.h +++ b/openair2/COMMON/phy_messages_types.h @@ -82,6 +82,9 @@ typedef struct PhyConfigurationReq_s { // UE: RRC -> PHY messages typedef struct PhyDeactivateReq_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } PhyDeactivateReq; typedef struct PhyFindCellReq_s { @@ -93,9 +96,15 @@ typedef struct PhyFindCellReq_s { } PhyFindCellReq; typedef struct PhyFindNextCellReq_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } PhyFindNextCellReq; typedef struct PhyMeasThresholdReq_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; # if ENABLE_RAL ral_transaction_id_t transaction_id; ral_link_cfg_param_t cfg_param; @@ -103,6 +112,9 @@ typedef struct PhyMeasThresholdReq_s { } PhyMeasThresholdReq; typedef struct PhyMeasReportInd_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; # if ENABLE_RAL ral_threshold_t threshold; ral_link_param_t link_param; @@ -119,6 +131,9 @@ typedef struct PhyFindCellInd_s { } PhyFindCellInd; typedef struct PhyMeasThresholdConf_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; # if ENABLE_RAL ral_transaction_id_t transaction_id; ral_status_t status; diff --git a/openair2/COMMON/x2ap_messages_types.h b/openair2/COMMON/x2ap_messages_types.h index cd092b6ca8..ca01be5035 100644 --- a/openair2/COMMON/x2ap_messages_types.h +++ b/openair2/COMMON/x2ap_messages_types.h @@ -174,6 +174,9 @@ typedef struct x2ap_register_enb_req_s { typedef struct x2ap_subframe_process_s { /* nothing, we simply use the module ID in the header */ + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } x2ap_subframe_process_t; //-------------------------------------------------------------------------------------------// diff --git a/openair2/ENB_APP/enb_paramdef_mme.h b/openair2/ENB_APP/enb_paramdef_mme.h index fde9b1c3a8..b1deee0e8e 100644 --- a/openair2/ENB_APP/enb_paramdef_mme.h +++ b/openair2/ENB_APP/enb_paramdef_mme.h @@ -45,9 +45,9 @@ #define MME_CONFIG_STRING_MME_M3 "enable_mme_m3" #define MMEPARAMS_DESC {\ -{MME_CONFIG_STRING_MME_ID, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \ -{MME_CONFIG_STRING_MME_NAME, NULL, 0, strptr:NULL, defstrval:"OAIMME", TYPE_STRING, 0}, \ -{MME_CONFIG_STRING_MME_M3, NULL, 0, strptr:NULL, defstrval:"no", TYPE_STRING, 0}, \ +{MME_CONFIG_STRING_MME_ID, NULL, 0, .uptr=NULL, .defintval=0, TYPE_UINT, 0}, \ +{MME_CONFIG_STRING_MME_NAME, NULL, 0, .strptr=NULL, .defstrval="OAIMME", TYPE_STRING, 0}, \ +{MME_CONFIG_STRING_MME_M3, NULL, 0, .strptr=NULL, .defstrval="no", TYPE_STRING, 0}, \ } #define MME_MME_ID_IDX 0 @@ -75,9 +75,9 @@ #define MME_NETPARAMS_DESC { \ -{MME_CONFIG_STRING_MME_INTERFACE_NAME_FOR_M3_MCE, NULL, 0, strptr:&mme_interface_name_for_m3_mce, defstrval:"lo", TYPE_STRING, 0}, \ -{MME_CONFIG_STRING_MME_IPV4_ADDRESS_FOR_M3C, NULL, 0, strptr:&mme_ipv4_address_for_m3c, defstrval:"127.0.0.18/24", TYPE_STRING, 0}, \ -{MME_CONFIG_STRING_MME_PORT_FOR_M3C, NULL, 0, uptr:&mme_port_for_m3c, defintval:36444L, TYPE_UINT, 0}, \ +{MME_CONFIG_STRING_MME_INTERFACE_NAME_FOR_M3_MCE, NULL, 0, .strptr=&mme_interface_name_for_m3_mce, .defstrval="lo", TYPE_STRING, 0}, \ +{MME_CONFIG_STRING_MME_IPV4_ADDRESS_FOR_M3C, NULL, 0, .strptr=&mme_ipv4_address_for_m3c, .defstrval="127.0.0.18/24", TYPE_STRING, 0}, \ +{MME_CONFIG_STRING_MME_PORT_FOR_M3C, NULL, 0, .uptr=&mme_port_for_m3c, .defintval=36444L, TYPE_UINT, 0}, \ } #endif diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index 97eae39842..3705f62840 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -691,7 +691,7 @@ void RCconfig_nr_prs(void) } else { - LOG_E(PHY,"No " CONFIG_STRING_PRS_CONFIG " configuration found..!!\n"); + LOG_I(PHY,"No " CONFIG_STRING_PRS_CONFIG " configuration found..!!\n"); } } @@ -1896,8 +1896,12 @@ int RCconfig_NR_DU_F1(MessageDef *msg_p, uint32_t i) { f1Setup->measurement_timing_information[k] = "0"; f1Setup->ranac[k] = 0; - f1Setup->mib[k] = rrc->carrier.MIB; - f1Setup->mib_length[k] = rrc->carrier.sizeof_MIB; + DevAssert(rrc->carrier.mib != NULL); + int buf_len = 3; // this is what we assume in monolithic + f1Setup->mib[k] = calloc(buf_len, sizeof(*f1Setup->mib[k])); + DevAssert(f1Setup->mib[k] != NULL); + f1Setup->mib_length[k] = encode_MIB_NR(rrc->carrier.mib, 0, f1Setup->mib[k], buf_len); + DevAssert(f1Setup->mib_length[k] == buf_len); NR_BCCH_DL_SCH_Message_t *bcch_message = NULL; asn_codec_ctx_t st={100*1000}; diff --git a/openair2/LAYER2/MAC/eNB_scheduler_mch.c b/openair2/LAYER2/MAC/eNB_scheduler_mch.c index 9cdc72a558..1478a98ac6 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_mch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_mch.c @@ -707,7 +707,7 @@ schedule_MBMS_NFAPI(module_id_t module_idP, uint8_t CC_id, frame_t frameP, uint16_t msi_control_element[29], *msi_ptr; // MSI buffer pointer char *buffer_pointer=NULL; - if (msi_flag == 1 && cc->mbms_SessionList) { + if (msi_flag == 1 && cc->mbms_SessionList[mbms_mch_i]) { // Create MSI here msi_ptr = &msi_control_element[0]; @@ -867,7 +867,7 @@ schedule_MBMS_NFAPI(module_id_t module_idP, uint8_t CC_id, frame_t frameP, // there is MTCHs, loop if there are more than 1 // BAd race condition: all this struct is filled by another thread, no mutex or any code to make it coherent - if (mtch_flag == 1 && cc->mbms_SessionList && cc->mbms_SessionList[0] && cc->mbms_SessionList[0]->list.array[0]) { + if (mtch_flag == 1 && cc->mbms_SessionList[0] && cc->mbms_SessionList[0]->list.array[0]) { // Calculate TBS // get MTCH data from RLC (like for DTCH) LOG_D(MAC, "[eNB %d] CC_id %d Frame %d subframeP %d: Schedule MTCH (area %d, sfAlloc %d)\n", module_idP, CC_id, frameP, subframeP, i, j); diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c index 04b7bf8975..d766e10ac8 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c @@ -4651,29 +4651,32 @@ void find_period_offset_SR(const NR_SchedulingRequestResourceConfig_t *Schedulin } } -uint16_t compute_pucch_prb_size(uint8_t format, - uint8_t nr_prbs, - uint16_t O_tot, - uint16_t O_csi, - NR_PUCCH_MaxCodeRate_t *maxCodeRate, - uint8_t Qm, - uint8_t n_symb, - uint8_t n_re_ctrl) { - - uint16_t O_crc; - - if (O_tot<12) - O_crc = 0; +int compute_pucch_crc_size(int O_uci) +{ + if (O_uci < 12) + return 0; else{ - if (O_tot<20) - O_crc = 6; + if (O_uci < 20) + return 6; else { - if (O_tot<360) - O_crc = 11; + if (O_uci < 360) + return 11; else AssertFatal(1==0,"Case for segmented PUCCH not yet implemented"); } } +} + +uint16_t compute_pucch_prb_size(uint8_t format, + uint8_t nr_prbs, + uint16_t O_uci, + NR_PUCCH_MaxCodeRate_t *maxCodeRate, + uint8_t Qm, + uint8_t n_symb, + uint8_t n_re_ctrl) +{ + int O_crc = compute_pucch_crc_size(O_uci); + int O_tot = O_uci + O_crc; int rtimes100; switch(*maxCodeRate){ @@ -4704,25 +4707,27 @@ uint16_t compute_pucch_prb_size(uint8_t format, float r = (float)rtimes100/100; - if (O_csi == O_tot) { - if ((O_tot+O_csi)>(nr_prbs*n_re_ctrl*n_symb*Qm*r)) - AssertFatal(1==0,"MaxCodeRate %.2f can't support %d UCI bits and %d CRC bits with %d PRBs", - r,O_tot,O_crc,nr_prbs); - } + AssertFatal(O_tot <= (nr_prbs * n_re_ctrl * n_symb * Qm * r), + "MaxCodeRate %.2f can't support %d UCI bits and %d CRC bits with %d PRBs", + r, + O_tot, + O_crc, + nr_prbs); if (format==2){ // TODO fix this for multiple CSI reports - for (int i=1; i<=nr_prbs; i++){ - if((O_tot+O_crc)<=(i*n_symb*Qm*n_re_ctrl*r) && - (O_tot+O_crc)>((i-1)*n_symb*Qm*n_re_ctrl*r)) + for (int i = nr_prbs; i > 0; i--) { + // compute code rate factor for next prb value + int next_prb_factor = (i - 1) * n_symb * Qm * n_re_ctrl * r; + // if it does not sa + if (O_tot > next_prb_factor) return i; } - AssertFatal(1==0,"MaxCodeRate %.2f can't support %d UCI bits and %d CRC bits with at most %d PRBs", - r,O_tot,O_crc,nr_prbs); } else{ AssertFatal(1==0,"Not yet implemented"); } + return 0; } int get_dlbw_tbslbrm(int scc_bwpsize, diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h index 58fe0899db..0fa747c3c4 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h @@ -171,7 +171,7 @@ int64_t *get_prach_config_info(frequency_range_t freq_range, uint8_t unpaired); uint16_t get_NCS(uint8_t index, uint16_t format, uint8_t restricted_set_config); - +int compute_pucch_crc_size(int O_uci); uint8_t get_l0_ul(uint8_t mapping_type, uint8_t dmrs_typeA_position); int32_t get_l_prime(uint8_t duration_in_symbols, uint8_t mapping_type, pusch_dmrs_AdditionalPosition_t additional_pos, pusch_maxLength_t pusch_maxLength, uint8_t start_symbolt, uint8_t dmrs_typeA_position); @@ -238,8 +238,7 @@ uint8_t get_pusch_nb_antenna_ports(NR_PUSCH_Config_t *pusch_Config, uint16_t compute_pucch_prb_size(uint8_t format, uint8_t nr_prbs, - uint16_t O_tot, - uint16_t O_csi, + uint16_t O_uci, NR_PUCCH_MaxCodeRate_t *maxCodeRate, uint8_t Qm, uint8_t n_symb, diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index 8dfc05952d..43194b324f 100644 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -174,7 +174,6 @@ void config_common_ue_sa(NR_UE_MAC_INST_t *mac, } } - mac->nr_band = *scc->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list.array[0]->freqBandIndicatorNR; mac->frame_type = get_frame_type(mac->nr_band, get_softmodem_params()->numerology); // cell config @@ -261,8 +260,8 @@ void config_common_ue_sa(NR_UE_MAC_INST_t *mac, void config_common_ue(NR_UE_MAC_INST_t *mac, module_id_t module_id, - int cc_idP) { - + int cc_idP) +{ fapi_nr_config_request_t *cfg = &mac->phy_config.config_req; NR_ServingCellConfigCommon_t *scc = mac->scc; int i; @@ -717,7 +716,7 @@ int nr_rrc_mac_config_req_ue(module_id_t module_id, if (sccP != NULL) { mac->scc_SIB = sccP; - LOG_D(NR_MAC, "In %s: Keeping ServingCellConfigCommonSIB\n", __FUNCTION__); + mac->nr_band = *sccP->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list.array[0]->freqBandIndicatorNR; config_common_ue_sa(mac, module_id, cc_idP); configure_current_BWP(mac, sccP, NULL); @@ -758,6 +757,7 @@ int nr_rrc_mac_config_req_ue(module_id_t module_id, ra->rach_ConfigDedicated = scell_group_config->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink; } mac->scc = scell_group_config->spCellConfig->reconfigurationWithSync->spCellConfigCommon; + mac->nr_band = *mac->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]; mac->physCellId = *mac->scc->physCellId; config_common_ue(mac,module_id,cc_idP); mac->crnti = scell_group_config->spCellConfig->reconfigurationWithSync->newUE_Identity; @@ -793,6 +793,7 @@ int nr_rrc_mac_config_req_ue(module_id_t module_id, ra->rach_ConfigDedicated = cell_group_config->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink; } mac->scc = cell_group_config->spCellConfig->reconfigurationWithSync->spCellConfigCommon; + mac->nr_band = *mac->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]; if (mac->scc_SIB) { free(mac->scc_SIB); mac->scc_SIB = NULL; diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h index 25063f3141..5418d81e92 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h @@ -336,7 +336,6 @@ typedef struct { bool ack_received; uint8_t pucch_resource_indicator; uint16_t feedback_to_ul; - int is_common; frame_t dl_frame; int dl_slot; uint8_t ack; @@ -356,19 +355,18 @@ typedef struct { } RAR_grant_t; typedef struct { - int n_HARQ_ACK; + NR_PUCCH_Resource_t *pucch_resource; uint32_t ack_payload; uint8_t sr_payload; uint32_t csi_part1_payload; uint32_t csi_part2_payload; - int resource_indicator; - int resource_set_id; - int is_common; - int initial_pucch_id; - NR_PUCCH_Resource_t *pucch_resource; + int n_sr; + int n_csi; + int n_harq; int n_CCE; int N_CCE; - int8_t delta_pucch; + int delta_pucch; + int initial_pucch_id; } PUCCH_sched_t; typedef struct { diff --git a/openair2/LAYER2/NR_MAC_UE/mac_proto.h b/openair2/LAYER2/NR_MAC_UE/mac_proto.h index c8eec75d85..867f44e640 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_proto.h @@ -197,10 +197,7 @@ bool trigger_periodic_scheduling_request(NR_UE_MAC_INST_t *mac, frame_t frame, int slot); -uint8_t nr_get_csi_measurements(NR_UE_MAC_INST_t *mac, - frame_t frame, - int slot, - PUCCH_sched_t *pucch); +int nr_get_csi_measurements(NR_UE_MAC_INST_t *mac, frame_t frame, int slot, PUCCH_sched_t *pucch); uint8_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac, PUCCH_sched_t *pucch, @@ -276,49 +273,41 @@ void set_harq_status(NR_UE_MAC_INST_t *mac, uint8_t dai, int n_CCE, int N_CCE, - int is_common, frame_t frame, int slot); -uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac, - frame_t frame, - int slot, - PUCCH_sched_t *pucch); +bool get_downlink_ack(NR_UE_MAC_INST_t *mac, frame_t frame, int slot, PUCCH_sched_t *pucch); int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, int uci_size); -void select_pucch_resource(NR_UE_MAC_INST_t *mac, - PUCCH_sched_t *pucch); +void multiplex_pucch_resource(NR_UE_MAC_INST_t *mac, PUCCH_sched_t *pucch, int num_res); int16_t get_pucch_tx_power_ue(NR_UE_MAC_INST_t *mac, int scs, NR_PUCCH_Config_t *pucch_Config, - PUCCH_sched_t *pucch, + int delta_pucch, uint8_t format_type, uint16_t nb_of_prbs, - uint8_t freq_hop_flag, - uint8_t add_dmrs_flag, + uint8_t freq_hop_flag, + uint8_t add_dmrs_flag, uint8_t N_symb_PUCCH, int subframe_number, - int O_ACK, int O_SR, - int O_CSI, int O_CRC); + int O_uci); int get_deltatf(uint16_t nb_of_prbs, uint8_t N_symb_PUCCH, uint8_t freq_hop_flag, uint8_t add_dmrs_flag, int N_sc_ctrl_RB, - int n_HARQ_ACK, - int O_ACK, int O_SR, - int O_CSI, int O_CRC); + int O_UCI); void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac, int slot, uint16_t rnti, PUCCH_sched_t *pucch, - fapi_nr_ul_config_pucch_pdu *pucch_pdu, - int O_SR, int O_ACK, int O_CSI); + fapi_nr_ul_config_pucch_pdu *pucch_pdu); +int nr_get_Pcmax(NR_UE_MAC_INST_t *mac, int Qm, bool powerBoostPi2BPSK, int scs, int N_RB_UL, bool is_transform_precoding, int n_prbs, int start_prb); /* Random Access */ diff --git a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c index 31c665524e..90775a1029 100644 --- a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c +++ b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c @@ -35,10 +35,11 @@ #include "radio/COMMON/common_lib.h" //#undef MALLOC #include "assertions.h" -#include "openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h" #include "executables/softmodem-common.h" #include "openair2/LAYER2/nr_pdcp/nr_pdcp.h" #include "openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h" +#include "nr_rlc/nr_rlc_oai_api.h" +#include "RRC/NR/MESSAGES/asn1_msg.h" #include static NR_UE_MAC_INST_t *nr_ue_mac_inst; @@ -66,9 +67,22 @@ NR_UE_MAC_INST_t * nr_l2_init_ue(NR_UE_RRC_INST_t* rrc_inst) { nr_rrc_mac_config_req_ue(0,0,0,NULL,NULL,NULL,rrc_inst->scell_group_config); AssertFatal(rlc_module_init(0) == 0, "%s: Could not initialize RLC layer\n", __FUNCTION__); if (IS_SOFTMODEM_NOS1){ + // get default noS1 configuration + NR_RadioBearerConfig_t *rbconfig = NULL; + NR_RLC_BearerConfig_t *rlc_rbconfig = NULL; + fill_nr_noS1_bearer_config(&rbconfig, &rlc_rbconfig); + struct NR_CellGroupConfig__rlc_BearerToAddModList rlc_bearer_list = { + .list = { .array = &rlc_rbconfig, .count = 1, .size = 1, } + }; + + // set up PDCP, RLC, MAC nr_pdcp_layer_init(); - nr_DRB_preconfiguration(nr_ue_mac_inst->crnti); + nr_pdcp_add_drbs(ENB_FLAG_NO, nr_ue_mac_inst->crnti, 0, rbconfig->drb_ToAddModList, 0, NULL, NULL, &rlc_bearer_list); + nr_rlc_add_drb(nr_ue_mac_inst->crnti, rbconfig->drb_ToAddModList->list.array[0]->drb_Identity, rlc_rbconfig); nr_ue_mac_inst->logicalChannelBearer_exist[0] = true; + + // free memory + free_nr_noS1_bearer_config(&rbconfig, &rlc_rbconfig); } // Allocate memory for ul_config_request in the mac instance. This is now a pointer and will // point to a list of structures (one for each UL slot) to store PUSCH scheduling parameters diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c index cfc8be87c9..65ea5e2a79 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c @@ -40,93 +40,13 @@ #include -// Implementation of 6.2.4 Configured ransmitted power -// 3GPP TS 38.101-1 version 16.5.0 Release 16 -// - -// The UE is allowed to set its configured maximum output power PCMAX,f,c for carrier f of serving cell c in each slot. -// The configured maximum output power PCMAX,f,c is set within the following bounds: PCMAX_L,f,c <= PCMAX,f,c <= PCMAX_H,f,c -// - -// Measurement units: -// - p_max: dBm -// - delta_TC_c: dB -// - P_powerclass: dBm -// - delta_P_powerclass: dB -// - MPR_c: dB -// - delta_MPR_c: dB -// - delta_T_IB_c dB -// - delta_rx_SRS dB -// note: -// - Assuming: -// -- Powerclass 3 capable UE (which is default power class unless otherwise stated) -// -- Maximum power reduction (MPR_c) for power class 3, QPSK, inner RB allocations -// -- no additional MPR (A_MPR_c) -// todo: -// - in current implementation delta_P_powerclass is not handling power classes different from 3 -long nr_get_Pcmax(module_id_t mod_id){ - - NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id); - uint32_t band = (mac->scc!=NULL) ? *mac->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0] : - *mac->scc_SIB->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list.array[0]->freqBandIndicatorNR; - NR_P_Max_t p_max = 0; - uint8_t P_powerclass = 23; - uint8_t delta_P_powerclass = 0; - uint8_t MPR_c = 1; - uint8_t delta_MPR_c = 0; - uint8_t A_MPR_c = 0; - uint8_t delta_T_IB_c = 0; - uint8_t delta_TC_c = 0; - uint8_t delta_rx_SRS = 0; - uint8_t P_MPR_c = 0; - long P_cmax_l = 0; - long P_cmax_h = 0; - long P_cmax = 0; - - if (band == 28 && mac->phy_config.config_req.carrier_config.uplink_bandwidth == 30){ - delta_MPR_c = 1; - } - - if (mac->cg && mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->ext1){ - if (*mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->ext1->powerBoostPi2BPSK == 1){ - // TbD: assuming power class 3 capable UE operating in TDD bands n40, n41, n77, n78, and n79 with Pi/2 BPSK modulation - delta_P_powerclass = -3; - p_max += 3; - } - } - - NR_P_Max_t *p_Max = (mac->scc!=NULL) ? mac->scc->uplinkConfigCommon->frequencyInfoUL->p_Max : mac->scc_SIB->uplinkConfigCommon->frequencyInfoUL.p_Max; - if (p_Max){ - - p_max += *p_Max; - - LOG_D(MAC, "In %s maximum UL transmission power p_max is %ld dBm \n", __FUNCTION__, p_max); - - P_cmax_l = min(p_max - delta_TC_c, (P_powerclass - delta_P_powerclass) - max(max(MPR_c + delta_MPR_c, A_MPR_c) + delta_T_IB_c + delta_TC_c + delta_rx_SRS, P_MPR_c)); - - P_cmax_h = min(p_max, P_powerclass - delta_P_powerclass); - - } else { - - P_cmax_l = (P_powerclass - delta_P_powerclass) - max(max(MPR_c + delta_MPR_c, A_MPR_c) + delta_T_IB_c + delta_TC_c + delta_rx_SRS, P_MPR_c); - - P_cmax_h = P_powerclass - delta_P_powerclass; - - } - - P_cmax = (P_cmax_h + P_cmax_l) / 2; - - LOG_D(MAC, "In %s configured maximum output power: %ld dBm <= PCMAX %ld dBm <= %ld dBm \n", __FUNCTION__, P_cmax_l, P_cmax, P_cmax_h); - - return P_cmax; - -} - int16_t get_prach_tx_power(module_id_t mod_id) { NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id); RA_config_t *ra = &mac->ra; int16_t pathloss = compute_nr_SSB_PL(mac, mac->ssb_measurements.ssb_rsrp_dBm); int16_t ra_preamble_rx_power = (int16_t)(ra->prach_resources.ra_PREAMBLE_RECEIVED_TARGET_POWER - pathloss + 30); - return min(nr_get_Pcmax(mod_id), ra_preamble_rx_power); + return min(ra->prach_resources.RA_PCMAX, ra_preamble_rx_power); } @@ -153,7 +73,13 @@ void init_RA(module_id_t mod_id, ra->RA_backoff_cnt = 0; prach_resources->RA_PREAMBLE_BACKOFF = 0; - prach_resources->RA_PCMAX = nr_get_Pcmax(mod_id); + NR_SubcarrierSpacing_t prach_scs = *nr_rach_ConfigCommon->msg1_SubcarrierSpacing; + int n_prbs = get_N_RA_RB (prach_scs, mac->current_UL_BWP.scs); + int start_prb = rach_ConfigGeneric->msg1_FrequencyStart + mac->current_UL_BWP.BWPStart; + int carrier_bandwidth = mac->scc_SIB ? mac->scc_SIB->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->carrierBandwidth : + mac->scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth; + // PRACH shall be as specified for QPSK modulated DFT-s-OFDM of equivalent RB allocation (38.101-1) + prach_resources->RA_PCMAX = nr_get_Pcmax(mac, 2, false, prach_scs, carrier_bandwidth, true, n_prbs, start_prb); prach_resources->RA_PREAMBLE_TRANSMISSION_COUNTER = 1; prach_resources->RA_PREAMBLE_POWER_RAMPING_COUNTER = 1; prach_resources->POWER_OFFSET_2STEP_RA = 0; @@ -488,7 +414,8 @@ void ra_preambles_config(NR_PRACH_RESOURCES_t *prach_resources, NR_UE_MAC_INST_t // Overwrite seed with non-random seed for IQ player/recorder seed = 1; } else { - seed=(unsigned int) (rdtsc_oai() && ~0); + // & to truncate the int64_t and keep only the LSB bits, up to sizeof(int) + seed = (unsigned int) (rdtsc_oai() & ~0); } RA_config_t *ra = &mac->ra; @@ -813,7 +740,6 @@ uint8_t nr_ue_get_rach(module_id_t mod_id, uint16_t sdu_lengths[NB_RB_MAX] = {0}; int TBS_bytes = 848; int mac_ce_len = 0; - int header_length_total=0; unsigned short post_padding = 1; // fill ulsch_buffer with random data @@ -823,7 +749,6 @@ uint8_t nr_ue_get_rach(module_id_t mod_id, //Sending SDUs with size 1 //Initialize elements of sdu_lengths sdu_lengths[0] = TBS_bytes - 3 - post_padding - mac_ce_len; - header_length_total += 2 + (sdu_lengths[0] >= 128); size_sdu += sdu_lengths[0]; if (size_sdu > 0) { @@ -1040,7 +965,8 @@ void nr_ra_failed(uint8_t mod_id, uint8_t CC_id, NR_PRACH_RESOURCES_t *prach_res // Overwrite seed with non-random seed for IQ player/recorder seed = 1; } else { - seed=(unsigned int) (rdtsc_oai() && ~0); + // & to truncate the int64_t and keep only the LSB bits, up to sizeof(int) + seed = (unsigned int) (rdtsc_oai() & ~0); } ra->first_Msg3 = 1; diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_power_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_power_procedures.c new file mode 100644 index 0000000000..21c726336e --- /dev/null +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_power_procedures.c @@ -0,0 +1,159 @@ +/* + * 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 ra_procedures.c + * \brief Routines for UE MAC-layer power control procedures + * \author Francesco Mani + * \date 2023 + * \version 0.1 + * \email: email@francescomani.it + * \note + * \warning + */ + +#include "LAYER2/NR_MAC_UE/mac_proto.h" + +// Implementation of 6.2.4 Configured ransmitted power +// 3GPP TS 38.101-1 version 16.5.0 Release 16 +// - +// The UE is allowed to set its configured maximum output power PCMAX,f,c for carrier f of serving cell c in each slot. +// The configured maximum output power PCMAX,f,c is set within the following bounds: PCMAX_L,f,c <= PCMAX,f,c <= PCMAX_H,f,c +// - +// Measurement units: +// - p_max: dBm +// - delta_TC_c: dB +// - P_powerclass: dBm +// - delta_P_powerclass: dB +// - MPR_c: dB +// - delta_MPR_c: dB +// - delta_T_IB_c dB +// - delta_rx_SRS dB +// note: +// - Assuming: +// -- Powerclass 3 capable UE (which is default power class unless otherwise stated) +// -- Maximum power reduction (MPR_c) for power class 3 +// -- no additional MPR (A_MPR_c) +int nr_get_Pcmax(NR_UE_MAC_INST_t *mac, int Qm, bool powerBoostPi2BPSK, int scs, int N_RB_UL, bool is_transform_precoding, int n_prbs, int start_prb) +{ + int nr_band = mac->nr_band; + if(mac->frequency_range == FR1) { + + //TODO configure P-MAX from the upper layers according to 38.331 + long *p_emax = (mac->scc!=NULL) ? mac->scc->uplinkConfigCommon->frequencyInfoUL->p_Max : mac->scc_SIB->uplinkConfigCommon->frequencyInfoUL.p_Max; + int p_powerclass = 23; // dBm assuming poweclass 3 UE + + int delta_P_powerclass = 0; // for powerclass 2 needs to be changed + if(p_emax && Qm == 1 && powerBoostPi2BPSK && (nr_band == 40 || nr_band == 41 || nr_band == 77 || nr_band == 78 || nr_band == 79)) { + *p_emax += 3; + delta_P_powerclass -= 3; + } + + // TODO to be set for CA and DC + int delta_T_IB = 0; + + // TODO in case of band 41 and PRB allocation within 4MHz of the upper or lower limit of the band -> delta_TC = 1.5 + if(nr_band == 41) + LOG_E(NR_MAC, "Need to implement delta_TC for band 41\n"); + int delta_TC = 0; + + float MPR = 0; + frame_type_t frame_type = get_frame_type(nr_band, scs); + if(compare_relative_ul_channel_bw(nr_band, scs, N_RB_UL, frame_type)) { + int rb_low = (n_prbs / 2) > 1 ? (n_prbs / 2) : 1; + int rb_high = N_RB_UL - rb_low - n_prbs; + bool is_inner_rb = start_prb >= rb_low && start_prb <= rb_high && n_prbs <= ((N_RB_UL / 2) + (N_RB_UL & 1)); + // Table 6.2.2-1 in 38.101 + switch (Qm) { + case 1 : + AssertFatal(false, "MPR for Pi/2 BPSK not implemented yet\n"); + break; + case 2 : + if (is_transform_precoding) { + if(!is_inner_rb) + MPR = 1; + } + else { + if(is_inner_rb) + MPR = 1.5; + else + MPR = 3; + } + break; + case 4 : + if (is_transform_precoding) { + if(is_inner_rb) + MPR = 1; + else + MPR = 2; + } + else { + if(is_inner_rb) + MPR = 2; + else + MPR = 3; + } + break; + case 6 : + if (is_transform_precoding) + MPR = 2.5; + else + MPR = 3.5; + break; + case 8 : + if (is_transform_precoding) + MPR = 4.5; + else + MPR = 6.5; + break; + break; + default: + AssertFatal(false, "Invalid Qm %d\n", Qm); + } + } + + int A_MPR = 0; // TODO too complicated to implement for now (see 6.2.3 in 38.101-1) + int delta_rx_SRS = 0; // TODO for SRS + int P_MPR = 0; // to ensure compliance with applicable electromagnetic energy absorption requirements + + float total_reduction = (MPR > A_MPR ? MPR : A_MPR) + delta_T_IB + delta_TC + delta_rx_SRS; + if (P_MPR > total_reduction) + total_reduction = P_MPR; + int pcmax_high, pcmax_low; + if(p_emax) { + pcmax_high = *p_emax < (p_powerclass - delta_P_powerclass) ? *p_emax : (p_powerclass - delta_P_powerclass); + pcmax_low = (*p_emax - delta_TC) < (p_powerclass - delta_P_powerclass - total_reduction) ? + (*p_emax - delta_TC) : (p_powerclass - delta_P_powerclass - total_reduction); + } + else { + pcmax_high = p_powerclass - delta_P_powerclass; + pcmax_low = p_powerclass - delta_P_powerclass - total_reduction; + } + // TODO we need a strategy to select a value between minimum and maximum allowed PC_max + int pcmax = (pcmax_low + pcmax_high) / 2; + LOG_D(MAC, "Configured maximum output power: %d dBm <= PCMAX %d dBm <= %d dBm \n", pcmax_low, pcmax, pcmax_high); + return pcmax; + } + else { + // FR2 TODO it is even more complex because it is radiated power + return 23; + } +} + diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 9542e19514..3c4fe6c2ee 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -89,6 +89,26 @@ static const int sequence_cyclic_shift_2_harq_ack_bits[4] /* HARQ-ACK Value (0,0) (0,1) (1,0) (1,1) */ /* Sequence cyclic shift */ = { 0, 3, 9, 6 }; +int get_pucch0_mcs(const int O_ACK, const int O_SR, const int ack_payload, const int sr_payload) +{ + int mcs = 0; + if (O_SR == 0 || sr_payload == 0) { /* only ack is transmitted TS 36.213 9.2.3 UE procedure for reporting HARQ-ACK */ + if (O_ACK == 1) + mcs = sequence_cyclic_shift_1_harq_ack_bit[ack_payload & 0x1]; /* only harq of 1 bit */ + else + mcs = sequence_cyclic_shift_2_harq_ack_bits[ack_payload & 0x3]; /* only harq with 2 bits */ + } else { /* SR + eventually ack are transmitted TS 36.213 9.2.5.1 UE procedure for multiplexing HARQ-ACK or CSI and SR */ + if (sr_payload == 1) { /* positive scheduling request */ + if (O_ACK == 1) + mcs = sequence_cyclic_shift_1_harq_ack_bit_positive_sr[ack_payload & 0x1]; /* positive SR and harq of 1 bit */ + else if (O_ACK == 2) + mcs = sequence_cyclic_shift_2_harq_ack_bits_positive_sr[ack_payload & 0x3]; /* positive SR and harq with 2 bits */ + else + mcs = 0; /* only positive SR */ + } + } + return mcs; +} /* TS 38.211 Table 6.4.1.3.3.2-1: DM-RS positions for PUCCH format 3 and 4 */ static const int nb_symbols_excluding_dmrs[11][2][2] @@ -633,7 +653,6 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu_1_0 = &dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.dlsch_config_rel15; NR_PDSCH_Config_t *pdsch_config = current_DL_BWP ? current_DL_BWP->pdsch_Config : NULL; - int is_common = 0; if (dci_ind->ss_type == NR_SearchSpace__searchSpaceType_PR_common) { dlsch_config_pdu_1_0->BWPSize = mac->type0_PDCCH_CSS_config.num_rbs ? mac->type0_PDCCH_CSS_config.num_rbs : current_DL_BWP->initial_BWPSize; dlsch_config_pdu_1_0->BWPStart = dci_ind->cset_start; @@ -655,10 +674,6 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr } else { dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH; } - if ((ra->RA_window_cnt >= 0 && rnti == ra->ra_rnti) || (rnti == ra->t_crnti)) { - if (mac->scc == NULL) // use coreset0 - is_common = 1; - } } /* IDENTIFIER_DCI_FORMATS */ @@ -778,46 +793,54 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr return -1; } - if(rnti != ra->ra_rnti && rnti != SI_RNTI) - AssertFatal(1+dci->pdsch_to_harq_feedback_timing_indicator.val>=DURATION_RX_TO_TX,"PDSCH to HARQ feedback time (%d) cannot be less than DURATION_RX_TO_TX (%d).\n", - 1+dci->pdsch_to_harq_feedback_timing_indicator.val,DURATION_RX_TO_TX); + if(rnti != ra->ra_rnti && rnti != SI_RNTI) + AssertFatal(1 + dci->pdsch_to_harq_feedback_timing_indicator.val >= DURATION_RX_TO_TX, "PDSCH to HARQ feedback time (%d) cannot be less than DURATION_RX_TO_TX (%d).\n", + 1 + dci->pdsch_to_harq_feedback_timing_indicator.val, DURATION_RX_TO_TX); - // set the harq status at MAC for feedback - set_harq_status(mac,dci->pucch_resource_indicator, - dci->harq_pid, - dlsch_config_pdu_1_0->accumulated_delta_PUCCH, - 1+dci->pdsch_to_harq_feedback_timing_indicator.val, - dci->dai[0].val, - dci_ind->n_CCE,dci_ind->N_CCE,is_common, - frame,slot); + // set the harq status at MAC for feedback + set_harq_status(mac, + dci->pucch_resource_indicator, + dci->harq_pid, + dlsch_config_pdu_1_0->accumulated_delta_PUCCH, + 1 + dci->pdsch_to_harq_feedback_timing_indicator.val, + dci->dai[0].val, + dci_ind->n_CCE, + dci_ind->N_CCE, + frame, + slot); - LOG_D(MAC,"(nr_ue_procedures.c) rnti = %x dl_config->number_pdus = %d\n", - dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.rnti, - dl_config->number_pdus); - LOG_D(MAC,"(nr_ue_procedures.c) frequency_domain_resource_assignment=%d \t number_rbs=%d \t start_rb=%d\n", - dci->frequency_domain_assignment.val, - dlsch_config_pdu_1_0->number_rbs, - dlsch_config_pdu_1_0->start_rb); - LOG_D(MAC,"(nr_ue_procedures.c) time_domain_resource_assignment=%d \t number_symbols=%d \t start_symbol=%d\n", - dci->time_domain_assignment.val, - dlsch_config_pdu_1_0->number_symbols, - dlsch_config_pdu_1_0->start_symbol); - LOG_D(MAC,"(nr_ue_procedures.c) vrb_to_prb_mapping=%d \n>>> mcs=%d\n>>> ndi=%d\n>>> rv=%d\n>>> harq_process_nbr=%d\n>>> dai=%d\n>>> scaling_factor_S=%f\n>>> tpc_pucch=%d\n>>> pucch_res_ind=%d\n>>> pdsch_to_harq_feedback_time_ind=%d\n", - dlsch_config_pdu_1_0->vrb_to_prb_mapping, - dlsch_config_pdu_1_0->mcs, - dlsch_config_pdu_1_0->ndi, - dlsch_config_pdu_1_0->rv, - dlsch_config_pdu_1_0->harq_process_nbr, - dci->dai[0].val, - dlsch_config_pdu_1_0->scaling_factor_S, - dlsch_config_pdu_1_0->accumulated_delta_PUCCH, - dci->pucch_resource_indicator, - 1+dci->pdsch_to_harq_feedback_timing_indicator.val); + LOG_D(MAC, + "(nr_ue_procedures.c) rnti = %x dl_config->number_pdus = %d\n", + dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.rnti, + dl_config->number_pdus); + LOG_D(MAC, + "(nr_ue_procedures.c) frequency_domain_resource_assignment=%d \t number_rbs=%d \t start_rb=%d\n", + dci->frequency_domain_assignment.val, + dlsch_config_pdu_1_0->number_rbs, + dlsch_config_pdu_1_0->start_rb); + LOG_D(MAC, + "(nr_ue_procedures.c) time_domain_resource_assignment=%d \t number_symbols=%d \t start_symbol=%d\n", + dci->time_domain_assignment.val, + dlsch_config_pdu_1_0->number_symbols, + dlsch_config_pdu_1_0->start_symbol); + LOG_D(MAC, + "(nr_ue_procedures.c) vrb_to_prb_mapping=%d \n>>> mcs=%d\n>>> ndi=%d\n>>> rv=%d\n>>> harq_process_nbr=%d\n>>> dai=%d\n>>> " + "scaling_factor_S=%f\n>>> tpc_pucch=%d\n>>> pucch_res_ind=%d\n>>> pdsch_to_harq_feedback_time_ind=%d\n", + dlsch_config_pdu_1_0->vrb_to_prb_mapping, + dlsch_config_pdu_1_0->mcs, + dlsch_config_pdu_1_0->ndi, + dlsch_config_pdu_1_0->rv, + dlsch_config_pdu_1_0->harq_process_nbr, + dci->dai[0].val, + dlsch_config_pdu_1_0->scaling_factor_S, + dlsch_config_pdu_1_0->accumulated_delta_PUCCH, + dci->pucch_resource_indicator, + 1 + dci->pdsch_to_harq_feedback_timing_indicator.val); + + dlsch_config_pdu_1_0->k1_feedback = 1 + dci->pdsch_to_harq_feedback_timing_indicator.val; + + LOG_D(MAC, "(nr_ue_procedures.c) pdu_type=%d\n\n", dl_config->dl_config_list[dl_config->number_pdus].pdu_type); - dlsch_config_pdu_1_0->k1_feedback = 1+dci->pdsch_to_harq_feedback_timing_indicator.val; - - LOG_D(MAC,"(nr_ue_procedures.c) pdu_type=%d\n\n",dl_config->dl_config_list[dl_config->number_pdus].pdu_type); - dl_config->number_pdus = dl_config->number_pdus + 1; break; @@ -1101,13 +1124,16 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr feedback_ti,DURATION_RX_TO_TX); // set the harq status at MAC for feedback - set_harq_status(mac,dci->pucch_resource_indicator, + set_harq_status(mac, + dci->pucch_resource_indicator, dci->harq_pid, dlsch_config_pdu_1_1->accumulated_delta_PUCCH, feedback_ti, dci->dai[0].val, - dci_ind->n_CCE,dci_ind->N_CCE, - 0,frame,slot); + dci_ind->n_CCE, + dci_ind->N_CCE, + frame, + slot); dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH; LOG_D(MAC,"(nr_ue_procedures.c) pdu_type=%d\n\n",dl_config->dl_config_list[dl_config->number_pdus].pdu_type); @@ -1201,7 +1227,6 @@ void set_harq_status(NR_UE_MAC_INST_t *mac, uint8_t dai, int n_CCE, int N_CCE, - int is_common, frame_t frame, int slot) { @@ -1211,7 +1236,6 @@ void set_harq_status(NR_UE_MAC_INST_t *mac, current_harq->ack_received = false; current_harq->pucch_resource_indicator = pucch_id; current_harq->feedback_to_ul = data_toul_fb; - current_harq->is_common = is_common; current_harq->dai = dai; current_harq->n_CCE = n_CCE; current_harq->N_CCE = N_CCE; @@ -1231,16 +1255,12 @@ void set_harq_status(NR_UE_MAC_INST_t *mac, harq_id, current_harq->dl_frame, current_harq->dl_slot, frame, slot); } - void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac, int slot, uint16_t rnti, PUCCH_sched_t *pucch, - fapi_nr_ul_config_pucch_pdu *pucch_pdu, - int O_SR, int O_ACK, int O_CSI) { - - int O_CRC = 0; //FIXME - uint16_t O_uci = O_CSI + O_ACK; + fapi_nr_ul_config_pucch_pdu *pucch_pdu) +{ NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP; NR_UE_DL_BWP_t *current_DL_BWP = &mac->current_DL_BWP; NR_PUCCH_FormatConfig_t *pucchfmt; @@ -1253,7 +1273,7 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac, pucch_pdu->rnti = rnti; - LOG_D(NR_MAC,"initial_pucch_id %d, pucch_resource %p\n",pucch->initial_pucch_id,pucch->pucch_resource); + LOG_D(NR_MAC, "initial_pucch_id %d, pucch_resource %p\n", pucch->initial_pucch_id, pucch->pucch_resource); // configure pucch from Table 9.2.1-1 // only for ack/nack if (pucch->initial_pucch_id > -1 && @@ -1286,12 +1306,8 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac, } pucch_pdu->freq_hop_flag = 1; pucch_pdu->time_domain_occ_idx = 0; - - if (O_ACK == 1) - pucch_pdu->mcs = sequence_cyclic_shift_1_harq_ack_bit[pucch->ack_payload & 0x1]; /* only harq of 1 bit */ - else - pucch_pdu->mcs = sequence_cyclic_shift_2_harq_ack_bits[pucch->ack_payload & 0x3]; /* only harq with 2 bits */ - + // Only HARQ transmitted in default PUCCH + pucch_pdu->mcs = get_pucch0_mcs(pucch->n_harq, 0, pucch->ack_payload, 0); pucch_pdu->payload = pucch->ack_payload; } else if (pucch->pucch_resource != NULL) { @@ -1327,11 +1343,14 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac, pucch_pdu->second_hop_prb = pucchres->secondHopPRB!= NULL ? *pucchres->secondHopPRB : 0; pucch_pdu->prb_size = 1; // format 0 or 1 - if ((O_SR+O_CSI+O_SR) > (sizeof(uint64_t)*8)) { + int n_uci = pucch->n_sr + pucch->n_harq + pucch->n_csi; + if (n_uci > (sizeof(uint64_t) * 8)) { LOG_E(MAC,"PUCCH number of UCI bits exceeds payload size\n"); return; } - pucch_pdu->payload = (pucch->csi_part1_payload << (O_ACK + O_SR)) | (pucch->sr_payload << O_ACK) | pucch->ack_payload; + if (pucchres->format.present != NR_PUCCH_Resource__format_PR_format0) + pucch_pdu->payload = + (pucch->csi_part1_payload << (pucch->n_harq + pucch->n_sr)) | (pucch->sr_payload << pucch->n_harq) | pucch->ack_payload; switch(pucchres->format.present) { case NR_PUCCH_Resource__format_PR_format0 : @@ -1339,22 +1358,7 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac, pucch_pdu->initial_cyclic_shift = pucchres->format.choice.format0->initialCyclicShift; pucch_pdu->nr_of_symbols = pucchres->format.choice.format0->nrofSymbols; pucch_pdu->start_symbol_index = pucchres->format.choice.format0->startingSymbolIndex; - if (O_SR == 0 || pucch->sr_payload == 0) { /* only ack is transmitted TS 36.213 9.2.3 UE procedure for reporting HARQ-ACK */ - if (O_ACK == 1) - pucch_pdu->mcs = sequence_cyclic_shift_1_harq_ack_bit[pucch->ack_payload & 0x1]; /* only harq of 1 bit */ - else - pucch_pdu->mcs = sequence_cyclic_shift_2_harq_ack_bits[pucch->ack_payload & 0x3]; /* only harq with 2 bits */ - } - else { /* SR + eventually ack are transmitted TS 36.213 9.2.5.1 UE procedure for multiplexing HARQ-ACK or CSI and SR */ - if (pucch->sr_payload == 1) { /* positive scheduling request */ - if (O_ACK == 1) - pucch_pdu->mcs = sequence_cyclic_shift_1_harq_ack_bit_positive_sr[pucch->ack_payload & 0x1]; /* positive SR and harq of 1 bit */ - else if (O_ACK == 2) - pucch_pdu->mcs = sequence_cyclic_shift_2_harq_ack_bits_positive_sr[pucch->ack_payload & 0x3]; /* positive SR and harq with 2 bits */ - else - pucch_pdu->mcs = 0; /* only positive SR */ - } - } + pucch_pdu->mcs = get_pucch0_mcs(pucch->n_harq, pucch->n_sr, pucch->ack_payload, pucch->sr_payload); break; case NR_PUCCH_Resource__format_PR_format1 : pucch_pdu->format_type = 1; @@ -1365,18 +1369,22 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac, break; case NR_PUCCH_Resource__format_PR_format2 : pucch_pdu->format_type = 2; - pucch_pdu->n_bit = O_uci+O_SR; + pucch_pdu->n_bit = n_uci; pucch_pdu->nr_of_symbols = pucchres->format.choice.format2->nrofSymbols; pucch_pdu->start_symbol_index = pucchres->format.choice.format2->startingSymbolIndex; pucch_pdu->data_scrambling_id = pusch_id != NULL ? *pusch_id : mac->physCellId; pucch_pdu->dmrs_scrambling_id = id0 != NULL ? *id0 : mac->physCellId; - pucch_pdu->prb_size = compute_pucch_prb_size(2,pucchres->format.choice.format2->nrofPRBs, - O_uci+O_SR,O_CSI,pucch_Config->format2->choice.setup->maxCodeRate, - 2,pucchres->format.choice.format2->nrofSymbols,8); + pucch_pdu->prb_size = compute_pucch_prb_size(2, + pucchres->format.choice.format2->nrofPRBs, + n_uci, + pucch_Config->format2->choice.setup->maxCodeRate, + 2, + pucchres->format.choice.format2->nrofSymbols, + 8); break; case NR_PUCCH_Resource__format_PR_format3 : pucch_pdu->format_type = 3; - pucch_pdu->n_bit = O_uci+O_SR; + pucch_pdu->n_bit = n_uci; pucch_pdu->nr_of_symbols = pucchres->format.choice.format3->nrofSymbols; pucch_pdu->start_symbol_index = pucchres->format.choice.format3->startingSymbolIndex; pucch_pdu->data_scrambling_id = pusch_id != NULL ? *pusch_id : mac->physCellId; @@ -1398,9 +1406,13 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac, else f3_dmrs_symbols = 2<add_dmrs_flag; } - pucch_pdu->prb_size = compute_pucch_prb_size(3,pucchres->format.choice.format3->nrofPRBs, - O_uci+O_SR,O_CSI,pucch_Config->format3->choice.setup->maxCodeRate, - 2-pucch_pdu->pi_2bpsk,pucchres->format.choice.format3->nrofSymbols-f3_dmrs_symbols,12); + pucch_pdu->prb_size = compute_pucch_prb_size(3, + pucchres->format.choice.format3->nrofPRBs, + n_uci, + pucch_Config->format3->choice.setup->maxCodeRate, + 2 - pucch_pdu->pi_2bpsk, + pucchres->format.choice.format3->nrofSymbols - f3_dmrs_symbols, + 12); break; case NR_PUCCH_Resource__format_PR_format4 : pucch_pdu->format_type = 4; @@ -1426,17 +1438,16 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac, pucch_pdu->pucch_tx_power = get_pucch_tx_power_ue(mac, scs, pucch_Config, - pucch, + pucch->delta_pucch, pucch_pdu->format_type, pucch_pdu->prb_size, pucch_pdu->freq_hop_flag, pucch_pdu->add_dmrs_flag, pucch_pdu->nr_of_symbols, subframe_number, - O_ACK, O_SR, - O_CSI, O_CRC); - } - else AssertFatal(1==0,"problem with pucch configuration\n"); + n_uci); + } else + AssertFatal(1 == 0, "problem with pucch configuration\n"); NR_PUCCH_ConfigCommon_t *pucch_ConfigCommon = current_UL_BWP->pucch_ConfigCommon; @@ -1463,22 +1474,21 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac, break; default: AssertFatal(1==0,"Group hopping flag undefined (0,1,2) \n"); - } + } } - int16_t get_pucch_tx_power_ue(NR_UE_MAC_INST_t *mac, int scs, NR_PUCCH_Config_t *pucch_Config, - PUCCH_sched_t *pucch, + int delta_pucch, uint8_t format_type, uint16_t nb_of_prbs, - uint8_t freq_hop_flag, - uint8_t add_dmrs_flag, + uint8_t freq_hop_flag, + uint8_t add_dmrs_flag, uint8_t N_symb_PUCCH, int subframe_number, - int O_ACK, int O_SR, - int O_CSI, int O_CRC) { + int O_uci) +{ NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP; int PUCCH_POWER_DEFAULT = 0; int16_t P_O_NOMINAL_PUCCH = *current_UL_BWP->pucch_ConfigCommon->p0_nominal; @@ -1501,7 +1511,7 @@ int16_t get_pucch_tx_power_ue(NR_UE_MAC_INST_t *mac, G_b_f_c = 0; } else { - G_b_f_c = pucch->delta_pucch; + G_b_f_c = delta_pucch; LOG_E(MAC,"PUCCH Transmit power control command not yet implemented for NR\n"); return (PUCCH_POWER_DEFAULT); } @@ -1527,38 +1537,17 @@ int16_t get_pucch_tx_power_ue(NR_UE_MAC_INST_t *mac, break; case 2: N_sc_ctrl_RB = 10; - DELTA_TF = get_deltatf(nb_of_prbs, - N_symb_PUCCH, - freq_hop_flag, - add_dmrs_flag, - N_sc_ctrl_RB, - pucch->n_HARQ_ACK, - O_ACK, O_SR, - O_CSI, O_CRC); + DELTA_TF = get_deltatf(nb_of_prbs, N_symb_PUCCH, freq_hop_flag, add_dmrs_flag, N_sc_ctrl_RB, O_uci); delta_F_PUCCH = *power_config->deltaF_PUCCH_f2; break; case 3: N_sc_ctrl_RB = 14; - DELTA_TF = get_deltatf(nb_of_prbs, - N_symb_PUCCH, - freq_hop_flag, - add_dmrs_flag, - N_sc_ctrl_RB, - pucch->n_HARQ_ACK, - O_ACK, O_SR, - O_CSI, O_CRC); + DELTA_TF = get_deltatf(nb_of_prbs, N_symb_PUCCH, freq_hop_flag, add_dmrs_flag, N_sc_ctrl_RB, O_uci); delta_F_PUCCH = *power_config->deltaF_PUCCH_f3; break; case 4: N_sc_ctrl_RB = 14/(nb_pucch_format_4_in_subframes[subframe_number]); - DELTA_TF = get_deltatf(nb_of_prbs, - N_symb_PUCCH, - freq_hop_flag, - add_dmrs_flag, - N_sc_ctrl_RB, - pucch->n_HARQ_ACK, - O_ACK, O_SR, - O_CSI, O_CRC); + DELTA_TF = get_deltatf(nb_of_prbs, N_symb_PUCCH, freq_hop_flag, add_dmrs_flag, N_sc_ctrl_RB, O_uci); delta_F_PUCCH = *power_config->deltaF_PUCCH_f4; break; default: @@ -1568,7 +1557,7 @@ int16_t get_pucch_tx_power_ue(NR_UE_MAC_INST_t *mac, } } - if (*power_config->twoPUCCH_PC_AdjustmentStates > 1) { + if (power_config->twoPUCCH_PC_AdjustmentStates && *power_config->twoPUCCH_PC_AdjustmentStates > 1) { LOG_E(MAC,"PUCCH power control adjustment states with 2 states not yet implemented\n"); return (PUCCH_POWER_DEFAULT); } @@ -1589,20 +1578,18 @@ int get_deltatf(uint16_t nb_of_prbs, uint8_t freq_hop_flag, uint8_t add_dmrs_flag, int N_sc_ctrl_RB, - int n_HARQ_ACK, - int O_ACK, int O_SR, - int O_CSI, int O_CRC){ - + int O_UCI) +{ int DELTA_TF; - int O_UCI = O_ACK + O_SR + O_CSI + O_CRC; + int O_CRC = compute_pucch_crc_size(O_UCI); int N_symb = nb_symbols_excluding_dmrs[N_symb_PUCCH-4][add_dmrs_flag][freq_hop_flag]; float N_RE = nb_of_prbs * N_sc_ctrl_RB * N_symb; float K1 = 6; - if (O_UCI < 12) - DELTA_TF = 10 * log10((double)(((K1 * (n_HARQ_ACK + O_SR + O_CSI))/N_RE))); + if (O_UCI + O_CRC < 12) + DELTA_TF = 10 * log10((double)(((K1 * (O_UCI)) / N_RE))); else { float K2 = 2.4; - float BPRE = O_UCI/N_RE; + float BPRE = (O_UCI + O_CRC) / N_RE; DELTA_TF = 10 * log10((double)(pow(2,(K2*BPRE)) - 1)); } return DELTA_TF; @@ -1623,7 +1610,8 @@ int get_deltatf(uint16_t nb_of_prbs, * *********************************************************************/ -int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, int uci_size) { +int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, int size) +{ int pucch_resource_set_id = 0; NR_PUCCH_Config_t *pucch_Config = mac->current_UL_BWP.pucch_Config; @@ -1636,16 +1624,15 @@ int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, int uci_size) { -- The field is not present in the last configured set since the UE derives its maximum payload size as specified in 38.213. -- This field can take integer values that are multiples of 4. Corresponds to L1 parameter 'N_2' or 'N_3' (see 38.213, section 9.2) */ - /* look for the first resource set which supports uci_size number of bits for payload */ + /* look for the first resource set which supports size number of bits for payload */ while (pucch_resource_set_id < MAX_NB_OF_PUCCH_RESOURCE_SETS) { if (pucch_Config && pucch_Config->resourceSetToAddModList && pucch_Config->resourceSetToAddModList->list.array[pucch_resource_set_id] != NULL) { // PUCCH with format0 can be up to 3 bits (2 ack/nacks + 1 sr is 3 max bits) - if (uci_size <= 3) { + if (size <= 3) { pucch_resource_set_id = 0; return (pucch_resource_set_id); break; - } - else { + } else { pucch_resource_set_id = 1; return (pucch_resource_set_id); break; @@ -1659,68 +1646,466 @@ int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, int uci_size) { return (pucch_resource_set_id); } - -/******************************************************************* -* -* NAME : select_pucch_format -* -* PARAMETERS : ue context -* processing slots of reception/transmission -* gNB_id identifier -* -* RETURN : true a valid resource has been found -* -* DESCRIPTION : return tx harq process identifier for given transmission slot -* TS 38.213 9.2.1 PUCCH Resource Sets -* TS 38.213 9.2.2 PUCCH Formats for UCI transmission -* In the case of pucch for scheduling request only, resource is already get from scheduling request configuration -* -*********************************************************************/ - -void select_pucch_resource(NR_UE_MAC_INST_t *mac, PUCCH_sched_t *pucch) +NR_PUCCH_Resource_t *find_pucch_resource_from_list(struct NR_PUCCH_Config__resourceToAddModList *resourceToAddModList, + long resource_id) { - NR_PUCCH_ResourceId_t *current_resource_id = NULL; - NR_PUCCH_Config_t *pucch_Config = mac->current_UL_BWP.pucch_Config; - int n_list; - if (pucch->is_common == 1 || !pucch_Config || !pucch_Config->resourceSetToAddModList || pucch_Config->resourceSetToAddModList->list.array[0] == NULL) { - /* see TS 38.213 9.2.1 PUCCH Resource Sets */ - int delta_PRI = pucch->resource_indicator; - int n_CCE_0 = pucch->n_CCE; - int N_CCE_0 = pucch->N_CCE; - if (N_CCE_0 == 0) { - AssertFatal(1==0,"PUCCH No compatible pucch format found\n"); - } - int r_PUCCH = ((2 * n_CCE_0)/N_CCE_0) + (2 * delta_PRI); - pucch->initial_pucch_id = r_PUCCH; - pucch->pucch_resource = NULL; - } else { - struct NR_PUCCH_Config__resourceSetToAddModList *resourceSetToAddModList = pucch_Config->resourceSetToAddModList; - struct NR_PUCCH_Config__resourceToAddModList *resourceToAddModList = pucch_Config->resourceToAddModList; - n_list = resourceSetToAddModList->list.count; - if (pucch->resource_set_id > n_list) { - LOG_E(MAC,"Invalid PUCCH resource set id %d\n",pucch->resource_set_id); - pucch->pucch_resource = NULL; - return; - } - n_list = resourceSetToAddModList->list.array[pucch->resource_set_id]->resourceList.list.count; - if (pucch->resource_indicator > n_list) { - LOG_E(MAC,"Invalid PUCCH resource id %d\n",pucch->resource_indicator); - pucch->pucch_resource = NULL; - return; - } - current_resource_id = resourceSetToAddModList->list.array[pucch->resource_set_id]->resourceList.list.array[pucch->resource_indicator]; - n_list = resourceToAddModList->list.count; - int res_found = 0; - for (int i=0; ilist.array[i]->pucch_ResourceId == *current_resource_id) { - pucch->pucch_resource = resourceToAddModList->list.array[i]; - res_found = 1; - break; + NR_PUCCH_Resource_t *pucch_resource = NULL; + int n_list = resourceToAddModList->list.count; + for (int i = 0; i < n_list; i++) { + if (resourceToAddModList->list.array[i]->pucch_ResourceId == resource_id) + pucch_resource = resourceToAddModList->list.array[i]; + } + return pucch_resource; +} + +bool check_mux_acknack_csi(NR_PUCCH_Resource_t *csi_res, NR_PUCCH_Config_t *pucch_Config) +{ + bool ret; + switch (csi_res->format.present) { + case NR_PUCCH_Resource__format_PR_format2: + ret = pucch_Config->format2->choice.setup->simultaneousHARQ_ACK_CSI ? true : false; + break; + case NR_PUCCH_Resource__format_PR_format3: + ret = pucch_Config->format3->choice.setup->simultaneousHARQ_ACK_CSI ? true : false; + break; + case NR_PUCCH_Resource__format_PR_format4: + ret = pucch_Config->format4->choice.setup->simultaneousHARQ_ACK_CSI ? true : false; + break; + default: + AssertFatal(false, "Invalid PUCCH format for CSI\n"); + } + return ret; +} + +void get_pucch_start_symbol_length(NR_PUCCH_Resource_t *pucch_resource, int *start, int *length) +{ + switch (pucch_resource->format.present) { + case NR_PUCCH_Resource__format_PR_format0: + *length = pucch_resource->format.choice.format0->nrofSymbols; + *start = pucch_resource->format.choice.format0->startingSymbolIndex; + break; + case NR_PUCCH_Resource__format_PR_format1: + *length = pucch_resource->format.choice.format1->nrofSymbols; + *start = pucch_resource->format.choice.format1->startingSymbolIndex; + break; + case NR_PUCCH_Resource__format_PR_format2: + *length = pucch_resource->format.choice.format2->nrofSymbols; + *start = pucch_resource->format.choice.format2->startingSymbolIndex; + break; + case NR_PUCCH_Resource__format_PR_format3: + *length = pucch_resource->format.choice.format3->nrofSymbols; + *start = pucch_resource->format.choice.format3->startingSymbolIndex; + break; + case NR_PUCCH_Resource__format_PR_format4: + *length = pucch_resource->format.choice.format4->nrofSymbols; + *start = pucch_resource->format.choice.format4->startingSymbolIndex; + break; + default: + AssertFatal(false, "Invalid PUCCH format\n"); + } +} + +// Ref. 38.213 section 9.2.5 order(Q) +void order_resources(PUCCH_sched_t *pucch, int num_res) +{ + int k = 0; + while (k < num_res - 1) { + int l = 0; + while (l < num_res - 1 - k) { + NR_PUCCH_Resource_t *pucch_resource = pucch[l].pucch_resource; + int curr_start, curr_length; + get_pucch_start_symbol_length(pucch_resource, &curr_start, &curr_length); + pucch_resource = pucch[l + 1].pucch_resource; + int next_start, next_length; + get_pucch_start_symbol_length(pucch_resource, &next_start, &next_length); + if (curr_start > next_start || (curr_start == next_start && curr_length < next_length)) { + // swap resources + PUCCH_sched_t temp_res = pucch[l]; + pucch[l] = pucch[l + 1]; + pucch[l + 1] = temp_res; } + l++; } - if (res_found == 0) { - LOG_E(MAC,"Couldn't find PUCCH Resource\n"); - pucch->pucch_resource = NULL; + k++; + } +} + +bool check_overlapping_resources(int curr_start, int curr_length, int next_start, int next_length) +{ + // assuming overlapping means if two resources overlaps in time, + // ie share a symbol in the slot regardless of PRB + if (curr_start == next_start) + return true; + if (curr_start + curr_length - 1 < next_start) + return false; + else + return true; +} + +// 38.213 section 9.2.5 +void merge_resources(PUCCH_sched_t *res, int num_res, NR_PUCCH_Config_t *pucch_Config) +{ + PUCCH_sched_t empty = {0}; + for (int i = 0; i < num_res - 1; i++) { + NR_PUCCH_Resource_t *curr_resource = res[i].pucch_resource; + NR_PUCCH_Resource_t *next_resource = res[i + 1].pucch_resource; + switch (curr_resource->format.present) { + case NR_PUCCH_Resource__format_PR_format0: + switch (next_resource->format.present) { + case NR_PUCCH_Resource__format_PR_format0: + if (res[i].n_sr > 0 && res[i].n_harq == 0 && res[i + 1].n_sr == 0 && res[i + 1].n_harq > 0) { + // we multiplex SR and HARQ in the HARQ resource + res[i + 1].n_sr = res[i].n_sr; + res[i + 1].sr_payload = res[i].sr_payload; + res[i] = empty; + } else if (res[i].n_sr == 0 && res[i].n_harq > 0 && res[i + 1].n_sr > 0 && res[i + 1].n_harq == 0) { + // we multiplex SR and HARQ in the HARQ resource and move it to the i+1 spot + res[i].n_sr = res[i + 1].n_sr; + res[i].sr_payload = res[i + 1].sr_payload; + res[i + 1] = res[i]; + res[i] = empty; + } else + AssertFatal( + false, + "We cannot multiplex more than 1 SR into a PUCCH F0 and we don't expect more than 1 PUCCH with HARQ per slot\n"); + break; + case NR_PUCCH_Resource__format_PR_format1: + if (res[i].n_sr > 0 && res[i].n_harq == 0 && res[i + 1].n_sr == 0 && res[i + 1].n_harq > 0) + // we transmit only HARQ in F1 + res[i] = empty; + else if (res[i].n_sr == 0 && res[i].n_harq > 0 && res[i + 1].n_sr > 0 && res[i + 1].n_harq == 0) { + // we multiplex SR and HARQ in the HARQ F0 resource and move it to the i+1 spot + res[i].n_sr = res[i + 1].n_sr; + res[i].sr_payload = res[i + 1].sr_payload; + res[i + 1] = res[i]; + res[i] = empty; + } else + AssertFatal( + false, + "We cannot multiplex more than 1 SR into a PUCCH F0 and we don't expect more than 1 PUCCH with HARQ per slot\n"); + break; + case NR_PUCCH_Resource__format_PR_format2: + case NR_PUCCH_Resource__format_PR_format3: + case NR_PUCCH_Resource__format_PR_format4: + if (res[i].n_sr > 0 && res[i].n_harq == 0) { + AssertFatal(res[i + 1].n_sr == 0, "We don't support multiple SR in a slot\n"); + // we multiplex SR in the F2 or above resource + res[i + 1].n_sr = res[i].n_sr; + res[i + 1].sr_payload = res[i].sr_payload; + res[i] = empty; + } else if (res[i].n_harq > 0) { + AssertFatal(res[i + 1].n_harq == 0, "The standard doesn't allow for more the 1 PUCCH in a slot with HARQ\n"); + if (check_mux_acknack_csi(next_resource, pucch_Config)) { + // we multiplex what in F0 to CSI resource + if (res[i + 1].n_sr == 0) { + res[i + 1].n_sr = res[i].n_sr; + res[i + 1].sr_payload = res[i].sr_payload; + } else + AssertFatal(res[i].n_sr == 0, "We don't support more than 1 SR in a slot\n"); + res[i + 1].n_harq = res[i].n_harq; + res[i + 1].ack_payload = res[i].ack_payload; + res[i] = empty; + } else { + // if we can't multiplex HARQ and CSI we discard CSI + if (res[i + 1].n_sr == 0) { + res[i + 1] = res[i]; + res[i] = empty; + } else { + AssertFatal(res[i].n_sr == 0, "We don't support more than 1 SR in a slot\n"); + // we take SR from F2 or above into F0 and drop CSI + res[i].n_sr = res[i + 1].n_sr; + res[i].sr_payload = res[i + 1].sr_payload; + res[i + 1] = res[i]; + res[i] = empty; + } + } + } + break; + default: + AssertFatal(false, "Invalid PUCCH format %d\n", next_resource->format.present); + } + break; + case NR_PUCCH_Resource__format_PR_format1: + switch (next_resource->format.present) { + case NR_PUCCH_Resource__format_PR_format0: + if (res[i].n_sr > 0 && res[i].n_harq == 0 && res[i + 1].n_sr == 0 && res[i + 1].n_harq > 0) { + // we multiplex SR and HARQ in the HARQ F0 resource and move it to the i+1 spot + res[i + 1].n_sr = res[i].n_sr; + res[i + 1].sr_payload = res[i].sr_payload; + res[i] = empty; + } else if (res[i].n_sr == 0 && res[i].n_harq > 0 && res[i + 1].n_sr > 0 && res[i + 1].n_harq == 0) { + // we transmit only HARQ in F1 + res[i + 1] = res[i]; + res[i] = empty; + } else + AssertFatal( + false, + "We cannot multiplex more than 1 SR into a PUCCH F0 and we don't expect more than 1 PUCCH with HARQ per slot\n"); + break; + case NR_PUCCH_Resource__format_PR_format1: + if (res[i].n_sr > 0 && res[i].n_harq == 0 && res[i + 1].n_sr == 0 && res[i + 1].n_harq > 0) { + if (res[i].sr_payload == 0) { + // negative SR -> transmit HARQ only in HARQ resource + res[i] = empty; + } else { + // positive SR -> transmit HARQ only in SR resource + res[i].n_harq = res[i + 1].n_harq; + res[i].ack_payload = res[i + 1].ack_payload; + res[i].n_sr = 0; + res[i].sr_payload = 0; + res[i + 1] = res[i]; + res[i] = empty; + } + } else if (res[i].n_sr == 0 && res[i].n_harq > 0 && res[i + 1].n_sr > 0 && res[i + 1].n_harq == 0) { + if (res[i].sr_payload == 0) { + // negative SR -> transmit HARQ only in HARQ resource + res[i + 1] = res[i]; + res[i] = empty; + } else { + // positive SR -> transmit HARQ only in SR resource + res[i + 1].n_harq = res[i].n_harq; + res[i + 1].ack_payload = res[i].ack_payload; + res[i + 1].n_sr = 0; + res[i + 1].sr_payload = 0; + res[i] = empty; + } + } else + AssertFatal( + false, + "We cannot multiplex more than 1 SR into a PUCCH F0 and we don't expect more than 1 PUCCH with HARQ per slot\n"); + break; + case NR_PUCCH_Resource__format_PR_format2: + case NR_PUCCH_Resource__format_PR_format4: + case NR_PUCCH_Resource__format_PR_format3: + if (res[i].n_sr > 0 && res[i].n_harq == 0) { + AssertFatal(res[i + 1].n_sr == 0, "We don't support multiple SR in a slot\n"); + // we multiplex SR in the F2 or above resource + res[i + 1].n_sr = res[i].n_sr; + res[i + 1].sr_payload = res[i].sr_payload; + res[i] = empty; + } else if (res[i].n_harq > 0) { + AssertFatal(res[i + 1].n_harq == 0, "The standard doesn't allow for more the 1 PUCCH in a slot with HARQ\n"); + if (check_mux_acknack_csi(next_resource, pucch_Config)) { + // we multiplex what in F0 to CSI resource + if (res[i + 1].n_sr == 0) { + res[i + 1].n_sr = res[i].n_sr; + res[i + 1].sr_payload = res[i].sr_payload; + } else + AssertFatal(res[i].n_sr == 0, "We don't support more than 1 SR in a slot\n"); + res[i + 1].n_harq = res[i].n_harq; + res[i + 1].ack_payload = res[i].ack_payload; + res[i] = empty; + } else { + // if we can't multiplex HARQ and CSI we discard CSI + if (res[i + 1].n_sr == 0) { + res[i + 1] = res[i]; + res[i] = empty; + } else { + AssertFatal(res[i].n_sr == 0, "We don't support more than 1 SR in a slot\n"); + if (res[i + 1].n_sr > 0) + LOG_E(MAC, "Not sure what to do here because you can't easily mux HARQ and SR in F1\n"); + res[i + 1] = res[i]; + res[i] = empty; + } + } + } + break; + default: + AssertFatal(false, "Invalid PUCCH format %d\n", next_resource->format.present); + } + break; + case NR_PUCCH_Resource__format_PR_format2: + case NR_PUCCH_Resource__format_PR_format4: + case NR_PUCCH_Resource__format_PR_format3: + switch (next_resource->format.present) { + case NR_PUCCH_Resource__format_PR_format0: + if (res[i + 1].n_sr > 0 && res[i + 1].n_harq == 0) { + AssertFatal(res[i].n_sr == 0, "We don't support multiple SR in a slot\n"); + // we multiplex SR in the F2 or above resource + res[i].n_sr = res[i + 1].n_sr; + res[i].sr_payload = res[i + 1].sr_payload; + res[i + 1] = res[i]; + res[i] = empty; + } else if (res[i + 1].n_harq > 0) { + AssertFatal(res[i].n_harq == 0, "The standard doesn't allow for more the 1 PUCCH in a slot with HARQ\n"); + if (check_mux_acknack_csi(curr_resource, pucch_Config)) { + // we multiplex what in F0 to CSI resource + if (res[i].n_sr == 0) { + res[i].n_sr = res[i + 1].n_sr; + res[i].sr_payload = res[i + 1].sr_payload; + } else + AssertFatal(res[i + 1].n_sr == 0, "We don't support more than 1 SR in a slot\n"); + res[i].n_harq = res[i + 1].n_harq; + res[i].ack_payload = res[i + 1].ack_payload; + res[i + 1] = res[i]; + res[i] = empty; + } else { + // if we can't multiplex HARQ and CSI we discard CSI + if (res[i].n_sr == 0) + res[i] = empty; + else { + AssertFatal(res[i + 1].n_sr == 0, "We don't support more than 1 SR in a slot\n"); + // we take SR from F2 or above into F0 and drop CSI + res[i + 1].n_sr = res[i].n_sr; + res[i + 1].sr_payload = res[i].sr_payload; + res[i] = empty; + } + } + } + break; + case NR_PUCCH_Resource__format_PR_format1: + if (res[i + 1].n_sr > 0 && res[i + 1].n_harq == 0) { + AssertFatal(res[i].n_sr == 0, "We don't support multiple SR in a slot\n"); + // we multiplex SR in the F2 or above resource + res[i].n_sr = res[i + 1].n_sr; + res[i].sr_payload = res[i + 1].sr_payload; + res[i + 1] = res[i]; + res[i] = empty; + } else if (res[i + 1].n_harq > 0) { + AssertFatal(res[i].n_harq == 0, "The standard doesn't allow for more the 1 PUCCH in a slot with HARQ\n"); + if (check_mux_acknack_csi(curr_resource, pucch_Config)) { + // we multiplex what in F0 to CSI resource + if (res[i].n_sr == 0) { + res[i].n_sr = res[i + 1].n_sr; + res[i].sr_payload = res[i + 1].sr_payload; + } else + AssertFatal(res[i + 1].n_sr == 0, "We don't support more than 1 SR in a slot\n"); + res[i].n_harq = res[i + 1].n_harq; + res[i].ack_payload = res[i + 1].ack_payload; + res[i + 1] = res[i]; + res[i] = empty; + } else { + // if we can't multiplex HARQ and CSI we discard CSI + if (res[i].n_sr == 0) + res[i] = empty; + else { + AssertFatal(res[i + 1].n_sr == 0, "We don't support more than 1 SR in a slot\n"); + if (res[i].n_sr > 0) + LOG_E(MAC, "Not sure what to do here because you can't easily mux HARQ and SR in F1\n"); + res[i] = empty; + } + } + } + break; + case NR_PUCCH_Resource__format_PR_format2: + case NR_PUCCH_Resource__format_PR_format4: + case NR_PUCCH_Resource__format_PR_format3: + if (res[i + 1].n_csi > 0) { + AssertFatal(res[i].n_csi == 0, "Multiplexing multiple CSI report in a single PUCCH not supported yet\n"); + AssertFatal(res[i].n_harq > 0 && res[i + 1].n_harq == 0, + "There is CSI in next F2 or above resource, since there is no CSI in current one, we expect HARQ in " + "there and not in next\n"); + // the UE expects to be provided a same configuration for simultaneousHARQ-ACK-CSI each of PUCCH formats 2, 3, and 4 + // we can check next or current + if (check_mux_acknack_csi(next_resource, pucch_Config)) { + // We need to use HARQ resource + if (res[i + 1].n_sr > 0) { + AssertFatal(res[i].n_sr == 0, "We don't support more than 1 SR in a slot\n"); + res[i].n_sr = res[i + 1].n_sr; + res[i].sr_payload = res[i + 1].sr_payload; + } + res[i].n_csi = res[i + 1].n_csi; + res[i].csi_part1_payload = res[i + 1].csi_part1_payload; + res[i + 1] = res[i]; + res[i] = empty; + } else { + if (res[i].n_sr > 0) { + AssertFatal(res[i + 1].n_sr == 0, "We don't support more than 1 SR in a slot\n"); + // if we can't multiplex HARQ and CSI we discard CSI + res[i + 1] = res[i]; + res[i] = empty; + } else if (res[i + 1].n_sr == 0) { + // if we can't multiplex HARQ and CSI we discard CSI + res[i + 1] = res[i]; + res[i] = empty; + } else { + // we move SR (assuming it was previously multiplexed with CSI) into HARQ resource and discard CSI + res[i].n_sr = res[i + 1].n_sr; + res[i].sr_payload = res[i + 1].sr_payload; + res[i + 1] = res[i]; + res[i] = empty; + } + } + } else if (res[i].n_csi > 0) { + AssertFatal(res[i + 1].n_csi == 0, "Multiplexing multiple CSI report in a single PUCCH not supported yet\n"); + AssertFatal(res[i + 1].n_harq > 0 && res[i].n_harq == 0, + "There is CSI in next F2 or above resource, since there is no CSI in current one, we expect HARQ in " + "there and not in next\n"); + // the UE expects to be provided a same configuration for simultaneousHARQ-ACK-CSI each of PUCCH formats 2, 3, and 4 + // we can check next or current + if (check_mux_acknack_csi(next_resource, pucch_Config)) { + // We need to use HARQ resource + if (res[i].n_sr > 0) { + AssertFatal(res[i + 1].n_sr == 0, "We don't support more than 1 SR in a slot\n"); + res[i + 1].n_sr = res[i].n_sr; + res[i + 1].sr_payload = res[i].sr_payload; + } + res[i + 1].n_csi = res[i].n_csi; + res[i + 1].csi_part1_payload = res[i].csi_part1_payload; + res[i] = empty; + } else { + if (res[i + 1].n_sr > 0) { + AssertFatal(res[i].n_sr == 0, "We don't support more than 1 SR in a slot\n"); + // if we can't multiplex HARQ and CSI we discard CSI + res[i] = empty; + } else if (res[i].n_sr == 0) { + // if we can't multiplex HARQ and CSI we discard CSI + res[i] = empty; + } else { + // we move SR (assuming it was previously multiplexed with CSI) into HARQ resource and discard CSI + res[i + 1].n_sr = res[i].n_sr; + res[i + 1].sr_payload = res[i].sr_payload; + res[i] = empty; + } + } + } else + AssertFatal(false, "We expect at least one of the 2 PUCCH F2 or above resources with CSI\n"); + break; + default: + AssertFatal(false, "Invalid PUCCH format %d\n", next_resource->format.present); + } + break; + default: + AssertFatal(false, "Invalid PUCCH format %d\n", curr_resource->format.present); + } + } +} + +void multiplex_pucch_resource(NR_UE_MAC_INST_t *mac, PUCCH_sched_t *pucch, int num_res) +{ + NR_PUCCH_Config_t *pucch_Config = mac->current_UL_BWP.pucch_Config; + order_resources(pucch, num_res); + // following pseudocode in Ref. 38.213 section 9.2.5 to multiplex resources + int j = 0; + int o = 0; + while (j <= num_res - 1) { + if (j < num_res - 1) { + NR_PUCCH_Resource_t *pucch_resource = pucch[j - o].pucch_resource; + int curr_start, curr_length; + get_pucch_start_symbol_length(pucch_resource, &curr_start, &curr_length); + pucch_resource = pucch[j + 1].pucch_resource; + int next_start, next_length; + get_pucch_start_symbol_length(pucch_resource, &next_start, &next_length); + bool overlap = check_overlapping_resources(curr_start, curr_length, next_start, next_length); + if (overlap) { + o++; + j++; + } + } else { + if (o > 0) { + merge_resources(&pucch[j - o], o + 1, pucch_Config); + // move the resources to occupy the places left empty + int num_empty = o; + for (int i = j; i < num_res; i++) + pucch[i - num_empty] = pucch[i]; + for (int e = num_res - num_empty; e < num_res; e++) + memset(&pucch[e], 0, sizeof(pucch[e])); + j = 0; + o = 0; + num_res = num_res - num_empty; + order_resources(pucch, num_res); + } else + j++; } } } @@ -1752,12 +2137,8 @@ void select_pucch_resource(NR_UE_MAC_INST_t *mac, PUCCH_sched_t *pucch) * *********************************************************************/ -uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac, - frame_t frame, - int slot, - PUCCH_sched_t *pucch) { - - +bool get_downlink_ack(NR_UE_MAC_INST_t *mac, frame_t frame, int slot, PUCCH_sched_t *pucch) +{ uint32_t ack_data[NR_DL_MAX_NB_CW][NR_DL_MAX_DAI] = {{0},{0}}; uint32_t dai[NR_DL_MAX_NB_CW][NR_DL_MAX_DAI] = {{0},{0}}; /* for serving cell */ uint32_t dai_total[NR_DL_MAX_NB_CW][NR_DL_MAX_DAI] = {{0},{0}}; /* for multiple cells */ @@ -1784,6 +2165,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac, int scs = current_UL_BWP->scs; slots_per_frame = nr_slots_per_frame[scs]; + int res_ind = -1; /* look for dl acknowledgment which should be done on current uplink slot */ for (int code_word = 0; code_word < number_of_code_word; code_word++) { @@ -1796,7 +2178,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac, sched_slot = current_harq->dl_slot + current_harq->feedback_to_ul; sched_frame = current_harq->dl_frame; - if (sched_slot>=slots_per_frame){ + if (sched_slot >= slots_per_frame) { sched_slot %= slots_per_frame; sched_frame = (sched_frame + 1) % 1024; } @@ -1814,16 +2196,17 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac, LOG_E(MAC,"PUCCH Downlink DAI has an invalid value of %d\n", current_harq->dai); } else { - - if ((pucch->resource_indicator != -1) && (pucch->resource_indicator != current_harq->pucch_resource_indicator)) - LOG_E(MAC, "Value of pucch_resource_indicator %d not matching with what set before %d (Possibly due to a false DCI) \n", - current_harq->pucch_resource_indicator,pucch->resource_indicator); + if (res_ind != -1 && res_ind != current_harq->pucch_resource_indicator) + LOG_E(MAC, + "Value of pucch_resource_indicator %d not matching with what set before %d (Possibly due to a false DCI) \n", + current_harq->pucch_resource_indicator, + res_ind); else{ - dai_current = current_harq->dai+1; // DCI DAI to counter DAI conversion + dai_current = current_harq->dai + 1; // DCI DAI to counter DAI conversion if (dai_current == 0) { LOG_E(MAC,"PUCCH Downlink dai is invalid\n"); - return(0); + return false; } else if (dai_current > dai_max) { dai_max = dai_current; } @@ -1838,12 +2221,15 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac, ack_data[code_word][dai_current - 1] = 0; } dai[code_word][dai_current - 1] = dai_current; - - pucch->resource_indicator = current_harq->pucch_resource_indicator; + int temp_ind = current_harq->pucch_resource_indicator; + AssertFatal(res_ind == -1 || res_ind == temp_ind, + "Current resource index %d does not match with previous resource index %d\n", + temp_ind, + res_ind); + res_ind = temp_ind; pucch->n_CCE = current_harq->n_CCE; pucch->N_CCE = current_harq->N_CCE; pucch->delta_pucch = current_harq->delta_pucch; - pucch->is_common = current_harq->is_common; LOG_D(PHY,"%4d.%2d Sent %d ack on harq pid %d\n", frame, slot, current_harq->ack, dl_harq_pid); } } @@ -1854,12 +2240,11 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac, /* no any ack to transmit */ if (number_harq_feedback == 0) { - pucch->n_HARQ_ACK = 0; - return(0); + return false; } else if (number_harq_feedback > (sizeof(uint32_t)*8)) { LOG_E(MAC,"PUCCH number of ack bits exceeds payload size\n"); - return(0); + return false; } /* for computing n_HARQ_ACK for power */ @@ -1867,10 +2252,17 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac, U_DAI_c = number_harq_feedback/number_of_code_word; N_m_c_rx = number_harq_feedback; int N_SPS_c = 0; /* FFS TODO_NR multicells and SPS are not supported at the moment */ + int n_HARQ_ACK = 0; if (current_UL_BWP->harq_ACK_SpatialBundlingPUCCH != NULL) { int N_TB_max_DL = current_DL_BWP->pdsch_Config->maxNrofCodeWordsScheduledByDCI[0]; - pucch->n_HARQ_ACK = (((V_DAI_m_DL - U_DAI_c)%4) * N_TB_max_DL) + N_m_c_rx + N_SPS_c; - LOG_D(MAC, "PUCCH power n(%d) = ( V(%d) - U(%d) )mod4 * N_TB(%d) + N(%d) \n", pucch->n_HARQ_ACK, V_DAI_m_DL, U_DAI_c, N_TB_max_DL, N_m_c_rx); + n_HARQ_ACK = (((V_DAI_m_DL - U_DAI_c) % 4) * N_TB_max_DL) + N_m_c_rx + N_SPS_c; + LOG_D(MAC, + "PUCCH power n(%d) = ( V(%d) - U(%d) )mod4 * N_TB(%d) + N(%d) \n", + n_HARQ_ACK, + V_DAI_m_DL, + U_DAI_c, + N_TB_max_DL, + N_m_c_rx); } /* @@ -1943,26 +2335,46 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac, if (number_harq_feedback != O_ACK) { LOG_E(MAC,"PUCCH Error for number of bits for acknowledgment\n"); - return (0); + return false; } + NR_PUCCH_Config_t *pucch_Config = current_UL_BWP->pucch_Config; + if (mac->state == UE_WAIT_TX_ACK_MSG4 || !pucch_Config || !pucch_Config->resourceSetToAddModList + || pucch_Config->resourceSetToAddModList->list.array[0] == NULL) { + /* see TS 38.213 9.2.1 PUCCH Resource Sets */ + int delta_PRI = res_ind; + int n_CCE_0 = pucch->n_CCE; + int N_CCE_0 = pucch->N_CCE; + if (N_CCE_0 == 0) + AssertFatal(1 == 0, "PUCCH No compatible pucch format found\n"); + int r_PUCCH = ((2 * n_CCE_0) / N_CCE_0) + (2 * delta_PRI); + pucch->initial_pucch_id = r_PUCCH; + pucch->pucch_resource = NULL; + } else { + int resource_set_id = find_pucch_resource_set(mac, O_ACK); + int n_list = pucch_Config->resourceSetToAddModList->list.count; + AssertFatal(resource_set_id < n_list, "Invalid PUCCH resource set id %d\n", resource_set_id); + n_list = pucch_Config->resourceSetToAddModList->list.array[resource_set_id]->resourceList.list.count; + AssertFatal(res_ind < n_list, "Invalid PUCCH resource id %d\n", res_ind); + long *acknack_resource_id = + pucch_Config->resourceSetToAddModList->list.array[resource_set_id]->resourceList.list.array[res_ind]; + AssertFatal(acknack_resource_id != NULL, "Couldn't find PUCCH Resource ID in ResourceSet\n"); + NR_PUCCH_Resource_t *acknack_resource = find_pucch_resource_from_list(pucch_Config->resourceToAddModList, *acknack_resource_id); + AssertFatal(acknack_resource != NULL, "Couldn't find PUCCH Resource ID for ACK/NACK in PUCCH resource list\n"); + pucch->pucch_resource = acknack_resource; + LOG_D(MAC, "frame %d slot %d pucch acknack payload %d\n", frame, slot, o_ACK); + } reverse_n_bits(&o_ACK,number_harq_feedback); pucch->ack_payload = o_ACK; + pucch->n_harq = number_harq_feedback; - LOG_D(MAC,"frame %d slot %d pucch acknack payload %d\n",frame,slot,o_ACK); - - return(number_harq_feedback); + return (number_harq_feedback > 0); } - -bool trigger_periodic_scheduling_request(NR_UE_MAC_INST_t *mac, - PUCCH_sched_t *pucch, - frame_t frame, - int slot) { - +bool trigger_periodic_scheduling_request(NR_UE_MAC_INST_t *mac, PUCCH_sched_t *pucch, frame_t frame, int slot) +{ NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP; NR_PUCCH_Config_t *pucch_Config = current_UL_BWP->pucch_Config; - const int n_slots_frame = nr_slots_per_frame[current_UL_BWP->scs]; if(!pucch_Config || @@ -1970,6 +2382,7 @@ bool trigger_periodic_scheduling_request(NR_UE_MAC_INST_t *mac, pucch_Config->schedulingRequestResourceToAddModList->list.count==0) return false; // SR not configured + int sr_count = 0; for (int SR_resource_id =0; SR_resource_id < pucch_Config->schedulingRequestResourceToAddModList->list.count;SR_resource_id++) { NR_SchedulingRequestResourceConfig_t *SchedulingRequestResourceConfig = pucch_Config->schedulingRequestResourceToAddModList->list.array[SR_resource_id]; int SR_period; int SR_offset; @@ -1979,26 +2392,20 @@ bool trigger_periodic_scheduling_request(NR_UE_MAC_INST_t *mac, if ((sfn_sf - SR_offset) % SR_period == 0) { LOG_D(MAC, "Scheduling Request active in frame %d slot %d \n", frame, slot); - NR_PUCCH_ResourceId_t *PucchResourceId = SchedulingRequestResourceConfig->resource; - - int found = -1; - NR_PUCCH_ResourceSet_t *pucchresset = pucch_Config->resourceSetToAddModList->list.array[0]; // set with formats 0,1 - int n_list = pucchresset->resourceList.list.count; - for (int i=0; iresourceList.list.array[i] == *PucchResourceId ) { - found = i; - break; - } + if (!SchedulingRequestResourceConfig->resource) { + LOG_E(MAC, "No resource associated with SR. SR not scheduled\n"); + break; } - if (found == -1) { - LOG_E(MAC,"Couldn't find PUCCH resource for SR\n"); - return false; - } - pucch->resource_indicator = found; - return true; + NR_PUCCH_Resource_t *sr_pucch = + find_pucch_resource_from_list(pucch_Config->resourceToAddModList, *SchedulingRequestResourceConfig->resource); + AssertFatal(sr_pucch != NULL, "Couldn't find PUCCH Resource ID for SR in PUCCH resource list\n"); + pucch->pucch_resource = sr_pucch; + pucch->n_sr = 1; + sr_count++; } } - return false; + AssertFatal(sr_count < 2, "Cannot handle more than 1 SR per slot yet\n"); + return sr_count > 0 ? true : false; } int8_t nr_ue_get_SR(module_id_t module_idP, frame_t frameP, slot_t slot){ @@ -2049,63 +2456,84 @@ int8_t nr_ue_get_SR(module_id_t module_idP, frame_t frameP, slot_t slot){ } } +// section 5.2.5 of 38.214 +int compute_csi_priority(NR_UE_MAC_INST_t *mac, NR_CSI_ReportConfig_t *csirep) +{ + int y = 4 - csirep->reportConfigType.present; + int k = csirep->reportQuantity.present == NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP + || csirep->reportQuantity.present == NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP + ? 0 + : 1; + int Ncells = 32; // maxNrofServingCells + int c = mac->servCellIndex; + int s = csirep->reportConfigId; + int Ms = 48; // maxNrofCSI-ReportConfigurations -uint8_t nr_get_csi_measurements(NR_UE_MAC_INST_t *mac, - frame_t frame, - int slot, - PUCCH_sched_t *pucch) { + return 2 * Ncells * Ms * y + Ncells * Ms * k + Ms * c + s; +} +int nr_get_csi_measurements(NR_UE_MAC_INST_t *mac, frame_t frame, int slot, PUCCH_sched_t *pucch) +{ NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP; NR_BWP_Id_t bwp_id = current_UL_BWP->bwp_id; NR_PUCCH_Config_t *pucch_Config = current_UL_BWP->pucch_Config; - int csi_bits = 0; + int num_csi = 0; if (current_UL_BWP->csi_MeasConfig) { NR_CSI_MeasConfig_t *csi_measconfig = current_UL_BWP->csi_MeasConfig; + int csi_priority = INT_MAX; for (int csi_report_id = 0; csi_report_id < csi_measconfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){ NR_CSI_ReportConfig_t *csirep = csi_measconfig->csi_ReportConfigToAddModList->list.array[csi_report_id]; if(csirep->reportConfigType.present == NR_CSI_ReportConfig__reportConfigType_PR_periodic){ - const NR_PUCCH_CSI_Resource_t *pucchcsires = csirep->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list.array[0]; - if(pucchcsires->uplinkBandwidthPartId != bwp_id) - continue; - int period, offset; csi_period_offset(csirep, NULL, &period, &offset); const int n_slots_frame = nr_slots_per_frame[current_UL_BWP->scs]; if (((n_slots_frame*frame + slot - offset)%period) == 0 && pucch_Config) { - LOG_D(NR_MAC, "Preparing CSI report in frame %d slot %d CSI report ID %d\n", frame, slot, csi_report_id); - NR_PUCCH_CSI_Resource_t *pucchcsires = csirep->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list.array[0]; - NR_PUCCH_ResourceSet_t *pucchresset = pucch_Config->resourceSetToAddModList->list.array[1]; // set with formats >1 - int n = pucchresset->resourceList.list.count; - - int res_index; - int found = -1; - for (res_index = 0; res_index < n; res_index++) { - if (*pucchresset->resourceList.list.array[res_index] == pucchcsires->pucch_Resource) { - found = res_index; + int csi_res_id = -1; + for (int i = 0; i < csirep->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list.count; i++) { + const NR_PUCCH_CSI_Resource_t *pucchcsires = + csirep->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list.array[i]; + if (pucchcsires->uplinkBandwidthPartId == bwp_id) { + csi_res_id = pucchcsires->pucch_Resource; break; } } - AssertFatal(found != -1, - "CSI resource not found among PUCCH resources\n"); - LOG_D(NR_MAC, "CSI reporting in frame %d slot %d CSI report ID %ld\n", frame, slot, csirep->reportConfigId); - pucch->resource_indicator = found; - csi_bits += nr_get_csi_payload(mac, pucch, csi_report_id, csi_measconfig); + AssertFatal(csi_res_id > -1, "Couldn't find PUCCH resource ID associated with current BWP\n"); + NR_PUCCH_Resource_t *csi_pucch = find_pucch_resource_from_list(pucch_Config->resourceToAddModList, csi_res_id); + AssertFatal(csi_pucch != NULL, "Couldn't find PUCCH Resource ID for SR in PUCCH resource list\n"); + LOG_D(NR_MAC, "Preparing CSI report in frame %d slot %d CSI report ID %d\n", frame, slot, csi_report_id); + int temp_priority = compute_csi_priority(mac, csirep); + if (num_csi > 0) { + // need to verify if we can multiplex multiple CSI report + if (pucch_Config->multi_CSI_PUCCH_ResourceList) { + AssertFatal(false, "Multiplexing multiple CSI report in a single PUCCH not supported yet\n"); + } else if (temp_priority < csi_priority) { + // we discard previous report + csi_priority = temp_priority; + num_csi = 1; + pucch->n_csi = nr_get_csi_payload(mac, pucch, csi_report_id, csi_measconfig); + pucch->pucch_resource = csi_pucch; + } else + continue; + } else { + num_csi = 1; + csi_priority = temp_priority; + pucch->n_csi = nr_get_csi_payload(mac, pucch, csi_report_id, csi_measconfig); + pucch->pucch_resource = csi_pucch; + } } } else AssertFatal(1==0,"Only periodic CSI reporting is currently implemented\n"); } } - - return csi_bits; + return num_csi; } - uint8_t nr_get_csi_payload(NR_UE_MAC_INST_t *mac, PUCCH_sched_t *pucch, int csi_report_id, diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index a3f4d06b1c..e5c6fb0e3c 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -2197,87 +2197,80 @@ void build_ssb_to_ro_map(NR_UE_MAC_INST_t *mac) { LOG_D(NR_MAC,"Map SSB to RO done\n"); } - -void nr_ue_pucch_scheduler(module_id_t module_idP, frame_t frameP, int slotP, void *phy_data) { - +void nr_ue_pucch_scheduler(module_id_t module_idP, frame_t frameP, int slotP, void *phy_data) +{ NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP); - int O_SR = 0; - int O_ACK = 0; - int O_CSI = 0; - int N_UCI = 0; + PUCCH_sched_t pucch[3] = {0}; // TODO the size might change in the future in case of multiple SR or multiple CSI in a slot - PUCCH_sched_t pucch = { - .resource_indicator = -1, - .initial_pucch_id = -1 - }; - uint16_t rnti = mac->crnti; //FIXME not sure this is valid for all pucch instances + mac->nr_ue_emul_l1.num_srs = 0; + mac->nr_ue_emul_l1.num_harqs = 0; + mac->nr_ue_emul_l1.num_csi_reports = 0; + int num_res = 0; // SR - if (mac->state == UE_CONNECTED && trigger_periodic_scheduling_request(mac, &pucch, frameP, slotP)) { - O_SR = 1; + if (mac->state == UE_CONNECTED && trigger_periodic_scheduling_request(mac, &pucch[0], frameP, slotP)) { + num_res++; /* sr_payload = 1 means that this is a positive SR, sr_payload = 0 means that it is a negative SR */ - pucch.sr_payload = nr_ue_get_SR(module_idP, - frameP, - slotP); + pucch[0].sr_payload = nr_ue_get_SR(module_idP, frameP, slotP); } // CSI + int csi_res = 0; if (mac->state == UE_CONNECTED) - O_CSI = nr_get_csi_measurements(mac, frameP, slotP, &pucch); + csi_res = nr_get_csi_measurements(mac, frameP, slotP, &pucch[num_res]); + if (csi_res > 0) { + num_res += csi_res; + } // ACKNACK - O_ACK = get_downlink_ack(mac, frameP, slotP, &pucch); - - NR_PUCCH_Config_t *pucch_Config = mac->current_UL_BWP.pucch_Config; - - // if multiplexing of HARQ and CSI is not possible, transmit only HARQ bits - if ((O_ACK != 0) && (O_CSI != 0) && - pucch_Config && - pucch_Config->format2 && - (pucch_Config->format2->choice.setup->simultaneousHARQ_ACK_CSI == NULL)) { - O_CSI = 0; - pucch.csi_part1_payload = 0; - pucch.csi_part2_payload = 0; - } - - N_UCI = O_SR + O_ACK + O_CSI; - mac->nr_ue_emul_l1.num_srs = O_SR; - mac->nr_ue_emul_l1.num_harqs = O_ACK; - mac->nr_ue_emul_l1.num_csi_reports = O_CSI; + bool any_harq = get_downlink_ack(mac, frameP, slotP, &pucch[num_res]); + if (any_harq) + num_res++; + if (num_res == 0) + return; // do no transmit pucch if only SR scheduled and it is negative - if ((O_ACK + O_CSI) == 0 && pucch.sr_payload == 0) + if (num_res == 1 && pucch[0].n_sr > 0 && pucch[0].sr_payload == 0) return; - if (N_UCI > 0) { - LOG_D(NR_MAC,"%d.%d configure pucch, O_SR %d, O_ACK %d, O_CSI %d\n",frameP,slotP,O_SR,O_ACK,O_CSI); - pucch.resource_set_id = find_pucch_resource_set(mac, O_ACK + O_CSI); - select_pucch_resource(mac, &pucch); - fapi_nr_ul_config_request_t *ul_config = get_ul_config_request(mac, slotP); - pthread_mutex_lock(&ul_config->mutex_ul_config); - AssertFatal(ul_config->number_pdusnumber_pdus %d out of bounds\n",ul_config->number_pdus); - fapi_nr_ul_config_pucch_pdu *pucch_pdu = &ul_config->ul_config_list[ul_config->number_pdus].pucch_config_pdu; - - fill_ul_config(ul_config, frameP, slotP, FAPI_NR_UL_CONFIG_TYPE_PUCCH); - mac->nr_ue_emul_l1.active_uci_sfn_slot = NFAPI_SFNSLOT2HEX(frameP, slotP); - pthread_mutex_unlock(&ul_config->mutex_ul_config); - - nr_ue_configure_pucch(mac, - slotP, - rnti, - &pucch, - pucch_pdu, - O_SR, O_ACK, O_CSI); - nr_scheduled_response_t scheduled_response; - fill_scheduled_response(&scheduled_response, NULL, ul_config, NULL, module_idP, 0 /*TBR fix*/, frameP, slotP, phy_data); - if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL) - mac->if_module->scheduled_response(&scheduled_response); - if(mac->state == UE_WAIT_TX_ACK_MSG4) - mac->state = UE_CONNECTED; + if (num_res > 1) + multiplex_pucch_resource(mac, pucch, num_res); + fapi_nr_ul_config_request_t *ul_config = get_ul_config_request(mac, slotP); + pthread_mutex_lock(&ul_config->mutex_ul_config); + for (int j = 0; j < num_res; j++) { + if (pucch[j].n_harq + pucch[j].n_sr + pucch[j].n_csi != 0) { + LOG_D(NR_MAC, + "%d.%d configure pucch, O_ACK %d, O_SR %d, O_CSI %d\n", + frameP, + slotP, + pucch[j].n_harq, + pucch[j].n_sr, + pucch[j].n_csi); + mac->nr_ue_emul_l1.num_srs = pucch[j].n_sr; + mac->nr_ue_emul_l1.num_harqs = pucch[j].n_harq; + mac->nr_ue_emul_l1.num_csi_reports = pucch[j].n_csi; + AssertFatal(ul_config->number_pdus < FAPI_NR_UL_CONFIG_LIST_NUM, + "ul_config->number_pdus %d out of bounds\n", + ul_config->number_pdus); + fapi_nr_ul_config_pucch_pdu *pucch_pdu = &ul_config->ul_config_list[ul_config->number_pdus].pucch_config_pdu; + fill_ul_config(ul_config, frameP, slotP, FAPI_NR_UL_CONFIG_TYPE_PUCCH); + mac->nr_ue_emul_l1.active_uci_sfn_slot = NFAPI_SFNSLOT2HEX(frameP, slotP); + pthread_mutex_unlock(&ul_config->mutex_ul_config); + nr_ue_configure_pucch(mac, + slotP, + mac->crnti, // FIXME not sure this is valid for all pucch instances + &pucch[j], + pucch_pdu); + nr_scheduled_response_t scheduled_response; + fill_scheduled_response(&scheduled_response, NULL, ul_config, NULL, module_idP, 0 /*TBR fix*/, frameP, slotP, phy_data); + if (mac->if_module != NULL && mac->if_module->scheduled_response != NULL) + mac->if_module->scheduled_response(&scheduled_response); + if (mac->state == UE_WAIT_TX_ACK_MSG4) + mac->state = UE_CONNECTED; + } } } - void nr_schedule_csi_for_im(NR_UE_MAC_INST_t *mac, int frame, int slot) { NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP; diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index 3b6a6c2df8..96c3a85b98 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -54,10 +54,10 @@ extern RAN_CONTEXT_t RC; //extern int l2_init_gNB(void); extern uint8_t nfapi_mode; -void process_rlcBearerConfig(struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list, - struct NR_CellGroupConfig__rlc_BearerToReleaseList *rlc_bearer2release_list, - NR_UE_sched_ctrl_t *sched_ctrl) { - +static void process_rlcBearerConfig(struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list, + struct NR_CellGroupConfig__rlc_BearerToReleaseList *rlc_bearer2release_list, + NR_UE_sched_ctrl_t *sched_ctrl) +{ if (rlc_bearer2release_list) { for (int i = 0; i < rlc_bearer2release_list->list.count; i++) { for (int idx = 0; idx < sched_ctrl->dl_lc_num; idx++) { @@ -97,8 +97,9 @@ void process_rlcBearerConfig(struct NR_CellGroupConfig__rlc_BearerToAddModList * } +static void process_drx_Config(NR_UE_sched_ctrl_t *sched_ctrl, NR_SetupRelease_DRX_Config_t *drx_Config) +{ -void process_drx_Config(NR_UE_sched_ctrl_t *sched_ctrl,NR_SetupRelease_DRX_Config_t *drx_Config) { if (!drx_Config) return; AssertFatal(drx_Config->present != NR_SetupRelease_DRX_Config_PR_NOTHING, "Cannot have NR_SetupRelease_DRX_Config_PR_NOTHING\n"); @@ -110,23 +111,27 @@ void process_drx_Config(NR_UE_sched_ctrl_t *sched_ctrl,NR_SetupRelease_DRX_Confi } } -void process_schedulingRequestConfig(NR_UE_sched_ctrl_t *sched_ctrl,NR_SchedulingRequestConfig_t *schedulingRequestConfig) { +static void process_schedulingRequestConfig(NR_UE_sched_ctrl_t *sched_ctrl, NR_SchedulingRequestConfig_t *schedulingRequestConfig) +{ if (!schedulingRequestConfig) return; LOG_I(NR_MAC,"Adding SchedulingRequestconfig\n"); } -void process_bsrConfig(NR_UE_sched_ctrl_t *sched_ctrl,NR_BSR_Config_t *bsr_Config) { +static void process_bsrConfig(NR_UE_sched_ctrl_t *sched_ctrl, NR_BSR_Config_t *bsr_Config) +{ if (!bsr_Config) return; LOG_I(NR_MAC,"Adding BSR config\n"); } -void process_tag_Config(NR_UE_sched_ctrl_t *sched_ctrl,NR_TAG_Config_t *tag_Config) { +static void process_tag_Config(NR_UE_sched_ctrl_t *sched_ctrl, NR_TAG_Config_t *tag_Config) +{ if (!tag_Config) return; LOG_I(NR_MAC,"Adding TAG config\n"); } -void process_phr_Config(NR_UE_sched_ctrl_t *sched_ctrl,NR_SetupRelease_PHR_Config_t *phr_Config) { +static void process_phr_Config(NR_UE_sched_ctrl_t *sched_ctrl, NR_SetupRelease_PHR_Config_t *phr_Config) +{ if (!phr_Config) return; AssertFatal(phr_Config->present != NR_SetupRelease_PHR_Config_PR_NOTHING, "Cannot have NR_SetupRelease_PHR_Config_PR_NOTHING\n"); @@ -138,8 +143,8 @@ void process_phr_Config(NR_UE_sched_ctrl_t *sched_ctrl,NR_SetupRelease_PHR_Confi } } -void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sched_ctrl) { - +void process_CellGroup(NR_CellGroupConfig_t *CellGroup, NR_UE_sched_ctrl_t *sched_ctrl) +{ AssertFatal(CellGroup, "CellGroup is null\n"); NR_MAC_CellGroupConfig_t *mac_CellGroupConfig = CellGroup->mac_CellGroupConfig; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c index 37ceeddbee..6ffbe7c270 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c @@ -38,7 +38,7 @@ #include "common/utils/LOG/log.h" #include "common/utils/LOG/vcd_signal_dumper.h" #include "UTIL/OPT/opt.h" -#include "RRC/NR/nr_rrc_extern.h" +#include "RRC/NR/nr_rrc_config.h" #include "common/utils/nr/nr_common.h" @@ -94,7 +94,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP, gNB_MAC_INST *gNB = RC.nrmac[module_idP]; NR_COMMON_channels_t *cc; nfapi_nr_dl_tti_request_body_t *dl_req; - NR_MIB_t *mib = RC.nrrrc[module_idP]->carrier.mib.message.choice.mib; + NR_MIB_t *mib = RC.nrrrc[module_idP]->carrier.mib->message.choice.mib; uint8_t num_tdd_period,num_ssb; int mib_sdu_length; int CC_id; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c index e6f32b1405..7d16783416 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c @@ -1275,7 +1275,6 @@ void nr_schedule_ue_spec(module_id_t module_id, header->LCID = DL_SCH_LCID_PADDING; buf += sizeof(NR_MAC_SUBHEADER_LONG); header->L = htons(bufEnd-buf); - dlsch_total_bytes += bufEnd-buf; for (; ((intptr_t)buf) % 4; buf++) *buf = lrand48() & 0xff; @@ -1306,6 +1305,7 @@ void nr_schedule_ue_spec(module_id_t module_id, UE->mac_stats.dl.total_rbs += sched_pdsch->rbSize; UE->mac_stats.dl.num_mac_sdu += sdus; UE->mac_stats.dl.current_rbs = sched_pdsch->rbSize; + UE->mac_stats.dl.total_sdu_bytes += dlsch_total_bytes; /* save retransmission information */ harq->sched_pdsch = *sched_pdsch; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index 99ce0ab235..faaf868346 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -968,9 +968,13 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu, pucch_pdu->start_symbol_index = pucchres->format.choice.format2->startingSymbolIndex; pucch_pdu->data_scrambling_id = pusch_id!= NULL ? *pusch_id : *scc->physCellId; pucch_pdu->dmrs_scrambling_id = id0!= NULL ? *id0 : *scc->physCellId; - pucch_pdu->prb_size = compute_pucch_prb_size(2,pucchres->format.choice.format2->nrofPRBs, - O_uci+O_sr,O_csi,pucch_Config->format2->choice.setup->maxCodeRate, - 2,pucchres->format.choice.format2->nrofSymbols,8); + pucch_pdu->prb_size = compute_pucch_prb_size(2, + pucchres->format.choice.format2->nrofPRBs, + O_uci + O_sr, + pucch_Config->format2->choice.setup->maxCodeRate, + 2, + pucchres->format.choice.format2->nrofSymbols, + 8); pucch_pdu->bit_len_csi_part1 = O_csi; break; case NR_PUCCH_Resource__format_PR_format3 : @@ -996,9 +1000,13 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu, else f3_dmrs_symbols = 2<add_dmrs_flag; } - pucch_pdu->prb_size = compute_pucch_prb_size(3,pucchres->format.choice.format3->nrofPRBs, - O_uci+O_sr,O_csi,pucch_Config->format3->choice.setup->maxCodeRate, - 2-pucch_pdu->pi_2bpsk,pucchres->format.choice.format3->nrofSymbols-f3_dmrs_symbols,12); + pucch_pdu->prb_size = compute_pucch_prb_size(3, + pucchres->format.choice.format3->nrofPRBs, + O_uci + O_sr, + pucch_Config->format3->choice.setup->maxCodeRate, + 2 - pucch_pdu->pi_2bpsk, + pucchres->format.choice.format3->nrofSymbols - f3_dmrs_symbols, + 12); pucch_pdu->bit_len_csi_part1 = O_csi; break; case NR_PUCCH_Resource__format_PR_format4 : @@ -2483,8 +2491,6 @@ void reset_ul_harq_list(NR_UE_sched_ctrl_t *sched_ctrl) { void mac_remove_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rnti) { - nr_rlc_remove_ue(rnti); - NR_UEs_t *UE_info = &nr_mac->UE_info; pthread_mutex_lock(&UE_info->mutex); UE_iterator(UE_info->list, UE) { @@ -2886,24 +2892,16 @@ void send_initial_ul_rrc_message(gNB_MAC_INST *mac, int rnti, const uint8_t *sdu NR_UE_info_t *UE = (NR_UE_info_t *)rawUE; - uint8_t du2cu_rrc_container[1024]; - asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig, - NULL, - UE->CellGroup, - du2cu_rrc_container, - sizeof(du2cu_rrc_container)); - AssertFatal(enc_rval.encoded > 0, - "Could not encode cellGroupConfig for UE %04x, failed element %s\n", - rnti, - enc_rval.failed_type->name); + uint8_t du2cu[1024]; + int encoded = encode_cellGroupConfig(UE->CellGroup, du2cu, sizeof(du2cu)); const f1ap_initial_ul_rrc_message_t ul_rrc_msg = { /* TODO: add mcc, mnc, cell_id, ..., is not available at MAC yet */ .crnti = rnti, .rrc_container = (uint8_t *) sdu, .rrc_container_length = sdu_len, - .du2cu_rrc_container = (uint8_t *) du2cu_rrc_container, - .du2cu_rrc_container_length = (enc_rval.encoded + 7) / 8 + .du2cu_rrc_container = (uint8_t *) du2cu, + .du2cu_rrc_container_length = encoded }; mac->mac_rrc.initial_ul_rrc_message_transfer(0, &ul_rrc_msg); } @@ -2917,20 +2915,7 @@ void prepare_initial_ul_rrc_message(gNB_MAC_INST *mac, NR_UE_info_t *UE) gNB_RRC_INST *rrc = RC.nrrrc[mod_id]; const NR_ServingCellConfigCommon_t *scc = rrc->carrier.servingcellconfigcommon; const NR_ServingCellConfig_t *sccd = rrc->configuration.scd; - NR_CellGroupConfig_t *cellGroupConfig = calloc(1, sizeof(*cellGroupConfig)); - AssertFatal(cellGroupConfig != NULL, "out of memory\n"); - fill_initial_cellGroupConfig(UE->uid, cellGroupConfig, scc, sccd, &rrc->configuration); - - uint8_t du2cu_rrc_container[1024]; - asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig, - NULL, - cellGroupConfig, - du2cu_rrc_container, - sizeof(du2cu_rrc_container)); - AssertFatal(enc_rval.encoded > 0, - "Could not encode cellGroupConfig for UE %04x, failed element %s\n", - UE->rnti, - enc_rval.failed_type->name); + NR_CellGroupConfig_t *cellGroupConfig = get_initial_cellGroupConfig(UE->uid, scc, sccd, &rrc->configuration); UE->CellGroup = cellGroupConfig; nr_mac_update_cellgroup(mac, UE->rnti, cellGroupConfig); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 3c314c6c86..6ed327e125 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -325,6 +325,7 @@ int nr_process_mac_pdu(instance_t module_idP, if (UE_idx->CellGroup) { LOG_D(NR_MAC, "Frame %d : ULSCH -> UL-DCCH %d (gNB %ld, %d bytes), rnti: 0x%04x \n", frameP, rx_lcid, module_idP, mac_len, crnti); + UE->mac_stats.ul.total_sdu_bytes += mac_len; mac_rlc_data_ind(module_idP, crnti, module_idP, diff --git a/openair2/LAYER2/NR_MAC_gNB/main.c b/openair2/LAYER2/NR_MAC_gNB/main.c index 5dcaffce94..cd8e16c48b 100644 --- a/openair2/LAYER2/NR_MAC_gNB/main.c +++ b/openair2/LAYER2/NR_MAC_gNB/main.c @@ -37,6 +37,8 @@ #include "RRC/NR/nr_rrc_defs.h" #include "common/utils/LOG/log.h" +#include "nr_rlc/nr_rlc_oai_api.h" +#include "RRC/NR/MESSAGES/asn1_msg.h" //#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h" #include "common/ran_context.h" @@ -251,8 +253,30 @@ void mac_top_init_gNB(ngran_node_t node_type) // These should be out of here later if (get_softmodem_params()->usim_test == 0 ) nr_pdcp_layer_init(); - if(IS_SOFTMODEM_NOS1 && get_softmodem_params()->phy_test) - nr_DRB_preconfiguration(0x1234); + if(IS_SOFTMODEM_NOS1 && get_softmodem_params()->phy_test) { + // get default noS1 configuration + NR_RadioBearerConfig_t *rbconfig = NULL; + NR_RLC_BearerConfig_t *rlc_rbconfig = NULL; + fill_nr_noS1_bearer_config(&rbconfig, &rlc_rbconfig); + NR_RLC_BearerConfig_t *rlc_rbconfig_list[1] = {rlc_rbconfig}; + struct NR_CellGroupConfig__rlc_BearerToAddModList rlc_bearer_list = { + .list = { .array = rlc_rbconfig_list, .count = 1, .size = 1, } + }; + + /* Note! previously, in nr_DRB_preconfiguration(), we passed ENB_FLAG_NO + * if ENB_NAS_USE_TUN was *not* set. It seems to me that we could not set + * this flag anywhere in the code, hence we would always configure PDCP + * with ENB_FLAG_NO in nr_DRB_preconfiguration(). This makes sense for + * noS1, because the result of passing ENB_FLAG_NO to PDCP is that PDCP + * will output the packets at a local interface, which is in line with + * the noS1 mode. Hence, below, we simply hardcode ENB_FLAG_NO */ + // setup PDCP, RLC + nr_pdcp_add_drbs(ENB_FLAG_NO, 0x1234, 0, rbconfig->drb_ToAddModList, 0, NULL, NULL, &rlc_bearer_list); + nr_rlc_add_drb(0x1234, rbconfig->drb_ToAddModList->list.array[0]->drb_Identity, rlc_rbconfig); + + // free memory + free_nr_noS1_bearer_config(&rbconfig, &rlc_rbconfig); + } } else { RC.nrmac = NULL; diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h index 1cd0f89736..b8517da55e 100644 --- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h @@ -614,6 +614,7 @@ typedef struct NR_mac_dir_stats { uint64_t errors; uint64_t total_bytes; uint32_t current_bytes; + uint64_t total_sdu_bytes; uint32_t total_rbs; uint32_t total_rbs_retx; uint32_t num_mac_sdu; diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index b0b4e235c6..b7de2ffad4 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -647,7 +647,6 @@ pdcp_data_ind( exit(1); } - //uint8_t dc = pdcp_get_dc_filed((unsigned char*)sdu_buffer_pP->data); } /* diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c index 675fbd8a57..c1ba248178 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c @@ -34,27 +34,6 @@ extern bool util_mark_nth_bit_of_octet(uint8_t* octet, uint8_t index); -/* - * Parses data/control field out of buffer of User Plane PDCP Data PDU with - * long PDCP SN (12-bit) - * - * @param pdu_buffer PDCP PDU buffer - * @return 1 bit dc - */ -uint8_t pdcp_get_dc_filed(unsigned char* pdu_buffer) -{ - uint8_t dc = 0x00; - - if (pdu_buffer == NULL) { - return 0; - } - - dc = (uint8_t)pdu_buffer[0] & 0xF0; // Reset D/C field - dc >>= 8; // FIXME this is broken!!! returns 0 all the time - - return dc; -} - /* * Parses sequence number out of buffer of User Plane PDCP Data PDU with * long PDCP SN (12-bit) diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h index 423f69afc9..6adcde8f74 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h @@ -101,16 +101,6 @@ typedef struct { */ #define PDCP_CONTROL_PDU_STATUS_REPORT_HEADER_SIZE 2 -/* - * Parses data/control field out of buffer of User Plane PDCP Data PDU with - * long PDCP SN (12-bit) - * - * @param pdu_buffer PDCP PDU buffer - * @return 1 bit dc - */ - -uint8_t pdcp_get_dc_filed(unsigned char* pdu_buffer); - /* * Parses sequence number out of buffer of User Plane PDCP Data PDU with * long PDCP SN (12-bit) diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp.h b/openair2/LAYER2/nr_pdcp/nr_pdcp.h index 215ae8a03c..4a8966e100 100644 --- a/openair2/LAYER2/nr_pdcp/nr_pdcp.h +++ b/openair2/LAYER2/nr_pdcp/nr_pdcp.h @@ -26,6 +26,5 @@ #define _NR_PDCP_H_ void nr_pdcp_layer_init_ue(void); -void nr_DRB_preconfiguration(ue_id_t crntiMaybeUEid); #endif /* _NR_PDCP_H_ */ diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h index 762c91c747..965ea6a1ec 100644 --- a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h +++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h @@ -187,6 +187,4 @@ nr_pdcp_entity_t *new_nr_pdcp_entity( unsigned char *ciphering_key, unsigned char *integrity_key); -void nr_DRB_preconfiguration(ue_id_t crntiMaybeUEid); - #endif /* _NR_PDCP_ENTITY_H_ */ diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c index efbb638a7e..ebd2d17842 100644 --- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c +++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c @@ -962,78 +962,6 @@ bool rrc_pdcp_config_asn1_req(const protocol_ctxt_t *const ctxt_pP, return 0; } -void nr_DRB_preconfiguration(ue_id_t crntiMaybeUEid) -{ - - NR_RadioBearerConfig_t *rbconfig = NULL; - struct NR_CellGroupConfig__rlc_BearerToAddModList *Rlc_Bearer_ToAdd_list = NULL; - protocol_ctxt_t ctxt; - //fill_default_rbconfig(rb_config, 5, 1); - rbconfig = calloc(1, sizeof(*rbconfig)); - - rbconfig->srb_ToAddModList = NULL; - rbconfig->srb3_ToRelease = NULL; - rbconfig->drb_ToAddModList = calloc(1,sizeof(*rbconfig->drb_ToAddModList)); - NR_DRB_ToAddMod_t *drb_ToAddMod = calloc(1,sizeof(*drb_ToAddMod)); - drb_ToAddMod->cnAssociation = calloc(1,sizeof(*drb_ToAddMod->cnAssociation)); - drb_ToAddMod->cnAssociation->present = NR_DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity; - drb_ToAddMod->cnAssociation->choice.eps_BearerIdentity= 10; - drb_ToAddMod->drb_Identity = 1; - drb_ToAddMod->reestablishPDCP = NULL; - drb_ToAddMod->recoverPDCP = NULL; - drb_ToAddMod->pdcp_Config = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config)); - asn1cCalloc(drb_ToAddMod->pdcp_Config->drb, drb); - asn1cCallocOne(drb->discardTimer, NR_PDCP_Config__drb__discardTimer_infinity); - asn1cCallocOne(drb->pdcp_SN_SizeUL, NR_PDCP_Config__drb__pdcp_SN_SizeUL_len18bits); - asn1cCallocOne(drb->pdcp_SN_SizeDL, NR_PDCP_Config__drb__pdcp_SN_SizeDL_len18bits); - drb->headerCompression.present = NR_PDCP_Config__drb__headerCompression_PR_notUsed; - drb->headerCompression.choice.notUsed = 0; - - drb->integrityProtection = NULL; - drb->statusReportRequired = NULL; - drb->outOfOrderDelivery = NULL; - drb_ToAddMod->pdcp_Config->moreThanOneRLC = NULL; - - asn1cCallocOne(drb_ToAddMod->pdcp_Config->t_Reordering, NR_PDCP_Config__t_Reordering_ms0); - drb_ToAddMod->pdcp_Config->ext1 = NULL; - - asn1cSeqAdd(&rbconfig->drb_ToAddModList->list,drb_ToAddMod); - - rbconfig->drb_ToReleaseList = NULL; - - asn1cCalloc(rbconfig->securityConfig, secConf); - asn1cCalloc(secConf->securityAlgorithmConfig, secConfAlgo); - secConfAlgo->cipheringAlgorithm = NR_CipheringAlgorithm_nea0; - secConfAlgo->integrityProtAlgorithm = NULL; - asn1cCallocOne(secConf->keyToUse, NR_SecurityConfig__keyToUse_master); - - if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { - xer_fprint(stdout, &asn_DEF_NR_RadioBearerConfig, (const void*)rbconfig); - } - - NR_RLC_BearerConfig_t *RLC_BearerConfig = calloc(1,sizeof(*RLC_BearerConfig)); - nr_rlc_bearer_init(RLC_BearerConfig,NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity); - nr_drb_config(RLC_BearerConfig->rlc_Config, NR_RLC_Config_PR_um_Bi_Directional); - //nr_drb_config(RLC_BearerConfig->rlc_Config, NR_RLC_Config_PR_am); - nr_rlc_bearer_init_ul_spec(RLC_BearerConfig->mac_LogicalChannelConfig); - - Rlc_Bearer_ToAdd_list = calloc(1,sizeof(*Rlc_Bearer_ToAdd_list)); - asn1cSeqAdd(&Rlc_Bearer_ToAdd_list->list, RLC_BearerConfig); - - if (ENB_NAS_USE_TUN){ - PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, ENB_FLAG_YES, crntiMaybeUEid, 0, 0, 0); - } - else{ - PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, ENB_FLAG_NO, crntiMaybeUEid, 0, 0, 0); - } - - nr_pdcp_add_drbs(ctxt.enb_flag, ctxt.rntiMaybeUEid, 0, rbconfig->drb_ToAddModList, 0, NULL, NULL, Rlc_Bearer_ToAdd_list); - - nr_rlc_add_drb(ctxt.rntiMaybeUEid, drb_ToAddMod->drb_Identity, RLC_BearerConfig); - - LOG_D(PDCP, "%s:%d: done RRC PDCP/RLC ASN1 request for UE ID/RNTI %ld\n", __FUNCTION__, __LINE__, ctxt.rntiMaybeUEid); -} - uint64_t get_pdcp_optmask(void) { return pdcp_optmask; diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c index 103044f1bc..b4dea5b51b 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c +++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c @@ -54,84 +54,6 @@ static int nr_rlc_current_time_last_frame; static int nr_rlc_current_time_last_subframe; -void nr_rlc_bearer_init(NR_RLC_BearerConfig_t *RLC_BearerConfig, NR_RLC_BearerConfig__servedRadioBearer_PR rb_type){ - - RLC_BearerConfig->servedRadioBearer = calloc(1, sizeof(*RLC_BearerConfig->servedRadioBearer)); - RLC_BearerConfig->reestablishRLC = calloc(1, sizeof(*RLC_BearerConfig->reestablishRLC)); - RLC_BearerConfig->rlc_Config = calloc(1, sizeof(*RLC_BearerConfig->rlc_Config)); - RLC_BearerConfig->mac_LogicalChannelConfig = calloc(1, sizeof(*RLC_BearerConfig->mac_LogicalChannelConfig)); - - *RLC_BearerConfig->reestablishRLC = NR_RLC_BearerConfig__reestablishRLC_true; - if(rb_type == NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity){ - RLC_BearerConfig->logicalChannelIdentity = 4; - RLC_BearerConfig->servedRadioBearer->present = NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity; - RLC_BearerConfig->servedRadioBearer->choice.drb_Identity = 1; - } - else{ - RLC_BearerConfig->logicalChannelIdentity = 1; - RLC_BearerConfig->servedRadioBearer->present = NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity; - RLC_BearerConfig->servedRadioBearer->choice.srb_Identity = 1; - } - -} - -void nr_rlc_bearer_init_ul_spec(struct NR_LogicalChannelConfig *mac_LogicalChannelConfig){ - - mac_LogicalChannelConfig->ul_SpecificParameters = calloc(1, sizeof(*mac_LogicalChannelConfig->ul_SpecificParameters)); - mac_LogicalChannelConfig->ul_SpecificParameters->priority = 1; - mac_LogicalChannelConfig->ul_SpecificParameters->prioritisedBitRate = NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity; - mac_LogicalChannelConfig->ul_SpecificParameters->bucketSizeDuration = NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50; - mac_LogicalChannelConfig->ul_SpecificParameters->allowedServingCells = NULL; - mac_LogicalChannelConfig->ul_SpecificParameters->allowedSCS_List = NULL; - mac_LogicalChannelConfig->ul_SpecificParameters->maxPUSCH_Duration = NULL; - mac_LogicalChannelConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULL; - - mac_LogicalChannelConfig->ul_SpecificParameters->logicalChannelGroup = calloc(1,sizeof(*mac_LogicalChannelConfig->ul_SpecificParameters->logicalChannelGroup)); - *mac_LogicalChannelConfig->ul_SpecificParameters->logicalChannelGroup = 1; - mac_LogicalChannelConfig->ul_SpecificParameters->schedulingRequestID = calloc(1,sizeof(*mac_LogicalChannelConfig->ul_SpecificParameters->schedulingRequestID)); - *mac_LogicalChannelConfig->ul_SpecificParameters->schedulingRequestID = 0; - mac_LogicalChannelConfig->ul_SpecificParameters->logicalChannelSR_Mask = false; - mac_LogicalChannelConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false; - mac_LogicalChannelConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULL; - -} - -void nr_drb_config(struct NR_RLC_Config *rlc_Config, NR_RLC_Config_PR rlc_config_pr){ - - switch (rlc_config_pr){ - case NR_RLC_Config_PR_um_Bi_Directional: - // RLC UM Bi-directional Bearer configuration - LOG_I(RLC, "RLC UM Bi-directional Bearer configuration selected \n"); - rlc_Config->choice.um_Bi_Directional = calloc(1, sizeof(*rlc_Config->choice.um_Bi_Directional)); - rlc_Config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = calloc(1, sizeof(*rlc_Config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength)); - *rlc_Config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = NR_SN_FieldLengthUM_size12; - rlc_Config->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength = calloc(1, sizeof(*rlc_Config->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength)); - *rlc_Config->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength = NR_SN_FieldLengthUM_size12; - rlc_Config->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly = NR_T_Reassembly_ms15; - break; - case NR_RLC_Config_PR_am: - // RLC AM Bearer configuration - rlc_Config->choice.am = calloc(1, sizeof(*rlc_Config->choice.am)); - rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength = calloc(1, sizeof(*rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength)); - *rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength = NR_SN_FieldLengthAM_size18; - rlc_Config->choice.am->ul_AM_RLC.t_PollRetransmit = NR_T_PollRetransmit_ms45; - rlc_Config->choice.am->ul_AM_RLC.pollPDU = NR_PollPDU_p64; - rlc_Config->choice.am->ul_AM_RLC.pollByte = NR_PollByte_kB500; - rlc_Config->choice.am->ul_AM_RLC.maxRetxThreshold = NR_UL_AM_RLC__maxRetxThreshold_t32; - rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength = calloc(1, sizeof(*rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength)); - *rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength = NR_SN_FieldLengthAM_size18; - rlc_Config->choice.am->dl_AM_RLC.t_Reassembly = NR_T_Reassembly_ms15; - rlc_Config->choice.am->dl_AM_RLC.t_StatusProhibit = NR_T_StatusProhibit_ms15; - break; - default: - AssertFatal(0, "RLC config type %d not handled\n", rlc_config_pr); - break; - } - - rlc_Config->present = rlc_config_pr; - -} - void mac_rlc_data_ind ( const module_id_t module_idP, const rnti_t rntiP, diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h index 38a99dc86f..3b4bce7176 100644 --- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h +++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h @@ -39,12 +39,6 @@ struct NR_RLC_Config; struct NR_LogicalChannelConfig; -void nr_rlc_bearer_init(NR_RLC_BearerConfig_t *RLC_BearerConfig, NR_RLC_BearerConfig__servedRadioBearer_PR rb_type); - -void nr_drb_config(struct NR_RLC_Config *rlc_Config, NR_RLC_Config_PR rlc_config_pr); - -void nr_rlc_bearer_init_ul_spec(struct NR_LogicalChannelConfig *mac_LogicalChannelConfig); - void nr_rlc_add_srb(int rnti, int srb_id, const NR_RLC_BearerConfig_t *rlc_BearerConfig); void nr_rlc_add_drb(int rnti, int drb_id, const NR_RLC_BearerConfig_t *rlc_BearerConfig); diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index 6aa44194a3..7312eeeef2 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -1245,7 +1245,7 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_ } } pthread_mutex_unlock(&mac_IF_mutex); - return 0; + return ret_mask; } nr_ue_if_module_t *nr_ue_if_module_init(uint32_t module_id){ diff --git a/openair2/RRC/LTE/MESSAGES/asn1_msg.c b/openair2/RRC/LTE/MESSAGES/asn1_msg.c index f5e6959cf5..8c16487296 100644 --- a/openair2/RRC/LTE/MESSAGES/asn1_msg.c +++ b/openair2/RRC/LTE/MESSAGES/asn1_msg.c @@ -1499,7 +1499,7 @@ uint8_t do_SIB23(uint8_t Mod_id, //memset((*sib2)->radioResourceConfigCommon.ext4->bcch_Config_v1310, 0, sizeof(BCCH_Config_v1310_t)); //(*sib2)->radioResourceConfigCommon.ext4->bcch_Config_v1310->modificationPeriodCoeff_v1310 = BCCH_Config_v1310__modificationPeriodCoeff_v1310_n64; - if (configuration->pcch_config_v1310) { + if (configuration->pcch_config_v1310[CC_id] == true) { (*sib2)->radioResourceConfigCommon.ext4->pcch_Config_v1310 = CALLOC(1, sizeof(LTE_PCCH_Config_v1310_t)); (*sib2)->radioResourceConfigCommon.ext4->pcch_Config_v1310->paging_narrowBands_r13 = configuration->paging_narrowbands_r13[CC_id]; (*sib2)->radioResourceConfigCommon.ext4->pcch_Config_v1310->mpdcch_NumRepetition_Paging_r13 = configuration->mpdcch_numrepetition_paging_r13[CC_id]; diff --git a/openair2/RRC/LTE/rrc_defs.h b/openair2/RRC/LTE/rrc_defs.h index 6ce27da5ce..30f47b99ac 100644 --- a/openair2/RRC/LTE/rrc_defs.h +++ b/openair2/RRC/LTE/rrc_defs.h @@ -696,7 +696,6 @@ typedef struct { uint32_t N_RB_DL; uint32_t pbch_repetition; LTE_BCCH_BCH_Message_t mib; - LTE_BCCH_BCH_Message_t *mib_DU; LTE_BCCH_DL_SCH_Message_t siblock1; LTE_BCCH_DL_SCH_Message_t siblock1_BR; LTE_BCCH_DL_SCH_Message_t *siblock1_DU; diff --git a/openair2/RRC/NR/L2_nr_interface.c b/openair2/RRC/NR/L2_nr_interface.c index d8d43e490c..2e83c69af2 100644 --- a/openair2/RRC/NR/L2_nr_interface.c +++ b/openair2/RRC/NR/L2_nr_interface.c @@ -35,6 +35,9 @@ #include "common/ran_context.h" #include "LAYER2/NR_MAC_COMMON/nr_mac_common.h" #include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h" +#include "LAYER2/NR_MAC_gNB/nr_mac_gNB.h" +#include "LAYER2/NR_MAC_gNB/mac_proto.h" +#include "LAYER2/nr_rlc/nr_rlc_oai_api.h" #include "intertask_interface.h" @@ -47,12 +50,17 @@ extern RAN_CONTEXT_t RC; +void nr_rrc_mac_remove_ue(rnti_t rntiMaybeUEid) +{ + nr_rlc_remove_ue(rntiMaybeUEid); -int -nr_rrc_mac_remove_ue(module_id_t mod_idP, - rnti_t rntiP){ - // todo - return 0; + gNB_MAC_INST *nrmac = RC.nrmac[0]; + mac_remove_nr_ue(nrmac, rntiMaybeUEid); +} + +void nr_rrc_mac_update_cellgroup(rnti_t rntiMaybeUEid, NR_CellGroupConfig_t *cgc) +{ + nr_mac_update_cellgroup(RC.nrmac[0], rntiMaybeUEid, cgc); } uint16_t mac_rrc_nr_data_req(const module_id_t Mod_idP, @@ -69,30 +77,15 @@ uint16_t mac_rrc_nr_data_req(const module_id_t Mod_idP, // MIBCH if ((Srb_id & RAB_OFFSET) == MIBCH) { - asn_enc_rval_t enc_rval; - uint8_t sfn_msb = (uint8_t)((frameP>>4)&0x3f); + int encode_size = 3; rrc_gNB_carrier_data_t *carrier = &RC.nrrrc[Mod_idP]->carrier; - NR_BCCH_BCH_Message_t *mib = &carrier->mib; - - mib->message.choice.mib->systemFrameNumber.buf[0] = sfn_msb << 2; - enc_rval = uper_encode_to_buffer(&asn_DEF_NR_BCCH_BCH_Message, - NULL, - (void *) mib, - carrier->MIB, - 24); - LOG_D(NR_RRC, "Encoded MIB for frame %d sfn_msb %d (%p), bits %lu\n", frameP, sfn_msb, carrier->MIB, - enc_rval.encoded); - buffer_pP[0] = carrier->MIB[0]; - buffer_pP[1] = carrier->MIB[1]; - buffer_pP[2] = carrier->MIB[2]; + int encoded = encode_MIB_NR(carrier->mib, frameP, buffer_pP, encode_size); + DevAssert(encoded == encode_size); LOG_D(NR_RRC, "MIB PDU buffer_pP[0]=%x , buffer_pP[1]=%x, buffer_pP[2]=%x\n", buffer_pP[0], buffer_pP[1], buffer_pP[2]); - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", - enc_rval.failed_type->name, enc_rval.encoded); - return 3; + return encode_size; } - // TODO BCCH SIB1 SIBs if ((Srb_id & RAB_OFFSET) == BCCH) { memcpy(&buffer_pP[0], RC.nrrrc[Mod_idP]->carrier.SIB1, RC.nrrrc[Mod_idP]->carrier.sizeof_SIB1); return RC.nrrrc[Mod_idP]->carrier.sizeof_SIB1; diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c index 283b1b9b79..5bee6db0f1 100644 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.c +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c @@ -194,401 +194,6 @@ int xer_nr_sprint (char *string, size_t string_size, asn_TYPE_descriptor_t *td, //------------------------------------------------------------------------------ -uint8_t do_MIB_NR(gNB_RRC_INST *rrc,uint32_t frame) { - - asn_enc_rval_t enc_rval; - rrc_gNB_carrier_data_t *carrier = &rrc->carrier; - - NR_BCCH_BCH_Message_t *mib = &carrier->mib; - NR_ServingCellConfigCommon_t *scc = carrier->servingcellconfigcommon; - - memset(mib,0,sizeof(NR_BCCH_BCH_Message_t)); - mib->message.present = NR_BCCH_BCH_MessageType_PR_mib; - mib->message.choice.mib = CALLOC(1,sizeof(struct NR_MIB)); - memset(mib->message.choice.mib,0,sizeof(struct NR_MIB)); - //36.331 SFN BIT STRING (SIZE (8) , 38.331 SFN BIT STRING (SIZE (6)) - uint8_t sfn_msb = (uint8_t)((frame>>4)&0x3f); - mib->message.choice.mib->systemFrameNumber.buf = CALLOC(1,sizeof(uint8_t)); - mib->message.choice.mib->systemFrameNumber.buf[0] = sfn_msb << 2; - mib->message.choice.mib->systemFrameNumber.size = 1; - mib->message.choice.mib->systemFrameNumber.bits_unused=2; - //38.331 spare BIT STRING (SIZE (1)) - uint16_t *spare= CALLOC(1, sizeof(uint16_t)); - - if (spare == NULL) abort(); - - mib->message.choice.mib->spare.buf = (uint8_t *)spare; - mib->message.choice.mib->spare.size = 1; - mib->message.choice.mib->spare.bits_unused = 7; // This makes a spare of 1 bits - - AssertFatal(scc->ssbSubcarrierSpacing != NULL, "scc->ssbSubcarrierSpacing is null\n"); - int band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]; - frequency_range_t frequency_range = band < 100 ? FR1 : FR2; - int ssb_subcarrier_offset = 31; // default value for NSA - if (get_softmodem_params()->sa) { - uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA); - int scs_scaling = scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000 ? 3 : 1; - ssb_subcarrier_offset = (absolute_diff/scs_scaling) % 24; - if(frequency_range == FR2) - ssb_subcarrier_offset >>= 1; // this assumes 120kHz SCS for SSB and subCarrierSpacingCommon (only option supported by OAI for now) - } - mib->message.choice.mib->ssb_SubcarrierOffset = ssb_subcarrier_offset & 15; - - /* - * The SIB1 will be sent in this allocation (Type0-PDCCH) : 38.213, 13-4 Table and 38.213 13-11 to 13-14 tables - * the reverse allocation is in nr_ue_decode_mib() - */ - const NR_PDCCH_ConfigCommon_t *pdcch_cc = scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup; - long cset0 = pdcch_cc->controlResourceSetZero ? *pdcch_cc->controlResourceSetZero : 0; - mib->message.choice.mib->pdcch_ConfigSIB1.controlResourceSetZero = cset0; - long ss0 = pdcch_cc->searchSpaceZero ? *pdcch_cc->searchSpaceZero : 0; - mib->message.choice.mib->pdcch_ConfigSIB1.searchSpaceZero = ss0; - - switch (*scc->ssbSubcarrierSpacing) { - case NR_SubcarrierSpacing_kHz15: - mib->message.choice.mib->subCarrierSpacingCommon = NR_MIB__subCarrierSpacingCommon_scs15or60; - break; - - case NR_SubcarrierSpacing_kHz30: - mib->message.choice.mib->subCarrierSpacingCommon = NR_MIB__subCarrierSpacingCommon_scs30or120; - break; - - case NR_SubcarrierSpacing_kHz60: - mib->message.choice.mib->subCarrierSpacingCommon = NR_MIB__subCarrierSpacingCommon_scs15or60; - break; - - case NR_SubcarrierSpacing_kHz120: - mib->message.choice.mib->subCarrierSpacingCommon = NR_MIB__subCarrierSpacingCommon_scs30or120; - break; - - case NR_SubcarrierSpacing_kHz240: - AssertFatal(1==0,"Unknown subCarrierSpacingCommon %d\n",(int)*scc->ssbSubcarrierSpacing); - break; - - default: - AssertFatal(1==0,"Unknown subCarrierSpacingCommon %d\n",(int)*scc->ssbSubcarrierSpacing); - } - - switch (scc->dmrs_TypeA_Position) { - case NR_ServingCellConfigCommon__dmrs_TypeA_Position_pos2: - mib->message.choice.mib->dmrs_TypeA_Position = NR_MIB__dmrs_TypeA_Position_pos2; - break; - - case NR_ServingCellConfigCommon__dmrs_TypeA_Position_pos3: - mib->message.choice.mib->dmrs_TypeA_Position = NR_MIB__dmrs_TypeA_Position_pos3; - break; - - default: - AssertFatal(1==0,"Unknown dmrs_TypeA_Position %d\n",(int)scc->dmrs_TypeA_Position); - } - - // assign_enum - mib->message.choice.mib->cellBarred = NR_MIB__cellBarred_notBarred; - // assign_enum - mib->message.choice.mib->intraFreqReselection = NR_MIB__intraFreqReselection_notAllowed; - //encode MIB to data - enc_rval = uper_encode_to_buffer(&asn_DEF_NR_BCCH_BCH_Message, - NULL, - (void *)mib, - carrier->MIB, - 24); - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", - enc_rval.failed_type->name, enc_rval.encoded); - return((enc_rval.encoded+7)/8); -} - -uint16_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier, - gNB_RrcConfigurationReq *configuration) { - - asn_enc_rval_t enc_rval; - NR_BCCH_DL_SCH_Message_t *sib1_message = CALLOC(1,sizeof(NR_BCCH_DL_SCH_Message_t)); - carrier->siblock1 = sib1_message; - sib1_message->message.present = NR_BCCH_DL_SCH_MessageType_PR_c1; - sib1_message->message.choice.c1 = CALLOC(1,sizeof(struct NR_BCCH_DL_SCH_MessageType__c1)); - sib1_message->message.choice.c1->present = NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1; - sib1_message->message.choice.c1->choice.systemInformationBlockType1 = CALLOC(1,sizeof(struct NR_SIB1)); - - struct NR_SIB1 *sib1 = sib1_message->message.choice.c1->choice.systemInformationBlockType1; - - // cellSelectionInfo - sib1->cellSelectionInfo = CALLOC(1,sizeof(struct NR_SIB1__cellSelectionInfo)); - // Fixme: should be in config file - //The IE Q-RxLevMin is used to indicate for cell selection/ re-selection the required minimum received RSRP level in the (NR) cell. - //Corresponds to parameter Qrxlevmin in TS38.304. - //Actual value Qrxlevmin = field value * 2 [dBm]. - sib1->cellSelectionInfo->q_RxLevMin = -65; - - // cellAccessRelatedInfo - // TODO : Add support for more than one PLMN - int num_plmn = 1; // int num_plmn = configuration->num_plmn; - asn1cSequenceAdd(sib1->cellAccessRelatedInfo.plmn_IdentityInfoList.list, struct NR_PLMN_IdentityInfo, nr_plmn_info); - for (int i = 0; i < num_plmn; ++i) { - asn1cSequenceAdd(nr_plmn_info->plmn_IdentityList.list, struct NR_PLMN_Identity, nr_plmn); - asn1cCalloc(nr_plmn->mcc, mcc); - int confMcc=configuration->mcc[i]; - asn1cSequenceAdd(mcc->list, NR_MCC_MNC_Digit_t, mcc0); - *mcc0=(confMcc/100)%10; - asn1cSequenceAdd(mcc->list, NR_MCC_MNC_Digit_t, mcc1); - *mcc1=(confMcc/10)%10; - asn1cSequenceAdd(mcc->list, NR_MCC_MNC_Digit_t, mcc2); - *mcc2=confMcc%10; - int mnc=configuration->mnc[i]; - if(configuration->mnc_digit_length[i] == 3) { - asn1cSequenceAdd(nr_plmn->mnc.list, NR_MCC_MNC_Digit_t, mnc0); - *mnc0=(configuration->mnc[i]/100)%10; - } - asn1cSequenceAdd(nr_plmn->mnc.list, NR_MCC_MNC_Digit_t, mnc1); - *mnc1=(mnc/10)%10; - asn1cSequenceAdd(nr_plmn->mnc.list, NR_MCC_MNC_Digit_t, mnc2); - *mnc2=(mnc)%10; - }//end plmn loop - - nr_plmn_info->cellIdentity.buf = CALLOC(1,5); - nr_plmn_info->cellIdentity.size= 5; - nr_plmn_info->cellIdentity.bits_unused= 4; - uint64_t tmp=htobe64(configuration->cell_identity)<<4; - memcpy(nr_plmn_info->cellIdentity.buf, ((char*)&tmp)+3, 5); - nr_plmn_info->cellReservedForOperatorUse = NR_PLMN_IdentityInfo__cellReservedForOperatorUse_notReserved; - - nr_plmn_info->trackingAreaCode = CALLOC(1,sizeof(NR_TrackingAreaCode_t)); - uint32_t tmp2=htobe32(configuration->tac); - nr_plmn_info->trackingAreaCode->buf = CALLOC(1,3); - memcpy(nr_plmn_info->trackingAreaCode->buf, ((char*) &tmp2)+1, 3); - nr_plmn_info->trackingAreaCode->size = 3; - nr_plmn_info->trackingAreaCode->bits_unused = 0; - - // connEstFailureControl - // TODO: add connEstFailureControl - - //si-SchedulingInfo - /*sib1->si_SchedulingInfo = CALLOC(1,sizeof(struct NR_SI_SchedulingInfo)); - asn_set_empty(&sib1->si_SchedulingInfo->schedulingInfoList.list); - sib1->si_SchedulingInfo->si_WindowLength = NR_SI_SchedulingInfo__si_WindowLength_s40; - struct NR_SchedulingInfo *schedulingInfo = CALLOC(1,sizeof(struct NR_SchedulingInfo)); - schedulingInfo->si_BroadcastStatus = NR_SchedulingInfo__si_BroadcastStatus_broadcasting; - schedulingInfo->si_Periodicity = NR_SchedulingInfo__si_Periodicity_rf8; - asn_set_empty(&schedulingInfo->sib_MappingInfo.list); - - NR_SIB_TypeInfo_t *sib_type3 = CALLOC(1,sizeof(e_NR_SIB_TypeInfo__type)); - sib_type3->type = NR_SIB_TypeInfo__type_sibType3; - sib_type3->valueTag = CALLOC(1,sizeof(sib_type3->valueTag)); - asn1cSeqAdd(&schedulingInfo->sib_MappingInfo.list,sib_type3); - - NR_SIB_TypeInfo_t *sib_type5 = CALLOC(1,sizeof(e_NR_SIB_TypeInfo__type)); - sib_type5->type = NR_SIB_TypeInfo__type_sibType5; - sib_type5->valueTag = CALLOC(1,sizeof(sib_type5->valueTag)); - asn1cSeqAdd(&schedulingInfo->sib_MappingInfo.list,sib_type5); - - NR_SIB_TypeInfo_t *sib_type4 = CALLOC(1,sizeof(e_NR_SIB_TypeInfo__type)); - sib_type4->type = NR_SIB_TypeInfo__type_sibType4; - sib_type4->valueTag = CALLOC(1,sizeof(sib_type4->valueTag)); - asn1cSeqAdd(&schedulingInfo->sib_MappingInfo.list,sib_type4); - - NR_SIB_TypeInfo_t *sib_type2 = CALLOC(1,sizeof(e_NR_SIB_TypeInfo__type)); - sib_type2->type = NR_SIB_TypeInfo__type_sibType2; - sib_type2->valueTag = CALLOC(1,sizeof(sib_type2->valueTag)); - asn1cSeqAdd(&schedulingInfo->sib_MappingInfo.list,sib_type2); - - asn1cSeqAdd(&sib1->si_SchedulingInfo->schedulingInfoList.list,schedulingInfo);*/ - - // servingCellConfigCommon - asn1cCalloc(sib1->servingCellConfigCommon, ServCellCom); - NR_BWP_DownlinkCommon_t *initialDownlinkBWP=&ServCellCom->downlinkConfigCommon.initialDownlinkBWP; - initialDownlinkBWP->genericParameters= - configuration->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters; - - for(int i = 0; i< configuration->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.count; i++) { - asn1cSequenceAdd(ServCellCom->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list, - struct NR_NR_MultiBandInfo, nrMultiBandInfo); - nrMultiBandInfo->freqBandIndicatorNR = configuration->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[i]; - } - - int scs_scaling0 = 1<<(configuration->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing); - int scs_scaling = scs_scaling0; - int scs_scaling2 = scs_scaling0; - if (configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000) { - scs_scaling = scs_scaling0*3; - } - if (configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA > 2016666) { - scs_scaling = scs_scaling0>>2; - scs_scaling2 = scs_scaling0>>2; - } - uint32_t absolute_diff = (*configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - - configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA); - - sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.offsetToPointA = scs_scaling2 * (absolute_diff/(12*scs_scaling) - 10); - - LOG_I(NR_RRC,"SIB1 freq: absoluteFrequencySSB %ld, absoluteFrequencyPointA %ld\n", - *configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB, - configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA); - LOG_I(NR_RRC,"SIB1 freq: absolute_diff %d, %d*(absolute_diff/(12*%d) - 10) %d\n", - absolute_diff,scs_scaling2,scs_scaling,(int)sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.offsetToPointA); - - for(int i = 0; i< configuration->scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.count; i++) { - asn1cSeqAdd(&ServCellCom->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list, - configuration->scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[i]); - } - - initialDownlinkBWP->pdcch_ConfigCommon = - configuration->scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon; - initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList = - CALLOC(1,sizeof(struct NR_PDCCH_ConfigCommon__commonSearchSpaceList)); - - NR_SearchSpace_t *ss1 = rrc_searchspace_config(true, 1, 0); - asn1cSeqAdd(&initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list, ss1); - - NR_SearchSpace_t *ss2 = rrc_searchspace_config(true, 2, 0); - asn1cSeqAdd(&initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list, ss2); - - NR_SearchSpace_t *ss3 = rrc_searchspace_config(true, 3, 0); - asn1cSeqAdd(&initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list, ss3); - - asn1cCallocOne(initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1, 0); - asn1cCallocOne(initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->searchSpaceOtherSystemInformation, 3); - asn1cCallocOne(initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->pagingSearchSpace, 2); - asn1cCallocOne(initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->ra_SearchSpace, 1); - - initialDownlinkBWP->pdsch_ConfigCommon = configuration->scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon; - ServCellCom->downlinkConfigCommon.bcch_Config.modificationPeriodCoeff = NR_BCCH_Config__modificationPeriodCoeff_n2; - ServCellCom->downlinkConfigCommon.pcch_Config.defaultPagingCycle = NR_PagingCycle_rf256; - ServCellCom->downlinkConfigCommon.pcch_Config.nAndPagingFrameOffset.present = NR_PCCH_Config__nAndPagingFrameOffset_PR_quarterT; - ServCellCom->downlinkConfigCommon.pcch_Config.nAndPagingFrameOffset.choice.quarterT = 1; - ServCellCom->downlinkConfigCommon.pcch_Config.ns = NR_PCCH_Config__ns_one; - - asn1cCalloc(ServCellCom->downlinkConfigCommon.pcch_Config.firstPDCCH_MonitoringOccasionOfPO, - P0); - P0->present = NR_PCCH_Config__firstPDCCH_MonitoringOccasionOfPO_PR_sCS120KHZoneT_SCS60KHZhalfT_SCS30KHZquarterT_SCS15KHZoneEighthT; - - asn1cCalloc(P0->choice.sCS120KHZoneT_SCS60KHZhalfT_SCS30KHZquarterT_SCS15KHZoneEighthT, - Z8); - asn1cSequenceAdd(Z8->list, - long, - ZoneEight); - asn1cCallocOne(ZoneEight, 0); - - asn1cCalloc(ServCellCom->uplinkConfigCommon, UL); - asn_set_empty(&UL->frequencyInfoUL.scs_SpecificCarrierList.list); - for(int i = 0; i< configuration->scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.count; i++) { - asn1cSeqAdd(&UL->frequencyInfoUL.scs_SpecificCarrierList.list, - configuration->scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[i]); - } - - asn1cCallocOne(UL->frequencyInfoUL.p_Max, *configuration->scc->uplinkConfigCommon->frequencyInfoUL->p_Max); - - UL->initialUplinkBWP.genericParameters = configuration->scc->uplinkConfigCommon->initialUplinkBWP->genericParameters; - UL->initialUplinkBWP.rach_ConfigCommon = configuration->scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon; - UL->initialUplinkBWP.pusch_ConfigCommon = configuration->scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon; - UL->initialUplinkBWP.pusch_ConfigCommon->choice.setup->groupHoppingEnabledTransformPrecoding = NULL; - - UL->initialUplinkBWP.pucch_ConfigCommon = configuration->scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon; - - UL->timeAlignmentTimerCommon = NR_TimeAlignmentTimer_infinity; - - ServCellCom->n_TimingAdvanceOffset = configuration->scc->n_TimingAdvanceOffset; - - ServCellCom->ssb_PositionsInBurst.inOneGroup.buf = calloc(1, sizeof(uint8_t)); - uint8_t bitmap8,temp_bitmap=0; - switch (configuration->scc->ssb_PositionsInBurst->present) { - case NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_shortBitmap: - ServCellCom->ssb_PositionsInBurst.inOneGroup = configuration->scc->ssb_PositionsInBurst->choice.shortBitmap; - break; - case NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_mediumBitmap: - ServCellCom->ssb_PositionsInBurst.inOneGroup = configuration->scc->ssb_PositionsInBurst->choice.mediumBitmap; - break; - /* - groupPresence: This field is present when maximum number of SS/PBCH blocks per half frame equals to 64 as defined in TS 38.213 [13], clause 4.1. - The first/leftmost bit corresponds to the SS/PBCH index 0-7, the second bit corresponds to SS/PBCH block 8-15, and so on. - Value 0 in the bitmap indicates that the SSBs according to inOneGroup are absent. Value 1 indicates that the SS/PBCH blocks are transmitted in accordance with inOneGroup. - inOneGroup: When maximum number of SS/PBCH blocks per half frame equals to 64 as defined in TS 38.213 [13], clause 4.1, all 8 bit are valid; - The first/ leftmost bit corresponds to the first SS/PBCH block index in the group (i.e., to SSB index 0, 8, and so on); the second bit corresponds to the second SS/PBCH block index in the group - (i.e., to SSB index 1, 9, and so on), and so on. Value 0 in the bitmap indicates that the corresponding SS/PBCH block is not transmitted while value 1 indicates that the corresponding SS/PBCH block is transmitted. - */ - case NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_longBitmap: - ServCellCom->ssb_PositionsInBurst.inOneGroup.size = 1; - ServCellCom->ssb_PositionsInBurst.inOneGroup.bits_unused = 0; - ServCellCom->ssb_PositionsInBurst.groupPresence = calloc(1, sizeof(BIT_STRING_t)); - ServCellCom->ssb_PositionsInBurst.groupPresence->size = 1; - ServCellCom->ssb_PositionsInBurst.groupPresence->bits_unused = 0; - ServCellCom->ssb_PositionsInBurst.groupPresence->buf = calloc(1, sizeof(uint8_t)); - ServCellCom->ssb_PositionsInBurst.groupPresence->buf[0] = 0; - for (int i=0; i<8; i++){ - bitmap8 = configuration->scc->ssb_PositionsInBurst->choice.longBitmap.buf[i]; - if (bitmap8!=0){ - if(temp_bitmap==0) - temp_bitmap = bitmap8; - else - AssertFatal(temp_bitmap==bitmap8,"For longBitmap the groups of 8 SSBs containing at least 1 transmitted SSB should be all the same\n"); - - ServCellCom->ssb_PositionsInBurst.inOneGroup.buf[0] = bitmap8; - ServCellCom->ssb_PositionsInBurst.groupPresence->buf[0] |= 1<<(7-i); - } - } - break; - default: - AssertFatal(false,"ssb_PositionsInBurst not present\n"); - break; - } - - ServCellCom->ssb_PeriodicityServingCell = *configuration->scc->ssb_periodicityServingCell; - if (configuration->scc->tdd_UL_DL_ConfigurationCommon) { - ServCellCom->tdd_UL_DL_ConfigurationCommon = CALLOC(1,sizeof(struct NR_TDD_UL_DL_ConfigCommon)); - ServCellCom->tdd_UL_DL_ConfigurationCommon->referenceSubcarrierSpacing = configuration->scc->tdd_UL_DL_ConfigurationCommon->referenceSubcarrierSpacing; - ServCellCom->tdd_UL_DL_ConfigurationCommon->pattern1 = configuration->scc->tdd_UL_DL_ConfigurationCommon->pattern1; - ServCellCom->tdd_UL_DL_ConfigurationCommon->pattern2 = configuration->scc->tdd_UL_DL_ConfigurationCommon->pattern2; - } - ServCellCom->ss_PBCH_BlockPower = configuration->scc->ss_PBCH_BlockPower; - - // ims-EmergencySupport - // TODO: add ims-EmergencySupport - - // eCallOverIMS-Support - // TODO: add eCallOverIMS-Support - - // ue-TimersAndConstants - sib1->ue_TimersAndConstants = CALLOC(1,sizeof(struct NR_UE_TimersAndConstants)); - sib1->ue_TimersAndConstants->t300 = NR_UE_TimersAndConstants__t300_ms400; - sib1->ue_TimersAndConstants->t301 = NR_UE_TimersAndConstants__t301_ms400; - sib1->ue_TimersAndConstants->t310 = NR_UE_TimersAndConstants__t310_ms2000; - sib1->ue_TimersAndConstants->n310 = NR_UE_TimersAndConstants__n310_n10; - sib1->ue_TimersAndConstants->t311 = NR_UE_TimersAndConstants__t311_ms3000; - sib1->ue_TimersAndConstants->n311 = NR_UE_TimersAndConstants__n311_n1; - sib1->ue_TimersAndConstants->t319 = NR_UE_TimersAndConstants__t319_ms400; - - // uac-BarringInfo - /*sib1->uac_BarringInfo = CALLOC(1, sizeof(struct NR_SIB1__uac_BarringInfo)); - NR_UAC_BarringInfoSet_t *nr_uac_BarringInfoSet = CALLOC(1, sizeof(NR_UAC_BarringInfoSet_t)); - asn_set_empty(&sib1->uac_BarringInfo->uac_BarringInfoSetList); - nr_uac_BarringInfoSet->uac_BarringFactor = NR_UAC_BarringInfoSet__uac_BarringFactor_p95; - nr_uac_BarringInfoSet->uac_BarringTime = NR_UAC_BarringInfoSet__uac_BarringTime_s4; - nr_uac_BarringInfoSet->uac_BarringForAccessIdentity.buf = CALLOC(1, 1); - nr_uac_BarringInfoSet->uac_BarringForAccessIdentity.size = 1; - nr_uac_BarringInfoSet->uac_BarringForAccessIdentity.bits_unused = 1; - asn1cSeqAdd(&sib1->uac_BarringInfo->uac_BarringInfoSetList, nr_uac_BarringInfoSet);*/ - - // useFullResumeID - // TODO: add useFullResumeID - - // lateNonCriticalExtension - // TODO: add lateNonCriticalExtension - - // nonCriticalExtension - // TODO: add nonCriticalExtension - - xer_fprint(stdout, &asn_DEF_NR_SIB1, (const void*)sib1_message->message.choice.c1->choice.systemInformationBlockType1); - - if(carrier->SIB1 == NULL) carrier->SIB1=(uint8_t *) malloc16(NR_MAX_SIB_LENGTH/8); - enc_rval = uper_encode_to_buffer(&asn_DEF_NR_BCCH_DL_SCH_Message, - NULL, - (void *)sib1_message, - carrier->SIB1, - NR_MAX_SIB_LENGTH/8); - AssertFatal(enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", - enc_rval.failed_type->name, enc_rval.encoded); - AssertFatal(enc_rval.encoded <= NR_MAX_SIB_LENGTH, "ASN1 encoded length %zd bits. 3GPP TS 38.331 section 5.2.1 - The physical layer imposes a limit to the maximum size a SIB can take. The maximum SIB1 or SI message size is 2976 bits.\n", enc_rval.encoded); - - return((enc_rval.encoded+7)/8); -} - uint8_t do_SIB23_NR(rrc_gNB_carrier_data_t *carrier, gNB_RrcConfigurationReq *configuration) { asn_enc_rval_t enc_rval; @@ -687,240 +292,6 @@ int do_RRCReject(uint8_t Mod_id, return (enc_rval.encoded + 7) / 8; } -void fill_initial_SpCellConfig(int uid, - NR_SpCellConfig_t *SpCellConfig, - const NR_ServingCellConfigCommon_t *scc, - const NR_ServingCellConfig_t *servingcellconfigdedicated, - const gNB_RrcConfigurationReq *configuration) { - - // This assert will never happen in the current implementation because NUMBER_OF_UE_MAX = 4. - // However, if in the future NUMBER_OF_UE_MAX is increased, it will be necessary to improve the allocation of SRS resources, - // where the startPosition = 2 or 3 and sl160 = 17, 17, 27 ... 157 only give us 30 different allocations. - AssertFatal(uid>=0 && uid<30, "gNB cannot allocate the SRS resources\n"); - - const int pdsch_AntennaPorts = configuration->pdsch_AntennaPorts.N1 * configuration->pdsch_AntennaPorts.N2 * configuration->pdsch_AntennaPorts.XP; - int curr_bwp = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth,MAX_BWP_SIZE); - SpCellConfig->servCellIndex = NULL; - SpCellConfig->reconfigurationWithSync = NULL; - SpCellConfig->rlmInSyncOutOfSyncThreshold = NULL; - SpCellConfig->rlf_TimersAndConstants = NULL; - - SpCellConfig->spCellConfigDedicated = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated)); - SpCellConfig->spCellConfigDedicated->uplinkConfig = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->uplinkConfig)); - NR_UplinkConfig_t *uplinkConfig = SpCellConfig->spCellConfigDedicated->uplinkConfig; - - NR_BWP_UplinkDedicated_t *initialUplinkBWP = calloc(1,sizeof(*initialUplinkBWP)); - uplinkConfig->initialUplinkBWP = initialUplinkBWP; - initialUplinkBWP->pucch_Config = calloc(1,sizeof(*initialUplinkBWP->pucch_Config)); - initialUplinkBWP->pucch_Config->present = NR_SetupRelease_PUCCH_Config_PR_setup; - NR_PUCCH_Config_t *pucch_Config = calloc(1,sizeof(*pucch_Config)); - initialUplinkBWP->pucch_Config->choice.setup=pucch_Config; - pucch_Config->resourceSetToAddModList = calloc(1,sizeof(*pucch_Config->resourceSetToAddModList)); - pucch_Config->resourceSetToReleaseList = NULL; - pucch_Config->resourceToAddModList = calloc(1,sizeof(*pucch_Config->resourceToAddModList)); - pucch_Config->resourceToReleaseList = NULL; - config_pucch_resset0(pucch_Config, uid, curr_bwp, NULL); - config_pucch_resset1(pucch_Config, NULL); - set_pucch_power_config(pucch_Config, configuration->do_CSIRS); - - initialUplinkBWP->pusch_Config = config_pusch(NULL); - - long maxMIMO_Layers = uplinkConfig && - uplinkConfig->pusch_ServingCellConfig && - uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1 && - uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers ? - *uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers : 1; - - // We are using do_srs = 0 here because the periodic SRS will only be enabled in update_cellGroupConfig() if do_srs == 1 - initialUplinkBWP->srs_Config = calloc(1,sizeof(*initialUplinkBWP->srs_Config)); - config_srs(scc, initialUplinkBWP->srs_Config, NULL, curr_bwp, uid, 0, maxMIMO_Layers, 0); - - scheduling_request_config(scc, pucch_Config, scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing); - - set_dl_DataToUL_ACK(pucch_Config, configuration->minRXTXTIME, scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing); - - SpCellConfig->spCellConfigDedicated->initialDownlinkBWP = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->initialDownlinkBWP)); - NR_BWP_DownlinkDedicated_t *bwp_Dedicated = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP; - bwp_Dedicated->pdcch_Config=calloc(1,sizeof(*bwp_Dedicated->pdcch_Config)); - bwp_Dedicated->pdcch_Config->present = NR_SetupRelease_PDCCH_Config_PR_setup; - bwp_Dedicated->pdcch_Config->choice.setup = calloc(1,sizeof(*bwp_Dedicated->pdcch_Config->choice.setup)); - - bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList = calloc(1,sizeof(*bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList)); - - bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList = calloc(1,sizeof(*bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList)); - - NR_ControlResourceSet_t *coreset = calloc(1,sizeof(*coreset)); - - uint64_t bitmap = get_ssb_bitmap(scc); - rrc_coreset_config(coreset, 0, curr_bwp, bitmap); - - asn1cSeqAdd(&bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list, - coreset); - - bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList = calloc(1,sizeof(*bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList)); - - NR_SearchSpace_t *ss2 = rrc_searchspace_config(false, 5, coreset->controlResourceSetId); - asn1cSeqAdd(&bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list, ss2); - - bwp_Dedicated->pdsch_Config = config_pdsch(bitmap, 0, pdsch_AntennaPorts); - - SpCellConfig->spCellConfigDedicated->tag_Id=0; - SpCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig=calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig)); - NR_PDSCH_ServingCellConfig_t *pdsch_servingcellconfig = calloc(1,sizeof(*pdsch_servingcellconfig)); - SpCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->present = NR_SetupRelease_PDSCH_ServingCellConfig_PR_setup; - SpCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup = pdsch_servingcellconfig; - - // Downlink BWPs - int n_dl_bwp = 0; - if (servingcellconfigdedicated && - servingcellconfigdedicated->downlinkBWP_ToAddModList && - servingcellconfigdedicated->downlinkBWP_ToAddModList->list.count > 0) { - n_dl_bwp = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.count; - } - if(n_dl_bwp>0){ - SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList)); - for (int bwp_loop = 0; bwp_loop < n_dl_bwp; bwp_loop++) { - NR_BWP_Downlink_t *bwp = calloc(1, sizeof(*bwp)); - config_downlinkBWP(bwp, scc, - servingcellconfigdedicated, - NULL, 0, - false, bwp_loop, true); - asn1cSeqAdd(&SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list,bwp); - } - SpCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id)); - *SpCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = servingcellconfigdedicated->firstActiveDownlinkBWP_Id ? *servingcellconfigdedicated->firstActiveDownlinkBWP_Id : 1; - SpCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id)); - *SpCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = servingcellconfigdedicated->defaultDownlinkBWP_Id ? *servingcellconfigdedicated->defaultDownlinkBWP_Id : 1; - } - - // Uplink BWPs - int n_ul_bwp = 0; - if (servingcellconfigdedicated && servingcellconfigdedicated->uplinkConfig && - servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList && - servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count > 0) { - n_ul_bwp = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count; - } - if(n_ul_bwp>0) { - uplinkConfig->uplinkBWP_ToAddModList = calloc(1,sizeof(*uplinkConfig->uplinkBWP_ToAddModList)); - for (int bwp_loop = 0; bwp_loop < n_ul_bwp; bwp_loop++) { - NR_BWP_Uplink_t *ubwp = calloc(1, sizeof(*ubwp)); - config_uplinkBWP(ubwp, bwp_loop, true, uid, - configuration, - servingcellconfigdedicated, - scc, - NULL); - asn1cSeqAdd(&uplinkConfig->uplinkBWP_ToAddModList->list, ubwp); - } - uplinkConfig->firstActiveUplinkBWP_Id = calloc(1,sizeof(*uplinkConfig->firstActiveUplinkBWP_Id)); - *uplinkConfig->firstActiveUplinkBWP_Id = servingcellconfigdedicated->uplinkConfig->firstActiveUplinkBWP_Id ? *servingcellconfigdedicated->uplinkConfig->firstActiveUplinkBWP_Id : 1; - } - - SpCellConfig->spCellConfigDedicated->csi_MeasConfig=calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->csi_MeasConfig)); - SpCellConfig->spCellConfigDedicated->csi_MeasConfig->present = NR_SetupRelease_CSI_MeasConfig_PR_setup; - - NR_CSI_MeasConfig_t *csi_MeasConfig = calloc(1,sizeof(*csi_MeasConfig)); - SpCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup = csi_MeasConfig; - - csi_MeasConfig->csi_SSB_ResourceSetToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_SSB_ResourceSetToAddModList)); - csi_MeasConfig->csi_SSB_ResourceSetToReleaseList = NULL; - csi_MeasConfig->csi_ResourceConfigToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_ResourceConfigToAddModList)); - csi_MeasConfig->csi_ResourceConfigToReleaseList = NULL; - csi_MeasConfig->csi_ReportConfigToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_ReportConfigToAddModList)); - csi_MeasConfig->csi_ReportConfigToReleaseList = NULL; - - NR_CSI_SSB_ResourceSet_t *ssbresset0 = calloc(1,sizeof(*ssbresset0)); - ssbresset0->csi_SSB_ResourceSetId=0; - - for (int i=0;i<64;i++) { - if ((bitmap >> (63 - i)) & 0x01) { - NR_SSB_Index_t *ssbres = NULL; - asn1cCallocOne(ssbres, i); - asn1cSeqAdd(&ssbresset0->csi_SSB_ResourceList.list, ssbres); - } - } - asn1cSeqAdd(&csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list,ssbresset0); - - int bwp_loop_end = n_dl_bwp>0 ? n_dl_bwp : 1; - for (int bwp_loop = 0; bwp_loop < bwp_loop_end; bwp_loop++) { - - int curr_bwp, bwp_id; - struct NR_SetupRelease_PDSCH_Config *pdsch_Config; - if(n_dl_bwp == 0) { - pdsch_Config = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config; - curr_bwp = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth,MAX_BWP_SIZE); - bwp_id = 0; - } - else { - NR_BWP_Downlink_t *bwp = SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]; - pdsch_Config = bwp->bwp_Dedicated->pdsch_Config; - curr_bwp = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth,MAX_BWP_SIZE); - bwp_id = bwp->bwp_Id; - } - - config_csirs(scc, csi_MeasConfig, uid, pdsch_AntennaPorts, curr_bwp, configuration->do_CSIRS, bwp_loop); - config_csiim(configuration->do_CSIRS, pdsch_AntennaPorts, curr_bwp, csi_MeasConfig, bwp_loop); - - NR_CSI_ResourceConfig_t *csires1 = calloc(1,sizeof(*csires1)); - csires1->csi_ResourceConfigId = bwp_id+20; - csires1->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB; - csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB = calloc(1,sizeof(*csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB)); - csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList = calloc(1,sizeof(*csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList)); - NR_CSI_SSB_ResourceSetId_t *ssbres00 = calloc(1,sizeof(*ssbres00)); - *ssbres00 = 0; - asn1cSeqAdd(&csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list,ssbres00); - csires1->bwp_Id = bwp_id; - csires1->resourceType = NR_CSI_ResourceConfig__resourceType_periodic; - asn1cSeqAdd(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires1); - - NR_PUCCH_CSI_Resource_t *pucchcsires1 = calloc(1,sizeof(*pucchcsires1)); - pucchcsires1->uplinkBandwidthPartId=bwp_id; - pucchcsires1->pucch_Resource=2; - - if (configuration->do_CSIRS) { - NR_CSI_ResourceConfig_t *csires0 = calloc(1,sizeof(*csires0)); - csires0->csi_ResourceConfigId = bwp_id; - csires0->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB; - csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB = calloc(1,sizeof(*csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB)); - csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList = calloc(1,sizeof(*csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList)); - NR_NZP_CSI_RS_ResourceSetId_t *nzp0 = calloc(1,sizeof(*nzp0)); - *nzp0 = bwp_loop; - asn1cSeqAdd(&csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list,nzp0); - csires0->bwp_Id = bwp_id; - csires0->resourceType = NR_CSI_ResourceConfig__resourceType_periodic; - asn1cSeqAdd(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires0); - } - - if (configuration->do_CSIRS && pdsch_AntennaPorts > 1) { - NR_CSI_ResourceConfig_t *csires2 = calloc(1,sizeof(*csires2)); - csires2->csi_ResourceConfigId = bwp_id+10; - csires2->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_csi_IM_ResourceSetList; - csires2->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList = calloc(1,sizeof(*csires2->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList)); - NR_CSI_IM_ResourceSetId_t *csiim00 = calloc(1,sizeof(*csiim00)); - *csiim00 = bwp_loop; - asn1cSeqAdd(&csires2->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList->list,csiim00); - csires2->bwp_Id = bwp_id; - csires2->resourceType = NR_CSI_ResourceConfig__resourceType_periodic; - asn1cSeqAdd(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires2); - - config_csi_meas_report(csi_MeasConfig, scc, pucchcsires1, pdsch_Config, &configuration->pdsch_AntennaPorts, NR_MAX_SUPPORTED_DL_LAYERS, bwp_id, uid); - } - config_rsrp_meas_report(csi_MeasConfig, scc, pucchcsires1, configuration->do_CSIRS, bwp_id + 10, uid); - } - pdsch_servingcellconfig->codeBlockGroupTransmission = NULL; - pdsch_servingcellconfig->xOverhead = NULL; - pdsch_servingcellconfig->nrofHARQ_ProcessesForPDSCH = calloc(1, sizeof(*pdsch_servingcellconfig->nrofHARQ_ProcessesForPDSCH)); - *pdsch_servingcellconfig->nrofHARQ_ProcessesForPDSCH = NR_PDSCH_ServingCellConfig__nrofHARQ_ProcessesForPDSCH_n16; - pdsch_servingcellconfig->pucch_Cell= NULL; - pdsch_servingcellconfig->ext1=calloc(1,sizeof(*pdsch_servingcellconfig->ext1)); - pdsch_servingcellconfig->ext1->maxMIMO_Layers = calloc(1,sizeof(*pdsch_servingcellconfig->ext1->maxMIMO_Layers)); - *pdsch_servingcellconfig->ext1->maxMIMO_Layers = 2; - - if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { - xer_fprint(stdout, &asn_DEF_NR_SpCellConfig, (void *)SpCellConfig); - } - -} - NR_RLC_BearerConfig_t *get_SRB_RLC_BearerConfig(long channelId, long priority, e_NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration bucketSizeDuration) @@ -966,6 +337,42 @@ NR_RLC_BearerConfig_t *get_SRB_RLC_BearerConfig(long channelId, return rlc_BearerConfig; } +static void nr_drb_config(struct NR_RLC_Config *rlc_Config, NR_RLC_Config_PR rlc_config_pr) +{ + switch (rlc_config_pr) { + case NR_RLC_Config_PR_um_Bi_Directional: + // RLC UM Bi-directional Bearer configuration + LOG_I(RLC, "RLC UM Bi-directional Bearer configuration selected \n"); + rlc_Config->choice.um_Bi_Directional = calloc(1, sizeof(*rlc_Config->choice.um_Bi_Directional)); + rlc_Config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = + calloc(1, sizeof(*rlc_Config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength)); + *rlc_Config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = NR_SN_FieldLengthUM_size12; + rlc_Config->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength = + calloc(1, sizeof(*rlc_Config->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength)); + *rlc_Config->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength = NR_SN_FieldLengthUM_size12; + rlc_Config->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly = NR_T_Reassembly_ms15; + break; + case NR_RLC_Config_PR_am: + // RLC AM Bearer configuration + rlc_Config->choice.am = calloc(1, sizeof(*rlc_Config->choice.am)); + rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength = calloc(1, sizeof(*rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength)); + *rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength = NR_SN_FieldLengthAM_size18; + rlc_Config->choice.am->ul_AM_RLC.t_PollRetransmit = NR_T_PollRetransmit_ms45; + rlc_Config->choice.am->ul_AM_RLC.pollPDU = NR_PollPDU_p64; + rlc_Config->choice.am->ul_AM_RLC.pollByte = NR_PollByte_kB500; + rlc_Config->choice.am->ul_AM_RLC.maxRetxThreshold = NR_UL_AM_RLC__maxRetxThreshold_t32; + rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength = calloc(1, sizeof(*rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength)); + *rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength = NR_SN_FieldLengthAM_size18; + rlc_Config->choice.am->dl_AM_RLC.t_Reassembly = NR_T_Reassembly_ms15; + rlc_Config->choice.am->dl_AM_RLC.t_StatusProhibit = NR_T_StatusProhibit_ms15; + break; + default: + AssertFatal(false, "RLC config type %d not handled\n", rlc_config_pr); + break; + } + rlc_Config->present = rlc_config_pr; +} + NR_RLC_BearerConfig_t *get_DRB_RLC_BearerConfig(long lcChannelId, long drbId, NR_RLC_Config_PR rlc_conf, long priority) { NR_RLC_BearerConfig_t *rlc_BearerConfig = calloc(1, sizeof(NR_RLC_BearerConfig_t)); @@ -997,6 +404,74 @@ NR_RLC_BearerConfig_t *get_DRB_RLC_BearerConfig(long lcChannelId, long drbId, NR return rlc_BearerConfig; } +/* returns a default radio bearer config suitable for NSA etc */ +NR_RadioBearerConfig_t *get_default_rbconfig(int eps_bearer_id, + int rb_id, + e_NR_CipheringAlgorithm ciphering_algorithm, + e_NR_SecurityConfig__keyToUse key_to_use) +{ + NR_RadioBearerConfig_t *rbconfig = calloc(1, sizeof(*rbconfig)); + rbconfig->srb_ToAddModList = NULL; + rbconfig->srb3_ToRelease = NULL; + rbconfig->drb_ToAddModList = calloc(1,sizeof(*rbconfig->drb_ToAddModList)); + NR_DRB_ToAddMod_t *drb_ToAddMod = calloc(1,sizeof(*drb_ToAddMod)); + drb_ToAddMod->cnAssociation = calloc(1,sizeof(*drb_ToAddMod->cnAssociation)); + drb_ToAddMod->cnAssociation->present = NR_DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity; + drb_ToAddMod->cnAssociation->choice.eps_BearerIdentity= eps_bearer_id; + drb_ToAddMod->drb_Identity = rb_id; + drb_ToAddMod->reestablishPDCP = NULL; + drb_ToAddMod->recoverPDCP = NULL; + drb_ToAddMod->pdcp_Config = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config)); + asn1cCalloc(drb_ToAddMod->pdcp_Config->drb, drb); + asn1cCallocOne(drb->discardTimer, NR_PDCP_Config__drb__discardTimer_infinity); + asn1cCallocOne(drb->pdcp_SN_SizeUL, NR_PDCP_Config__drb__pdcp_SN_SizeUL_len18bits); + asn1cCallocOne(drb->pdcp_SN_SizeDL, NR_PDCP_Config__drb__pdcp_SN_SizeDL_len18bits); + drb->headerCompression.present = NR_PDCP_Config__drb__headerCompression_PR_notUsed; + drb->headerCompression.choice.notUsed = 0; + drb->integrityProtection = NULL; + drb->statusReportRequired = NULL; + drb->outOfOrderDelivery = NULL; + + drb_ToAddMod->pdcp_Config->moreThanOneRLC = NULL; + asn1cCallocOne(drb_ToAddMod->pdcp_Config->t_Reordering, NR_PDCP_Config__t_Reordering_ms100); + drb_ToAddMod->pdcp_Config->ext1 = NULL; + + asn1cSeqAdd(&rbconfig->drb_ToAddModList->list,drb_ToAddMod); + + rbconfig->drb_ToReleaseList = NULL; + + asn1cCalloc(rbconfig->securityConfig, secConf); + asn1cCalloc(secConf->securityAlgorithmConfig, secConfAlgo); + secConfAlgo->cipheringAlgorithm = ciphering_algorithm; + secConfAlgo->integrityProtAlgorithm = NULL; + asn1cCallocOne(secConf->keyToUse, key_to_use); + return rbconfig; +} + +void fill_nr_noS1_bearer_config(NR_RadioBearerConfig_t **rbconfig, + NR_RLC_BearerConfig_t **rlc_rbconfig) +{ + /* the EPS bearer ID is arbitrary; the rb_id is 1/the first DRB, it needs to + * match the one in get_DRB_RLC_BearerConfig(). No ciphering is to be + * configured */ + *rbconfig = get_default_rbconfig(10, 1, NR_CipheringAlgorithm_nea0, NR_SecurityConfig__keyToUse_master); + AssertFatal(*rbconfig != NULL, "get_default_rbconfig() failed\n"); + /* LCID is 4 because the RLC layer requires it to be 3+rb_id; the rb_id 1 is + * common with get_default_rbconfig() (first RB). We pre-configure RLC UM + * Bi-directional, priority is 1 */ + *rlc_rbconfig = get_DRB_RLC_BearerConfig(4, 1, NR_RLC_Config_PR_um_Bi_Directional, 1); + AssertFatal(*rlc_rbconfig != NULL, "get_DRB_RLC_BearerConfig() failed\n"); +} + +void free_nr_noS1_bearer_config(NR_RadioBearerConfig_t **rbconfig, + NR_RLC_BearerConfig_t **rlc_rbconfig) +{ + ASN_STRUCT_FREE(asn_DEF_NR_RadioBearerConfig, *rbconfig); + *rbconfig = NULL; + ASN_STRUCT_FREE(asn_DEF_NR_RLC_BearerConfig, *rlc_rbconfig); + *rlc_rbconfig = NULL; +} + void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGroupConfig_t *ue_context_mastercellGroup, int use_rlc_um_for_drb, uint8_t configure_srb, uint8_t bearer_id_start, uint8_t nb_bearers_to_setup, long *priority) { cellGroupConfig->cellGroupId = 0; @@ -1020,175 +495,12 @@ void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGr } } -//TODO temp function (to remove once CSI meas config harmonization is done) -void update_cqitables(struct NR_SetupRelease_PDSCH_Config *pdsch_Config, - NR_CSI_MeasConfig_t *csi_MeasConfig) { - int nb_csi = csi_MeasConfig->csi_ReportConfigToAddModList->list.count; - for (int i = 0; i < nb_csi; i++) { - NR_CSI_ReportConfig_t *csirep = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[i]; - if(csirep->cqi_Table) { - if(pdsch_Config->choice.setup->mcs_Table!=NULL) - *csirep->cqi_Table = NR_CSI_ReportConfig__cqi_Table_table2; - else - *csirep->cqi_Table = NR_CSI_ReportConfig__cqi_Table_table1; - } - } -} - -void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, - const int uid, - NR_UE_NR_Capability_t *uecap, - const gNB_RrcConfigurationReq* configuration) { - - NR_SpCellConfig_t *SpCellConfig = cellGroupConfig->spCellConfig; - - if (SpCellConfig == NULL) return; - - NR_ServingCellConfigCommon_t *scc = configuration ? configuration->scc : NULL; - - if(scc) { - - int curr_bwp = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - NR_UplinkConfig_t *uplinkConfig = SpCellConfig && SpCellConfig->spCellConfigDedicated ? SpCellConfig->spCellConfigDedicated->uplinkConfig : NULL; - - uint8_t ul_max_layers = 1; - if (uecap && - uecap->featureSets && - uecap->featureSets->featureSetsUplinkPerCC && - uecap->featureSets->featureSetsUplinkPerCC->list.count > 0) { - NR_FeatureSetUplinkPerCC_t *ul_feature_setup_per_cc = uecap->featureSets->featureSetsUplinkPerCC->list.array[0]; - if (ul_feature_setup_per_cc->mimo_CB_PUSCH->maxNumberMIMO_LayersCB_PUSCH) { - switch (*ul_feature_setup_per_cc->mimo_CB_PUSCH->maxNumberMIMO_LayersCB_PUSCH) { - case NR_MIMO_LayersUL_twoLayers: - ul_max_layers = 2; - break; - case NR_MIMO_LayersUL_fourLayers: - ul_max_layers = 4; - break; - default: - ul_max_layers = 1; - } - } - ul_max_layers = min(ul_max_layers, configuration->pusch_AntennaPorts); - if (uplinkConfig->initialUplinkBWP->pusch_Config) { - NR_PUSCH_Config_t *pusch_Config = uplinkConfig->initialUplinkBWP->pusch_Config->choice.setup; - if (pusch_Config->maxRank == NULL) { - pusch_Config->maxRank = calloc(1, sizeof(*pusch_Config->maxRank)); - } - *pusch_Config->maxRank = ul_max_layers; - } - if (uplinkConfig->pusch_ServingCellConfig == NULL) { - uplinkConfig->pusch_ServingCellConfig = calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig)); - uplinkConfig->pusch_ServingCellConfig->present = NR_SetupRelease_PUSCH_ServingCellConfig_PR_setup; - uplinkConfig->pusch_ServingCellConfig->choice.setup = calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig->choice.setup)); - uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1 = calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1)); - uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers = calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers)); - } - *uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers = ul_max_layers; - } - - long maxMIMO_Layers = uplinkConfig && - uplinkConfig->pusch_ServingCellConfig && - uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1 && - uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers ? - *uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers : 1; - - // UL and SRS configuration - if (configuration->do_SRS && uplinkConfig && uplinkConfig->initialUplinkBWP) { - if (!uplinkConfig->initialUplinkBWP->srs_Config) { - uplinkConfig->initialUplinkBWP->srs_Config = calloc(1, sizeof(*uplinkConfig->initialUplinkBWP->srs_Config)); - } - config_srs(scc, - SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config, - uecap, - curr_bwp, - uid, - 0, - maxMIMO_Layers, - configuration->do_SRS); - } - - // Set DL MCS table - NR_BWP_DownlinkDedicated_t *bwp_Dedicated = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP; - set_dl_mcs_table(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing, - configuration->force_256qam_off ? NULL : uecap, bwp_Dedicated, scc); - struct NR_ServingCellConfig__downlinkBWP_ToAddModList *DL_BWP_list = SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList; - struct NR_UplinkConfig__uplinkBWP_ToAddModList *UL_BWP_list = uplinkConfig->uplinkBWP_ToAddModList; - if (DL_BWP_list) { - for (int i=0; ilist.count; i++){ - NR_BWP_Downlink_t *bwp = DL_BWP_list->list.array[i]; - int scs = bwp->bwp_Common->genericParameters.subcarrierSpacing; - set_dl_mcs_table(scs, configuration->force_256qam_off ? NULL : uecap, bwp->bwp_Dedicated, scc); - } - } - if (configuration->do_SRS && UL_BWP_list) { - for (int i=0; ilist.count; i++) { - NR_BWP_Uplink_t *ul_bwp = UL_BWP_list->list.array[i]; - int bwp_size = NRRIV2BW(ul_bwp->bwp_Common->genericParameters.locationAndBandwidth,MAX_BWP_SIZE); - if (ul_bwp->bwp_Dedicated->pusch_Config) { - NR_PUSCH_Config_t *pusch_Config = ul_bwp->bwp_Dedicated->pusch_Config->choice.setup; - if (pusch_Config->maxRank == NULL) { - pusch_Config->maxRank = calloc(1, sizeof(*pusch_Config->maxRank)); - } - *pusch_Config->maxRank = ul_max_layers; - } - config_srs(scc, - ul_bwp->bwp_Dedicated->srs_Config, - uecap, - bwp_size, - uid, - i+1, - maxMIMO_Layers, - configuration->do_SRS); - } - } - update_cqitables(bwp_Dedicated->pdsch_Config, SpCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup); - } -} - -void fill_initial_cellGroupConfig(int uid, - NR_CellGroupConfig_t *cellGroupConfig, - const NR_ServingCellConfigCommon_t *scc, - const NR_ServingCellConfig_t *servingcellconfigdedicated, - const gNB_RrcConfigurationReq *configuration) -{ - - NR_PhysicalCellGroupConfig_t *physicalCellGroupConfig = NULL; - - cellGroupConfig->cellGroupId = 0; - - /* Rlc Bearer Config */ - /* TS38.331 9.2.1 Default SRB configurations */ - cellGroupConfig->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList)); - NR_RLC_BearerConfig_t *rlc_BearerConfig = get_SRB_RLC_BearerConfig(1, 1, NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms1000); - asn1cSeqAdd(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig); - - cellGroupConfig->rlc_BearerToReleaseList = NULL; - - /* mac CellGroup Config */ - cellGroupConfig->mac_CellGroupConfig = configure_mac_cellgroup(); - - physicalCellGroupConfig = calloc(1,sizeof(*physicalCellGroupConfig)); - physicalCellGroupConfig->p_NR_FR1 = NULL; - physicalCellGroupConfig->pdsch_HARQ_ACK_Codebook = NR_PhysicalCellGroupConfig__pdsch_HARQ_ACK_Codebook_dynamic; - cellGroupConfig->physicalCellGroupConfig = physicalCellGroupConfig; - - cellGroupConfig->spCellConfig = calloc(1,sizeof(*cellGroupConfig->spCellConfig)); - - fill_initial_SpCellConfig(uid,cellGroupConfig->spCellConfig,scc,servingcellconfigdedicated,configuration); - - cellGroupConfig->sCellToAddModList = NULL; - cellGroupConfig->sCellToReleaseList = NULL; -} - //------------------------------------------------------------------------------ int do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP, uint8_t *const buffer, const uint8_t transaction_id, const uint8_t *masterCellGroup, int masterCellGroup_len, - const NR_ServingCellConfigCommon_t *scc, - const NR_ServingCellConfig_t *servingcellconfigdedicated, const gNB_RrcConfigurationReq *configuration) //------------------------------------------------------------------------------ { @@ -1198,7 +510,6 @@ int do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP, NR_RRCSetup_IEs_t *ie; NR_SRB_ToAddMod_t *SRB1_config = NULL; NR_PDCP_Config_t *pdcp_Config = NULL; - NR_CellGroupConfig_t *cellGroupConfig = NULL; AssertFatal(ue_context_pP != NULL,"ue_context_p is null\n"); gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context; @@ -1248,11 +559,10 @@ int do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP, ie->masterCellGroup.size = masterCellGroup_len; // decode masterCellGroup OCTET_STRING received from DU and place in ue context - uper_decode(NULL, &asn_DEF_NR_CellGroupConfig, (void **)&cellGroupConfig, masterCellGroup, masterCellGroup_len, 0, 0); - ue_p->masterCellGroup = cellGroupConfig; + ue_p->masterCellGroup = decode_cellGroupConfig(masterCellGroup, masterCellGroup_len); if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { - xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)cellGroupConfig); + xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, ue_p->masterCellGroup); xer_fprint(stdout, &asn_DEF_NR_DL_CCCH_Message, (void *)&dl_ccch_msg); } @@ -1877,38 +1187,6 @@ int do_RRCReestablishment(const protocol_ctxt_t *const ctxt_pP, *SRB_configList = CALLOC(1, sizeof(NR_SRB_ToAddModList_t)); asn1cSeqAdd(&(*SRB_configList)->list, SRB1_config); /****************************** masterCellGroup ******************************/ - /* - NR_CellGroupConfig_t *cellGroupConfig = NULL; - char masterCellGroup_buf[1000]; - gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context; - if (masterCellGroup_from_DU) { - // decode masterCellGroup OCTET_STRING received from DU and place in ue context - uper_decode(NULL, - &asn_DEF_NR_CellGroupConfig, //might be added prefix later - (void **)&cellGroupConfig, - (uint8_t *)masterCellGroup_from_DU->buf, - masterCellGroup_from_DU->size, 0, 0); - - xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)cellGroupConfig); - } - else { - cellGroupConfig = calloc(1, sizeof(NR_CellGroupConfig_t)); - fill_initial_cellGroupConfig(ue_context_pP->ue_context.rnti,ue_context_pP->local_uid,cellGroupConfig,scc,carrier); - - enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig, - NULL, - (void *)cellGroupConfig, - masterCellGroup_buf, - 1000); - - if(enc_rval.encoded == -1) { - LOG_E(NR_RRC, "ASN1 message CellGroupConfig encoding failed (%s, %lu)!\n", - enc_rval.failed_type->name, enc_rval.encoded); - return -1; - } - } - ue_p->masterCellGroup = cellGroupConfig; - */ rrcReestablishment->rrc_TransactionIdentifier = Transaction_id; rrcReestablishment->criticalExtensions.present = NR_RRCReestablishment__criticalExtensions_PR_rrcReestablishment; rrcReestablishment->criticalExtensions.choice.rrcReestablishment = CALLOC(1, sizeof(NR_RRCReestablishment_IEs_t)); diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.h b/openair2/RRC/NR/MESSAGES/asn1_msg.h index 1df0920a06..293758c37f 100644 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.h +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.h @@ -55,16 +55,6 @@ */ int xer_sprint_NR(char *string, size_t string_size, struct asn_TYPE_descriptor_s *td, void *sptr); -uint8_t do_MIB_NR(gNB_RRC_INST *rrc, - uint32_t frame); - -/** -\brief Generate configuration for SIB1 (gNB). -@param carrier pointer to Carrier information -@param configuration Pointer Configuration Request structure -@return size of encoded bit stream in bytes*/ -uint16_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier, gNB_RrcConfigurationReq *configuration); - uint8_t do_SIB23_NR(rrc_gNB_carrier_data_t *carrier, gNB_RrcConfigurationReq *configuration); @@ -74,22 +64,22 @@ void do_SpCellConfig(gNB_RRC_INST *rrc, int do_RRCReject(uint8_t Mod_id, uint8_t *const buffer); -void fill_initial_SpCellConfig(int uid, - NR_SpCellConfig_t *SpCellConfig, - const NR_ServingCellConfigCommon_t *scc, - const NR_ServingCellConfig_t *servingcellconfigdedicated, - const gNB_RrcConfigurationReq *configuration); +NR_RLC_BearerConfig_t *get_SRB_RLC_BearerConfig( + long channelId, + long priority, + e_NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration bucketSizeDuration); +NR_RLC_BearerConfig_t *get_DRB_RLC_BearerConfig(long lcChannelId, long drbId, NR_RLC_Config_PR rlc_conf, long priority); -void fill_initial_cellGroupConfig(int uid, - NR_CellGroupConfig_t *cellGroupConfig, - const NR_ServingCellConfigCommon_t *scc, - const NR_ServingCellConfig_t *servingcellconfigdedicated, - const gNB_RrcConfigurationReq *configuration); +NR_RadioBearerConfig_t *get_default_rbconfig(int eps_bearer_id, + int rb_id, + e_NR_CipheringAlgorithm ciphering_algorithm, + e_NR_SecurityConfig__keyToUse key_to_use); + +void fill_nr_noS1_bearer_config(NR_RadioBearerConfig_t **rbconfig, + NR_RLC_BearerConfig_t **rlc_rbconfig); +void free_nr_noS1_bearer_config(NR_RadioBearerConfig_t **rbconfig, + NR_RLC_BearerConfig_t **rlc_rbconfig); -void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, - const int uid, - NR_UE_NR_Capability_t *uecap, - const gNB_RrcConfigurationReq *configuration); void fill_mastercellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_CellGroupConfig_t *ue_context_mastercellGroup, @@ -104,8 +94,6 @@ int do_RRCSetup(rrc_gNB_ue_context_t *const ue_context_pP, const uint8_t transaction_id, const uint8_t *masterCellGroup, int masterCellGroup_len, - const NR_ServingCellConfigCommon_t *scc, - const NR_ServingCellConfig_t *servingcellconfigdedicated, const gNB_RrcConfigurationReq *configuration); uint8_t do_NR_SecurityModeCommand( diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c index 3e506b964c..54b2ae48c4 100644 --- a/openair2/RRC/NR/nr_rrc_config.c +++ b/openair2/RRC/NR/nr_rrc_config.c @@ -32,42 +32,11 @@ #include "common/utils/nr/nr_common.h" #include "executables/softmodem-common.h" #include "oai_asn1.h" +#include "SIMULATION/TOOLS/sim.h" // for taus(); const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160}; -NR_MAC_CellGroupConfig_t *configure_mac_cellgroup(void) -{ - NR_MAC_CellGroupConfig_t * mac_CellGroupConfig = calloc(1, sizeof(*mac_CellGroupConfig)); - - mac_CellGroupConfig->bsr_Config = calloc(1, sizeof(*mac_CellGroupConfig->bsr_Config)); - mac_CellGroupConfig->bsr_Config->periodicBSR_Timer = NR_BSR_Config__periodicBSR_Timer_sf10; - mac_CellGroupConfig->bsr_Config->retxBSR_Timer = NR_BSR_Config__retxBSR_Timer_sf80; - mac_CellGroupConfig->tag_Config = calloc(1, sizeof(*mac_CellGroupConfig->tag_Config)); - mac_CellGroupConfig->tag_Config->tag_ToReleaseList = NULL; - mac_CellGroupConfig->tag_Config->tag_ToAddModList = calloc(1,sizeof(*mac_CellGroupConfig->tag_Config->tag_ToAddModList)); - struct NR_TAG *tag=calloc(1,sizeof(*tag)); - tag->tag_Id = 0; - tag->timeAlignmentTimer = NR_TimeAlignmentTimer_infinity; - asn1cSeqAdd(&mac_CellGroupConfig->tag_Config->tag_ToAddModList->list,tag); - - set_phr_config(mac_CellGroupConfig); - - mac_CellGroupConfig->schedulingRequestConfig = calloc(1, sizeof(*mac_CellGroupConfig->schedulingRequestConfig)); - mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList = CALLOC(1,sizeof(*mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList)); - struct NR_SchedulingRequestToAddMod *schedulingrequestlist = CALLOC(1,sizeof(*schedulingrequestlist)); - schedulingrequestlist->schedulingRequestId = 0; - schedulingrequestlist->sr_ProhibitTimer = NULL; - schedulingrequestlist->sr_TransMax = NR_SchedulingRequestToAddMod__sr_TransMax_n64; - asn1cSeqAdd(&(mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList->list),schedulingrequestlist); - - mac_CellGroupConfig->skipUplinkTxDynamic=false; - mac_CellGroupConfig->ext1 = NULL; - return mac_CellGroupConfig; -} - -NR_SearchSpace_t *rrc_searchspace_config(bool is_common, - int searchspaceid, - int coresetid) +static NR_SearchSpace_t *rrc_searchspace_config(bool is_common, int searchspaceid, int coresetid) { NR_SearchSpace_t *ss = calloc(1,sizeof(*ss)); @@ -111,11 +80,10 @@ NR_SearchSpace_t *rrc_searchspace_config(bool is_common, return ss; } -void rrc_coreset_config(NR_ControlResourceSet_t *coreset, - int bwp_id, - int curr_bwp, - uint64_t ssb_bitmap) { - +static NR_ControlResourceSet_t *get_coreset_config(int bwp_id, int curr_bwp, uint64_t ssb_bitmap) +{ + NR_ControlResourceSet_t *coreset = calloc(1, sizeof(*coreset)); + AssertFatal(coreset != NULL, "out of memory\n"); // frequency domain resources depending on BWP size coreset->frequencyDomainResources.buf = calloc(1,6); coreset->frequencyDomainResources.buf[0] = (curr_bwp < 48) ? 0xf0 : 0xff; @@ -145,9 +113,11 @@ void rrc_coreset_config(NR_ControlResourceSet_t *coreset, coreset->tci_StatesPDCCH_ToReleaseList = NULL; coreset->tci_PresentInDCI = NULL; coreset->pdcch_DMRS_ScramblingID = NULL; + return coreset; } -uint64_t get_ssb_bitmap(const NR_ServingCellConfigCommon_t *scc) { +static uint64_t get_ssb_bitmap(const NR_ServingCellConfigCommon_t *scc) +{ uint64_t bitmap=0; switch (scc->ssb_PositionsInBurst->present) { case 1 : @@ -167,8 +137,8 @@ uint64_t get_ssb_bitmap(const NR_ServingCellConfigCommon_t *scc) { return bitmap; } -void set_csirs_periodicity(NR_NZP_CSI_RS_Resource_t *nzpcsi0, int uid, int nb_slots_per_period) { - +static void set_csirs_periodicity(NR_NZP_CSI_RS_Resource_t *nzpcsi0, int uid, int nb_slots_per_period) +{ nzpcsi0->periodicityAndOffset = calloc(1,sizeof(*nzpcsi0->periodicityAndOffset)); int ideal_period = nb_slots_per_period * MAX_MOBILES_PER_GNB; @@ -214,14 +184,14 @@ void set_csirs_periodicity(NR_NZP_CSI_RS_Resource_t *nzpcsi0, int uid, int nb_sl } } -void config_csirs(const NR_ServingCellConfigCommon_t *servingcellconfigcommon, - NR_CSI_MeasConfig_t *csi_MeasConfig, - int uid, - int num_dl_antenna_ports, - int curr_bwp, - int do_csirs, - int id) { - +static void config_csirs(const NR_ServingCellConfigCommon_t *servingcellconfigcommon, + NR_CSI_MeasConfig_t *csi_MeasConfig, + int uid, + int num_dl_antenna_ports, + int curr_bwp, + int do_csirs, + int id) +{ if (do_csirs) { if(!csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList) @@ -306,9 +276,9 @@ void config_csirs(const NR_ServingCellConfigCommon_t *servingcellconfigcommon, csi_MeasConfig->nzp_CSI_RS_ResourceToReleaseList = NULL; } -void set_csiim_offset(struct NR_CSI_ResourcePeriodicityAndOffset *periodicityAndOffset, - struct NR_CSI_ResourcePeriodicityAndOffset *target_periodicityAndOffset) { - +static void set_csiim_offset(struct NR_CSI_ResourcePeriodicityAndOffset *periodicityAndOffset, + struct NR_CSI_ResourcePeriodicityAndOffset *target_periodicityAndOffset) +{ switch(periodicityAndOffset->present) { case NR_CSI_ResourcePeriodicityAndOffset_PR_slots4: periodicityAndOffset->choice.slots4 = target_periodicityAndOffset->choice.slots4; @@ -355,9 +325,12 @@ void set_csiim_offset(struct NR_CSI_ResourcePeriodicityAndOffset *periodicityAnd } -void config_csiim(int do_csirs, int dl_antenna_ports, int curr_bwp, - NR_CSI_MeasConfig_t *csi_MeasConfig, int id) { - +static void config_csiim(int do_csirs, + int dl_antenna_ports, + int curr_bwp, + NR_CSI_MeasConfig_t *csi_MeasConfig, + int id) +{ if (do_csirs && dl_antenna_ports > 1) { if (!csi_MeasConfig->csi_IM_ResourceToAddModList) csi_MeasConfig->csi_IM_ResourceToAddModList = calloc(1, sizeof(*csi_MeasConfig->csi_IM_ResourceToAddModList)); @@ -429,8 +402,8 @@ long rrc_get_max_nr_csrs(const int max_rbs, const long b_SRS) { return c_srs; } -struct NR_SRS_Resource__resourceType__periodic *configure_periodic_srs(const NR_ServingCellConfigCommon_t *scc, - const int uid) +static struct NR_SRS_Resource__resourceType__periodic *configure_periodic_srs(const NR_ServingCellConfigCommon_t *scc, + const int uid) { const NR_TDD_UL_DL_Pattern_t *tdd = scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL; @@ -503,14 +476,14 @@ struct NR_SRS_Resource__resourceType__periodic *configure_periodic_srs(const NR_ return periodic_srs; } -void config_srs(const NR_ServingCellConfigCommon_t *scc, - NR_SetupRelease_SRS_Config_t *setup_release_srs_Config, - const NR_UE_NR_Capability_t *uecap, - const int curr_bwp, - const int uid, - const int res_id, - const long maxMIMO_Layers, - const int do_srs) +static void config_srs(const NR_ServingCellConfigCommon_t *scc, + NR_SetupRelease_SRS_Config_t *setup_release_srs_Config, + const NR_UE_NR_Capability_t *uecap, + const int curr_bwp, + const int uid, + const int res_id, + const long maxMIMO_Layers, + const int do_srs) { setup_release_srs_Config->present = NR_SetupRelease_SRS_Config_PR_setup; @@ -786,7 +759,7 @@ void nr_rrc_config_ul_tda(NR_ServingCellConfigCommon_t *scc, int min_fb_delay){ } } -void set_dl_DataToUL_ACK(NR_PUCCH_Config_t *pucch_Config, int min_feedback_time, NR_SubcarrierSpacing_t subcarrierSpacing) +static void set_dl_DataToUL_ACK(NR_PUCCH_Config_t *pucch_Config, int min_feedback_time, NR_SubcarrierSpacing_t subcarrierSpacing) { pucch_Config->dl_DataToUL_ACK = calloc(1,sizeof(*pucch_Config->dl_DataToUL_ACK)); long *delay[8]; @@ -799,8 +772,8 @@ void set_dl_DataToUL_ACK(NR_PUCCH_Config_t *pucch_Config, int min_feedback_time, } // PUCCH resource set 0 for configuration with O_uci <= 2 bits and/or a positive or negative SR (section 9.2.1 of 38.213) -void config_pucch_resset0(NR_PUCCH_Config_t *pucch_Config, int uid, int curr_bwp, NR_UE_NR_Capability_t *uecap) { - +static void config_pucch_resset0(NR_PUCCH_Config_t *pucch_Config, int uid, int curr_bwp, const NR_UE_NR_Capability_t *uecap) +{ NR_PUCCH_ResourceSet_t *pucchresset = calloc(1,sizeof(*pucchresset)); pucchresset->pucch_ResourceSetId = 0; NR_PUCCH_ResourceId_t *pucchid=calloc(1,sizeof(*pucchid)); @@ -830,8 +803,8 @@ void config_pucch_resset0(NR_PUCCH_Config_t *pucch_Config, int uid, int curr_bwp // PUCCH resource set 1 for configuration with O_uci > 2 bits (currently format2) -void config_pucch_resset1(NR_PUCCH_Config_t *pucch_Config, NR_UE_NR_Capability_t *uecap) { - +static void config_pucch_resset1(NR_PUCCH_Config_t *pucch_Config, const NR_UE_NR_Capability_t *uecap) +{ NR_PUCCH_ResourceSet_t *pucchresset=calloc(1,sizeof(*pucchresset)); pucchresset->pucch_ResourceSetId = 1; NR_PUCCH_ResourceId_t *pucchressetid=calloc(1,sizeof(*pucchressetid)); @@ -946,7 +919,7 @@ static void set_SR_periodandoffset(NR_SchedulingRequestResourceConfig_t *schedul schedulingRequestResourceConfig->periodicityAndOffset->choice.sl160 = sr_slot; return; } - else if(sr_slot < 320 || NR_SubcarrierSpacing_kHz60){ + else if(sr_slot < 320 || scs == NR_SubcarrierSpacing_kHz60){ schedulingRequestResourceConfig->periodicityAndOffset->present = NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl320; schedulingRequestResourceConfig->periodicityAndOffset->choice.sl320 = sr_slot; return; @@ -957,9 +930,7 @@ static void set_SR_periodandoffset(NR_SchedulingRequestResourceConfig_t *schedul } } -void scheduling_request_config(const NR_ServingCellConfigCommon_t *scc, - NR_PUCCH_Config_t *pucch_Config, - int scs) +static void scheduling_request_config(const NR_ServingCellConfigCommon_t *scc, NR_PUCCH_Config_t *pucch_Config, int scs) { // format with <=2 bits in pucch resource set 0 NR_PUCCH_ResourceSet_t *pucchresset = pucch_Config->resourceSetToAddModList->list.array[0]; @@ -978,11 +949,11 @@ void scheduling_request_config(const NR_ServingCellConfigCommon_t *scc, asn1cSeqAdd(&pucch_Config->schedulingRequestResourceToAddModList->list,schedulingRequestResourceConfig); } -void set_dl_mcs_table(int scs, - NR_UE_NR_Capability_t *cap, - NR_BWP_DownlinkDedicated_t *bwp_Dedicated, - const NR_ServingCellConfigCommon_t *scc) { - +static void set_dl_mcs_table(int scs, + const NR_UE_NR_Capability_t *cap, + NR_BWP_DownlinkDedicated_t *bwp_Dedicated, + const NR_ServingCellConfigCommon_t *scc) +{ if (cap == NULL){ bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NULL; return; @@ -998,8 +969,6 @@ void set_dl_mcs_table(int scs, } } AssertFatal(bw_rb>0,"Could not find scs-SpecificCarrierList element for scs %d",scs); - int bw = get_supported_band_index(scs, band, bw_rb); - AssertFatal(bw>=0,"Supported band corresponding to %d RBs not found\n", bw_rb); bool supported = false; if (band>256) { @@ -1023,7 +992,7 @@ void set_dl_mcs_table(int scs, bwp_Dedicated->pdsch_Config->choice.setup->mcs_Table = NULL; } -struct NR_SetupRelease_PUSCH_Config *config_pusch(NR_PUSCH_Config_t *pusch_Config) +static struct NR_SetupRelease_PUSCH_Config *config_pusch(NR_PUSCH_Config_t *pusch_Config) { struct NR_SetupRelease_PUSCH_Config *setup_puschconfig = calloc(1, sizeof(*setup_puschconfig)); setup_puschconfig->present = NR_SetupRelease_PUSCH_Config_PR_setup; @@ -1104,7 +1073,7 @@ struct NR_SetupRelease_PUSCH_Config *config_pusch(NR_PUSCH_Config_t *pusch_Confi return setup_puschconfig; } -struct NR_SetupRelease_PDSCH_Config *config_pdsch(uint64_t ssb_bitmap, int bwp_Id, int dl_antenna_ports) +static struct NR_SetupRelease_PDSCH_Config *config_pdsch(uint64_t ssb_bitmap, int bwp_Id, int dl_antenna_ports) { struct NR_SetupRelease_PDSCH_Config *setup_pdsch_Config = calloc(1,sizeof(*setup_pdsch_Config)); setup_pdsch_Config->present = NR_SetupRelease_PDSCH_Config_PR_setup; @@ -1147,14 +1116,15 @@ struct NR_SetupRelease_PDSCH_Config *config_pdsch(uint64_t ssb_bitmap, int bwp_I return setup_pdsch_Config; } -void config_downlinkBWP(NR_BWP_Downlink_t *bwp, - const NR_ServingCellConfigCommon_t *scc, - const NR_ServingCellConfig_t *servingcellconfigdedicated, - NR_UE_NR_Capability_t *uecap, - int dl_antenna_ports, - bool force_256qam_off, - int bwp_loop, bool is_SA) { - +static void config_downlinkBWP(NR_BWP_Downlink_t *bwp, + const NR_ServingCellConfigCommon_t *scc, + const NR_ServingCellConfig_t *servingcellconfigdedicated, + const NR_UE_NR_Capability_t *uecap, + int dl_antenna_ports, + bool force_256qam_off, + int bwp_loop, + bool is_SA) +{ bwp->bwp_Common = calloc(1,sizeof(*bwp->bwp_Common)); if(servingcellconfigdedicated->downlinkBWP_ToAddModList && @@ -1178,9 +1148,8 @@ void config_downlinkBWP(NR_BWP_Downlink_t *bwp, int curr_bwp = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth,MAX_BWP_SIZE); - NR_ControlResourceSet_t *coreset = calloc(1,sizeof(*coreset)); uint64_t ssb_bitmap = get_ssb_bitmap(scc); - rrc_coreset_config(coreset, bwp->bwp_Id, curr_bwp, ssb_bitmap); + NR_ControlResourceSet_t *coreset = get_coreset_config(bwp->bwp_Id, curr_bwp, ssb_bitmap); bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet = coreset; bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceZero=NULL; @@ -1233,13 +1202,15 @@ void config_downlinkBWP(NR_BWP_Downlink_t *bwp, scc); } -void config_uplinkBWP(NR_BWP_Uplink_t *ubwp, - long bwp_loop, bool is_SA, int uid, - const gNB_RrcConfigurationReq *configuration, - const NR_ServingCellConfig_t *servingcellconfigdedicated, - const NR_ServingCellConfigCommon_t *scc, - NR_UE_NR_Capability_t *uecap) { - +static void config_uplinkBWP(NR_BWP_Uplink_t *ubwp, + long bwp_loop, + bool is_SA, + int uid, + const gNB_RrcConfigurationReq *configuration, + const NR_ServingCellConfig_t *servingcellconfigdedicated, + const NR_ServingCellConfigCommon_t *scc, + const NR_UE_NR_Capability_t *uecap) +{ ubwp->bwp_Common = calloc(1,sizeof(*ubwp->bwp_Common)); if(servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList && bwp_loop < servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count) { @@ -1313,7 +1284,7 @@ void config_uplinkBWP(NR_BWP_Uplink_t *ubwp, ubwp->bwp_Dedicated->beamFailureRecoveryConfig = NULL; } -void set_phr_config(NR_MAC_CellGroupConfig_t *mac_CellGroupConfig) +static void set_phr_config(NR_MAC_CellGroupConfig_t *mac_CellGroupConfig) { mac_CellGroupConfig->phr_Config = calloc(1, sizeof(*mac_CellGroupConfig->phr_Config)); mac_CellGroupConfig->phr_Config->present = NR_SetupRelease_PHR_Config_PR_setup; @@ -1323,7 +1294,7 @@ void set_phr_config(NR_MAC_CellGroupConfig_t *mac_CellGroupConfig) mac_CellGroupConfig->phr_Config->choice.setup->phr_Tx_PowerFactorChange = NR_PHR_Config__phr_Tx_PowerFactorChange_dB1; } -void set_csi_meas_periodicity(const NR_ServingCellConfigCommon_t *scc, NR_CSI_ReportConfig_t *csirep, int uid, bool is_rsrp) +static void set_csi_meas_periodicity(const NR_ServingCellConfigCommon_t *scc, NR_CSI_ReportConfig_t *csirep, int uid, bool is_rsrp) { const NR_TDD_UL_DL_Pattern_t *tdd = scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL; const int n_slots_frame = slotsperframe[*scc->ssbSubcarrierSpacing]; @@ -1368,7 +1339,9 @@ void set_csi_meas_periodicity(const NR_ServingCellConfigCommon_t *scc, NR_CSI_Re } } -void config_csi_codebook(const rrc_pdsch_AntennaPorts_t *antennaports, const int max_layers, struct NR_CodebookConfig *codebookConfig) +static void config_csi_codebook(const rrc_pdsch_AntennaPorts_t *antennaports, + const int max_layers, + struct NR_CodebookConfig *codebookConfig) { const int num_ant_ports = antennaports->N1 * antennaports->N2 * antennaports->XP; codebookConfig->codebookType.present = NR_CodebookConfig__codebookType_PR_type1; @@ -1467,14 +1440,14 @@ void config_csi_codebook(const rrc_pdsch_AntennaPorts_t *antennaports, const int codebookConfig->codebookType.choice.type1->codebookMode = 1; } -void config_csi_meas_report(NR_CSI_MeasConfig_t *csi_MeasConfig, - const NR_ServingCellConfigCommon_t *servingcellconfigcommon, - NR_PUCCH_CSI_Resource_t *pucchcsires, - struct NR_SetupRelease_PDSCH_Config *pdsch_Config, - const rrc_pdsch_AntennaPorts_t *antennaports, - const int max_layers, - int rep_id, - int uid) +static void config_csi_meas_report(NR_CSI_MeasConfig_t *csi_MeasConfig, + const NR_ServingCellConfigCommon_t *servingcellconfigcommon, + NR_PUCCH_CSI_Resource_t *pucchcsires, + struct NR_SetupRelease_PDSCH_Config *pdsch_Config, + const rrc_pdsch_AntennaPorts_t *antennaports, + const int max_layers, + int rep_id, + int uid) { NR_CSI_ReportConfig_t *csirep = calloc(1, sizeof(*csirep)); csirep->reportConfigId = rep_id; @@ -1532,12 +1505,12 @@ void config_csi_meas_report(NR_CSI_MeasConfig_t *csi_MeasConfig, asn1cSeqAdd(&csi_MeasConfig->csi_ReportConfigToAddModList->list, csirep); } -void config_rsrp_meas_report(NR_CSI_MeasConfig_t *csi_MeasConfig, - const NR_ServingCellConfigCommon_t *servingcellconfigcommon, - NR_PUCCH_CSI_Resource_t *pucchcsires, - int do_csi, // if rsrp is based on CSI or SSB - int rep_id, - int uid) +static void config_rsrp_meas_report(NR_CSI_MeasConfig_t *csi_MeasConfig, + const NR_ServingCellConfigCommon_t *servingcellconfigcommon, + NR_PUCCH_CSI_Resource_t *pucchcsires, + int do_csi, // if rsrp is based on CSI or SSB + int rep_id, + int uid) { NR_CSI_ReportConfig_t *csirep = calloc(1, sizeof(*csirep)); csirep->reportConfigId = rep_id; @@ -1578,3 +1551,1274 @@ void config_rsrp_meas_report(NR_CSI_MeasConfig_t *csi_MeasConfig, *csirep->groupBasedBeamReporting.choice.disabled->nrofReportedRS = NR_CSI_ReportConfig__groupBasedBeamReporting__disabled__nrofReportedRS_n1; asn1cSeqAdd(&csi_MeasConfig->csi_ReportConfigToAddModList->list, csirep); } + +static void update_cqitables(struct NR_SetupRelease_PDSCH_Config *pdsch_Config, NR_CSI_MeasConfig_t *csi_MeasConfig) +{ + int nb_csi = csi_MeasConfig->csi_ReportConfigToAddModList->list.count; + for (int i = 0; i < nb_csi; i++) { + NR_CSI_ReportConfig_t *csirep = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[i]; + if(csirep->cqi_Table) { + if(pdsch_Config->choice.setup->mcs_Table!=NULL) + *csirep->cqi_Table = NR_CSI_ReportConfig__cqi_Table_table2; + else + *csirep->cqi_Table = NR_CSI_ReportConfig__cqi_Table_table1; + } + } +} + +NR_BCCH_BCH_Message_t *get_new_MIB_NR(const NR_ServingCellConfigCommon_t *scc) +{ + NR_BCCH_BCH_Message_t *mib = calloc(1, sizeof(*mib)); + if (mib == NULL) + abort(); + mib->message.present = NR_BCCH_BCH_MessageType_PR_mib; + mib->message.choice.mib = calloc(1, sizeof(struct NR_MIB)); + if (mib->message.choice.mib == NULL) + abort(); + + // 36.331 SFN BIT STRING (SIZE (8) , 38.331 SFN BIT STRING (SIZE (6)) + uint8_t sfn_msb = 0; // encoding will update with the correct frame number + mib->message.choice.mib->systemFrameNumber.buf = CALLOC(1, sizeof(uint8_t)); + mib->message.choice.mib->systemFrameNumber.buf[0] = sfn_msb << 2; + mib->message.choice.mib->systemFrameNumber.size = 1; + mib->message.choice.mib->systemFrameNumber.bits_unused = 2; + + // 38.331 spare BIT STRING (SIZE (1)) + uint16_t *spare = CALLOC(1, sizeof(uint16_t)); + if (spare == NULL) + abort(); + mib->message.choice.mib->spare.buf = (uint8_t *)spare; + mib->message.choice.mib->spare.size = 1; + mib->message.choice.mib->spare.bits_unused = 7; // This makes a spare of 1 bits + + AssertFatal(scc->ssbSubcarrierSpacing != NULL, "scc->ssbSubcarrierSpacing is null\n"); + int band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]; + frequency_range_t frequency_range = band < 100 ? FR1 : FR2; + int ssb_subcarrier_offset = 31; // default value for NSA + if (get_softmodem_params()->sa) { + uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB + - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA); + int scs_scaling = scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000 ? 3 : 1; + ssb_subcarrier_offset = (absolute_diff / scs_scaling) % 24; + if (frequency_range == FR2) { + // this assumes 120kHz SCS for SSB and subCarrierSpacingCommon (only + // option supported by OAI for now) + ssb_subcarrier_offset >>= 1; + } + } + mib->message.choice.mib->ssb_SubcarrierOffset = ssb_subcarrier_offset & 15; + + /* + * The SIB1 will be sent in this allocation (Type0-PDCCH) : 38.213, 13-4 Table and 38.213 13-11 to 13-14 tables + * the reverse allocation is in nr_ue_decode_mib() + */ + const NR_PDCCH_ConfigCommon_t *pdcch_cc = scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup; + long cset0 = pdcch_cc->controlResourceSetZero ? *pdcch_cc->controlResourceSetZero : 0; + mib->message.choice.mib->pdcch_ConfigSIB1.controlResourceSetZero = cset0; + long ss0 = pdcch_cc->searchSpaceZero ? *pdcch_cc->searchSpaceZero : 0; + mib->message.choice.mib->pdcch_ConfigSIB1.searchSpaceZero = ss0; + + switch (*scc->ssbSubcarrierSpacing) { + case NR_SubcarrierSpacing_kHz15: + mib->message.choice.mib->subCarrierSpacingCommon = NR_MIB__subCarrierSpacingCommon_scs15or60; + break; + + case NR_SubcarrierSpacing_kHz30: + mib->message.choice.mib->subCarrierSpacingCommon = NR_MIB__subCarrierSpacingCommon_scs30or120; + break; + + case NR_SubcarrierSpacing_kHz60: + mib->message.choice.mib->subCarrierSpacingCommon = NR_MIB__subCarrierSpacingCommon_scs15or60; + break; + + case NR_SubcarrierSpacing_kHz120: + mib->message.choice.mib->subCarrierSpacingCommon = NR_MIB__subCarrierSpacingCommon_scs30or120; + break; + + case NR_SubcarrierSpacing_kHz240: + AssertFatal(1 == 0, "Unknown subCarrierSpacingCommon %d\n", (int)*scc->ssbSubcarrierSpacing); + break; + + default: + AssertFatal(1 == 0, "Unknown subCarrierSpacingCommon %d\n", (int)*scc->ssbSubcarrierSpacing); + } + + switch (scc->dmrs_TypeA_Position) { + case NR_ServingCellConfigCommon__dmrs_TypeA_Position_pos2: + mib->message.choice.mib->dmrs_TypeA_Position = NR_MIB__dmrs_TypeA_Position_pos2; + break; + + case NR_ServingCellConfigCommon__dmrs_TypeA_Position_pos3: + mib->message.choice.mib->dmrs_TypeA_Position = NR_MIB__dmrs_TypeA_Position_pos3; + break; + + default: + AssertFatal(1 == 0, "Unknown dmrs_TypeA_Position %d\n", (int)scc->dmrs_TypeA_Position); + } + + mib->message.choice.mib->cellBarred = NR_MIB__cellBarred_notBarred; + mib->message.choice.mib->intraFreqReselection = NR_MIB__intraFreqReselection_notAllowed; + return mib; +} + +void free_MIB_NR(NR_BCCH_BCH_Message_t *mib) +{ + ASN_STRUCT_FREE(asn_DEF_NR_BCCH_BCH_Message, mib); +} + +int encode_MIB_NR(NR_BCCH_BCH_Message_t *mib, int frame, uint8_t *buf, int buf_size) +{ + DevAssert(mib != NULL && mib->message.choice.mib->systemFrameNumber.buf != NULL); + uint8_t sfn_msb = (uint8_t)((frame >> 4) & 0x3f); + *mib->message.choice.mib->systemFrameNumber.buf = sfn_msb << 2; + + asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_BCCH_BCH_Message, NULL, mib, buf, buf_size); + AssertFatal(enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); + LOG_D(NR_RRC, "Encoded MIB for frame %d sfn_msb %d, bits %lu\n", frame, sfn_msb, enc_rval.encoded); + return (enc_rval.encoded + 7) / 8; +} + +NR_BCCH_DL_SCH_Message_t *get_SIB1_NR(const gNB_RrcConfigurationReq *configuration) +{ + NR_BCCH_DL_SCH_Message_t *sib1_message = CALLOC(1,sizeof(NR_BCCH_DL_SCH_Message_t)); + AssertFatal(sib1_message != NULL, "out of memory\n"); + sib1_message->message.present = NR_BCCH_DL_SCH_MessageType_PR_c1; + sib1_message->message.choice.c1 = CALLOC(1,sizeof(struct NR_BCCH_DL_SCH_MessageType__c1)); + AssertFatal(sib1_message->message.choice.c1 != NULL, "out of memory\n"); + sib1_message->message.choice.c1->present = NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1; + sib1_message->message.choice.c1->choice.systemInformationBlockType1 = CALLOC(1,sizeof(struct NR_SIB1)); + AssertFatal(sib1_message->message.choice.c1->choice.systemInformationBlockType1 != NULL, "out of memory\n"); + struct NR_SIB1 *sib1 = sib1_message->message.choice.c1->choice.systemInformationBlockType1; + + // cellSelectionInfo + sib1->cellSelectionInfo = CALLOC(1,sizeof(*sib1->cellSelectionInfo)); + AssertFatal(sib1->cellSelectionInfo != NULL, "out of memory\n"); + // Fixme: should be in config file + //The IE Q-RxLevMin is used to indicate for cell selection/ re-selection the required minimum received RSRP level in the (NR) cell. + //Corresponds to parameter Qrxlevmin in TS38.304. + //Actual value Qrxlevmin = field value * 2 [dBm]. + sib1->cellSelectionInfo->q_RxLevMin = -65; + + // cellAccessRelatedInfo + // TODO : Add support for more than one PLMN + int num_plmn = 1; // int num_plmn = configuration->num_plmn; + asn1cSequenceAdd(sib1->cellAccessRelatedInfo.plmn_IdentityInfoList.list, struct NR_PLMN_IdentityInfo, nr_plmn_info); + for (int i = 0; i < num_plmn; ++i) { + asn1cSequenceAdd(nr_plmn_info->plmn_IdentityList.list, struct NR_PLMN_Identity, nr_plmn); + asn1cCalloc(nr_plmn->mcc, mcc); + int confMcc = configuration->mcc[i]; + asn1cSequenceAdd(mcc->list, NR_MCC_MNC_Digit_t, mcc0); + *mcc0 = (confMcc / 100) % 10; + asn1cSequenceAdd(mcc->list, NR_MCC_MNC_Digit_t, mcc1); + *mcc1 = (confMcc / 10) % 10; + asn1cSequenceAdd(mcc->list, NR_MCC_MNC_Digit_t, mcc2); + *mcc2 = confMcc % 10; + int mnc = configuration->mnc[i]; + if (configuration->mnc_digit_length[i] == 3) { + asn1cSequenceAdd(nr_plmn->mnc.list, NR_MCC_MNC_Digit_t, mnc0); + *mnc0 = (configuration->mnc[i] / 100) % 10; + } + asn1cSequenceAdd(nr_plmn->mnc.list, NR_MCC_MNC_Digit_t, mnc1); + *mnc1 = (mnc / 10) % 10; + asn1cSequenceAdd(nr_plmn->mnc.list, NR_MCC_MNC_Digit_t, mnc2); + *mnc2 = (mnc) % 10; + } + + nr_plmn_info->cellIdentity.buf = CALLOC(1, 5); + AssertFatal(nr_plmn_info->cellIdentity.buf != NULL, "out of memory\n"); + nr_plmn_info->cellIdentity.size = 5; + nr_plmn_info->cellIdentity.bits_unused = 4; + uint64_t tmp = htobe64(configuration->cell_identity) << 4; + memcpy(nr_plmn_info->cellIdentity.buf, ((char *)&tmp) + 3, 5); + nr_plmn_info->cellReservedForOperatorUse = NR_PLMN_IdentityInfo__cellReservedForOperatorUse_notReserved; + + nr_plmn_info->trackingAreaCode = CALLOC(1, sizeof(NR_TrackingAreaCode_t)); + AssertFatal(nr_plmn_info->trackingAreaCode != NULL, "out of memory\n"); + uint32_t tmp2 = htobe32(configuration->tac); + nr_plmn_info->trackingAreaCode->buf = CALLOC(1, 3); + AssertFatal(nr_plmn_info->trackingAreaCode->buf != NULL, "out of memory\n"); + memcpy(nr_plmn_info->trackingAreaCode->buf, ((char *)&tmp2) + 1, 3); + nr_plmn_info->trackingAreaCode->size = 3; + nr_plmn_info->trackingAreaCode->bits_unused = 0; + + // connEstFailureControl + // TODO: add connEstFailureControl + + //si-SchedulingInfo + /*sib1->si_SchedulingInfo = CALLOC(1,sizeof(struct NR_SI_SchedulingInfo)); + asn_set_empty(&sib1->si_SchedulingInfo->schedulingInfoList.list); + sib1->si_SchedulingInfo->si_WindowLength = NR_SI_SchedulingInfo__si_WindowLength_s40; + struct NR_SchedulingInfo *schedulingInfo = CALLOC(1,sizeof(struct NR_SchedulingInfo)); + schedulingInfo->si_BroadcastStatus = NR_SchedulingInfo__si_BroadcastStatus_broadcasting; + schedulingInfo->si_Periodicity = NR_SchedulingInfo__si_Periodicity_rf8; + asn_set_empty(&schedulingInfo->sib_MappingInfo.list); + + NR_SIB_TypeInfo_t *sib_type3 = CALLOC(1,sizeof(e_NR_SIB_TypeInfo__type)); + sib_type3->type = NR_SIB_TypeInfo__type_sibType3; + sib_type3->valueTag = CALLOC(1,sizeof(sib_type3->valueTag)); + asn1cSeqAdd(&schedulingInfo->sib_MappingInfo.list,sib_type3); + + NR_SIB_TypeInfo_t *sib_type5 = CALLOC(1,sizeof(e_NR_SIB_TypeInfo__type)); + sib_type5->type = NR_SIB_TypeInfo__type_sibType5; + sib_type5->valueTag = CALLOC(1,sizeof(sib_type5->valueTag)); + asn1cSeqAdd(&schedulingInfo->sib_MappingInfo.list,sib_type5); + + NR_SIB_TypeInfo_t *sib_type4 = CALLOC(1,sizeof(e_NR_SIB_TypeInfo__type)); + sib_type4->type = NR_SIB_TypeInfo__type_sibType4; + sib_type4->valueTag = CALLOC(1,sizeof(sib_type4->valueTag)); + asn1cSeqAdd(&schedulingInfo->sib_MappingInfo.list,sib_type4); + + NR_SIB_TypeInfo_t *sib_type2 = CALLOC(1,sizeof(e_NR_SIB_TypeInfo__type)); + sib_type2->type = NR_SIB_TypeInfo__type_sibType2; + sib_type2->valueTag = CALLOC(1,sizeof(sib_type2->valueTag)); + asn1cSeqAdd(&schedulingInfo->sib_MappingInfo.list,sib_type2); + + asn1cSeqAdd(&sib1->si_SchedulingInfo->schedulingInfoList.list,schedulingInfo);*/ + + // servingCellConfigCommon + asn1cCalloc(sib1->servingCellConfigCommon, ServCellCom); + NR_BWP_DownlinkCommon_t *initialDownlinkBWP = &ServCellCom->downlinkConfigCommon.initialDownlinkBWP; + initialDownlinkBWP->genericParameters = configuration->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters; + + const NR_FrequencyInfoDL_t *frequencyInfoDL = configuration->scc->downlinkConfigCommon->frequencyInfoDL; + for (int i = 0; i < frequencyInfoDL->frequencyBandList.list.count; i++) { + asn1cSequenceAdd(ServCellCom->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list, + struct NR_NR_MultiBandInfo, + nrMultiBandInfo); + nrMultiBandInfo->freqBandIndicatorNR = + frequencyInfoDL->frequencyBandList.list.array[i]; + } + + int scs_scaling0 = 1 << (configuration->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing); + int scs_scaling = scs_scaling0; + int scs_scaling2 = scs_scaling0; + if (frequencyInfoDL->absoluteFrequencyPointA < 600000) { + scs_scaling = scs_scaling0 * 3; + } + if (frequencyInfoDL->absoluteFrequencyPointA > 2016666) { + scs_scaling = scs_scaling0 >> 2; + scs_scaling2 = scs_scaling0 >> 2; + } + uint32_t absolute_diff = (*frequencyInfoDL->absoluteFrequencySSB - frequencyInfoDL->absoluteFrequencyPointA); + + sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.offsetToPointA = + scs_scaling2 * (absolute_diff / (12 * scs_scaling) - 10); + + LOG_I(NR_RRC, + "SIB1 freq: absoluteFrequencySSB %ld, absoluteFrequencyPointA %ld\n", + *frequencyInfoDL->absoluteFrequencySSB, + frequencyInfoDL->absoluteFrequencyPointA); + LOG_I(NR_RRC, + "SIB1 freq: absolute_diff %d, %d*(absolute_diff/(12*%d) - 10) %d\n", + absolute_diff, + scs_scaling2, + scs_scaling, + (int)sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.offsetToPointA); + + for (int i = 0; i < frequencyInfoDL->scs_SpecificCarrierList.list.count; i++) { + asn1cSeqAdd(&ServCellCom->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list, + frequencyInfoDL->scs_SpecificCarrierList.list.array[i]); + } + + initialDownlinkBWP->pdcch_ConfigCommon = configuration->scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon; + initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList = + CALLOC(1, sizeof(struct NR_PDCCH_ConfigCommon__commonSearchSpaceList)); + AssertFatal(initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList != NULL, "out of memory\n"); + + NR_SearchSpace_t *ss1 = rrc_searchspace_config(true, 1, 0); + asn1cSeqAdd(&initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list, ss1); + + NR_SearchSpace_t *ss2 = rrc_searchspace_config(true, 2, 0); + asn1cSeqAdd(&initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list, ss2); + + NR_SearchSpace_t *ss3 = rrc_searchspace_config(true, 3, 0); + asn1cSeqAdd(&initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list, ss3); + + asn1cCallocOne(initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1, 0); + asn1cCallocOne(initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->searchSpaceOtherSystemInformation, 3); + asn1cCallocOne(initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->pagingSearchSpace, 2); + asn1cCallocOne(initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->ra_SearchSpace, 1); + + initialDownlinkBWP->pdsch_ConfigCommon = configuration->scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon; + ServCellCom->downlinkConfigCommon.bcch_Config.modificationPeriodCoeff = NR_BCCH_Config__modificationPeriodCoeff_n2; + ServCellCom->downlinkConfigCommon.pcch_Config.defaultPagingCycle = NR_PagingCycle_rf256; + ServCellCom->downlinkConfigCommon.pcch_Config.nAndPagingFrameOffset.present = NR_PCCH_Config__nAndPagingFrameOffset_PR_quarterT; + ServCellCom->downlinkConfigCommon.pcch_Config.nAndPagingFrameOffset.choice.quarterT = 1; + ServCellCom->downlinkConfigCommon.pcch_Config.ns = NR_PCCH_Config__ns_one; + + asn1cCalloc(ServCellCom->downlinkConfigCommon.pcch_Config.firstPDCCH_MonitoringOccasionOfPO, P0); + P0->present = NR_PCCH_Config__firstPDCCH_MonitoringOccasionOfPO_PR_sCS120KHZoneT_SCS60KHZhalfT_SCS30KHZquarterT_SCS15KHZoneEighthT; + + asn1cCalloc(P0->choice.sCS120KHZoneT_SCS60KHZhalfT_SCS30KHZquarterT_SCS15KHZoneEighthT, Z8); + asn1cSequenceAdd(Z8->list, long, ZoneEight); + asn1cCallocOne(ZoneEight, 0); + + asn1cCalloc(ServCellCom->uplinkConfigCommon, UL); + asn_set_empty(&UL->frequencyInfoUL.scs_SpecificCarrierList.list); + const NR_FrequencyInfoUL_t *frequencyInfoUL = configuration->scc->uplinkConfigCommon->frequencyInfoUL; + for (int i = 0; i < frequencyInfoUL->scs_SpecificCarrierList.list.count; i++) { + asn1cSeqAdd(&UL->frequencyInfoUL.scs_SpecificCarrierList.list, frequencyInfoUL->scs_SpecificCarrierList.list.array[i]); + } + + asn1cCallocOne(UL->frequencyInfoUL.p_Max, *frequencyInfoUL->p_Max); + + UL->initialUplinkBWP.genericParameters = configuration->scc->uplinkConfigCommon->initialUplinkBWP->genericParameters; + UL->initialUplinkBWP.rach_ConfigCommon = configuration->scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon; + UL->initialUplinkBWP.pusch_ConfigCommon = configuration->scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon; + UL->initialUplinkBWP.pusch_ConfigCommon->choice.setup->groupHoppingEnabledTransformPrecoding = NULL; + + UL->initialUplinkBWP.pucch_ConfigCommon = configuration->scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon; + + UL->timeAlignmentTimerCommon = NR_TimeAlignmentTimer_infinity; + + ServCellCom->n_TimingAdvanceOffset = configuration->scc->n_TimingAdvanceOffset; + + ServCellCom->ssb_PositionsInBurst.inOneGroup.buf = calloc(1, sizeof(uint8_t)); + uint8_t bitmap8,temp_bitmap=0; + switch (configuration->scc->ssb_PositionsInBurst->present) { + case NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_shortBitmap: + ServCellCom->ssb_PositionsInBurst.inOneGroup = configuration->scc->ssb_PositionsInBurst->choice.shortBitmap; + break; + case NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_mediumBitmap: + ServCellCom->ssb_PositionsInBurst.inOneGroup = configuration->scc->ssb_PositionsInBurst->choice.mediumBitmap; + break; + /* + * groupPresence: This field is present when maximum number of SS/PBCH blocks per half frame equals to 64 as defined in + * TS 38.213 [13], clause 4.1. The first/leftmost bit corresponds to the SS/PBCH index 0-7, the second bit corresponds to + * SS/PBCH block 8-15, and so on. Value 0 in the bitmap indicates that the SSBs according to inOneGroup are absent. Value 1 + * indicates that the SS/PBCH blocks are transmitted in accordance with inOneGroup. inOneGroup: When maximum number of SS/PBCH + * blocks per half frame equals to 64 as defined in TS 38.213 [13], clause 4.1, all 8 bit are valid; The first/ leftmost bit + * corresponds to the first SS/PBCH block index in the group (i.e., to SSB index 0, 8, and so on); the second bit corresponds to + * the second SS/PBCH block index in the group (i.e., to SSB index 1, 9, and so on), and so on. Value 0 in the bitmap indicates + * that the corresponding SS/PBCH block is not transmitted while value 1 indicates that the corresponding SS/PBCH block is + * transmitted. + */ + case NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_longBitmap: + ServCellCom->ssb_PositionsInBurst.inOneGroup.size = 1; + ServCellCom->ssb_PositionsInBurst.inOneGroup.bits_unused = 0; + ServCellCom->ssb_PositionsInBurst.groupPresence = calloc(1, sizeof(BIT_STRING_t)); + AssertFatal(ServCellCom->ssb_PositionsInBurst.groupPresence != NULL, "out of memory\n"); + ServCellCom->ssb_PositionsInBurst.groupPresence->size = 1; + ServCellCom->ssb_PositionsInBurst.groupPresence->bits_unused = 0; + ServCellCom->ssb_PositionsInBurst.groupPresence->buf = calloc(1, sizeof(uint8_t)); + AssertFatal(ServCellCom->ssb_PositionsInBurst.groupPresence->buf != NULL, "out of memory\n"); + ServCellCom->ssb_PositionsInBurst.groupPresence->buf[0] = 0; + for (int i = 0; i < 8; i++) { + bitmap8 = configuration->scc->ssb_PositionsInBurst->choice.longBitmap.buf[i]; + if (bitmap8 != 0) { + if (temp_bitmap == 0) + temp_bitmap = bitmap8; + else + AssertFatal(temp_bitmap == bitmap8, + "For longBitmap the groups of 8 SSBs containing at least 1 transmitted SSB should be all the same\n"); + + ServCellCom->ssb_PositionsInBurst.inOneGroup.buf[0] = bitmap8; + ServCellCom->ssb_PositionsInBurst.groupPresence->buf[0] |= 1<<(7-i); + } + } + break; + default: + AssertFatal(false, "ssb_PositionsInBurst not present\n"); + break; + } + + ServCellCom->ssb_PeriodicityServingCell = *configuration->scc->ssb_periodicityServingCell; + if (configuration->scc->tdd_UL_DL_ConfigurationCommon) { + ServCellCom->tdd_UL_DL_ConfigurationCommon = CALLOC(1,sizeof(struct NR_TDD_UL_DL_ConfigCommon)); + AssertFatal(ServCellCom->tdd_UL_DL_ConfigurationCommon != NULL, "out of memory\n"); + ServCellCom->tdd_UL_DL_ConfigurationCommon->referenceSubcarrierSpacing = configuration->scc->tdd_UL_DL_ConfigurationCommon->referenceSubcarrierSpacing; + ServCellCom->tdd_UL_DL_ConfigurationCommon->pattern1 = configuration->scc->tdd_UL_DL_ConfigurationCommon->pattern1; + ServCellCom->tdd_UL_DL_ConfigurationCommon->pattern2 = configuration->scc->tdd_UL_DL_ConfigurationCommon->pattern2; + } + ServCellCom->ss_PBCH_BlockPower = configuration->scc->ss_PBCH_BlockPower; + + // ims-EmergencySupport + // TODO: add ims-EmergencySupport + + // eCallOverIMS-Support + // TODO: add eCallOverIMS-Support + + // ue-TimersAndConstants + sib1->ue_TimersAndConstants = CALLOC(1,sizeof(struct NR_UE_TimersAndConstants)); + AssertFatal(sib1->ue_TimersAndConstants != NULL, "out of memory\n"); + sib1->ue_TimersAndConstants->t300 = NR_UE_TimersAndConstants__t300_ms400; + sib1->ue_TimersAndConstants->t301 = NR_UE_TimersAndConstants__t301_ms400; + sib1->ue_TimersAndConstants->t310 = NR_UE_TimersAndConstants__t310_ms2000; + sib1->ue_TimersAndConstants->n310 = NR_UE_TimersAndConstants__n310_n10; + sib1->ue_TimersAndConstants->t311 = NR_UE_TimersAndConstants__t311_ms3000; + sib1->ue_TimersAndConstants->n311 = NR_UE_TimersAndConstants__n311_n1; + sib1->ue_TimersAndConstants->t319 = NR_UE_TimersAndConstants__t319_ms400; + + // uac-BarringInfo + /*sib1->uac_BarringInfo = CALLOC(1, sizeof(struct NR_SIB1__uac_BarringInfo)); + NR_UAC_BarringInfoSet_t *nr_uac_BarringInfoSet = CALLOC(1, sizeof(NR_UAC_BarringInfoSet_t)); + asn_set_empty(&sib1->uac_BarringInfo->uac_BarringInfoSetList); + nr_uac_BarringInfoSet->uac_BarringFactor = NR_UAC_BarringInfoSet__uac_BarringFactor_p95; + nr_uac_BarringInfoSet->uac_BarringTime = NR_UAC_BarringInfoSet__uac_BarringTime_s4; + nr_uac_BarringInfoSet->uac_BarringForAccessIdentity.buf = CALLOC(1, 1); + nr_uac_BarringInfoSet->uac_BarringForAccessIdentity.size = 1; + nr_uac_BarringInfoSet->uac_BarringForAccessIdentity.bits_unused = 1; + asn1cSeqAdd(&sib1->uac_BarringInfo->uac_BarringInfoSetList, nr_uac_BarringInfoSet);*/ + + // useFullResumeID + // TODO: add useFullResumeID + + // lateNonCriticalExtension + // TODO: add lateNonCriticalExtension + + // nonCriticalExtension + // TODO: add nonCriticalExtension + + //xer_fprint(stdout, &asn_DEF_NR_SIB1, (const void*)sib1_message->message.choice.c1->choice.systemInformationBlockType1); + return sib1_message; +} + +void free_SIB1_NR(NR_BCCH_DL_SCH_Message_t *sib1) +{ + ASN_STRUCT_FREE(asn_DEF_NR_BCCH_DL_SCH_Message, sib1); +} + +int encode_SIB1_NR(NR_BCCH_DL_SCH_Message_t *sib1, uint8_t *buffer, int max_buffer_size) +{ + AssertFatal(max_buffer_size <= NR_MAX_SIB_LENGTH / 8, + "%s(): maximum buffer size too large: 3GPP TS 38.331 section 5.2.1 - The physical layer imposes a limit to the " + "maximum size a SIB can take. The maximum SIB1 or SI message size is 2976 bits.\n", + __func__); + asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_BCCH_DL_SCH_Message, NULL, sib1, buffer, max_buffer_size); + AssertFatal(enc_rval.encoded > 0 && enc_rval.encoded <= max_buffer_size * 8, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); + return (enc_rval.encoded + 7) / 8; +} + +static NR_MAC_CellGroupConfig_t *configure_mac_cellgroup(void) +{ + NR_MAC_CellGroupConfig_t * mac_CellGroupConfig = calloc(1, sizeof(*mac_CellGroupConfig)); + + mac_CellGroupConfig->bsr_Config = calloc(1, sizeof(*mac_CellGroupConfig->bsr_Config)); + mac_CellGroupConfig->bsr_Config->periodicBSR_Timer = NR_BSR_Config__periodicBSR_Timer_sf10; + mac_CellGroupConfig->bsr_Config->retxBSR_Timer = NR_BSR_Config__retxBSR_Timer_sf80; + mac_CellGroupConfig->tag_Config = calloc(1, sizeof(*mac_CellGroupConfig->tag_Config)); + mac_CellGroupConfig->tag_Config->tag_ToReleaseList = NULL; + mac_CellGroupConfig->tag_Config->tag_ToAddModList = calloc(1,sizeof(*mac_CellGroupConfig->tag_Config->tag_ToAddModList)); + struct NR_TAG *tag=calloc(1,sizeof(*tag)); + tag->tag_Id = 0; + tag->timeAlignmentTimer = NR_TimeAlignmentTimer_infinity; + asn1cSeqAdd(&mac_CellGroupConfig->tag_Config->tag_ToAddModList->list,tag); + + set_phr_config(mac_CellGroupConfig); + + mac_CellGroupConfig->schedulingRequestConfig = calloc(1, sizeof(*mac_CellGroupConfig->schedulingRequestConfig)); + mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList = CALLOC(1,sizeof(*mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList)); + struct NR_SchedulingRequestToAddMod *schedulingrequestlist = CALLOC(1,sizeof(*schedulingrequestlist)); + schedulingrequestlist->schedulingRequestId = 0; + schedulingrequestlist->sr_ProhibitTimer = NULL; + schedulingrequestlist->sr_TransMax = NR_SchedulingRequestToAddMod__sr_TransMax_n64; + asn1cSeqAdd(&(mac_CellGroupConfig->schedulingRequestConfig->schedulingRequestToAddModList->list),schedulingrequestlist); + + mac_CellGroupConfig->skipUplinkTxDynamic=false; + mac_CellGroupConfig->ext1 = NULL; + return mac_CellGroupConfig; +} + + +static NR_SpCellConfig_t *get_initial_SpCellConfig(int uid, + const NR_ServingCellConfigCommon_t *scc, + const NR_ServingCellConfig_t *servingcellconfigdedicated, + const gNB_RrcConfigurationReq *configuration) +{ + // This assert will never happen in the current implementation because NUMBER_OF_UE_MAX = 4. + // However, if in the future NUMBER_OF_UE_MAX is increased, it will be necessary to improve the allocation of SRS resources, + // where the startPosition = 2 or 3 and sl160 = 17, 17, 27 ... 157 only give us 30 different allocations. + AssertFatal(uid >= 0 && uid < 30, "gNB cannot allocate the SRS resources\n"); + + const int pdsch_AntennaPorts = + configuration->pdsch_AntennaPorts.N1 * configuration->pdsch_AntennaPorts.N2 * configuration->pdsch_AntennaPorts.XP; + int curr_bwp = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + NR_SpCellConfig_t *SpCellConfig = calloc(1, sizeof(*SpCellConfig)); + SpCellConfig->servCellIndex = NULL; + SpCellConfig->reconfigurationWithSync = NULL; + SpCellConfig->rlmInSyncOutOfSyncThreshold = NULL; + SpCellConfig->rlf_TimersAndConstants = NULL; + + SpCellConfig->spCellConfigDedicated = calloc(1, sizeof(*SpCellConfig->spCellConfigDedicated)); + SpCellConfig->spCellConfigDedicated->uplinkConfig = calloc(1, sizeof(*SpCellConfig->spCellConfigDedicated->uplinkConfig)); + NR_UplinkConfig_t *uplinkConfig = SpCellConfig->spCellConfigDedicated->uplinkConfig; + + NR_BWP_UplinkDedicated_t *initialUplinkBWP = calloc(1, sizeof(*initialUplinkBWP)); + uplinkConfig->initialUplinkBWP = initialUplinkBWP; + initialUplinkBWP->pucch_Config = calloc(1, sizeof(*initialUplinkBWP->pucch_Config)); + initialUplinkBWP->pucch_Config->present = NR_SetupRelease_PUCCH_Config_PR_setup; + NR_PUCCH_Config_t *pucch_Config = calloc(1, sizeof(*pucch_Config)); + initialUplinkBWP->pucch_Config->choice.setup = pucch_Config; + pucch_Config->resourceSetToAddModList = calloc(1, sizeof(*pucch_Config->resourceSetToAddModList)); + pucch_Config->resourceSetToReleaseList = NULL; + pucch_Config->resourceToAddModList = calloc(1, sizeof(*pucch_Config->resourceToAddModList)); + pucch_Config->resourceToReleaseList = NULL; + config_pucch_resset0(pucch_Config, uid, curr_bwp, NULL); + config_pucch_resset1(pucch_Config, NULL); + set_pucch_power_config(pucch_Config, configuration->do_CSIRS); + + initialUplinkBWP->pusch_Config = config_pusch(NULL); + + long maxMIMO_Layers = uplinkConfig && uplinkConfig->pusch_ServingCellConfig + && uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1 + && uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers + ? *uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers + : 1; + + // We are using do_srs = 0 here because the periodic SRS will only be enabled in update_cellGroupConfig() if do_srs == 1 + initialUplinkBWP->srs_Config = calloc(1, sizeof(*initialUplinkBWP->srs_Config)); + config_srs(scc, initialUplinkBWP->srs_Config, NULL, curr_bwp, uid, 0, maxMIMO_Layers, 0); + + scheduling_request_config(scc, pucch_Config, scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing); + + set_dl_DataToUL_ACK(pucch_Config, + configuration->minRXTXTIME, + scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing); + + SpCellConfig->spCellConfigDedicated->initialDownlinkBWP = + calloc(1, sizeof(*SpCellConfig->spCellConfigDedicated->initialDownlinkBWP)); + NR_BWP_DownlinkDedicated_t *bwp_Dedicated = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP; + bwp_Dedicated->pdcch_Config = calloc(1, sizeof(*bwp_Dedicated->pdcch_Config)); + bwp_Dedicated->pdcch_Config->present = NR_SetupRelease_PDCCH_Config_PR_setup; + bwp_Dedicated->pdcch_Config->choice.setup = calloc(1, sizeof(*bwp_Dedicated->pdcch_Config->choice.setup)); + + bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList = + calloc(1, sizeof(*bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList)); + + bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList = + calloc(1, sizeof(*bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList)); + + uint64_t bitmap = get_ssb_bitmap(scc); + NR_ControlResourceSet_t *coreset = get_coreset_config(0, curr_bwp, bitmap); + + asn1cSeqAdd(&bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list, coreset); + + bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList = + calloc(1, sizeof(*bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList)); + + NR_SearchSpace_t *ss2 = rrc_searchspace_config(false, 5, coreset->controlResourceSetId); + asn1cSeqAdd(&bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list, ss2); + + bwp_Dedicated->pdsch_Config = config_pdsch(bitmap, 0, pdsch_AntennaPorts); + + SpCellConfig->spCellConfigDedicated->tag_Id = 0; + SpCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig = + calloc(1, sizeof(*SpCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig)); + NR_PDSCH_ServingCellConfig_t *pdsch_servingcellconfig = calloc(1, sizeof(*pdsch_servingcellconfig)); + SpCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->present = NR_SetupRelease_PDSCH_ServingCellConfig_PR_setup; + SpCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup = pdsch_servingcellconfig; + + // Downlink BWPs + int n_dl_bwp = 0; + if (servingcellconfigdedicated && servingcellconfigdedicated->downlinkBWP_ToAddModList + && servingcellconfigdedicated->downlinkBWP_ToAddModList->list.count > 0) { + n_dl_bwp = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.count; + } + if (n_dl_bwp > 0) { + SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList = + calloc(1, sizeof(*SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList)); + for (int bwp_loop = 0; bwp_loop < n_dl_bwp; bwp_loop++) { + NR_BWP_Downlink_t *bwp = calloc(1, sizeof(*bwp)); + config_downlinkBWP(bwp, scc, servingcellconfigdedicated, NULL, 0, false, bwp_loop, true); + asn1cSeqAdd(&SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list, bwp); + } + SpCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = + calloc(1, sizeof(*SpCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id)); + *SpCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = + servingcellconfigdedicated->firstActiveDownlinkBWP_Id ? *servingcellconfigdedicated->firstActiveDownlinkBWP_Id : 1; + SpCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = + calloc(1, sizeof(*SpCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id)); + *SpCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = + servingcellconfigdedicated->defaultDownlinkBWP_Id ? *servingcellconfigdedicated->defaultDownlinkBWP_Id : 1; + } + + // Uplink BWPs + int n_ul_bwp = 0; + if (servingcellconfigdedicated && servingcellconfigdedicated->uplinkConfig + && servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList + && servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count > 0) { + n_ul_bwp = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count; + } + if (n_ul_bwp > 0) { + uplinkConfig->uplinkBWP_ToAddModList = calloc(1, sizeof(*uplinkConfig->uplinkBWP_ToAddModList)); + for (int bwp_loop = 0; bwp_loop < n_ul_bwp; bwp_loop++) { + NR_BWP_Uplink_t *ubwp = calloc(1, sizeof(*ubwp)); + config_uplinkBWP(ubwp, bwp_loop, true, uid, configuration, servingcellconfigdedicated, scc, NULL); + asn1cSeqAdd(&uplinkConfig->uplinkBWP_ToAddModList->list, ubwp); + } + uplinkConfig->firstActiveUplinkBWP_Id = calloc(1, sizeof(*uplinkConfig->firstActiveUplinkBWP_Id)); + *uplinkConfig->firstActiveUplinkBWP_Id = servingcellconfigdedicated->uplinkConfig->firstActiveUplinkBWP_Id + ? *servingcellconfigdedicated->uplinkConfig->firstActiveUplinkBWP_Id + : 1; + } + + SpCellConfig->spCellConfigDedicated->csi_MeasConfig = calloc(1, sizeof(*SpCellConfig->spCellConfigDedicated->csi_MeasConfig)); + SpCellConfig->spCellConfigDedicated->csi_MeasConfig->present = NR_SetupRelease_CSI_MeasConfig_PR_setup; + + NR_CSI_MeasConfig_t *csi_MeasConfig = calloc(1, sizeof(*csi_MeasConfig)); + SpCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup = csi_MeasConfig; + + csi_MeasConfig->csi_SSB_ResourceSetToAddModList = calloc(1, sizeof(*csi_MeasConfig->csi_SSB_ResourceSetToAddModList)); + csi_MeasConfig->csi_SSB_ResourceSetToReleaseList = NULL; + csi_MeasConfig->csi_ResourceConfigToAddModList = calloc(1, sizeof(*csi_MeasConfig->csi_ResourceConfigToAddModList)); + csi_MeasConfig->csi_ResourceConfigToReleaseList = NULL; + csi_MeasConfig->csi_ReportConfigToAddModList = calloc(1, sizeof(*csi_MeasConfig->csi_ReportConfigToAddModList)); + csi_MeasConfig->csi_ReportConfigToReleaseList = NULL; + + NR_CSI_SSB_ResourceSet_t *ssbresset0 = calloc(1, sizeof(*ssbresset0)); + ssbresset0->csi_SSB_ResourceSetId = 0; + + for (int i = 0; i < 64; i++) { + if ((bitmap >> (63 - i)) & 0x01) { + NR_SSB_Index_t *ssbres = NULL; + asn1cCallocOne(ssbres, i); + asn1cSeqAdd(&ssbresset0->csi_SSB_ResourceList.list, ssbres); + } + } + asn1cSeqAdd(&csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list, ssbresset0); + + int bwp_loop_end = n_dl_bwp > 0 ? n_dl_bwp : 1; + for (int bwp_loop = 0; bwp_loop < bwp_loop_end; bwp_loop++) { + int curr_bwp, bwp_id; + struct NR_SetupRelease_PDSCH_Config *pdsch_Config; + if (n_dl_bwp == 0) { + pdsch_Config = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config; + curr_bwp = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + bwp_id = 0; + } else { + NR_BWP_Downlink_t *bwp = SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]; + pdsch_Config = bwp->bwp_Dedicated->pdsch_Config; + curr_bwp = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + bwp_id = bwp->bwp_Id; + } + + config_csirs(scc, csi_MeasConfig, uid, pdsch_AntennaPorts, curr_bwp, configuration->do_CSIRS, bwp_loop); + config_csiim(configuration->do_CSIRS, pdsch_AntennaPorts, curr_bwp, csi_MeasConfig, bwp_loop); + + NR_CSI_ResourceConfig_t *csires1 = calloc(1, sizeof(*csires1)); + csires1->csi_ResourceConfigId = bwp_id + 20; + csires1->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB; + csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB = + calloc(1, sizeof(*csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB)); + csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList = + calloc(1, sizeof(*csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList)); + NR_CSI_SSB_ResourceSetId_t *ssbres00 = calloc(1, sizeof(*ssbres00)); + *ssbres00 = 0; + asn1cSeqAdd(&csires1->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list, ssbres00); + csires1->bwp_Id = bwp_id; + csires1->resourceType = NR_CSI_ResourceConfig__resourceType_periodic; + asn1cSeqAdd(&csi_MeasConfig->csi_ResourceConfigToAddModList->list, csires1); + + NR_PUCCH_CSI_Resource_t *pucchcsires1 = calloc(1, sizeof(*pucchcsires1)); + pucchcsires1->uplinkBandwidthPartId = bwp_id; + pucchcsires1->pucch_Resource = 2; + + if (configuration->do_CSIRS) { + NR_CSI_ResourceConfig_t *csires0 = calloc(1, sizeof(*csires0)); + csires0->csi_ResourceConfigId = bwp_id; + csires0->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB; + csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB = + calloc(1, sizeof(*csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB)); + csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList = + calloc(1, sizeof(*csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList)); + NR_NZP_CSI_RS_ResourceSetId_t *nzp0 = calloc(1, sizeof(*nzp0)); + *nzp0 = bwp_loop; + asn1cSeqAdd(&csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list, nzp0); + csires0->bwp_Id = bwp_id; + csires0->resourceType = NR_CSI_ResourceConfig__resourceType_periodic; + asn1cSeqAdd(&csi_MeasConfig->csi_ResourceConfigToAddModList->list, csires0); + } + + if (configuration->do_CSIRS && pdsch_AntennaPorts > 1) { + NR_CSI_ResourceConfig_t *csires2 = calloc(1, sizeof(*csires2)); + csires2->csi_ResourceConfigId = bwp_id + 10; + csires2->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_csi_IM_ResourceSetList; + csires2->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList = + calloc(1, sizeof(*csires2->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList)); + NR_CSI_IM_ResourceSetId_t *csiim00 = calloc(1, sizeof(*csiim00)); + *csiim00 = bwp_loop; + asn1cSeqAdd(&csires2->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList->list, csiim00); + csires2->bwp_Id = bwp_id; + csires2->resourceType = NR_CSI_ResourceConfig__resourceType_periodic; + asn1cSeqAdd(&csi_MeasConfig->csi_ResourceConfigToAddModList->list, csires2); + + config_csi_meas_report(csi_MeasConfig, + scc, + pucchcsires1, + pdsch_Config, + &configuration->pdsch_AntennaPorts, + NR_MAX_SUPPORTED_DL_LAYERS, + bwp_id, + uid); + } + config_rsrp_meas_report(csi_MeasConfig, scc, pucchcsires1, configuration->do_CSIRS, bwp_id + 10, uid); + } + pdsch_servingcellconfig->codeBlockGroupTransmission = NULL; + pdsch_servingcellconfig->xOverhead = NULL; + pdsch_servingcellconfig->nrofHARQ_ProcessesForPDSCH = calloc(1, sizeof(*pdsch_servingcellconfig->nrofHARQ_ProcessesForPDSCH)); + *pdsch_servingcellconfig->nrofHARQ_ProcessesForPDSCH = NR_PDSCH_ServingCellConfig__nrofHARQ_ProcessesForPDSCH_n16; + pdsch_servingcellconfig->pucch_Cell = NULL; + pdsch_servingcellconfig->ext1 = calloc(1, sizeof(*pdsch_servingcellconfig->ext1)); + pdsch_servingcellconfig->ext1->maxMIMO_Layers = calloc(1, sizeof(*pdsch_servingcellconfig->ext1->maxMIMO_Layers)); + *pdsch_servingcellconfig->ext1->maxMIMO_Layers = 2; + + if (LOG_DEBUGFLAG(DEBUG_ASN1)) { + xer_fprint(stdout, &asn_DEF_NR_SpCellConfig, SpCellConfig); + } + return SpCellConfig; +} + +NR_CellGroupConfig_t *get_initial_cellGroupConfig(int uid, + const NR_ServingCellConfigCommon_t *scc, + const NR_ServingCellConfig_t *servingcellconfigdedicated, + const gNB_RrcConfigurationReq *configuration) +{ + NR_CellGroupConfig_t *cellGroupConfig = calloc(1, sizeof(*cellGroupConfig)); + cellGroupConfig->cellGroupId = 0; + + /* Rlc Bearer Config */ + /* TS38.331 9.2.1 Default SRB configurations */ + cellGroupConfig->rlc_BearerToAddModList = calloc(1, sizeof(*cellGroupConfig->rlc_BearerToAddModList)); + NR_RLC_BearerConfig_t *rlc_BearerConfig = + get_SRB_RLC_BearerConfig(1, 1, NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms1000); + asn1cSeqAdd(&cellGroupConfig->rlc_BearerToAddModList->list, rlc_BearerConfig); + + cellGroupConfig->rlc_BearerToReleaseList = NULL; + + /* mac CellGroup Config */ + cellGroupConfig->mac_CellGroupConfig = configure_mac_cellgroup(); + + NR_PhysicalCellGroupConfig_t *physicalCellGroupConfig = calloc(1, sizeof(*physicalCellGroupConfig)); + physicalCellGroupConfig->p_NR_FR1 = NULL; + physicalCellGroupConfig->pdsch_HARQ_ACK_Codebook = NR_PhysicalCellGroupConfig__pdsch_HARQ_ACK_Codebook_dynamic; + cellGroupConfig->physicalCellGroupConfig = physicalCellGroupConfig; + + cellGroupConfig->spCellConfig = get_initial_SpCellConfig(uid, scc, servingcellconfigdedicated, configuration); + + cellGroupConfig->sCellToAddModList = NULL; + cellGroupConfig->sCellToReleaseList = NULL; + return cellGroupConfig; +} + +void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, + const int uid, + NR_UE_NR_Capability_t *uecap, + const gNB_RrcConfigurationReq *configuration) +{ + DevAssert(cellGroupConfig != NULL); + /* this is wrong: we should not call this function is spCellConfig is not + * allocated */ + if (cellGroupConfig->spCellConfig == NULL) + return; + /* same as for spCellConfig */ + if (configuration == NULL) + return; + DevAssert(configuration->scc != NULL); + + NR_SpCellConfig_t *SpCellConfig = cellGroupConfig->spCellConfig; + NR_ServingCellConfigCommon_t *scc = configuration->scc; + + int curr_bwp = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + NR_UplinkConfig_t *uplinkConfig = + SpCellConfig && SpCellConfig->spCellConfigDedicated ? SpCellConfig->spCellConfigDedicated->uplinkConfig : NULL; + + uint8_t ul_max_layers = 1; + if (uecap && uecap->featureSets && uecap->featureSets->featureSetsUplinkPerCC + && uecap->featureSets->featureSetsUplinkPerCC->list.count > 0) { + NR_FeatureSetUplinkPerCC_t *ul_feature_setup_per_cc = uecap->featureSets->featureSetsUplinkPerCC->list.array[0]; + if (ul_feature_setup_per_cc->mimo_CB_PUSCH->maxNumberMIMO_LayersCB_PUSCH) { + switch (*ul_feature_setup_per_cc->mimo_CB_PUSCH->maxNumberMIMO_LayersCB_PUSCH) { + case NR_MIMO_LayersUL_twoLayers: + ul_max_layers = 2; + break; + case NR_MIMO_LayersUL_fourLayers: + ul_max_layers = 4; + break; + default: + ul_max_layers = 1; + } + } + ul_max_layers = min(ul_max_layers, configuration->pusch_AntennaPorts); + if (uplinkConfig->initialUplinkBWP->pusch_Config) { + NR_PUSCH_Config_t *pusch_Config = uplinkConfig->initialUplinkBWP->pusch_Config->choice.setup; + if (pusch_Config->maxRank == NULL) { + pusch_Config->maxRank = calloc(1, sizeof(*pusch_Config->maxRank)); + } + *pusch_Config->maxRank = ul_max_layers; + } + if (uplinkConfig->pusch_ServingCellConfig == NULL) { + uplinkConfig->pusch_ServingCellConfig = calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig)); + uplinkConfig->pusch_ServingCellConfig->present = NR_SetupRelease_PUSCH_ServingCellConfig_PR_setup; + uplinkConfig->pusch_ServingCellConfig->choice.setup = calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig->choice.setup)); + uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1 = + calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1)); + uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers = + calloc(1, sizeof(*uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers)); + } + *uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers = ul_max_layers; + } + + long maxMIMO_Layers = uplinkConfig && uplinkConfig->pusch_ServingCellConfig + && uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1 + && uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers + ? *uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers + : 1; + + // UL and SRS configuration + if (configuration->do_SRS && uplinkConfig && uplinkConfig->initialUplinkBWP) { + if (!uplinkConfig->initialUplinkBWP->srs_Config) { + uplinkConfig->initialUplinkBWP->srs_Config = calloc(1, sizeof(*uplinkConfig->initialUplinkBWP->srs_Config)); + } + config_srs(scc, + SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config, + uecap, + curr_bwp, + uid, + 0, + maxMIMO_Layers, + configuration->do_SRS); + } + + // Set DL MCS table + NR_BWP_DownlinkDedicated_t *bwp_Dedicated = SpCellConfig->spCellConfigDedicated->initialDownlinkBWP; + set_dl_mcs_table(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing, + configuration->force_256qam_off ? NULL : uecap, + bwp_Dedicated, + scc); + struct NR_ServingCellConfig__downlinkBWP_ToAddModList *DL_BWP_list = + SpCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList; + struct NR_UplinkConfig__uplinkBWP_ToAddModList *UL_BWP_list = uplinkConfig->uplinkBWP_ToAddModList; + if (DL_BWP_list) { + for (int i = 0; i < DL_BWP_list->list.count; i++) { + NR_BWP_Downlink_t *bwp = DL_BWP_list->list.array[i]; + int scs = bwp->bwp_Common->genericParameters.subcarrierSpacing; + set_dl_mcs_table(scs, configuration->force_256qam_off ? NULL : uecap, bwp->bwp_Dedicated, scc); + } + } + if (configuration->do_SRS && UL_BWP_list) { + for (int i = 0; i < UL_BWP_list->list.count; i++) { + NR_BWP_Uplink_t *ul_bwp = UL_BWP_list->list.array[i]; + int bwp_size = NRRIV2BW(ul_bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + if (ul_bwp->bwp_Dedicated->pusch_Config) { + NR_PUSCH_Config_t *pusch_Config = ul_bwp->bwp_Dedicated->pusch_Config->choice.setup; + if (pusch_Config->maxRank == NULL) { + pusch_Config->maxRank = calloc(1, sizeof(*pusch_Config->maxRank)); + } + *pusch_Config->maxRank = ul_max_layers; + } + config_srs(scc, ul_bwp->bwp_Dedicated->srs_Config, uecap, bwp_size, uid, i + 1, maxMIMO_Layers, configuration->do_SRS); + } + } + update_cqitables(bwp_Dedicated->pdsch_Config, SpCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup); +} + +void free_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig) +{ + ASN_STRUCT_FREE(asn_DEF_NR_CellGroupConfig, cellGroupConfig); +} + +int encode_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, uint8_t *buffer, int max_buffer_size) +{ + asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig, NULL, cellGroupConfig, buffer, max_buffer_size); + AssertFatal(enc_rval.encoded > 0 && enc_rval.encoded <= max_buffer_size * 8, + "ASN1 message encoding failed (%s, %lu)!\n", + enc_rval.failed_type->name, + enc_rval.encoded); + return (enc_rval.encoded + 7) / 8; +} + +NR_CellGroupConfig_t *decode_cellGroupConfig(const uint8_t *buffer, int buffer_size) +{ + NR_CellGroupConfig_t *cellGroupConfig = NULL; + asn_dec_rval_t rval = uper_decode(NULL, &asn_DEF_NR_CellGroupConfig, (void **)&cellGroupConfig, buffer, buffer_size, 0, 0); + AssertFatal(rval.code == RC_OK, "could not decode cellGroupConfig\n"); + return cellGroupConfig; +} + +/* TODO: this should disappear */ +static void fix_servingcellconfigdedicated(NR_ServingCellConfig_t *scd) +{ + int b = 0; + while (b < scd->downlinkBWP_ToAddModList->list.count) { + if (scd->downlinkBWP_ToAddModList->list.array[b]->bwp_Common->genericParameters.locationAndBandwidth == 0) { + asn_sequence_del(&scd->downlinkBWP_ToAddModList->list, b, 1); + } else { + b++; + } + } + + if (scd->downlinkBWP_ToAddModList->list.count == 0) { + free(scd->downlinkBWP_ToAddModList); + scd->downlinkBWP_ToAddModList = NULL; + } + + b = 0; + while (b < scd->uplinkConfig->uplinkBWP_ToAddModList->list.count) { + if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[b]->bwp_Common->genericParameters.locationAndBandwidth == 0) { + asn_sequence_del(&scd->uplinkConfig->uplinkBWP_ToAddModList->list, b, 1); + } else { + b++; + } + } + + if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.count == 0) { + free(scd->uplinkConfig->uplinkBWP_ToAddModList); + scd->uplinkConfig->uplinkBWP_ToAddModList = NULL; + } +} + +NR_CellGroupConfig_t *get_default_secondaryCellGroup(const NR_ServingCellConfigCommon_t *servingcellconfigcommon, + NR_ServingCellConfig_t *servingcellconfigdedicated, + const NR_UE_NR_Capability_t *uecap, + int scg_id, + int servCellIndex, + const gNB_RrcConfigurationReq *configuration, + int uid) +{ + const rrc_pdsch_AntennaPorts_t *pdschap = &configuration->pdsch_AntennaPorts; + const int dl_antenna_ports = pdschap->N1 * pdschap->N2 * pdschap->XP; + const int do_csirs = configuration->do_CSIRS; + + AssertFatal(servingcellconfigcommon != NULL, "servingcellconfigcommon is null\n"); + + if (uecap == NULL) + LOG_E(RRC, "No UE Capabilities available when programming default CellGroup in NSA\n"); + + // This assert will never happen in the current implementation because NUMBER_OF_UE_MAX = 4. + // However, if in the future NUMBER_OF_UE_MAX is increased, it will be necessary to improve the allocation of SRS resources, + // where the startPosition = 2 or 3 and sl160 = 17, 17, 27 ... 157 only give us 30 different allocations. + AssertFatal(uid >= 0 && uid < 30, "gNB cannot allocate the SRS resources\n"); + + uint64_t bitmap = get_ssb_bitmap(servingcellconfigcommon); + // See comment at the end of this function regarding ServingCellConfig + fix_servingcellconfigdedicated(servingcellconfigdedicated); + + NR_CellGroupConfig_t *secondaryCellGroup = calloc(1, sizeof(*secondaryCellGroup)); + secondaryCellGroup->cellGroupId = scg_id; + /* LCID is 4 because the RLC layer requires it to be 3+rb_id; the rb_id is 1 + * for first RB. We pre-configure RLC UM Bi-directional, priority is 1 */ + NR_RLC_BearerConfig_t *RLC_BearerConfig = get_DRB_RLC_BearerConfig(4, 1, NR_RLC_Config_PR_um_Bi_Directional, 1); + + secondaryCellGroup->rlc_BearerToAddModList = calloc(1, sizeof(*secondaryCellGroup->rlc_BearerToAddModList)); + asn1cSeqAdd(&secondaryCellGroup->rlc_BearerToAddModList->list, RLC_BearerConfig); + + secondaryCellGroup->mac_CellGroupConfig = configure_mac_cellgroup(); + + secondaryCellGroup->physicalCellGroupConfig = calloc(1, sizeof(*secondaryCellGroup->physicalCellGroupConfig)); + secondaryCellGroup->physicalCellGroupConfig->harq_ACK_SpatialBundlingPUCCH = NULL; + secondaryCellGroup->physicalCellGroupConfig->harq_ACK_SpatialBundlingPUSCH = NULL; + secondaryCellGroup->physicalCellGroupConfig->p_NR_FR1 = NULL; + secondaryCellGroup->physicalCellGroupConfig->pdsch_HARQ_ACK_Codebook = + NR_PhysicalCellGroupConfig__pdsch_HARQ_ACK_Codebook_dynamic; + secondaryCellGroup->physicalCellGroupConfig->tpc_SRS_RNTI = NULL; + secondaryCellGroup->physicalCellGroupConfig->tpc_PUCCH_RNTI = NULL; + secondaryCellGroup->physicalCellGroupConfig->tpc_PUSCH_RNTI = NULL; + secondaryCellGroup->physicalCellGroupConfig->sp_CSI_RNTI = NULL; + secondaryCellGroup->physicalCellGroupConfig->cs_RNTI = NULL; + secondaryCellGroup->physicalCellGroupConfig->ext1 = NULL; + secondaryCellGroup->spCellConfig = calloc(1, sizeof(*secondaryCellGroup->spCellConfig)); + secondaryCellGroup->spCellConfig->servCellIndex = calloc(1, sizeof(*secondaryCellGroup->spCellConfig->servCellIndex)); + *secondaryCellGroup->spCellConfig->servCellIndex = servCellIndex; + secondaryCellGroup->spCellConfig->reconfigurationWithSync = + calloc(1, sizeof(*secondaryCellGroup->spCellConfig->reconfigurationWithSync)); + + NR_ReconfigurationWithSync_t *reconfigurationWithSync = secondaryCellGroup->spCellConfig->reconfigurationWithSync; + reconfigurationWithSync->spCellConfigCommon = + (NR_ServingCellConfigCommon_t *)servingcellconfigcommon; + reconfigurationWithSync->newUE_Identity = + (get_softmodem_params()->phy_test == 1) ? 0x1234 : (taus() & 0xffff); + reconfigurationWithSync->t304 = NR_ReconfigurationWithSync__t304_ms2000; + reconfigurationWithSync->rach_ConfigDedicated = NULL; + reconfigurationWithSync->ext1 = NULL; + + // For 2-step contention-free random access procedure + reconfigurationWithSync->rach_ConfigDedicated = calloc(1, sizeof(*reconfigurationWithSync->rach_ConfigDedicated)); + reconfigurationWithSync->rach_ConfigDedicated->present = NR_ReconfigurationWithSync__rach_ConfigDedicated_PR_uplink; + reconfigurationWithSync->rach_ConfigDedicated->choice.uplink = calloc(1, sizeof(struct NR_RACH_ConfigDedicated)); + reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra = calloc(1, sizeof(struct NR_CFRA)); + reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->ra_Prioritization = NULL; + reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions = calloc(1, sizeof(struct NR_CFRA__occasions)); + memcpy(&reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions->rach_ConfigGeneric, + &servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric, + sizeof(NR_RACH_ConfigGeneric_t)); + asn1cCallocOne(reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions->ssb_perRACH_Occasion, + NR_CFRA__occasions__ssb_perRACH_Occasion_one); + reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.present = NR_CFRA__resources_PR_ssb; + reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb = + calloc(1, sizeof(struct NR_CFRA__resources__ssb)); + reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ra_ssb_OccasionMaskIndex = 0; + + int n_ssb = 0; + struct NR_CFRA_SSB_Resource *ssbElem[64]; + for (int i = 0; i < 64; i++) { + if ((bitmap >> (63 - i)) & 0x01) { + ssbElem[n_ssb] = calloc(1, sizeof(struct NR_CFRA_SSB_Resource)); + ssbElem[n_ssb]->ssb = i; + ssbElem[n_ssb]->ra_PreambleIndex = 63 - (uid % 64); + asn1cSeqAdd(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources + .choice.ssb->ssb_ResourceList.list, + ssbElem[n_ssb]); + n_ssb++; + } + } + + secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->ext1 = NULL; + + secondaryCellGroup->spCellConfig->rlf_TimersAndConstants = + calloc(1, sizeof(*secondaryCellGroup->spCellConfig->rlf_TimersAndConstants)); + secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->present = NR_SetupRelease_RLF_TimersAndConstants_PR_setup; + secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup = + calloc(1, sizeof(*secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup)); + secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->t310 = NR_RLF_TimersAndConstants__t310_ms4000; + secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->n310 = NR_RLF_TimersAndConstants__n310_n20; + secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->n311 = NR_RLF_TimersAndConstants__n311_n1; + secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1 = + calloc(1, sizeof(*secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1)); + secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1->t311 = + NR_RLF_TimersAndConstants__ext1__t311_ms30000; + secondaryCellGroup->spCellConfig->rlmInSyncOutOfSyncThreshold = NULL; + + secondaryCellGroup->spCellConfig->spCellConfigDedicated = + calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated)); + secondaryCellGroup->spCellConfig->spCellConfigDedicated->tdd_UL_DL_ConfigurationDedicated = NULL; + + /// initialDownlinkBWP + + secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP = + calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP)); + secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdcch_Config = NULL; + secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config = + config_pdsch(bitmap, 0, dl_antenna_ports); + secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->sps_Config = + NULL; // calloc(1,sizeof(struct NR_SetupRelease_SPS_Config)); + + secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->radioLinkMonitoringConfig = NULL; + + /// initialUplinkBWP + if (!secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig) { + secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig = + calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig)); + } + + NR_BWP_UplinkDedicated_t *initialUplinkBWP = calloc(1, sizeof(*initialUplinkBWP)); + secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP = initialUplinkBWP; + initialUplinkBWP->pucch_Config = NULL; + + NR_PUSCH_Config_t *pusch_Config = NULL; + if (servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList) { + pusch_Config = + servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup; + } + initialUplinkBWP->pusch_Config = config_pusch(pusch_Config); + + long maxMIMO_Layers = + servingcellconfigdedicated->uplinkConfig && servingcellconfigdedicated->uplinkConfig->pusch_ServingCellConfig + && servingcellconfigdedicated->uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1 + && servingcellconfigdedicated->uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers + ? *servingcellconfigdedicated->uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers + : 1; + + int curr_bwp = NRRIV2BW(servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, + MAX_BWP_SIZE); + initialUplinkBWP->srs_Config = calloc(1, sizeof(*initialUplinkBWP->srs_Config)); + config_srs(servingcellconfigcommon, initialUplinkBWP->srs_Config, NULL, curr_bwp, uid, 0, maxMIMO_Layers, configuration->do_SRS); + + // Downlink BWPs + int n_dl_bwp = 1; + if (servingcellconfigdedicated && servingcellconfigdedicated->downlinkBWP_ToAddModList) { + n_dl_bwp = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.count; + } + if (n_dl_bwp > 0) { + secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList = + calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList)); + for (int bwp_loop = 0; bwp_loop < n_dl_bwp; bwp_loop++) { + NR_BWP_Downlink_t *bwp = calloc(1, sizeof(*bwp)); + config_downlinkBWP(bwp, + servingcellconfigcommon, + servingcellconfigdedicated, + uecap, + dl_antenna_ports, + configuration->force_256qam_off, + bwp_loop, + false); + asn1cSeqAdd(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list, bwp); + } + secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = + calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id)); + *secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = + servingcellconfigdedicated->firstActiveDownlinkBWP_Id ? *servingcellconfigdedicated->firstActiveDownlinkBWP_Id : 1; + secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = + calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id)); + *secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = + servingcellconfigdedicated->defaultDownlinkBWP_Id ? *servingcellconfigdedicated->defaultDownlinkBWP_Id : 1; + } + + // Uplink BWPs + int n_ul_bwp = 1; + if (servingcellconfigdedicated && servingcellconfigdedicated->uplinkConfig + && servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList) { + n_ul_bwp = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count; + } + if (n_ul_bwp > 0) { + secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList = + calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList)); + for (int bwp_loop = 0; bwp_loop < n_ul_bwp; bwp_loop++) { + NR_BWP_Uplink_t *ubwp = calloc(1, sizeof(*ubwp)); + config_uplinkBWP(ubwp, bwp_loop, false, uid, configuration, servingcellconfigdedicated, servingcellconfigcommon, uecap); + asn1cSeqAdd(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list, ubwp); + } + secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = + calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id)); + *secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = + servingcellconfigdedicated->uplinkConfig->firstActiveUplinkBWP_Id + ? *servingcellconfigdedicated->uplinkConfig->firstActiveUplinkBWP_Id + : 1; + } + + secondaryCellGroup->spCellConfig->spCellConfigDedicated->bwp_InactivityTimer = NULL; + secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToReleaseList = NULL; + secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToReleaseList = NULL; + + secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig = + calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig)); + NR_PUSCH_ServingCellConfig_t *pusch_scc = calloc(1, sizeof(*pusch_scc)); + secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig->present = + NR_SetupRelease_PUSCH_ServingCellConfig_PR_setup; + secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig->choice.setup = pusch_scc; + pusch_scc->codeBlockGroupTransmission = NULL; + pusch_scc->rateMatching = NULL; + pusch_scc->xOverhead = NULL; + pusch_scc->ext1 = calloc(1, sizeof(*pusch_scc->ext1)); + pusch_scc->ext1->maxMIMO_Layers = calloc(1, sizeof(*pusch_scc->ext1->maxMIMO_Layers)); + *pusch_scc->ext1->maxMIMO_Layers = 1; + pusch_scc->ext1->processingType2Enabled = NULL; + + secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->carrierSwitching = NULL; + secondaryCellGroup->spCellConfig->spCellConfigDedicated->supplementaryUplink = NULL; + secondaryCellGroup->spCellConfig->spCellConfigDedicated->pdcch_ServingCellConfig = NULL; + + secondaryCellGroup->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig = + calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig)); + NR_PDSCH_ServingCellConfig_t *pdsch_servingcellconfig = calloc(1, sizeof(*pdsch_servingcellconfig)); + secondaryCellGroup->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->present = + NR_SetupRelease_PDSCH_ServingCellConfig_PR_setup; + secondaryCellGroup->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup = pdsch_servingcellconfig; + pdsch_servingcellconfig->codeBlockGroupTransmission = NULL; + pdsch_servingcellconfig->xOverhead = NULL; + pdsch_servingcellconfig->nrofHARQ_ProcessesForPDSCH = calloc(1, sizeof(*pdsch_servingcellconfig->nrofHARQ_ProcessesForPDSCH)); + *pdsch_servingcellconfig->nrofHARQ_ProcessesForPDSCH = NR_PDSCH_ServingCellConfig__nrofHARQ_ProcessesForPDSCH_n16; + pdsch_servingcellconfig->pucch_Cell = NULL; + pdsch_servingcellconfig->ext1 = calloc(1, sizeof(*pdsch_servingcellconfig->ext1)); + pdsch_servingcellconfig->ext1->maxMIMO_Layers = calloc(1, sizeof(*pdsch_servingcellconfig->ext1->maxMIMO_Layers)); + *pdsch_servingcellconfig->ext1->maxMIMO_Layers = NR_MAX_SUPPORTED_DL_LAYERS; + pdsch_servingcellconfig->ext1->processingType2Enabled = NULL; + + secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig = NULL; + secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig = + calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig)); + secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->present = NR_SetupRelease_CSI_MeasConfig_PR_setup; + + NR_CSI_MeasConfig_t *csi_MeasConfig = calloc(1, sizeof(*csi_MeasConfig)); + secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup = csi_MeasConfig; + + csi_MeasConfig->csi_ResourceConfigToAddModList = calloc(1, sizeof(*csi_MeasConfig->csi_ResourceConfigToAddModList)); + csi_MeasConfig->csi_ResourceConfigToReleaseList = NULL; + + csi_MeasConfig->csi_SSB_ResourceSetToAddModList = calloc(1, sizeof(*csi_MeasConfig->csi_SSB_ResourceSetToAddModList)); + csi_MeasConfig->csi_SSB_ResourceSetToReleaseList = NULL; + + csi_MeasConfig->csi_ReportConfigToAddModList = calloc(1, sizeof(*csi_MeasConfig->csi_ReportConfigToAddModList)); + csi_MeasConfig->csi_ReportConfigToReleaseList = NULL; + + NR_CSI_SSB_ResourceSet_t *ssbresset0 = calloc(1, sizeof(*ssbresset0)); + ssbresset0->csi_SSB_ResourceSetId = 0; + + for (int i = 0; i < 64; i++) { + if ((bitmap >> (63 - i)) & 0x01) { + NR_SSB_Index_t *ssbres = NULL; + asn1cCallocOne(ssbres, i); + asn1cSeqAdd(&ssbresset0->csi_SSB_ResourceList.list, ssbres); + } + } + asn1cSeqAdd(&csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list, ssbresset0); + + for (int bwp_loop = 0; bwp_loop < n_dl_bwp; bwp_loop++) { + NR_BWP_Downlink_t *bwp = + secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]; + int curr_bwp = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + + config_csirs(servingcellconfigcommon, csi_MeasConfig, uid, dl_antenna_ports, curr_bwp, do_csirs, bwp_loop); + config_csiim(do_csirs, dl_antenna_ports, curr_bwp, csi_MeasConfig, bwp_loop); + + if (do_csirs) { + NR_CSI_ResourceConfig_t *csires = calloc(1, sizeof(*csires)); + csires->csi_ResourceConfigId = bwp->bwp_Id; + csires->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB; + csires->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB = + calloc(1, sizeof(*csires->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB)); + csires->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList = + calloc(1, sizeof(*csires->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList)); + NR_NZP_CSI_RS_ResourceSetId_t *nzp0 = calloc(1, sizeof(*nzp0)); + *nzp0 = bwp_loop; + asn1cSeqAdd(&csires->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list, nzp0); + csires->bwp_Id = bwp->bwp_Id; + csires->resourceType = NR_CSI_ResourceConfig__resourceType_periodic; + asn1cSeqAdd(&csi_MeasConfig->csi_ResourceConfigToAddModList->list, csires); + } + if (do_csirs && dl_antenna_ports > 1) { + NR_CSI_ResourceConfig_t *csiresim = calloc(1, sizeof(*csiresim)); + csiresim->csi_ResourceConfigId = bwp->bwp_Id + 10; + csiresim->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_csi_IM_ResourceSetList; + csiresim->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList = + calloc(1, sizeof(*csiresim->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList)); + NR_CSI_IM_ResourceSetId_t *csiim00 = calloc(1, sizeof(*csiim00)); + *csiim00 = bwp_loop; + asn1cSeqAdd(&csiresim->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList->list, csiim00); + csiresim->bwp_Id = bwp->bwp_Id; + csiresim->resourceType = NR_CSI_ResourceConfig__resourceType_periodic; + asn1cSeqAdd(&csi_MeasConfig->csi_ResourceConfigToAddModList->list, csiresim); + } + NR_CSI_ResourceConfig_t *ssbres = calloc(1, sizeof(*ssbres)); + ssbres->csi_ResourceConfigId = bwp->bwp_Id + 20; + ssbres->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB; + ssbres->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB = calloc(1, sizeof(*ssbres->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB)); + ssbres->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList = + calloc(1, sizeof(*ssbres->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList)); + NR_CSI_SSB_ResourceSetId_t *ssbres00 = calloc(1, sizeof(*ssbres00)); + *ssbres00 = 0; + asn1cSeqAdd(&ssbres->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list, ssbres00); + ssbres->bwp_Id = bwp->bwp_Id; + ssbres->resourceType = NR_CSI_ResourceConfig__resourceType_periodic; + asn1cSeqAdd(&csi_MeasConfig->csi_ResourceConfigToAddModList->list, ssbres); + + NR_PUCCH_CSI_Resource_t *pucchcsires1 = calloc(1, sizeof(*pucchcsires1)); + pucchcsires1->uplinkBandwidthPartId = bwp->bwp_Id; + pucchcsires1->pucch_Resource = 2; + + config_csi_meas_report(csi_MeasConfig, + servingcellconfigcommon, + pucchcsires1, + bwp->bwp_Dedicated->pdsch_Config, + pdschap, + NR_MAX_SUPPORTED_DL_LAYERS, + bwp->bwp_Id, + uid); + config_rsrp_meas_report(csi_MeasConfig, servingcellconfigcommon, pucchcsires1, do_csirs, bwp->bwp_Id + 10, uid); + } + secondaryCellGroup->spCellConfig->spCellConfigDedicated->sCellDeactivationTimer = NULL; + secondaryCellGroup->spCellConfig->spCellConfigDedicated->crossCarrierSchedulingConfig = NULL; + secondaryCellGroup->spCellConfig->spCellConfigDedicated->tag_Id = 0; + secondaryCellGroup->spCellConfig->spCellConfigDedicated->dummy1 = NULL; + secondaryCellGroup->spCellConfig->spCellConfigDedicated->pathlossReferenceLinking = NULL; + secondaryCellGroup->spCellConfig->spCellConfigDedicated->servingCellMO = NULL; + + // this is pure evil: We should only pass in a ServingCellConfig, without + // modifying it! TODO: make a separate function that creates a + // ServingCellConfig, and reuse it here + *servingcellconfigdedicated = *secondaryCellGroup->spCellConfig->spCellConfigDedicated; + + if (LOG_DEBUGFLAG(DEBUG_ASN1)) { + xer_fprint(stdout, &asn_DEF_NR_SpCellConfig, (void *)secondaryCellGroup->spCellConfig); + } + return secondaryCellGroup; +} diff --git a/openair2/RRC/NR/nr_rrc_config.h b/openair2/RRC/NR/nr_rrc_config.h index b64f953814..bf8a22a9e7 100644 --- a/openair2/RRC/NR/nr_rrc_config.h +++ b/openair2/RRC/NR/nr_rrc_config.h @@ -34,77 +34,51 @@ #include "nr_rrc_defs.h" #include "openair2/RRC/NR/MESSAGES/asn1_msg.h" -void set_phr_config(NR_MAC_CellGroupConfig_t *mac_CellGroupConfig); -uint64_t get_ssb_bitmap(const NR_ServingCellConfigCommon_t *scc); -void rrc_coreset_config(NR_ControlResourceSet_t *coreset, - int bwp_id, - int curr_bwp, - uint64_t ssb_bitmap); -NR_SearchSpace_t *rrc_searchspace_config(bool is_common, - int searchspaceid, - int coresetid); void nr_rrc_config_dl_tda(struct NR_PDSCH_TimeDomainResourceAllocationList *pdsch_TimeDomainAllocationList, frame_type_t frame_type, NR_TDD_UL_DL_ConfigCommon_t *tdd_UL_DL_ConfigurationCommon, int curr_bwp); void nr_rrc_config_ul_tda(NR_ServingCellConfigCommon_t *scc, int min_fb_delay); -void config_pucch_resset0(NR_PUCCH_Config_t *pucch_Config, int uid, int curr_bwp, NR_UE_NR_Capability_t *uecap); -void config_pucch_resset1(NR_PUCCH_Config_t *pucch_Config, NR_UE_NR_Capability_t *uecap); -void set_dl_DataToUL_ACK(NR_PUCCH_Config_t *pucch_Config, int min_feedback_time, NR_SubcarrierSpacing_t subcarrierSpacing); -void set_pucch_power_config(NR_PUCCH_Config_t *pucch_Config, int do_csirs); -void scheduling_request_config(const NR_ServingCellConfigCommon_t *scc, - NR_PUCCH_Config_t *pucch_Config, - int scs); -void config_rsrp_meas_report(NR_CSI_MeasConfig_t *csi_MeasConfig, const NR_ServingCellConfigCommon_t *servingcellconfigcommon, NR_PUCCH_CSI_Resource_t *pucchcsires, int do_csi, int rep_id, int uid); -void config_csi_meas_report(NR_CSI_MeasConfig_t *csi_MeasConfig, - const NR_ServingCellConfigCommon_t *servingcellconfigcommon, - NR_PUCCH_CSI_Resource_t *pucchcsires, - struct NR_SetupRelease_PDSCH_Config *pdsch_Config, - const rrc_pdsch_AntennaPorts_t *antennaports, - const int max_layers, - int rep_id, - int uid); -void config_csirs(const NR_ServingCellConfigCommon_t *servingcellconfigcommon, - NR_CSI_MeasConfig_t *csi_MeasConfig, - int uid, - int num_dl_antenna_ports, - int curr_bwp, - int do_csirs, - int id); -void config_csiim(int do_csirs, int dl_antenna_ports, int curr_bwp, - NR_CSI_MeasConfig_t *csi_MeasConfig, int id); -void config_srs(const NR_ServingCellConfigCommon_t *scc, - NR_SetupRelease_SRS_Config_t *setup_release_srs_Config, - const NR_UE_NR_Capability_t *uecap, - const int curr_bwp, - const int uid, - const int res_id, - const long maxMIMO_Layers, - const int do_srs); -struct NR_SetupRelease_PDSCH_Config *config_pdsch(uint64_t ssb_bitmap, int bwp_Id, int dl_antenna_ports); -void set_dl_mcs_table(int scs, - NR_UE_NR_Capability_t *cap, - NR_BWP_DownlinkDedicated_t *bwp_Dedicated, - const NR_ServingCellConfigCommon_t *scc); + void prepare_sim_uecap(NR_UE_NR_Capability_t *cap, NR_ServingCellConfigCommon_t *scc, int numerology, int rbsize, int mcs_table); -struct NR_SetupRelease_PUSCH_Config *config_pusch(NR_PUSCH_Config_t *pusch_Config); -void config_downlinkBWP(NR_BWP_Downlink_t *bwp, - const NR_ServingCellConfigCommon_t *scc, - const NR_ServingCellConfig_t *servingcellconfigdedicated, - NR_UE_NR_Capability_t *uecap, - int dl_antenna_ports, - bool force_256qam_off, - int bwp_loop, bool is_SA); -void config_uplinkBWP(NR_BWP_Uplink_t *ubwp, - long bwp_loop, bool is_SA, int uid, - const gNB_RrcConfigurationReq *configuration, - const NR_ServingCellConfig_t *servingcellconfigdedicated, - const NR_ServingCellConfigCommon_t *scc, - NR_UE_NR_Capability_t *uecap); -NR_MAC_CellGroupConfig_t *configure_mac_cellgroup(void); + + +NR_BCCH_BCH_Message_t *get_new_MIB_NR(const NR_ServingCellConfigCommon_t *scc); +void free_MIB_NR(NR_BCCH_BCH_Message_t *mib); +int encode_MIB_NR(NR_BCCH_BCH_Message_t *mib, int frame, uint8_t *buf, int buf_size); + + +#define NR_MAX_SIB_LENGTH 2976 // 3GPP TS 38.331 section 5.2.1 +NR_BCCH_DL_SCH_Message_t *get_SIB1_NR(const gNB_RrcConfigurationReq *configuration); +void free_SIB1_NR(NR_BCCH_DL_SCH_Message_t *sib1); +int encode_SIB1_NR(NR_BCCH_DL_SCH_Message_t *sib1, uint8_t *buffer, int max_buffer_size); + +NR_CellGroupConfig_t *get_initial_cellGroupConfig(int uid, + const NR_ServingCellConfigCommon_t *scc, + const NR_ServingCellConfig_t *servingcellconfigdedicated, + const gNB_RrcConfigurationReq *configuration); +void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, + const int uid, + NR_UE_NR_Capability_t *uecap, + const gNB_RrcConfigurationReq *configuration); +void free_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig); +int encode_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, uint8_t *buffer, int max_buffer_size); +NR_CellGroupConfig_t *decode_cellGroupConfig(const uint8_t *buffer, int max_buffer_size); + +/* Note: this function returns a new CellGroupConfig for a user with given + * configuration, but it will also overwrite the ServingCellConfig passed in + * parameter servingcellconfigdedicated! */ +NR_CellGroupConfig_t *get_default_secondaryCellGroup(const NR_ServingCellConfigCommon_t *servingcellconfigcommon, + NR_ServingCellConfig_t *servingcellconfigdedicated, + const NR_UE_NR_Capability_t *uecap, + int scg_id, + int servCellIndex, + const gNB_RrcConfigurationReq *configuration, + int uid); + #endif diff --git a/openair2/RRC/NR/nr_rrc_defs.h b/openair2/RRC/NR/nr_rrc_defs.h index f8d69e942a..93acdeac7b 100644 --- a/openair2/RRC/NR/nr_rrc_defs.h +++ b/openair2/RRC/NR/nr_rrc_defs.h @@ -442,32 +442,22 @@ typedef struct rrc_gNB_ue_context_s { typedef struct { - // buffer that contains the encoded messages - uint8_t *MIB; - uint8_t sizeof_MIB; - uint8_t *SIB1; uint16_t sizeof_SIB1; uint8_t *SIB23; uint8_t sizeof_SIB23; - uint8_t *ServingCellConfigCommon; - uint8_t sizeof_servingcellconfigcommon; - int physCellId; - NR_BCCH_BCH_Message_t mib; - NR_BCCH_BCH_Message_t *mib_DU; + NR_BCCH_BCH_Message_t *mib; NR_SIB1_t *siblock1_DU; - //NR_BCCH_DL_SCH_Message_t *siblock1_DU; NR_SIB1_t *sib1; NR_SIB2_t *sib2; NR_SIB3_t *sib3; NR_BCCH_DL_SCH_Message_t systemInformation; // SIB23 NR_BCCH_DL_SCH_Message_t *siblock1; NR_ServingCellConfigCommon_t *servingcellconfigcommon; - NR_ServingCellConfig_t *servingcellconfig; NR_CellGroupConfig_t *secondaryCellGroup[MAX_NR_RRC_UE_CONTEXTS]; int p_gNB; diff --git a/openair2/RRC/NR/nr_rrc_extern.h b/openair2/RRC/NR/nr_rrc_extern.h index 34041b8a88..3cbda2e802 100644 --- a/openair2/RRC/NR/nr_rrc_extern.h +++ b/openair2/RRC/NR/nr_rrc_extern.h @@ -35,8 +35,6 @@ #include "LAYER2/RLC/rlc.h" #include "openair2/RRC/common.h" -#define NR_MAX_SIB_LENGTH 2976 // 3GPP TS 38.331 section 5.2.1 - The physical layer imposes a limit to the maximum size a SIB can take. The maximum SIB1 or SI message size is 2976 bits. - extern UE_RRC_INST *UE_rrc_inst; extern uint8_t DRB2LCHAN[8]; diff --git a/openair2/RRC/NR/nr_rrc_proto.h b/openair2/RRC/NR/nr_rrc_proto.h index b54165b13f..6497874ab6 100644 --- a/openair2/RRC/NR/nr_rrc_proto.h +++ b/openair2/RRC/NR/nr_rrc_proto.h @@ -42,6 +42,7 @@ #include "NR_CG-Config.h" #include "NR_CG-ConfigInfo.h" #include "NR_SecurityConfig.h" +#include "NR_CellGroupConfig.h" #define NR_MAX_SUPPORTED_DL_LAYERS 2 void rrc_init_nr_srb_param(NR_LCHAN_DESC *chan); @@ -72,15 +73,6 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *ue_context_p, x2a void rrc_remove_nsa_user(gNB_RRC_INST *rrc, int rnti); -void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellconfigcommon, - NR_ServingCellConfig_t *servingcellconfigdedicated, - NR_CellGroupConfig_t *secondaryCellGroup, - NR_UE_NR_Capability_t *uecap, - int scg_id, - int servCellIndex, - const gNB_RrcConfigurationReq *configuration, - int uid); - void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon, NR_ServingCellConfig_t *servingcellconfigdedicated, NR_RRCReconfiguration_IEs_t *reconfig, @@ -89,11 +81,6 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon const gNB_RrcConfigurationReq *configuration, int uid); -void fill_default_rbconfig(NR_RadioBearerConfig_t *rbconfig, - int eps_bearer_id, int rb_id, - e_NR_CipheringAlgorithm ciphering_algorithm, - e_NR_SecurityConfig__keyToUse key_to_use); - int generate_CG_Config(gNB_RRC_INST *rrc, NR_CG_Config_t *cg_Config, NR_RRCReconfiguration_t *reconfig, @@ -136,9 +123,8 @@ void nr_rrc_trigger(protocol_ctxt_t *ctxt, int CC_id, int frame, int subframe); \ *reOffset Pointer to RE Offset Value */ void rrc_config_dl_ptrs_params(NR_BWP_Downlink_t *bwp, int *ptrsNrb, int *ptrsMcs, int *epre_Ratio, int * reOffset); -int -nr_rrc_mac_remove_ue(module_id_t mod_idP, - rnti_t rntiP); +void nr_rrc_mac_remove_ue(rnti_t rntiP); +void nr_rrc_mac_update_cellgroup(rnti_t rntiMaybeUEid, NR_CellGroupConfig_t *cgc); int8_t nr_mac_rrc_bwp_switch_req(const module_id_t module_idP, const frame_t frameP, diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index f9447fc57a..a3dd0891f5 100644 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -92,7 +92,6 @@ #include #include #include -#include "LAYER2/nr_rlc/nr_rlc_oai_api.h" #include "openair2/LAYER2/nr_pdcp/nr_pdcp_e1_api.h" #include "openair2/F1AP/f1ap_common.h" #include "openair2/SDAP/nr_sdap/nr_sdap_entity.h" @@ -178,13 +177,16 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration { LOG_D(RRC,"%s()\n\n\n\n",__FUNCTION__); - if (NODE_IS_DU(rrc->node_type) || NODE_IS_MONOLITHIC(rrc->node_type)) { - rrc->carrier.MIB = (uint8_t *) malloc16(4); - rrc->carrier.sizeof_MIB = do_MIB_NR(rrc,0); - } + if (NODE_IS_DU(rrc->node_type) || NODE_IS_MONOLITHIC(rrc->node_type)) + rrc->carrier.mib = get_new_MIB_NR(rrc->carrier.servingcellconfigcommon); if((get_softmodem_params()->sa) && ( (NODE_IS_DU(rrc->node_type) || NODE_IS_MONOLITHIC(rrc->node_type)))) { - rrc->carrier.sizeof_SIB1 = do_SIB1_NR(&rrc->carrier,configuration); + NR_BCCH_DL_SCH_Message_t *sib1 = get_SIB1_NR(configuration); + rrc->carrier.SIB1 = calloc(NR_MAX_SIB_LENGTH / 8, sizeof(*rrc->carrier.SIB1)); + AssertFatal(rrc->carrier.SIB1 != NULL, "out of memory\n"); + rrc->carrier.sizeof_SIB1 = encode_SIB1_NR(sib1, rrc->carrier.SIB1, NR_MAX_SIB_LENGTH / 8); + rrc->carrier.siblock1 = sib1; + nr_mac_config_sib1(RC.nrmac[rrc->module_id], sib1); } if (!NODE_IS_DU(rrc->node_type)) { @@ -205,9 +207,7 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration rrc->configuration.sib1_tda, rrc->configuration.minRXTXTIME, rrc->carrier.servingcellconfigcommon); - nr_mac_config_mib(RC.nrmac[rrc->module_id], &rrc->carrier.mib); - if (get_softmodem_params()->sa) - nr_mac_config_sib1(RC.nrmac[rrc->module_id], rrc->carrier.siblock1); + nr_mac_config_mib(RC.nrmac[rrc->module_id], rrc->carrier.mib); } /* set flag to indicate that cell information is configured. This is required @@ -271,7 +271,6 @@ static void openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_Rrc RB_INIT(&rrc->rrc_ue_head); rrc->configuration = *configuration; rrc->carrier.servingcellconfigcommon = configuration->scc; - rrc->carrier.servingcellconfig = configuration->scd; nr_rrc_config_ul_tda(configuration->scc,configuration->minRXTXTIME); /// System Information INIT pthread_mutex_init(&rrc->cell_info_mutex,NULL); @@ -322,7 +321,7 @@ unsigned int rrc_gNB_get_next_transaction_identifier(module_id_t gnb_mod_idP) static void apply_macrlc_config(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *const ue_context_pP, const protocol_ctxt_t *const ctxt_pP) { NR_CellGroupConfig_t *cgc = get_softmodem_params()->sa ? ue_context_pP->ue_context.masterCellGroup : NULL; - nr_mac_update_cellgroup(RC.nrmac[rrc->module_id], ue_context_pP->ue_context.rnti, cgc); + nr_rrc_mac_update_cellgroup(ue_context_pP->ue_context.rnti, cgc); nr_rrc_addmod_srbs(ctxt_pP->rntiMaybeUEid, ue_context_pP->ue_context.SRB_configList, cgc->rlc_BearerToAddModList); nr_rrc_addmod_drbs(ctxt_pP->rntiMaybeUEid, ue_context_pP->ue_context.DRB_configList, cgc->rlc_BearerToAddModList); @@ -330,7 +329,7 @@ static void apply_macrlc_config(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *const u void apply_macrlc_config_reest(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *const ue_context_pP, const protocol_ctxt_t *const ctxt_pP, ue_id_t ue_id) { - nr_mac_update_cellgroup(RC.nrmac[rrc->module_id], ue_id, ue_context_pP->ue_context.masterCellGroup); + nr_rrc_mac_update_cellgroup(ue_id, ue_context_pP->ue_context.masterCellGroup); nr_rrc_addmod_srbs(ctxt_pP->rntiMaybeUEid, ue_context_pP->ue_context.SRB_configList, @@ -342,8 +341,7 @@ static void rrc_gNB_generate_RRCSetup(instance_t instance, rnti_t rnti, rrc_gNB_ue_context_t *const ue_context_pP, const uint8_t *masterCellGroup, - int masterCellGroup_len, - NR_ServingCellConfigCommon_t *scc) + int masterCellGroup_len) //----------------------------------------------------------------------------- { LOG_I(NR_RRC, "rrc_gNB_generate_RRCSetup for RNTI %04x\n", rnti); @@ -351,8 +349,7 @@ static void rrc_gNB_generate_RRCSetup(instance_t instance, gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context; gNB_RRC_INST *rrc = RC.nrrrc[instance]; unsigned char buf[1024]; - const NR_ServingCellConfig_t *sccd = rrc->configuration.scd; - int size = do_RRCSetup(ue_context_pP, buf, rrc_gNB_get_next_transaction_identifier(instance), masterCellGroup, masterCellGroup_len, scc, sccd, &rrc->configuration); + int size = do_RRCSetup(ue_context_pP, buf, rrc_gNB_get_next_transaction_identifier(instance), masterCellGroup, masterCellGroup_len, &rrc->configuration); AssertFatal(size > 0, "do_RRCSetup failed\n"); AssertFatal(size <= 1024, "memory corruption\n"); @@ -386,14 +383,12 @@ static void rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(module_id_t LOG_I(NR_RRC, "generate RRCSetup for RRCReestablishmentRequest \n"); rrc_gNB_ue_context_t *ue_context_pP = NULL; gNB_RRC_INST *rrc_instance_p = RC.nrrrc[module_id]; - const NR_ServingCellConfigCommon_t *scc=rrc_instance_p->carrier.servingcellconfigcommon; - const NR_ServingCellConfig_t *sccd = rrc_instance_p->configuration.scd; ue_context_pP = rrc_gNB_create_ue_context(rnti, rrc_instance_p, 0); gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context; unsigned char buf[1024]; - int size = do_RRCSetup(ue_context_pP, buf, rrc_gNB_get_next_transaction_identifier(module_id), NULL, 0, scc, sccd, &rrc_instance_p->configuration); + int size = do_RRCSetup(ue_context_pP, buf, rrc_gNB_get_next_transaction_identifier(module_id), NULL, 0, &rrc_instance_p->configuration); AssertFatal(size > 0, "do_RRCSetup failed\n"); AssertFatal(size <= 1024, "memory corruption\n"); @@ -413,7 +408,7 @@ static void rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(module_id_t rrc_instance_p->configuration.sib1_tda, rrc_instance_p->configuration.minRXTXTIME, rrc_instance_p->carrier.servingcellconfigcommon); - nr_mac_config_mib(RC.nrmac[rrc_instance_p->module_id], &rrc_instance_p->carrier.mib); + nr_mac_config_mib(RC.nrmac[rrc_instance_p->module_id], rrc_instance_p->carrier.mib); nr_mac_config_sib1(RC.nrmac[rrc_instance_p->module_id], rrc_instance_p->carrier.siblock1); LOG_I(NR_RRC, " [RAPROC] rnti: %04x Logical Channel DL-CCCH, Generating RRCSetup (bytes %d)\n", rnti, size); @@ -577,7 +572,7 @@ static void rrc_gNB_generate_defaultRRCReconfiguration(const protocol_ctxt_t *co if (NODE_IS_DU(rrc->node_type) || NODE_IS_MONOLITHIC(rrc->node_type)) { gNB_RRC_UE_t *ue_p = &ue_context_pP->ue_context; - nr_mac_update_cellgroup(RC.nrmac[rrc->module_id], ue_p->rnti, ue_p->masterCellGroup); + nr_rrc_mac_update_cellgroup(ue_p->rnti, ue_p->masterCellGroup); uint32_t delay_ms = ue_p->masterCellGroup && ue_p->masterCellGroup->spCellConfig && ue_p->masterCellGroup->spCellConfig->spCellConfigDedicated && ue_p->masterCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList @@ -766,7 +761,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration( nr_pdcp_data_req_srb(ctxt_pP->rntiMaybeUEid, DCCH, rrc_gNB_mui++, size, buffer, deliver_pdu_srb_f1, rrc); if (NODE_IS_DU(rrc->node_type) || NODE_IS_MONOLITHIC(rrc->node_type)) { - nr_mac_update_cellgroup(RC.nrmac[rrc->module_id], ue_context_pP->ue_context.rnti, ue_context_pP->ue_context.masterCellGroup); + nr_rrc_mac_update_cellgroup(ue_context_pP->ue_context.rnti, ue_context_pP->ue_context.masterCellGroup); uint32_t delay_ms = ue_p->masterCellGroup && ue_p->masterCellGroup->spCellConfig && ue_p->masterCellGroup->spCellConfig->spCellConfigDedicated && ue_p->masterCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList @@ -1223,18 +1218,6 @@ void rrc_gNB_generate_RRCReestablishment(const protocol_ctxt_t *ctxt_pP, &rrc->carrier); LOG_I(NR_RRC, "[RAPROC] UE %04x Logical Channel DL-DCCH, Generating NR_RRCReestablishment (bytes %d)\n", ue_p->rnti, size); -#if (0) - /* TODO : It may be needed if gNB goes into full stack working. */ - UE = find_nr_UE(module_id, rnti); - if (UE_id != -1) { - /* Activate reject timer, if RRCComplete not received after 10 frames, reject UE */ - RC.nrmac[module_id]->UE_info.UE_sched_ctrl[UE_id].ue_reestablishment_reject_timer = 1; - /* Reject UE after 10 frames, NR_RRCReestablishmentReject is triggered */ - RC.nrmac[module_id]->UE_info.UE_sched_ctrl[UE_id].ue_reestablishment_reject_timer_thres = 100; - } else { - LOG_E(NR_RRC, " Generating NR_RRCReestablishment without UE_id(MAC) rnti %x\n", rnti); - } -#endif uint8_t *kRRCenc = NULL; uint8_t *kRRCint = NULL; @@ -1562,7 +1545,7 @@ void rrc_gNB_process_RRCReestablishmentComplete(const protocol_ctxt_t *const ctx ctxt_pP->module_id, DCCH); - nr_mac_update_cellgroup(RC.nrmac[rrc->module_id], ue_context_pP->ue_context.rnti, cellGroupConfig); + nr_rrc_mac_update_cellgroup(ue_context_pP->ue_context.rnti, cellGroupConfig); nr_pdcp_data_req_srb(ctxt_pP->rntiMaybeUEid, DCCH, rrc_gNB_mui++, size, buffer, deliver_pdu_srb_f1, rrc); } @@ -1616,7 +1599,7 @@ int nr_rrc_reconfiguration_req(rrc_gNB_ue_context_t *const ue_context_pP NULL, masterCellGroup); - nr_mac_update_cellgroup(RC.nrmac[ctxt_pP->module_id], ue_context_pP->ue_context.rnti, masterCellGroup); + nr_rrc_mac_update_cellgroup(ue_context_pP->ue_context.rnti, masterCellGroup); gNB_RRC_INST *rrc = RC.nrrrc[ctxt_pP->module_id]; nr_pdcp_data_req_srb(ctxt_pP->rntiMaybeUEid, DCCH, rrc_gNB_mui++, size, buffer, deliver_pdu_srb_f1, rrc); @@ -1706,8 +1689,7 @@ static int nr_rrc_gNB_decode_ccch(module_id_t module_id, rnti_t rnti, const uint // TODO: MAC structures should not be accessed directly from the RRC! An implementation using the F1 interface should be developed. if (!NODE_IS_CU(RC.nrrrc[0]->node_type)) { - gNB_MAC_INST *nrmac = RC.nrmac[module_id]; // why MAC instances match RRC instances ? - mac_remove_nr_ue(nrmac, UE->rnti); + nr_rrc_mac_remove_ue(ue_context_p->ue_context.rnti); } /* replace rnti in the context */ @@ -1744,8 +1726,11 @@ static int nr_rrc_gNB_decode_ccch(module_id_t module_id, rnti_t rnti, const uint UE = &ue_context_p->ue_context; UE->establishment_cause = rrcSetupRequest->establishmentCause; - rrc_gNB_generate_RRCSetup( - module_id, rnti, rrc_gNB_get_ue_context_by_rnti(gnb_rrc_inst, rnti), du_to_cu_rrc_container, du_to_cu_rrc_container_len, gnb_rrc_inst->carrier.servingcellconfigcommon); + rrc_gNB_generate_RRCSetup(module_id, + rnti, + rrc_gNB_get_ue_context_by_rnti(gnb_rrc_inst, rnti), + du_to_cu_rrc_container, + du_to_cu_rrc_container_len); } break; @@ -1798,34 +1783,6 @@ static int nr_rrc_gNB_decode_ccch(module_id_t module_id, rnti_t rnti, const uint rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(module_id, c_rnti, 0); break; } -#if 0 - int UE_id = find_nr_UE_id(gnb_rrc_inst, c_rnti); - if (UE_id == -1) { - LOG_E(NR_RRC, "NR_RRCReestablishmentRequest without MAC context, rnti %04x, fallback to RRC establishment\n", c_rnti); - rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(module_id, rnti, 0); - break; - } - - // previous rnti - rnti_t previous_rnti = 0; - - for (int i = 0; i < MAX_MOBILES_PER_ENB; i++) { - if (reestablish_rnti_map[i][1] == c_rnti) { - previous_rnti = reestablish_rnti_map[i][0]; - break; - } - } - - if (previous_rnti != 0) { - UE_id = find_nr_UE_id(gnb_rrc_inst, previous_rnti); - if (UE_id == -1) { - LOG_E(NR_RRC,"RRCReestablishmentRequest without mac context previous rnti %04x, nex rnti %04x, fallback to RRC establishment\n", - previous_rnti, c_rnti); - rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(module_id, rnti, 0); - break; - } - } -#endif // c-plane not end if ((UE->StatusRrc != NR_RRC_RECONFIGURED) && (UE->reestablishment_cause == NR_ReestablishmentCause_spare1)) { LOG_E(NR_RRC, "NR_RRCReestablishmentRequest (UE %x c-plane is not end), RRC establishment failed\n", c_rnti); @@ -2419,24 +2376,10 @@ rrc_gNB_decode_dcch( break; } -#if (0) - /* TODO : It may be needed if gNB goes into full stack working. */ - // clear - int UE_id = find_nr_UE_id(gnb_rrc_inst, ctxt_pP->rntiMaybeUEid); - - if (UE_id == -1) { - LOG_E(NR_RRC, PROTOCOL_RRC_CTXT_UE_FMT " NR_RRCReestablishmentComplete without UE_id(MAC) rnti %lx, fault\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), ctxt_pP->rntiMaybeUEid); - break; - } - - RC.nrmac[gnb_rrc_inst]->UE_info.UE_sched_ctrl[UE_id].ue_reestablishment_reject_timer = 0; -#endif - if (ul_dcch_msg->message.choice.c1->choice.rrcReestablishmentComplete->criticalExtensions.present == NR_RRCReestablishmentComplete__criticalExtensions_PR_rrcReestablishmentComplete) { rrc_gNB_process_RRCReestablishmentComplete(ctxt_pP, reestablish_rnti, ue_context_p, ul_dcch_msg->message.choice.c1->choice.rrcReestablishmentComplete->rrc_TransactionIdentifier); - gNB_MAC_INST *nrmac = RC.nrmac[ctxt_pP->module_id]; // WHAT A BEAUTIFULL RACE CONDITION !!! - mac_remove_nr_ue(nrmac, reestablish_rnti); + nr_rrc_mac_remove_ue(reestablish_rnti); UE->ue_reestablishment_counter++; } @@ -2471,26 +2414,17 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *f1_setup_req) { //fixme: multi instance is not consistent here F1AP_SETUP_RESP (msg_p).gNB_CU_name = rrc->node_name; // check that CU rrc instance corresponds to mcc/mnc/cgi (normally cgi should be enough, but just in case) - rrc->carrier.MIB = malloc(f1_setup_req->mib_length[i]); - rrc->carrier.sizeof_MIB = f1_setup_req->mib_length[i]; - LOG_W(NR_RRC, "instance %d mib length %d\n", i, f1_setup_req->mib_length[i]); LOG_W(NR_RRC, "instance %d sib1 length %d\n", i, f1_setup_req->sib1_length[i]); - memcpy((void *)rrc->carrier.MIB,f1_setup_req->mib[i],f1_setup_req->mib_length[i]); + AssertFatal(rrc->carrier.mib == NULL, "CU MIB is already initialized: double F1 setup request?\n"); asn_dec_rval_t dec_rval = uper_decode_complete(NULL, &asn_DEF_NR_BCCH_BCH_Message, - (void **)&rrc->carrier.mib_DU, + (void **)&rrc->carrier.mib, f1_setup_req->mib[i], f1_setup_req->mib_length[i]); AssertFatal(dec_rval.code == RC_OK, "[gNB_CU %"PRIu8"] Failed to decode NR_BCCH_BCH_MESSAGE (%zu bits)\n", j, dec_rval.consumed ); - NR_BCCH_BCH_Message_t *mib = &rrc->carrier.mib; - NR_BCCH_BCH_Message_t *mib_DU = rrc->carrier.mib_DU; - mib->message.present = NR_BCCH_BCH_MessageType_PR_mib; - mib->message.choice.mib = CALLOC(1,sizeof(struct NR_MIB)); - memset(mib->message.choice.mib,0,sizeof(struct NR_MIB)); - memcpy(mib->message.choice.mib, mib_DU->message.choice.mib, sizeof(struct NR_MIB)); dec_rval = uper_decode_complete(NULL, &asn_DEF_NR_SIB1, //&asn_DEF_NR_BCCH_DL_SCH_Message, @@ -3269,8 +3203,7 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) { // Remove here the MAC and RRC context when RRC is not connected if (UE->StatusRrc < NR_RRC_CONNECTED) { if (!NODE_IS_CU(rrc->node_type)) { - gNB_MAC_INST *nrmac = RC.nrmac[ctxt_pP->module_id]; // WHAT A BEAUTIFULL RACE CONDITION !!! - mac_remove_nr_ue(nrmac, UE->rnti); + nr_rrc_mac_remove_ue(ctxt_pP->rntiMaybeUEid); rrc_rlc_remove_ue(ctxt_pP); nr_pdcp_remove_UE(ctxt_pP->rntiMaybeUEid); @@ -3305,8 +3238,7 @@ void nr_rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) { LOG_I(NR_RRC, "Removing UE %x instance after UE_CONTEXT_RELEASE_Complete (ue_release_timer_rrc timeout)\n", UE->rnti); UE->ue_release_timer_rrc = 0; if (!NODE_IS_CU(RC.nrrrc[0]->node_type)) { - gNB_MAC_INST *nrmac = RC.nrmac[ctxt_pP->module_id]; // WHAT A BEAUTIFULL RACE CONDITION !!! - mac_remove_nr_ue(nrmac, UE->rnti); + nr_rrc_mac_remove_ue(ctxt_pP->rntiMaybeUEid); } rrc_rlc_remove_ue(ctxt_pP); nr_pdcp_remove_UE(ctxt_pP->rntiMaybeUEid); diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c index 4b4e06fc0f..bf69aa703b 100644 --- a/openair2/RRC/NR/rrc_gNB_nsa.c +++ b/openair2/RRC/NR/rrc_gNB_nsa.c @@ -46,6 +46,7 @@ #include "UTIL/OSA/osa_defs.h" #include #include "nr_pdcp/nr_pdcp_oai_api.h" +#include "MESSAGES/asn1_msg.h" void rrc_parse_ue_capabilities(gNB_RRC_INST *rrc, NR_UE_CapabilityRAT_ContainerList_t *UE_CapabilityRAT_ContainerList, x2ap_ENDC_sgnb_addition_req_t *m, NR_CG_ConfigInfo_IEs_t *cg_config_info) { @@ -100,7 +101,7 @@ void rrc_parse_ue_capabilities(gNB_RRC_INST *rrc, NR_UE_CapabilityRAT_ContainerL LOG_A(NR_RRC, "Successfully decoded UE NR capabilities (NR and MRDC)\n"); UE->spCellConfig = calloc(1, sizeof(struct NR_SpCellConfig)); - UE->spCellConfig->spCellConfigDedicated = rrc->carrier.servingcellconfig; + UE->spCellConfig->spCellConfigDedicated = rrc->configuration.scd; LOG_I(NR_RRC,"Adding new NSA user (%p)\n",ue_context_p); rrc_add_nsa_user(rrc,ue_context_p, m); } @@ -150,15 +151,13 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *ue_context_p, x2a // NR RRCReconfiguration UE->reconfig = calloc(1, sizeof(NR_RRCReconfiguration_t)); - UE->secondaryCellGroup = calloc(1, sizeof(NR_CellGroupConfig_t)); memset((void *)UE->reconfig, 0, sizeof(NR_RRCReconfiguration_t)); UE->reconfig->rrc_TransactionIdentifier = 0; UE->reconfig->criticalExtensions.present = NR_RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration; NR_RRCReconfiguration_IEs_t *reconfig_ies=calloc(1,sizeof(NR_RRCReconfiguration_IEs_t)); UE->reconfig->criticalExtensions.choice.rrcReconfiguration = reconfig_ies; - UE->rb_config = calloc(1, sizeof(NR_RRCReconfiguration_t)); if (get_softmodem_params()->phy_test == 1 || get_softmodem_params()->do_ra == 1 || get_softmodem_params()->sa == 1){ - fill_default_rbconfig(UE->rb_config, 10 /* EPS bearer ID */, 1 /* drb ID */, NR_CipheringAlgorithm_nea0, NR_SecurityConfig__keyToUse_master); + UE->rb_config = get_default_rbconfig(10 /* EPS bearer ID */, 1 /* drb ID */, NR_CipheringAlgorithm_nea0, NR_SecurityConfig__keyToUse_master); } else { /* TODO: handle more than one bearer */ if (m == NULL) { @@ -235,10 +234,20 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *ue_context_p, x2a exit(1); } - fill_default_rbconfig(UE->rb_config, m->e_rabs_tobeadded[0].e_rab_id, m->e_rabs_tobeadded[0].drb_ID, cipher_algo, NR_SecurityConfig__keyToUse_secondary); + UE->rb_config = get_default_rbconfig(m->e_rabs_tobeadded[0].e_rab_id, m->e_rabs_tobeadded[0].drb_ID, cipher_algo, NR_SecurityConfig__keyToUse_secondary); } NR_ServingCellConfig_t *scc = UE->spCellConfig ? UE->spCellConfig->spCellConfigDedicated : NULL; + UE->secondaryCellGroup = get_default_secondaryCellGroup(carrier->servingcellconfigcommon, + scc, + UE->UE_Capability_nr, + 1, + 1, + configuration, + ue_context_p->ue_context.gNB_ue_ngap_id); + AssertFatal(UE->secondaryCellGroup != NULL, "out of memory\n"); + xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, UE->secondaryCellGroup); + fill_default_reconfig(carrier->servingcellconfigcommon, scc, reconfig_ies, UE->secondaryCellGroup, UE->UE_Capability_nr, configuration, ue_context_p->ue_context.gNB_ue_ngap_id); // the UE context is not yet inserted in the RRC UE manager // rrc_gNB_update_ue_context_rnti(UE->secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity, rrc, diff --git a/openair2/RRC/NR/rrc_gNB_radio_bearers.c b/openair2/RRC/NR/rrc_gNB_radio_bearers.c index b4d6c55762..f7280e209a 100644 --- a/openair2/RRC/NR/rrc_gNB_radio_bearers.c +++ b/openair2/RRC/NR/rrc_gNB_radio_bearers.c @@ -32,7 +32,6 @@ rrc_pdu_session_param_t *find_pduSession(gNB_RRC_UE_t *ue, int id, bool create) ue->nb_of_pdusessions++; else return NULL; - AssertFatal(ue->nb_of_pdusessions < NGAP_MAX_PDU_SESSION, ""); return ue->pduSession + j; } diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c index 4995662e71..ffe8d0438a 100644 --- a/openair2/RRC/NR/rrc_gNB_reconfig.c +++ b/openair2/RRC/NR/rrc_gNB_reconfig.c @@ -43,366 +43,10 @@ #include "assertions.h" #include "oai_asn1.h" #include "common/utils/nr/nr_common.h" -#include "SIMULATION/TOOLS/sim.h" #include "executables/softmodem-common.h" #include "LAYER2/nr_rlc/nr_rlc_oai_api.h" #include "nr_rrc_config.h" - -void fix_servingcellconfigdedicated(NR_ServingCellConfig_t *scd) { - - int b = 0; - while (b < scd->downlinkBWP_ToAddModList->list.count) { - if (scd->downlinkBWP_ToAddModList->list.array[b]->bwp_Common->genericParameters.locationAndBandwidth == 0) { - asn_sequence_del(&scd->downlinkBWP_ToAddModList->list, b, 1); - } else { - b++; - } - } - - if(scd->downlinkBWP_ToAddModList->list.count == 0) { - free(scd->downlinkBWP_ToAddModList); - scd->downlinkBWP_ToAddModList = NULL; - } - - b = 0; - while (b < scd->uplinkConfig->uplinkBWP_ToAddModList->list.count) { - if (scd->uplinkConfig->uplinkBWP_ToAddModList->list.array[b]->bwp_Common->genericParameters.locationAndBandwidth == - 0) { - asn_sequence_del(&scd->uplinkConfig->uplinkBWP_ToAddModList->list, b, 1); - } else { - b++; - } - } - - if(scd->uplinkConfig->uplinkBWP_ToAddModList->list.count == 0) { - free(scd->uplinkConfig->uplinkBWP_ToAddModList); - scd->uplinkConfig->uplinkBWP_ToAddModList = NULL; - } - -} - -void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellconfigcommon, - NR_ServingCellConfig_t *servingcellconfigdedicated, - NR_CellGroupConfig_t *secondaryCellGroup, - NR_UE_NR_Capability_t *uecap, - int scg_id, - int servCellIndex, - const gNB_RrcConfigurationReq *configuration, - int uid) { - - const rrc_pdsch_AntennaPorts_t* pdschap = &configuration->pdsch_AntennaPorts; - const int dl_antenna_ports = pdschap->N1 * pdschap->N2 * pdschap->XP; - const int do_csirs = configuration->do_CSIRS; - - AssertFatal(servingcellconfigcommon!=NULL,"servingcellconfigcommon is null\n"); - AssertFatal(secondaryCellGroup!=NULL,"secondaryCellGroup is null\n"); - - if(uecap == NULL) - LOG_E(RRC,"No UE Capabilities available when programming default CellGroup in NSA\n"); - - // This assert will never happen in the current implementation because NUMBER_OF_UE_MAX = 4. - // However, if in the future NUMBER_OF_UE_MAX is increased, it will be necessary to improve the allocation of SRS resources, - // where the startPosition = 2 or 3 and sl160 = 17, 17, 27 ... 157 only give us 30 different allocations. - AssertFatal(uid>=0 && uid<30, "gNB cannot allocate the SRS resources\n"); - - uint64_t bitmap = get_ssb_bitmap(servingcellconfigcommon); - fix_servingcellconfigdedicated(servingcellconfigdedicated); - - memset(secondaryCellGroup,0,sizeof(NR_CellGroupConfig_t)); - secondaryCellGroup->cellGroupId = scg_id; - NR_RLC_BearerConfig_t *RLC_BearerConfig = calloc(1,sizeof(*RLC_BearerConfig)); - nr_rlc_bearer_init(RLC_BearerConfig, NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity); - nr_drb_config(RLC_BearerConfig->rlc_Config, NR_RLC_Config_PR_um_Bi_Directional); - //nr_drb_config(RLC_BearerConfig->rlc_Config, NR_RLC_Config_PR_am); - nr_rlc_bearer_init_ul_spec(RLC_BearerConfig->mac_LogicalChannelConfig); - - secondaryCellGroup->rlc_BearerToAddModList = calloc(1,sizeof(*secondaryCellGroup->rlc_BearerToAddModList)); - asn1cSeqAdd(&secondaryCellGroup->rlc_BearerToAddModList->list, RLC_BearerConfig); - - secondaryCellGroup->mac_CellGroupConfig = configure_mac_cellgroup(); - - secondaryCellGroup->physicalCellGroupConfig = calloc(1,sizeof(*secondaryCellGroup->physicalCellGroupConfig)); - secondaryCellGroup->physicalCellGroupConfig->harq_ACK_SpatialBundlingPUCCH=NULL; - secondaryCellGroup->physicalCellGroupConfig->harq_ACK_SpatialBundlingPUSCH=NULL; - secondaryCellGroup->physicalCellGroupConfig->p_NR_FR1 = NULL; - secondaryCellGroup->physicalCellGroupConfig->pdsch_HARQ_ACK_Codebook=NR_PhysicalCellGroupConfig__pdsch_HARQ_ACK_Codebook_dynamic; - secondaryCellGroup->physicalCellGroupConfig->tpc_SRS_RNTI=NULL; - secondaryCellGroup->physicalCellGroupConfig->tpc_PUCCH_RNTI=NULL; - secondaryCellGroup->physicalCellGroupConfig->tpc_PUSCH_RNTI=NULL; - secondaryCellGroup->physicalCellGroupConfig->sp_CSI_RNTI=NULL; - secondaryCellGroup->physicalCellGroupConfig->cs_RNTI=NULL; - secondaryCellGroup->physicalCellGroupConfig->ext1=NULL; - secondaryCellGroup->spCellConfig = calloc(1,sizeof(*secondaryCellGroup->spCellConfig)); - secondaryCellGroup->spCellConfig->servCellIndex = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->servCellIndex)); - *secondaryCellGroup->spCellConfig->servCellIndex = servCellIndex; - secondaryCellGroup->spCellConfig->reconfigurationWithSync=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->reconfigurationWithSync)); - secondaryCellGroup->spCellConfig->reconfigurationWithSync->spCellConfigCommon=servingcellconfigcommon; - secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity=(get_softmodem_params()->phy_test==1) ? 0x1234 : (taus()&0xffff); - secondaryCellGroup->spCellConfig->reconfigurationWithSync->t304=NR_ReconfigurationWithSync__t304_ms2000; - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated = NULL; - secondaryCellGroup->spCellConfig->reconfigurationWithSync->ext1 = NULL; - - // For 2-step contention-free random access procedure - if(get_softmodem_params()->sa == 0) { - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated = calloc(1,sizeof(struct NR_ReconfigurationWithSync__rach_ConfigDedicated)); - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->present= NR_ReconfigurationWithSync__rach_ConfigDedicated_PR_uplink; - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink= calloc(1,sizeof(struct NR_RACH_ConfigDedicated)); - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra= calloc(1,sizeof(struct NR_CFRA)); - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->ra_Prioritization= NULL; - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions= calloc(1,sizeof(struct NR_CFRA__occasions)); - memcpy(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions->rach_ConfigGeneric, - &servingcellconfigcommon->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric, sizeof(NR_RACH_ConfigGeneric_t)); - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions->ssb_perRACH_Occasion= calloc(1,sizeof(long)); - *secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->occasions->ssb_perRACH_Occasion = NR_CFRA__occasions__ssb_perRACH_Occasion_one; - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.present = NR_CFRA__resources_PR_ssb; - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb = calloc(1,sizeof(struct NR_CFRA__resources__ssb)); - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ra_ssb_OccasionMaskIndex = 0; - - int n_ssb = 0; - struct NR_CFRA_SSB_Resource *ssbElem[64]; - for (int i=0;i<64;i++) { - if ((bitmap>>(63-i))&0x01){ - ssbElem[n_ssb] = calloc(1,sizeof(struct NR_CFRA_SSB_Resource)); - ssbElem[n_ssb]->ssb = i; - ssbElem[n_ssb]->ra_PreambleIndex = 63 - (uid % 64); - asn1cSeqAdd(&secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list,ssbElem[n_ssb]); - n_ssb++; - } - } - - secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->ext1 = NULL; - } - - secondaryCellGroup->spCellConfig->rlf_TimersAndConstants = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->rlf_TimersAndConstants)); - secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->present = NR_SetupRelease_RLF_TimersAndConstants_PR_setup; - secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup)); - secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->t310 = NR_RLF_TimersAndConstants__t310_ms4000; - secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->n310 = NR_RLF_TimersAndConstants__n310_n20; - secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->n311 = NR_RLF_TimersAndConstants__n311_n1; - secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1 = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1)); - secondaryCellGroup->spCellConfig->rlf_TimersAndConstants->choice.setup->ext1->t311 = NR_RLF_TimersAndConstants__ext1__t311_ms30000; - secondaryCellGroup->spCellConfig->rlmInSyncOutOfSyncThreshold = NULL; - - secondaryCellGroup->spCellConfig->spCellConfigDedicated = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated)); - secondaryCellGroup->spCellConfig->spCellConfigDedicated->tdd_UL_DL_ConfigurationDedicated = NULL; - - /// initialDownlinkBWP - - secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP)); - secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdcch_Config=NULL; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config = config_pdsch(bitmap, 0, dl_antenna_ports); - secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->sps_Config = NULL; // calloc(1,sizeof(struct NR_SetupRelease_SPS_Config)); - - secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->radioLinkMonitoringConfig = NULL; -#if 0 - secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->radioLinkMonitoringConfig = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->radioLinkMonitoringConfig)); - secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->radioLinkMonitoringConfig->present = NR_SetupRelease_RadioLinkMonitoringConfig_PR_setup; - - secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->radioLinkMonitoringConfig->choice.setup = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->radioLinkMonitoringConfig->choice.setup)); - secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->radioLinkMonitoringConfig->choice.setup->failureDetectionResourcesToAddModList=NULL; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->radioLinkMonitoringConfig->choice.setup->failureDetectionResourcesToReleaseList=NULL; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->radioLinkMonitoringConfig->choice.setup->beamFailureInstanceMaxCount = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->radioLinkMonitoringConfig->choice.setup->beamFailureInstanceMaxCount)); - *secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->radioLinkMonitoringConfig->choice.setup->beamFailureInstanceMaxCount = NR_RadioLinkMonitoringConfig__beamFailureInstanceMaxCount_n3; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer)); - *secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->radioLinkMonitoringConfig->choice.setup->beamFailureDetectionTimer = NR_RadioLinkMonitoringConfig__beamFailureDetectionTimer_pbfd2; -#endif - - /// initialUplinkBWP - - if (!secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig) { - secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig)); - } - - NR_BWP_UplinkDedicated_t *initialUplinkBWP = calloc(1,sizeof(*initialUplinkBWP)); - secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP = initialUplinkBWP; - initialUplinkBWP->pucch_Config = NULL; - - NR_PUSCH_Config_t *pusch_Config = NULL; - if (servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList) { - pusch_Config = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0]->bwp_Dedicated->pusch_Config->choice.setup; - } - initialUplinkBWP->pusch_Config = config_pusch(pusch_Config); - - long maxMIMO_Layers = servingcellconfigdedicated->uplinkConfig && - servingcellconfigdedicated->uplinkConfig->pusch_ServingCellConfig && - servingcellconfigdedicated->uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1 && - servingcellconfigdedicated->uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers ? - *servingcellconfigdedicated->uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers : 1; - - int curr_bwp = NRRIV2BW(servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth,MAX_BWP_SIZE); - initialUplinkBWP->srs_Config = calloc(1,sizeof(*initialUplinkBWP->srs_Config)); - config_srs(servingcellconfigcommon, initialUplinkBWP->srs_Config, NULL, curr_bwp, uid, 0, maxMIMO_Layers, configuration->do_SRS); - - // Downlink BWPs - int n_dl_bwp = 1; - if (servingcellconfigdedicated && servingcellconfigdedicated->downlinkBWP_ToAddModList) { - n_dl_bwp = servingcellconfigdedicated->downlinkBWP_ToAddModList->list.count; - } - if(n_dl_bwp>0) { - secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList)); - for (int bwp_loop = 0; bwp_loop < n_dl_bwp; bwp_loop++) { - NR_BWP_Downlink_t *bwp = calloc(1,sizeof(*bwp)); - config_downlinkBWP(bwp, servingcellconfigcommon, - servingcellconfigdedicated, - uecap, - dl_antenna_ports, - configuration->force_256qam_off, - bwp_loop, false); - asn1cSeqAdd(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list,bwp); - } - secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id)); - *secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id = servingcellconfigdedicated->firstActiveDownlinkBWP_Id ? *servingcellconfigdedicated->firstActiveDownlinkBWP_Id : 1; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = calloc(1, sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id)); - *secondaryCellGroup->spCellConfig->spCellConfigDedicated->defaultDownlinkBWP_Id = servingcellconfigdedicated->defaultDownlinkBWP_Id ? *servingcellconfigdedicated->defaultDownlinkBWP_Id : 1; - } - - // Uplink BWPs - int n_ul_bwp = 1; - if (servingcellconfigdedicated && servingcellconfigdedicated->uplinkConfig && servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList) { - n_ul_bwp = servingcellconfigdedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count; - } - if(n_ul_bwp>0) { - secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList)); - for (int bwp_loop = 0; bwp_loop < n_ul_bwp; bwp_loop++) { - NR_BWP_Uplink_t *ubwp = calloc(1,sizeof(*ubwp)); - config_uplinkBWP(ubwp, bwp_loop, false, uid, - configuration, - servingcellconfigdedicated, - servingcellconfigcommon, - uecap); - asn1cSeqAdd(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list,ubwp); - } - secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id)); - *secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id = servingcellconfigdedicated->uplinkConfig->firstActiveUplinkBWP_Id ? *servingcellconfigdedicated->uplinkConfig->firstActiveUplinkBWP_Id : 1; - } - - secondaryCellGroup->spCellConfig->spCellConfigDedicated->bwp_InactivityTimer = NULL; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToReleaseList= NULL; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToReleaseList = NULL; - - secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig)); - NR_PUSCH_ServingCellConfig_t *pusch_scc = calloc(1,sizeof(*pusch_scc)); - secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig->present = NR_SetupRelease_PUSCH_ServingCellConfig_PR_setup; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig->choice.setup = pusch_scc; - pusch_scc->codeBlockGroupTransmission = NULL; - pusch_scc->rateMatching = NULL; - pusch_scc->xOverhead = NULL; - pusch_scc->ext1=calloc(1,sizeof(*pusch_scc->ext1)); - pusch_scc->ext1->maxMIMO_Layers = calloc(1,sizeof(*pusch_scc->ext1->maxMIMO_Layers)); - *pusch_scc->ext1->maxMIMO_Layers = 1; - pusch_scc->ext1->processingType2Enabled = NULL; - - secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->carrierSwitching = NULL; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->supplementaryUplink=NULL; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->pdcch_ServingCellConfig=NULL; - - secondaryCellGroup->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig)); - NR_PDSCH_ServingCellConfig_t *pdsch_servingcellconfig = calloc(1,sizeof(*pdsch_servingcellconfig)); - secondaryCellGroup->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->present = NR_SetupRelease_PDSCH_ServingCellConfig_PR_setup; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup = pdsch_servingcellconfig; - pdsch_servingcellconfig->codeBlockGroupTransmission = NULL; - pdsch_servingcellconfig->xOverhead = NULL; - pdsch_servingcellconfig->nrofHARQ_ProcessesForPDSCH = calloc(1, sizeof(*pdsch_servingcellconfig->nrofHARQ_ProcessesForPDSCH)); - *pdsch_servingcellconfig->nrofHARQ_ProcessesForPDSCH = NR_PDSCH_ServingCellConfig__nrofHARQ_ProcessesForPDSCH_n16; - pdsch_servingcellconfig->pucch_Cell= NULL; - pdsch_servingcellconfig->ext1=calloc(1,sizeof(*pdsch_servingcellconfig->ext1)); - pdsch_servingcellconfig->ext1->maxMIMO_Layers = calloc(1,sizeof(*pdsch_servingcellconfig->ext1->maxMIMO_Layers)); - *pdsch_servingcellconfig->ext1->maxMIMO_Layers = NR_MAX_SUPPORTED_DL_LAYERS; - pdsch_servingcellconfig->ext1->processingType2Enabled = NULL; - - secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig=NULL; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig)); - secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->present = NR_SetupRelease_CSI_MeasConfig_PR_setup; - - NR_CSI_MeasConfig_t *csi_MeasConfig = calloc(1,sizeof(*csi_MeasConfig)); - secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup = csi_MeasConfig; - - csi_MeasConfig->csi_ResourceConfigToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_ResourceConfigToAddModList)); - csi_MeasConfig->csi_ResourceConfigToReleaseList = NULL; - - csi_MeasConfig->csi_SSB_ResourceSetToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_SSB_ResourceSetToAddModList)); - csi_MeasConfig->csi_SSB_ResourceSetToReleaseList = NULL; - - csi_MeasConfig->csi_ReportConfigToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_ReportConfigToAddModList)); - csi_MeasConfig->csi_ReportConfigToReleaseList = NULL; - - NR_CSI_SSB_ResourceSet_t *ssbresset0 = calloc(1,sizeof(*ssbresset0)); - ssbresset0->csi_SSB_ResourceSetId = 0; - - for (int i=0;i<64;i++) { - if ((bitmap >> (63 - i)) & 0x01) { - NR_SSB_Index_t *ssbres = NULL; - asn1cCallocOne(ssbres, i); - asn1cSeqAdd(&ssbresset0->csi_SSB_ResourceList.list, ssbres); - } - } - asn1cSeqAdd(&csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list,ssbresset0); - - for (int bwp_loop = 0; bwp_loop < n_dl_bwp; bwp_loop++) { - - NR_BWP_Downlink_t *bwp = secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_loop]; - int curr_bwp = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth,MAX_BWP_SIZE); - - config_csirs(servingcellconfigcommon, csi_MeasConfig, uid, dl_antenna_ports, curr_bwp, do_csirs, bwp_loop); - config_csiim(do_csirs, dl_antenna_ports, curr_bwp, csi_MeasConfig, bwp_loop); - - if (do_csirs) { - NR_CSI_ResourceConfig_t *csires = calloc(1,sizeof(*csires)); - csires->csi_ResourceConfigId = bwp->bwp_Id; - csires->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB; - csires->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB = calloc(1,sizeof(*csires->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB)); - csires->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList = calloc(1,sizeof(*csires->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList)); - NR_NZP_CSI_RS_ResourceSetId_t *nzp0 = calloc(1,sizeof(*nzp0)); - *nzp0 = bwp_loop; - asn1cSeqAdd(&csires->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list,nzp0); - csires->bwp_Id = bwp->bwp_Id; - csires->resourceType = NR_CSI_ResourceConfig__resourceType_periodic; - asn1cSeqAdd(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires); - } - if (do_csirs && dl_antenna_ports > 1) { - NR_CSI_ResourceConfig_t *csiresim = calloc(1,sizeof(*csiresim)); - csiresim->csi_ResourceConfigId = bwp->bwp_Id+10; - csiresim->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_csi_IM_ResourceSetList; - csiresim->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList = calloc(1,sizeof(*csiresim->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList)); - NR_CSI_IM_ResourceSetId_t *csiim00 = calloc(1,sizeof(*csiim00)); - *csiim00 = bwp_loop; - asn1cSeqAdd(&csiresim->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList->list,csiim00); - csiresim->bwp_Id = bwp->bwp_Id; - csiresim->resourceType = NR_CSI_ResourceConfig__resourceType_periodic; - asn1cSeqAdd(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csiresim); - } - NR_CSI_ResourceConfig_t *ssbres = calloc(1,sizeof(*ssbres)); - ssbres->csi_ResourceConfigId = bwp->bwp_Id+20; - ssbres->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB; - ssbres->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB = calloc(1,sizeof(*ssbres->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB)); - ssbres->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList = calloc(1,sizeof(*ssbres->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList)); - NR_CSI_SSB_ResourceSetId_t *ssbres00 = calloc(1,sizeof(*ssbres00)); - *ssbres00 = 0; - asn1cSeqAdd(&ssbres->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list,ssbres00); - ssbres->bwp_Id = bwp->bwp_Id; - ssbres->resourceType = NR_CSI_ResourceConfig__resourceType_periodic; - asn1cSeqAdd(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,ssbres); - - NR_PUCCH_CSI_Resource_t *pucchcsires1 = calloc(1,sizeof(*pucchcsires1)); - pucchcsires1->uplinkBandwidthPartId = bwp->bwp_Id; - pucchcsires1->pucch_Resource=2; - - config_csi_meas_report(csi_MeasConfig, servingcellconfigcommon, pucchcsires1, bwp->bwp_Dedicated->pdsch_Config, pdschap, NR_MAX_SUPPORTED_DL_LAYERS, bwp->bwp_Id, uid); - config_rsrp_meas_report(csi_MeasConfig, servingcellconfigcommon, pucchcsires1, do_csirs, bwp->bwp_Id + 10, uid); - } - secondaryCellGroup->spCellConfig->spCellConfigDedicated->sCellDeactivationTimer=NULL; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->crossCarrierSchedulingConfig=NULL; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->tag_Id=0; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->dummy1=NULL; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->pathlossReferenceLinking=NULL; - secondaryCellGroup->spCellConfig->spCellConfigDedicated->servingCellMO=NULL; - - *servingcellconfigdedicated = *secondaryCellGroup->spCellConfig->spCellConfigDedicated; - - if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) { - xer_fprint(stdout, &asn_DEF_NR_SpCellConfig, (void *)secondaryCellGroup->spCellConfig); - } -} +#include "MESSAGES/asn1_msg.h" void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon, NR_ServingCellConfig_t *servingcellconfigdedicated, @@ -416,17 +60,6 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon AssertFatal(secondaryCellGroup!=NULL,"secondaryCellGroup is null\n"); // radioBearerConfig reconfig->radioBearerConfig=NULL; - // secondaryCellGroup - fill_default_secondaryCellGroup(servingcellconfigcommon, - servingcellconfigdedicated, - secondaryCellGroup, - uecap, - 1, - 1, - configuration, - uid); - - xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)secondaryCellGroup); char scg_buffer[1024]; asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig, NULL, (void *)secondaryCellGroup, scg_buffer, 1024); @@ -443,54 +76,6 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon reconfig->nonCriticalExtension = NULL; } -void fill_default_rbconfig(NR_RadioBearerConfig_t *rbconfig, - int eps_bearer_id, int rb_id, - e_NR_CipheringAlgorithm ciphering_algorithm, - e_NR_SecurityConfig__keyToUse key_to_use) { - - rbconfig->srb_ToAddModList = NULL; - rbconfig->srb3_ToRelease = NULL; - rbconfig->drb_ToAddModList = calloc(1,sizeof(*rbconfig->drb_ToAddModList)); - NR_DRB_ToAddMod_t *drb_ToAddMod = calloc(1,sizeof(*drb_ToAddMod)); - drb_ToAddMod->cnAssociation = calloc(1,sizeof(*drb_ToAddMod->cnAssociation)); - drb_ToAddMod->cnAssociation->present = NR_DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity; - drb_ToAddMod->cnAssociation->choice.eps_BearerIdentity= eps_bearer_id; - drb_ToAddMod->drb_Identity = rb_id; - drb_ToAddMod->reestablishPDCP = NULL; - drb_ToAddMod->recoverPDCP = NULL; - drb_ToAddMod->pdcp_Config = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config)); - drb_ToAddMod->pdcp_Config->drb = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb)); - drb_ToAddMod->pdcp_Config->drb->discardTimer = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb->discardTimer)); - *drb_ToAddMod->pdcp_Config->drb->discardTimer=NR_PDCP_Config__drb__discardTimer_infinity; - drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeUL = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeUL)); - *drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeUL = NR_PDCP_Config__drb__pdcp_SN_SizeUL_len18bits; - drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeDL = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeDL)); - *drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeDL = NR_PDCP_Config__drb__pdcp_SN_SizeDL_len18bits; - drb_ToAddMod->pdcp_Config->drb->headerCompression.present = NR_PDCP_Config__drb__headerCompression_PR_notUsed; - drb_ToAddMod->pdcp_Config->drb->headerCompression.choice.notUsed = 0; - - drb_ToAddMod->pdcp_Config->drb->integrityProtection=NULL; - drb_ToAddMod->pdcp_Config->drb->statusReportRequired=NULL; - drb_ToAddMod->pdcp_Config->drb->outOfOrderDelivery=NULL; - drb_ToAddMod->pdcp_Config->moreThanOneRLC = NULL; - - drb_ToAddMod->pdcp_Config->t_Reordering = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->t_Reordering)); - *drb_ToAddMod->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms100; - drb_ToAddMod->pdcp_Config->ext1 = NULL; - - asn1cSeqAdd(&rbconfig->drb_ToAddModList->list,drb_ToAddMod); - - rbconfig->drb_ToReleaseList = NULL; - - rbconfig->securityConfig = calloc(1,sizeof(*rbconfig->securityConfig)); - rbconfig->securityConfig->securityAlgorithmConfig = calloc(1,sizeof(*rbconfig->securityConfig->securityAlgorithmConfig)); - rbconfig->securityConfig->securityAlgorithmConfig->cipheringAlgorithm = ciphering_algorithm; - rbconfig->securityConfig->securityAlgorithmConfig->integrityProtAlgorithm=NULL; - rbconfig->securityConfig->keyToUse = calloc(1,sizeof(*rbconfig->securityConfig->keyToUse)); - *rbconfig->securityConfig->keyToUse = key_to_use; - -// xer_fprint(stdout, &asn_DEF_NR_RadioBearerConfig, (const void*)rbconfig); -} /* Function to set or overwrite PTRS DL RRC parameters */ void rrc_config_dl_ptrs_params(NR_BWP_Downlink_t *bwp, int *ptrsNrb, int *ptrsMcs, int *epre_Ratio, int * reOffset) { diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c index dda30839e8..7ddc2da5d7 100644 --- a/openair2/RRC/NR_UE/rrc_UE.c +++ b/openair2/RRC/NR_UE/rrc_UE.c @@ -413,7 +413,7 @@ void process_nsa_message(NR_UE_RRC_INST_t *rrc, nsa_message_t nsa_message_type, NR_UE_MAC_INST_t *mac = get_mac_inst(module_id); PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_id, ENB_FLAG_YES, mac->crnti, 0, 0, 0); xer_fprint(stdout, &asn_DEF_NR_RadioBearerConfig, (const void*)RadioBearerConfig); - LOG_D(NR_RRC, "Calling fill_default_rbconfig_ue at %d with: e_rab_id = %ld, drbID = %ld, cipher_algo = %ld, key = %ld \n", + LOG_D(NR_RRC, "Calling nr_rrc_ue_process_RadioBearerConfig() at %d with: e_rab_id = %ld, drbID = %ld, cipher_algo = %ld, key = %ld \n", __LINE__, RadioBearerConfig->drb_ToAddModList->list.array[0]->cnAssociation->choice.eps_BearerIdentity, RadioBearerConfig->drb_ToAddModList->list.array[0]->drb_Identity, RadioBearerConfig->securityConfig->securityAlgorithmConfig->cipheringAlgorithm, @@ -2734,9 +2734,9 @@ void process_lte_nsa_msg(nsa_msg_t *msg, int msg_len) LOG_D(NR_RRC, "Received NR band information: %ld.\n", nr_freq_band_list->list.array[i]->choice.bandInformationNR->bandNR); } - MessageDef *dummy_msg = itti_alloc_new_message(TASK_RRC_NSA_UE, 0, UE_CAPABILITY_DUMMY); + int dummy_msg = 0;// whatever piece of data, it will never be used by sendee LOG_D(NR_RRC, "We are calling nsa_sendmsg_to_lte_ue to send a UE_CAPABILITY_DUMMY\n"); - nsa_sendmsg_to_lte_ue(dummy_msg, sizeof(dummy_msg), UE_CAPABILITY_DUMMY); + nsa_sendmsg_to_lte_ue(&dummy_msg, sizeof(dummy_msg), UE_CAPABILITY_DUMMY); LOG_A(NR_RRC, "Sent initial NRUE Capability response to LTE UE\n"); break; } diff --git a/openair2/RRC/NR_UE/rrc_nsa.c b/openair2/RRC/NR_UE/rrc_nsa.c index 9e62243c65..279e920779 100644 --- a/openair2/RRC/NR_UE/rrc_nsa.c +++ b/openair2/RRC/NR_UE/rrc_nsa.c @@ -14,7 +14,7 @@ int get_from_lte_ue_fd() return from_lte_ue_fd; } -void nsa_sendmsg_to_lte_ue(const void *message, size_t msg_len, MessagesIds msg_type) +void nsa_sendmsg_to_lte_ue(const void *message, size_t msg_len, Rrc_Msg_Type_t msg_type) { LOG_I(NR_RRC, "Entered %s \n", __FUNCTION__); nsa_msg_t n_msg; diff --git a/openair2/RRC/NR_UE/rrc_proto.h b/openair2/RRC/NR_UE/rrc_proto.h index 6c0499933e..83f6773da7 100644 --- a/openair2/RRC/NR_UE/rrc_proto.h +++ b/openair2/RRC/NR_UE/rrc_proto.h @@ -160,7 +160,7 @@ void *recv_msgs_from_lte_ue(void *args_p); void init_connections_with_lte_ue(void); -void nsa_sendmsg_to_lte_ue(const void *message, size_t msg_len, MessagesIds msg_type); +void nsa_sendmsg_to_lte_ue(const void *message, size_t msg_len, Rrc_Msg_Type_t msg_type); void start_oai_nrue_threads(void); diff --git a/openair3/NAS/COMMON/API/NETWORK/nas_message.c b/openair3/NAS/COMMON/API/NETWORK/nas_message.c index d1a9e97025..02fa4ad6ca 100644 --- a/openair3/NAS/COMMON/API/NETWORK/nas_message.c +++ b/openair3/NAS/COMMON/API/NETWORK/nas_message.c @@ -986,6 +986,7 @@ static int _nas_message_decrypt( length, security_header_type); memcpy(dest, src, length); DECODE_U8(dest, *(uint8_t*)(&header), size); + (void) size; // prevent warning of unused variable, but we have to decode it LOG_FUNC_RETURN (header.protocol_discriminator); //LOG_FUNC_RETURN (length); break; @@ -1022,6 +1023,7 @@ static int _nas_message_decrypt( /* Decode the first octet (security header type or EPS bearer identity, * and protocol discriminator) */ DECODE_U8(dest, *(uint8_t*)(&header), size); + (void) size; // prevent warning of unused variable, but we have to decode it LOG_FUNC_RETURN (header.protocol_discriminator); @@ -1056,6 +1058,7 @@ static int _nas_message_decrypt( /* Decode the first octet (security header type or EPS bearer identity, * and protocol discriminator) */ DECODE_U8(dest, *(uint8_t*)(&header), size); + (void) size; // prevent warning of unused variable, but we have to decode it LOG_FUNC_RETURN (header.protocol_discriminator); } @@ -1071,6 +1074,7 @@ static int _nas_message_decrypt( /* Decode the first octet (security header type or EPS bearer identity, * and protocol discriminator) */ DECODE_U8(dest, *(uint8_t*)(&header), size); + (void) size; // prevent warning of unused variable, but we have to decode it LOG_FUNC_RETURN (header.protocol_discriminator); @@ -1084,6 +1088,7 @@ static int _nas_message_decrypt( /* Decode the first octet (security header type or EPS bearer identity, * and protocol discriminator) */ DECODE_U8(dest, *(uint8_t*)(&header), size); + (void) size; // prevent warning of unused variable, but we have to decode it LOG_FUNC_RETURN (header.protocol_discriminator); break; diff --git a/openair3/NAS/COMMON/IES/TrafficFlowTemplate.h b/openair3/NAS/COMMON/IES/TrafficFlowTemplate.h index 651ec7ef5c..b4f7a5df26 100644 --- a/openair3/NAS/COMMON/IES/TrafficFlowTemplate.h +++ b/openair3/NAS/COMMON/IES/TrafficFlowTemplate.h @@ -96,7 +96,11 @@ typedef struct { * and "no TFT operation" shall be empty. * --------------------------------------------------------------- */ -typedef struct {} NoPacketFilter; +typedef struct { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; +} NoPacketFilter; typedef NoPacketFilter DeleteExistingTft; typedef NoPacketFilter NoTftOperation; @@ -155,7 +159,9 @@ typedef union { */ typedef struct { - /* TODO */ + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; } ParameterList; /* diff --git a/openair3/NAS/UE/API/USER/at_command.h b/openair3/NAS/UE/API/USER/at_command.h index b7bdb11b75..658dbc7a08 100644 --- a/openair3/NAS/UE/API/USER/at_command.h +++ b/openair3/NAS/UE/API/USER/at_command.h @@ -160,7 +160,11 @@ typedef enum { /* CGSN AT command type */ #define AT_COMMAND_CGSN_MASK AT_COMMAND_NO_PARAM -typedef struct at_cgsn_s {} at_cgsn_t; +typedef struct at_cgsn_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; +} at_cgsn_t; /* CGMI: Request manufacturer identification * ----------------------------------------- @@ -172,7 +176,11 @@ typedef struct at_cgsn_s {} at_cgsn_t; /* CGMI AT command type */ #define AT_COMMAND_CGMI_MASK AT_COMMAND_NO_PARAM -typedef struct at_cgmi_s {} at_cgmi_t; +typedef struct at_cgmi_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; +} at_cgmi_t; /* CGMM: Request model identification * ---------------------------------- @@ -184,7 +192,11 @@ typedef struct at_cgmi_s {} at_cgmi_t; /* CGMM AT command type */ #define AT_COMMAND_CGMM_MASK AT_COMMAND_NO_PARAM -typedef struct at_cgmm_s {} at_cgmm_t; +typedef struct at_cgmm_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; +} at_cgmm_t; /* CGMR: Request revision identification * ------------------------------------- @@ -197,7 +209,11 @@ typedef struct at_cgmm_s {} at_cgmm_t; /* CGMR AT command type */ #define AT_COMMAND_CGMR_MASK AT_COMMAND_NO_PARAM -typedef struct at_cgmr_s {} at_cgmr_t; +typedef struct at_cgmr_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; +} at_cgmr_t; /* CIMI: Request International Mobile Subscriber Identity * ------------------------------------------------------ @@ -210,7 +226,11 @@ typedef struct at_cgmr_s {} at_cgmr_t; /* CIMI AT command type */ #define AT_COMMAND_CIMI_MASK AT_COMMAND_NO_PARAM -typedef struct at_cimi_s {} at_cimi_t; +typedef struct at_cimi_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; +} at_cimi_t; /* * ============================================== @@ -288,7 +308,11 @@ typedef struct { /* CSQ AT command type */ #define AT_COMMAND_CSQ_MASK AT_COMMAND_NO_PARAM -typedef struct at_csq_s {} at_csq_t; +typedef struct at_csq_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; +} at_csq_t; /* CESQ: Extented signal quality * ----------------------------- @@ -299,7 +323,11 @@ typedef struct at_csq_s {} at_csq_t; /* CESQ AT command type */ #define AT_COMMAND_CESQ_MASK AT_COMMAND_NO_PARAM -typedef struct at_cesq_s {} at_cesq_t; +typedef struct at_cesq_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; +} at_cesq_t; /* CLAC: List all available AT commands * ------------------------------------ @@ -310,7 +338,11 @@ typedef struct at_cesq_s {} at_cesq_t; /* CLAC AT command type */ #define AT_COMMAND_CLAC_MASK AT_COMMAND_NO_PARAM -typedef struct at_clac_s {} at_clac_t; +typedef struct at_clac_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; +} at_clac_t; /* * ========================= @@ -363,7 +395,11 @@ typedef struct { /* CNUM AT command type */ #define AT_COMMAND_CNUM_MASK AT_COMMAND_NO_PARAM -typedef struct at_cnum_s {} at_cnum_t; +typedef struct at_cnum_s { + // This dummy element is to avoid CLANG warning: empty struct has size 0 in C, size 1 in C++ + // To be removed if the structure is filled + uint32_t dummy; +} at_cnum_t; /* CLCK: Facility lock * ------------------- diff --git a/openair3/NAS/UE/EMM/SAP/emm_sap.c b/openair3/NAS/UE/EMM/SAP/emm_sap.c index 3f48cf3d8f..fcd5d6911e 100644 --- a/openair3/NAS/UE/EMM/SAP/emm_sap.c +++ b/openair3/NAS/UE/EMM/SAP/emm_sap.c @@ -111,17 +111,17 @@ int emm_sap_send(nas_user_t *user, emm_sap_t *msg) if ( (primitive > (emm_primitive_t)EMMREG_PRIMITIVE_MIN) && (primitive < (emm_primitive_t)EMMREG_PRIMITIVE_MAX) ) { /* Forward to the EMMREG-SAP */ - msg->u.emm_reg.primitive = primitive; + msg->u.emm_reg.primitive = (emm_reg_primitive_t) primitive; rc = emm_reg_send(user, &msg->u.emm_reg); } else if ( (primitive > (emm_primitive_t)EMMESM_PRIMITIVE_MIN) && (primitive < (emm_primitive_t)EMMESM_PRIMITIVE_MAX) ) { /* Forward to the EMMESM-SAP */ - msg->u.emm_esm.primitive = primitive; + msg->u.emm_esm.primitive = (emm_esm_primitive_t) primitive; rc = emm_esm_send(user, &msg->u.emm_esm); } else if ( (primitive > (emm_primitive_t)EMMAS_PRIMITIVE_MIN) && (primitive < (emm_primitive_t)EMMAS_PRIMITIVE_MAX) ) { /* Forward to the EMMAS-SAP */ - msg->u.emm_as.primitive = primitive; + msg->u.emm_as.primitive = (emm_as_primitive_t) primitive; rc = emm_as_send(user, &msg->u.emm_as); } else { diff --git a/openair3/NGAP/ngap_gNB_context_management_procedures.c b/openair3/NGAP/ngap_gNB_context_management_procedures.c index 8d3c20d218..c9db35e8c8 100644 --- a/openair3/NGAP/ngap_gNB_context_management_procedures.c +++ b/openair3/NGAP/ngap_gNB_context_management_procedures.c @@ -188,8 +188,31 @@ int ngap_ue_context_release_req(instance_t instance, ie->criticality = NGAP_Criticality_ignore; ie->value.present = NGAP_UEContextReleaseRequest_IEs__value_PR_Cause; DevAssert(ue_release_req_p->cause <= NGAP_Cause_PR_choice_ExtensionS); - ie->value.choice.Cause.present = ue_release_req_p->cause; - ie->value.choice.Cause.choice.misc = ue_release_req_p->cause_value; + switch(ue_release_req_p->cause){ + case NGAP_CAUSE_RADIO_NETWORK: + ie->value.choice.Cause.present = NGAP_Cause_PR_radioNetwork; + ie->value.choice.Cause.choice.radioNetwork = ue_release_req_p->cause_value; + break; + case NGAP_CAUSE_TRANSPORT: + ie->value.choice.Cause.present = NGAP_Cause_PR_transport; + ie->value.choice.Cause.choice.transport = ue_release_req_p->cause_value; + break; + case NGAP_CAUSE_NAS: + ie->value.choice.Cause.present = NGAP_Cause_PR_nas; + ie->value.choice.Cause.choice.nas = ue_release_req_p->cause_value; + break; + case NGAP_CAUSE_PROTOCOL: + ie->value.choice.Cause.present = NGAP_Cause_PR_protocol; + ie->value.choice.Cause.choice.protocol = ue_release_req_p->cause_value; + break; + case NGAP_CAUSE_MISC: + ie->value.choice.Cause.present = NGAP_Cause_PR_misc; + ie->value.choice.Cause.choice.misc = ue_release_req_p->cause_value; + break; + default: + NGAP_WARN("Received NG Error indication cause NGAP_Cause_PR_choice_Extensions\n"); + break; + } } if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) { diff --git a/openair3/NGAP/ngap_gNB_nas_procedures.c b/openair3/NGAP/ngap_gNB_nas_procedures.c index fdbe6ce0f9..069f3ce48b 100644 --- a/openair3/NGAP/ngap_gNB_nas_procedures.c +++ b/openair3/NGAP/ngap_gNB_nas_procedures.c @@ -665,30 +665,35 @@ int ngap_gNB_initial_ctxt_resp(instance_t instance, ngap_initial_context_setup_r item->pDUSessionID = initial_ctxt_resp_p->pdusessions_failed[i].pdusession_id; /* cause */ - pdusessionUnTransfer.cause.present = initial_ctxt_resp_p->pdusessions_failed[i].cause; - switch (pdusessionUnTransfer.cause.present) { + switch(initial_ctxt_resp_p->pdusessions_failed[i].cause) { case NGAP_CAUSE_RADIO_NETWORK: + pdusessionUnTransfer.cause.present = NGAP_Cause_PR_radioNetwork; pdusessionUnTransfer.cause.choice.radioNetwork = initial_ctxt_resp_p->pdusessions_failed[i].cause_value; break; case NGAP_CAUSE_TRANSPORT: + pdusessionUnTransfer.cause.present = NGAP_Cause_PR_transport; pdusessionUnTransfer.cause.choice.transport = initial_ctxt_resp_p->pdusessions_failed[i].cause_value; break; case NGAP_CAUSE_NAS: + pdusessionUnTransfer.cause.present = NGAP_Cause_PR_nas; pdusessionUnTransfer.cause.choice.nas = initial_ctxt_resp_p->pdusessions_failed[i].cause_value; break; case NGAP_CAUSE_PROTOCOL: + pdusessionUnTransfer.cause.present = NGAP_Cause_PR_protocol; pdusessionUnTransfer.cause.choice.protocol = initial_ctxt_resp_p->pdusessions_failed[i].cause_value; break; case NGAP_CAUSE_MISC: + pdusessionUnTransfer.cause.present = NGAP_Cause_PR_misc; pdusessionUnTransfer.cause.choice.misc = initial_ctxt_resp_p->pdusessions_failed[i].cause_value; break; case NGAP_CAUSE_NOTHING: - default: + default: + LOG_E(NR_RRC, "Unknown PDU session failure cause %d\n", initial_ctxt_resp_p->pdusessions_failed[i].cause); break; } @@ -928,33 +933,37 @@ int ngap_gNB_pdusession_setup_resp(instance_t instance, ngap_pdusession_setup_re item->pDUSessionID = pdusession_failed->pdusession_id; /* cause */ - pdusessionUnTransfer_p.cause.present = pdusession_failed->cause; - switch (pdusessionUnTransfer_p.cause.present) { + switch(pdusession_failed->cause) { case NGAP_CAUSE_RADIO_NETWORK: + pdusessionUnTransfer_p.cause.present = NGAP_Cause_PR_radioNetwork; pdusessionUnTransfer_p.cause.choice.radioNetwork = pdusession_failed->cause_value; break; case NGAP_CAUSE_TRANSPORT: + pdusessionUnTransfer_p.cause.present = NGAP_Cause_PR_transport; pdusessionUnTransfer_p.cause.choice.transport = pdusession_failed->cause_value; break; case NGAP_CAUSE_NAS: + pdusessionUnTransfer_p.cause.present = NGAP_Cause_PR_nas; pdusessionUnTransfer_p.cause.choice.nas = pdusession_failed->cause_value; break; case NGAP_CAUSE_PROTOCOL: + pdusessionUnTransfer_p.cause.present = NGAP_Cause_PR_protocol; pdusessionUnTransfer_p.cause.choice.protocol = pdusession_failed->cause_value; break; case NGAP_CAUSE_MISC: + pdusessionUnTransfer_p.cause.present = NGAP_Cause_PR_misc; pdusessionUnTransfer_p.cause.choice.misc = pdusession_failed->cause_value; break; case NGAP_CAUSE_NOTHING: - default: + default: + LOG_E(NR_RRC, "Unknown PDU session failure cause %d\n", pdusession_failed->cause); break; } - NGAP_DEBUG("pdusession setup response: failed pdusession ID %ld\n", item->pDUSessionID); asn_encode_to_new_buffer_result_t res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_PDUSessionResourceSetupUnsuccessfulTransfer, &pdusessionUnTransfer_p); @@ -1087,32 +1096,37 @@ int ngap_gNB_pdusession_modify_resp(instance_t instance, ngap_pdusession_modify_ item->pDUSessionID = pdusession_modify_resp_p->pdusessions_failed[i].pdusession_id; NGAP_PDUSessionResourceModifyUnsuccessfulTransfer_t pdusessionTransfer = {0}; - pdusessionTransfer.cause.present = pdusession_modify_resp_p->pdusessions_failed[i].cause; - switch (pdusessionTransfer.cause.present) { + switch(pdusession_modify_resp_p->pdusessions_failed[i].cause) { case NGAP_CAUSE_RADIO_NETWORK: - pdusessionTransfer.cause.choice.radioNetwork = pdusession_modify_resp_p->pdusessions_failed[i].cause_value; + pdusessionTransfer.cause.present = NGAP_Cause_PR_radioNetwork; + pdusessionTransfer.cause.choice.radioNetwork = pdusession_modify_resp_p->pdusessions_failed[i].cause_value; break; case NGAP_CAUSE_TRANSPORT: + pdusessionTransfer.cause.present = NGAP_Cause_PR_transport; pdusessionTransfer.cause.choice.transport = pdusession_modify_resp_p->pdusessions_failed[i].cause_value; break; case NGAP_CAUSE_NAS: + pdusessionTransfer.cause.present = NGAP_Cause_PR_nas; pdusessionTransfer.cause.choice.nas = pdusession_modify_resp_p->pdusessions_failed[i].cause_value; break; case NGAP_CAUSE_PROTOCOL: + pdusessionTransfer.cause.present = NGAP_Cause_PR_protocol; pdusessionTransfer.cause.choice.protocol = pdusession_modify_resp_p->pdusessions_failed[i].cause_value; break; case NGAP_CAUSE_MISC: + pdusessionTransfer.cause.present = NGAP_Cause_PR_misc; pdusessionTransfer.cause.choice.misc = pdusession_modify_resp_p->pdusessions_failed[i].cause_value; break; case NGAP_CAUSE_NOTHING: default: - break; + LOG_E(NR_RRC, "Unknown PDU session failure cause %d\n", pdusession_modify_resp_p->pdusessions_failed[i].cause); + break; } asn_encode_to_new_buffer_result_t res = {0}; diff --git a/radio/iqplayer/iqplayer_lib.c b/radio/iqplayer/iqplayer_lib.c index 7ac587bb95..2df57c9202 100644 --- a/radio/iqplayer/iqplayer_lib.c +++ b/radio/iqplayer/iqplayer_lib.c @@ -43,16 +43,11 @@ static void busy_wait(uint32_t usecs) { uint32_t elapsed_usecs; - double temp; - int j; struct timespec requestStart, requestEnd; // Active wait clock_gettime(CLOCK_REALTIME, &requestStart); - temp = 0; while (1) { - for (j=0; j < 40; j++) - temp += sin(j); clock_gettime(CLOCK_REALTIME, &requestEnd); elapsed_usecs = ( requestEnd.tv_sec - requestStart.tv_sec ) / 1e-6 + ( requestEnd.tv_nsec - requestStart.tv_nsec ) / 1e3; diff --git a/radio/rfsimulator/simulator.c b/radio/rfsimulator/simulator.c index bcd568cd50..4db78e9659 100644 --- a/radio/rfsimulator/simulator.c +++ b/radio/rfsimulator/simulator.c @@ -77,15 +77,15 @@ /*-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ #define simOpt PARAMFLAG_NOFREE|PARAMFLAG_CMDLINE_NOPREFIXENABLED #define RFSIMULATOR_PARAMS_DESC { \ - {"serveraddr", "\n", simOpt, strptr:&rfsimulator->ip, defstrval:"127.0.0.1", TYPE_STRING, 0 },\ - {"serverport", "\n", simOpt, u16ptr:&(rfsimulator->port), defuintval:PORT, TYPE_UINT16, 0 },\ - {RFSIMU_OPTIONS_PARAMNAME, RFSIM_CONFIG_HELP_OPTIONS, 0, strlistptr:NULL, defstrlistval:NULL, TYPE_STRINGLIST,0 },\ - {"IQfile", "\n",simOpt, strptr:&saveF, defstrval:"/tmp/rfsimulator.iqs",TYPE_STRING, 0 },\ - {"modelname", "\n", simOpt, strptr:&modelname, defstrval:"AWGN", TYPE_STRING, 0 },\ - {"ploss", "\n", simOpt, dblptr:&(rfsimulator->chan_pathloss), defdblval:0, TYPE_DOUBLE, 0 },\ - {"forgetfact", "\n", simOpt, dblptr:&(rfsimulator->chan_forgetfact), defdblval:0, TYPE_DOUBLE, 0 },\ - {"offset", "\n", simOpt, iptr:&(rfsimulator->chan_offset), defintval:0, TYPE_INT, 0 },\ - {"wait_timeout", "\n", simOpt, iptr:&(rfsimulator->wait_timeout), defintval:1, TYPE_INT, 0 },\ + {"serveraddr", "\n", simOpt, .strptr=&rfsimulator->ip, .defstrval="127.0.0.1", TYPE_STRING, 0 },\ + {"serverport", "\n", simOpt, .u16ptr=&(rfsimulator->port), .defuintval=PORT, TYPE_UINT16, 0 },\ + {RFSIMU_OPTIONS_PARAMNAME, RFSIM_CONFIG_HELP_OPTIONS, 0, .strlistptr=NULL, .defstrlistval=NULL, TYPE_STRINGLIST,0 },\ + {"IQfile", "\n",simOpt, .strptr=&saveF, .defstrval="/tmp/rfsimulator.iqs",TYPE_STRING, 0 },\ + {"modelname", "\n", simOpt, .strptr=&modelname, .defstrval="AWGN", TYPE_STRING, 0 },\ + {"ploss", "\n", simOpt, .dblptr=&(rfsimulator->chan_pathloss), .defdblval=0, TYPE_DOUBLE, 0 },\ + {"forgetfact", "\n", simOpt, .dblptr=&(rfsimulator->chan_forgetfact),.defdblval=0, TYPE_DOUBLE, 0 },\ + {"offset", "\n", simOpt, .iptr=&(rfsimulator->chan_offset), .defintval=0, TYPE_INT, 0 },\ + {"wait_timeout", "\n", simOpt, .iptr=&(rfsimulator->wait_timeout), .defintval=1, TYPE_INT, 0 },\ }; static void getset_currentchannels_type(char *buf, int debug, webdatadef_t *tdata, telnet_printfunc_t prnt); @@ -557,12 +557,12 @@ static int startServer(openair0_device *device) { int enable = 1; AssertFatal(setsockopt(t->listen_sock, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int)) == 0, ""); struct sockaddr_in addr = { -sin_family: +.sin_family= AF_INET, -sin_port: +.sin_port= htons(t->port), -sin_addr: - { s_addr: INADDR_ANY } +.sin_addr= + { .s_addr= INADDR_ANY } }; int rc = bind(t->listen_sock, (struct sockaddr *)&addr, sizeof(addr)); AssertFatal(rc == 0, "bind failed: errno %d, %s", errno, strerror(errno)); @@ -580,12 +580,12 @@ static int startClient(openair0_device *device) { int sock; AssertFatal((sock = socket(AF_INET, SOCK_STREAM, 0)) >= 0, ""); struct sockaddr_in addr = { -sin_family: +.sin_family= AF_INET, -sin_port: +.sin_port= htons(t->port), -sin_addr: - { s_addr: INADDR_ANY } +.sin_addr= + { .s_addr= INADDR_ANY } }; addr.sin_addr.s_addr = inet_addr(t->ip); bool connected=false; @@ -634,7 +634,7 @@ static int rfsimulator_write_internal(rfsimulator_state_t *t, openair0_timestamp } } - if ( t->lastWroteTS != 0 && abs((double)t->lastWroteTS-timestamp) > (double)CirSize) + if ( t->lastWroteTS != 0 && fabs((double)t->lastWroteTS-timestamp) > (double)CirSize) LOG_E(HW,"Discontinuous TX gap too large Tx:%lu, %lu\n", t->lastWroteTS, timestamp); if (t->lastWroteTS > timestamp+nsamps) @@ -770,7 +770,7 @@ static bool flushInput(rfsimulator_state_t *t, int timeout, int nsamps_for_initi pthread_mutex_lock(&Sockmutex); - if (t->lastWroteTS != 0 && ( abs((double)t->lastWroteTS-b->lastReceivedTS) > (double)CirSize)) + if (t->lastWroteTS != 0 && (fabs((double)t->lastWroteTS-b->lastReceivedTS) > (double)CirSize)) LOG_E(HW,"UEsock: %d Tx/Rx shift too large Tx:%lu, Rx:%lu\n", fd, t->lastWroteTS, b->lastReceivedTS); pthread_mutex_unlock(&Sockmutex);