1  /* { dg-do run } */
       2  /* { dg-options "-O2 -fno-inline" } */
       3  /* Stops the test_xxx methods being inlined into main, thus preventing constant
       4     propagation.  */
       5  
       6  #include "int_comparisons.x"
       7  
       8  extern void abort (void);
       9  
      10  #define CHECK2(R0, R1) if (res[0] != R0 || res[1] != R1) abort ()
      11  
      12  #define TEST2(BASETYPE, SUFFIX, RESTYPE, ST1_SUFFIX) {			\
      13    BASETYPE##_t _a[2] = {2, 3};						\
      14    BASETYPE##x2_t a = vld1##SUFFIX (_a);					\
      15    BASETYPE##_t _b[2] = {1, 3};						\
      16    BASETYPE##x2_t b = vld1##SUFFIX (_b);					\
      17    RESTYPE res[2];							\
      18    vst1##ST1_SUFFIX (res, test_vclt##SUFFIX (a, b)); CHECK2 (0, 0);	\
      19    vst1##ST1_SUFFIX (res, test_vclt##SUFFIX (b, a)); CHECK2 (-1, 0);	\
      20    vst1##ST1_SUFFIX (res, test_vcle##SUFFIX (a, b)); CHECK2 (0, -1);	\
      21    vst1##ST1_SUFFIX (res, test_vcle##SUFFIX (b, a)); CHECK2 (-1, -1);	\
      22    vst1##ST1_SUFFIX (res, test_vceq##SUFFIX (a, b)); CHECK2 (0, -1);	\
      23    vst1##ST1_SUFFIX (res, test_vcge##SUFFIX (a, b)); CHECK2 (-1, -1);	\
      24    vst1##ST1_SUFFIX (res, test_vcge##SUFFIX (b, a)); CHECK2 (0, -1);	\
      25    vst1##ST1_SUFFIX (res, test_vcgt##SUFFIX (a, b)); CHECK2 (-1, 0);	\
      26    vst1##ST1_SUFFIX (res, test_vcgt##SUFFIX (b, a)); CHECK2 (0, 0);	\
      27    vst1##ST1_SUFFIX (res, test_vtst##SUFFIX (a, b)); CHECK2 (0, -1);	\
      28    vst1##ST1_SUFFIX (res, test_vtst##SUFFIX (a + 1, b)); CHECK2 (-1, 0); \
      29  }
      30  
      31  #define CHECK4(T, R0, R1, R2, R3)		\
      32    if (res[0] != (T)R0 || res[1] != (T)R1	\
      33        || res[2] != (T)R2 || res[3] != (T)R3) abort ()
      34  
      35  #define TEST4(BASETYPE, SUFFIX, RESTYPE, ST1_SUFFIX) {	\
      36    BASETYPE##_t _a[4] = {1, 2, 3, 4};			\
      37    BASETYPE##x4_t a = vld1##SUFFIX (_a);			\
      38    BASETYPE##_t _b[4] = {4, 2, 1, 3};			\
      39    BASETYPE##x4_t b = vld1##SUFFIX (_b);			\
      40    RESTYPE res[4];					\
      41    vst1##ST1_SUFFIX (res, test_vclt##SUFFIX (a, b));	\
      42    CHECK4 (RESTYPE, -1, 0, 0, 0);			\
      43    vst1##ST1_SUFFIX (res, test_vcle##SUFFIX (a, b));	\
      44    CHECK4 (RESTYPE, -1, -1, 0, 0);			\
      45    vst1##ST1_SUFFIX (res, test_vceq##SUFFIX (a, b));	\
      46    CHECK4 (RESTYPE, 0, -1, 0, 0);			\
      47    vst1##ST1_SUFFIX (res, test_vcge##SUFFIX (a, b));	\
      48    CHECK4 (RESTYPE, 0, -1, -1, -1);			\
      49    vst1##ST1_SUFFIX (res, test_vcgt##SUFFIX (a, b));	\
      50    CHECK4 (RESTYPE, 0, 0, -1, -1);			\
      51    vst1##ST1_SUFFIX (res, test_vtst##SUFFIX (a, b));	\
      52    CHECK4 (RESTYPE, 0, -1, -1, 0);			\
      53  }
      54  
      55  #define CHECK8(T, R0, R1, R2, R3, R4, R5, R6, R7)			       \
      56    if (res[0] != (T)R0 || res[1] != (T)R1 || res[2] != (T)R2 || res[3] != (T)R3 \
      57        || res[4] != (T)R4 || res[5] != (T)R5 || res[6] != (T)R6		       \
      58        || res[7] != (T)R7) abort ()
      59  
      60  #define TEST8(BASETYPE, SUFFIX, RESTYPE, ST1_SUFFIX) {	\
      61    BASETYPE##_t _a[8] = {1, 2, 3, 4, 5, 6, 7, 8};	\
      62    BASETYPE##x8_t a = vld1##SUFFIX (_a);			\
      63    BASETYPE##_t _b[8] = {4, 2, 1, 3, 2, 6, 8, 9};	\
      64    BASETYPE##x8_t b = vld1##SUFFIX (_b);			\
      65    RESTYPE res[8];					\
      66    vst1##ST1_SUFFIX (res, test_vclt##SUFFIX (a, b));	\
      67    CHECK8 (RESTYPE, -1, 0, 0, 0, 0, 0, -1, -1);		\
      68    vst1##ST1_SUFFIX (res, test_vcle##SUFFIX (a, b));	\
      69    CHECK8 (RESTYPE, -1, -1, 0, 0, 0, -1, -1, -1);	\
      70    vst1##ST1_SUFFIX (res, test_vceq##SUFFIX (a, b));	\
      71    CHECK8 (RESTYPE, 0, -1, 0, 0, 0, -1, 0, 0);		\
      72    vst1##ST1_SUFFIX (res, test_vcge##SUFFIX (a, b));	\
      73    CHECK8 (RESTYPE, 0, -1, -1, -1, -1, -1, 0, 0);	\
      74    vst1##ST1_SUFFIX (res, test_vcgt##SUFFIX (a, b));	\
      75    CHECK8 (RESTYPE, 0, 0, -1, -1, -1, 0, 0, 0);		\
      76    vst1##ST1_SUFFIX (res, test_vtst##SUFFIX (a, b));	\
      77    CHECK8 (RESTYPE, 0, -1, -1, 0, 0, -1, 0, -1);		\
      78  }
      79  
      80  /* 16-way tests use same 8 values twice.  */
      81  #define CHECK16(T, R0, R1, R2, R3, R4, R5, R6, R7)			       \
      82    if (res[0] != (T)R0 || res[1] != (T)R1 || res[2] != (T)R2 || res[3] != (T)R3 \
      83        || res[4] != (T)R4 || res[5] != (T)R5 || res[6] != (T)R6		       \
      84        || res[7] != (T)R7 || res[8] != (T)R0 || res[9] != (T)R1		       \
      85        || res[10] != (T)R2 || res[11] != (T)R3 || res[12] != (T)R4	       \
      86        || res[13] != (T)R5 || res[14] != (T)R6 || res[15] != (T)R7) abort ()
      87  
      88  #define TEST16(BASETYPE, SUFFIX, RESTYPE, ST1_SUFFIX) {			  \
      89    BASETYPE##_t _a[16] = {1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8}; \
      90    BASETYPE##x16_t a = vld1##SUFFIX (_a);				  \
      91    BASETYPE##_t _b[16] = {4, 2, 1, 3, 2, 6, 8, 9, 4, 2, 1, 3, 2, 6, 8, 9}; \
      92    BASETYPE##x16_t b = vld1##SUFFIX (_b);				  \
      93    RESTYPE res[16];							  \
      94    vst1##ST1_SUFFIX (res, test_vclt##SUFFIX (a, b));			  \
      95    CHECK16 (RESTYPE, -1, 0, 0, 0, 0, 0, -1, -1);				  \
      96    vst1##ST1_SUFFIX (res, test_vcle##SUFFIX (a, b));			  \
      97    CHECK16 (RESTYPE, -1, -1, 0, 0, 0, -1, -1, -1);			  \
      98    vst1##ST1_SUFFIX (res, test_vceq##SUFFIX (a, b));			  \
      99    CHECK16 (RESTYPE, 0, -1, 0, 0, 0, -1, 0, 0);				  \
     100    vst1##ST1_SUFFIX (res, test_vcge##SUFFIX (a, b));			  \
     101    CHECK16 (RESTYPE, 0, -1, -1, -1, -1, -1, 0, 0);			  \
     102    vst1##ST1_SUFFIX (res, test_vcgt##SUFFIX (a, b));			  \
     103    CHECK16 (RESTYPE, 0, 0, -1, -1, -1, 0, 0, 0);				  \
     104    vst1##ST1_SUFFIX (res, test_vtst##SUFFIX (a, b));			  \
     105    CHECK16 (RESTYPE, 0, -1, -1, 0, 0, -1, 0, -1);			  \
     106  }
     107  
     108  int
     109  main (int argc, char **argv)
     110  {
     111    TEST2 (int32, _s32, uint32_t, _u32);
     112    TEST2 (uint32, _u32, uint32_t, _u32);
     113    TEST2 (int64, q_s64, uint64_t, q_u64);
     114    TEST2 (uint64, q_u64, uint64_t, q_u64);
     115  
     116    TEST4 (int16, _s16, uint16_t, _u16);
     117    TEST4 (uint16, _u16, uint16_t, _u16);
     118    TEST4 (int32, q_s32, uint32_t, q_u32);
     119    TEST4 (uint32, q_u32, uint32_t, q_u32);
     120  
     121    TEST8 (int8, _s8, uint8_t, _u8);
     122    TEST8 (uint8, _u8, uint8_t, _u8);
     123    TEST8 (int16, q_s16, uint16_t, q_u16);
     124    TEST8 (uint16, q_u16, uint16_t, q_u16);
     125  
     126    TEST16 (int8, q_s8, uint8_t, q_u8);
     127    TEST16 (uint8, q_u8, uint8_t, q_u8);
     128  
     129    return 0;
     130  }
     131