1145983Sbrueffer/* { dg-do run } */ 2147197Smarkus/* { dg-require-effective-target ssse3 } */ 3145983Sbrueffer/* { dg-options "-O2 -fno-strict-aliasing -mssse3" } */ 4145983Sbrueffer 5145983Sbrueffer#ifndef CHECK_H 6145983Sbrueffer#define CHECK_H "ssse3-check.h" 7145983Sbrueffer#endif 8145983Sbrueffer 9145983Sbrueffer#ifndef TEST 10145983Sbrueffer#define TEST ssse3_test 11145983Sbrueffer#endif 12145983Sbrueffer 13145983Sbrueffer#include CHECK_H 14145983Sbrueffer#include "ssse3-vals.h" 15145983Sbrueffer 16145983Sbrueffer#include <tmmintrin.h> 17145983Sbrueffer 18145983Sbrueffer#ifndef __AVX__ 19145983Sbrueffer/* Test the 64-bit form */ 20145983Sbruefferstatic void 21145983Sbruefferssse3_test_psignb (int *i1, int *i2, int *r) 22145983Sbrueffer{ 23145983Sbrueffer __m64 t1 = *(__m64 *) i1; 24145983Sbrueffer __m64 t2 = *(__m64 *) i2; 25145983Sbrueffer *(__m64 *) r = _mm_sign_pi8 (t1, t2); 26145983Sbrueffer _mm_empty (); 27145983Sbrueffer} 28237494Siwasaki#endif 29203687Sgavin 30145983Sbrueffer/* Test the 128-bit form */ 31145983Sbruefferstatic void 32145983Sbruefferssse3_test_psignb128 (int *i1, int *i2, int *r) 33147197Smarkus{ 34145983Sbrueffer /* Assumes incoming pointers are 16-byte aligned */ 35157365Sbrueffer __m128i t1 = *(__m128i *) i1; 36157365Sbrueffer __m128i t2 = *(__m128i *) i2; 37157365Sbrueffer *(__m128i *) r = _mm_sign_epi8 (t1, t2); 38157365Sbrueffer} 39145983Sbrueffer 40157365Sbrueffer/* Routine to manually compute the results */ 41157365Sbruefferstatic void 42157365Sbrueffercompute_correct_result (int *i1, int *i2, int *r) 43157365Sbrueffer{ 44157365Sbrueffer char *b1 = (char *) i1; 45157365Sbrueffer char *b2 = (char *) i2; 46157365Sbrueffer char *bout = (char *) r; 47157365Sbrueffer int i; 48145983Sbrueffer 49145983Sbrueffer for (i = 0; i < 16; i++) 50145983Sbrueffer if (b2[i] < 0) 51147197Smarkus bout[i] = -b1[i]; 52145983Sbrueffer else if (b2[i] == 0) 53145983Sbrueffer bout[i] = 0; 54147197Smarkus else 55147197Smarkus bout[i] = b1[i]; 56147197Smarkus} 57145983Sbrueffer 58145983Sbruefferstatic void 59148967SmarkusTEST (void) 60148967Smarkus{ 61148967Smarkus int i; 62148967Smarkus int r [4] __attribute__ ((aligned(16))); 63148967Smarkus int ck [4]; 64148967Smarkus int fail = 0; 65148967Smarkus 66148967Smarkus for (i = 0; i < 256; i += 8) 67148967Smarkus { 68148967Smarkus /* Manually compute the result */ 69148967Smarkus compute_correct_result (&vals[i + 0], &vals[i + 4], ck); 70148967Smarkus 71148967Smarkus#ifndef __AVX__ 72148967Smarkus /* Run the 64-bit tests */ 73148967Smarkus ssse3_test_psignb (&vals[i + 0], &vals[i + 4], &r[0]); 74148967Smarkus ssse3_test_psignb (&vals[i + 2], &vals[i + 6], &r[2]); 75148967Smarkus fail += chk_128 (ck, r); 76148967Smarkus#endif 77148967Smarkus 78148967Smarkus /* Run the 128-bit tests */ 79148967Smarkus ssse3_test_psignb128 (&vals[i + 0], &vals[i + 4], r); 80148967Smarkus fail += chk_128 (ck, r); 81148967Smarkus } 82148967Smarkus 83148967Smarkus if (fail != 0) 84148967Smarkus abort (); 85148967Smarkus} 86148967Smarkus