misc / Reorder inlines and add architecture guard
This commit is contained in:
@@ -574,10 +574,10 @@ void nr_ulsch_qpsk_qpsk(c16_t *stream0_in, c16_t *stream1_in, c16_t *stream0_out
|
||||
}
|
||||
|
||||
|
||||
static const int16_t ones[8] __attribute__((aligned(16))) = {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};
|
||||
#ifdef USE_128BIT
|
||||
|
||||
static const int16_t ones[8] __attribute__((aligned(16))) = {0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
|
||||
|
||||
// calculate interference magnitude
|
||||
// tmp_result = ones in shorts corr. to interval 2<=x<=4, tmp_result2 interval < 2, tmp_result3 interval 4<x<6 and tmp_result4
|
||||
@@ -591,21 +591,92 @@ static inline simde__m128i interference_abs_64qam_epi16(simde__m128i psi,
|
||||
simde__m128i c5,
|
||||
simde__m128i c7)
|
||||
{
|
||||
simde__m128i tmp_result = simde_mm_cmpgt_epi16(int_two_ch_mag, psi);
|
||||
simde__m128i tmp_result3 = simde_mm_xor_si128(tmp_result, (*(simde__m128i *)&ones[0]));
|
||||
simde__m128i tmp_result2 = simde_mm_cmpgt_epi16(int_ch_mag, psi);
|
||||
tmp_result = simde_mm_xor_si128(tmp_result, tmp_result2);
|
||||
simde__m128i tmp_result4 = simde_mm_cmpgt_epi16(psi, int_three_ch_mag);
|
||||
tmp_result3 = simde_mm_xor_si128(tmp_result3, tmp_result4);
|
||||
tmp_result = simde_mm_and_si128(tmp_result, c3);
|
||||
tmp_result2 = simde_mm_and_si128(tmp_result2, c1);
|
||||
tmp_result3 = simde_mm_and_si128(tmp_result3, c5);
|
||||
tmp_result4 = simde_mm_and_si128(tmp_result4, c7);
|
||||
tmp_result = simde_mm_or_si128(tmp_result, tmp_result2);
|
||||
tmp_result3 = simde_mm_or_si128(tmp_result3, tmp_result4);
|
||||
return simde_mm_or_si128(tmp_result, tmp_result3);
|
||||
simde__m128i tmp_result = simde_mm_cmpgt_epi16(int_two_ch_mag, psi);
|
||||
simde__m128i tmp_result3 = simde_mm_xor_si128(tmp_result, (*(simde__m128i *)&ones[0]));
|
||||
simde__m128i tmp_result2 = simde_mm_cmpgt_epi16(int_ch_mag, psi);
|
||||
tmp_result = simde_mm_xor_si128(tmp_result, tmp_result2);
|
||||
simde__m128i tmp_result4 = simde_mm_cmpgt_epi16(psi, int_three_ch_mag);
|
||||
tmp_result3 = simde_mm_xor_si128(tmp_result3, tmp_result4);
|
||||
tmp_result = simde_mm_and_si128(tmp_result, c3);
|
||||
tmp_result2 = simde_mm_and_si128(tmp_result2, c1);
|
||||
tmp_result3 = simde_mm_and_si128(tmp_result3, c5);
|
||||
tmp_result4 = simde_mm_and_si128(tmp_result4, c7);
|
||||
tmp_result = simde_mm_or_si128(tmp_result, tmp_result2);
|
||||
tmp_result3 = simde_mm_or_si128(tmp_result3, tmp_result4);
|
||||
return simde_mm_or_si128(tmp_result, tmp_result3);
|
||||
}
|
||||
|
||||
// Calculates psi_a = psi_r * a_r + psi_i * a_i
|
||||
static inline simde__m128i prodsum_psi_a_epi16(simde__m128i psi_r, simde__m128i a_r, simde__m128i psi_i, simde__m128i a_i)
|
||||
{
|
||||
simde__m128i tmp_result = simde_mm_mulhi_epi16(psi_r, a_r);
|
||||
tmp_result = simde_mm_slli_epi16(tmp_result, 1);
|
||||
simde__m128i tmp_result2 = simde_mm_mulhi_epi16(psi_i, a_i);
|
||||
tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1);
|
||||
return simde_mm_adds_epi16(tmp_result, tmp_result2);
|
||||
}
|
||||
|
||||
// Calculate interference magnitude
|
||||
static inline simde__m128i interference_abs_epi16(simde__m128i psi, simde__m128i int_ch_mag, simde__m128i c1, simde__m128i c2)
|
||||
{
|
||||
simde__m128i tmp_result = simde_mm_cmplt_epi16(psi, int_ch_mag);
|
||||
simde__m128i tmp_result2 = simde_mm_xor_si128(tmp_result, (*(simde__m128i *)&ones[0]));
|
||||
tmp_result = simde_mm_and_si128(tmp_result, c1);
|
||||
tmp_result2 = simde_mm_and_si128(tmp_result2, c2);
|
||||
return simde_mm_or_si128(tmp_result, tmp_result2);
|
||||
}
|
||||
|
||||
// Calculates a_sq = int_ch_mag * (a_r^2 + a_i^2) * scale_factor
|
||||
static inline simde__m128i square_a_epi16(simde__m128i a_r, simde__m128i a_i, simde__m128i int_ch_mag, simde__m128i scale_factor)
|
||||
{
|
||||
simde__m128i tmp_result = simde_mm_mulhi_epi16(a_r, a_r);
|
||||
tmp_result = simde_mm_slli_epi16(tmp_result, 1);
|
||||
tmp_result = simde_mm_mulhi_epi16(tmp_result, scale_factor);
|
||||
tmp_result = simde_mm_slli_epi16(tmp_result, 1);
|
||||
tmp_result = simde_mm_mulhi_epi16(tmp_result, int_ch_mag);
|
||||
tmp_result = simde_mm_slli_epi16(tmp_result, 1);
|
||||
simde__m128i tmp_result2 = simde_mm_mulhi_epi16(a_i, a_i);
|
||||
tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1);
|
||||
tmp_result2 = simde_mm_mulhi_epi16(tmp_result2, scale_factor);
|
||||
tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1);
|
||||
tmp_result2 = simde_mm_mulhi_epi16(tmp_result2, int_ch_mag);
|
||||
tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1);
|
||||
return simde_mm_adds_epi16(tmp_result, tmp_result2);
|
||||
}
|
||||
|
||||
// calculates a_sq = int_ch_mag*(a_r^2 + a_i^2)*scale_factor for 64-QAM
|
||||
static inline simde__m128i square_a_64qam_epi16(simde__m128i a_r, simde__m128i a_i, simde__m128i int_ch_mag, simde__m128i scale_factor)
|
||||
{
|
||||
simde__m128i tmp_result = simde_mm_mulhi_epi16(a_r, a_r);
|
||||
tmp_result = simde_mm_slli_epi16(tmp_result, 1);
|
||||
tmp_result = simde_mm_mulhi_epi16(tmp_result, scale_factor);
|
||||
tmp_result = simde_mm_slli_epi16(tmp_result, 3);
|
||||
tmp_result = simde_mm_mulhi_epi16(tmp_result, int_ch_mag);
|
||||
tmp_result = simde_mm_slli_epi16(tmp_result, 1);
|
||||
simde__m128i tmp_result2 = simde_mm_mulhi_epi16(a_i, a_i);
|
||||
tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1);
|
||||
tmp_result2 = simde_mm_mulhi_epi16(tmp_result2, scale_factor);
|
||||
tmp_result2 = simde_mm_slli_epi16(tmp_result2, 3);
|
||||
tmp_result2 = simde_mm_mulhi_epi16(tmp_result2, int_ch_mag);
|
||||
tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1);
|
||||
return simde_mm_adds_epi16(tmp_result, tmp_result2);
|
||||
}
|
||||
|
||||
simde__m128i max_epi16(simde__m128i m0, simde__m128i m1, simde__m128i m2, simde__m128i m3, simde__m128i m4, simde__m128i m5, simde__m128i m6, simde__m128i m7)
|
||||
{
|
||||
simde__m128i a0 = simde_mm_max_epi16(m0, m1);
|
||||
simde__m128i a1 = simde_mm_max_epi16(m2, m3);
|
||||
simde__m128i a2 = simde_mm_max_epi16(m4, m5);
|
||||
simde__m128i a3 = simde_mm_max_epi16(m6, m7);
|
||||
simde__m128i b0 = simde_mm_max_epi16(a0, a1);
|
||||
simde__m128i b1 = simde_mm_max_epi16(a2, a3);
|
||||
return simde_mm_max_epi16(b0, b1);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static const int16_t ones256[16] __attribute__((aligned(32))) = {0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
|
||||
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff};
|
||||
|
||||
// calculate interference magnitude
|
||||
// tmp_result = ones in shorts corr. to interval 2<=x<=4, tmp_result2 interval < 2, tmp_result3 interval 4<x<6 and tmp_result4
|
||||
@@ -634,16 +705,6 @@ static inline simde__m256i interference_abs_64qam_epi16_256(simde__m256i psi,
|
||||
return simde_mm256_or_si256(tmp_result, tmp_result3);
|
||||
}
|
||||
|
||||
// Calculates psi_a = psi_r * a_r + psi_i * a_i
|
||||
static inline simde__m128i prodsum_psi_a_epi16(simde__m128i psi_r, simde__m128i a_r, simde__m128i psi_i, simde__m128i a_i)
|
||||
{
|
||||
simde__m128i tmp_result = simde_mm_mulhi_epi16(psi_r, a_r);
|
||||
tmp_result = simde_mm_slli_epi16(tmp_result, 1);
|
||||
simde__m128i tmp_result2 = simde_mm_mulhi_epi16(psi_i, a_i);
|
||||
tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1);
|
||||
return simde_mm_adds_epi16(tmp_result, tmp_result2);
|
||||
}
|
||||
|
||||
// calculates psi_a = psi_r*a_r + psi_i*a_i
|
||||
static inline simde__m256i prodsum_psi_a_epi16_256(simde__m256i psi_r, simde__m256i a_r, simde__m256i psi_i, simde__m256i a_i)
|
||||
{
|
||||
@@ -654,16 +715,6 @@ static inline simde__m256i prodsum_psi_a_epi16_256(simde__m256i psi_r, simde__m2
|
||||
return simde_mm256_adds_epi16(tmp_result, tmp_result2);
|
||||
}
|
||||
|
||||
// Calculate interference magnitude
|
||||
static inline simde__m128i interference_abs_epi16(simde__m128i psi, simde__m128i int_ch_mag, simde__m128i c1, simde__m128i c2)
|
||||
{
|
||||
simde__m128i tmp_result = simde_mm_cmplt_epi16(psi, int_ch_mag);
|
||||
simde__m128i tmp_result2 = simde_mm_xor_si128(tmp_result, (*(simde__m128i *)&ones[0]));
|
||||
tmp_result = simde_mm_and_si128(tmp_result, c1);
|
||||
tmp_result2 = simde_mm_and_si128(tmp_result2, c2);
|
||||
return simde_mm_or_si128(tmp_result, tmp_result2);
|
||||
}
|
||||
|
||||
// Calculate interference magnitude
|
||||
static inline simde__m256i interference_abs_epi16_256(simde__m256i psi, simde__m256i int_ch_mag, simde__m256i c1, simde__m256i c2)
|
||||
{
|
||||
@@ -674,24 +725,6 @@ static inline simde__m256i interference_abs_epi16_256(simde__m256i psi, simde__m
|
||||
return simde_mm256_or_si256(tmp_result, tmp_result2);
|
||||
}
|
||||
|
||||
// Calculates a_sq = int_ch_mag * (a_r^2 + a_i^2) * scale_factor
|
||||
static inline simde__m128i square_a_epi16(simde__m128i a_r, simde__m128i a_i, simde__m128i int_ch_mag, simde__m128i scale_factor)
|
||||
{
|
||||
simde__m128i tmp_result = simde_mm_mulhi_epi16(a_r, a_r);
|
||||
tmp_result = simde_mm_slli_epi16(tmp_result, 1);
|
||||
tmp_result = simde_mm_mulhi_epi16(tmp_result, scale_factor);
|
||||
tmp_result = simde_mm_slli_epi16(tmp_result, 1);
|
||||
tmp_result = simde_mm_mulhi_epi16(tmp_result, int_ch_mag);
|
||||
tmp_result = simde_mm_slli_epi16(tmp_result, 1);
|
||||
simde__m128i tmp_result2 = simde_mm_mulhi_epi16(a_i, a_i);
|
||||
tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1);
|
||||
tmp_result2 = simde_mm_mulhi_epi16(tmp_result2, scale_factor);
|
||||
tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1);
|
||||
tmp_result2 = simde_mm_mulhi_epi16(tmp_result2, int_ch_mag);
|
||||
tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1);
|
||||
return simde_mm_adds_epi16(tmp_result, tmp_result2);
|
||||
}
|
||||
|
||||
// Calculates a_sq = int_ch_mag * (a_r^2 + a_i^2) * scale_factor
|
||||
static inline simde__m256i square_a_epi16_256(simde__m256i a_r, simde__m256i a_i, simde__m256i int_ch_mag, simde__m256i scale_factor)
|
||||
{
|
||||
@@ -710,25 +743,6 @@ static inline simde__m256i square_a_epi16_256(simde__m256i a_r, simde__m256i a_i
|
||||
return simde_mm256_adds_epi16(tmp_result, tmp_result2);
|
||||
}
|
||||
|
||||
// calculates a_sq = int_ch_mag*(a_r^2 + a_i^2)*scale_factor for 64-QAM
|
||||
static inline simde__m128i square_a_64qam_epi16(simde__m128i a_r, simde__m128i a_i, simde__m128i int_ch_mag, simde__m128i scale_factor)
|
||||
{
|
||||
simde__m128i tmp_result = simde_mm_mulhi_epi16(a_r, a_r);
|
||||
tmp_result = simde_mm_slli_epi16(tmp_result, 1);
|
||||
tmp_result = simde_mm_mulhi_epi16(tmp_result, scale_factor);
|
||||
tmp_result = simde_mm_slli_epi16(tmp_result, 3);
|
||||
tmp_result = simde_mm_mulhi_epi16(tmp_result, int_ch_mag);
|
||||
tmp_result = simde_mm_slli_epi16(tmp_result, 1);
|
||||
simde__m128i tmp_result2 = simde_mm_mulhi_epi16(a_i, a_i);
|
||||
tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1);
|
||||
tmp_result2 = simde_mm_mulhi_epi16(tmp_result2, scale_factor);
|
||||
tmp_result2 = simde_mm_slli_epi16(tmp_result2, 3);
|
||||
tmp_result2 = simde_mm_mulhi_epi16(tmp_result2, int_ch_mag);
|
||||
tmp_result2 = simde_mm_slli_epi16(tmp_result2, 1);
|
||||
return simde_mm_adds_epi16(tmp_result, tmp_result2);
|
||||
}
|
||||
|
||||
|
||||
// calculates a_sq = int_ch_mag*(a_r^2 + a_i^2)*scale_factor for 64-QAM
|
||||
static inline simde__m256i square_a_64qam_epi16_256(simde__m256i a_r, simde__m256i a_i, simde__m256i int_ch_mag, simde__m256i scale_factor)
|
||||
{
|
||||
@@ -747,17 +761,6 @@ static inline simde__m256i square_a_64qam_epi16_256(simde__m256i a_r, simde__m25
|
||||
return simde_mm256_adds_epi16(tmp_result, tmp_result2);
|
||||
}
|
||||
|
||||
simde__m128i max_epi16(simde__m128i m0, simde__m128i m1, simde__m128i m2, simde__m128i m3, simde__m128i m4, simde__m128i m5, simde__m128i m6, simde__m128i m7)
|
||||
{
|
||||
simde__m128i a0 = simde_mm_max_epi16(m0, m1);
|
||||
simde__m128i a1 = simde_mm_max_epi16(m2, m3);
|
||||
simde__m128i a2 = simde_mm_max_epi16(m4, m5);
|
||||
simde__m128i a3 = simde_mm_max_epi16(m6, m7);
|
||||
simde__m128i b0 = simde_mm_max_epi16(a0, a1);
|
||||
simde__m128i b1 = simde_mm_max_epi16(a2, a3);
|
||||
return simde_mm_max_epi16(b0, b1);
|
||||
}
|
||||
|
||||
simde__m256i max_epi16_256(simde__m256i m0, simde__m256i m1, simde__m256i m2, simde__m256i m3, simde__m256i m4, simde__m256i m5, simde__m256i m6, simde__m256i m7)
|
||||
{
|
||||
simde__m256i a0 = simde_mm256_max_epi16(m0, m1);
|
||||
@@ -769,6 +772,8 @@ simde__m256i max_epi16_256(simde__m256i m0, simde__m256i m1, simde__m256i m2, si
|
||||
return simde_mm256_max_epi16(b0, b1);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This function computes the LLRs of stream 0 (s_0) in presence of the interfering stream 1 (s_1) assuming that both symbols are
|
||||
* 16QAM. It can be used for both MU-MIMO interference-aware receiver or for SU-MIMO receivers.
|
||||
|
||||
Reference in New Issue
Block a user