summary refs log tree commit diff
diff options
context:
space:
mode:
authorNguyễn Gia Phong <cnx@loang.net>2024-02-29 23:24:33 +0900
committerNguyễn Gia Phong <cnx@loang.net>2024-03-01 01:55:07 +0900
commit0711a8360c18ac45756ae773a1c0e326f6de4789 (patch)
tree38d69217cf2dfbd27b0b35a6ccbec0708795e403
parent2d683e0c53907ebca9abde876dd87af70719e42d (diff)
downloadroux-0711a8360c18ac45756ae773a1c0e326f6de4789.tar.gz
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.
-rw-r--r--test/fpcnv.ssa15
1 files changed, 10 insertions, 5 deletions
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 <float.h>
 # #include <limits.h>
 # 
 # extern float fneg(float);
@@ -113,15 +114,19 @@ function l $dtol(d %f) {
 # 			return 7;
 # 	}
 # 	for (i=0; i<sizeof(fin)/sizeof(fin[0]); i++) {
-# 		if (stol((float)fin[i]) != (unsigned long long)(float)fin[i])
-# 			return 8;
+# 		if (fin[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;