Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
OpenXG
OpenXG-RAN
Commits
eb0dda59
Commit
eb0dda59
authored
6 months ago
by
Laurent THOMAS
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
remove intermediate buffer and memory copy, continue to simplify nr pdsch computation
parent
2fad8796
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
218 additions
and
327 deletions
+218
-327
openair1/PHY/NR_TRANSPORT/nr_dlsch.c
openair1/PHY/NR_TRANSPORT/nr_dlsch.c
+218
-327
No files found.
openair1/PHY/NR_TRANSPORT/nr_dlsch.c
View file @
eb0dda59
...
@@ -52,15 +52,15 @@ static void nr_pdsch_codeword_scrambling(uint8_t *in, uint32_t size, uint8_t q,
...
@@ -52,15 +52,15 @@ static void nr_pdsch_codeword_scrambling(uint8_t *in, uint32_t size, uint8_t q,
static
int
do_ptrs_symbol
(
nfapi_nr_dl_tti_pdsch_pdu_rel15_t
*
rel15
,
static
int
do_ptrs_symbol
(
nfapi_nr_dl_tti_pdsch_pdu_rel15_t
*
rel15
,
int
start_sc
,
int
start_sc
,
int
k
,
int
symbol_sz
,
uint
*
cur_re
,
c16_t
*
txF
,
int
symbol_sz
,
c16_t
*
output
,
c16_t
*
tx_layer
,
c16_t
*
tx_layer
,
int
amp
,
int
amp
,
c16_t
*
mod_ptrs
)
c16_t
*
mod_ptrs
)
{
{
int
ptrs_idx
=
0
;
int
ptrs_idx
=
0
;
int
k
=
start_sc
;
c16_t
*
in
=
tx_layer
;
for
(
int
i
=
0
;
i
<
rel15
->
rbSize
*
NR_NB_SC_PER_RB
;
i
++
)
{
for
(
int
i
=
0
;
i
<
rel15
->
rbSize
*
NR_NB_SC_PER_RB
;
i
++
)
{
/* check for PTRS symbol and set flag for PTRS RE */
/* check for PTRS symbol and set flag for PTRS RE */
bool
is_ptrs_re
=
bool
is_ptrs_re
=
...
@@ -68,40 +68,36 @@ static int do_ptrs_symbol(nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15,
...
@@ -68,40 +68,36 @@ static int do_ptrs_symbol(nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15,
if
(
is_ptrs_re
)
{
if
(
is_ptrs_re
)
{
/* check if cuurent RE is PTRS RE*/
/* check if cuurent RE is PTRS RE*/
uint16_t
beta_ptrs
=
1
;
uint16_t
beta_ptrs
=
1
;
output
[
k
]
=
c16mulRealShift
(
mod_ptrs
[
ptrs_idx
],
beta_ptrs
*
amp
,
15
);
txF
[
k
]
=
c16mulRealShift
(
mod_ptrs
[
ptrs_idx
],
beta_ptrs
*
amp
,
15
);
#ifdef DEBUG_DLSCH_MAPPING
#ifdef DEBUG_DLSCH_MAPPING
printf
(
"ptrs_idx %d
\t
\t
k %d
\t
\t
txdataF: %d %d, mod_ptrs: %d %d
\n
"
,
printf
(
"ptrs_idx %d
\t
\t
k %d
\t
\t
txdataF: %d %d, mod_ptrs: %d %d
\n
"
,
ptrs_idx
,
ptrs_idx
,
k
,
k
,
output
[
k
].
r
,
txF
[
k
].
r
,
output
[
k
].
i
,
txF
[
k
].
i
,
mod_ptrs
[
ptrs_idx
].
r
,
mod_ptrs
[
ptrs_idx
].
r
,
mod_ptrs
[
ptrs_idx
].
i
);
mod_ptrs
[
ptrs_idx
].
i
);
#endif
#endif
ptrs_idx
++
;
ptrs_idx
++
;
}
else
{
}
else
{
output
[
k
]
=
c16mulRealShift
(
tx_layer
[
*
cur_re
]
,
amp
,
15
);
txF
[
k
]
=
c16mulRealShift
(
*
in
++
,
amp
,
15
);
#ifdef DEBUG_DLSCH_MAPPING
#ifdef DEBUG_DLSCH_MAPPING
printf
(
"
re %u
\t
k %d
\t
txdataF: %d %d
\n
"
,
*
cur_re
,
k
,
output
[
k
].
r
,
output
[
k
].
i
);
printf
(
"
k %d
\t
txdataF: %d %d
\n
"
,
k
,
txF
[
k
].
r
,
txF
[
k
].
i
);
#endif
#endif
*
cur_re
=
*
cur_re
+
1
;
}
}
if
(
++
k
>=
symbol_sz
)
if
(
++
k
>=
symbol_sz
)
k
-=
symbol_sz
;
k
-=
symbol_sz
;
}
}
return
k
;
return
in
-
tx_layer
;
}
}
static
inline
void
static
inline
int
dmrs_case20
(
c16_t
*
txF
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
int
sz
)
dmrs_case1
(
c16_t
*
txF
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
int
sz
,
int
start_sc
,
int
upper_limit
,
int
remaining_re
)
{
{
#ifdef DEBUG_DLSCH_MAPPING
#ifdef DEBUG_DLSCH_MAPPING
printf
(
"doing DMRS pattern for port 0 : d0 0 d1 0 ... dNm2 0 dNm1 0 (ul %d, rr %d)
\n
"
,
upper_limit
,
remaining_re
);
printf
(
"doing DMRS pattern for port 0 : d0 0 d1 0 ... dNm2 0 dNm1 0 (ul %d, rr %d)
\n
"
,
upper_limit
,
remaining_re
);
#endif
#endif
// add filler to process all as SIMD
// add filler to process all as SIMD
c16_t
dmrs_mux
[(
sz
+
63
)
&~
63
]
__attribute__
((
aligned
(
64
)));
c16_t
*
out
=
txF
;
c16_t
*
in
=
mod_dmrs
;
c16_t
*
out
=
dmrs_mux
;
int
i
=
0
;
int
i
=
0
;
int
end
=
sz
/
2
;
int
end
=
sz
/
2
;
#if defined(__AVX512BW__)
#if defined(__AVX512BW__)
...
@@ -109,60 +105,51 @@ dmrs_case1(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
...
@@ -109,60 +105,51 @@ dmrs_case1(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
permh
=
_mm512_set_epi32
(
31
,
15
,
30
,
14
,
29
,
13
,
28
,
12
,
27
,
11
,
26
,
10
,
25
,
9
,
24
,
8
);
__m512i
permh
=
_mm512_set_epi32
(
31
,
15
,
30
,
14
,
29
,
13
,
28
,
12
,
27
,
11
,
26
,
10
,
25
,
9
,
24
,
8
);
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
in
),
amp_dmrs512
);
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)(
mod_dmrs
+
i
)),
amp_dmrs512
);
in
+=
16
;
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d0
,
perml
,
zeros512
));
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d0
,
perml
,
zeros512
);
out
+=
16
;
out
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d0
,
permh
,
zeros512
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d0
,
permh
,
zeros512
)
);
out
+=
16
;
out
+=
16
;
}
}
#endif
#endif
#if defined(__AVX2__)
#if defined(__AVX2__)
simde__m256i
zeros256
=
simde_mm256_setzero_si256
(),
amp_dmrs256
=
simde_mm256_set1_epi16
(
amp_dmrs
);
simde__m256i
zeros256
=
simde_mm256_setzero_si256
(),
amp_dmrs256
=
simde_mm256_set1_epi16
(
amp_dmrs
);
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
in
),
amp_dmrs256
);
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)(
mod_dmrs
+
i
)),
amp_dmrs256
);
in
+=
8
;
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
zeros256
);
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
zeros256
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
zeros256
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
zeros256
);
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
)
);
out
+=
8
;
out
+=
8
;
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
)
);
out
+=
8
;
out
+=
8
;
}
}
#endif
#endif
#if defined(USE128BIT)
#if defined(USE128BIT)
simde__m128i
zeros
=
simde_mm_setzero_si128
(),
amp_dmrs128
=
simde_mm_set1_epi16
(
amp_dmrs
);
simde__m128i
zeros
=
simde_mm_setzero_si128
(),
amp_dmrs128
=
simde_mm_set1_epi16
(
amp_dmrs
);
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
in
),
amp_dmrs128
);
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)(
mod_dmrs
+
i
)),
amp_dmrs128
);
in
+=
4
;
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
zeros
);
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
zeros
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
zeros
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
zeros
);
*
(
simde__m128i
*
)
out
=
d2
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d2
)
;
out
+=
4
;
out
+=
4
;
*
(
simde__m128i
*
)
out
=
d3
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d3
)
;
out
+=
4
;
out
+=
4
;
}
}
#endif
#endif
for
(;
i
<
end
;
i
++
)
{
for
(;
i
<
end
;
i
++
)
{
*
out
++
=
(
c16_t
){(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
in
++
;
*
out
++
=
(
c16_t
){};
*
out
++
=
(
c16_t
){};
}
}
memcpy
(
&
txF
[
start_sc
],
dmrs_mux
,
sizeof
(
c16_t
)
*
upper_limit
);
return
0
;
if
(
remaining_re
)
memcpy
(
&
txF
[
0
],
&
dmrs_mux
[
upper_limit
],
sizeof
(
c16_t
)
*
remaining_re
);
}
}
static
inline
void
static
inline
int
dmrs_case21
(
c16_t
*
txF
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
int
sz
)
dmrs_case2
(
c16_t
*
txF
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
int
sz
,
int
start_sc
,
int
upper_limit
,
int
remaining_re
)
{
{
#ifdef DEBUG_DLSCH_MAPPING
#ifdef DEBUG_DLSCH_MAPPING
printf
(
"doing DMRS pattern for port 1 : d0 0 -d1 0 ...dNm2 0 -dNm1 0
\n
"
);
printf
(
"doing DMRS pattern for port 1 : d0 0 -d1 0 ...dNm2 0 -dNm1 0
\n
"
);
#endif
#endif
// add filler to process all as SIMD
// add filler to process all as SIMD
c16_t
dmrs_mux
[(
sz
+
63
)
&~
63
]
__attribute__
((
aligned
(
64
)));
c16_t
*
out
=
txF
;
c16_t
*
in
=
mod_dmrs
;
c16_t
*
out
=
dmrs_mux
;
int
i
=
0
;
int
i
=
0
;
int
end
=
sz
/
2
;
int
end
=
sz
/
2
;
...
@@ -202,11 +189,10 @@ dmrs_case2(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
...
@@ -202,11 +189,10 @@ dmrs_case2(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
permh
=
_mm512_set_epi32
(
31
,
15
,
30
,
14
,
29
,
13
,
28
,
12
,
27
,
11
,
26
,
10
,
25
,
9
,
24
,
8
);
__m512i
permh
=
_mm512_set_epi32
(
31
,
15
,
30
,
14
,
29
,
13
,
28
,
12
,
27
,
11
,
26
,
10
,
25
,
9
,
24
,
8
);
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
in
),
amp_dmrs512
);
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)(
mod_dmrs
+
i
)),
amp_dmrs512
);
in
+=
16
;
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d0
,
perml
,
zeros512
));
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d0
,
perml
,
zeros512
);
out
+=
16
;
out
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d0
,
permh
,
zeros512
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d0
,
permh
,
zeros512
)
);
out
+=
16
;
out
+=
16
;
}
}
#endif
#endif
...
@@ -228,13 +214,12 @@ dmrs_case2(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
...
@@ -228,13 +214,12 @@ dmrs_case2(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
amp_dmrs
,
amp_dmrs
,
amp_dmrs
);
amp_dmrs
);
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
in
),
amp_dmrs256
);
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)(
mod_dmrs
+
i
)),
amp_dmrs256
);
in
+=
8
;
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
zeros256
);
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
zeros256
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
zeros256
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
zeros256
);
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
)
);
out
+=
8
;
out
+=
8
;
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
)
);
out
+=
8
;
out
+=
8
;
}
}
#endif
#endif
...
@@ -242,39 +227,32 @@ dmrs_case2(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
...
@@ -242,39 +227,32 @@ dmrs_case2(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
simde__m128i
zeros
=
simde_mm_setzero_si128
(),
simde__m128i
zeros
=
simde_mm_setzero_si128
(),
amp_dmrs128
=
simde_mm_set_epi16
(
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
,
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
);
amp_dmrs128
=
simde_mm_set_epi16
(
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
,
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
);
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
in
),
amp_dmrs128
);
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)(
mod_dmrs
+
i
)),
amp_dmrs128
);
in
+=
4
;
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
zeros
);
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
zeros
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
zeros
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
zeros
);
*
(
simde__m128i
*
)
out
=
d2
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d2
)
;
out
+=
4
;
out
+=
4
;
*
(
simde__m128i
*
)
out
=
d3
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d3
)
;
out
+=
4
;
out
+=
4
;
}
}
#endif
#endif
for
(;
i
<
end
;
i
+=
2
)
{
for
(;
i
<
end
;)
{
*
out
++
=
(
c16_t
){(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
i
n
++
;
i
++
;
*
out
++
=
(
c16_t
){};
*
out
++
=
(
c16_t
){};
*
out
++
=
(
c16_t
){
-
(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
-
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){
-
(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
-
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
i
n
++
;
i
++
;
*
out
++
=
(
c16_t
){};
*
out
++
=
(
c16_t
){};
}
}
memcpy
(
&
txF
[
start_sc
],
dmrs_mux
,
sizeof
(
c16_t
)
*
upper_limit
);
return
0
;
if
(
remaining_re
)
memcpy
(
&
txF
[
0
],
&
dmrs_mux
[
upper_limit
],
sizeof
(
c16_t
)
*
remaining_re
);
}
}
static
inline
void
static
inline
int
dmrs_case22
(
c16_t
*
txF
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
int
sz
)
dmrs_case3
(
c16_t
*
txF
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
int
sz
,
int
start_sc
,
int
upper_limit
,
int
remaining_re
)
{
{
#ifdef DEBUG_DLSCH_MAPPING
#ifdef DEBUG_DLSCH_MAPPING
printf
(
"doing DMRS pattern for port 2 : 0 d0 0 d1 ... 0 dNm2 0 dNm1
\n
"
);
printf
(
"doing DMRS pattern for port 2 : 0 d0 0 d1 ... 0 dNm2 0 dNm1
\n
"
);
#endif
#endif
// add filler to process all as SIMD
c16_t
*
out
=
txF
;
c16_t
dmrs_mux
[(
sz
+
63
)
&~
63
]
__attribute__
((
aligned
(
64
)));
c16_t
*
in
=
mod_dmrs
;
c16_t
*
out
=
dmrs_mux
;
int
i
=
0
;
int
i
=
0
;
int
end
=
sz
/
2
;
int
end
=
sz
/
2
;
#if defined(__AVX512BW__)
#if defined(__AVX512BW__)
...
@@ -282,63 +260,52 @@ dmrs_case3(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
...
@@ -282,63 +260,52 @@ dmrs_case3(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
permh
=
_mm512_set_epi32
(
31
,
15
,
30
,
14
,
29
,
13
,
28
,
12
,
27
,
11
,
26
,
10
,
25
,
9
,
24
,
8
);
__m512i
permh
=
_mm512_set_epi32
(
31
,
15
,
30
,
14
,
29
,
13
,
28
,
12
,
27
,
11
,
26
,
10
,
25
,
9
,
24
,
8
);
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
in
),
amp_dmrs512
);
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)(
mod_dmrs
+
i
)),
amp_dmrs512
);
in
+=
16
;
__m512i
d2
=
_mm512_unpacklo_epi32
(
zeros512
,
d0
);
// 0 d0_0 0 d0_1 0 d0_4 0 d0_5 0 d0_8 0 d0_9 0 d0_12 0 d0_13
__m512i
d2
=
_mm512_unpacklo_epi32
(
zeros512
,
d0
);
// 0 d0_0 0 d0_1 0 d0_4 0 d0_5 0 d0_8 0 d0_9 0 d0_12 0 d0_13
__m512i
d3
=
_mm512_unpackhi_epi32
(
zeros512
,
d0
);
// 0 d0_2 0 d0_3 0 d0_6 0 d0_7 0 d0_10 0 d0_11 d0_14 0 d0_15
__m512i
d3
=
_mm512_unpackhi_epi32
(
zeros512
,
d0
);
// 0 d0_2 0 d0_3 0 d0_6 0 d0_7 0 d0_10 0 d0_11 d0_14 0 d0_15
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d2
,
perml
,
d3
);
//
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d2
,
perml
,
d3
)
);
//
out
+=
16
;
out
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d2
,
permh
,
d3
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d2
,
permh
,
d3
)
);
out
+=
16
;
out
+=
16
;
}
}
#endif
#endif
#if defined(__AVX2__)
#if defined(__AVX2__)
simde__m256i
zeros256
=
simde_mm256_setzero_si256
(),
amp_dmrs256
=
simde_mm256_set1_epi16
(
amp_dmrs
);
simde__m256i
zeros256
=
simde_mm256_setzero_si256
(),
amp_dmrs256
=
simde_mm256_set1_epi16
(
amp_dmrs
);
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
in
),
amp_dmrs256
);
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)(
mod_dmrs
+
i
)),
amp_dmrs256
);
in
+=
8
;
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
zeros256
,
d0
);
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
zeros256
,
d0
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
zeros256
,
d0
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
zeros256
,
d0
);
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
)
);
out
+=
8
;
out
+=
8
;
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
)
);
out
+=
8
;
out
+=
8
;
}
}
#endif
#endif
#if defined(USE128BIT)
#if defined(USE128BIT)
simde__m128i
zeros
=
simde_mm_setzero_si128
(),
amp_dmrs128
=
simde_mm_set1_epi16
(
amp_dmrs
);
simde__m128i
zeros
=
simde_mm_setzero_si128
(),
amp_dmrs128
=
simde_mm_set1_epi16
(
amp_dmrs
);
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
in
),
amp_dmrs128
);
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)(
mod_dmrs
+
i
)),
amp_dmrs128
);
in
+=
4
;
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
zeros
,
d0
);
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
zeros
,
d0
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
zeros
,
d0
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
zeros
,
d0
);
*
(
simde__m128i
*
)
out
=
d2
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d2
)
;
out
+=
4
;
out
+=
4
;
*
(
simde__m128i
*
)
out
=
d3
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d3
)
;
out
+=
4
;
out
+=
4
;
}
}
#endif
#endif
for
(;
i
<
end
;
i
++
)
{
for
(;
i
<
end
;
i
++
)
{
*
out
++
=
(
c16_t
){};
*
out
++
=
(
c16_t
){};
*
out
++
=
(
c16_t
){(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
in
++
;
}
}
return
0
;
memcpy
(
&
txF
[
start_sc
],
dmrs_mux
,
sizeof
(
c16_t
)
*
upper_limit
);
if
(
remaining_re
)
memcpy
(
&
txF
[
0
],
&
dmrs_mux
[
upper_limit
],
sizeof
(
c16_t
)
*
remaining_re
);
}
}
static
inline
void
static
inline
int
dmrs_case23
(
c16_t
*
txF
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
int
sz
)
dmrs_case4
(
c16_t
*
txF
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
int
sz
,
int
start_sc
,
int
upper_limit
,
int
remaining_re
)
{
{
#ifdef DEBUG_DLSCH_MAPPING
#ifdef DEBUG_DLSCH_MAPPING
printf
(
"doing DMRS pattern for port 3 : 0 d0 0 -d1 ... 0 dNm2 0 -dNm1
\n
"
);
printf
(
"doing DMRS pattern for port 3 : 0 d0 0 -d1 ... 0 dNm2 0 -dNm1
\n
"
);
#endif
#endif
// add filler to process all as SIMD
c16_t
*
out
=
txF
;
c16_t
dmrs_mux
[(
sz
+
63
)
&~
63
]
__attribute__
((
aligned
(
64
)));
c16_t
*
in
=
mod_dmrs
;
c16_t
*
out
=
dmrs_mux
;
int
i
=
0
;
int
i
=
0
;
int
end
=
sz
/
2
;
int
end
=
sz
/
2
;
...
@@ -378,11 +345,10 @@ dmrs_case4(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
...
@@ -378,11 +345,10 @@ dmrs_case4(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
permh
=
_mm512_set_epi32
(
31
,
15
,
30
,
14
,
29
,
13
,
28
,
12
,
27
,
11
,
26
,
10
,
25
,
9
,
24
,
8
);
__m512i
permh
=
_mm512_set_epi32
(
31
,
15
,
30
,
14
,
29
,
13
,
28
,
12
,
27
,
11
,
26
,
10
,
25
,
9
,
24
,
8
);
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
in
),
amp_dmrs512
);
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)(
mod_dmrs
+
i
)),
amp_dmrs512
);
in
+=
16
;
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
zeros512
,
perml
,
d0
));
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
zeros512
,
perml
,
d0
);
out
+=
16
;
out
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
zeros512
,
permh
,
d0
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
zeros512
,
permh
,
d0
)
);
out
+=
16
;
out
+=
16
;
}
}
...
@@ -405,13 +371,12 @@ dmrs_case4(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
...
@@ -405,13 +371,12 @@ dmrs_case4(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
amp_dmrs
,
amp_dmrs
,
amp_dmrs
);
amp_dmrs
);
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
in
),
amp_dmrs256
);
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)(
mod_dmrs
+
i
)),
amp_dmrs256
);
in
+=
8
;
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
zeros256
,
d0
);
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
zeros256
,
d0
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
zeros256
,
d0
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
zeros256
,
d0
);
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
)
);
out
+=
8
;
out
+=
8
;
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
)
);
out
+=
8
;
out
+=
8
;
}
}
#endif
#endif
...
@@ -419,46 +384,33 @@ dmrs_case4(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
...
@@ -419,46 +384,33 @@ dmrs_case4(c16_t *txF, c16_t *mod_dmrs, const int amp_dmrs, int sz, int start_sc
simde__m128i
zeros
=
simde_mm_setzero_si128
(),
simde__m128i
zeros
=
simde_mm_setzero_si128
(),
amp_dmrs128
=
simde_mm_set_epi16
(
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
,
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
);
amp_dmrs128
=
simde_mm_set_epi16
(
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
,
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
);
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
in
),
amp_dmrs128
);
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)(
mod_dmrs
+
i
)),
amp_dmrs128
);
in
+=
4
;
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
zeros
,
d0
);
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
zeros
,
d0
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
zeros
,
d0
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
zeros
,
d0
);
*
(
simde__m128i
*
)
out
=
d2
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d2
)
;
out
+=
4
;
out
+=
4
;
*
(
simde__m128i
*
)
out
=
d3
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d3
)
;
out
+=
4
;
out
+=
4
;
}
}
#endif
#endif
for
(;
i
<
end
;
i
+=
2
)
{
for
(;
i
<
end
;)
{
*
out
++
=
(
c16_t
){};
*
out
++
=
(
c16_t
){};
*
out
++
=
(
c16_t
){(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
i
n
++
;
i
++
;
*
out
++
=
(
c16_t
){};
*
out
++
=
(
c16_t
){};
*
out
++
=
(
c16_t
){
-
(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
-
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){
-
(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
-
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
i
n
++
;
i
++
;
}
}
memcpy
(
&
txF
[
start_sc
],
dmrs_mux
,
sizeof
(
c16_t
)
*
upper_limit
);
return
0
;
if
(
remaining_re
)
memcpy
(
&
txF
[
0
],
&
dmrs_mux
[
upper_limit
],
sizeof
(
c16_t
)
*
remaining_re
);
}
}
static
inline
void
dmrs_case5
(
c16_t
*
txF
,
static
inline
int
dmrs_case10
(
c16_t
*
txF
,
c16_t
*
txl
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
const
int
amp
,
int
sz
)
c16_t
*
txl
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
const
int
amp
,
int
sz
,
int
start_sc
,
int
upper_limit
,
int
remaining_re
)
{
{
#ifdef DEBUG_DLSCH_MAPPING
#ifdef DEBUG_DLSCH_MAPPING
printf
(
"doing DMRS pattern for port 0 : d0 X0 d1 X1 ... dNm2 XNm2 dNm1 XNm1
\n
"
);
printf
(
"doing DMRS pattern for port 0 : d0 X0 d1 X1 ... dNm2 XNm2 dNm1 XNm1
\n
"
);
#endif
#endif
// add filler to process all as SIMD
// add filler to process all as SIMD
c16_t
dmrs_mux
[(
sz
+
63
)
&~
63
]
__attribute__
((
aligned
(
64
)));
c16_t
*
out
=
txF
;
c16_t
*
in
=
mod_dmrs
;
c16_t
*
out
=
dmrs_mux
;
int
i
=
0
;
int
i
=
0
;
int
end
=
sz
/
2
;
int
end
=
sz
/
2
;
c16_t
*
txlc
=
txl
;
c16_t
*
txlc
=
txl
;
...
@@ -468,74 +420,58 @@ static inline void dmrs_case5(c16_t *txF,
...
@@ -468,74 +420,58 @@ static inline void dmrs_case5(c16_t *txF,
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
permh
=
_mm512_set_epi32
(
31
,
15
,
30
,
14
,
29
,
13
,
28
,
12
,
27
,
11
,
26
,
10
,
25
,
9
,
24
,
8
);
__m512i
permh
=
_mm512_set_epi32
(
31
,
15
,
30
,
14
,
29
,
13
,
28
,
12
,
27
,
11
,
26
,
10
,
25
,
9
,
24
,
8
);
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
in
),
amp_dmrs512
);
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)(
mod_dmrs
+
i
)),
amp_dmrs512
);
in
+=
16
;
__m512i
d1
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
txlc
),
amp512
);
__m512i
d1
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
txlc
),
amp512
);
txlc
+=
16
;
txlc
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d0
,
perml
,
d1
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d0
,
perml
,
d1
)
);
out
+=
16
;
out
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d0
,
permh
,
d1
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d0
,
permh
,
d1
)
);
out
+=
16
;
out
+=
16
;
}
}
#endif
#endif
#if defined(__AVX2__)
#if defined(__AVX2__)
simde__m256i
amp_dmrs256
=
simde_mm256_set1_epi16
(
amp_dmrs
),
amp256
=
simde_mm256_set1_epi16
(
amp
);
simde__m256i
amp_dmrs256
=
simde_mm256_set1_epi16
(
amp_dmrs
),
amp256
=
simde_mm256_set1_epi16
(
amp
);
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
in
),
amp_dmrs256
);
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)(
mod_dmrs
+
i
)),
amp_dmrs256
);
in
+=
8
;
simde__m256i
d1
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
txlc
),
amp256
);
simde__m256i
d1
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
txlc
),
amp256
);
txlc
+=
8
;
txlc
+=
8
;
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
d1
);
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
d1
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
d1
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
d1
);
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
)
);
out
+=
8
;
out
+=
8
;
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
)
);
out
+=
8
;
out
+=
8
;
}
}
#endif
#endif
#if defined(USE128BIT)
#if defined(USE128BIT)
simde__m128i
amp_dmrs128
=
simde_mm_set1_epi16
(
amp_dmrs
),
amp128
=
simde_mm_set1_epi16
(
amp
);
simde__m128i
amp_dmrs128
=
simde_mm_set1_epi16
(
amp_dmrs
),
amp128
=
simde_mm_set1_epi16
(
amp
);
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
in
),
amp_dmrs128
);
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)(
mod_dmrs
+
i
)),
amp_dmrs128
);
in
+=
4
;
simde__m128i
d1
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
txlc
),
amp128
);
simde__m128i
d1
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
txlc
),
amp128
);
txlc
+=
4
;
txlc
+=
4
;
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
d1
);
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
d1
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
d1
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
d1
);
*
(
simde__m128i
*
)
out
=
d2
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d2
)
;
out
+=
4
;
out
+=
4
;
*
(
simde__m128i
*
)
out
=
d3
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d3
)
;
out
+=
4
;
out
+=
4
;
}
}
#endif
#endif
for
(;
i
<
end
;
i
++
)
{
for
(;
i
<
end
;
i
++
)
{
*
out
++
=
(
c16_t
){(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
in
++
;
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
txlc
++
;
txlc
++
;
}
}
memcpy
(
&
txF
[
start_sc
],
dmrs_mux
,
sizeof
(
c16_t
)
*
upper_limit
);
return
sz
/
2
;
if
(
remaining_re
)
memcpy
(
&
txF
[
0
],
&
dmrs_mux
[
upper_limit
],
sizeof
(
c16_t
)
*
remaining_re
);
}
}
static
inline
void
dmrs_case6
(
c16_t
*
txF
,
static
inline
int
dmrs_case11
(
c16_t
*
txF
,
c16_t
*
txl
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
const
int
amp
,
int
sz
)
c16_t
*
txl
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
const
int
amp
,
int
sz
,
int
start_sc
,
int
upper_limit
,
int
remaining_re
)
{
{
#ifdef DEBUG_DLSCH_MAPPING
#ifdef DEBUG_DLSCH_MAPPING
printf
(
"doing DMRS pattern for port 1 : d0 X0 -d1 X1 ...dNm2 XNm2 -dNm1 XNm1
\n
"
);
printf
(
"doing DMRS pattern for port 1 : d0 X0 -d1 X1 ...dNm2 XNm2 -dNm1 XNm1
\n
"
);
#endif
#endif
// add filler to process all as SIMD
// add filler to process all as SIMD
c16_t
dmrs_mux
[(
sz
+
63
)
&~
63
]
__attribute__
((
aligned
(
64
)));
c16_t
*
out
=
txF
;
c16_t
*
in
=
mod_dmrs
;
c16_t
*
out
=
dmrs_mux
;
int
i
=
0
;
int
i
=
0
;
int
end
=
sz
/
2
;
int
end
=
sz
/
2
;
c16_t
*
txlc
=
txl
;
c16_t
*
txlc
=
txl
;
...
@@ -577,13 +513,12 @@ static inline void dmrs_case6(c16_t *txF,
...
@@ -577,13 +513,12 @@ static inline void dmrs_case6(c16_t *txF,
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
permh
=
_mm512_set_epi32
(
31
,
15
,
30
,
14
,
29
,
13
,
28
,
12
,
27
,
11
,
26
,
10
,
25
,
9
,
24
,
8
);
__m512i
permh
=
_mm512_set_epi32
(
31
,
15
,
30
,
14
,
29
,
13
,
28
,
12
,
27
,
11
,
26
,
10
,
25
,
9
,
24
,
8
);
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
in
),
amp_dmrs512
);
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)(
mod_dmrs
+
i
)),
amp_dmrs512
);
in
+=
16
;
__m512i
d1
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
txlc
),
amp512
);
__m512i
d1
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
txlc
),
amp512
);
txlc
+=
16
;
txlc
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d0
,
perml
,
d1
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d0
,
perml
,
d1
)
);
out
+=
16
;
out
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d0
,
permh
,
d1
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d0
,
permh
,
d1
)
);
out
+=
16
;
out
+=
16
;
}
}
#endif
#endif
...
@@ -606,15 +541,14 @@ static inline void dmrs_case6(c16_t *txF,
...
@@ -606,15 +541,14 @@ static inline void dmrs_case6(c16_t *txF,
amp_dmrs
),
amp_dmrs
),
amp256
=
simde_mm256_set1_epi16
(
amp
);
amp256
=
simde_mm256_set1_epi16
(
amp
);
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
in
),
amp_dmrs256
);
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)(
mod_dmrs
+
i
)),
amp_dmrs256
);
in
+=
8
;
simde__m256i
d1
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
txlc
),
amp256
);
simde__m256i
d1
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
txlc
),
amp256
);
txlc
+=
8
;
txlc
+=
8
;
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
d1
);
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
d1
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
d1
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
d1
);
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
)
);
out
+=
8
;
out
+=
8
;
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
)
);
out
+=
8
;
out
+=
8
;
}
}
#endif
#endif
...
@@ -622,50 +556,36 @@ static inline void dmrs_case6(c16_t *txF,
...
@@ -622,50 +556,36 @@ static inline void dmrs_case6(c16_t *txF,
simde__m128i
amp_dmrs128
=
simde_mm_set_epi16
(
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
,
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
),
simde__m128i
amp_dmrs128
=
simde_mm_set_epi16
(
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
,
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
),
amp128
=
simde_mm_set1_epi16
(
amp
);
amp128
=
simde_mm_set1_epi16
(
amp
);
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
in
),
amp_dmrs128
);
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)(
mod_dmrs
+
i
)),
amp_dmrs128
);
in
+=
4
;
simde__m128i
d1
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
txlc
),
amp128
);
simde__m128i
d1
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
txlc
),
amp128
);
txlc
+=
4
;
txlc
+=
4
;
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
d1
);
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
d1
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
d1
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
d1
);
*
(
simde__m128i
*
)
out
=
d2
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d2
)
;
out
+=
4
;
out
+=
4
;
*
(
simde__m128i
*
)
out
=
d3
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d3
)
;
out
+=
4
;
out
+=
4
;
}
}
#endif
#endif
for
(;
i
<
end
;
i
+=
2
)
{
for
(;
i
<
end
;)
{
*
out
++
=
(
c16_t
){(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
i
n
++
;
i
++
;
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
txlc
++
;
txlc
++
;
*
out
++
=
(
c16_t
){
-
(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
-
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){
-
(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
-
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
i
n
++
;
i
++
;
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
txlc
++
;
txlc
++
;
}
}
memcpy
(
&
txF
[
start_sc
],
dmrs_mux
,
sizeof
(
c16_t
)
*
upper_limit
);
return
sz
/
2
;
if
(
remaining_re
)
memcpy
(
&
txF
[
0
],
&
dmrs_mux
[
upper_limit
],
sizeof
(
c16_t
)
*
remaining_re
);
}
}
static
inline
void
dmrs_case7
(
c16_t
*
txF
,
static
inline
int
dmrs_case12
(
c16_t
*
txF
,
c16_t
*
txl
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
const
int
amp
,
int
sz
)
c16_t
*
txl
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
const
int
amp
,
int
sz
,
int
start_sc
,
int
upper_limit
,
int
remaining_re
)
{
{
#ifdef DEBUG_DLSCH_MAPPING
#ifdef DEBUG_DLSCH_MAPPING
printf
(
"doing DMRS pattern for port 2 : X0 d0 X1 d1 ... XNm2 dNm2 XNm1 dNm1
\n
"
);
printf
(
"doing DMRS pattern for port 2 : X0 d0 X1 d1 ... XNm2 dNm2 XNm1 dNm1
\n
"
);
#endif
#endif
// add filler to process all as SIMD
c16_t
*
out
=
txF
;
c16_t
dmrs_mux
[(
sz
+
63
)
&~
63
]
__attribute__
((
aligned
(
64
)));
c16_t
*
in
=
mod_dmrs
;
c16_t
*
out
=
dmrs_mux
;
int
i
=
0
;
int
i
=
0
;
int
end
=
sz
/
2
;
int
end
=
sz
/
2
;
c16_t
*
txlc
=
txl
;
c16_t
*
txlc
=
txl
;
...
@@ -675,74 +595,57 @@ static inline void dmrs_case7(c16_t *txF,
...
@@ -675,74 +595,57 @@ static inline void dmrs_case7(c16_t *txF,
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
permh
=
_mm512_set_epi32
(
31
,
15
,
30
,
14
,
29
,
13
,
28
,
12
,
27
,
11
,
26
,
10
,
25
,
9
,
24
,
8
);
__m512i
permh
=
_mm512_set_epi32
(
31
,
15
,
30
,
14
,
29
,
13
,
28
,
12
,
27
,
11
,
26
,
10
,
25
,
9
,
24
,
8
);
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
in
),
amp_dmrs512
);
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)(
mod_dmrs
+
i
)),
amp_dmrs512
);
in
+=
16
;
__m512i
d1
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
txlc
),
amp512
);
__m512i
d1
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
txlc
),
amp512
);
txlc
+=
16
;
txlc
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d1
,
perml
,
d0
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d1
,
perml
,
d0
)
);
out
+=
16
;
out
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d1
,
permh
,
d0
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d1
,
permh
,
d0
)
);
out
+=
16
;
out
+=
16
;
}
}
#endif
#endif
#if defined(__AVX2__)
#if defined(__AVX2__)
simde__m256i
amp_dmrs256
=
simde_mm256_set1_epi16
(
amp_dmrs
),
amp256
=
simde_mm256_set1_epi16
(
amp
);
simde__m256i
amp_dmrs256
=
simde_mm256_set1_epi16
(
amp_dmrs
),
amp256
=
simde_mm256_set1_epi16
(
amp
);
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
in
),
amp_dmrs256
);
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)(
mod_dmrs
+
i
)),
amp_dmrs256
);
in
+=
8
;
simde__m256i
d1
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
txlc
),
amp256
);
simde__m256i
d1
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
txlc
),
amp256
);
txlc
+=
8
;
txlc
+=
8
;
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
d1
);
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
d1
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
d1
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
d1
);
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
)
);
out
+=
8
;
out
+=
8
;
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
)
);
out
+=
8
;
out
+=
8
;
}
}
#endif
#endif
#if defined(USE128BIT)
#if defined(USE128BIT)
simde__m128i
amp_dmrs128
=
simde_mm_set1_epi16
(
amp_dmrs
),
amp128
=
simde_mm_set1_epi16
(
amp
);
simde__m128i
amp_dmrs128
=
simde_mm_set1_epi16
(
amp_dmrs
),
amp128
=
simde_mm_set1_epi16
(
amp
);
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
in
),
amp_dmrs128
);
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)(
mod_dmrs
+
i
)),
amp_dmrs128
);
in
+=
4
;
simde__m128i
d1
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
txlc
),
amp128
);
simde__m128i
d1
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
txlc
),
amp128
);
txlc
+=
4
;
txlc
+=
4
;
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
d1
);
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
d1
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
d1
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
d1
);
*
(
simde__m128i
*
)
out
=
d2
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d2
)
;
out
+=
4
;
out
+=
4
;
*
(
simde__m128i
*
)
out
=
d3
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d3
)
;
out
+=
4
;
out
+=
4
;
}
}
#endif
#endif
for
(;
i
<
end
;
i
++
)
{
for
(;
i
<
end
;
i
++
)
{
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
txlc
++
;
txlc
++
;
*
out
++
=
(
c16_t
){(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
in
++
;
}
}
memcpy
(
&
txF
[
start_sc
],
dmrs_mux
,
sizeof
(
c16_t
)
*
upper_limit
);
return
sz
/
2
;
if
(
remaining_re
)
memcpy
(
&
txF
[
0
],
&
dmrs_mux
[
upper_limit
],
sizeof
(
c16_t
)
*
remaining_re
);
}
}
static
inline
void
dmrs_case8
(
c16_t
*
txF
,
static
inline
int
dmrs_case13
(
c16_t
*
txF
,
c16_t
*
txl
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
const
int
amp
,
int
sz
)
c16_t
*
txl
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
const
int
amp
,
int
sz
,
int
start_sc
,
int
upper_limit
,
int
remaining_re
)
{
{
#ifdef DEBUG_DLSCH_MAPPING
#ifdef DEBUG_DLSCH_MAPPING
printf
(
"doing DMRS pattern for port 3 : X0 d0 X1 -d1 ... XNm2 dNm2 XNm1 -dNm1
\n
"
);
printf
(
"doing DMRS pattern for port 3 : X0 d0 X1 -d1 ... XNm2 dNm2 XNm1 -dNm1
\n
"
);
#endif
#endif
// add filler to process all as SIMD
c16_t
*
out
=
txF
;
c16_t
dmrs_mux
[(
sz
+
63
)
&~
63
]
__attribute__
((
aligned
(
64
)));
c16_t
*
in
=
mod_dmrs
;
c16_t
*
out
=
dmrs_mux
;
int
i
=
0
;
int
i
=
0
;
int
end
=
sz
/
2
;
int
end
=
sz
/
2
;
c16_t
*
txlc
=
txl
;
c16_t
*
txlc
=
txl
;
...
@@ -784,13 +687,12 @@ static inline void dmrs_case8(c16_t *txF,
...
@@ -784,13 +687,12 @@ static inline void dmrs_case8(c16_t *txF,
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
perml
=
_mm512_set_epi32
(
23
,
7
,
22
,
6
,
21
,
5
,
20
,
4
,
19
,
3
,
18
,
2
,
17
,
1
,
16
,
0
);
__m512i
permh
=
_mm512_set_epi32
(
31
,
15
,
30
,
14
,
29
,
13
,
28
,
12
,
27
,
11
,
26
,
10
,
25
,
9
,
24
,
8
);
__m512i
permh
=
_mm512_set_epi32
(
31
,
15
,
30
,
14
,
29
,
13
,
28
,
12
,
27
,
11
,
26
,
10
,
25
,
9
,
24
,
8
);
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
for
(;
i
<
(
end
&
~
15
);
i
+=
16
)
{
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
in
),
amp_dmrs512
);
__m512i
d0
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)(
mod_dmrs
+
i
)),
amp_dmrs512
);
in
+=
16
;
__m512i
d1
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
txlc
),
amp512
);
__m512i
d1
=
_mm512_mulhrs_epi16
(
_mm512_loadu_si512
((
__m512i
*
)
txlc
),
amp512
);
txlc
+=
16
;
txlc
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d1
,
perml
,
d0
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d1
,
perml
,
d0
)
);
out
+=
16
;
out
+=
16
;
*
(
__m512i
*
)
out
=
_mm512_permutex2var_epi32
(
d1
,
permh
,
d0
);
_mm512_storeu_si512
((
__m512i
*
)
out
,
_mm512_permutex2var_epi32
(
d1
,
permh
,
d0
)
);
out
+=
16
;
out
+=
16
;
}
}
#endif
#endif
...
@@ -813,15 +715,14 @@ static inline void dmrs_case8(c16_t *txF,
...
@@ -813,15 +715,14 @@ static inline void dmrs_case8(c16_t *txF,
amp_dmrs
),
amp_dmrs
),
amp256
=
simde_mm256_set1_epi16
(
amp
);
amp256
=
simde_mm256_set1_epi16
(
amp
);
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
for
(;
i
<
(
end
&
~
7
);
i
+=
8
)
{
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
in
),
amp_dmrs256
);
simde__m256i
d0
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)(
mod_dmrs
+
i
)),
amp_dmrs256
);
in
+=
8
;
simde__m256i
d1
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
txlc
),
amp256
);
simde__m256i
d1
=
simde_mm256_mulhrs_epi16
(
simde_mm256_loadu_si256
((
simde__m256i
*
)
txlc
),
amp256
);
txlc
+=
8
;
txlc
+=
8
;
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
d1
);
simde__m256i
d2
=
simde_mm256_unpacklo_epi32
(
d0
,
d1
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
d1
);
simde__m256i
d3
=
simde_mm256_unpackhi_epi32
(
d0
,
d1
);
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
32
)
);
out
+=
8
;
out
+=
8
;
*
(
simde__m256i
*
)
out
=
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
);
simde_mm256_storeu_si256
((
simde__m256i
*
)
out
,
simde_mm256_permute2x128_si256
(
d2
,
d3
,
49
)
);
out
+=
8
;
out
+=
8
;
}
}
...
@@ -830,50 +731,45 @@ static inline void dmrs_case8(c16_t *txF,
...
@@ -830,50 +731,45 @@ static inline void dmrs_case8(c16_t *txF,
simde__m128i
amp_dmrs128
=
simde_mm_set_epi16
(
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
,
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
),
simde__m128i
amp_dmrs128
=
simde_mm_set_epi16
(
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
,
-
amp_dmrs
,
-
amp_dmrs
,
amp_dmrs
,
amp_dmrs
),
amp128
=
simde_mm_set1_epi16
(
amp
);
amp128
=
simde_mm_set1_epi16
(
amp
);
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
for
(;
i
<
(
end
&
~
3
);
i
+=
4
)
{
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
in
),
amp_dmrs128
);
simde__m128i
d0
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)(
mod_dmrs
+
i
)),
amp_dmrs128
);
in
+=
4
;
simde__m128i
d1
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
txlc
),
amp128
);
simde__m128i
d1
=
simde_mm_mulhrs_epi16
(
simde_mm_loadu_si128
((
simde__m128i
*
)
txlc
),
amp128
);
txlc
+=
4
;
txlc
+=
4
;
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
d1
);
simde__m128i
d2
=
simde_mm_unpacklo_epi32
(
d0
,
d1
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
d1
);
simde__m128i
d3
=
simde_mm_unpackhi_epi32
(
d0
,
d1
);
*
(
simde__m128i
*
)
out
=
d2
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d2
)
;
out
+=
4
;
out
+=
4
;
*
(
simde__m128i
*
)
out
=
d3
;
simde_mm_storeu_si128
((
simde__m128i
*
)
out
,
d3
)
;
out
+=
4
;
out
+=
4
;
}
}
#endif
#endif
for
(;
i
<
end
;
i
+=
2
)
{
for
(;
i
<
end
;)
{
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
txlc
++
;
txlc
++
;
*
out
++
=
(
c16_t
){(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
i
n
++
;
i
++
;
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){(((
txlc
->
r
*
amp
)
>>
14
)
+
1
)
>>
1
,
(((
txlc
->
i
*
amp
)
>>
14
)
+
1
)
>>
1
};
txlc
++
;
txlc
++
;
*
out
++
=
(
c16_t
){
-
(((
in
->
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
-
(((
in
->
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
*
out
++
=
(
c16_t
){
-
(((
mod_dmrs
[
i
].
r
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
,
-
(((
mod_dmrs
[
i
].
i
*
amp_dmrs
)
>>
14
)
+
1
)
>>
1
};
i
n
++
;
i
++
;
}
}
memcpy
(
&
txF
[
start_sc
],
dmrs_mux
,
sizeof
(
c16_t
)
*
upper_limit
);
return
sz
/
2
;
if
(
remaining_re
)
memcpy
(
&
txF
[
0
],
&
dmrs_mux
[
upper_limit
],
sizeof
(
c16_t
)
*
remaining_re
);
}
}
static
inline
int
dmrs_case9
(
int
k
,
static
inline
int
dmrs_case00
(
c16_t
*
txF
,
c16_t
*
txF
,
c16_t
*
txl
,
c16_t
*
txl
,
c16_t
*
mod_dmrs
,
c16_t
*
mod_dmrs
,
const
int
amp_dmrs
,
const
int
amp_dmrs
,
const
int
amp
,
const
int
amp
,
int
sz
,
int
sz
,
int
start_sc
,
uint
*
cur_re
,
int
remaining_re
,
int
start_sc
,
int
dmrs_port
,
int
remaining_re
,
const
int
dmrs_Type
,
int
dmrs_port
,
uint8_t
*
k_prime
,
const
int
dmrs_Type
,
uint16_t
*
n
,
uint8_t
*
k_prime
,
int
symbol_sz
,
uint16_t
*
n
,
int
l_prime
,
int
symbol_sz
,
uint8_t
numDmrsCdmGrpsNoData
)
int
l_prime
,
nfapi_nr_dl_tti_pdsch_pdu_rel15_t
*
rel15
)
{
{
// add filler to process all as SIMD
// add filler to process all as SIMD
//c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64)));
//c16_t dmrs_mux[(sz+63)&~63] __attribute__((aligned(64)));
...
@@ -884,6 +780,8 @@ static inline int dmrs_case9(int k,
...
@@ -884,6 +780,8 @@ static inline int dmrs_case9(int k,
get_Wf
(
Wf
,
dmrs_port
,
dmrs_Type
);
get_Wf
(
Wf
,
dmrs_port
,
dmrs_Type
);
const
int8_t
delta
=
get_delta
(
dmrs_port
,
dmrs_Type
);
const
int8_t
delta
=
get_delta
(
dmrs_port
,
dmrs_Type
);
int
dmrs_idx
=
0
;
int
dmrs_idx
=
0
;
int
k
=
start_sc
;
c16_t
*
in
=
txl
;
for
(
int
i
=
0
;
i
<
sz
;
i
++
)
{
for
(
int
i
=
0
;
i
<
sz
;
i
++
)
{
if
(
k
==
((
start_sc
+
get_dmrs_freq_idx
(
*
n
,
*
k_prime
,
delta
,
dmrs_Type
))
%
(
symbol_sz
)))
{
if
(
k
==
((
start_sc
+
get_dmrs_freq_idx
(
*
n
,
*
k_prime
,
delta
,
dmrs_Type
))
%
(
symbol_sz
)))
{
txF
[
k
]
=
c16mulRealShift
(
mod_dmrs
[
dmrs_idx
],
Wt
[
l_prime
]
*
Wf
[
*
k_prime
]
*
amp_dmrs
,
15
);
txF
[
k
]
=
c16mulRealShift
(
mod_dmrs
[
dmrs_idx
],
Wt
[
l_prime
]
*
Wf
[
*
k_prime
]
*
amp_dmrs
,
15
);
...
@@ -893,9 +791,8 @@ static inline int dmrs_case9(int k,
...
@@ -893,9 +791,8 @@ static inline int dmrs_case9(int k,
}
}
/* Map PTRS Symbol */
/* Map PTRS Symbol */
/* Map DATA Symbol */
/* Map DATA Symbol */
else
if
(
allowed_xlsch_re_in_dmrs_symbol
(
k
,
start_sc
,
symbol_sz
,
rel15
->
numDmrsCdmGrpsNoData
,
dmrs_Type
))
{
else
if
(
allowed_xlsch_re_in_dmrs_symbol
(
k
,
start_sc
,
symbol_sz
,
numDmrsCdmGrpsNoData
,
dmrs_Type
))
{
txF
[
k
]
=
c16mulRealShift
(
txl
[
*
cur_re
],
amp
,
15
);
txF
[
k
]
=
c16mulRealShift
(
*
in
++
,
amp
,
15
);
*
cur_re
=
*
cur_re
+
1
;
}
}
/* mute RE */
/* mute RE */
else
{
else
{
...
@@ -904,7 +801,7 @@ static inline int dmrs_case9(int k,
...
@@ -904,7 +801,7 @@ static inline int dmrs_case9(int k,
if
(
++
k
>=
symbol_sz
)
if
(
++
k
>=
symbol_sz
)
k
-=
symbol_sz
;
k
-=
symbol_sz
;
}
// RE loop
}
// RE loop
return
k
;
return
in
-
txl
;
}
}
static
inline
int
no_ptrs_dmrs_case
(
c16_t
*
txF
,
c16_t
*
txl
,
const
int
amp_dmrs
,
const
int
amp
,
const
int
sz
)
static
inline
int
no_ptrs_dmrs_case
(
c16_t
*
txF
,
c16_t
*
txl
,
const
int
amp_dmrs
,
const
int
amp
,
const
int
sz
)
...
@@ -1119,7 +1016,6 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
...
@@ -1119,7 +1016,6 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
cur_re
=
re_beginning_of_symbol
;
cur_re
=
re_beginning_of_symbol
;
c16_t
*
txF
=
txdataF_precoding
[
layer
][
l_symbol
];
c16_t
*
txF
=
txdataF_precoding
[
layer
][
l_symbol
];
c16_t
*
txl
=
tx_layers
[
layer
];
c16_t
*
txl
=
tx_layers
[
layer
];
int
k
=
start_sc
;
const
uint
sz
=
rel15
->
rbSize
*
NR_NB_SC_PER_RB
;
const
uint
sz
=
rel15
->
rbSize
*
NR_NB_SC_PER_RB
;
int
upper_limit
=
sz
;
int
upper_limit
=
sz
;
int
remaining_re
=
0
;
int
remaining_re
=
0
;
...
@@ -1135,84 +1031,79 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
...
@@ -1135,84 +1031,79 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
}
}
if
(
ptrs_symbol
)
{
if
(
ptrs_symbol
)
{
/* PTRS QPSK Modulation for each OFDM symbol in a slot */
/* PTRS QPSK Modulation for each OFDM symbol in a slot */
LOG_D
(
PHY
,
"Doing ptrs modulation for symbol %d, n_ptrs %d
\n
"
,
l_symbol
,
n_ptrs
);
LOG_D
(
PHY
,
"Doing ptrs modulation for symbol %d, n_ptrs %d
\n
"
,
l_symbol
,
n_ptrs
);
c16_t
mod_ptrs
[
max
(
n_ptrs
,
1
)]
c16_t
mod_ptrs
[
max
(
n_ptrs
,
1
)]
__attribute__
((
aligned
(
64
)));
// max only to please sanitizer, that kills if 0 even if it is not a error
__attribute__
((
aligned
(
64
)));
// max only to please sanitizer, that kills if 0 even if it is not a error
const
uint32_t
*
gold
=
nr_gold_pdsch
(
frame_parms
->
N_RB_DL
,
const
uint32_t
*
gold
=
nr_gold_pdsch
(
frame_parms
->
N_RB_DL
,
frame_parms
->
symbols_per_slot
,
frame_parms
->
symbols_per_slot
,
rel15
->
dlDmrsScramblingId
,
rel15
->
dlDmrsScramblingId
,
rel15
->
SCID
,
rel15
->
SCID
,
slot
,
slot
,
l_symbol
);
l_symbol
);
nr_modulation
(
gold
,
n_ptrs
*
DMRS_MOD_ORDER
,
DMRS_MOD_ORDER
,
(
int16_t
*
)
mod_ptrs
);
nr_modulation
(
gold
,
n_ptrs
*
DMRS_MOD_ORDER
,
DMRS_MOD_ORDER
,
(
int16_t
*
)
mod_ptrs
);
k
=
do_ptrs_symbol
(
rel15
,
start_sc
,
k
,
&
cur_re
,
symbol_sz
,
txF
,
txl
,
amp
,
mod_ptrs
);
cur_re
+=
do_ptrs_symbol
(
rel15
,
start_sc
,
symbol_sz
,
txF
,
txl
+
cur_re
,
amp
,
mod_ptrs
);
}
else
if
(
dmrs_symbol_map
&
(
1
<<
l_symbol
))
{
}
else
if
(
dmrs_symbol_map
&
(
1
<<
l_symbol
))
{
/* Map DMRS Symbol */
/* Map DMRS Symbol */
int
dmrs_port
=
get_dmrs_port
(
layer
,
rel15
->
dmrsPorts
);
int
dmrs_port
=
get_dmrs_port
(
layer
,
rel15
->
dmrsPorts
);
if
(
l_prime
==
0
&&
dmrs_Type
==
NFAPI_NR_DMRS_TYPE1
)
{
#ifdef DEBUG_DLSCH_MAPPING
if
(
rel15
->
numDmrsCdmGrpsNoData
==
2
)
{
int
Wt
[
2
],
Wf
[
2
];
switch
(
dmrs_port
&
3
)
{
get_Wt
(
Wt
,
dmrs_port
,
dmrs_Type
);
case
0
:
get_Wf
(
Wf
,
dmrs_port
,
dmrs_Type
);
cur_re
+=
dmrs_case20
(
txF
+
start_sc
,
dmrs_start
,
amp_dmrs
,
upper_limit
);
const
int8_t
delta
=
get_delta
(
dmrs_port
,
dmrs_Type
);
cur_re
+=
dmrs_case20
(
txF
,
dmrs_start
,
amp_dmrs
,
remaining_re
);
uint8_t
dmrs_symbol
=
l_overline
+
l_prime
;
break
;
case
1
:
printf
(
cur_re
+=
dmrs_case21
(
txF
+
start_sc
,
dmrs_start
,
amp_dmrs
,
upper_limit
);
"DMRS Type %d params for layer %d : numDmrsCdmGrpsNoData %d Wt %d %d
\t
Wf %d %d
\t
delta %d
\t
l_prime %d
\t
"
cur_re
+=
dmrs_case21
(
txF
,
dmrs_start
,
amp_dmrs
,
remaining_re
);
"l0 "
break
;
"%d
\t
DMRS symbol %d
\n
"
,
case
2
:
1
+
dmrs_Type
,
cur_re
+=
dmrs_case22
(
txF
+
start_sc
,
dmrs_start
,
amp_dmrs
,
upper_limit
);
layer
,
cur_re
+=
dmrs_case22
(
txF
,
dmrs_start
,
amp_dmrs
,
remaining_re
);
rel15
->
numDmrsCdmGrpsNoData
,
break
;
Wt
[
0
],
case
3
:
Wt
[
1
],
cur_re
+=
dmrs_case23
(
txF
+
start_sc
,
dmrs_start
,
amp_dmrs
,
upper_limit
);
Wf
[
0
],
cur_re
+=
dmrs_case23
(
txF
,
dmrs_start
,
amp_dmrs
,
remaining_re
);
Wf
[
1
],
break
;
delta
,
}
l_prime
,
}
else
if
(
rel15
->
numDmrsCdmGrpsNoData
==
1
)
{
l_overline
,
switch
(
dmrs_port
&
3
)
{
dmrs_symbol
);
case
0
:
#endif
cur_re
+=
dmrs_case10
(
txF
+
start_sc
,
txl
+
cur_re
,
dmrs_start
,
amp_dmrs
,
amp
,
upper_limit
);
if
(
rel15
->
numDmrsCdmGrpsNoData
==
2
&&
dmrs_Type
==
0
&&
(
dmrs_port
&
3
)
==
0
&&
l_prime
==
0
)
{
cur_re
+=
dmrs_case10
(
txF
,
txl
+
cur_re
,
dmrs_start
+
(
sz
-
remaining_re
)
/
2
,
amp_dmrs
,
amp
,
remaining_re
);
dmrs_case1
(
txF
,
dmrs_start
,
amp_dmrs
,
sz
,
start_sc
,
upper_limit
,
remaining_re
);
break
;
}
else
if
(
rel15
->
numDmrsCdmGrpsNoData
==
2
&&
dmrs_Type
==
0
&&
(
dmrs_port
&
3
)
==
1
&&
l_prime
==
0
)
{
case
1
:
dmrs_case2
(
txF
,
dmrs_start
,
amp_dmrs
,
sz
,
start_sc
,
upper_limit
,
remaining_re
);
cur_re
+=
dmrs_case11
(
txF
+
start_sc
,
txl
+
cur_re
,
dmrs_start
,
amp_dmrs
,
amp
,
upper_limit
);
}
else
if
(
rel15
->
numDmrsCdmGrpsNoData
==
2
&&
dmrs_Type
==
0
&&
(
dmrs_port
&
3
)
==
2
&&
l_prime
==
0
)
{
cur_re
+=
dmrs_case11
(
txF
,
txl
+
cur_re
,
dmrs_start
+
(
sz
-
remaining_re
)
/
2
,
amp_dmrs
,
amp
,
remaining_re
);
dmrs_case3
(
txF
,
dmrs_start
,
amp_dmrs
,
sz
,
start_sc
,
upper_limit
,
remaining_re
);
break
;
}
else
if
(
rel15
->
numDmrsCdmGrpsNoData
==
2
&&
dmrs_Type
==
0
&&
(
dmrs_port
&
3
)
==
3
&&
l_prime
==
0
)
{
case
2
:
dmrs_case4
(
txF
,
dmrs_start
,
amp_dmrs
,
sz
,
start_sc
,
upper_limit
,
remaining_re
);
cur_re
+=
dmrs_case12
(
txF
+
start_sc
,
txl
+
cur_re
,
dmrs_start
,
amp_dmrs
,
amp
,
upper_limit
);
}
else
if
(
rel15
->
numDmrsCdmGrpsNoData
==
1
&&
dmrs_Type
==
0
&&
(
dmrs_port
&
3
)
==
0
&&
l_prime
==
0
)
{
cur_re
+=
dmrs_case12
(
txF
,
txl
+
cur_re
,
dmrs_start
+
(
sz
-
remaining_re
)
/
2
,
amp_dmrs
,
amp
,
remaining_re
);
dmrs_case5
(
txF
,
txl
+
cur_re
,
dmrs_start
,
amp_dmrs
,
amp
,
sz
,
start_sc
,
upper_limit
,
remaining_re
);
break
;
cur_re
+=
sz
>>
1
;
case
3
:
}
else
if
(
rel15
->
numDmrsCdmGrpsNoData
==
1
&&
dmrs_Type
==
0
&&
(
dmrs_port
&
3
)
==
1
&&
l_prime
==
0
)
{
cur_re
+=
dmrs_case13
(
txF
+
start_sc
,
txl
+
cur_re
,
dmrs_start
,
amp_dmrs
,
amp
,
upper_limit
);
dmrs_case6
(
txF
,
txl
+
cur_re
,
dmrs_start
,
amp_dmrs
,
amp
,
sz
,
start_sc
,
upper_limit
,
remaining_re
);
cur_re
+=
dmrs_case13
(
txF
,
txl
+
cur_re
,
dmrs_start
+
(
sz
-
remaining_re
)
/
2
,
amp_dmrs
,
amp
,
remaining_re
);
cur_re
+=
sz
>>
1
;
break
;
}
else
if
(
rel15
->
numDmrsCdmGrpsNoData
==
1
&&
dmrs_Type
==
0
&&
(
dmrs_port
&
3
)
==
2
&&
l_prime
==
0
)
{
}
dmrs_case7
(
txF
,
txl
+
cur_re
,
dmrs_start
,
amp_dmrs
,
amp
,
sz
,
start_sc
,
upper_limit
,
remaining_re
);
}
else
cur_re
+=
sz
>>
1
;
AssertFatal
(
false
,
"rel15->numDmrsCdmGrpsNoData is %d
\n
"
,
rel15
->
numDmrsCdmGrpsNoData
);
}
else
if
(
rel15
->
numDmrsCdmGrpsNoData
==
1
&&
dmrs_Type
==
0
&&
(
dmrs_port
&
3
)
==
3
&&
l_prime
==
0
)
{
dmrs_case8
(
txF
,
txl
+
cur_re
,
dmrs_start
,
amp_dmrs
,
amp
,
sz
,
start_sc
,
upper_limit
,
remaining_re
);
cur_re
+=
sz
>>
1
;
}
else
{
}
else
{
k
=
dmrs_case9
(
k
,
cur_re
+=
dmrs_case00
(
txF
,
txF
,
txl
+
cur_re
,
txl
,
dmrs_start
,
dmrs_start
,
amp_dmrs
,
amp_dmrs
,
amp
,
amp
,
sz
,
sz
,
start_sc
,
&
cur_re
,
remaining_re
,
start_sc
,
dmrs_port
,
remaining_re
,
dmrs_Type
,
dmrs_port
,
&
k_prime
,
dmrs_Type
,
&
n
,
&
k_prime
,
symbol_sz
,
&
n
,
l_prime
,
symbol_sz
,
rel15
->
numDmrsCdmGrpsNoData
);
l_prime
,
rel15
);
}
// generic DMRS case
}
// generic DMRS case
}
else
{
// no PTRS or DMRS in this symbol
}
else
{
// no PTRS or DMRS in this symbol
cur_re
+=
no_ptrs_dmrs_case
(
txF
+
start_sc
,
txl
+
cur_re
,
amp_dmrs
,
amp
,
upper_limit
);
cur_re
+=
no_ptrs_dmrs_case
(
txF
+
start_sc
,
txl
+
cur_re
,
amp_dmrs
,
amp
,
upper_limit
);
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment