| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713 |
- /*-----------------------------------------------------------------------------
- * Name: CV_CoreSimd.c
- * Purpose: CMSIS CORE validation tests implementation
- *-----------------------------------------------------------------------------
- * Copyright (c) 2018 Arm Limited. All rights reserved.
- *----------------------------------------------------------------------------*/
- #include "CV_Framework.h"
- #include "cmsis_cv.h"
- /*-----------------------------------------------------------------------------
- * Test implementation
- *----------------------------------------------------------------------------*/
- /*-----------------------------------------------------------------------------
- * Test cases
- *----------------------------------------------------------------------------*/
- /**
- \brief Test case: TC_CoreSimd_SatAddSub
- \details
- - Check Saturating addition and subtraction:
- __QADD
- __QSUB
- */
- void TC_CoreSimd_SatAddSub (void) {
- #if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
- (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) )
- volatile int32_t op1_s32, op2_s32;
- volatile int32_t res_s32;
- /* --- __QADD Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x80000003;
- op2_s32 = (int32_t)0x00000004;
- res_s32 = __QADD(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0x80000007);
- op1_s32 = (int32_t)0x80000000;
- op2_s32 = (int32_t)0x80000002;
- res_s32 = __QADD(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0x80000000);
- /* --- __QSUB Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x80000003;
- op2_s32 = (int32_t)0x00000004;
- res_s32 = __QSUB(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0x80000000);
- op1_s32 = (int32_t)0x80000003;
- op2_s32 = (int32_t)0x00000002;
- res_s32 = __QSUB(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0x80000001);
- #endif
- }
- /**
- \brief Test case: TC_CoreSimd_ParSat16
- \details
- - Check Parallel 16-bit saturation:
- __SSAT16
- __USAT16
- */
- void TC_CoreSimd_ParSat16 (void) {
- #if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
- (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) )
- volatile int32_t op1_s32;
- volatile int32_t res_s32;
- /* --- __SSAT16 Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x80030168;
- res_s32 = __SSAT16(op1_s32, 8);
- ASSERT_TRUE(res_s32 == (int32_t)0xFF80007F);
- /* --- __USAT16 Test ---------------------------------------------- */
- op1_s32 = 0x0030168;
- res_s32 = __USAT16(op1_s32, 8);
- ASSERT_TRUE(res_s32 == 0x000300FF);
- #endif
- }
- /**
- \brief Test case: TC_CoreSimd_PackUnpack
- \details
- - Check Packing and unpacking:
- __SXTB16
- __SXTB16_RORn
- __SXTAB16
- __SXTAB16__RORn
- __UXTB16
- __UXTAB16
- */
- void TC_CoreSimd_PackUnpack (void) {
- #if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
- (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) )
- volatile int32_t op1_s32, op2_s32;
- volatile int32_t res_s32;
- /* --- __SXTB16 Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x80830168;
- res_s32 = __SXTB16(op1_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0xFF830068);
- /* --- __SXTB16_ROR8 Test ----------------------------------------- */
- op1_s32 = (int32_t)0x80830168;
- res_s32 = __SXTB16_RORn(op1_s32, 8);
- ASSERT_TRUE(res_s32 == (int32_t)0xFF800001);
- /* --- __SXTB16_ROR16 Test ---------------------------------------- */
- op1_s32 = (int32_t)0x80830168;
- res_s32 = __SXTB16_RORn(op1_s32, 16);
- ASSERT_TRUE(res_s32 == (int32_t)0x68FF83);
- /* --- __SXTB16_ROR24 Test ---------------------------------------- */
- op1_s32 = (int32_t)0x80830168;
- res_s32 = __SXTB16_RORn(op1_s32, 24);
- ASSERT_TRUE(res_s32 == (int32_t)0x1FF80);
- /* --- __SXTAB16 Test --------------------------------------------- */
- op1_s32 = (int32_t)0x000D0008;
- op2_s32 = (int32_t)0x80830168;
- res_s32 = __SXTAB16(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0xFF900070);
- /* --- __SXTAB16__ROR8 Test --------------------------------------- */
- op1_s32 = (int32_t)0x000A000A;
- op2_s32 = (int32_t)0x80830168;
- res_s32 = __SXTAB16_RORn(op1_s32, op2_s32, 8);
- ASSERT_TRUE(res_s32 == (int32_t)0xFF8A000B);
- /* --- __SXTAB16__ROR8 Test --------------------------------------- */
- op1_s32 = (int32_t)0xFFF6FFF6;
- op2_s32 = (int32_t)0x80830168;
- res_s32 = __SXTAB16_RORn(op1_s32, op2_s32, 8);
- ASSERT_TRUE(res_s32 == (int32_t)0xFF76FFF7);
- /* --- __SXTAB16__ROR16 Test -------------------------------------- */
- op1_s32 = (int32_t)0xFFF60015;
- op2_s32 = (int32_t)0x70880168;
- res_s32 = __SXTAB16_RORn(op1_s32, op2_s32, 16);
- ASSERT_TRUE(res_s32 == (int32_t)0x5EFF9D);
- /* --- __SXTAB16__ROR24 Test -------------------------------------- */
- op1_s32 = (int32_t)0xFFF60015;
- op2_s32 = (int32_t)0x70880168;
- res_s32 = __SXTAB16_RORn(op1_s32, op2_s32, 24);
- ASSERT_TRUE(res_s32 == (int32_t)0xFFF70085);
- /* --- __UXTB16 Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x80830168;
- res_s32 = __UXTB16(op1_s32);
- ASSERT_TRUE(res_s32 == 0x00830068);
- /* --- __UXTAB16 Test --------------------------------------------- */
- op1_s32 = 0x000D0008;
- op2_s32 = (int32_t)0x80830168;
- res_s32 = __UXTAB16(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == 0x00900070);
- #endif
- }
- /**
- \brief Test case: TC_CoreSimd_ParSel
- \details
- - Check Parallel selection:
- __SEL
- */
- void TC_CoreSimd_ParSel (void) {
- #if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
- (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) )
- volatile uint32_t res_u32;
- volatile int32_t op1_s32, op2_s32;
- volatile int32_t res_s32;
- APSR_Type apsr;
- xPSR_Type xpsr;
- /* --- __SEL Test ---------------------------------------------- */
- op1_s32 = 0x33221100;
- op2_s32 = 0x77665544;
- res_s32 = __SADD8(0x80808080, 0x00000000); /* __sadd8 sets APSR.GE = 0x00 */
- res_u32 = __get_APSR();
- apsr.w = __get_APSR();
- ASSERT_TRUE( (res_u32 == apsr.w) );
- xpsr.w = __get_xPSR();
- ASSERT_TRUE( (((res_u32 >> 16) & 0x0F) == xpsr.b.GE) );
- res_s32 = __SEL(op1_s32, op2_s32); /* __sel APSR.GE = 0x00 */
- ASSERT_TRUE( res_s32 == 0x77665544);
- res_s32 = __SADD8(0x80808000, 0x00000000); /* __sadd8 sets APSR.GE = 0x01 */
- res_u32 = __get_APSR();
- apsr.w = __get_APSR();
- ASSERT_TRUE( (res_u32 == apsr.w) );
- xpsr.w = __get_xPSR();
- ASSERT_TRUE( (((res_u32 >> 16) & 0x0F) == xpsr.b.GE) );
- res_s32 = __SEL(op1_s32, op2_s32); /* __sel APSR.GE = 0x01 */
- ASSERT_TRUE(res_s32 == 0x77665500);
- res_s32 = __SADD8(0x80800080, 0x00000000); /* __sadd8 sets APSR.GE = 0x02 */
- res_u32 = __get_APSR();
- apsr.w = __get_APSR();
- ASSERT_TRUE( (res_u32 == apsr.w) );
- xpsr.w = __get_xPSR();
- ASSERT_TRUE( (((res_u32 >> 16) & 0x0F) == xpsr.b.GE) );
- res_s32 = __SEL(op1_s32, op2_s32); /* __sel APSR.GE = 0x02 */
- ASSERT_TRUE(res_s32 == 0x77661144);
- #endif
- }
- /**
- \brief Test case: TC_CoreSimd_ParAddSub8
- \details
- - Check Parallel 8-bit addition and subtraction:
- __SADD8 S Signed
- __SSUB8 Q Signed Saturating
- __SHADD8 SH Signed Halving
- __SHSUB8 U Unsigned
- __QADD8 UQ Unsigned Saturating
- __QSUB8 UH Unsigned Halving
- __UADD8
- __USUB8
- __UHADD8
- __UHSUB8
- __UQADD8
- __UQSUB8
- */
- void TC_CoreSimd_ParAddSub8 (void) {
- #if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
- (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) )
- volatile uint32_t op1_u32, op2_u32;
- volatile uint32_t res_u32;
- volatile int32_t op1_s32, op2_s32;
- volatile int32_t res_s32;
- /* --- __SADD8 Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x87858381;
- op2_s32 = (int32_t)0x08060402;
- res_s32 = __SADD8(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0x8F8B8783);
- /* --- __SSUB8 Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x8F8B8783;
- op2_s32 = (int32_t)0x08060402;
- res_s32 = __SSUB8(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0x87858381);
- /* --- __SHADD8 Test ---------------------------------------------- */
- op1_s32 = 0x07050302;
- op2_s32 = 0x08060402;
- res_s32 = __SHADD8(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == 0x07050302);
- /* --- __SHSUB8 Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x8F8B8783;
- op2_s32 = 0x08060402;
- res_s32 = __SHSUB8(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0xC3C2C1C0);
- /* --- __QADD8 Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x8085837F;
- op2_s32 = (int32_t)0xFF060402;
- res_s32 = __QADD8(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0x808B877F);
- /* --- __QSUB8 Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x808B8783;
- op2_s32 = (int32_t)0x08060402;
- res_s32 = __QSUB8(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0x80858381);
- /* --- __UADD8 Test ---------------------------------------------- */
- op1_u32 = 0x07050301;
- op2_u32 = 0x08060402;
- res_u32 = __UADD8(op1_u32, op2_u32);
- ASSERT_TRUE(res_u32 == 0x0F0B0703);
- /* --- __USUB8 Test ---------------------------------------------- */
- op1_u32 = 0x0F0B0703;
- op2_u32 = 0x08060402;
- res_u32 = __USUB8(op1_u32, op2_u32);
- ASSERT_TRUE(res_u32 == 0x07050301);
- /* --- __UHADD8 Test ---------------------------------------------- */
- op1_u32 = 0x07050302;
- op2_u32 = 0x08060402;
- res_u32 = __UHADD8(op1_u32, op2_u32);
- ASSERT_TRUE(res_u32 == 0x07050302);
- /* --- __UHSUB8 Test ---------------------------------------------- */
- op1_u32 = 0x0F0B0703;
- op2_u32 = 0x08060402;
- res_u32 = __UHSUB8(op1_u32, op2_u32);
- ASSERT_TRUE(res_u32 == 0x03020100);
- /* --- __UQADD8 Test ---------------------------------------------- */
- op1_u32 = 0xFF050301;
- op2_u32 = 0x08060402;
- res_u32 = __UQADD8(op1_u32, op2_u32);
- ASSERT_TRUE(res_u32 == 0xFF0B0703);
- /* --- __UQSUB8 Test ---------------------------------------------- */
- op1_u32 = 0x080B0702;
- op2_u32 = 0x0F060408;
- res_u32 = __UQSUB8(op1_u32, op2_u32);
- ASSERT_TRUE(res_u32 == 0x00050300);
- #endif
- }
- /**
- \brief Test case: TC_CoreSimd_AbsDif8
- \details
- - Check Sum of 8-bit absolute differences:
- __USAD8
- __USADA8
- */
- void TC_CoreSimd_AbsDif8 (void) {
- #if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
- (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) )
- volatile uint32_t op1_u32, op2_u32, op3_u32;
- volatile uint32_t res_u32;
- /* --- __USAD8 Test ---------------------------------------------- */
- op1_u32 = 0x87858381;
- op2_u32 = 0x08060402;
- res_u32 = __USAD8(op1_u32, op2_u32);
- ASSERT_TRUE(res_u32 == 0x000001FC);
- /* --- __USADA8 Test ---------------------------------------------- */
- op1_u32 = 0x87858381;
- op2_u32 = 0x08060402;
- op3_u32 = 0x00008000;
- res_u32 = __USADA8(op1_u32, op2_u32, op3_u32);
- ASSERT_TRUE(res_u32 == 0x000081FC);
- #endif
- }
- /**
- \brief Test case: TC_CoreSimd_ParAddSub16
- \details
- - Check Parallel 16-bit addition and subtraction:
- __SADD16
- __SSUB16
- __SASX
- __SSAX
- __SHADD16
- __SHSUB16
- __SHASX
- __SHSAX
- __QADD16
- __QSUB16
- __QASX
- __QSAX
- __UADD16
- __USUB16
- __UASX
- __USAX
- __UHADD16
- __UHSUB16
- __UHASX
- __UHSAX
- __UQSUB16
- __UQADD16
- __UQASX
- __UQSAX
- */
- void TC_CoreSimd_ParAddSub16 (void) {
- #if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
- (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) )
- volatile uint32_t op1_u32, op2_u32;
- volatile uint32_t res_u32;
- volatile int32_t op1_s32, op2_s32;
- volatile int32_t res_s32;
- /* --- __SADD16 Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x80038001;
- op2_s32 = (int32_t)0x00040002;
- res_s32 = __SADD16(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0x80078003);
- /* --- __SSUB16 Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x80078003;
- op2_s32 = (int32_t)0x00040002;
- res_s32 = __SSUB16(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0x80038001);
- /* --- __SASX Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x80078003;
- op2_s32 = (int32_t)0x00040002;
- res_s32 = __SASX(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0x80097FFF);
- /* --- __SSAX Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x80038007;
- op2_s32 = (int32_t)0x00020004;
- res_s32 = __SSAX(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0x7FFF8009);
- /* --- __SHADD16 Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x80038001;
- op2_s32 = (int32_t)0x00040002;
- res_s32 = __SHADD16(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0xC003C001);
- /* --- __SHSUB16 Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x80078003;
- op2_s32 = (int32_t)0x00040002;
- res_s32 = __SHSUB16(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0xC001C000);
- /* --- __SHASX Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x80078003;
- op2_s32 = (int32_t)0x00040002;
- res_s32 = __SHASX(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0xC004BFFF);
- /* --- __SHSAX Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x80038007;
- op2_s32 = (int32_t)0x00020004;
- res_s32 = __SHSAX(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0xBFFFC004);
- /* --- __QADD16 Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x80038000;
- op2_s32 = (int32_t)0x00048002;
- res_s32 = __QADD16(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0x80078000);
- /* --- __QSUB16 Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x80038003;
- op2_s32 = (int32_t)0x00040002;
- res_s32 = __QSUB16(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0x80008001);
- /* --- __QASX Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x80078003;
- op2_s32 = (int32_t)0x00040002;
- res_s32 = __QASX(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0x80098000);
- /* --- __QSAX Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x80038007;
- op2_s32 = (int32_t)0x00020004;
- res_s32 = __QSAX(op1_s32, op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0x80008009);
- /* --- __UADD16 Test ---------------------------------------------- */
- op1_u32 = 0x00010002;
- op2_u32 = 0x00020004;
- res_u32 = __UADD16(op1_u32, op2_u32);
- ASSERT_TRUE(res_u32 == 0x00030006);
- /* --- __USUB16 Test ---------------------------------------------- */
- op1_u32 = 0x00030006;
- op2_u32 = 0x00020004;
- res_u32 = __USUB16(op1_u32, op2_u32);
- ASSERT_TRUE(res_u32 == 0x00010002);
- /* --- __UASX Test ---------------------------------------------- */
- op1_u32 = 0x80078003;
- op2_u32 = 0x00040002;
- res_u32 = __UASX(op1_u32, op2_u32);
- ASSERT_TRUE(res_u32 == 0x80097FFF);
- /* --- __USAX Test ---------------------------------------------- */
- op1_u32 = 0x80038007;
- op2_u32 = 0x00020004;
- res_u32 = __USAX(op1_u32, op2_u32);
- ASSERT_TRUE(res_u32 == 0x7FFF8009);
- /* --- __UHADD16 Test ---------------------------------------------- */
- op1_u32 = 0x00010002;
- op2_u32 = 0x00020004;
- res_u32 = __UHADD16(op1_u32, op2_u32);
- ASSERT_TRUE(res_u32 == 0x00010003);
- /* --- __UHSUB16 Test ---------------------------------------------- */
- op1_u32 = 0x00030006;
- op2_u32 = 0x00020004;
- res_u32 = __UHSUB16(op1_u32, op2_u32);
- ASSERT_TRUE(res_u32 == 0x00000001);
- /* --- __UHASX Test ---------------------------------------------- */
- op1_u32 = 0x80078003;
- op2_u32 = 0x00040002;
- res_u32 = __UHASX(op1_u32, op2_u32);
- ASSERT_TRUE(res_u32 == 0x40043FFF);
- /* --- __UHSAX Test ---------------------------------------------- */
- op1_u32 = 0x80038007;
- op2_u32 = 0x00020004;
- res_u32 = __UHSAX(op1_u32, op2_u32);
- ASSERT_TRUE(res_u32 == 0x3FFF4004);
- /* --- __UQADD16 Test ---------------------------------------------- */
- op1_u32 = 0xFFFE0002;
- op2_u32 = 0x00020004;
- res_u32 = __UQADD16(op1_u32, op2_u32);
- ASSERT_TRUE(res_u32 == 0xFFFF0006);
- /* --- __UQSUB16 Test ---------------------------------------------- */
- op1_u32 = 0x00020006;
- op2_u32 = 0x00030004;
- res_u32 = __UQSUB16(op1_u32, op2_u32);
- ASSERT_TRUE(res_u32 == 0x00000002);
- /* --- __UQASX Test ---------------------------------------------- */
- op1_u32 = 0xFFF80003;
- op2_u32 = 0x00040009;
- res_u32 = __UQASX(op1_u32, op2_u32);
- ASSERT_TRUE(res_u32 == 0xFFFF0000);
- /* --- __UQSAX Test ---------------------------------------------- */
- op1_u32 = 0x0003FFF8;
- op2_u32 = 0x00090004;
- res_u32 = __UQSAX(op1_u32, op2_u32);
- ASSERT_TRUE(res_u32 == 0x0000FFFF);
- #endif
- }
- /**
- \brief Test case: TC_CoreSimd_ParMul16
- \details
- - Check Parallel 16-bit multiplication:
- __SMLAD
- __SMLADX
- __SMLALD
- __SMLALDX
- __SMLSD
- __SMLSDX
- __SMLSLD
- __SMLSLDX
- __SMUAD
- __SMUADX
- __SMUSD
- __SMUSDX
- */
- void TC_CoreSimd_ParMul16 (void) {
- #if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
- (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) )
- volatile int32_t op1_s32, op2_s32, op3_s32;
- volatile int32_t res_s32;
- volatile int64_t op1_s64;
- volatile int64_t res_s64;
- /* --- __SMLAD Test ---------------------------------------------- */
- op1_s32 = 0x00030002;
- op2_s32 = 0x00050004;
- op3_s32 = 0x20000000;
- res_s32 = __SMLAD(op1_s32, op2_s32, op3_s32);
- ASSERT_TRUE(res_s32 == 0x20000017);
- /* --- __SMLADX Test ---------------------------------------------- */
- op1_s32 = 0x00030002;
- op2_s32 = 0x00050004;
- op3_s32 = 0x00000800;
- res_s32 = __SMLADX(op1_s32, op2_s32, op3_s32);
- ASSERT_TRUE(res_s32 == 0x00000816);
- /* --- __SMLALD Test ---------------------------------------------- */
- op1_s32 = 0x00030002;
- op2_s32 = 0x00050004;
- op1_s64 = 0x00000000200000000LL;
- res_s64 = __SMLALD(op1_s32, op2_s32, op1_s64);
- ASSERT_TRUE(res_s64 == 0x0000000200000017LL);
- /* --- __SMLALDX Test ---------------------------------------------- */
- op1_s32 = 0x00030002;
- op2_s32 = 0x00050004;
- op1_s64 = 0x00000000200000000LL;
- res_s64 = __SMLALDX(op1_s32, op2_s32, op1_s64);
- ASSERT_TRUE(res_s64 == 0x0000000200000016LL);
- /* --- __SMLSD Test ---------------------------------------------- */
- op1_s32 = 0x00030006;
- op2_s32 = 0x00050004;
- op3_s32 = 0x00000800;
- res_s32 = __SMLSD(op1_s32, op2_s32, op3_s32);
- ASSERT_TRUE(res_s32 == 0x00000809);
- /* --- __SMLSDX Test ---------------------------------------------- */
- op1_s32 = 0x00030002;
- op2_s32 = 0x00050004;
- op3_s32 = 0x00000800;
- res_s32 = __SMLSDX(op1_s32, op2_s32, op3_s32);
- ASSERT_TRUE(res_s32 == 0x000007FE);
- /* --- __SMLSLD Test ---------------------------------------------- */
- op1_s32 = 0x00030006;
- op2_s32 = 0x00050004;
- op1_s64 = 0x00000000200000000LL;
- res_s64 = __SMLSLD(op1_s32, op2_s32, op1_s64);
- ASSERT_TRUE(res_s64 == 0x0000000200000009LL);
- /* --- __SMLSLDX Test ---------------------------------------------- */
- op1_s32 = 0x00030006;
- op2_s32 = 0x00050004;
- op1_s64 = 0x00000000200000000LL;
- res_s64 = __SMLSLDX(op1_s32, op2_s32, op1_s64);
- ASSERT_TRUE(res_s64 == 0x0000000200000012LL);
- /* --- __SMUAD Test ---------------------------------------------- */
- op1_s32 = 0x00030001;
- op2_s32 = 0x00040002;
- res_s32 = __SMUAD(op1_s32,op2_s32);
- ASSERT_TRUE(res_s32 == 0x0000000E);
- op1_s32 = (int32_t)0xFFFDFFFF;
- op2_s32 = (int32_t)0x00040002;
- res_s32 = __SMUAD(op1_s32,op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0xFFFFFFF2);
- /* --- __SMUADX Test ---------------------------------------------- */
- op1_s32 = 0x00030001;
- op2_s32 = 0x00040002;
- res_s32 = __SMUADX(op1_s32,op2_s32);
- ASSERT_TRUE(res_s32 == 0x0000000A);
- op1_s32 = (int32_t)0xFFFDFFFF;
- op2_s32 = (int32_t)0x00040002;
- res_s32 = __SMUADX(op1_s32,op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0xFFFFFFF6);
- /* --- __SMUSD Test ---------------------------------------------- */
- op1_s32 = (int32_t)0x00030001;
- op2_s32 = (int32_t)0x00040002;
- res_s32 = __SMUSD(op1_s32,op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0xFFFFFFF6);
- op1_s32 = (int32_t)0xFFFDFFFF;
- op2_s32 = (int32_t)0x00040002;
- res_s32 = __SMUSD(op1_s32,op2_s32);
- ASSERT_TRUE(res_s32 == 0x0000000A);
- /* --- __SMUSDX Test ---------------------------------------------- */
- op1_s32 = 0x00030001;
- op2_s32 = 0x00040002;
- res_s32 = __SMUSDX(op1_s32,op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0xFFFFFFFE);
- op1_s32 = (int32_t)0xFFFDFFFF;
- op2_s32 = (int32_t)0x00040002;
- res_s32 = __SMUSDX(op1_s32,op2_s32);
- ASSERT_TRUE(res_s32 == (int32_t)0x00000002);
- #endif
- }
- /**
- \brief Test case: TC_CoreSimd_Part9
- \details
- - Check Packing Halfword:
- __PKHBT
- __PKHTB
- */
- void TC_CoreSimd_Pack16 (void) {
- #if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
- (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) )
- volatile uint32_t op1_u32, op2_u32;
- volatile uint32_t res_u32;
- /* --- __PKHBT Test ---------------------------------------------- */
- op1_u32 = 0x00000111;
- op2_u32 = 0x22200000;
- res_u32 = __PKHBT(op1_u32, op2_u32, 0);
- ASSERT_TRUE(res_u32 == 0x22200111);
- op1_u32 = 0x00000111;
- op2_u32 = 0x22200000;
- res_u32 = __PKHBT(op1_u32, op2_u32, 4);
- ASSERT_TRUE(res_u32 == 0x22000111);
- /* --- __PKHTB Test ---------------------------------------------- */
- op1_u32 = 0x11100000;
- op2_u32 = 0x00000222;
- res_u32 = __PKHTB(op1_u32, op2_u32, 0);
- ASSERT_TRUE(res_u32 == 0x11100222);
- op1_u32 = 0x11100000;
- op2_u32 = 0x00000222;
- res_u32 = __PKHTB(op1_u32, op2_u32, 4);
- ASSERT_TRUE(res_u32 == 0x11100022);
- #endif
- }
- /**
- \brief Test case: TC_CoreSimd_MulAcc32
- \details
- - Check Signed Most Significant Word Multiply Accumulate:
- __SMMLA
- */
- void TC_CoreSimd_MulAcc32 (void) {
- #if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \
- (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) )
- volatile int32_t op1_s32, op2_s32, op3_s32;
- volatile int32_t res_s32;
- /* --- __SMMLA Test ---------------------------------------------- */
- op1_s32 = 0x00000200;
- op2_s32 = 0x00000004;
- op3_s32 = 0x00000100;
- res_s32 = __SMMLA(op1_s32, op2_s32, op3_s32);
- ASSERT_TRUE(res_s32 == 0x00000100);
- op1_s32 = 0x40000000;
- op2_s32 = 0x00000010;
- op3_s32 = 0x00000300;
- res_s32 = __SMMLA(op1_s32, op2_s32, op3_s32);
- ASSERT_TRUE(res_s32 == 0x00000304);
- #endif
- }
|