Skip to content

Commit 88ed8e5

Browse files
committed
More floating point tests! (#282)
* Test more floating-point almost-identities. * Convert several inexact floating-point literals to hexadecimal form. * Add a testcase based on LLVM PR27036. * Test for incorrect rounding on sqrt(4.0). * Test another notable x87 sqrt case. * Test 1/(1/x). * Test algebraic factoring reversal. * Test algebraic factoring. * Test plain and Kahan summation. * Test that negates are not folded away at the expense of negative zero. * Test that x + -x is not folded away. * Test that addition is not folded to multiplication with different rounding. * Test the reinterpret conversions with more special values. * Test demote(promote(x)). * Test reinterpret cast with -1. * Test an interesting division boundary case. * Test the minimum valid value for trunc_u conversions. * Test min and max with signaling NaNs. * Test the least value with a positive quotient with the maximum value. * Test the least value with a positive square. * Test the least value with a finite reciprocal. * Test that unaligned memory accesses don't canonicalize NaNs. * Test that (x/y)/z is not optimized to x/(y*z). * Test that (x/y)*(z/w) is not optimized to (x*z)/(y*w). * Test that (x/z)+(y/z) is not optimized to (x+y)/z. * Test that sqrt(x*x) is not optimized to abs(x). * Test that sqrt(x)*sqrt(y) is not optimized to sqrt(x*y). * Test that sqrt(x)/sqrt(y) is not optimized to sqrt(x/y). * Test that (x*sqrt(y))/y is not optimized to x/sqrt(y). * Fix spello. * Correct a function name to match the test.
1 parent ef4bbbc commit 88ed8e5

File tree

4 files changed

+635
-16
lines changed

4 files changed

+635
-16
lines changed

ml-proto/test/conversions.wast

Lines changed: 42 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,10 @@
107107
(assert_return (invoke "i32.trunc_s_f32" (f32.const 0x1p-149)) (i32.const 0))
108108
(assert_return (invoke "i32.trunc_s_f32" (f32.const -0x1p-149)) (i32.const 0))
109109
(assert_return (invoke "i32.trunc_s_f32" (f32.const 1.0)) (i32.const 1))
110-
(assert_return (invoke "i32.trunc_s_f32" (f32.const 1.1)) (i32.const 1))
110+
(assert_return (invoke "i32.trunc_s_f32" (f32.const 0x1.19999ap+0)) (i32.const 1))
111111
(assert_return (invoke "i32.trunc_s_f32" (f32.const 1.5)) (i32.const 1))
112112
(assert_return (invoke "i32.trunc_s_f32" (f32.const -1.0)) (i32.const -1))
113-
(assert_return (invoke "i32.trunc_s_f32" (f32.const -1.1)) (i32.const -1))
113+
(assert_return (invoke "i32.trunc_s_f32" (f32.const -0x1.19999ap+0)) (i32.const -1))
114114
(assert_return (invoke "i32.trunc_s_f32" (f32.const -1.5)) (i32.const -1))
115115
(assert_return (invoke "i32.trunc_s_f32" (f32.const -1.9)) (i32.const -1))
116116
(assert_return (invoke "i32.trunc_s_f32" (f32.const -2.0)) (i32.const -2))
@@ -127,13 +127,14 @@
127127
(assert_return (invoke "i32.trunc_u_f32" (f32.const 0x1p-149)) (i32.const 0))
128128
(assert_return (invoke "i32.trunc_u_f32" (f32.const -0x1p-149)) (i32.const 0))
129129
(assert_return (invoke "i32.trunc_u_f32" (f32.const 1.0)) (i32.const 1))
130-
(assert_return (invoke "i32.trunc_u_f32" (f32.const 1.1)) (i32.const 1))
130+
(assert_return (invoke "i32.trunc_u_f32" (f32.const 0x1.19999ap+0)) (i32.const 1))
131131
(assert_return (invoke "i32.trunc_u_f32" (f32.const 1.5)) (i32.const 1))
132132
(assert_return (invoke "i32.trunc_u_f32" (f32.const 1.9)) (i32.const 1))
133133
(assert_return (invoke "i32.trunc_u_f32" (f32.const 2.0)) (i32.const 2))
134134
(assert_return (invoke "i32.trunc_u_f32" (f32.const 2147483648)) (i32.const -2147483648)) ;; 0x1.00000p+31 -> 8000 0000
135135
(assert_return (invoke "i32.trunc_u_f32" (f32.const 4294967040.0)) (i32.const -256))
136-
(assert_return (invoke "i32.trunc_u_f32" (f32.const -0.9)) (i32.const 0))
136+
(assert_return (invoke "i32.trunc_u_f32" (f32.const -0x1.ccccccp-1)) (i32.const 0))
137+
(assert_return (invoke "i32.trunc_u_f32" (f32.const -0x1.fffffep-1)) (i32.const 0))
137138
(assert_trap (invoke "i32.trunc_u_f32" (f32.const 4294967296.0)) "integer overflow")
138139
(assert_trap (invoke "i32.trunc_u_f32" (f32.const -1.0)) "integer overflow")
139140
(assert_trap (invoke "i32.trunc_u_f32" (f32.const infinity)) "integer overflow")
@@ -145,10 +146,10 @@
145146
(assert_return (invoke "i32.trunc_s_f64" (f64.const 0x0.0000000000001p-1022)) (i32.const 0))
146147
(assert_return (invoke "i32.trunc_s_f64" (f64.const -0x0.0000000000001p-1022)) (i32.const 0))
147148
(assert_return (invoke "i32.trunc_s_f64" (f64.const 1.0)) (i32.const 1))
148-
(assert_return (invoke "i32.trunc_s_f64" (f64.const 1.1)) (i32.const 1))
149+
(assert_return (invoke "i32.trunc_s_f64" (f64.const 0x1.199999999999ap+0)) (i32.const 1))
149150
(assert_return (invoke "i32.trunc_s_f64" (f64.const 1.5)) (i32.const 1))
150151
(assert_return (invoke "i32.trunc_s_f64" (f64.const -1.0)) (i32.const -1))
151-
(assert_return (invoke "i32.trunc_s_f64" (f64.const -1.1)) (i32.const -1))
152+
(assert_return (invoke "i32.trunc_s_f64" (f64.const -0x1.199999999999ap+0)) (i32.const -1))
152153
(assert_return (invoke "i32.trunc_s_f64" (f64.const -1.5)) (i32.const -1))
153154
(assert_return (invoke "i32.trunc_s_f64" (f64.const -1.9)) (i32.const -1))
154155
(assert_return (invoke "i32.trunc_s_f64" (f64.const -2.0)) (i32.const -2))
@@ -165,13 +166,14 @@
165166
(assert_return (invoke "i32.trunc_u_f64" (f64.const 0x0.0000000000001p-1022)) (i32.const 0))
166167
(assert_return (invoke "i32.trunc_u_f64" (f64.const -0x0.0000000000001p-1022)) (i32.const 0))
167168
(assert_return (invoke "i32.trunc_u_f64" (f64.const 1.0)) (i32.const 1))
168-
(assert_return (invoke "i32.trunc_u_f64" (f64.const 1.1)) (i32.const 1))
169+
(assert_return (invoke "i32.trunc_u_f64" (f64.const 0x1.199999999999ap+0)) (i32.const 1))
169170
(assert_return (invoke "i32.trunc_u_f64" (f64.const 1.5)) (i32.const 1))
170171
(assert_return (invoke "i32.trunc_u_f64" (f64.const 1.9)) (i32.const 1))
171172
(assert_return (invoke "i32.trunc_u_f64" (f64.const 2.0)) (i32.const 2))
172173
(assert_return (invoke "i32.trunc_u_f64" (f64.const 2147483648)) (i32.const -2147483648)) ;; 0x1.00000p+31 -> 8000 0000
173174
(assert_return (invoke "i32.trunc_u_f64" (f64.const 4294967295.0)) (i32.const -1))
174-
(assert_return (invoke "i32.trunc_u_f64" (f64.const -0.9)) (i32.const 0))
175+
(assert_return (invoke "i32.trunc_u_f64" (f64.const -0x1.ccccccccccccdp-1)) (i32.const 0))
176+
(assert_return (invoke "i32.trunc_u_f64" (f64.const -0x1.fffffffffffffp-1)) (i32.const 0))
175177
(assert_return (invoke "i32.trunc_u_f64" (f64.const 1e8)) (i32.const 100000000))
176178
(assert_trap (invoke "i32.trunc_u_f64" (f64.const 4294967296.0)) "integer overflow")
177179
(assert_trap (invoke "i32.trunc_u_f64" (f64.const -1.0)) "integer overflow")
@@ -187,10 +189,10 @@
187189
(assert_return (invoke "i64.trunc_s_f32" (f32.const 0x1p-149)) (i64.const 0))
188190
(assert_return (invoke "i64.trunc_s_f32" (f32.const -0x1p-149)) (i64.const 0))
189191
(assert_return (invoke "i64.trunc_s_f32" (f32.const 1.0)) (i64.const 1))
190-
(assert_return (invoke "i64.trunc_s_f32" (f32.const 1.1)) (i64.const 1))
192+
(assert_return (invoke "i64.trunc_s_f32" (f32.const 0x1.19999ap+0)) (i64.const 1))
191193
(assert_return (invoke "i64.trunc_s_f32" (f32.const 1.5)) (i64.const 1))
192194
(assert_return (invoke "i64.trunc_s_f32" (f32.const -1.0)) (i64.const -1))
193-
(assert_return (invoke "i64.trunc_s_f32" (f32.const -1.1)) (i64.const -1))
195+
(assert_return (invoke "i64.trunc_s_f32" (f32.const -0x1.19999ap+0)) (i64.const -1))
194196
(assert_return (invoke "i64.trunc_s_f32" (f32.const -1.5)) (i64.const -1))
195197
(assert_return (invoke "i64.trunc_s_f32" (f32.const -1.9)) (i64.const -1))
196198
(assert_return (invoke "i64.trunc_s_f32" (f32.const -2.0)) (i64.const -2))
@@ -209,11 +211,12 @@
209211
(assert_return (invoke "i64.trunc_u_f32" (f32.const 0x1p-149)) (i64.const 0))
210212
(assert_return (invoke "i64.trunc_u_f32" (f32.const -0x1p-149)) (i64.const 0))
211213
(assert_return (invoke "i64.trunc_u_f32" (f32.const 1.0)) (i64.const 1))
212-
(assert_return (invoke "i64.trunc_u_f32" (f32.const 1.1)) (i64.const 1))
214+
(assert_return (invoke "i64.trunc_u_f32" (f32.const 0x1.19999ap+0)) (i64.const 1))
213215
(assert_return (invoke "i64.trunc_u_f32" (f32.const 1.5)) (i64.const 1))
214216
(assert_return (invoke "i64.trunc_u_f32" (f32.const 4294967296)) (i64.const 4294967296))
215217
(assert_return (invoke "i64.trunc_u_f32" (f32.const 18446742974197923840.0)) (i64.const -1099511627776))
216-
(assert_return (invoke "i64.trunc_u_f32" (f32.const -0.9)) (i64.const 0))
218+
(assert_return (invoke "i64.trunc_u_f32" (f32.const -0x1.ccccccp-1)) (i64.const 0))
219+
(assert_return (invoke "i64.trunc_u_f32" (f32.const -0x1.fffffep-1)) (i64.const 0))
217220
(assert_trap (invoke "i64.trunc_u_f32" (f32.const 18446744073709551616.0)) "integer overflow")
218221
(assert_trap (invoke "i64.trunc_u_f32" (f32.const -1.0)) "integer overflow")
219222
(assert_trap (invoke "i64.trunc_u_f32" (f32.const infinity)) "integer overflow")
@@ -225,10 +228,10 @@
225228
(assert_return (invoke "i64.trunc_s_f64" (f64.const 0x0.0000000000001p-1022)) (i64.const 0))
226229
(assert_return (invoke "i64.trunc_s_f64" (f64.const -0x0.0000000000001p-1022)) (i64.const 0))
227230
(assert_return (invoke "i64.trunc_s_f64" (f64.const 1.0)) (i64.const 1))
228-
(assert_return (invoke "i64.trunc_s_f64" (f64.const 1.1)) (i64.const 1))
231+
(assert_return (invoke "i64.trunc_s_f64" (f64.const 0x1.199999999999ap+0)) (i64.const 1))
229232
(assert_return (invoke "i64.trunc_s_f64" (f64.const 1.5)) (i64.const 1))
230233
(assert_return (invoke "i64.trunc_s_f64" (f64.const -1.0)) (i64.const -1))
231-
(assert_return (invoke "i64.trunc_s_f64" (f64.const -1.1)) (i64.const -1))
234+
(assert_return (invoke "i64.trunc_s_f64" (f64.const -0x1.199999999999ap+0)) (i64.const -1))
232235
(assert_return (invoke "i64.trunc_s_f64" (f64.const -1.5)) (i64.const -1))
233236
(assert_return (invoke "i64.trunc_s_f64" (f64.const -1.9)) (i64.const -1))
234237
(assert_return (invoke "i64.trunc_s_f64" (f64.const -2.0)) (i64.const -2))
@@ -247,12 +250,13 @@
247250
(assert_return (invoke "i64.trunc_u_f64" (f64.const 0x0.0000000000001p-1022)) (i64.const 0))
248251
(assert_return (invoke "i64.trunc_u_f64" (f64.const -0x0.0000000000001p-1022)) (i64.const 0))
249252
(assert_return (invoke "i64.trunc_u_f64" (f64.const 1.0)) (i64.const 1))
250-
(assert_return (invoke "i64.trunc_u_f64" (f64.const 1.1)) (i64.const 1))
253+
(assert_return (invoke "i64.trunc_u_f64" (f64.const 0x1.199999999999ap+0)) (i64.const 1))
251254
(assert_return (invoke "i64.trunc_u_f64" (f64.const 1.5)) (i64.const 1))
252255
(assert_return (invoke "i64.trunc_u_f64" (f64.const 4294967295)) (i64.const 0xffffffff))
253256
(assert_return (invoke "i64.trunc_u_f64" (f64.const 4294967296)) (i64.const 0x100000000))
254257
(assert_return (invoke "i64.trunc_u_f64" (f64.const 18446744073709549568.0)) (i64.const -2048))
255-
(assert_return (invoke "i64.trunc_u_f64" (f64.const -0.9)) (i64.const 0))
258+
(assert_return (invoke "i64.trunc_u_f64" (f64.const -0x1.ccccccccccccdp-1)) (i64.const 0))
259+
(assert_return (invoke "i64.trunc_u_f64" (f64.const -0x1.fffffffffffffp-1)) (i64.const 0))
256260
(assert_return (invoke "i64.trunc_u_f64" (f64.const 1e8)) (i64.const 100000000))
257261
(assert_return (invoke "i64.trunc_u_f64" (f64.const 1e16)) (i64.const 10000000000000000))
258262
(assert_return (invoke "i64.trunc_u_f64" (f64.const 9223372036854775808)) (i64.const -9223372036854775808))
@@ -393,18 +397,33 @@
393397
(assert_return (invoke "f32.reinterpret_i32" (i32.const 0)) (f32.const 0.0))
394398
(assert_return (invoke "f32.reinterpret_i32" (i32.const 0x80000000)) (f32.const -0.0))
395399
(assert_return (invoke "f32.reinterpret_i32" (i32.const 1)) (f32.const 0x1p-149))
400+
(assert_return (invoke "f32.reinterpret_i32" (i32.const -1)) (f32.const -nan:0x7fffff))
396401
(assert_return (invoke "f32.reinterpret_i32" (i32.const 123456789)) (f32.const 0x1.b79a2ap-113))
397402
(assert_return (invoke "f32.reinterpret_i32" (i32.const -2147483647)) (f32.const -0x1p-149))
403+
(assert_return (invoke "f32.reinterpret_i32" (i32.const 0x7f800000)) (f32.const infinity))
404+
(assert_return (invoke "f32.reinterpret_i32" (i32.const 0xff800000)) (f32.const -infinity))
405+
(assert_return (invoke "f32.reinterpret_i32" (i32.const 0x7fc00000)) (f32.const nan))
406+
(assert_return (invoke "f32.reinterpret_i32" (i32.const 0xffc00000)) (f32.const -nan))
407+
(assert_return (invoke "f32.reinterpret_i32" (i32.const 0x7fa00000)) (f32.const nan:0x200000))
408+
(assert_return (invoke "f32.reinterpret_i32" (i32.const 0xffa00000)) (f32.const -nan:0x200000))
398409

399410
(assert_return (invoke "f64.reinterpret_i64" (i64.const 0)) (f64.const 0.0))
400411
(assert_return (invoke "f64.reinterpret_i64" (i64.const 1)) (f64.const 0x0.0000000000001p-1022))
412+
(assert_return (invoke "f64.reinterpret_i64" (i64.const -1)) (f64.const -nan:0xfffffffffffff))
401413
(assert_return (invoke "f64.reinterpret_i64" (i64.const 0x8000000000000000)) (f64.const -0.0))
402414
(assert_return (invoke "f64.reinterpret_i64" (i64.const 1234567890)) (f64.const 0x0.00000499602d2p-1022))
403415
(assert_return (invoke "f64.reinterpret_i64" (i64.const -9223372036854775807)) (f64.const -0x0.0000000000001p-1022))
416+
(assert_return (invoke "f64.reinterpret_i64" (i64.const 0x7ff0000000000000)) (f64.const infinity))
417+
(assert_return (invoke "f64.reinterpret_i64" (i64.const 0xfff0000000000000)) (f64.const -infinity))
418+
(assert_return (invoke "f64.reinterpret_i64" (i64.const 0x7ff8000000000000)) (f64.const nan))
419+
(assert_return (invoke "f64.reinterpret_i64" (i64.const 0xfff8000000000000)) (f64.const -nan))
420+
(assert_return (invoke "f64.reinterpret_i64" (i64.const 0x7ff4000000000000)) (f64.const nan:0x4000000000000))
421+
(assert_return (invoke "f64.reinterpret_i64" (i64.const 0xfff4000000000000)) (f64.const -nan:0x4000000000000))
404422

405423
(assert_return (invoke "i32.reinterpret_f32" (f32.const 0.0)) (i32.const 0))
406424
(assert_return (invoke "i32.reinterpret_f32" (f32.const -0.0)) (i32.const 0x80000000))
407425
(assert_return (invoke "i32.reinterpret_f32" (f32.const 0x1p-149)) (i32.const 1))
426+
(assert_return (invoke "i32.reinterpret_f32" (f32.const -nan:0x7fffff)) (i32.const -1))
408427
(assert_return (invoke "i32.reinterpret_f32" (f32.const -0x1p-149)) (i32.const 0x80000001))
409428
(assert_return (invoke "i32.reinterpret_f32" (f32.const 1.0)) (i32.const 1065353216))
410429
(assert_return (invoke "i32.reinterpret_f32" (f32.const 3.1415926)) (i32.const 1078530010))
@@ -413,10 +432,14 @@
413432
(assert_return (invoke "i32.reinterpret_f32" (f32.const infinity)) (i32.const 0x7f800000))
414433
(assert_return (invoke "i32.reinterpret_f32" (f32.const -infinity)) (i32.const 0xff800000))
415434
(assert_return (invoke "i32.reinterpret_f32" (f32.const nan)) (i32.const 0x7fc00000))
435+
(assert_return (invoke "i32.reinterpret_f32" (f32.const -nan)) (i32.const 0xffc00000))
436+
(assert_return (invoke "i32.reinterpret_f32" (f32.const nan:0x200000)) (i32.const 0x7fa00000))
437+
(assert_return (invoke "i32.reinterpret_f32" (f32.const -nan:0x200000)) (i32.const 0xffa00000))
416438

417439
(assert_return (invoke "i64.reinterpret_f64" (f64.const 0.0)) (i64.const 0))
418440
(assert_return (invoke "i64.reinterpret_f64" (f64.const -0.0)) (i64.const 0x8000000000000000))
419441
(assert_return (invoke "i64.reinterpret_f64" (f64.const 0x0.0000000000001p-1022)) (i64.const 1))
442+
(assert_return (invoke "i64.reinterpret_f64" (f64.const -nan:0xfffffffffffff)) (i64.const -1))
420443
(assert_return (invoke "i64.reinterpret_f64" (f64.const -0x0.0000000000001p-1022)) (i64.const 0x8000000000000001))
421444
(assert_return (invoke "i64.reinterpret_f64" (f64.const 1.0)) (i64.const 4607182418800017408))
422445
(assert_return (invoke "i64.reinterpret_f64" (f64.const 3.14159265358979)) (i64.const 4614256656552045841))
@@ -425,3 +448,6 @@
425448
(assert_return (invoke "i64.reinterpret_f64" (f64.const infinity)) (i64.const 0x7ff0000000000000))
426449
(assert_return (invoke "i64.reinterpret_f64" (f64.const -infinity)) (i64.const 0xfff0000000000000))
427450
(assert_return (invoke "i64.reinterpret_f64" (f64.const nan)) (i64.const 0x7ff8000000000000))
451+
(assert_return (invoke "i64.reinterpret_f64" (f64.const -nan)) (i64.const 0xfff8000000000000))
452+
(assert_return (invoke "i64.reinterpret_f64" (f64.const nan:0x4000000000000)) (i64.const 0x7ff4000000000000))
453+
(assert_return (invoke "i64.reinterpret_f64" (f64.const -nan:0x4000000000000)) (i64.const 0xfff4000000000000))

0 commit comments

Comments
 (0)