1073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon/* 2073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon 380902f6bfb82ca1a0b17604602a47baf314b7876Christophe LyonCopyright (c) 2009, 2010, 2011, 2013 STMicroelectronics 4073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonWritten by Christophe Lyon 5073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon 6073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonPermission is hereby granted, free of charge, to any person obtaining a copy 7073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyonof this software and associated documentation files (the "Software"), to deal 8073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyonin the Software without restriction, including without limitation the rights 9073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyonto use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyoncopies of the Software, and to permit persons to whom the Software is 11073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyonfurnished to do so, subject to the following conditions: 12073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon 13073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonThe above copyright notice and this permission notice shall be included in 14073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyonall copies or substantial portions of the Software. 15073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon 16073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22073831adf9442c019e8d34b18b0c04b1d780a19Christophe LyonTHE SOFTWARE. 23073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon 24073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon*/ 25073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon 261775be0bcaa673c19bb1f60f0c1bce1b91cdb414Christophe Lyon#if defined(__arm__) || defined(__aarch64__) 27073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#include <arm_neon.h> 28073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#else 290dab5f72da4b2434882b51b44ac377af9e3160feChristophe Lyon#include "stm-arm-neon.h" 30073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#endif 31073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon 32073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#include "stm-arm-neon-ref.h" 33073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon 34073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#define TEST_MSG "VCOMBINE" 35073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyonvoid exec_vcombine (void) 36073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon{ 37073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon /* Basic test: vec128=vcombine(vec64_a, vec64_b), then store the result. */ 38073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon#define TEST_VCOMBINE(T1, T2, W, N, N2) \ 39073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon VECT_VAR(vector128, T1, W, N2) = \ 40073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon vcombine_##T2##W(VECT_VAR(vector64_a, T1, W, N), \ 41073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon VECT_VAR(vector64_b, T1, W, N)); \ 42073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon vst1q_##T2##W(VECT_VAR(result, T1, W, N2), VECT_VAR(vector128, T1, W, N2)) 43073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon 44073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon /* With ARM RVCT, we need to declare variables before any executable 45073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon statement */ 46073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon DECL_VARIABLE_64BITS_VARIANTS(vector64_a); 47073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon DECL_VARIABLE_64BITS_VARIANTS(vector64_b); 48073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon DECL_VARIABLE_128BITS_VARIANTS(vector128); 49d98beba6c8fa7b38fb62cb799c9c7de355937cf3Christophe Lyon#if defined(__ARM_FP16_FORMAT_IEEE) && ( ((__ARM_FP & 0x2) != 0) || ((__ARM_NEON_FP16_INTRINSICS & 1) != 0) ) 5034adaf63011ec336c8fa4594c6bba1c59840e167Christophe Lyon DECL_VARIABLE(vector64_a, float, 16, 4); 5134adaf63011ec336c8fa4594c6bba1c59840e167Christophe Lyon DECL_VARIABLE(vector64_b, float, 16, 4); 5234adaf63011ec336c8fa4594c6bba1c59840e167Christophe Lyon DECL_VARIABLE(vector64_b_init, uint, 16, 4); 5334adaf63011ec336c8fa4594c6bba1c59840e167Christophe Lyon DECL_VARIABLE(vector128, float, 16, 8); 5434adaf63011ec336c8fa4594c6bba1c59840e167Christophe Lyon#endif 55073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon 56f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon TEST_MACRO_64BITS_VARIANTS_2_5(VLOAD, vector64_a, buffer); 57f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon VLOAD(vector64_a, buffer, , float, f, 32, 2); 58d98beba6c8fa7b38fb62cb799c9c7de355937cf3Christophe Lyon#if defined(__ARM_FP16_FORMAT_IEEE) && ( ((__ARM_FP & 0x2) != 0) || ((__ARM_NEON_FP16_INTRINSICS & 1) != 0) ) 59f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon VLOAD(vector64_a, buffer, , float, f, 16, 4); 6034adaf63011ec336c8fa4594c6bba1c59840e167Christophe Lyon#endif 61073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon 62f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon VDUP(vector64_b, , int, s, 8, 8, 0x11); 63f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon VDUP(vector64_b, , int, s, 16, 4, 0x22); 64f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon VDUP(vector64_b, , int, s, 32, 2, 0x33); 65f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon VDUP(vector64_b, , int, s, 64, 1, 0x44); 66f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon VDUP(vector64_b, , uint, u, 8, 8, 0x55); 67f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon VDUP(vector64_b, , uint, u, 16, 4, 0x66); 68f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon VDUP(vector64_b, , uint, u, 32, 2, 0x77); 69f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon VDUP(vector64_b, , uint, u, 64, 1, 0x88); 70f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon VDUP(vector64_b, , poly, p, 8, 8, 0x55); 71f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon VDUP(vector64_b, , poly, p, 16, 4, 0x66); 72f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon VDUP(vector64_b, , float, f, 32, 2, 3.3f); 73073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon 74d98beba6c8fa7b38fb62cb799c9c7de355937cf3Christophe Lyon#if defined(__ARM_FP16_FORMAT_IEEE) && ( ((__ARM_FP & 0x2) != 0) || ((__ARM_NEON_FP16_INTRINSICS & 1) != 0) ) 7534adaf63011ec336c8fa4594c6bba1c59840e167Christophe Lyon /* There is no vdup_n_f16, so we need another initialization 7634adaf63011ec336c8fa4594c6bba1c59840e167Christophe Lyon method. */ 77f20536724d4cc8432d5b804082415c8391f88f9bChristophe Lyon VDUP(vector64_b_init, , uint, u, 16, 4, 0x4b80 /* 15 */); 7834adaf63011ec336c8fa4594c6bba1c59840e167Christophe Lyon VECT_VAR(vector64_b, float, 16, 4) = 7934adaf63011ec336c8fa4594c6bba1c59840e167Christophe Lyon vreinterpret_f16_u16(VECT_VAR(vector64_b_init, uint, 16, 4)); 8034adaf63011ec336c8fa4594c6bba1c59840e167Christophe Lyon#endif 8134adaf63011ec336c8fa4594c6bba1c59840e167Christophe Lyon 82073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon clean_results (); 83073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon 84073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon TEST_VCOMBINE(int, s, 8, 8, 16); 85073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon TEST_VCOMBINE(int, s, 16, 4, 8); 86073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon TEST_VCOMBINE(int, s, 32, 2, 4); 87073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon TEST_VCOMBINE(int, s, 64, 1, 2); 88073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon TEST_VCOMBINE(uint, u, 8, 8, 16); 89073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon TEST_VCOMBINE(uint, u, 16, 4, 8); 90073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon TEST_VCOMBINE(uint, u, 32, 2, 4); 91073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon TEST_VCOMBINE(uint, u, 64, 1, 2); 9280902f6bfb82ca1a0b17604602a47baf314b7876Christophe Lyon TEST_VCOMBINE(poly, p, 8, 8, 16); 9380902f6bfb82ca1a0b17604602a47baf314b7876Christophe Lyon TEST_VCOMBINE(poly, p, 16, 4, 8); 94073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon TEST_VCOMBINE(float, f, 32, 2, 4); 95d98beba6c8fa7b38fb62cb799c9c7de355937cf3Christophe Lyon#if defined(__ARM_FP16_FORMAT_IEEE) && ( ((__ARM_FP & 0x2) != 0) || ((__ARM_NEON_FP16_INTRINSICS & 1) != 0) ) 9634adaf63011ec336c8fa4594c6bba1c59840e167Christophe Lyon TEST_VCOMBINE(float, f, 16, 4, 8); 9734adaf63011ec336c8fa4594c6bba1c59840e167Christophe Lyon#endif 98073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon 99073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon dump_results_hex (TEST_MSG); 100073831adf9442c019e8d34b18b0c04b1d780a19Christophe Lyon} 101