\doxysection{src/core/conv\+\_\+acc\+\_\+neon\+\_\+impl.h File Reference} \label{conv__acc__neon__impl_8h}\index{src/core/conv\_acc\_neon\_impl.h@{src/core/conv\_acc\_neon\_impl.h}} Accelerated Viterbi decoder implementation\+: straight port of SSE to NEON based on Tom Tsous work. \doxysubsection*{Macros} \begin{DoxyCompactItemize} \item \#define \textbf{ \+\_\+\+\_\+always\+\_\+inline}~\textbf{ inline} \textbf{ \+\_\+\+\_\+attribute\+\_\+\+\_\+}((always\+\_\+inline)) \item \#define \textbf{ NEON\+\_\+\+BUTTERFLY}(M0, M1, M2, M3, M4) \item \#define \textbf{ NEON\+\_\+\+DEINTERLEAVE\+\_\+\+K5}(M0, M1, M2, M3) \item \#define \textbf{ NEON\+\_\+\+DEINTERLEAVE\+\_\+\+K7}(M0, M1, M2, M3, M4, M5, M6, M7, M8, M9, M10, M11, M12, M13, M14, M15) \item \#define \textbf{ NEON\+\_\+\+BRANCH\+\_\+\+METRIC\+\_\+\+N2}(M0, M1, M2, M3, M4, M6, M7) \item \#define \textbf{ NEON\+\_\+\+BRANCH\+\_\+\+METRIC\+\_\+\+N4}(M0, M1, M2, M3, M4, M5) \item \#define \textbf{ NEON\+\_\+\+NORMALIZE\+\_\+\+K5}(M0, M1, M2, M3) \item \#define \textbf{ NEON\+\_\+\+NORMALIZE\+\_\+\+K7}(M0, M1, M2, M3, M4, M5, M6, M7, M8, M9, M10, M11) \end{DoxyCompactItemize} \doxysubsection*{Functions} \begin{DoxyCompactItemize} \item \textbf{ \+\_\+\+\_\+always\+\_\+inline} void \textbf{ \+\_\+neon\+\_\+metrics\+\_\+k5\+\_\+n2} (const int16\+\_\+t $\ast$val, const int16\+\_\+t $\ast$outa, int16\+\_\+t $\ast$sumsa, int16\+\_\+t $\ast$paths, int norm) \item \textbf{ \+\_\+\+\_\+always\+\_\+inline} void \textbf{ \+\_\+neon\+\_\+metrics\+\_\+k5\+\_\+n4} (const int16\+\_\+t $\ast$val, const int16\+\_\+t $\ast$outa, int16\+\_\+t $\ast$sumsa, int16\+\_\+t $\ast$paths, int norm) \item static \textbf{ \+\_\+\+\_\+always\+\_\+inline} void \textbf{ \+\_\+neon\+\_\+metrics\+\_\+k7\+\_\+n2} (const int16\+\_\+t $\ast$val, const int16\+\_\+t $\ast$outa, int16\+\_\+t $\ast$sumsa, int16\+\_\+t $\ast$paths, int norm) \item static \textbf{ \+\_\+\+\_\+always\+\_\+inline} void \textbf{ \+\_\+neon\+\_\+metrics\+\_\+k7\+\_\+n4} (const int16\+\_\+t $\ast$val, const int16\+\_\+t $\ast$outa, int16\+\_\+t $\ast$sumsa, int16\+\_\+t $\ast$paths, int norm) \end{DoxyCompactItemize} \doxysubsection{Detailed Description} Accelerated Viterbi decoder implementation\+: straight port of SSE to NEON based on Tom Tsous work. \doxysubsection{Macro Definition Documentation} \mbox{\label{conv__acc__neon__impl_8h_a6034e8cd4bcd5bacfd060abd01bbd8a8}} \index{conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}!\_\_always\_inline@{\_\_always\_inline}} \index{\_\_always\_inline@{\_\_always\_inline}!conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}} \doxysubsubsection{\_\_always\_inline} {\footnotesize\ttfamily \#define \+\_\+\+\_\+always\+\_\+inline~\textbf{ inline} \textbf{ \+\_\+\+\_\+attribute\+\_\+\+\_\+}((always\+\_\+inline))} \mbox{\label{conv__acc__neon__impl_8h_a61dbf015c8f61eb5d7775df881ec7daa}} \index{conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}!NEON\_BRANCH\_METRIC\_N2@{NEON\_BRANCH\_METRIC\_N2}} \index{NEON\_BRANCH\_METRIC\_N2@{NEON\_BRANCH\_METRIC\_N2}!conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}} \doxysubsubsection{NEON\_BRANCH\_METRIC\_N2} {\footnotesize\ttfamily \#define NEON\+\_\+\+BRANCH\+\_\+\+METRIC\+\_\+\+N2(\begin{DoxyParamCaption}\item[{}]{M0, }\item[{}]{M1, }\item[{}]{M2, }\item[{}]{M3, }\item[{}]{M4, }\item[{}]{M6, }\item[{}]{M7 }\end{DoxyParamCaption})} {\bfseries Value\+:} \begin{DoxyCode}{0} \DoxyCodeLine{\{ \(\backslash\)} \DoxyCodeLine{ M0 = vmulq\_s16(M4, M0); \(\backslash\)} \DoxyCodeLine{ M1 = vmulq\_s16(M4, M1); \(\backslash\)} \DoxyCodeLine{ M2 = vmulq\_s16(M4, M2); \(\backslash\)} \DoxyCodeLine{ M3 = vmulq\_s16(M4, M3); \(\backslash\)} \DoxyCodeLine{ M6 = vcombine\_s16(vpadd\_s16(vget\_low\_s16(M0), vget\_high\_s16(M0)), vpadd\_s16(vget\_low\_s16(M1), vget\_high\_s16(M1))); \(\backslash\)} \DoxyCodeLine{ M7 = vcombine\_s16(vpadd\_s16(vget\_low\_s16(M2), vget\_high\_s16(M2)), vpadd\_s16(vget\_low\_s16(M3), vget\_high\_s16(M3))); \(\backslash\)} \DoxyCodeLine{\}} \end{DoxyCode} \mbox{\label{conv__acc__neon__impl_8h_a64763794a6958e9f6353ca647c34035e}} \index{conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}!NEON\_BRANCH\_METRIC\_N4@{NEON\_BRANCH\_METRIC\_N4}} \index{NEON\_BRANCH\_METRIC\_N4@{NEON\_BRANCH\_METRIC\_N4}!conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}} \doxysubsubsection{NEON\_BRANCH\_METRIC\_N4} {\footnotesize\ttfamily \#define NEON\+\_\+\+BRANCH\+\_\+\+METRIC\+\_\+\+N4(\begin{DoxyParamCaption}\item[{}]{M0, }\item[{}]{M1, }\item[{}]{M2, }\item[{}]{M3, }\item[{}]{M4, }\item[{}]{M5 }\end{DoxyParamCaption})} {\bfseries Value\+:} \begin{DoxyCode}{0} \DoxyCodeLine{\{ \(\backslash\)} \DoxyCodeLine{ M0 = vmulq\_s16(M4, M0); \(\backslash\)} \DoxyCodeLine{ M1 = vmulq\_s16(M4, M1); \(\backslash\)} \DoxyCodeLine{ M2 = vmulq\_s16(M4, M2); \(\backslash\)} \DoxyCodeLine{ M3 = vmulq\_s16(M4, M3); \(\backslash\)} \DoxyCodeLine{ int16x4\_t t1 = vpadd\_s16(vpadd\_s16(vget\_low\_s16(M0), vget\_high\_s16(M0)), vpadd\_s16(vget\_low\_s16(M1), vget\_high\_s16(M1))); \(\backslash\)} \DoxyCodeLine{ int16x4\_t t2 = vpadd\_s16(vpadd\_s16(vget\_low\_s16(M2), vget\_high\_s16(M2)), vpadd\_s16(vget\_low\_s16(M3), vget\_high\_s16(M3))); \(\backslash\)} \DoxyCodeLine{ M5 = vcombine\_s16(t1, t2); \(\backslash\)} \DoxyCodeLine{\}} \end{DoxyCode} \mbox{\label{conv__acc__neon__impl_8h_a3fd71b2646da81cd331245dd0a99f3e7}} \index{conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}!NEON\_BUTTERFLY@{NEON\_BUTTERFLY}} \index{NEON\_BUTTERFLY@{NEON\_BUTTERFLY}!conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}} \doxysubsubsection{NEON\_BUTTERFLY} {\footnotesize\ttfamily \#define NEON\+\_\+\+BUTTERFLY(\begin{DoxyParamCaption}\item[{}]{M0, }\item[{}]{M1, }\item[{}]{M2, }\item[{}]{M3, }\item[{}]{M4 }\end{DoxyParamCaption})} {\bfseries Value\+:} \begin{DoxyCode}{0} \DoxyCodeLine{\{ \(\backslash\)} \DoxyCodeLine{ M3 = vqaddq\_s16(M0, M2); \(\backslash\)} \DoxyCodeLine{ M4 = vqsubq\_s16(M1, M2); \(\backslash\)} \DoxyCodeLine{ M0 = vqsubq\_s16(M0, M2); \(\backslash\)} \DoxyCodeLine{ M1 = vqaddq\_s16(M1, M2); \(\backslash\)} \DoxyCodeLine{ M2 = vmaxq\_s16(M3, M4); \(\backslash\)} \DoxyCodeLine{ M3 = vreinterpretq\_s16\_u16(vcgtq\_s16(M3, M4)); \(\backslash\)} \DoxyCodeLine{ M4 = vmaxq\_s16(M0, M1); \(\backslash\)} \DoxyCodeLine{ M1 = vreinterpretq\_s16\_u16(vcgtq\_s16(M0, M1)); \(\backslash\)} \DoxyCodeLine{\}} \end{DoxyCode} \mbox{\label{conv__acc__neon__impl_8h_a64a643c2264cb3d2037c1b5a92d75029}} \index{conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}!NEON\_DEINTERLEAVE\_K5@{NEON\_DEINTERLEAVE\_K5}} \index{NEON\_DEINTERLEAVE\_K5@{NEON\_DEINTERLEAVE\_K5}!conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}} \doxysubsubsection{NEON\_DEINTERLEAVE\_K5} {\footnotesize\ttfamily \#define NEON\+\_\+\+DEINTERLEAVE\+\_\+\+K5(\begin{DoxyParamCaption}\item[{}]{M0, }\item[{}]{M1, }\item[{}]{M2, }\item[{}]{M3 }\end{DoxyParamCaption})} {\bfseries Value\+:} \begin{DoxyCode}{0} \DoxyCodeLine{\{ \(\backslash\)} \DoxyCodeLine{ int16x8x2\_t tmp; \(\backslash\)} \DoxyCodeLine{ tmp = vuzpq\_s16(M0, M1); \(\backslash\)} \DoxyCodeLine{ M2 = tmp.val[0]; \(\backslash\)} \DoxyCodeLine{ M3 = tmp.val[1]; \(\backslash\)} \DoxyCodeLine{\}} \end{DoxyCode} \mbox{\label{conv__acc__neon__impl_8h_a2c3b91ddfe96dab0e7c38ab4a49cf96b}} \index{conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}!NEON\_DEINTERLEAVE\_K7@{NEON\_DEINTERLEAVE\_K7}} \index{NEON\_DEINTERLEAVE\_K7@{NEON\_DEINTERLEAVE\_K7}!conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}} \doxysubsubsection{NEON\_DEINTERLEAVE\_K7} {\footnotesize\ttfamily \#define NEON\+\_\+\+DEINTERLEAVE\+\_\+\+K7(\begin{DoxyParamCaption}\item[{}]{M0, }\item[{}]{M1, }\item[{}]{M2, }\item[{}]{M3, }\item[{}]{M4, }\item[{}]{M5, }\item[{}]{M6, }\item[{}]{M7, }\item[{}]{M8, }\item[{}]{M9, }\item[{}]{M10, }\item[{}]{M11, }\item[{}]{M12, }\item[{}]{M13, }\item[{}]{M14, }\item[{}]{M15 }\end{DoxyParamCaption})} {\bfseries Value\+:} \begin{DoxyCode}{0} \DoxyCodeLine{\{ \(\backslash\)} \DoxyCodeLine{ int16x8x2\_t tmp; \(\backslash\)} \DoxyCodeLine{ tmp = vuzpq\_s16(M0, M1); \(\backslash\)} \DoxyCodeLine{ M8 = tmp.val[0]; M9 = tmp.val[1]; \(\backslash\)} \DoxyCodeLine{ tmp = vuzpq\_s16(M2, M3); \(\backslash\)} \DoxyCodeLine{ M10 = tmp.val[0]; M11 = tmp.val[1]; \(\backslash\)} \DoxyCodeLine{ tmp = vuzpq\_s16(M4, M5); \(\backslash\)} \DoxyCodeLine{ M12 = tmp.val[0]; M13 = tmp.val[1]; \(\backslash\)} \DoxyCodeLine{ tmp = vuzpq\_s16(M6, M7); \(\backslash\)} \DoxyCodeLine{ M14 = tmp.val[0]; M15 = tmp.val[1]; \(\backslash\)} \DoxyCodeLine{\}} \end{DoxyCode} \mbox{\label{conv__acc__neon__impl_8h_a4ba3dac6cf9e3e6b295aa3cd4f7caea3}} \index{conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}!NEON\_NORMALIZE\_K5@{NEON\_NORMALIZE\_K5}} \index{NEON\_NORMALIZE\_K5@{NEON\_NORMALIZE\_K5}!conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}} \doxysubsubsection{NEON\_NORMALIZE\_K5} {\footnotesize\ttfamily \#define NEON\+\_\+\+NORMALIZE\+\_\+\+K5(\begin{DoxyParamCaption}\item[{}]{M0, }\item[{}]{M1, }\item[{}]{M2, }\item[{}]{M3 }\end{DoxyParamCaption})} {\bfseries Value\+:} \begin{DoxyCode}{0} \DoxyCodeLine{\{ \(\backslash\)} \DoxyCodeLine{ M2 = vminq\_s16(M0, M1); \(\backslash\)} \DoxyCodeLine{ int16x4\_t t = vpmin\_s16(vget\_low\_s16(M2), vget\_high\_s16(M2)); \(\backslash\)} \DoxyCodeLine{ t = vpmin\_s16(t, t); \(\backslash\)} \DoxyCodeLine{ t = vpmin\_s16(t, t); \(\backslash\)} \DoxyCodeLine{ M2 = vdupq\_lane\_s16(t, 0); \(\backslash\)} \DoxyCodeLine{ M0 = vqsubq\_s16(M0, M2); \(\backslash\)} \DoxyCodeLine{ M1 = vqsubq\_s16(M1, M2); \(\backslash\)} \DoxyCodeLine{\}} \end{DoxyCode} \mbox{\label{conv__acc__neon__impl_8h_a4abb399cb2e95aa683d4f3fa4cd62162}} \index{conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}!NEON\_NORMALIZE\_K7@{NEON\_NORMALIZE\_K7}} \index{NEON\_NORMALIZE\_K7@{NEON\_NORMALIZE\_K7}!conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}} \doxysubsubsection{NEON\_NORMALIZE\_K7} {\footnotesize\ttfamily \#define NEON\+\_\+\+NORMALIZE\+\_\+\+K7(\begin{DoxyParamCaption}\item[{}]{M0, }\item[{}]{M1, }\item[{}]{M2, }\item[{}]{M3, }\item[{}]{M4, }\item[{}]{M5, }\item[{}]{M6, }\item[{}]{M7, }\item[{}]{M8, }\item[{}]{M9, }\item[{}]{M10, }\item[{}]{M11 }\end{DoxyParamCaption})} {\bfseries Value\+:} \begin{DoxyCode}{0} \DoxyCodeLine{\{ \(\backslash\)} \DoxyCodeLine{ M8 = vminq\_s16(M0, M1); \(\backslash\)} \DoxyCodeLine{ M9 = vminq\_s16(M2, M3); \(\backslash\)} \DoxyCodeLine{ M10 = vminq\_s16(M4, M5); \(\backslash\)} \DoxyCodeLine{ M11 = vminq\_s16(M6, M7); \(\backslash\)} \DoxyCodeLine{ M8 = vminq\_s16(M8, M9); \(\backslash\)} \DoxyCodeLine{ M10 = vminq\_s16(M10, M11); \(\backslash\)} \DoxyCodeLine{ M8 = vminq\_s16(M8, M10); \(\backslash\)} \DoxyCodeLine{ int16x4\_t t = vpmin\_s16(vget\_low\_s16(M8), vget\_high\_s16(M8)); \(\backslash\)} \DoxyCodeLine{ t = vpmin\_s16(t, t); \(\backslash\)} \DoxyCodeLine{ t = vpmin\_s16(t, t); \(\backslash\)} \DoxyCodeLine{ M8 = vdupq\_lane\_s16(t, 0); \(\backslash\)} \DoxyCodeLine{ M0 = vqsubq\_s16(M0, M8); \(\backslash\)} \DoxyCodeLine{ M1 = vqsubq\_s16(M1, M8); \(\backslash\)} \DoxyCodeLine{ M2 = vqsubq\_s16(M2, M8); \(\backslash\)} \DoxyCodeLine{ M3 = vqsubq\_s16(M3, M8); \(\backslash\)} \DoxyCodeLine{ M4 = vqsubq\_s16(M4, M8); \(\backslash\)} \DoxyCodeLine{ M5 = vqsubq\_s16(M5, M8); \(\backslash\)} \DoxyCodeLine{ M6 = vqsubq\_s16(M6, M8); \(\backslash\)} \DoxyCodeLine{ M7 = vqsubq\_s16(M7, M8); \(\backslash\)} \DoxyCodeLine{\}} \end{DoxyCode} \doxysubsection{Function Documentation} \mbox{\label{conv__acc__neon__impl_8h_a29280174a1b24c944278ea50645d8fc0}} \index{conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}!\_neon\_metrics\_k5\_n2@{\_neon\_metrics\_k5\_n2}} \index{\_neon\_metrics\_k5\_n2@{\_neon\_metrics\_k5\_n2}!conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}} \doxysubsubsection{\_neon\_metrics\_k5\_n2()} {\footnotesize\ttfamily \textbf{ \+\_\+\+\_\+always\+\_\+inline} void \+\_\+neon\+\_\+metrics\+\_\+k5\+\_\+n2 (\begin{DoxyParamCaption}\item[{const int16\+\_\+t $\ast$}]{val, }\item[{const int16\+\_\+t $\ast$}]{outa, }\item[{int16\+\_\+t $\ast$}]{sumsa, }\item[{int16\+\_\+t $\ast$}]{paths, }\item[{int}]{norm }\end{DoxyParamCaption})} References \textbf{ NEON\+\_\+\+BUTTERFLY}, \textbf{ NEON\+\_\+\+DEINTERLEAVE\+\_\+\+K5}, and \textbf{ NEON\+\_\+\+NORMALIZE\+\_\+\+K5}. \mbox{\label{conv__acc__neon__impl_8h_ad117402b21d34712927b710cf3bfaca7}} \index{conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}!\_neon\_metrics\_k5\_n4@{\_neon\_metrics\_k5\_n4}} \index{\_neon\_metrics\_k5\_n4@{\_neon\_metrics\_k5\_n4}!conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}} \doxysubsubsection{\_neon\_metrics\_k5\_n4()} {\footnotesize\ttfamily \textbf{ \+\_\+\+\_\+always\+\_\+inline} void \+\_\+neon\+\_\+metrics\+\_\+k5\+\_\+n4 (\begin{DoxyParamCaption}\item[{const int16\+\_\+t $\ast$}]{val, }\item[{const int16\+\_\+t $\ast$}]{outa, }\item[{int16\+\_\+t $\ast$}]{sumsa, }\item[{int16\+\_\+t $\ast$}]{paths, }\item[{int}]{norm }\end{DoxyParamCaption})} References \textbf{ NEON\+\_\+\+BRANCH\+\_\+\+METRIC\+\_\+\+N4}, \textbf{ NEON\+\_\+\+BUTTERFLY}, \textbf{ NEON\+\_\+\+DEINTERLEAVE\+\_\+\+K5}, and \textbf{ NEON\+\_\+\+NORMALIZE\+\_\+\+K5}. \mbox{\label{conv__acc__neon__impl_8h_a6599ef80e063b632c50e57f189d8c28b}} \index{conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}!\_neon\_metrics\_k7\_n2@{\_neon\_metrics\_k7\_n2}} \index{\_neon\_metrics\_k7\_n2@{\_neon\_metrics\_k7\_n2}!conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}} \doxysubsubsection{\_neon\_metrics\_k7\_n2()} {\footnotesize\ttfamily static \textbf{ \+\_\+\+\_\+always\+\_\+inline} void \+\_\+neon\+\_\+metrics\+\_\+k7\+\_\+n2 (\begin{DoxyParamCaption}\item[{const int16\+\_\+t $\ast$}]{val, }\item[{const int16\+\_\+t $\ast$}]{outa, }\item[{int16\+\_\+t $\ast$}]{sumsa, }\item[{int16\+\_\+t $\ast$}]{paths, }\item[{int}]{norm }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} References \textbf{ NEON\+\_\+\+BRANCH\+\_\+\+METRIC\+\_\+\+N2}, \textbf{ NEON\+\_\+\+BUTTERFLY}, \textbf{ NEON\+\_\+\+DEINTERLEAVE\+\_\+\+K7}, and \textbf{ NEON\+\_\+\+NORMALIZE\+\_\+\+K7}. \mbox{\label{conv__acc__neon__impl_8h_afb3c3ff371dab9cfef30df2b298aafab}} \index{conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}!\_neon\_metrics\_k7\_n4@{\_neon\_metrics\_k7\_n4}} \index{\_neon\_metrics\_k7\_n4@{\_neon\_metrics\_k7\_n4}!conv\_acc\_neon\_impl.h@{conv\_acc\_neon\_impl.h}} \doxysubsubsection{\_neon\_metrics\_k7\_n4()} {\footnotesize\ttfamily static \textbf{ \+\_\+\+\_\+always\+\_\+inline} void \+\_\+neon\+\_\+metrics\+\_\+k7\+\_\+n4 (\begin{DoxyParamCaption}\item[{const int16\+\_\+t $\ast$}]{val, }\item[{const int16\+\_\+t $\ast$}]{outa, }\item[{int16\+\_\+t $\ast$}]{sumsa, }\item[{int16\+\_\+t $\ast$}]{paths, }\item[{int}]{norm }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} References \textbf{ NEON\+\_\+\+BRANCH\+\_\+\+METRIC\+\_\+\+N4}, \textbf{ NEON\+\_\+\+BUTTERFLY}, \textbf{ NEON\+\_\+\+DEINTERLEAVE\+\_\+\+K7}, and \textbf{ NEON\+\_\+\+NORMALIZE\+\_\+\+K7}.