1  /* Executable testcase for 'output flags.'  */
       2  /* { dg-do run } */
       3  /* { dg-skip-if "" { arm_thumb1 } } */
       4  
       5  int test_bits (long nzcv)
       6  {
       7    long n, z, c, v;
       8  
       9    __asm__ ("msr APSR_nzcvq, %[in]"
      10  	   : "=@ccmi"(n), "=@cceq"(z), "=@cccs"(c), "=@ccvs"(v)
      11  	   : [in] "r"(nzcv << 28));
      12  
      13    return n * 8 + z * 4 + c * 2 + v == nzcv;
      14  }
      15  	
      16  int test_cmps (long x, long y)
      17  {
      18    long gt, lt, ge, le;
      19  
      20    __asm__ ("cmp %[x], %[y]"
      21  	   : "=@ccgt"(gt), "=@cclt"(lt), "=@ccge"(ge), "=@ccle"(le)
      22  	   : [x] "r"(x), [y] "r"(y));
      23  
      24    return (gt == (x > y)
      25  	  && lt == (x < y)
      26  	  && ge == (x >= y)
      27  	  && le == (x <= y));
      28  }
      29  
      30  int test_cmpu (unsigned long x, unsigned long y)
      31  {
      32    long gt, lt, ge, le;
      33  
      34    __asm__ ("cmp %[x], %[y]"
      35  	   : "=@cchi"(gt), "=@cclo"(lt), "=@cchs"(ge), "=@ccls"(le)
      36  	   : [x] "r"(x), [y] "r"(y));
      37  
      38    return (gt == (x > y)
      39  	  && lt == (x < y)
      40  	  && ge == (x >= y)
      41  	  && le == (x <= y));
      42  }
      43  
      44  int main ()
      45  {
      46    long i, j;
      47  
      48    for (i = 0; i < 16; ++i)
      49      if (!test_bits (i))
      50        __builtin_abort ();
      51  
      52    for (i = -1; i <= 1; ++i)
      53      for (j = -1; j <= 1; ++j)
      54        if (!test_cmps (i, j))
      55          __builtin_abort ();
      56  
      57    for (i = 0; i <= 2; ++i)
      58      for (j = 0; j <= 2; ++j)
      59        if (!test_cmpu (i, j))
      60          __builtin_abort ();
      61  
      62    return 0;
      63  }