Fix Math.imul and add tests (#432)

This commit is contained in:
Max Graey
2019-01-24 02:23:53 +02:00
committed by Daniel Wirtz
parent 54b02c287c
commit d3715688fc
8 changed files with 745 additions and 258 deletions

View File

@ -94,6 +94,7 @@
(global $~lib/math/random_state0_32 (mut i32) (i32.const 0))
(global $~lib/math/random_state1_32 (mut i32) (i32.const 0))
(global $ASC_SHRINK_LEVEL i32 (i32.const 0))
(global $~lib/builtins/f64.MAX_VALUE f64 (f64.const 1797693134862315708145274e284))
(global $HEAP_BASE i32 (i32.const 68))
(export "memory" (memory $0))
(export "table" (table $0))
@ -9713,7 +9714,7 @@
if
i32.const 0
i32.const 40
i32.const 959
i32.const 970
i32.const 4
call $~lib/env/abort
unreachable
@ -9745,7 +9746,7 @@
if
i32.const 0
i32.const 40
i32.const 968
i32.const 979
i32.const 24
call $~lib/env/abort
unreachable
@ -9802,7 +9803,7 @@
if
i32.const 0
i32.const 40
i32.const 2029
i32.const 2040
i32.const 24
call $~lib/env/abort
unreachable
@ -11122,7 +11123,40 @@
get_local $3
call $std/math/check<f32>
)
(func $~lib/math/ipow64 (; 153 ;) (type $IiI) (param $0 i64) (param $1 i32) (result i64)
(func $~lib/math/NativeMath.imul (; 153 ;) (type $FFF) (param $0 f64) (param $1 f64) (result f64)
get_local $0
get_local $1
f64.add
call $~lib/builtins/isFinite<f64>
i32.eqz
if
f64.const 0
return
end
get_local $0
f64.const 4294967296
get_local $0
f64.const 2.3283064365386963e-10
f64.mul
f64.floor
f64.mul
f64.sub
i64.trunc_s/f64
i32.wrap/i64
get_local $1
f64.const 4294967296
get_local $1
f64.const 2.3283064365386963e-10
f64.mul
f64.floor
f64.mul
f64.sub
i64.trunc_s/f64
i32.wrap/i64
i32.mul
f64.convert_s/i32
)
(func $~lib/math/ipow64 (; 154 ;) (type $IiI) (param $0 i64) (param $1 i32) (result i64)
(local $2 i64)
(local $3 i32)
(local $4 i32)
@ -11354,7 +11388,7 @@
end
get_local $2
)
(func $start (; 154 ;) (type $v)
(func $start (; 155 ;) (type $v)
(local $0 i32)
(local $1 f64)
(local $2 i32)
@ -41725,11 +41759,11 @@
call $~lib/env/abort
unreachable
end
i64.const 0
i32.const 0
call $~lib/math/ipow64
i64.const 1
i64.eq
f64.const 2
f64.const 4
call $~lib/math/NativeMath.imul
f64.const 8
f64.eq
i32.eqz
if
i32.const 0
@ -41739,11 +41773,11 @@
call $~lib/env/abort
unreachable
end
i64.const 0
i32.const 1
call $~lib/math/ipow64
i64.const 0
i64.eq
f64.const -1
f64.const 8
call $~lib/math/NativeMath.imul
f64.const -8
f64.eq
i32.eqz
if
i32.const 0
@ -41753,11 +41787,11 @@
call $~lib/env/abort
unreachable
end
i64.const 0
i32.const 2
call $~lib/math/ipow64
i64.const 0
i64.eq
f64.const -2
f64.const -2
call $~lib/math/NativeMath.imul
f64.const 4
f64.eq
i32.eqz
if
i32.const 0
@ -41767,11 +41801,11 @@
call $~lib/env/abort
unreachable
end
i64.const 0
i32.const 3
call $~lib/math/ipow64
i64.const 0
i64.eq
f64.const 4294967295
f64.const 5
call $~lib/math/NativeMath.imul
f64.const -5
f64.eq
i32.eqz
if
i32.const 0
@ -41781,11 +41815,25 @@
call $~lib/env/abort
unreachable
end
i64.const 1
i32.const 0
call $~lib/math/ipow64
i64.const 1
i64.eq
f64.const 4294967294
f64.const 5
call $~lib/math/NativeMath.imul
f64.const -10
f64.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 3278
i32.const 0
call $~lib/env/abort
unreachable
end
f64.const 1.e+60
f64.const 1.e+60
call $~lib/math/NativeMath.imul
f64.const 0
f64.eq
i32.eqz
if
i32.const 0
@ -41795,11 +41843,11 @@
call $~lib/env/abort
unreachable
end
i64.const 1
i32.const 1
call $~lib/math/ipow64
i64.const 1
i64.eq
f64.const 1.e+60
f64.const -1.e+60
call $~lib/math/NativeMath.imul
f64.const 0
f64.eq
i32.eqz
if
i32.const 0
@ -41809,11 +41857,11 @@
call $~lib/env/abort
unreachable
end
i64.const 1
i32.const 2
call $~lib/math/ipow64
i64.const 1
i64.eq
f64.const -1.e+60
f64.const -1.e+60
call $~lib/math/NativeMath.imul
f64.const 0
f64.eq
i32.eqz
if
i32.const 0
@ -41823,11 +41871,11 @@
call $~lib/env/abort
unreachable
end
i64.const 1
i32.const 3
call $~lib/math/ipow64
i64.const 1
i64.eq
f64.const 1.e+24
f64.const 100
call $~lib/math/NativeMath.imul
f64.const -2147483648
f64.eq
i32.eqz
if
i32.const 0
@ -41837,11 +41885,25 @@
call $~lib/env/abort
unreachable
end
i64.const 2
i32.const 0
call $~lib/math/ipow64
i64.const 1
i64.eq
f64.const nan:0x8000000000000
f64.const 1
call $~lib/math/NativeMath.imul
f64.const 0
f64.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 3283
i32.const 0
call $~lib/env/abort
unreachable
end
f64.const 1
f64.const inf
call $~lib/math/NativeMath.imul
f64.const 0
f64.eq
i32.eqz
if
i32.const 0
@ -41851,11 +41913,11 @@
call $~lib/env/abort
unreachable
end
i64.const 2
i32.const 1
call $~lib/math/ipow64
i64.const 2
i64.eq
get_global $~lib/builtins/f64.MAX_VALUE
get_global $~lib/builtins/f64.MAX_VALUE
call $~lib/math/NativeMath.imul
f64.const 0
f64.eq
i32.eqz
if
i32.const 0
@ -41865,35 +41927,7 @@
call $~lib/env/abort
unreachable
end
i64.const 2
i32.const 2
call $~lib/math/ipow64
i64.const 4
i64.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 3286
i32.const 0
call $~lib/env/abort
unreachable
end
i64.const 2
i32.const 3
call $~lib/math/ipow64
i64.const 8
i64.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 3287
i32.const 0
call $~lib/env/abort
unreachable
end
i64.const -1
i64.const 0
i32.const 0
call $~lib/math/ipow64
i64.const 1
@ -41907,10 +41941,10 @@
call $~lib/env/abort
unreachable
end
i64.const -1
i64.const 0
i32.const 1
call $~lib/math/ipow64
i64.const -1
i64.const 0
i64.eq
i32.eqz
if
@ -41921,10 +41955,10 @@
call $~lib/env/abort
unreachable
end
i64.const -1
i64.const 0
i32.const 2
call $~lib/math/ipow64
i64.const 1
i64.const 0
i64.eq
i32.eqz
if
@ -41935,10 +41969,10 @@
call $~lib/env/abort
unreachable
end
i64.const -1
i64.const 0
i32.const 3
call $~lib/math/ipow64
i64.const -1
i64.const 0
i64.eq
i32.eqz
if
@ -41949,7 +41983,7 @@
call $~lib/env/abort
unreachable
end
i64.const -2
i64.const 1
i32.const 0
call $~lib/math/ipow64
i64.const 1
@ -41963,6 +41997,174 @@
call $~lib/env/abort
unreachable
end
i64.const 1
i32.const 1
call $~lib/math/ipow64
i64.const 1
i64.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 3295
i32.const 0
call $~lib/env/abort
unreachable
end
i64.const 1
i32.const 2
call $~lib/math/ipow64
i64.const 1
i64.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 3296
i32.const 0
call $~lib/env/abort
unreachable
end
i64.const 1
i32.const 3
call $~lib/math/ipow64
i64.const 1
i64.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 3297
i32.const 0
call $~lib/env/abort
unreachable
end
i64.const 2
i32.const 0
call $~lib/math/ipow64
i64.const 1
i64.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 3299
i32.const 0
call $~lib/env/abort
unreachable
end
i64.const 2
i32.const 1
call $~lib/math/ipow64
i64.const 2
i64.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 3300
i32.const 0
call $~lib/env/abort
unreachable
end
i64.const 2
i32.const 2
call $~lib/math/ipow64
i64.const 4
i64.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 3301
i32.const 0
call $~lib/env/abort
unreachable
end
i64.const 2
i32.const 3
call $~lib/math/ipow64
i64.const 8
i64.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 3302
i32.const 0
call $~lib/env/abort
unreachable
end
i64.const -1
i32.const 0
call $~lib/math/ipow64
i64.const 1
i64.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 3304
i32.const 0
call $~lib/env/abort
unreachable
end
i64.const -1
i32.const 1
call $~lib/math/ipow64
i64.const -1
i64.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 3305
i32.const 0
call $~lib/env/abort
unreachable
end
i64.const -1
i32.const 2
call $~lib/math/ipow64
i64.const 1
i64.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 3306
i32.const 0
call $~lib/env/abort
unreachable
end
i64.const -1
i32.const 3
call $~lib/math/ipow64
i64.const -1
i64.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 3307
i32.const 0
call $~lib/env/abort
unreachable
end
i64.const -2
i32.const 0
call $~lib/math/ipow64
i64.const 1
i64.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 3309
i32.const 0
call $~lib/env/abort
unreachable
end
i64.const -2
i32.const 1
call $~lib/math/ipow64
@ -41972,7 +42174,7 @@
if
i32.const 0
i32.const 8
i32.const 3295
i32.const 3310
i32.const 0
call $~lib/env/abort
unreachable
@ -41986,7 +42188,7 @@
if
i32.const 0
i32.const 8
i32.const 3296
i32.const 3311
i32.const 0
call $~lib/env/abort
unreachable
@ -42000,7 +42202,7 @@
if
i32.const 0
i32.const 8
i32.const 3297
i32.const 3312
i32.const 0
call $~lib/env/abort
unreachable
@ -42014,7 +42216,7 @@
if
i32.const 0
i32.const 8
i32.const 3299
i32.const 3314
i32.const 0
call $~lib/env/abort
unreachable
@ -42028,7 +42230,7 @@
if
i32.const 0
i32.const 8
i32.const 3300
i32.const 3315
i32.const 0
call $~lib/env/abort
unreachable
@ -42042,7 +42244,7 @@
if
i32.const 0
i32.const 8
i32.const 3301
i32.const 3316
i32.const 0
call $~lib/env/abort
unreachable
@ -42056,7 +42258,7 @@
if
i32.const 0
i32.const 8
i32.const 3302
i32.const 3317
i32.const 0
call $~lib/env/abort
unreachable
@ -42070,7 +42272,7 @@
if
i32.const 0
i32.const 8
i32.const 3303
i32.const 3318
i32.const 0
call $~lib/env/abort
unreachable
@ -42084,7 +42286,7 @@
if
i32.const 0
i32.const 8
i32.const 3304
i32.const 3319
i32.const 0
call $~lib/env/abort
unreachable
@ -42098,7 +42300,7 @@
if
i32.const 0
i32.const 8
i32.const 3305
i32.const 3320
i32.const 0
call $~lib/env/abort
unreachable
@ -42116,12 +42318,12 @@
if
i32.const 0
i32.const 8
i32.const 3307
i32.const 3322
i32.const 0
call $~lib/env/abort
unreachable
end
)
(func $null (; 155 ;) (type $v)
(func $null (; 156 ;) (type $v)
)
)