diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c index 742630c672..50a2da40fb 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c @@ -961,125 +961,14 @@ void nr_ulsch_qam16_qam16(c16_t *stream0_in, simde__m128i rho_rpi __attribute__((aligned(16))); simde__m128i rho_rmi __attribute__((aligned(16))); - simde__m128i rho_rpi_1_1 __attribute__((aligned(16))); - simde__m128i rho_rpi_1_3 __attribute__((aligned(16))); - simde__m128i rho_rpi_3_1 __attribute__((aligned(16))); - simde__m128i rho_rpi_3_3 __attribute__((aligned(16))); - simde__m128i rho_rmi_1_1 __attribute__((aligned(16))); - simde__m128i rho_rmi_1_3 __attribute__((aligned(16))); - simde__m128i rho_rmi_3_1 __attribute__((aligned(16))); - simde__m128i rho_rmi_3_3 __attribute__((aligned(16))); - - simde__m128i psi_r_m3_m3 __attribute__((aligned(16))); - simde__m128i psi_r_m3_m1 __attribute__((aligned(16))); - simde__m128i psi_r_m3_p1 __attribute__((aligned(16))); - simde__m128i psi_r_m3_p3 __attribute__((aligned(16))); - simde__m128i psi_r_m1_m3 __attribute__((aligned(16))); - simde__m128i psi_r_m1_m1 __attribute__((aligned(16))); - simde__m128i psi_r_m1_p1 __attribute__((aligned(16))); - simde__m128i psi_r_m1_p3 __attribute__((aligned(16))); - simde__m128i psi_r_p1_m3 __attribute__((aligned(16))); - simde__m128i psi_r_p1_m1 __attribute__((aligned(16))); - simde__m128i psi_r_p1_p1 __attribute__((aligned(16))); - simde__m128i psi_r_p1_p3 __attribute__((aligned(16))); - simde__m128i psi_r_p3_m3 __attribute__((aligned(16))); - simde__m128i psi_r_p3_m1 __attribute__((aligned(16))); - simde__m128i psi_r_p3_p1 __attribute__((aligned(16))); - simde__m128i psi_r_p3_p3 __attribute__((aligned(16))); - - simde__m128i psi_i_m3_m3 __attribute__((aligned(16))); - simde__m128i psi_i_m3_m1 __attribute__((aligned(16))); - simde__m128i psi_i_m3_p1 __attribute__((aligned(16))); - simde__m128i psi_i_m3_p3 __attribute__((aligned(16))); - simde__m128i psi_i_m1_m3 __attribute__((aligned(16))); - simde__m128i psi_i_m1_m1 __attribute__((aligned(16))); - simde__m128i psi_i_m1_p1 __attribute__((aligned(16))); - simde__m128i psi_i_m1_p3 __attribute__((aligned(16))); - simde__m128i psi_i_p1_m3 __attribute__((aligned(16))); - simde__m128i psi_i_p1_m1 __attribute__((aligned(16))); - simde__m128i psi_i_p1_p1 __attribute__((aligned(16))); - simde__m128i psi_i_p1_p3 __attribute__((aligned(16))); - simde__m128i psi_i_p3_m3 __attribute__((aligned(16))); - simde__m128i psi_i_p3_m1 __attribute__((aligned(16))); - simde__m128i psi_i_p3_p1 __attribute__((aligned(16))); - simde__m128i psi_i_p3_p3 __attribute__((aligned(16))); - - simde__m128i a_r_m3_m3 __attribute__((aligned(16))); - simde__m128i a_r_m3_m1 __attribute__((aligned(16))); - simde__m128i a_r_m3_p1 __attribute__((aligned(16))); - simde__m128i a_r_m3_p3 __attribute__((aligned(16))); - simde__m128i a_r_m1_m3 __attribute__((aligned(16))); - simde__m128i a_r_m1_m1 __attribute__((aligned(16))); - simde__m128i a_r_m1_p1 __attribute__((aligned(16))); - simde__m128i a_r_m1_p3 __attribute__((aligned(16))); - simde__m128i a_r_p1_m3 __attribute__((aligned(16))); - simde__m128i a_r_p1_m1 __attribute__((aligned(16))); - simde__m128i a_r_p1_p1 __attribute__((aligned(16))); - simde__m128i a_r_p1_p3 __attribute__((aligned(16))); - simde__m128i a_r_p3_m3 __attribute__((aligned(16))); - simde__m128i a_r_p3_m1 __attribute__((aligned(16))); - simde__m128i a_r_p3_p1 __attribute__((aligned(16))); - simde__m128i a_r_p3_p3 __attribute__((aligned(16))); - - simde__m128i a_i_m3_m3 __attribute__((aligned(16))); - simde__m128i a_i_m3_m1 __attribute__((aligned(16))); - simde__m128i a_i_m3_p1 __attribute__((aligned(16))); - simde__m128i a_i_m3_p3 __attribute__((aligned(16))); - simde__m128i a_i_m1_m3 __attribute__((aligned(16))); - simde__m128i a_i_m1_m1 __attribute__((aligned(16))); - simde__m128i a_i_m1_p1 __attribute__((aligned(16))); - simde__m128i a_i_m1_p3 __attribute__((aligned(16))); - simde__m128i a_i_p1_m3 __attribute__((aligned(16))); - simde__m128i a_i_p1_m1 __attribute__((aligned(16))); - simde__m128i a_i_p1_p1 __attribute__((aligned(16))); - simde__m128i a_i_p1_p3 __attribute__((aligned(16))); - simde__m128i a_i_p3_m3 __attribute__((aligned(16))); - simde__m128i a_i_p3_m1 __attribute__((aligned(16))); - simde__m128i a_i_p3_p1 __attribute__((aligned(16))); - simde__m128i a_i_p3_p3 __attribute__((aligned(16))); - - simde__m128i psi_a_m3_m3 __attribute__((aligned(16))); - simde__m128i psi_a_m3_m1 __attribute__((aligned(16))); - simde__m128i psi_a_m3_p1 __attribute__((aligned(16))); - simde__m128i psi_a_m3_p3 __attribute__((aligned(16))); - simde__m128i psi_a_m1_m3 __attribute__((aligned(16))); - simde__m128i psi_a_m1_m1 __attribute__((aligned(16))); - simde__m128i psi_a_m1_p1 __attribute__((aligned(16))); - simde__m128i psi_a_m1_p3 __attribute__((aligned(16))); - simde__m128i psi_a_p1_m3 __attribute__((aligned(16))); - simde__m128i psi_a_p1_m1 __attribute__((aligned(16))); - simde__m128i psi_a_p1_p1 __attribute__((aligned(16))); - simde__m128i psi_a_p1_p3 __attribute__((aligned(16))); - simde__m128i psi_a_p3_m3 __attribute__((aligned(16))); - simde__m128i psi_a_p3_m1 __attribute__((aligned(16))); - simde__m128i psi_a_p3_p1 __attribute__((aligned(16))); - simde__m128i psi_a_p3_p3 __attribute__((aligned(16))); - - simde__m128i a_sq_m3_m3 __attribute__((aligned(16))); - simde__m128i a_sq_m3_m1 __attribute__((aligned(16))); - simde__m128i a_sq_m3_p1 __attribute__((aligned(16))); - simde__m128i a_sq_m3_p3 __attribute__((aligned(16))); - simde__m128i a_sq_m1_m3 __attribute__((aligned(16))); - simde__m128i a_sq_m1_m1 __attribute__((aligned(16))); - simde__m128i a_sq_m1_p1 __attribute__((aligned(16))); - simde__m128i a_sq_m1_p3 __attribute__((aligned(16))); - simde__m128i a_sq_p1_m3 __attribute__((aligned(16))); - simde__m128i a_sq_p1_m1 __attribute__((aligned(16))); - simde__m128i a_sq_p1_p1 __attribute__((aligned(16))); - simde__m128i a_sq_p1_p3 __attribute__((aligned(16))); - simde__m128i a_sq_p3_m3 __attribute__((aligned(16))); - simde__m128i a_sq_p3_m1 __attribute__((aligned(16))); - simde__m128i a_sq_p3_p1 __attribute__((aligned(16))); - simde__m128i a_sq_p3_p3 __attribute__((aligned(16))); - - simde__m128i y0_p_1_1 __attribute__((aligned(16))); - simde__m128i y0_p_1_3 __attribute__((aligned(16))); - simde__m128i y0_p_3_1 __attribute__((aligned(16))); - simde__m128i y0_p_3_3 __attribute__((aligned(16))); - simde__m128i y0_m_1_1 __attribute__((aligned(16))); - simde__m128i y0_m_1_3 __attribute__((aligned(16))); - simde__m128i y0_m_3_1 __attribute__((aligned(16))); - simde__m128i y0_m_3_3 __attribute__((aligned(16))); + simde__m128i rho_rs[8] __attribute__((aligned(16))); + simde__m128i psi_rs[16] __attribute__((aligned(16))); + simde__m128i psi_is[16] __attribute__((aligned(16))); + simde__m128i a_rs[16] __attribute__((aligned(16))); + simde__m128i a_is[16] __attribute__((aligned(16))); + simde__m128i psi_as[16] __attribute__((aligned(16))); + simde__m128i a_sqs[16] __attribute__((aligned(16))); + simde__m128i y0_s[8] __attribute__((aligned(16))); simde__m128i y0r __attribute__((aligned(16))); simde__m128i y0i __attribute__((aligned(16))); @@ -1095,96 +984,42 @@ void nr_ulsch_qam16_qam16(c16_t *stream0_in, rho_rmi = simde_mm_subs_epi16(xmm2, xmm3); // rho* = Re(rho) - Im(rho) // Compute the different rhos - rho_rpi_1_1 = simde_mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_10); - rho_rmi_1_1 = simde_mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_10); - rho_rpi_3_3 = simde_mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_10); - rho_rmi_3_3 = simde_mm_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_10); - rho_rpi_3_3 = simde_mm_slli_epi16(rho_rpi_3_3, 1); - rho_rmi_3_3 = simde_mm_slli_epi16(rho_rmi_3_3, 1); + rho_rs[0] = simde_mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_10); + rho_rs[4] = simde_mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_10); + rho_rs[3] = simde_mm_slli_epi16(simde_mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_10), 1); + rho_rs[7] = simde_mm_slli_epi16(simde_mm_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_10), 1); xmm4 = simde_mm_mulhi_epi16(xmm2, ONE_OVER_SQRT_10); // Re(rho) xmm5 = simde_mm_mulhi_epi16(xmm3, THREE_OVER_SQRT_10); // Im(rho) xmm5 = simde_mm_slli_epi16(xmm5, 1); - rho_rpi_1_3 = simde_mm_adds_epi16(xmm4, xmm5); - rho_rmi_1_3 = simde_mm_subs_epi16(xmm4, xmm5); + rho_rs[1] = simde_mm_adds_epi16(xmm4, xmm5); + rho_rs[5] = simde_mm_subs_epi16(xmm4, xmm5); xmm6 = simde_mm_mulhi_epi16(xmm2, THREE_OVER_SQRT_10); // Re(rho) xmm7 = simde_mm_mulhi_epi16(xmm3, ONE_OVER_SQRT_10); // Im(rho) xmm6 = simde_mm_slli_epi16(xmm6, 1); - rho_rpi_3_1 = simde_mm_adds_epi16(xmm6, xmm7); - rho_rmi_3_1 = simde_mm_subs_epi16(xmm6, xmm7); + rho_rs[2] = simde_mm_adds_epi16(xmm6, xmm7); + rho_rs[6] = simde_mm_subs_epi16(xmm6, xmm7); // Rearrange interfering MF output simde_mm128_separate_real_imag_parts(&y1r, &y1i, stream1_128i_in[i], stream1_128i_in[i + 1]); - xmm0 = simde_mm_setzero_si128(); // ZERO - xmm2 = simde_mm_subs_epi16(rho_rpi_1_1, y1r); // = [Re(rho)+ Im(rho)]/sqrt(10) - y1r - psi_r_p1_p1 = simde_mm_abs_epi16(xmm2); // = |[Re(rho)+ Im(rho)]/sqrt(10) - y1r| - - xmm2 = simde_mm_subs_epi16(rho_rmi_1_1, y1r); - psi_r_p1_m1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rmi_1_1, y1i); - psi_i_p1_p1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rpi_1_3, y1r); - psi_r_p1_p3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rmi_1_3, y1r); - psi_r_p1_m3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rmi_3_1, y1i); - psi_i_p1_p3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rpi_3_1, y1r); - psi_r_p3_p1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rmi_3_1, y1r); - psi_r_p3_m1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rmi_1_3, y1i); - psi_i_p3_p1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rpi_3_3, y1r); - psi_r_p3_p3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rmi_3_3, y1r); - psi_r_p3_m3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rmi_3_3, y1i); - psi_i_p3_p3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rpi_1_1, y1i); - psi_i_m1_p1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rpi_3_1, y1i); - psi_i_m1_p3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rpi_1_3, y1i); - psi_i_m3_p1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_subs_epi16(rho_rpi_3_3, y1i); - psi_i_m3_p3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(rho_rpi_1_1, y1i); - psi_i_p1_m1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(rho_rpi_3_1, y1i); - psi_i_p1_m3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(rho_rpi_1_3, y1i); - psi_i_p3_m1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(rho_rpi_3_3, y1i); - psi_i_p3_m3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(rho_rpi_1_1, y1r); - psi_r_m1_m1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(rho_rpi_1_3, y1r); - psi_r_m1_m3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(rho_rpi_3_1, y1r); - psi_r_m3_m1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(rho_rpi_3_3, y1r); - psi_r_m3_m3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(y1r, rho_rmi_1_1); - psi_r_m1_p1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(y1r, rho_rmi_1_3); - psi_r_m1_p3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(y1i, rho_rmi_1_1); - psi_i_m1_m1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(y1i, rho_rmi_3_1); - psi_i_m1_m3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(y1r, rho_rmi_3_1); - psi_r_m3_p1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(y1r, rho_rmi_3_3); - psi_r_m3_p3 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(y1i, rho_rmi_1_3); - psi_i_m3_m1 = simde_mm_abs_epi16(xmm2); - xmm2 = simde_mm_adds_epi16(y1i, rho_rmi_3_3); - psi_i_m3_m3 = simde_mm_abs_epi16(xmm2); + // | [Re(rho)+ Im(rho)]/sqrt(10) - y1r | + for(int j=0; j<8; j++){ // psi_rs[0~7], rho_rs[0~7] + psi_rs[j] = simde_mm_abs_epi16( simde_mm_subs_epi16(rho_rs[j], y1r) ); + } + for(int j=8; j<16; j++){ // psi_rs[8~16], rho_rs[4,5,6,7,0,1,2,3] + psi_rs[j] = simde_mm_abs_epi16( simde_mm_adds_epi16(rho_rs[(j-4) & 7], y1r) ); + } + const uint8_t rho_rs_indexes[16] = {4,6,5,7,0,2,1,3,0,2,1,3,4,6,5,7}; + for(int k=0; k<16; k+=8){ // psi_is[0~15], sub(rho_rs[4,6,5,7]), add(rho_rs[0,2,1,3]), sub(rho_rs[0,2,1,3]), add(rho_rs[4,6,5,7]) + for(int j=k; j