(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
aarch64/
cvtf_1.c
       1  /* { dg-do run } */
       2  /* { dg-options "-save-temps -fno-inline -O1" } */
       3  
       4  #define FCVTDEF(ftype,itype) \
       5  void \
       6  cvt_##itype##_to_##ftype (itype a, ftype b)\
       7  {\
       8    ftype c;\
       9    c = (ftype) a;\
      10    if ( (c - b) > 0.00001) abort();\
      11  }
      12  
      13  #define force_simd_for_float(v) asm volatile ("mov %s0, %1.s[0]" :"=w" (v) :"w" (v) :)
      14  #define force_simd_for_double(v) asm volatile ("mov %d0, %1.d[0]" :"=w" (v) :"w" (v) :)
      15  
      16  #define FCVTDEF_SISD(ftype,itype) \
      17  void \
      18  cvt_##itype##_to_##ftype##_sisd (itype a, ftype b)\
      19  {\
      20    ftype c;\
      21    force_simd_for_##ftype(a);\
      22    c = (ftype) a;\
      23    if ( (c - b) > 0.00001) abort();\
      24  }
      25  
      26  #define FCVT(ftype,itype,ival,fval) cvt_##itype##_to_##ftype (ival, fval);
      27  #define FCVT_SISD(ftype,itype,ival,fval) cvt_##itype##_to_##ftype##_sisd (ival, fval);
      28  
      29  typedef int int32_t;
      30  typedef unsigned int uint32_t;
      31  typedef long long int int64_t;
      32  typedef unsigned long long int uint64_t;
      33  
      34  extern void abort();
      35  
      36  FCVTDEF (float, int32_t)
      37  /* { dg-final { scan-assembler "scvtf\ts\[0-9\]+,\ w\[0-9\]+" } } */
      38  FCVTDEF (float, uint32_t)
      39  /* { dg-final { scan-assembler "ucvtf\ts\[0-9\]+,\ w\[0-9\]+" } } */
      40  FCVTDEF (double, int32_t)
      41  /* "scvtf\td\[0-9\]+,\ w\[0-9\]+" */
      42  FCVTDEF (double, uint32_t)
      43  /* "ucvtf\td\[0-9\]+,\ w\[0-9\]+" */
      44  FCVTDEF (float, int64_t)
      45  /* "scvtf\ts\[0-9\]+,\ x\[0-9\]+" */
      46  FCVTDEF (float, uint64_t)
      47  /* "ucvtf\ts\[0-9\]+,\ x\[0-9\]+" */
      48  FCVTDEF (double, int64_t)
      49  /* { dg-final { scan-assembler "scvtf\td\[0-9\]+,\ x\[0-9\]+" } } */
      50  FCVTDEF (double, uint64_t)
      51  /* { dg-final { scan-assembler "ucvtf\td\[0-9\]+,\ x\[0-9\]+" } } */
      52  FCVTDEF_SISD (float, int32_t)
      53  /* { dg-final { scan-assembler "scvtf\ts\[0-9\]+,\ s\[0-9\]+" } } */
      54  FCVTDEF_SISD (double, int64_t)
      55  /* { dg-final { scan-assembler "scvtf\td\[0-9\]+,\ d\[0-9\]+" } } */
      56  FCVTDEF_SISD (float, uint32_t)
      57  /* { dg-final { scan-assembler "ucvtf\ts\[0-9\]+,\ s\[0-9\]+" } } */
      58  FCVTDEF_SISD (double, uint64_t)
      59  /* { dg-final { scan-assembler "ucvtf\td\[0-9\]+,\ d\[0-9\]+" } } */
      60  FCVTDEF_SISD (float, int64_t)
      61  /* { dg-final { scan-assembler-times "scvtf\ts\[0-9\]+,\ x\[0-9\]+" 2 } } */
      62  FCVTDEF_SISD (float, uint64_t)
      63  /* { dg-final { scan-assembler-times "ucvtf\ts\[0-9\]+,\ x\[0-9\]+" 2 } } */
      64  FCVTDEF_SISD (double, int32_t)
      65  /* { dg-final { scan-assembler-times "scvtf\td\[0-9\]+,\ w\[0-9\]+" 2 } } */
      66  FCVTDEF_SISD (double, uint32_t)
      67  /* { dg-final { scan-assembler-times "ucvtf\td\[0-9\]+,\ w\[0-9\]+" 2 } } */
      68  
      69  int32_t ival = -1234;
      70  int64_t llival = -13031303L;
      71  uint32_t uival = 1234;
      72  uint64_t ullival = 13031303L;
      73  
      74  int main ()
      75  {
      76    float x;
      77    double y;
      78  
      79    FCVT (float, int32_t, ival, -1234.0);
      80    FCVT (float, uint32_t, uival, 1234.0);
      81    FCVT (float, int64_t, llival, -13031303.0);
      82    FCVT (float, uint64_t, ullival, 13031303.0);
      83    FCVT (double, int32_t, ival, -1234.0);
      84    FCVT (double, uint32_t, uival, 1234.0);
      85    FCVT (double, int64_t, llival, -13031303.0);
      86    FCVT (double, uint64_t, ullival, 13031303.0);
      87    FCVT_SISD (float, int32_t, ival, -1234.0);
      88    FCVT_SISD (double, int64_t, llival, -13031303.0);
      89    FCVT_SISD (float, uint32_t, uival, 1234.0);
      90    FCVT_SISD (double, uint64_t, ullival, 13031303.0);
      91  
      92    return 0;
      93  }
      94