blob: 5f2ff81a477339ba51a0b58d952f8f41d6ef4fc7 [file] [log] [blame]
/* { dg-do run } */
/* { dg-options "-save-temps -fno-inline -O1" } */
#define FCVTDEF(ftype,itype) \
void \
cvt_##itype##_to_##ftype (itype a, ftype b)\
{\
ftype c;\
c = (ftype) a;\
if ( (c - b) > 0.00001) abort();\
}
#define force_simd_for_float(v) asm volatile ("mov %s0, %1.s[0]" :"=w" (v) :"w" (v) :)
#define force_simd_for_double(v) asm volatile ("mov %d0, %1.d[0]" :"=w" (v) :"w" (v) :)
#define FCVTDEF_SISD(ftype,itype) \
void \
cvt_##itype##_to_##ftype##_sisd (itype a, ftype b)\
{\
ftype c;\
force_simd_for_##ftype(a);\
c = (ftype) a;\
if ( (c - b) > 0.00001) abort();\
}
#define FCVT(ftype,itype,ival,fval) cvt_##itype##_to_##ftype (ival, fval);
#define FCVT_SISD(ftype,itype,ival,fval) cvt_##itype##_to_##ftype##_sisd (ival, fval);
typedef int int32_t;
typedef unsigned int uint32_t;
typedef long long int int64_t;
typedef unsigned long long int uint64_t;
extern void abort();
FCVTDEF (float, int32_t)
/* { dg-final { scan-assembler "scvtf\ts\[0-9\]+,\ w\[0-9\]+" } } */
FCVTDEF (float, uint32_t)
/* { dg-final { scan-assembler "ucvtf\ts\[0-9\]+,\ w\[0-9\]+" } } */
FCVTDEF (double, int32_t)
/* "scvtf\td\[0-9\]+,\ w\[0-9\]+" */
FCVTDEF (double, uint32_t)
/* "ucvtf\td\[0-9\]+,\ w\[0-9\]+" */
FCVTDEF (float, int64_t)
/* "scvtf\ts\[0-9\]+,\ x\[0-9\]+" */
FCVTDEF (float, uint64_t)
/* "ucvtf\ts\[0-9\]+,\ x\[0-9\]+" */
FCVTDEF (double, int64_t)
/* { dg-final { scan-assembler "scvtf\td\[0-9\]+,\ x\[0-9\]+" } } */
FCVTDEF (double, uint64_t)
/* { dg-final { scan-assembler "ucvtf\td\[0-9\]+,\ x\[0-9\]+" } } */
FCVTDEF_SISD (float, int32_t)
/* { dg-final { scan-assembler "scvtf\ts\[0-9\]+,\ s\[0-9\]+" } } */
FCVTDEF_SISD (double, int64_t)
/* { dg-final { scan-assembler "scvtf\td\[0-9\]+,\ d\[0-9\]+" } } */
FCVTDEF_SISD (float, uint32_t)
/* { dg-final { scan-assembler "ucvtf\ts\[0-9\]+,\ s\[0-9\]+" } } */
FCVTDEF_SISD (double, uint64_t)
/* { dg-final { scan-assembler "ucvtf\td\[0-9\]+,\ d\[0-9\]+" } } */
FCVTDEF_SISD (float, int64_t)
/* { dg-final { scan-assembler-times "scvtf\ts\[0-9\]+,\ x\[0-9\]+" 2 } } */
FCVTDEF_SISD (float, uint64_t)
/* { dg-final { scan-assembler-times "ucvtf\ts\[0-9\]+,\ x\[0-9\]+" 2 } } */
FCVTDEF_SISD (double, int32_t)
/* { dg-final { scan-assembler-times "scvtf\td\[0-9\]+,\ w\[0-9\]+" 2 } } */
FCVTDEF_SISD (double, uint32_t)
/* { dg-final { scan-assembler-times "ucvtf\td\[0-9\]+,\ w\[0-9\]+" 2 } } */
int32_t ival = -1234;
int64_t llival = -13031303L;
uint32_t uival = 1234;
uint64_t ullival = 13031303L;
int main ()
{
float x;
double y;
FCVT (float, int32_t, ival, -1234.0);
FCVT (float, uint32_t, uival, 1234.0);
FCVT (float, int64_t, llival, -13031303.0);
FCVT (float, uint64_t, ullival, 13031303.0);
FCVT (double, int32_t, ival, -1234.0);
FCVT (double, uint32_t, uival, 1234.0);
FCVT (double, int64_t, llival, -13031303.0);
FCVT (double, uint64_t, ullival, 13031303.0);
FCVT_SISD (float, int32_t, ival, -1234.0);
FCVT_SISD (double, int64_t, llival, -13031303.0);
FCVT_SISD (float, uint32_t, uival, 1234.0);
FCVT_SISD (double, uint64_t, ullival, 13031303.0);
return 0;
}