merge functions conj(a)*b and a*conj(b)

This commit is contained in:
Laurent THOMAS
2025-04-25 14:47:59 +02:00
parent bb93b06663
commit fefb96a115
13 changed files with 70 additions and 144 deletions
+11 -11
View File
@@ -128,10 +128,10 @@ void lte_sync_timefreq(PHY_VARS_UE *ue,int band,unsigned int DL_freq)
for (re = 0; re<256/4; re++) { // loop over 256 points of upsampled PSS
simde__m128i s = sp2[re];
autocorr0[re256] = oai_mm_cpx_mult_conjb(((simde__m128i *)pss6144_0)[re], s, 15);
autocorr1[re256] = oai_mm_cpx_mult_conjb(((simde__m128i *)pss6144_1)[re], s, 15);
autocorr2[re256] = oai_mm_cpx_mult_conjb(((simde__m128i *)pss6144_2)[re], s, 15);
autocorr0[re256] = oai_mm_cpx_mult_conj(s, ((simde__m128i *)pss6144_0)[re], 15);
autocorr1[re256] = oai_mm_cpx_mult_conj(s, ((simde__m128i *)pss6144_1)[re], 15);
autocorr2[re256] = oai_mm_cpx_mult_conj(s, ((simde__m128i *)pss6144_2)[re], 15);
re256 = (re256+1)&0x3f;
}
} else { // Split around DC, this is the negative frequencies
@@ -172,10 +172,10 @@ void lte_sync_timefreq(PHY_VARS_UE *ue,int band,unsigned int DL_freq)
for (re = 0; re<(-f+3)/4; re++) { // loop over 256 points of upsampled PSS
simde__m128i s = sp2[re];
autocorr0[re256] = oai_mm_cpx_mult_conjb(((simde__m128i *)pss6144_0)[re], s, 15);
autocorr1[re256] = oai_mm_cpx_mult_conjb(((simde__m128i *)pss6144_1)[re], s, 15);
autocorr2[re256] = oai_mm_cpx_mult_conjb(((simde__m128i *)pss6144_2)[re], s, 15);
autocorr0[re256] = oai_mm_cpx_mult_conj(s, ((simde__m128i *)pss6144_0)[re], 15);
autocorr1[re256] = oai_mm_cpx_mult_conj(s, ((simde__m128i *)pss6144_1)[re], 15);
autocorr2[re256] = oai_mm_cpx_mult_conj(s, ((simde__m128i *)pss6144_2)[re], 15);
re256 = (re256+1)&0x3f;
}
@@ -212,9 +212,9 @@ void lte_sync_timefreq(PHY_VARS_UE *ue,int band,unsigned int DL_freq)
for (re = 0; re<(256+f)/4; re++) { // loop over 256 points of upsampled PSS
simde__m128i s = sp2[re];
autocorr0[re256] = oai_mm_cpx_mult_conjb(((simde__m128i *)pss6144_0)[re], s, 15);
autocorr1[re256] = oai_mm_cpx_mult_conjb(((simde__m128i *)pss6144_1)[re], s, 15);
autocorr2[re256] = oai_mm_cpx_mult_conjb(((simde__m128i *)pss6144_2)[re], s, 15);
autocorr0[re256] = oai_mm_cpx_mult_conj(s, ((simde__m128i *)pss6144_0)[re], 15);
autocorr1[re256] = oai_mm_cpx_mult_conj(s, ((simde__m128i *)pss6144_1)[re], 15);
autocorr2[re256] = oai_mm_cpx_mult_conj(s, ((simde__m128i *)pss6144_2)[re], 15);
re256 = (re256+1)&0x3f;
}
@@ -467,7 +467,7 @@ void conjch0_mult_ch1(int *ch0,
for (unsigned short rb=0; rb<3*nb_rb; rb++) {
ch0conj_ch1_128[rb] = oai_mm_cpx_mult_conja(dl_ch0_128[rb], dl_ch1_128[rb], output_shift0);
ch0conj_ch1_128[rb] = oai_mm_cpx_mult_conj(dl_ch0_128[rb], dl_ch1_128[rb], output_shift0);
#ifdef DEBUG_RANK_EST
printf("\n Computing conjugates \n");
@@ -142,7 +142,7 @@ int32_t lte_ul_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms,
ul_ref128 = (simde__m128i *)ul_ref_sigs_rx[u][v][Msc_RS_idx];
for (i = 0; i < Msc_RS >> 2; i++) {
ul_ch128[i] = oai_mm_cpx_mult_conja(ul_ref128[i], rxdataF128[i], 15);
ul_ch128[i] = oai_mm_cpx_mult_conj(ul_ref128[i], rxdataF128[i], 15);
}
alpha_ind = 0;
@@ -370,7 +370,7 @@ int32_t lte_ul_channel_estimation_RRU(LTE_DL_FRAME_PARMS *frame_parms,
ul_ref128 = (simde__m128i *)ul_ref_sigs_rx[u][v][Msc_RS_idx];
for (i = 0; i < Msc_RS >> 2; i++) {
ul_ch128[i] = oai_mm_cpx_mult_conja(ul_ref128[i], rxdataF128[i], 15);
ul_ch128[i] = oai_mm_cpx_mult_conj(ul_ref128[i], rxdataF128[i], 15);
}
alpha_ind = 0;
@@ -659,9 +659,9 @@ int16_t lte_ul_freq_offset_estimation(LTE_DL_FRAME_PARMS *frame_parms, int32_t *
// correlate and average the 2 channel estimates ul_ch1*ul_ch2
for (int rb=0; rb<nb_rb; rb++) {
simde__m128i R[3];
R[0] = oai_mm_cpx_mult_conja(ul_ch1[0], ul_ch2[0], output_shift);
R[1] = oai_mm_cpx_mult_conja(ul_ch1[1], ul_ch2[1], output_shift);
R[2] = oai_mm_cpx_mult_conja(ul_ch1[2], ul_ch2[2], output_shift);
R[0] = oai_mm_cpx_mult_conj(ul_ch1[0], ul_ch2[0], output_shift);
R[1] = oai_mm_cpx_mult_conj(ul_ch1[1], ul_ch2[1], output_shift);
R[2] = oai_mm_cpx_mult_conj(ul_ch1[2], ul_ch2[2], output_shift);
// Horizontal add
R[0] = simde_mm_add_epi16(simde_mm_srai_epi16(R[0], 1), simde_mm_srai_epi16(R[1], 1));
+2 -2
View File
@@ -910,7 +910,7 @@ void pdcch_channel_compensation(int32_t **rxdataF_ext,
for (uint16_t rb=0; rb<frame_parms->N_RB_DL*len_rb; rb++) {
// multiply by conjugated channel
rxdataF_comp128[rb] = oai_mm_cpx_mult_conja(dl_ch128[rb], rxdataF128[rb], output_shift);
rxdataF_comp128[rb] = oai_mm_cpx_mult_conj(dl_ch128[rb], rxdataF128[rb], output_shift);
}
}
}
@@ -925,7 +925,7 @@ void pdcch_channel_compensation(int32_t **rxdataF_ext,
for (uint16_t rb=0; rb<frame_parms->N_RB_DL*3; rb++) {
// multiply by conjugated channel
rho128[rb] = oai_mm_cpx_mult_conja(dl_ch128[rb], dl_ch128_2[rb], output_shift);
rho128[rb] = oai_mm_cpx_mult_conj(dl_ch128[rb], dl_ch128_2[rb], output_shift);
}
}
@@ -1340,12 +1340,12 @@ void dlsch_channel_compensation(int **rxdataF_ext,
}
// multiply by conjugated channel
rxdataF_comp128[0] = oai_mm_cpx_mult_conja(dl_ch128[0], rxdataF128[0], output_shift);
rxdataF_comp128[1] = oai_mm_cpx_mult_conja(dl_ch128[1], rxdataF128[1], output_shift);
rxdataF_comp128[0] = oai_mm_cpx_mult_conj(dl_ch128[0], rxdataF128[0], output_shift);
rxdataF_comp128[1] = oai_mm_cpx_mult_conj(dl_ch128[1], rxdataF128[1], output_shift);
if (pilots==0) {
// multiply by conjugated channel
rxdataF_comp128[2] = oai_mm_cpx_mult_conja(dl_ch128[2], rxdataF128[2], output_shift);
rxdataF_comp128[2] = oai_mm_cpx_mult_conj(dl_ch128[2], rxdataF128[2], output_shift);
dl_ch128+=3;
dl_ch_mag128+=3;
dl_ch_mag128b+=3;
@@ -1370,7 +1370,7 @@ void dlsch_channel_compensation(int **rxdataF_ext,
for (rb=0; rb<3*nb_rb; rb++) {
// multiply by conjugated channel
rho128[rb] = oai_mm_cpx_mult_conja(dl_ch128[rb], dl_ch128_2[rb], output_shift);
rho128[rb] = oai_mm_cpx_mult_conj(dl_ch128[rb], dl_ch128_2[rb], output_shift);
}
if (first_symbol_flag==1) {
@@ -1449,8 +1449,8 @@ void dlsch_channel_compensation_core(int **rxdataF_ext,
}
// multiply by conjugated channel
rxdataF_comp128[0] = oai_mm_cpx_mult_conja(dl_ch128[0], rxdataF128[0], output_shift);
rxdataF_comp128[1] = oai_mm_cpx_mult_conja(dl_ch128[1], rxdataF128[1], output_shift);
rxdataF_comp128[0] = oai_mm_cpx_mult_conj(dl_ch128[0], rxdataF128[0], output_shift);
rxdataF_comp128[1] = oai_mm_cpx_mult_conj(dl_ch128[1], rxdataF128[1], output_shift);
dl_ch128+=2;
dl_ch_mag128+=2;
dl_ch_mag128b+=2;
@@ -1474,8 +1474,8 @@ void dlsch_channel_compensation_core(int **rxdataF_ext,
if (length_mod8 == 0) {
for (ii=0; ii<length>>3; ++ii) {
// multiply by conjugated channel
rho128[0] = oai_mm_cpx_mult_conja(dl_ch128[0], dl_ch128_2[0], output_shift);
rho128[1] = oai_mm_cpx_mult_conja(dl_ch128[1], dl_ch128_2[1], output_shift);
rho128[0] = oai_mm_cpx_mult_conj(dl_ch128[0], dl_ch128_2[0], output_shift);
rho128[1] = oai_mm_cpx_mult_conj(dl_ch128[1], dl_ch128_2[1], output_shift);
dl_ch128+=2;
dl_ch128_2+=2;
rho128+=2;
@@ -1691,12 +1691,12 @@ void dlsch_channel_compensation_TM56(int **rxdataF_ext,
}
// MF multiply by conjugated channel
rxdataF_comp128[0] = oai_mm_cpx_mult_conja(dl_ch0_128[0], rxdataF128[0], output_shift);
rxdataF_comp128[1] = oai_mm_cpx_mult_conja(dl_ch0_128[1], rxdataF128[1], output_shift);
rxdataF_comp128[0] = oai_mm_cpx_mult_conj(dl_ch0_128[0], rxdataF128[0], output_shift);
rxdataF_comp128[1] = oai_mm_cpx_mult_conj(dl_ch0_128[1], rxdataF128[1], output_shift);
if (pilots==0) {
// multiply by conjugated channel
rxdataF_comp128[2] = oai_mm_cpx_mult_conja(dl_ch0_128[2], rxdataF128[2], output_shift);
rxdataF_comp128[2] = oai_mm_cpx_mult_conj(dl_ch0_128[2], rxdataF128[2], output_shift);
dl_ch0_128+=3;
dl_ch1_128+=3;
dl_ch_mag128+=3;
@@ -1966,22 +1966,22 @@ void dlsch_channel_compensation_TM34(LTE_DL_FRAME_PARMS *frame_parms,
// layer 0
// MF multiply by conjugated channel
rxdataF_comp0_128[0] = oai_mm_cpx_mult_conja(dl_ch0_128[0], rxdataF128[0], output_shift0);
rxdataF_comp0_128[1] = oai_mm_cpx_mult_conja(dl_ch0_128[1], rxdataF128[1], output_shift0);
rxdataF_comp0_128[0] = oai_mm_cpx_mult_conj(dl_ch0_128[0], rxdataF128[0], output_shift0);
rxdataF_comp0_128[1] = oai_mm_cpx_mult_conj(dl_ch0_128[1], rxdataF128[1], output_shift0);
if (pilots==0) {
// multiply by conjugated channel
rxdataF_comp0_128[2] = oai_mm_cpx_mult_conja(dl_ch0_128[2], rxdataF128[2], output_shift0);
rxdataF_comp0_128[2] = oai_mm_cpx_mult_conj(dl_ch0_128[2], rxdataF128[2], output_shift0);
}
// layer 1
// MF multiply by conjugated channel
rxdataF_comp1_128[0] = oai_mm_cpx_mult_conja(dl_ch1_128[0], rxdataF128[0], output_shift1);
rxdataF_comp1_128[1] = oai_mm_cpx_mult_conja(dl_ch1_128[1], rxdataF128[1], output_shift1);
rxdataF_comp1_128[0] = oai_mm_cpx_mult_conj(dl_ch1_128[0], rxdataF128[0], output_shift1);
rxdataF_comp1_128[1] = oai_mm_cpx_mult_conj(dl_ch1_128[1], rxdataF128[1], output_shift1);
if (pilots==0) {
// multiply by conjugated channel
rxdataF_comp1_128[2] = oai_mm_cpx_mult_conja(dl_ch1_128[2], rxdataF128[2], output_shift1);
rxdataF_comp1_128[2] = oai_mm_cpx_mult_conj(dl_ch1_128[2], rxdataF128[2], output_shift1);
dl_ch0_128+=3;
dl_ch1_128+=3;
dl_ch_mag0_128+=3;
@@ -2049,12 +2049,12 @@ void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms,
for (rb=0; rb<nb_rb; rb++) {
// multiply by conjugated channel
dl_ch_rho128[0] = oai_mm_cpx_mult_conja(dl_ch128[0], dl_ch128i[0], output_shift);
dl_ch_rho128[1] = oai_mm_cpx_mult_conja(dl_ch128[1], dl_ch128i[1], output_shift);
dl_ch_rho128[0] = oai_mm_cpx_mult_conj(dl_ch128[0], dl_ch128i[0], output_shift);
dl_ch_rho128[1] = oai_mm_cpx_mult_conj(dl_ch128[1], dl_ch128i[1], output_shift);
if (pilots==0) {
// multiply by conjugated channel
dl_ch_rho128[2] = oai_mm_cpx_mult_conja(dl_ch128[2], dl_ch128i[2], output_shift);
dl_ch_rho128[2] = oai_mm_cpx_mult_conj(dl_ch128[2], dl_ch128i[2], output_shift);
dl_ch128+=3;
dl_ch128i+=3;
dl_ch_rho128+=3;
+1 -1
View File
@@ -208,7 +208,7 @@ void pbch_channel_compensation(int **rxdataF_ext,
int len_rb = (symbol_mod > 1) ? 3 : 2;
for (uint16_t rb=0; rb<nb_rb*len_rb; rb++) {
// multiply by conjugated channel
rxdataF_comp128[rb] = oai_mm_cpx_mult_conja(dl_ch128[rb], rxdataF128[rb], output_shift);
rxdataF_comp128[rb] = oai_mm_cpx_mult_conj(dl_ch128[rb], rxdataF128[rb], output_shift);
}
}
+4 -4
View File
@@ -343,8 +343,8 @@ void mch_channel_compensation(int **rxdataF_ext,
}
// multiply by conjugated channel
rxdataF_comp128[0] = oai_mm_cpx_mult_conja(dl_ch128[0], rxdataF128[0], output_shift);
rxdataF_comp128[1] = oai_mm_cpx_mult_conja(dl_ch128[1], rxdataF128[1], output_shift);
rxdataF_comp128[0] = oai_mm_cpx_mult_conj(dl_ch128[0], rxdataF128[0], output_shift);
rxdataF_comp128[1] = oai_mm_cpx_mult_conj(dl_ch128[1], rxdataF128[1], output_shift);
dl_ch128+=2;
dl_ch_mag128+=2;
@@ -414,8 +414,8 @@ void mch_channel_compensation_khz_1dot25(int **rxdataF_ext,
}
// multiply by conjugated channel
rxdataF_comp128[0] = oai_mm_cpx_mult_conja(dl_ch128[0], rxdataF128[0], output_shift);
rxdataF_comp128[1] = oai_mm_cpx_mult_conja(dl_ch128[1], rxdataF128[1], output_shift);
rxdataF_comp128[0] = oai_mm_cpx_mult_conj(dl_ch128[0], rxdataF128[0], output_shift);
rxdataF_comp128[1] = oai_mm_cpx_mult_conj(dl_ch128[1], rxdataF128[1], output_shift);
dl_ch128+=2;
dl_ch_mag128+=2;
+1 -1
View File
@@ -73,7 +73,7 @@ void apply_7_5_kHz(PHY_VARS_UE *ue,int32_t*txdata,uint8_t slot)
for (uint32_t i = 0; i < (len >> 2); i++) {
// Real part of complex multiplication (note: 7_5kHz signal is conjugated for this to work)
txptr128[i] = oai_mm_cpx_mult_conja(kHz7_5ptr128[i], txptr128[i], 15);
txptr128[i] = oai_mm_cpx_mult_conj(kHz7_5ptr128[i], txptr128[i], 15);
}
}
@@ -274,22 +274,22 @@ static void nr_ulsch_channel_compensation(c16_t *rxFext,
for (int i = 0; i < buffer_length >> 3; i++)
{
// MRC
simde__m256i comp = oai_mm256_cpx_mult_conja(chF_256[i], rxF_256[i], output_shift);
simde__m256i comp = oai_mm256_cpx_mult_conj(chF_256[i], rxF_256[i], output_shift);
rxComp_256[i] = simde_mm256_add_epi16(rxComp_256[i], comp);
if (mod_order > 2) {
simde__m256i mag = oai_mm256_cpx_mag_squared(chF_256[i], output_shift); // |h|^2
// pack and duplicate
mag = simde_mm256_packs_epi32(mag, mag);
mag = simde_mm256_unpacklo_epi16(mag, mag);
simde__m256i mag = oai_mm256_smadd(chF_256[i], chF_256[i], output_shift); // |h|^2
// pack and duplicate
mag = simde_mm256_packs_epi32(mag, mag);
mag = simde_mm256_unpacklo_epi16(mag, mag);
rxF_ch_maga_256[i] = simde_mm256_add_epi16(rxF_ch_maga_256[i], simde_mm256_mulhrs_epi16(mag, QAM_ampa_256));
if (mod_order > 4)
rxF_ch_magb_256[i] = simde_mm256_add_epi16(rxF_ch_magb_256[i], simde_mm256_mulhrs_epi16(mag, QAM_ampb_256));
if (mod_order > 6)
rxF_ch_magc_256[i] = simde_mm256_add_epi16(rxF_ch_magc_256[i], simde_mm256_mulhrs_epi16(mag, QAM_ampc_256));
rxF_ch_maga_256[i] = simde_mm256_add_epi16(rxF_ch_maga_256[i], simde_mm256_mulhrs_epi16(mag, QAM_ampa_256));
if (mod_order > 4)
rxF_ch_magb_256[i] = simde_mm256_add_epi16(rxF_ch_magb_256[i], simde_mm256_mulhrs_epi16(mag, QAM_ampb_256));
if (mod_order > 6)
rxF_ch_magc_256[i] = simde_mm256_add_epi16(rxF_ch_magc_256[i], simde_mm256_mulhrs_epi16(mag, QAM_ampc_256));
}
}
if (rho != NULL) {
@@ -298,7 +298,7 @@ static void nr_ulsch_channel_compensation(c16_t *rxFext,
simde__m256i *chF_256 = (simde__m256i *)&chFext[(aatx * nb_rx_ant + aarx) * buffer_length];
simde__m256i *chF2_256 = (simde__m256i *)&chFext[ (atx * nb_rx_ant + aarx) * buffer_length];
for (int i = 0; i < buffer_length >> 3; i++) {
rho_256[i] = simde_mm256_adds_epi16(rho_256[i], oai_mm256_cpx_mult_conja(chF_256[i], chF2_256[i], output_shift));
rho_256[i] = simde_mm256_adds_epi16(rho_256[i], oai_mm256_cpx_mult_conj(chF_256[i], chF2_256[i], output_shift));
}
}
}
+2 -4
View File
@@ -915,8 +915,6 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
nfapi_nr_pucch_pdu_t* pucch_pdu)
{
NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
const simde__m256i conj256 = simde_mm256_set_epi16(-1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1);
//pucch_GroupHopping_t pucch_GroupHopping = pucch_pdu->group_hop_flag + (pucch_pdu->sequence_hop_flag<<1);
const int nb_symbols=pucch_pdu->nr_of_symbols;
@@ -1081,7 +1079,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
c16_t pil_dmrs[nb_re_dmrs] __attribute__((aligned(32)));
uint8_t *sGold8 = (uint8_t *)(sGold + pucch_pdu->prb_start / 4);
for (int group = 0; group < nb_re_dmrs; group += 4)
*(simde__m128i *)(pil_dmrs + group) = simde_mm_sign_epi16(byte2m128i[*sGold8++], *(simde__m128i *)&conj256);
*(simde__m128i *)(pil_dmrs + group) = oai_mm_conj(byte2m128i[*sGold8++]);
// Compute delay
c16_t ch_ls[128] __attribute__((aligned(32))) = {0};
@@ -1160,7 +1158,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
for (simde__m256i *ptr = (simde__m256i *)r_ext[aa][symb], *ptr2 = (simde__m256i *)r_ext2[aa][symb]; pil_ptr < end;
ptr++, pil_ptr++, ptr2++) {
simde__m256i tmp = simde_mm256_srai_epi16(*ptr, scaling);
*ptr2 = simde_mm256_sign_epi16(simde_mm256_sign_epi16(simde_mm256_shuffle_epi8(tmp, swap), *pil_ptr), conj256);
*ptr2 = oai_mm256_conj(simde_mm256_sign_epi16(simde_mm256_shuffle_epi8(tmp, swap), *pil_ptr));
*ptr = simde_mm256_sign_epi16(tmp, *pil_ptr);
}
}
@@ -914,9 +914,9 @@ static void nr_dlsch_channel_compensation(uint32_t rx_size_symbol,
}
// Multiply received data by conjugated channel
rxdataF_comp128[0] = oai_mm_cpx_mult_conjb(rxdataF128[0], dl_ch128[0], output_shift);
rxdataF_comp128[1] = oai_mm_cpx_mult_conjb(rxdataF128[1], dl_ch128[1], output_shift);
rxdataF_comp128[2] = oai_mm_cpx_mult_conjb(rxdataF128[2], dl_ch128[2], output_shift);
rxdataF_comp128[0] = oai_mm_cpx_mult_conj(dl_ch128[0], rxdataF128[0], output_shift);
rxdataF_comp128[1] = oai_mm_cpx_mult_conj(dl_ch128[1], rxdataF128[1], output_shift);
rxdataF_comp128[2] = oai_mm_cpx_mult_conj(dl_ch128[2], rxdataF128[2], output_shift);
dl_ch128 += 3;
dl_ch_mag128 += 3;
+1 -1
View File
@@ -49,7 +49,7 @@ void mult_cpx_conj_vector(int16_t *x1,
// SSE compute 4 cpx multiply for each loop
for(uint32_t i = 0; i < (N >> 2); i++) {
simde__m128i result = oai_mm_cpx_mult_conja(x1_128[i], x2_128[i], output_shift);
simde__m128i result = oai_mm_cpx_mult_conj(x1_128[i], x2_128[i], output_shift);
if (madd==1)
result = simde_mm_adds_epi16(y_128[i], result);
+6 -78
View File
@@ -248,51 +248,24 @@ simde__m128i oai_mm_cpx_mult(simde__m128i z1, simde__m128i z2, int shift)
}
/**
* Perform a CONJUGATE DOT PRODUCT on a 128-bit SIMD vector of 16-bit integers.
* Perform a CONJUGATE multiplication on a 128-bit SIMD vector of 16-bit integers.
*
* Input: z1 = (a + bi) [ a0, b0, ..., a3, b3]
* Input: z2 = (c + di) [ c0, d0, ..., c3, d3]
* Output: z3 = (e + fi) [ e0, f0, ..., e3, f3]
*
* swap(conj(z1)) [-b0, a0, ..., -b3, a3]
*
* z3 = conj(z1) * z2 = + (ac+bd) + (ad-bc)i
* z3 = z1 * conj(z2) = + (ac+bd) + i(bc-ad)
*
* @param 128-bit SIMD vector of four complex 16-bit integers.
* @return a 128-bit SIMD vector.
*/
__attribute__((always_inline)) static inline
simde__m128i oai_mm_cpx_mult_conja(simde__m128i a, simde__m128i b, int shift)
simde__m128i oai_mm_cpx_mult_conj(simde__m128i a, simde__m128i b, int shift)
{
simde__m128i re = oai_mm_smadd(a, b, shift);
simde__m128i im = oai_mm_smadd(oai_mm_swap(oai_mm_conj(a)), b, shift);
return oai_mm_pack(re, im);
}
/**
* Perform a DOT PRODUCT on a 128-bit SIMD vector of 16-bit integers.
*
* Input: z1 = (a + bi) [ a0, b0, ..., a3, b3]
* Input: z2 = (c + di) [ c0, d0, ..., c3, d3]
* Output: z3 = (e + fi) [ e0, f0, ..., e3, f3]
*
* swap(conj(z2)) [-d0, c0, ..., -d3, c3]
* conj(swap(z1)) [ b0, -a0, ..., b3, -a3] // alternative way
*
* z3 = z1 * conj(z2) = + (ac+bd) + (bc-ad)i
*
* @param 128-bit SIMD vector of 16-bit integers.
* @return a 128-bit SIMD vector.
*/
__attribute__((always_inline)) static inline
simde__m128i oai_mm_cpx_mult_conjb(simde__m128i a, simde__m128i b, int shift)
{
simde__m128i re = oai_mm_smadd(a, b, shift);
simde__m128i im = oai_mm_smadd(a, oai_mm_swap(oai_mm_conj(b)), shift);
//simde__m128i im = oai_mm_smadd(oai_mm_conj(oai_mm_swap(a)), b, shift); // alternative way
return oai_mm_pack(re, im);
}
/*
* OAI specific AVX2 section
*/
@@ -386,23 +359,6 @@ simde__m256i oai_mm256_pack(simde__m256i a, simde__m256i b)
);
}
/**
* Perform a COMPLEX SQUARED on a 256-bit SIMD vector of complex 16-bit integers.
*
* Input: z1 = (a + bi) [ a0, b0, ..., a7, b7 ]
* Output: z3 = (e + fi) [ e0, f0, ..., e7, f7]
*
* z3 = |z1|^2 = + (a^2+b^2)
*
* @param 256-bit SIMD vector of eight complex 16-bit integers.
* @return a 256-bit SIMD vector.
*/
__attribute__((always_inline)) static inline
simde__m256i oai_mm256_cpx_mag_squared(simde__m256i z1, int shift)
{
return oai_mm256_smadd(z1, z1, shift);
}
/**
* Perform a COMPLEX MULTIPLICATION on a 256-bit SIMD vector of complex 16-bit integers.
*
@@ -427,21 +383,18 @@ simde__m256i oai_mm256_cpx_mult(simde__m256i z1, simde__m256i z2, int shift)
}
/**
* Perform a CONJUGATE DOT PRODUCT on a 256-bit SIMD vector of complex 16-bit integers.
* Perform a CONJUGATE multiplication on a 256-bit SIMD vector of complex 16-bit integers.
*
* Input: z1 = (a + bi) [ a0, b0, ..., a3, b3]
* Input: z2 = (c + di) [ c0, d0, ..., c3, d3]
* Output: z3 = (e + fi) [ e0, f0, ..., e3, f3]
*
* swap(conj(z1)) [-b0, a0, ..., -b3, a3]
*
* z3 = conj(z1) * z2 = + (ac+bd) + (ad-bc)i
* z3 = z1 * conj(z2) = (ac+bd) + i(bc-ad)
*
* @param 256-bit SIMD vector of eight complex 16-bit integers.
* @return a 256-bit SIMD vector.
*/
__attribute__((always_inline)) static inline
simde__m256i oai_mm256_cpx_mult_conja(simde__m256i a, simde__m256i b, int shift)
simde__m256i oai_mm256_cpx_mult_conj(simde__m256i a, simde__m256i b, int shift)
{
simde__m256i re = oai_mm256_smadd(a, b, shift);
simde__m256i im = oai_mm256_smadd(oai_mm256_swap(oai_mm256_conj(a)), b, shift);
@@ -457,31 +410,6 @@ void oai_mm256_combine_vectors(simde__m128i a_re, simde__m128i a_im, simde__m256
);
}
/**
* Perform a DOT PRODUCT on a 256-bit SIMD vector of complex 16-bit integers.
*
* Input: z1 = (a + bi) [ a0, b0, ..., a3, b3]
* Input: z2 = (c + di) [ c0, d0, ..., c3, d3]
* Output: z3 = (e + fi) [ e0, f0, ..., e3, f3]
*
* swap(conj(z2)) [-d0, c0, ..., -d3, c3]
* conj(swap(z1)) [ b0, -a0, ..., b3, -a3] // alternative way
*
* z3 = z1 * conj(z2) = + (ac+bd) + (bc-ad)i
*
* @param 256-bit SIMD vector of eight complex 16-bit integers.
* @return a 256-bit SIMD vector.
*/
__attribute__((always_inline)) static inline
simde__m256i oai_mm256_cpx_mult_conjb(simde__m256i a, simde__m256i b, int shift)
{
simde__m256i re = oai_mm256_smadd(a, b, shift);
simde__m256i im = oai_mm256_smadd(a, oai_mm256_swap(oai_mm256_conj(b)), shift);
//simde__m256i im = oai_mm256_smadd(oai_mm256_conj(oai_mm256_swap(a)), b, shift); // alternative way
return oai_mm256_pack(re, im);
}
// Function to separate the real and imaginary parts from the combined 256-bit vector
__attribute__((always_inline)) static inline
void oai_mm256_separate_vectors(simde__m256i combined, simde__m128i *re, simde__m128i *im) {