(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
aarch64/
vclz.c
       1  /* Test vclz works correctly.  */
       2  /* { dg-do run } */
       3  /* { dg-options "-std=gnu99 -O3 -Wno-div-by-zero --save-temps" } */
       4  #include <arm_neon.h>
       5  
       6  extern void abort (void);
       7  
       8  /* Tests in binary should look like:
       9     0
      10     1
      11     10
      12     101
      13     1010
      14     10101
      15     etc.  */
      16  
      17  #define TEST0 0
      18  #define TEST1 0x1
      19  #define TEST2 0x2
      20  #define TEST3 0x5
      21  #define TEST4 0xa
      22  #define TEST5 0x15
      23  #define TEST6 0x2a
      24  #define TEST7 0x55
      25  #define TEST8 0xaa
      26  #define TEST9 0x155
      27  #define TEST10 0x2aa
      28  #define TEST11 0x555
      29  #define TEST12 0xaaa
      30  #define TEST13 0x1555
      31  #define TEST14 0x2aaa
      32  #define TEST15 0x5555
      33  #define TEST16 0xaaaa
      34  #define TEST17 0x15555
      35  #define TEST18 0x2aaaa
      36  #define TEST19 0x55555
      37  #define TEST20 0xaaaaa
      38  #define TEST21 0x155555
      39  #define TEST22 0x2aaaaa
      40  #define TEST23 0x555555
      41  #define TEST24 0xaaaaaa
      42  #define TEST25 0x1555555
      43  #define TEST26 0x2aaaaaa
      44  #define TEST27 0x5555555
      45  #define TEST28 0xaaaaaaa
      46  #define TEST29 0x15555555
      47  #define TEST30 0x2aaaaaaa
      48  #define TEST31 0x55555555
      49  #define TEST32 0xaaaaaaaa
      50  
      51  #define INHIB_OPTIMIZATION asm volatile ("" : : : "memory")
      52  
      53  #define CONCAT(a, b) a##b
      54  #define CONCAT1(a, b) CONCAT (a, b)
      55  #define REG_INFEX64 _
      56  #define REG_INFEX128 q_
      57  #define SIGNED0 u
      58  #define SIGNED1 s
      59  #define SIGNED(x) SIGNED##x
      60  #define REG_INFEX(reg_len) REG_INFEX##reg_len
      61  #define POSTFIX(reg_len, data_len, is_signed) \
      62    CONCAT1 (REG_INFEX (reg_len), CONCAT1 (SIGNED (is_signed), data_len))
      63  #define DATA_TYPE(data_len) DATA_TYPE_##data_len
      64  #define LOAD_INST(reg_len, data_len, is_signed) \
      65    CONCAT1 (vld1, POSTFIX (reg_len, data_len, is_signed))
      66  #define CLZ_INST(reg_len, data_len, is_signed) \
      67    CONCAT1 (vclz, POSTFIX (reg_len, data_len, is_signed))
      68  
      69  #define BUILD_TEST(type, size, lanes)			    \
      70  int __attribute__((noipa,noinline))			    \
      71  run_test##type##size##x##lanes (int##size##_t* test_set,    \
      72  				int##size##_t* answ_set,    \
      73  				int reg_len, int data_len,  \
      74  				int n)			    \
      75  {							    \
      76    int i;						    \
      77    INHIB_OPTIMIZATION;					    \
      78    int##size##x##lanes##_t a = vld1##type##size (test_set);  \
      79    int##size##x##lanes##_t b = vld1##type##size (answ_set);  \
      80    a = vclz##type##size (a);				    \
      81    for (i = 0; i < n; i++){				    \
      82      if (a [i] != b [i])					    \
      83        return 1;						    \
      84    }							    \
      85    return 0;						    \
      86  }
      87  
      88  /* unsigned inputs  */
      89  #define U_BUILD_TEST(type, size, lanes)			    \
      90  int __attribute__((noipa,noinline))			    \
      91  run_test##type##size##x##lanes (uint##size##_t* test_set,   \
      92  				uint##size##_t* answ_set,   \
      93  				int reg_len, int data_len,  \
      94  				int n)	                    \
      95  {							    \
      96    int i;						    \
      97    INHIB_OPTIMIZATION;					    \
      98    uint##size##x##lanes##_t a = vld1##type##size (test_set); \
      99    uint##size##x##lanes##_t b = vld1##type##size (answ_set); \
     100    a = vclz##type##size (a);				    \
     101    for (i = 0; i < n; i++){				    \
     102      if (a [i] != b [i])					    \
     103        return 1;						    \
     104    }							    \
     105    return 0;						    \
     106  }
     107  
     108  BUILD_TEST (_s, 8, 8)
     109  BUILD_TEST (_s, 16, 4)
     110  BUILD_TEST (_s, 32, 2)
     111  BUILD_TEST (q_s, 8, 16)
     112  BUILD_TEST (q_s, 16, 8)
     113  BUILD_TEST (q_s, 32, 4)
     114  
     115  U_BUILD_TEST (_u, 8, 8)
     116  U_BUILD_TEST (_u, 16, 4)
     117  U_BUILD_TEST (_u, 32, 2)
     118  U_BUILD_TEST (q_u, 8, 16)
     119  U_BUILD_TEST (q_u, 16, 8)
     120  U_BUILD_TEST (q_u, 32, 4)
     121  
     122  int __attribute__ ((noinline))
     123  test_vclz_s8 ()
     124  {
     125    int8_t test_set0[8] = {
     126      TEST0, TEST1, TEST2, TEST3,
     127      TEST4, TEST5, TEST6, TEST7
     128    };
     129    int8_t test_set1[8] = {
     130      TEST8, TEST8, TEST8, TEST8,
     131      TEST8, TEST8, TEST8, TEST8
     132    };
     133    int8_t answ_set0[8] = {
     134      8, 7, 6, 5,
     135      4, 3, 2, 1
     136    };
     137    int8_t answ_set1[8] = {
     138      0, 0, 0, 0,
     139      0, 0, 0, 0
     140    };
     141    int o1 = run_test_s8x8 (test_set0, answ_set0, 64, 8, 8);
     142    int o2 = run_test_s8x8 (test_set1, answ_set1, 64, 8, 1);
     143  
     144    return o1||o2;
     145  }
     146  
     147  /* Double scan-assembler-times to take account of unsigned functions.  */
     148  /* { dg-final { scan-assembler-times "clz\\tv\[0-9\]+\.8b, v\[0-9\]+\.8b" 2 } } */
     149  
     150  int __attribute__ ((noinline))
     151  test_vclz_s16 ()
     152  {
     153    int16_t test_set0[4] = { TEST0, TEST1, TEST2, TEST3 };
     154    int16_t test_set1[4] = { TEST4, TEST5, TEST6, TEST7 };
     155    int16_t test_set2[4] = { TEST8, TEST9, TEST10, TEST11 };
     156    int16_t test_set3[4] = { TEST12, TEST13, TEST14, TEST15 };
     157    int16_t test_set4[4] = { TEST16, TEST16, TEST16, TEST16 };
     158  
     159    int16_t answ_set0[4] = { 16, 15, 14, 13 };
     160    int16_t answ_set1[4] = { 12, 11, 10, 9 };
     161    int16_t answ_set2[4] = { 8, 7, 6, 5 };
     162    int16_t answ_set3[4] = { 4, 3, 2, 1 };
     163    int16_t answ_set4[4] = { 0, 0, 0, 0 };
     164  
     165    int o1 = run_test_s16x4 (test_set0, answ_set0, 64, 16, 4);
     166    int o2 = run_test_s16x4 (test_set1, answ_set1, 64, 16, 4);
     167    int o3 = run_test_s16x4 (test_set2, answ_set2, 64, 16, 4);
     168    int o4 = run_test_s16x4 (test_set3, answ_set3, 64, 16, 4);
     169    int o5 = run_test_s16x4 (test_set4, answ_set4, 64, 16, 1);
     170  
     171    return o1||o2||o3||o4||o5;
     172  }
     173  
     174  /* Double scan-assembler-times to take account of unsigned functions.  */
     175  /* { dg-final { scan-assembler-times "clz\\tv\[0-9\]+\.4h, v\[0-9\]+\.4h" 2} } */
     176  
     177  int __attribute__ ((noinline))
     178  test_vclz_s32 ()
     179  {
     180    int32_t test_set0[2] = { TEST0, TEST1 };
     181    int32_t test_set1[2] = { TEST2, TEST3 };
     182    int32_t test_set2[2] = { TEST4, TEST5 };
     183    int32_t test_set3[2] = { TEST6, TEST7 };
     184    int32_t test_set4[2] = { TEST8, TEST9 };
     185    int32_t test_set5[2] = { TEST10, TEST11 };
     186    int32_t test_set6[2] = { TEST12, TEST13 };
     187    int32_t test_set7[2] = { TEST14, TEST15 };
     188    int32_t test_set8[2] = { TEST16, TEST17 };
     189    int32_t test_set9[2] = { TEST18, TEST19 };
     190    int32_t test_set10[2] = { TEST20, TEST21 };
     191    int32_t test_set11[2] = { TEST22, TEST23 };
     192    int32_t test_set12[2] = { TEST24, TEST25 };
     193    int32_t test_set13[2] = { TEST26, TEST27 };
     194    int32_t test_set14[2] = { TEST28, TEST29 };
     195    int32_t test_set15[2] = { TEST30, TEST31 };
     196    int32_t test_set16[2] = { TEST32, TEST32 };
     197  
     198    int32_t answ_set0[2] = { 32, 31 };
     199    int32_t answ_set1[2] = { 30, 29 };
     200    int32_t answ_set2[2] = { 28, 27 };
     201    int32_t answ_set3[2] = { 26, 25 };
     202    int32_t answ_set4[2] = { 24, 23 };
     203    int32_t answ_set5[2] = { 22, 21 };
     204    int32_t answ_set6[2] = { 20, 19 };
     205    int32_t answ_set7[2] = { 18, 17 };
     206    int32_t answ_set8[2] = { 16, 15 };
     207    int32_t answ_set9[2] = { 14, 13 };
     208    int32_t answ_set10[2] = { 12, 11 };
     209    int32_t answ_set11[2] = { 10, 9 };
     210    int32_t answ_set12[2] = { 8, 7 };
     211    int32_t answ_set13[2] = { 6, 5 };
     212    int32_t answ_set14[2] = { 4, 3 };
     213    int32_t answ_set15[2] = { 2, 1 };
     214    int32_t answ_set16[2] = { 0, 0 };
     215  
     216    int o1 = run_test_s32x2 (test_set0, answ_set0, 64, 32, 2);
     217    int o2 = run_test_s32x2 (test_set1, answ_set1, 64, 32, 2);
     218    int o3 = run_test_s32x2 (test_set2, answ_set2, 64, 32, 2);
     219    int o4 = run_test_s32x2 (test_set3, answ_set3, 64, 32, 2);
     220    int o5 = run_test_s32x2 (test_set4, answ_set4, 64, 32, 2);
     221    int o6 = run_test_s32x2 (test_set5, answ_set5, 64, 32, 2);
     222    int o7 = run_test_s32x2 (test_set6, answ_set6, 64, 32, 2);
     223    int o8 = run_test_s32x2 (test_set7, answ_set7, 64, 32, 2);
     224    int o9 = run_test_s32x2 (test_set8, answ_set8, 64, 32, 2);
     225    int o10 = run_test_s32x2 (test_set9, answ_set9, 64, 32, 2);
     226    int o11 = run_test_s32x2 (test_set10, answ_set10, 64, 32, 2);
     227    int o12 = run_test_s32x2 (test_set11, answ_set11, 64, 32, 2);
     228    int o13 = run_test_s32x2 (test_set12, answ_set12, 64, 32, 2);
     229    int o14 = run_test_s32x2 (test_set13, answ_set13, 64, 32, 2);
     230    int o15 = run_test_s32x2 (test_set14, answ_set14, 64, 32, 2);
     231    int o16 = run_test_s32x2 (test_set15, answ_set15, 64, 32, 2);
     232    int o17 = run_test_s32x2 (test_set16, answ_set16, 64, 32, 1);
     233  
     234    return o1||o2||o3||o4||o5||o6||o7||o8||o9||o10||o11||o12||o13||o14
     235      ||o15||o16||o17;
     236  }
     237  
     238  /* Double scan-assembler-times to take account of unsigned functions.  */
     239  /* { dg-final { scan-assembler-times "clz\\tv\[0-9\]+\.2s, v\[0-9\]+\.2s"  2 } } */
     240  
     241  int __attribute__ ((noinline))
     242  test_vclzq_s8 ()
     243  {
     244    int8_t test_set0[16] = {
     245      TEST0, TEST1, TEST2, TEST3, TEST4, TEST5, TEST6, TEST7,
     246      TEST8, TEST8, TEST8, TEST8, TEST8, TEST8, TEST8, TEST8
     247    };
     248    int8_t answ_set0[16] = {
     249      8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0
     250    };
     251    int o1 = run_testq_s8x16 (test_set0, answ_set0, 128, 8, 9);
     252    return o1;
     253  }
     254  
     255  /* Double scan-assembler-times to take account of unsigned functions.  */
     256  /* { dg-final { scan-assembler-times "clz\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b" 2 } } */
     257  
     258  int __attribute__ ((noinline))
     259  test_vclzq_s16 ()
     260  {
     261    int16_t test_set0[8] = {
     262      TEST0, TEST1, TEST2, TEST3, TEST4, TEST5, TEST6, TEST7
     263    };
     264    int16_t test_set1[8] = {
     265      TEST8, TEST9, TEST10, TEST11, TEST12, TEST13, TEST14, TEST15
     266    };
     267    int16_t test_set2[8] = {
     268      TEST16, TEST16, TEST16, TEST16, TEST16, TEST16, TEST16, TEST16
     269    };
     270  
     271    int16_t answ_set0[8] = {
     272      16, 15, 14, 13, 12, 11, 10, 9
     273    };
     274    int16_t answ_set1[8] = {
     275      8, 7, 6, 5, 4, 3, 2, 1
     276    };
     277    int16_t answ_set2[8] = {
     278      0, 0, 0, 0, 0, 0, 0, 0
     279    };
     280    int o1 = run_testq_s16x8 (test_set0, answ_set0, 128, 16, 8);
     281    int o2 = run_testq_s16x8 (test_set1, answ_set1, 128, 16, 8);
     282    int o3 = run_testq_s16x8 (test_set2, answ_set2, 128, 16, 1);
     283  
     284    return o1||o2||o3;
     285  }
     286  
     287  /* Double scan-assembler-times to take account of unsigned functions.  */
     288  /* { dg-final { scan-assembler-times "clz\\tv\[0-9\]+\.8h, v\[0-9\]+\.8h" 2 } } */
     289  
     290  int __attribute__ ((noinline))
     291  test_vclzq_s32 ()
     292  {
     293    int32_t test_set0[4] = { TEST0, TEST1, TEST2, TEST3 };
     294    int32_t test_set1[4] = { TEST4, TEST5, TEST6, TEST7 };
     295    int32_t test_set2[4] = { TEST8, TEST9, TEST10, TEST11 };
     296    int32_t test_set3[4] = { TEST12, TEST13, TEST14, TEST15 };
     297    int32_t test_set4[4] = { TEST16, TEST17, TEST18, TEST19 };
     298    int32_t test_set5[4] = { TEST20, TEST21, TEST22, TEST23 };
     299    int32_t test_set6[4] = { TEST24, TEST25, TEST26, TEST27 };
     300    int32_t test_set7[4] = { TEST28, TEST29, TEST30, TEST31 };
     301    int32_t test_set8[4] = { TEST32, TEST32, TEST32, TEST32 };
     302  
     303    int32_t answ_set0[4] = { 32, 31, 30, 29 };
     304    int32_t answ_set1[4] = { 28, 27, 26, 25 };
     305    int32_t answ_set2[4] = { 24, 23, 22, 21 };
     306    int32_t answ_set3[4] = { 20, 19, 18, 17 };
     307    int32_t answ_set4[4] = { 16, 15, 14, 13 };
     308    int32_t answ_set5[4] = { 12, 11, 10, 9 };
     309    int32_t answ_set6[4] = { 8, 7, 6, 5 };
     310    int32_t answ_set7[4] = { 4, 3, 2, 1 };
     311    int32_t answ_set8[4] = { 0, 0, 0, 0 };
     312  
     313    int o1 = run_testq_s32x4 (test_set0, answ_set0, 128, 32, 4);
     314    int o2 = run_testq_s32x4 (test_set1, answ_set1, 128, 32, 4);
     315    int o3 = run_testq_s32x4 (test_set2, answ_set2, 128, 32, 4);
     316    int o4 = run_testq_s32x4 (test_set3, answ_set3, 128, 32, 4);
     317    int o5 = run_testq_s32x4 (test_set4, answ_set4, 128, 32, 1);
     318  
     319    return o1||o2||o3||o4||o5;
     320  }
     321  
     322  /* Double scan-assembler-times to take account of unsigned functions.  */
     323  /* { dg-final { scan-assembler-times "clz\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s" 2 } } */
     324  
     325  /* Unsigned versions.  */
     326  
     327  int __attribute__ ((noinline))
     328  test_vclz_u8 ()
     329  {
     330    uint8_t test_set0[8] = {
     331      TEST0, TEST1, TEST2, TEST3, TEST4, TEST5, TEST6, TEST7
     332    };
     333    uint8_t test_set1[8] = {
     334      TEST8, TEST8, TEST8, TEST8, TEST8, TEST8, TEST8, TEST8
     335    };
     336    uint8_t answ_set0[8] = {
     337      8, 7, 6, 5, 4, 3, 2, 1
     338    };
     339    uint8_t answ_set1[8] = {
     340      0, 0, 0, 0, 0, 0, 0, 0
     341    };
     342  
     343    int o1 = run_test_u8x8 (test_set0, answ_set0, 64, 8, 8);
     344    int o2 = run_test_u8x8 (test_set1, answ_set1, 64, 8, 1);
     345  
     346    return o1||o2;
     347  }
     348  
     349  /* ASM scan near test for signed version.  */
     350  
     351  int __attribute__ ((noinline))
     352  test_vclz_u16 ()
     353  {
     354    uint16_t test_set0[4] = { TEST0, TEST1, TEST2, TEST3 };
     355    uint16_t test_set1[4] = { TEST4, TEST5, TEST6, TEST7 };
     356    uint16_t test_set2[4] = { TEST8, TEST9, TEST10, TEST11 };
     357    uint16_t test_set3[4] = { TEST12, TEST13, TEST14, TEST15 };
     358    uint16_t test_set4[4] = { TEST16, TEST16, TEST16, TEST16 };
     359  
     360    uint16_t answ_set0[4] = { 16, 15, 14, 13 };
     361    uint16_t answ_set1[4] = { 12, 11, 10, 9 };
     362    uint16_t answ_set2[4] = { 8, 7, 6, 5 };
     363    uint16_t answ_set3[4] = { 4, 3, 2, 1 };
     364    uint16_t answ_set4[4] = { 0, 0, 0, 0 };
     365  
     366    int o1 = run_test_u16x4 (test_set0, answ_set0, 64, 16, 4);
     367    int o2 = run_test_u16x4 (test_set1, answ_set1, 64, 16, 4);
     368    int o3 = run_test_u16x4 (test_set2, answ_set2, 64, 16, 4);
     369    int o4 = run_test_u16x4 (test_set3, answ_set3, 64, 16, 4);
     370    int o5 = run_test_u16x4 (test_set4, answ_set4, 64, 16, 1);
     371  
     372    return o1||o2||o3||o4||o5;
     373  }
     374  
     375  /* ASM scan near test for signed version.  */
     376  
     377  int __attribute__ ((noinline))
     378  test_vclz_u32 ()
     379  {
     380    uint32_t test_set0[2] = { TEST0, TEST1 };
     381    uint32_t test_set1[2] = { TEST2, TEST3 };
     382    uint32_t test_set2[2] = { TEST4, TEST5 };
     383    uint32_t test_set3[2] = { TEST6, TEST7 };
     384    uint32_t test_set4[2] = { TEST8, TEST9 };
     385    uint32_t test_set5[2] = { TEST10, TEST11 };
     386    uint32_t test_set6[2] = { TEST12, TEST13 };
     387    uint32_t test_set7[2] = { TEST14, TEST15 };
     388    uint32_t test_set8[2] = { TEST16, TEST17 };
     389    uint32_t test_set9[2] = { TEST18, TEST19 };
     390    uint32_t test_set10[2] = { TEST20, TEST21 };
     391    uint32_t test_set11[2] = { TEST22, TEST23 };
     392    uint32_t test_set12[2] = { TEST24, TEST25 };
     393    uint32_t test_set13[2] = { TEST26, TEST27 };
     394    uint32_t test_set14[2] = { TEST28, TEST29 };
     395    uint32_t test_set15[2] = { TEST30, TEST31 };
     396    uint32_t test_set16[2] = { TEST32, TEST32 };
     397  
     398    uint32_t answ_set0[2] = { 32, 31 };
     399    uint32_t answ_set1[2] = { 30, 29 };
     400    uint32_t answ_set2[2] = { 28, 27 };
     401    uint32_t answ_set3[2] = { 26, 25 };
     402    uint32_t answ_set4[2] = { 24, 23 };
     403    uint32_t answ_set5[2] = { 22, 21 };
     404    uint32_t answ_set6[2] = { 20, 19 };
     405    uint32_t answ_set7[2] = { 18, 17 };
     406    uint32_t answ_set8[2] = { 16, 15 };
     407    uint32_t answ_set9[2] = { 14, 13 };
     408    uint32_t answ_set10[2] = { 12, 11 };
     409    uint32_t answ_set11[2] = { 10, 9 };
     410    uint32_t answ_set12[2] = { 8, 7 };
     411    uint32_t answ_set13[2] = { 6, 5 };
     412    uint32_t answ_set14[2] = { 4, 3 };
     413    uint32_t answ_set15[2] = { 2, 1 };
     414    uint32_t answ_set16[2] = { 0, 0 };
     415  
     416    int o1 = run_test_u32x2 (test_set0, answ_set0, 64, 32, 2);
     417    int o2 = run_test_u32x2 (test_set1, answ_set1, 64, 32, 2);
     418    int o3 = run_test_u32x2 (test_set2, answ_set2, 64, 32, 2);
     419    int o4 = run_test_u32x2 (test_set3, answ_set3, 64, 32, 2);
     420    int o5 = run_test_u32x2 (test_set4, answ_set4, 64, 32, 2);
     421    int o6 = run_test_u32x2 (test_set5, answ_set5, 64, 32, 2);
     422    int o7 = run_test_u32x2 (test_set6, answ_set6, 64, 32, 2);
     423    int o8 = run_test_u32x2 (test_set7, answ_set7, 64, 32, 2);
     424    int o9 = run_test_u32x2 (test_set8, answ_set8, 64, 32, 2);
     425    int o10 = run_test_u32x2 (test_set9, answ_set9, 64, 32, 2);
     426    int o11 = run_test_u32x2 (test_set10, answ_set10, 64, 32, 2);
     427    int o12 = run_test_u32x2 (test_set11, answ_set11, 64, 32, 2);
     428    int o13 = run_test_u32x2 (test_set12, answ_set12, 64, 32, 2);
     429    int o14 = run_test_u32x2 (test_set13, answ_set13, 64, 32, 2);
     430    int o15 = run_test_u32x2 (test_set14, answ_set14, 64, 32, 2);
     431    int o16 = run_test_u32x2 (test_set15, answ_set15, 64, 32, 2);
     432    int o17 = run_test_u32x2 (test_set16, answ_set16, 64, 32, 1);
     433  
     434    return o1||o2||o3||o4||o5||o6||o7||o8||o9||o10||o11||o12||o13||o14
     435          ||o15||o16||o17;
     436  }
     437  
     438  /* ASM scan near test for signed version.  */
     439  
     440  int __attribute__ ((noinline))
     441  test_vclzq_u8 ()
     442  {
     443    int i;
     444    uint8x16_t a;
     445    uint8x16_t b;
     446  
     447    uint8_t test_set0[16] = {
     448      TEST0, TEST1, TEST2, TEST3, TEST4, TEST5, TEST6, TEST7,
     449      TEST8, TEST8, TEST8, TEST8, TEST8, TEST8, TEST8, TEST8
     450    };
     451    uint8_t answ_set0[16] = {
     452      8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0
     453    };
     454    int o1 = run_testq_u8x16 (test_set0, answ_set0, 128, 8, 9);
     455  
     456    return o1;
     457  }
     458  
     459  /* ASM scan near test for signed version.  */
     460  
     461  int __attribute__ ((noinline))
     462  test_vclzq_u16 ()
     463  {
     464    int i;
     465    uint16x8_t a;
     466    uint16x8_t b;
     467  
     468    uint16_t test_set0[8] = {
     469      TEST0, TEST1, TEST2, TEST3, TEST4, TEST5, TEST6, TEST7
     470    };
     471    uint16_t test_set1[8] = {
     472      TEST8, TEST9, TEST10, TEST11, TEST12, TEST13, TEST14, TEST15
     473    };
     474    uint16_t test_set2[8] = {
     475      TEST16, TEST16, TEST16, TEST16, TEST16, TEST16, TEST16, TEST16
     476    };
     477  
     478    uint16_t answ_set0[8] = {
     479      16, 15, 14, 13, 12, 11, 10, 9
     480    };
     481  
     482    uint16_t answ_set1[8] = {
     483      8, 7, 6, 5, 4, 3, 2, 1
     484    };
     485    uint16_t answ_set2[8] = {
     486      0, 0, 0, 0, 0, 0, 0, 0
     487    };
     488  
     489    int o1 = run_testq_u16x8 (test_set0, answ_set0, 128, 16, 8);
     490    int o2 = run_testq_u16x8 (test_set1, answ_set1, 128, 16, 8);
     491    int o3 = run_testq_u16x8 (test_set2, answ_set2, 128, 16, 1);
     492  
     493    return o1||o2||o3;
     494  }
     495  
     496  /* ASM scan near test for signed version.  */
     497  
     498  int __attribute__ ((noinline))
     499  test_vclzq_u32 ()
     500  {
     501    uint32_t test_set0[4] = { TEST0, TEST1, TEST2, TEST3 };
     502    uint32_t test_set1[4] = { TEST4, TEST5, TEST6, TEST7 };
     503    uint32_t test_set2[4] = { TEST8, TEST9, TEST10, TEST11 };
     504    uint32_t test_set3[4] = { TEST12, TEST13, TEST14, TEST15 };
     505    uint32_t test_set4[4] = { TEST16, TEST17, TEST18, TEST19 };
     506    uint32_t test_set5[4] = { TEST20, TEST21, TEST22, TEST23 };
     507    uint32_t test_set6[4] = { TEST24, TEST25, TEST26, TEST27 };
     508    uint32_t test_set7[4] = { TEST28, TEST29, TEST30, TEST31 };
     509    uint32_t test_set8[4] = { TEST32, TEST32, TEST32, TEST32 };
     510  
     511    uint32_t answ_set0[4] = { 32, 31, 30, 29 };
     512    uint32_t answ_set1[4] = { 28, 27, 26, 25 };
     513    uint32_t answ_set2[4] = { 24, 23, 22, 21 };
     514    uint32_t answ_set3[4] = { 20, 19, 18, 17 };
     515    uint32_t answ_set4[4] = { 16, 15, 14, 13 };
     516    uint32_t answ_set5[4] = { 12, 11, 10, 9 };
     517    uint32_t answ_set6[4] = { 8, 7, 6, 5 };
     518    uint32_t answ_set7[4] = { 4, 3, 2, 1 };
     519    uint32_t answ_set8[4] = { 0, 0, 0, 0 };
     520  
     521    int o1 = run_testq_u32x4 (test_set0, answ_set0, 128, 32, 4);
     522    int o2 = run_testq_u32x4 (test_set1, answ_set1, 128, 32, 4);
     523    int o3 = run_testq_u32x4 (test_set2, answ_set2, 128, 32, 4);
     524    int o4 = run_testq_u32x4 (test_set3, answ_set3, 128, 32, 4);
     525    int o5 = run_testq_u32x4 (test_set4, answ_set4, 128, 32, 1);
     526  
     527    return o1||o2||o3||o4||o5;
     528  }
     529  
     530  /* ASM scan near test for signed version.  */
     531  
     532  int
     533  main (int argc, char **argv)
     534  {
     535  
     536    if (test_vclz_s8 ())
     537      abort ();
     538  
     539    if (test_vclz_s16 ())
     540      abort ();
     541  
     542    if (test_vclz_s32 ())
     543      abort ();
     544  
     545    if (test_vclzq_s8 ())
     546      abort ();
     547  
     548    if (test_vclzq_s16 ())
     549      abort ();
     550  
     551    if (test_vclzq_s32 ())
     552      abort ();
     553  
     554    if (test_vclz_u8 ())
     555      abort ();
     556  
     557    if (test_vclz_u16 ())
     558      abort ();
     559  
     560    if (test_vclz_u32 ())
     561      abort ();
     562  
     563    if (test_vclzq_u8 ())
     564      abort ();
     565  
     566    if (test_vclzq_u16 ())
     567      abort ();
     568  
     569    if (test_vclzq_u32 ())
     570      abort ();
     571  
     572    return 0;
     573  }
     574