1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483 |
- /*
- * Copyright (C) 2017 C-SKY Microsystems Co., Ltd. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- /******************************************************************************
- * @file csi_simd.h
- * @brief CSI Single Instruction Multiple Data (SIMD) Header File for GCC.
- * @version V1.0
- * @date 02. June 2017
- ******************************************************************************/
- #ifndef _CSI_SIMD_H_
- #define _CSI_SIMD_H_
- /**
- \brief Halfword packing instruction. Combines bits[15:0] of val1 with bits[31:16]
- of val2 levitated with the val3.
- \details Combine a halfword from one register with a halfword from another register.
- The second argument can be left-shifted before extraction of the halfword.
- \param [in] val1 first 16-bit operands
- \param [in] val2 second 16-bit operands
- \param [in] val3 value for left-shifting val2. Value range [0..31].
- \return the combination of halfwords.
- \remark
- res[15:0] = val1[15:0] \n
- res[31:16] = val2[31:16] << val3
- */
- __ALWAYS_INLINE uint32_t __PKHBT(uint32_t val1, uint32_t val2, uint32_t val3)
- {
- return ((((int32_t)(val1) << 0) & (int32_t)0x0000FFFF) | (((int32_t)(val2) << val3) & (int32_t)0xFFFF0000));
- }
- /**
- \brief Halfword packing instruction. Combines bits[31:16] of val1 with bits[15:0]
- of val2 right-shifted with the val3.
- \details Combine a halfword from one register with a halfword from another register.
- The second argument can be right-shifted before extraction of the halfword.
- \param [in] val1 first 16-bit operands
- \param [in] val2 second 16-bit operands
- \param [in] val3 value for right-shifting val2. Value range [1..32].
- \return the combination of halfwords.
- \remark
- res[15:0] = val2[15:0] >> val3 \n
- res[31:16] = val1[31:16]
- */
- __ALWAYS_INLINE uint32_t __PKHTB(uint32_t val1, uint32_t val2, uint32_t val3)
- {
- return ((((int32_t)(val1) << 0) & (int32_t)0xFFFF0000) | (((int32_t)(val2) >> val3) & (int32_t)0x0000FFFF));
- }
- /**
- \brief Dual 16-bit signed saturate.
- \details This function saturates a signed value.
- \param [in] x two signed 16-bit values to be saturated.
- \param [in] y bit position for saturation, an integral constant expression in the range 1 to 16.
- \return the sum of the absolute differences of the following bytes, added to the accumulation value:\n
- the signed saturation of the low halfword in val1, saturated to the bit position specified in
- val2 and returned in the low halfword of the return value.\n
- the signed saturation of the high halfword in val1, saturated to the bit position specified in
- val2 and returned in the high halfword of the return value.
- */
- __ALWAYS_INLINE uint32_t __SSAT16(int32_t x, const uint32_t y)
- {
- int32_t r = 0, s = 0;
- r = __SSAT((((int32_t)x << 16) >> 16), y) & (int32_t)0x0000FFFF;
- s = __SSAT((((int32_t)x) >> 16), y) & (int32_t)0x0000FFFF;
- return ((uint32_t)((s << 16) | (r)));
- }
- /**
- \brief Dual 16-bit unsigned saturate.
- \details This function enables you to saturate two signed 16-bit values to a selected unsigned range.
- \param [in] x two signed 16-bit values to be saturated.
- \param [in] y bit position for saturation, an integral constant expression in the range 1 to 16.
- \return the saturation of the two signed 16-bit values, as non-negative values:
- the saturation of the low halfword in val1, saturated to the bit position specified in
- val2 and returned in the low halfword of the return value.\n
- the saturation of the high halfword in val1, saturated to the bit position specified in
- val2 and returned in the high halfword of the return value.
- */
- __ALWAYS_INLINE uint32_t __USAT16(uint32_t x, const uint32_t y)
- {
- int32_t r = 0, s = 0;
- r = __IUSAT(((x << 16) >> 16), y) & 0x0000FFFF;
- s = __IUSAT(((x) >> 16), y) & 0x0000FFFF;
- return ((s << 16) | (r));
- }
- /**
- \brief Quad 8-bit saturating addition.
- \details This function enables you to perform four 8-bit integer additions,
- saturating the results to the 8-bit signed integer range -2^7 <= x <= 2^7 - 1.
- \param [in] x first four 8-bit summands.
- \param [in] y second four 8-bit summands.
- \return the saturated addition of the first byte of each operand in the first byte of the return value.\n
- the saturated addition of the second byte of each operand in the second byte of the return value.\n
- the saturated addition of the third byte of each operand in the third byte of the return value.\n
- the saturated addition of the fourth byte of each operand in the fourth byte of the return value.\n
- The returned results are saturated to the 8-bit signed integer range -2^7 <= x <= 2^7 - 1.
- \remark
- res[7:0] = val1[7:0] + val2[7:0] \n
- res[15:8] = val1[15:8] + val2[15:8] \n
- res[23:16] = val1[23:16] + val2[23:16] \n
- res[31:24] = val1[31:24] + val2[31:24]
- */
- __ALWAYS_INLINE uint32_t __QADD8(uint32_t x, uint32_t y)
- {
- int32_t r, s, t, u;
- r = __SSAT(((((int32_t)x << 24) >> 24) + (((int32_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF;
- s = __SSAT(((((int32_t)x << 16) >> 24) + (((int32_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF;
- t = __SSAT(((((int32_t)x << 8) >> 24) + (((int32_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF;
- u = __SSAT(((((int32_t)x) >> 24) + (((int32_t)y) >> 24)), 8) & (int32_t)0x000000FF;
- return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r)));
- }
- /**
- \brief Quad 8-bit unsigned saturating addition.
- \details This function enables you to perform four unsigned 8-bit integer additions,
- saturating the results to the 8-bit unsigned integer range 0 < x < 2^8 - 1.
- \param [in] x first four 8-bit summands.
- \param [in] y second four 8-bit summands.
- \return the saturated addition of the first byte of each operand in the first byte of the return value.\n
- the saturated addition of the second byte of each operand in the second byte of the return value.\n
- the saturated addition of the third byte of each operand in the third byte of the return value.\n
- the saturated addition of the fourth byte of each operand in the fourth byte of the return value.\n
- The returned results are saturated to the 8-bit signed integer range 0 <= x <= 2^8 - 1.
- \remark
- res[7:0] = val1[7:0] + val2[7:0] \n
- res[15:8] = val1[15:8] + val2[15:8] \n
- res[23:16] = val1[23:16] + val2[23:16] \n
- res[31:24] = val1[31:24] + val2[31:24]
- */
- __ALWAYS_INLINE uint32_t __UQADD8(uint32_t x, uint32_t y)
- {
- int32_t r, s, t, u;
- r = __IUSAT((((x << 24) >> 24) + ((y << 24) >> 24)), 8) & 0x000000FF;
- s = __IUSAT((((x << 16) >> 24) + ((y << 16) >> 24)), 8) & 0x000000FF;
- t = __IUSAT((((x << 8) >> 24) + ((y << 8) >> 24)), 8) & 0x000000FF;
- u = __IUSAT((((x) >> 24) + ((y) >> 24)), 8) & 0x000000FF;
- return ((u << 24) | (t << 16) | (s << 8) | (r));
- }
- /**
- \brief Quad 8-bit signed addition.
- \details This function performs four 8-bit signed integer additions.
- \param [in] x first four 8-bit summands.
- \param [in] y second four 8-bit summands.
- \return the addition of the first bytes from each operand, in the first byte of the return value.\n
- the addition of the second bytes of each operand, in the second byte of the return value.\n
- the addition of the third bytes of each operand, in the third byte of the return value.\n
- the addition of the fourth bytes of each operand, in the fourth byte of the return value.
- \remark
- res[7:0] = val1[7:0] + val2[7:0] \n
- res[15:8] = val1[15:8] + val2[15:8] \n
- res[23:16] = val1[23:16] + val2[23:16] \n
- res[31:24] = val1[31:24] + val2[31:24]
- */
- __ALWAYS_INLINE uint32_t __SADD8(uint32_t x, uint32_t y)
- {
- int32_t r, s, t, u;
- r = ((((int32_t)x << 24) >> 24) + (((int32_t)y << 24) >> 24)) & (int32_t)0x000000FF;
- s = ((((int32_t)x << 16) >> 24) + (((int32_t)y << 16) >> 24)) & (int32_t)0x000000FF;
- t = ((((int32_t)x << 8) >> 24) + (((int32_t)y << 8) >> 24)) & (int32_t)0x000000FF;
- u = ((((int32_t)x) >> 24) + (((int32_t)y) >> 24)) & (int32_t)0x000000FF;
- return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r)));
- }
- /**
- \brief Quad 8-bit unsigned addition.
- \details This function performs four unsigned 8-bit integer additions.
- \param [in] x first four 8-bit summands.
- \param [in] y second four 8-bit summands.
- \return the addition of the first bytes from each operand, in the first byte of the return value.\n
- the addition of the second bytes of each operand, in the second byte of the return value.\n
- the addition of the third bytes of each operand, in the third byte of the return value.\n
- the addition of the fourth bytes of each operand, in the fourth byte of the return value.
- \remark
- res[7:0] = val1[7:0] + val2[7:0] \n
- res[15:8] = val1[15:8] + val2[15:8] \n
- res[23:16] = val1[23:16] + val2[23:16] \n
- res[31:24] = val1[31:24] + val2[31:24]
- */
- __ALWAYS_INLINE uint32_t __UADD8(uint32_t x, uint32_t y)
- {
- int32_t r, s, t, u;
- r = (((x << 24) >> 24) + ((y << 24) >> 24)) & 0x000000FF;
- s = (((x << 16) >> 24) + ((y << 16) >> 24)) & 0x000000FF;
- t = (((x << 8) >> 24) + ((y << 8) >> 24)) & 0x000000FF;
- u = (((x) >> 24) + ((y) >> 24)) & 0x000000FF;
- return ((u << 24) | (t << 16) | (s << 8) | (r));
- }
- /**
- \brief Quad 8-bit saturating subtract.
- \details This function enables you to perform four 8-bit integer subtractions,
- saturating the results to the 8-bit signed integer range -2^7 <= x <= 2^7 - 1.
- \param [in] x first four 8-bit summands.
- \param [in] y second four 8-bit summands.
- \return the subtraction of the first byte of each operand in the first byte of the return value.\n
- the subtraction of the second byte of each operand in the second byte of the return value.\n
- the subtraction of the third byte of each operand in the third byte of the return value.\n
- the subtraction of the fourth byte of each operand in the fourth byte of the return value.\n
- The returned results are saturated to the 8-bit signed integer range -2^7 <= x <= 2^7 - 1.
- \remark
- res[7:0] = val1[7:0] - val2[7:0] \n
- res[15:8] = val1[15:8] - val2[15:8] \n
- res[23:16] = val1[23:16] - val2[23:16] \n
- res[31:24] = val1[31:24] - val2[31:24]
- */
- __ALWAYS_INLINE uint32_t __QSUB8(uint32_t x, uint32_t y)
- {
- int32_t r, s, t, u;
- r = __SSAT(((((int32_t)x << 24) >> 24) - (((int32_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF;
- s = __SSAT(((((int32_t)x << 16) >> 24) - (((int32_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF;
- t = __SSAT(((((int32_t)x << 8) >> 24) - (((int32_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF;
- u = __SSAT(((((int32_t)x) >> 24) - (((int32_t)y) >> 24)), 8) & (int32_t)0x000000FF;
- return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r)));
- }
- /**
- \brief Quad 8-bit unsigned saturating subtraction.
- \details This function enables you to perform four unsigned 8-bit integer subtractions,
- saturating the results to the 8-bit unsigned integer range 0 < x < 2^8 - 1.
- \param [in] x first four 8-bit summands.
- \param [in] y second four 8-bit summands.
- \return the subtraction of the first byte of each operand in the first byte of the return value.\n
- the subtraction of the second byte of each operand in the second byte of the return value.\n
- the subtraction of the third byte of each operand in the third byte of the return value.\n
- the subtraction of the fourth byte of each operand in the fourth byte of the return value.\n
- The returned results are saturated to the 8-bit unsigned integer range 0 <= x <= 2^8 - 1.
- \remark
- res[7:0] = val1[7:0] - val2[7:0] \n
- res[15:8] = val1[15:8] - val2[15:8] \n
- res[23:16] = val1[23:16] - val2[23:16] \n
- res[31:24] = val1[31:24] - val2[31:24]
- */
- __ALWAYS_INLINE uint32_t __UQSUB8(uint32_t x, uint32_t y)
- {
- int32_t r, s, t, u;
- r = __IUSAT((((x << 24) >> 24) - ((y << 24) >> 24)), 8) & 0x000000FF;
- s = __IUSAT((((x << 16) >> 24) - ((y << 16) >> 24)), 8) & 0x000000FF;
- t = __IUSAT((((x << 8) >> 24) - ((y << 8) >> 24)), 8) & 0x000000FF;
- u = __IUSAT((((x) >> 24) - ((y) >> 24)), 8) & 0x000000FF;
- return ((u << 24) | (t << 16) | (s << 8) | (r));
- }
- /**
- \brief Quad 8-bit signed subtraction.
- \details This function enables you to perform four 8-bit signed integer subtractions.
- \param [in] x first four 8-bit operands of each subtraction.
- \param [in] y second four 8-bit operands of each subtraction.
- \return the subtraction of the first bytes from each operand, in the first byte of the return value.\n
- the subtraction of the second bytes of each operand, in the second byte of the return value.\n
- the subtraction of the third bytes of each operand, in the third byte of the return value.\n
- the subtraction of the fourth bytes of each operand, in the fourth byte of the return value.
- \remark
- res[7:0] = val1[7:0] - val2[7:0] \n
- res[15:8] = val1[15:8] - val2[15:8] \n
- res[23:16] = val1[23:16] - val2[23:16] \n
- res[31:24] = val1[31:24] - val2[31:24]
- */
- __ALWAYS_INLINE uint32_t __SSUB8(uint32_t x, uint32_t y)
- {
- int32_t r, s, t, u;
- r = ((((int32_t)x << 24) >> 24) - (((int32_t)y << 24) >> 24)) & (int32_t)0x000000FF;
- s = ((((int32_t)x << 16) >> 24) - (((int32_t)y << 16) >> 24)) & (int32_t)0x000000FF;
- t = ((((int32_t)x << 8) >> 24) - (((int32_t)y << 8) >> 24)) & (int32_t)0x000000FF;
- u = ((((int32_t)x) >> 24) - (((int32_t)y) >> 24)) & (int32_t)0x000000FF;
- return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r)));
- }
- /**
- \brief Quad 8-bit unsigned subtract.
- \details This function enables you to perform four 8-bit unsigned integer subtractions.
- \param [in] x first four 8-bit operands of each subtraction.
- \param [in] y second four 8-bit operands of each subtraction.
- \return the subtraction of the first bytes from each operand, in the first byte of the return value.\n
- the subtraction of the second bytes of each operand, in the second byte of the return value.\n
- the subtraction of the third bytes of each operand, in the third byte of the return value.\n
- the subtraction of the fourth bytes of each operand, in the fourth byte of the return value.
- \remark
- res[7:0] = val1[7:0] - val2[7:0] \n
- res[15:8] = val1[15:8] - val2[15:8] \n
- res[23:16] = val1[23:16] - val2[23:16] \n
- res[31:24] = val1[31:24] - val2[31:24]
- */
- __ALWAYS_INLINE uint32_t __USUB8(uint32_t x, uint32_t y)
- {
- int32_t r, s, t, u;
- r = (((x << 24) >> 24) - ((y << 24) >> 24)) & 0x000000FF;
- s = (((x << 16) >> 24) - ((y << 16) >> 24)) & 0x000000FF;
- t = (((x << 8) >> 24) - ((y << 8) >> 24)) & 0x000000FF;
- u = (((x) >> 24) - ((y) >> 24)) & 0x000000FF;
- return ((u << 24) | (t << 16) | (s << 8) | (r));
- }
- /**
- \brief Unsigned sum of quad 8-bit unsigned absolute difference.
- \details This function enables you to perform four unsigned 8-bit subtractions, and add the absolute values
- of the differences together, returning the result as a single unsigned integer.
- \param [in] x first four 8-bit operands of each subtraction.
- \param [in] y second four 8-bit operands of each subtraction.
- \return the subtraction of the first bytes from each operand, in the first byte of the return value.\n
- the subtraction of the second bytes of each operand, in the second byte of the return value.\n
- the subtraction of the third bytes of each operand, in the third byte of the return value.\n
- the subtraction of the fourth bytes of each operand, in the fourth byte of the return value.\n
- The sum is returned as a single unsigned integer.
- \remark
- absdiff1 = val1[7:0] - val2[7:0] \n
- absdiff2 = val1[15:8] - val2[15:8] \n
- absdiff3 = val1[23:16] - val2[23:16] \n
- absdiff4 = val1[31:24] - val2[31:24] \n
- res[31:0] = absdiff1 + absdiff2 + absdiff3 + absdiff4
- */
- __ALWAYS_INLINE uint32_t __USAD8(uint32_t x, uint32_t y)
- {
- int32_t r, s, t, u;
- r = (((x << 24) >> 24) - ((y << 24) >> 24)) & 0x000000FF;
- s = (((x << 16) >> 24) - ((y << 16) >> 24)) & 0x000000FF;
- t = (((x << 8) >> 24) - ((y << 8) >> 24)) & 0x000000FF;
- u = (((x) >> 24) - ((y) >> 24)) & 0x000000FF;
- return (u + t + s + r);
- }
- /**
- \brief Unsigned sum of quad 8-bit unsigned absolute difference with 32-bit accumulate.
- \details This function enables you to perform four unsigned 8-bit subtractions, and add the absolute values
- of the differences to a 32-bit accumulate operand.
- \param [in] x first four 8-bit operands of each subtraction.
- \param [in] y second four 8-bit operands of each subtraction.
- \param [in] sum accumulation value.
- \return the sum of the absolute differences of the following bytes, added to the accumulation value:
- the subtraction of the first bytes from each operand, in the first byte of the return value.\n
- the subtraction of the second bytes of each operand, in the second byte of the return value.\n
- the subtraction of the third bytes of each operand, in the third byte of the return value.\n
- the subtraction of the fourth bytes of each operand, in the fourth byte of the return value.
- \remark
- absdiff1 = val1[7:0] - val2[7:0] \n
- absdiff2 = val1[15:8] - val2[15:8] \n
- absdiff3 = val1[23:16] - val2[23:16] \n
- absdiff4 = val1[31:24] - val2[31:24] \n
- sum = absdiff1 + absdiff2 + absdiff3 + absdiff4 \n
- res[31:0] = sum[31:0] + val3[31:0]
- */
- __ALWAYS_INLINE uint32_t __USADA8(uint32_t x, uint32_t y, uint32_t sum)
- {
- int32_t r, s, t, u;
- r = (abs(((x << 24) >> 24) - ((y << 24) >> 24))) & 0x000000FF;
- s = (abs(((x << 16) >> 24) - ((y << 16) >> 24))) & 0x000000FF;
- t = (abs(((x << 8) >> 24) - ((y << 8) >> 24))) & 0x000000FF;
- u = (abs(((x) >> 24) - ((y) >> 24))) & 0x000000FF;
- return (u + t + s + r + sum);
- }
- /**
- \brief Dual 16-bit saturating addition.
- \details This function enables you to perform two 16-bit integer arithmetic additions in parallel,
- saturating the results to the 16-bit signed integer range -2^15 <= x <= 2^15 - 1.
- \param [in] x first two 16-bit summands.
- \param [in] y second two 16-bit summands.
- \return the saturated addition of the low halfwords, in the low halfword of the return value.\n
- the saturated addition of the high halfwords, in the high halfword of the return value.\n
- The returned results are saturated to the 16-bit signed integer range -2^15 <= x <= 2^15 - 1.
- \remark
- res[15:0] = val1[15:0] + val2[15:0] \n
- res[31:16] = val1[31:16] + val2[31:16]
- */
- __ALWAYS_INLINE uint32_t __QADD16(uint32_t x, uint32_t y)
- {
- int32_t r = 0, s = 0;
- r = __SSAT(((((int32_t)x << 16) >> 16) + (((int32_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF;
- s = __SSAT(((((int32_t)x) >> 16) + (((int32_t)y) >> 16)), 16) & (int32_t)0x0000FFFF;
- return ((uint32_t)((s << 16) | (r)));
- }
- /**
- \brief Dual 16-bit unsigned saturating addition.
- \details This function enables you to perform two unsigned 16-bit integer additions, saturating
- the results to the 16-bit unsigned integer range 0 < x < 2^16 - 1.
- \param [in] x first two 16-bit summands.
- \param [in] y second two 16-bit summands.
- \return the saturated addition of the low halfwords, in the low halfword of the return value.\n
- the saturated addition of the high halfwords, in the high halfword of the return value.\n
- The results are saturated to the 16-bit unsigned integer range 0 < x < 2^16 - 1.
- \remark
- res[15:0] = val1[15:0] + val2[15:0] \n
- res[31:16] = val1[31:16] + val2[31:16]
- */
- __ALWAYS_INLINE uint32_t __UQADD16(uint32_t x, uint32_t y)
- {
- int32_t r = 0, s = 0;
- r = __IUSAT((((x << 16) >> 16) + ((y << 16) >> 16)), 16) & 0x0000FFFF;
- s = __IUSAT((((x) >> 16) + ((y) >> 16)), 16) & 0x0000FFFF;
- return ((s << 16) | (r));
- }
- /**
- \brief Dual 16-bit signed addition.
- \details This function enables you to perform two 16-bit signed integer additions.
- \param [in] x first two 16-bit summands.
- \param [in] y second two 16-bit summands.
- \return the addition of the low halfwords in the low halfword of the return value.\n
- the addition of the high halfwords in the high halfword of the return value.
- \remark
- res[15:0] = val1[15:0] + val2[15:0] \n
- res[31:16] = val1[31:16] + val2[31:16]
- */
- __ALWAYS_INLINE uint32_t __SADD16(uint32_t x, uint32_t y)
- {
- int32_t r = 0, s = 0;
- r = ((((int32_t)x << 16) >> 16) + (((int32_t)y << 16) >> 16)) & (int32_t)0x0000FFFF;
- s = ((((int32_t)x) >> 16) + (((int32_t)y) >> 16)) & (int32_t)0x0000FFFF;
- return ((uint32_t)((s << 16) | (r)));
- }
- /**
- \brief Dual 16-bit unsigned addition
- \details This function enables you to perform two 16-bit unsigned integer additions.
- \param [in] x first two 16-bit summands for each addition.
- \param [in] y second two 16-bit summands for each addition.
- \return the addition of the low halfwords in the low halfword of the return value.\n
- the addition of the high halfwords in the high halfword of the return value.
- \remark
- res[15:0] = val1[15:0] + val2[15:0] \n
- res[31:16] = val1[31:16] + val2[31:16]
- */
- __ALWAYS_INLINE uint32_t __UADD16(uint32_t x, uint32_t y)
- {
- int32_t r = 0, s = 0;
- r = (((x << 16) >> 16) + ((y << 16) >> 16)) & 0x0000FFFF;
- s = (((x) >> 16) + ((y) >> 16)) & 0x0000FFFF;
- return ((s << 16) | (r));
- }
- /**
- \brief Dual 16-bit signed addition with halved results.
- \details This function enables you to perform two signed 16-bit integer additions, halving the results.
- \param [in] x first two 16-bit summands.
- \param [in] y second two 16-bit summands.
- \return the halved addition of the low halfwords, in the low halfword of the return value.\n
- the halved addition of the high halfwords, in the high halfword of the return value.
- \remark
- res[15:0] = (val1[15:0] + val2[15:0]) >> 1 \n
- res[31:16] = (val1[31:16] + val2[31:16]) >> 1
- */
- __ALWAYS_INLINE uint32_t __SHADD16(uint32_t x, uint32_t y)
- {
- int32_t r, s;
- r = (((((int32_t)x << 16) >> 16) + (((int32_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF;
- s = (((((int32_t)x) >> 16) + (((int32_t)y) >> 16)) >> 1) & (int32_t)0x0000FFFF;
- return ((uint32_t)((s << 16) | (r)));
- }
- /**
- \brief Dual 16-bit unsigned addition with halved results.
- \details This function enables you to perform two unsigned 16-bit integer additions, halving the results.
- \param [in] x first two 16-bit summands.
- \param [in] y second two 16-bit summands.
- \return the halved addition of the low halfwords, in the low halfword of the return value.\n
- the halved addition of the high halfwords, in the high halfword of the return value.
- \remark
- res[15:0] = (val1[15:0] + val2[15:0]) >> 1 \n
- res[31:16] = (val1[31:16] + val2[31:16]) >> 1
- */
- __ALWAYS_INLINE uint32_t __UHADD16(uint32_t x, uint32_t y)
- {
- int32_t r, s;
- r = ((((x << 16) >> 16) + ((y << 16) >> 16)) >> 1) & 0x0000FFFF;
- s = ((((x) >> 16) + ((y) >> 16)) >> 1) & 0x0000FFFF;
- return ((s << 16) | (r));
- }
- /**
- \brief Quad 8-bit signed addition with halved results.
- \details This function enables you to perform four signed 8-bit integer additions, halving the results.
- \param [in] x first four 8-bit summands.
- \param [in] y second four 8-bit summands.
- \return the halved addition of the first bytes from each operand, in the first byte of the return value.\n
- the halved addition of the second bytes from each operand, in the second byte of the return value.\n
- the halved addition of the third bytes from each operand, in the third byte of the return value.\n
- the halved addition of the fourth bytes from each operand, in the fourth byte of the return value.
- \remark
- res[7:0] = (val1[7:0] + val2[7:0] ) >> 1 \n
- res[15:8] = (val1[15:8] + val2[15:8] ) >> 1 \n
- res[23:16] = (val1[23:16] + val2[23:16]) >> 1 \n
- res[31:24] = (val1[31:24] + val2[31:24]) >> 1
- */
- __ALWAYS_INLINE uint32_t __SHADD8(uint32_t x, uint32_t y)
- {
- int32_t r, s, t, u;
- r = (((((int32_t)x << 24) >> 24) + (((int32_t)y << 24) >> 24)) >> 1) & (int32_t)0x000000FF;
- s = (((((int32_t)x << 16) >> 24) + (((int32_t)y << 16) >> 24)) >> 1) & (int32_t)0x000000FF;
- t = (((((int32_t)x << 8) >> 24) + (((int32_t)y << 8) >> 24)) >> 1) & (int32_t)0x000000FF;
- u = (((((int32_t)x) >> 24) + (((int32_t)y) >> 24)) >> 1) & (int32_t)0x000000FF;
- return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r)));
- }
- /**
- \brief Quad 8-bit unsigned addition with halved results.
- \details This function enables you to perform four unsigned 8-bit integer additions, halving the results.
- \param [in] x first four 8-bit summands.
- \param [in] y second four 8-bit summands.
- \return the halved addition of the first bytes from each operand, in the first byte of the return value.\n
- the halved addition of the second bytes from each operand, in the second byte of the return value.\n
- the halved addition of the third bytes from each operand, in the third byte of the return value.\n
- the halved addition of the fourth bytes from each operand, in the fourth byte of the return value.
- \remark
- res[7:0] = (val1[7:0] + val2[7:0] ) >> 1 \n
- res[15:8] = (val1[15:8] + val2[15:8] ) >> 1 \n
- res[23:16] = (val1[23:16] + val2[23:16]) >> 1 \n
- res[31:24] = (val1[31:24] + val2[31:24]) >> 1
- */
- __ALWAYS_INLINE uint32_t __UHADD8(uint32_t x, uint32_t y)
- {
- int32_t r, s, t, u;
- r = ((((x << 24) >> 24) + ((y << 24) >> 24)) >> 1) & 0x000000FF;
- s = ((((x << 16) >> 24) + ((y << 16) >> 24)) >> 1) & 0x000000FF;
- t = ((((x << 8) >> 24) + ((y << 8) >> 24)) >> 1) & 0x000000FF;
- u = ((((x) >> 24) + ((y) >> 24)) >> 1) & 0x000000FF;
- return ((u << 24) | (t << 16) | (s << 8) | (r));
- }
- /**
- \brief Dual 16-bit saturating subtract.
- \details This function enables you to perform two 16-bit integer subtractions in parallel,
- saturating the results to the 16-bit signed integer range -2^15 <= x <= 2^15 - 1.
- \param [in] x first two 16-bit summands.
- \param [in] y second two 16-bit summands.
- \return the saturated subtraction of the low halfwords, in the low halfword of the return value.\n
- the saturated subtraction of the high halfwords, in the high halfword of the return value.\n
- The returned results are saturated to the 16-bit signed integer range -2^15 <= x <= 2^15 - 1.
- \remark
- res[15:0] = val1[15:0] - val2[15:0] \n
- res[31:16] = val1[31:16] - val2[31:16]
- */
- __ALWAYS_INLINE uint32_t __QSUB16(uint32_t x, uint32_t y)
- {
- int32_t r, s;
- r = __SSAT(((((int32_t)x << 16) >> 16) - (((int32_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF;
- s = __SSAT(((((int32_t)x) >> 16) - (((int32_t)y) >> 16)), 16) & (int32_t)0x0000FFFF;
- return ((uint32_t)((s << 16) | (r)));
- }
- /**
- \brief Dual 16-bit unsigned saturating subtraction.
- \details This function enables you to perform two unsigned 16-bit integer subtractions,
- saturating the results to the 16-bit unsigned integer range 0 < x < 2^16 - 1.
- \param [in] x first two 16-bit operands for each subtraction.
- \param [in] y second two 16-bit operands for each subtraction.
- \return the saturated subtraction of the low halfwords, in the low halfword of the return value.\n
- the saturated subtraction of the high halfwords, in the high halfword of the return value.\n
- The returned results are saturated to the 16-bit signed integer range -2^15 <= x <= 2^15 - 1.
- \remark
- res[15:0] = val1[15:0] - val2[15:0] \n
- res[31:16] = val1[31:16] - val2[31:16]
- */
- __ALWAYS_INLINE uint32_t __UQSUB16(uint32_t x, uint32_t y)
- {
- int32_t r, s;
- r = __IUSAT((((x << 16) >> 16) - ((y << 16) >> 16)), 16) & 0x0000FFFF;
- s = __IUSAT((((x) >> 16) - ((y) >> 16)), 16) & 0x0000FFFF;
- return ((s << 16) | (r));
- }
- /**
- \brief Dual 16-bit signed subtraction.
- \details This function enables you to perform two 16-bit signed integer subtractions.
- \param [in] x first two 16-bit operands of each subtraction.
- \param [in] y second two 16-bit operands of each subtraction.
- \return the subtraction of the low halfword in the second operand from the low
- halfword in the first operand, in the low halfword of the return value. \n
- the subtraction of the high halfword in the second operand from the high
- halfword in the first operand, in the high halfword of the return value.
- \remark
- res[15:0] = val1[15:0] - val2[15:0] \n
- res[31:16] = val1[31:16] - val2[31:16]
- */
- __ALWAYS_INLINE uint32_t __SSUB16(uint32_t x, uint32_t y)
- {
- int32_t r, s;
- r = ((((int32_t)x << 16) >> 16) - (((int32_t)y << 16) >> 16)) & (int32_t)0x0000FFFF;
- s = ((((int32_t)x) >> 16) - (((int32_t)y) >> 16)) & (int32_t)0x0000FFFF;
- return ((uint32_t)((s << 16) | (r)));
- }
- /**
- \brief Dual 16-bit unsigned subtract.
- \details This function enables you to perform two 16-bit unsigned integer subtractions.
- \param [in] x first two 16-bit operands of each subtraction.
- \param [in] y second two 16-bit operands of each subtraction.
- \return the subtraction of the low halfword in the second operand from the low
- halfword in the first operand, in the low halfword of the return value. \n
- the subtraction of the high halfword in the second operand from the high
- halfword in the first operand, in the high halfword of the return value.
- \remark
- res[15:0] = val1[15:0] - val2[15:0] \n
- res[31:16] = val1[31:16] - val2[31:16]
- */
- __ALWAYS_INLINE uint32_t __USUB16(uint32_t x, uint32_t y)
- {
- int32_t r, s;
- r = (((x << 16) >> 16) - ((y << 16) >> 16)) & 0x0000FFFF;
- s = (((x) >> 16) - ((y) >> 16)) & 0x0000FFFF;
- return ((s << 16) | (r));
- }
- /**
- \brief Dual 16-bit signed subtraction with halved results.
- \details This function enables you to perform two signed 16-bit integer subtractions, halving the results.
- \param [in] x first two 16-bit summands.
- \param [in] y second two 16-bit summands.
- \return the halved subtraction of the low halfwords, in the low halfword of the return value.\n
- the halved subtraction of the high halfwords, in the high halfword of the return value.
- \remark
- res[15:0] = (val1[15:0] - val2[15:0]) >> 1 \n
- res[31:16] = (val1[31:16] - val2[31:16]) >> 1
- */
- __ALWAYS_INLINE uint32_t __SHSUB16(uint32_t x, uint32_t y)
- {
- int32_t r, s;
- r = (((((int32_t)x << 16) >> 16) - (((int32_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF;
- s = (((((int32_t)x) >> 16) - (((int32_t)y) >> 16)) >> 1) & (int32_t)0x0000FFFF;
- return ((uint32_t)((s << 16) | (r)));
- }
- /**
- \brief Dual 16-bit unsigned subtraction with halved results.
- \details This function enables you to perform two unsigned 16-bit integer subtractions, halving the results.
- \param [in] x first two 16-bit summands.
- \param [in] y second two 16-bit summands.
- \return the halved subtraction of the low halfwords, in the low halfword of the return value.\n
- the halved subtraction of the high halfwords, in the high halfword of the return value.
- \remark
- res[15:0] = (val1[15:0] - val2[15:0]) >> 1 \n
- res[31:16] = (val1[31:16] - val2[31:16]) >> 1
- */
- __ALWAYS_INLINE uint32_t __UHSUB16(uint32_t x, uint32_t y)
- {
- int32_t r, s;
- r = ((((x << 16) >> 16) - ((y << 16) >> 16)) >> 1) & 0x0000FFFF;
- s = ((((x) >> 16) - ((y) >> 16)) >> 1) & 0x0000FFFF;
- return ((s << 16) | (r));
- }
- /**
- \brief Quad 8-bit signed addition with halved results.
- \details This function enables you to perform four signed 8-bit integer subtractions, halving the results.
- \param [in] x first four 8-bit summands.
- \param [in] y second four 8-bit summands.
- \return the halved subtraction of the first bytes from each operand, in the first byte of the return value.\n
- the halved subtraction of the second bytes from each operand, in the second byte of the return value.\n
- the halved subtraction of the third bytes from each operand, in the third byte of the return value.\n
- the halved subtraction of the fourth bytes from each operand, in the fourth byte of the return value.
- \remark
- res[7:0] = (val1[7:0] - val2[7:0] ) >> 1 \n
- res[15:8] = (val1[15:8] - val2[15:8] ) >> 1 \n
- res[23:16] = (val1[23:16] - val2[23:16]) >> 1 \n
- res[31:24] = (val1[31:24] - val2[31:24]) >> 1
- */
- __ALWAYS_INLINE uint32_t __SHSUB8(uint32_t x, uint32_t y)
- {
- int32_t r, s, t, u;
- r = (((((int32_t)x << 24) >> 24) - (((int32_t)y << 24) >> 24)) >> 1) & (int32_t)0x000000FF;
- s = (((((int32_t)x << 16) >> 24) - (((int32_t)y << 16) >> 24)) >> 1) & (int32_t)0x000000FF;
- t = (((((int32_t)x << 8) >> 24) - (((int32_t)y << 8) >> 24)) >> 1) & (int32_t)0x000000FF;
- u = (((((int32_t)x) >> 24) - (((int32_t)y) >> 24)) >> 1) & (int32_t)0x000000FF;
- return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r)));
- }
- /**
- \brief Quad 8-bit unsigned subtraction with halved results.
- \details This function enables you to perform four unsigned 8-bit integer subtractions, halving the results.
- \param [in] x first four 8-bit summands.
- \param [in] y second four 8-bit summands.
- \return the halved subtraction of the first bytes from each operand, in the first byte of the return value.\n
- the halved subtraction of the second bytes from each operand, in the second byte of the return value.\n
- the halved subtraction of the third bytes from each operand, in the third byte of the return value.\n
- the halved subtraction of the fourth bytes from each operand, in the fourth byte of the return value.
- \remark
- res[7:0] = (val1[7:0] - val2[7:0] ) >> 1 \n
- res[15:8] = (val1[15:8] - val2[15:8] ) >> 1 \n
- res[23:16] = (val1[23:16] - val2[23:16]) >> 1 \n
- res[31:24] = (val1[31:24] - val2[31:24]) >> 1
- */
- __ALWAYS_INLINE uint32_t __UHSUB8(uint32_t x, uint32_t y)
- {
- int32_t r, s, t, u;
- r = ((((x << 24) >> 24) - ((y << 24) >> 24)) >> 1) & 0x000000FF;
- s = ((((x << 16) >> 24) - ((y << 16) >> 24)) >> 1) & 0x000000FF;
- t = ((((x << 8) >> 24) - ((y << 8) >> 24)) >> 1) & 0x000000FF;
- u = ((((x) >> 24) - ((y) >> 24)) >> 1) & 0x000000FF;
- return ((u << 24) | (t << 16) | (s << 8) | (r));
- }
- /**
- \brief Dual 16-bit add and subtract with exchange.
- \details This function enables you to exchange the halfwords of the one operand,
- then add the high halfwords and subtract the low halfwords,
- saturating the results to the 16-bit signed integer range -2^15 <= x <= 2^15 - 1.
- \param [in] x first operand for the subtraction in the low halfword,
- and the first operand for the addition in the high halfword.
- \param [in] y second operand for the subtraction in the high halfword,
- and the second operand for the addition in the low halfword.
- \return the saturated subtraction of the high halfword in the second operand from the
- low halfword in the first operand, in the low halfword of the return value.\n
- the saturated addition of the high halfword in the first operand and the
- low halfword in the second operand, in the high halfword of the return value.\n
- The returned results are saturated to the 16-bit signed integer range -2^15 <= x <= 2^15 - 1.
- \remark
- res[15:0] = val1[15:0] - val2[31:16] \n
- res[31:16] = val1[31:16] + val2[15:0]
- */
- __ALWAYS_INLINE uint32_t __QASX(uint32_t x, uint32_t y)
- {
- int32_t r, s;
- r = __SSAT(((((int32_t)x << 16) >> 16) - (((int32_t)y) >> 16)), 16) & (int32_t)0x0000FFFF;
- s = __SSAT(((((int32_t)x) >> 16) + (((int32_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF;
- return ((uint32_t)((s << 16) | (r)));
- }
- /**
- \brief Dual 16-bit unsigned saturating addition and subtraction with exchange.
- \details This function enables you to exchange the halfwords of the second operand and
- perform one unsigned 16-bit integer addition and one unsigned 16-bit subtraction,
- saturating the results to the 16-bit unsigned integer range 0 <= x <= 2^16 - 1.
- \param [in] x first operand for the subtraction in the low halfword,
- and the first operand for the addition in the high halfword.
- \param [in] y second operand for the subtraction in the high halfword,
- and the second operand for the addition in the low halfword.
- \return the saturated subtraction of the high halfword in the second operand from the
- low halfword in the first operand, in the low halfword of the return value.\n
- the saturated addition of the high halfword in the first operand and the
- low halfword in the second operand, in the high halfword of the return value.\n
- The returned results are saturated to the 16-bit unsigned integer range 0 <= x <= 2^16 - 1.
- \remark
- res[15:0] = val1[15:0] - val2[31:16] \n
- res[31:16] = val1[31:16] + val2[15:0]
- */
- __ALWAYS_INLINE uint32_t __UQASX(uint32_t x, uint32_t y)
- {
- int32_t r, s;
- r = __IUSAT((((x << 16) >> 16) - ((y) >> 16)), 16) & 0x0000FFFF;
- s = __IUSAT((((x) >> 16) + ((y << 16) >> 16)), 16) & 0x0000FFFF;
- return ((s << 16) | (r));
- }
- /**
- \brief Dual 16-bit addition and subtraction with exchange.
- \details It enables you to exchange the halfwords of the second operand, add the high halfwords
- and subtract the low halfwords.
- \param [in] x first operand for the subtraction in the low halfword,
- and the first operand for the addition in the high halfword.
- \param [in] y second operand for the subtraction in the high halfword,
- and the second operand for the addition in the low halfword.
- \return the subtraction of the high halfword in the second operand from the
- low halfword in the first operand, in the low halfword of the return value.\n
- the addition of the high halfword in the first operand and the
- low halfword in the second operand, in the high halfword of the return value.
- \remark
- res[15:0] = val1[15:0] - val2[31:16] \n
- res[31:16] = val1[31:16] + val2[15:0]
- */
- __ALWAYS_INLINE uint32_t __SASX(uint32_t x, uint32_t y)
- {
- int32_t r, s;
- r = ((((int32_t)x << 16) >> 16) - (((int32_t)y) >> 16)) & (int32_t)0x0000FFFF;
- s = ((((int32_t)x) >> 16) + (((int32_t)y << 16) >> 16)) & (int32_t)0x0000FFFF;
- return ((uint32_t)((s << 16) | (r)));
- }
- /**
- \brief Dual 16-bit unsigned addition and subtraction with exchange.
- \details This function enables you to exchange the two halfwords of the second operand,
- add the high halfwords and subtract the low halfwords.
- \param [in] x first operand for the subtraction in the low halfword,
- and the first operand for the addition in the high halfword.
- \param [in] y second operand for the subtraction in the high halfword,
- and the second operand for the addition in the low halfword.
- \return the subtraction of the high halfword in the second operand from the
- low halfword in the first operand, in the low halfword of the return value.\n
- the addition of the high halfword in the first operand and the
- low halfword in the second operand, in the high halfword of the return value.
- \remark
- res[15:0] = val1[15:0] - val2[31:16] \n
- res[31:16] = val1[31:16] + val2[15:0]
- */
- __ALWAYS_INLINE uint32_t __UASX(uint32_t x, uint32_t y)
- {
- int32_t r, s;
- r = (((x << 16) >> 16) - ((y) >> 16)) & 0x0000FFFF;
- s = (((x) >> 16) + ((y << 16) >> 16)) & 0x0000FFFF;
- return ((s << 16) | (r));
- }
- /**
- \brief Dual 16-bit signed addition and subtraction with halved results.
- \details This function enables you to exchange the two halfwords of one operand, perform one
- signed 16-bit integer addition and one signed 16-bit subtraction, and halve the results.
- \param [in] x first 16-bit operands.
- \param [in] y second 16-bit operands.
- \return the halved subtraction of the high halfword in the second operand from the
- low halfword in the first operand, in the low halfword of the return value.\n
- the halved addition of the low halfword in the second operand from the high
- halfword in the first operand, in the high halfword of the return value.
- \remark
- res[15:0] = (val1[15:0] - val2[31:16]) >> 1 \n
- res[31:16] = (val1[31:16] + val2[15:0]) >> 1
- */
- __ALWAYS_INLINE uint32_t __SHASX(uint32_t x, uint32_t y)
- {
- int32_t r, s;
- r = (((((int32_t)x << 16) >> 16) - (((int32_t)y) >> 16)) >> 1) & (int32_t)0x0000FFFF;
- s = (((((int32_t)x) >> 16) + (((int32_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF;
- return ((uint32_t)((s << 16) | (r)));
- }
- /**
- \brief Dual 16-bit unsigned addition and subtraction with halved results and exchange.
- \details This function enables you to exchange the halfwords of the second operand,
- add the high halfwords and subtract the low halfwords, halving the results.
- \param [in] x first operand for the subtraction in the low halfword, and
- the first operand for the addition in the high halfword.
- \param [in] y second operand for the subtraction in the high halfword, and
- the second operand for the addition in the low halfword.
- \return the halved subtraction of the high halfword in the second operand from the
- low halfword in the first operand, in the low halfword of the return value.\n
- the halved addition of the low halfword in the second operand from the high
- halfword in the first operand, in the high halfword of the return value.
- \remark
- res[15:0] = (val1[15:0] - val2[31:16]) >> 1 \n
- res[31:16] = (val1[31:16] + val2[15:0]) >> 1
- */
- __ALWAYS_INLINE uint32_t __UHASX(uint32_t x, uint32_t y)
- {
- int32_t r, s;
- r = ((((x << 16) >> 16) - ((y) >> 16)) >> 1) & 0x0000FFFF;
- s = ((((x) >> 16) + ((y << 16) >> 16)) >> 1) & 0x0000FFFF;
- return ((s << 16) | (r));
- }
- /**
- \brief Dual 16-bit subtract and add with exchange.
- \details This function enables you to exchange the halfwords of one operand,
- then subtract the high halfwords and add the low halfwords,
- saturating the results to the 16-bit signed integer range -2^15 <= x <= 2^15 - 1.
- \param [in] x first operand for the addition in the low halfword,
- and the first operand for the subtraction in the high halfword.
- \param [in] y second operand for the addition in the high halfword,
- and the second operand for the subtraction in the low halfword.
- \return the saturated addition of the low halfword of the first operand and the high
- halfword of the second operand, in the low halfword of the return value.\n
- the saturated subtraction of the low halfword of the second operand from the
- high halfword of the first operand, in the high halfword of the return value.\n
- The returned results are saturated to the 16-bit signed integer range -2^15 <= x <= 2^15 - 1.
- \remark
- res[15:0] = val1[15:0] + val2[31:16] \n
- res[31:16] = val1[31:16] - val2[15:0]
- */
- __ALWAYS_INLINE uint32_t __QSAX(uint32_t x, uint32_t y)
- {
- int32_t r, s;
- r = __SSAT(((((int32_t)x << 16) >> 16) + (((int32_t)y) >> 16)), 16) & (int32_t)0x0000FFFF;
- s = __SSAT(((((int32_t)x) >> 16) - (((int32_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF;
- return ((uint32_t)((s << 16) | (r)));
- }
- /**
- \brief Dual 16-bit unsigned saturating subtraction and addition with exchange.
- \details This function enables you to exchange the halfwords of the second operand and perform
- one unsigned 16-bit integer subtraction and one unsigned 16-bit addition, saturating
- the results to the 16-bit unsigned integer range 0 <= x <= 2^16 - 1.
- \param [in] x first operand for the addition in the low halfword,
- and the first operand for the subtraction in the high halfword.
- \param [in] y second operand for the addition in the high halfword,
- and the second operand for the subtraction in the low halfword.
- \return the saturated addition of the low halfword of the first operand and the high
- halfword of the second operand, in the low halfword of the return value.\n
- the saturated subtraction of the low halfword of the second operand from the
- high halfword of the first operand, in the high halfword of the return value.\n
- The returned results are saturated to the 16-bit unsigned integer range 0 <= x <= 2^16 - 1.
- \remark
- res[15:0] = val1[15:0] + val2[31:16] \n
- res[31:16] = val1[31:16] - val2[15:0]
- */
- __ALWAYS_INLINE uint32_t __UQSAX(uint32_t x, uint32_t y)
- {
- int32_t r, s;
- r = __IUSAT((((x << 16) >> 16) + ((y) >> 16)), 16) & 0x0000FFFF;
- s = __IUSAT((((x) >> 16) - ((y << 16) >> 16)), 16) & 0x0000FFFF;
- return ((s << 16) | (r));
- }
- /**
- \brief Dual 16-bit unsigned subtract and add with exchange.
- \details This function enables you to exchange the halfwords of the second operand,
- subtract the high halfwords and add the low halfwords.
- \param [in] x first operand for the addition in the low halfword,
- and the first operand for the subtraction in the high halfword.
- \param [in] y second operand for the addition in the high halfword,
- and the second operand for the subtraction in the low halfword.
- \return the addition of the low halfword of the first operand and the high
- halfword of the second operand, in the low halfword of the return value.\n
- the subtraction of the low halfword of the second operand from the
- high halfword of the first operand, in the high halfword of the return value.\n
- \remark
- res[15:0] = val1[15:0] + val2[31:16] \n
- res[31:16] = val1[31:16] - val2[15:0]
- */
- __ALWAYS_INLINE uint32_t __USAX(uint32_t x, uint32_t y)
- {
- int32_t r, s;
- r = (((x << 16) >> 16) + ((y) >> 16)) & 0x0000FFFF;
- s = (((x) >> 16) - ((y << 16) >> 16)) & 0x0000FFFF;
- return ((s << 16) | (r));
- }
- /**
- \brief Dual 16-bit signed subtraction and addition with exchange.
- \details This function enables you to exchange the two halfwords of one operand and perform one
- 16-bit integer subtraction and one 16-bit addition.
- \param [in] x first operand for the addition in the low halfword, and the first operand
- for the subtraction in the high halfword.
- \param [in] y second operand for the addition in the high halfword, and the second
- operand for the subtraction in the low halfword.
- \return the addition of the low halfword of the first operand and the high
- halfword of the second operand, in the low halfword of the return value.\n
- the subtraction of the low halfword of the second operand from the
- high halfword of the first operand, in the high halfword of the return value.\n
- \remark
- res[15:0] = val1[15:0] + val2[31:16] \n
- res[31:16] = val1[31:16] - val2[15:0]
- */
- __ALWAYS_INLINE uint32_t __SSAX(uint32_t x, uint32_t y)
- {
- int32_t r, s;
- r = ((((int32_t)x << 16) >> 16) + (((int32_t)y) >> 16)) & (int32_t)0x0000FFFF;
- s = ((((int32_t)x) >> 16) - (((int32_t)y << 16) >> 16)) & (int32_t)0x0000FFFF;
- return ((uint32_t)((s << 16) | (r)));
- }
- /**
- \brief Dual 16-bit signed subtraction and addition with halved results.
- \details This function enables you to exchange the two halfwords of one operand, perform one signed
- 16-bit integer subtraction and one signed 16-bit addition, and halve the results.
- \param [in] x first 16-bit operands.
- \param [in] y second 16-bit operands.
- \return the halved addition of the low halfword in the first operand and the
- high halfword in the second operand, in the low halfword of the return value.\n
- the halved subtraction of the low halfword in the second operand from the
- high halfword in the first operand, in the high halfword of the return value.
- \remark
- res[15:0] = (val1[15:0] + val2[31:16]) >> 1 \n
- res[31:16] = (val1[31:16] - val2[15:0]) >> 1
- */
- __ALWAYS_INLINE uint32_t __SHSAX(uint32_t x, uint32_t y)
- {
- int32_t r, s;
- r = (((((int32_t)x << 16) >> 16) + (((int32_t)y) >> 16)) >> 1) & (int32_t)0x0000FFFF;
- s = (((((int32_t)x) >> 16) - (((int32_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF;
- return ((uint32_t)((s << 16) | (r)));
- }
- /**
- \brief Dual 16-bit unsigned subtraction and addition with halved results and exchange.
- \details This function enables you to exchange the halfwords of the second operand,
- subtract the high halfwords and add the low halfwords, halving the results.
- \param [in] x first operand for the addition in the low halfword, and
- the first operand for the subtraction in the high halfword.
- \param [in] y second operand for the addition in the high halfword, and
- the second operand for the subtraction in the low halfword.
- \return the halved addition of the low halfword in the first operand and the
- high halfword in the second operand, in the low halfword of the return value.\n
- the halved subtraction of the low halfword in the second operand from the
- high halfword in the first operand, in the high halfword of the return value.
- \remark
- res[15:0] = (val1[15:0] + val2[31:16]) >> 1 \n
- res[31:16] = (val1[31:16] - val2[15:0]) >> 1
- */
- __ALWAYS_INLINE uint32_t __UHSAX(uint32_t x, uint32_t y)
- {
- int32_t r, s;
- r = ((((x << 16) >> 16) + ((y) >> 16)) >> 1) & 0x0000FFFF;
- s = ((((x) >> 16) - ((y << 16) >> 16)) >> 1) & 0x0000FFFF;
- return ((s << 16) | (r));
- }
- /**
- \brief Dual 16-bit signed multiply with exchange returning difference.
- \details This function enables you to perform two 16-bit signed multiplications, subtracting
- one of the products from the other. The halfwords of the second operand are exchanged
- before performing the arithmetic. This produces top * bottom and bottom * top multiplication.
- \param [in] x first 16-bit operands for each multiplication.
- \param [in] y second 16-bit operands for each multiplication.
- \return the difference of the products of the two 16-bit signed multiplications.
- \remark
- p1 = val1[15:0] * val2[31:16] \n
- p2 = val1[31:16] * val2[15:0] \n
- res[31:0] = p1 - p2
- */
- __ALWAYS_INLINE uint32_t __SMUSDX(uint32_t x, uint32_t y)
- {
- return ((uint32_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y) >> 16)) -
- ((((int32_t)x) >> 16) * (((int32_t)y << 16) >> 16))));
- }
- /**
- \brief Sum of dual 16-bit signed multiply with exchange.
- \details This function enables you to perform two 16-bit signed multiplications with exchanged
- halfwords of the second operand, adding the products together.
- \param [in] x first 16-bit operands for each multiplication.
- \param [in] y second 16-bit operands for each multiplication.
- \return the sum of the products of the two 16-bit signed multiplications with exchanged halfwords of the second operand.
- \remark
- p1 = val1[15:0] * val2[31:16] \n
- p2 = val1[31:16] * val2[15:0] \n
- res[31:0] = p1 + p2
- */
- __ALWAYS_INLINE uint32_t __SMUADX(uint32_t x, uint32_t y)
- {
- return ((uint32_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y) >> 16)) +
- ((((int32_t)x) >> 16) * (((int32_t)y << 16) >> 16))));
- }
- /**
- \brief Saturating add.
- \details This function enables you to obtain the saturating add of two integers.
- \param [in] x first summand of the saturating add operation.
- \param [in] y second summand of the saturating add operation.
- \return the saturating addition of val1 and val2.
- \remark
- res[31:0] = SAT(val1 + SAT(val2))
- */
- __ALWAYS_INLINE int32_t __QADD(int32_t x, int32_t y)
- {
- int32_t result;
- if (y >= 0)
- {
- if (x + y >= x)
- {
- result = x + y;
- }
- else
- {
- result = 0x7FFFFFFF;
- }
- }
- else
- {
- if (x + y < x)
- {
- result = x + y;
- }
- else
- {
- result = 0x80000000;
- }
- }
- return result;
- }
- /**
- \brief Saturating subtract.
- \details This function enables you to obtain the saturating add of two integers.
- \param [in] x first summand of the saturating add operation.
- \param [in] y second summand of the saturating add operation.
- \return the saturating addition of val1 and val2.
- \remark
- res[31:0] = SAT(val1 + SAT(val2))
- */
- __ALWAYS_INLINE int32_t __QSUB(int32_t x, int32_t y)
- {
- int64_t tmp;
- int32_t result;
- tmp = (int64_t)x - (int64_t)y;
- if (tmp > 0x7fffffff)
- {
- tmp = 0x7fffffff;
- }
- else if (tmp < (-2147483647 - 1))
- {
- tmp = -2147483647 - 1;
- }
- result = tmp;
- return result;
- }
- /**
- \brief Dual 16-bit signed multiply with single 32-bit accumulator.
- \details This function enables you to perform two signed 16-bit multiplications,
- adding both results to a 32-bit accumulate operand.
- \param [in] x first 16-bit operands for each multiplication.
- \param [in] y second 16-bit operands for each multiplication.
- \param [in] sum accumulate value.
- \return the product of each multiplication added to the accumulate value, as a 32-bit integer.
- \remark
- p1 = val1[15:0] * val2[15:0] \n
- p2 = val1[31:16] * val2[31:16] \n
- res[31:0] = p1 + p2 + val3[31:0]
- */
- __ALWAYS_INLINE uint32_t __SMLAD(uint32_t x, uint32_t y, uint32_t sum)
- {
- return ((uint32_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y << 16) >> 16)) +
- ((((int32_t)x) >> 16) * (((int32_t)y) >> 16)) +
- (((int32_t)sum))));
- }
- /**
- \brief Pre-exchanged dual 16-bit signed multiply with single 32-bit accumulator.
- \details This function enables you to perform two signed 16-bit multiplications with exchanged
- halfwords of the second operand, adding both results to a 32-bit accumulate operand.
- \param [in] x first 16-bit operands for each multiplication.
- \param [in] y second 16-bit operands for each multiplication.
- \param [in] sum accumulate value.
- \return the product of each multiplication with exchanged halfwords of the second
- operand added to the accumulate value, as a 32-bit integer.
- \remark
- p1 = val1[15:0] * val2[31:16] \n
- p2 = val1[31:16] * val2[15:0] \n
- res[31:0] = p1 + p2 + val3[31:0]
- */
- __ALWAYS_INLINE uint32_t __SMLADX(uint32_t x, uint32_t y, uint32_t sum)
- {
- return ((uint32_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y) >> 16)) +
- ((((int32_t)x) >> 16) * (((int32_t)y << 16) >> 16)) +
- (((int32_t)sum))));
- }
- /**
- \brief Dual 16-bit signed multiply with exchange subtract with 32-bit accumulate.
- \details This function enables you to perform two 16-bit signed multiplications, take the
- difference of the products, subtracting the high halfword product from the low
- halfword product, and add the difference to a 32-bit accumulate operand.
- \param [in] x first 16-bit operands for each multiplication.
- \param [in] y second 16-bit operands for each multiplication.
- \param [in] sum accumulate value.
- \return the difference of the product of each multiplication, added to the accumulate value.
- \remark
- p1 = val1[15:0] * val2[15:0] \n
- p2 = val1[31:16] * val2[31:16] \n
- res[31:0] = p1 - p2 + val3[31:0]
- */
- __ALWAYS_INLINE uint32_t __SMLSD(uint32_t x, uint32_t y, uint32_t sum)
- {
- return ((uint32_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y << 16) >> 16)) -
- ((((int32_t)x) >> 16) * (((int32_t)y) >> 16)) +
- (((int32_t)sum))));
- }
- /**
- \brief Dual 16-bit signed multiply with exchange subtract with 32-bit accumulate.
- \details This function enables you to exchange the halfwords in the second operand, then perform two 16-bit
- signed multiplications. The difference of the products is added to a 32-bit accumulate operand.
- \param [in] x first 16-bit operands for each multiplication.
- \param [in] y second 16-bit operands for each multiplication.
- \param [in] sum accumulate value.
- \return the difference of the product of each multiplication, added to the accumulate value.
- \remark
- p1 = val1[15:0] * val2[31:16] \n
- p2 = val1[31:16] * val2[15:0] \n
- res[31:0] = p1 - p2 + val3[31:0]
- */
- __ALWAYS_INLINE uint32_t __SMLSDX(uint32_t x, uint32_t y, uint32_t sum)
- {
- return ((uint32_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y) >> 16)) -
- ((((int32_t)x) >> 16) * (((int32_t)y << 16) >> 16)) +
- (((int32_t)sum))));
- }
- /**
- \brief Dual 16-bit signed multiply with single 64-bit accumulator.
- \details This function enables you to perform two signed 16-bit multiplications, adding both results
- to a 64-bit accumulate operand. Overflow is only possible as a result of the 64-bit addition.
- This overflow is not detected if it occurs. Instead, the result wraps around modulo2^64.
- \param [in] x first 16-bit operands for each multiplication.
- \param [in] y second 16-bit operands for each multiplication.
- \param [in] sum accumulate value.
- \return the product of each multiplication added to the accumulate value.
- \remark
- p1 = val1[15:0] * val2[15:0] \n
- p2 = val1[31:16] * val2[31:16] \n
- sum = p1 + p2 + val3[63:32][31:0] \n
- res[63:32] = sum[63:32] \n
- res[31:0] = sum[31:0]
- */
- __ALWAYS_INLINE uint64_t __SMLALD(uint32_t x, uint32_t y, uint64_t sum)
- {
- return ((uint64_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y << 16) >> 16)) +
- ((((int32_t)x) >> 16) * (((int32_t)y) >> 16)) +
- (((uint64_t)sum))));
- }
- /**
- \brief Dual 16-bit signed multiply with exchange with single 64-bit accumulator.
- \details This function enables you to exchange the halfwords of the second operand, and perform two
- signed 16-bit multiplications, adding both results to a 64-bit accumulate operand. Overflow
- is only possible as a result of the 64-bit addition. This overflow is not detected if it occurs.
- Instead, the result wraps around modulo2^64.
- \param [in] x first 16-bit operands for each multiplication.
- \param [in] y second 16-bit operands for each multiplication.
- \param [in] sum accumulate value.
- \return the product of each multiplication added to the accumulate value.
- \remark
- p1 = val1[15:0] * val2[31:16] \n
- p2 = val1[31:16] * val2[15:0] \n
- sum = p1 + p2 + val3[63:32][31:0] \n
- res[63:32] = sum[63:32] \n
- res[31:0] = sum[31:0]
- */
- __ALWAYS_INLINE uint64_t __SMLALDX(uint32_t x, uint32_t y, uint64_t sum)
- {
- return ((uint64_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y) >> 16)) +
- ((((int32_t)x) >> 16) * (((int32_t)y << 16) >> 16)) +
- (((uint64_t)sum))));
- }
- /**
- \brief dual 16-bit signed multiply subtract with 64-bit accumulate.
- \details This function It enables you to perform two 16-bit signed multiplications, take the difference
- of the products, subtracting the high halfword product from the low halfword product, and add the
- difference to a 64-bit accumulate operand. Overflow cannot occur during the multiplications or the
- subtraction. Overflow can occur as a result of the 64-bit addition, and this overflow is not
- detected. Instead, the result wraps round to modulo2^64.
- \param [in] x first 16-bit operands for each multiplication.
- \param [in] y second 16-bit operands for each multiplication.
- \param [in] sum accumulate value.
- \return the difference of the product of each multiplication, added to the accumulate value.
- \remark
- p1 = val1[15:0] * val2[15:0] \n
- p2 = val1[31:16] * val2[31:16] \n
- res[63:0] = p1 - p2 + val3[63:0]
- */
- __ALWAYS_INLINE uint64_t __SMLSLD(uint32_t x, uint32_t y, uint64_t sum)
- {
- return ((uint64_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y << 16) >> 16)) -
- ((((int32_t)x) >> 16) * (((int32_t)y) >> 16)) +
- (((uint64_t)sum))));
- }
- /**
- \brief Dual 16-bit signed multiply with exchange subtract with 64-bit accumulate.
- \details This function enables you to exchange the halfwords of the second operand, perform two 16-bit multiplications,
- adding the difference of the products to a 64-bit accumulate operand. Overflow cannot occur during the
- multiplications or the subtraction. Overflow can occur as a result of the 64-bit addition, and this overflow
- is not detected. Instead, the result wraps round to modulo2^64.
- \param [in] x first 16-bit operands for each multiplication.
- \param [in] y second 16-bit operands for each multiplication.
- \param [in] sum accumulate value.
- \return the difference of the product of each multiplication, added to the accumulate value.
- \remark
- p1 = val1[15:0] * val2[31:16] \n
- p2 = val1[31:16] * val2[15:0] \n
- res[63:0] = p1 - p2 + val3[63:0]
- */
- __ALWAYS_INLINE uint64_t __SMLSLDX(uint32_t x, uint32_t y, uint64_t sum)
- {
- return ((uint64_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y) >> 16)) -
- ((((int32_t)x) >> 16) * (((int32_t)y << 16) >> 16)) +
- (((uint64_t)sum))));
- }
- /**
- \brief 32-bit signed multiply with 32-bit truncated accumulator.
- \details This function enables you to perform a signed 32-bit multiplications, adding the most
- significant 32 bits of the 64-bit result to a 32-bit accumulate operand.
- \param [in] x first operand for multiplication.
- \param [in] y second operand for multiplication.
- \param [in] sum accumulate value.
- \return the product of multiplication (most significant 32 bits) is added to the accumulate value, as a 32-bit integer.
- \remark
- p = val1 * val2 \n
- res[31:0] = p[61:32] + val3[31:0]
- */
- __ALWAYS_INLINE uint32_t __SMMLA(int32_t x, int32_t y, int32_t sum)
- {
- return (uint32_t)((int32_t)((int64_t)((int64_t)x * (int64_t)y) >> 32) + sum);
- }
- /**
- \brief Sum of dual 16-bit signed multiply.
- \details This function enables you to perform two 16-bit signed multiplications, adding the products together.
- \param [in] x first 16-bit operands for each multiplication.
- \param [in] y second 16-bit operands for each multiplication.
- \return the sum of the products of the two 16-bit signed multiplications.
- \remark
- p1 = val1[15:0] * val2[15:0] \n
- p2 = val1[31:16] * val2[31:16] \n
- res[31:0] = p1 + p2
- */
- __ALWAYS_INLINE uint32_t __SMUAD(uint32_t x, uint32_t y)
- {
- return ((uint32_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y << 16) >> 16)) +
- ((((int32_t)x) >> 16) * (((int32_t)y) >> 16))));
- }
- /**
- \brief Dual 16-bit signed multiply returning difference.
- \details This function enables you to perform two 16-bit signed multiplications, taking the difference
- of the products by subtracting the high halfword product from the low halfword product.
- \param [in] x first 16-bit operands for each multiplication.
- \param [in] y second 16-bit operands for each multiplication.
- \return the difference of the products of the two 16-bit signed multiplications.
- \remark
- p1 = val1[15:0] * val2[15:0] \n
- p2 = val1[31:16] * val2[31:16] \n
- res[31:0] = p1 - p2
- */
- __ALWAYS_INLINE uint32_t __SMUSD(uint32_t x, uint32_t y)
- {
- return ((uint32_t)(((((int32_t)x << 16) >> 16) * (((int32_t)y << 16) >> 16)) -
- ((((int32_t)x) >> 16) * (((int32_t)y) >> 16))));
- }
- /**
- \brief Dual extracted 8-bit to 16-bit signed addition.
- \details This function enables you to extract two 8-bit values from the second operand (at bit positions
- [7:0] and [23:16]), sign-extend them to 16-bits each, and add the results to the first operand.
- \param [in] x values added to the sign-extended to 16-bit values.
- \param [in] y two 8-bit values to be extracted and sign-extended.
- \return the addition of val1 and val2, where the 8-bit values in val2[7:0] and
- val2[23:16] have been extracted and sign-extended prior to the addition.
- \remark
- res[15:0] = val1[15:0] + SignExtended(val2[7:0]) \n
- res[31:16] = val1[31:16] + SignExtended(val2[23:16])
- */
- __ALWAYS_INLINE uint32_t __SXTAB16(uint32_t x, uint32_t y)
- {
- return ((uint32_t)((((((int32_t)y << 24) >> 24) + (((int32_t)x << 16) >> 16)) & (int32_t)0x0000FFFF) |
- (((((int32_t)y << 8) >> 8) + (((int32_t)x >> 16) << 16)) & (int32_t)0xFFFF0000)));
- }
- /**
- \brief Extracted 16-bit to 32-bit unsigned addition.
- \details This function enables you to extract two 8-bit values from one operand, zero-extend
- them to 16 bits each, and add the results to two 16-bit values from another operand.
- \param [in] x values added to the zero-extended to 16-bit values.
- \param [in] y two 8-bit values to be extracted and zero-extended.
- \return the addition of val1 and val2, where the 8-bit values in val2[7:0] and
- val2[23:16] have been extracted and zero-extended prior to the addition.
- \remark
- res[15:0] = ZeroExt(val2[7:0] to 16 bits) + val1[15:0] \n
- res[31:16] = ZeroExt(val2[31:16] to 16 bits) + val1[31:16]
- */
- __ALWAYS_INLINE uint32_t __UXTAB16(uint32_t x, uint32_t y)
- {
- return ((uint32_t)(((((y << 24) >> 24) + ((x << 16) >> 16)) & 0x0000FFFF) |
- ((((y << 8) >> 8) + ((x >> 16) << 16)) & 0xFFFF0000)));
- }
- /**
- \brief Dual extract 8-bits and sign extend each to 16-bits.
- \details This function enables you to extract two 8-bit values from an operand and sign-extend them to 16 bits each.
- \param [in] x two 8-bit values in val[7:0] and val[23:16] to be sign-extended.
- \return the 8-bit values sign-extended to 16-bit values.\n
- sign-extended value of val[7:0] in the low halfword of the return value.\n
- sign-extended value of val[23:16] in the high halfword of the return value.
- \remark
- res[15:0] = SignExtended(val[7:0]) \n
- res[31:16] = SignExtended(val[23:16])
- */
- __ALWAYS_INLINE uint32_t __SXTB16(uint32_t x)
- {
- return ((uint32_t)(((((int32_t)x << 24) >> 24) & (int32_t)0x0000FFFF) |
- ((((int32_t)x << 8) >> 8) & (int32_t)0xFFFF0000)));
- }
- /**
- \brief Dual extract 8-bits and zero-extend to 16-bits.
- \details This function enables you to extract two 8-bit values from an operand and zero-extend them to 16 bits each.
- \param [in] x two 8-bit values in val[7:0] and val[23:16] to be zero-extended.
- \return the 8-bit values sign-extended to 16-bit values.\n
- sign-extended value of val[7:0] in the low halfword of the return value.\n
- sign-extended value of val[23:16] in the high halfword of the return value.
- \remark
- res[15:0] = SignExtended(val[7:0]) \n
- res[31:16] = SignExtended(val[23:16])
- */
- __ALWAYS_INLINE uint32_t __UXTB16(uint32_t x)
- {
- return ((uint32_t)((((x << 24) >> 24) & 0x0000FFFF) |
- (((x << 8) >> 8) & 0xFFFF0000)));
- }
- #endif /* _CSI_SIMD_H_ */
|