From 0711a8360c18ac45756ae773a1c0e326f6de4789 Mon Sep 17 00:00:00 2001 From: Nguyễn Gia Phong Date: Thu, 29 Feb 2024 23:24:33 +0900 Subject: test/fpcnv: skip comparing inexactly converted int In C, if a floating point cannot be represented exactly as an integer, conversion from the former to the latter is implementation-defined. Therefore, it can be flaky to test this against QBE-defined behavior. This was discovered from (unsigned int) 4294967295.0f being an UB, because (uint64_t) 4294967295.0f is 4294967296 > UINT_MAX on amd64 when compiled by either gcc or clang. --- test/fpcnv.ssa | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'test') diff --git a/test/fpcnv.ssa b/test/fpcnv.ssa index 3466ed2..3fe078f 100644 --- a/test/fpcnv.ssa +++ b/test/fpcnv.ssa @@ -72,6 +72,7 @@ function l $dtol(d %f) { # >>> driver +# #include # #include # # extern float fneg(float); @@ -113,15 +114,19 @@ function l $dtol(d %f) { # return 7; # } # for (i=0; i= 1LL << DBL_MANT_DIG) +# break; # if (dtol(fin[i]) != (unsigned long long)fin[i]) -# return 9; +# return 8; # if((unsigned long long)fin[i] > UINT_MAX) # continue; -# if (stow((float)fin[i]) != (unsigned int)(float)fin[i]) -# return 10; # if (dtow(fin[i]) != (unsigned int)fin[i]) +# return 9; +# if (fin[i] >= 1LL << FLT_MANT_DIG) +# continue; +# if (stol((float)fin[i]) != (unsigned long long)(float)fin[i]) +# return 10; +# if (stow((float)fin[i]) != (unsigned int)(float)fin[i]) # return 11; # } # return 0; -- cgit 1.4.1