Add more inline-assembler-ish builtins; Update Binaryen

This commit is contained in:
dcodeIO
2018-04-27 19:12:25 +02:00
parent 06f99406be
commit 2aea14b518
15 changed files with 3452 additions and 2964 deletions

View File

@ -784,6 +784,172 @@
(i32.const 8)
(i64.const 1)
)
(set_global $builtins/i
(i32.const 1067450368)
)
(set_global $builtins/f
(f32.const 3.5032461608120427e-44)
)
(set_global $builtins/I
(i64.const 4608308318706860032)
)
(set_global $builtins/F
(f64.const 1.24e-322)
)
(drop
(current_memory)
)
(drop
(grow_memory
(i32.const 1)
)
)
(set_global $builtins/s
(current_memory)
)
(set_global $builtins/s
(grow_memory
(i32.const 1)
)
)
(set_global $builtins/i
(i32.const 10)
)
(set_global $builtins/I
(i64.const 200)
)
(set_global $builtins/f
(f32.const 1.25)
)
(set_global $builtins/F
(f64.const 25)
)
(if
(i32.eqz
(get_global $builtins/i)
)
(unreachable)
)
(if
(i32.eqz
(call $isNaN<f32>
(f32.const nan:0x400000)
)
)
(block
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 261)
(i32.const 0)
)
(unreachable)
)
)
(if
(i32.eqz
(call $isNaN<f64>
(f64.const nan:0x8000000000000)
)
)
(block
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 262)
(i32.const 0)
)
(unreachable)
)
)
(if
(call $isFinite<f32>
(f32.const nan:0x400000)
)
(block
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 263)
(i32.const 0)
)
(unreachable)
)
)
(if
(call $isFinite<f32>
(f32.const inf)
)
(block
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 264)
(i32.const 0)
)
(unreachable)
)
)
(if
(call $isFinite<f64>
(f64.const nan:0x8000000000000)
)
(block
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 265)
(i32.const 0)
)
(unreachable)
)
)
(if
(call $isFinite<f64>
(f64.const inf)
)
(block
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 266)
(i32.const 0)
)
(unreachable)
)
)
(if
(i32.eqz
(call $isFinite<f32>
(f32.const 0)
)
)
(block
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 267)
(i32.const 0)
)
(unreachable)
)
)
(if
(i32.eqz
(call $isFinite<f64>
(f64.const 0)
)
)
(block
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 268)
(i32.const 0)
)
(unreachable)
)
)
(drop
(i32.load8_s
(i32.const 8)
@ -815,7 +981,7 @@
)
)
(drop
(i64.load8_s
(i64.load8_u
(i32.const 8)
)
)
@ -890,172 +1056,6 @@
(i32.const 8)
(f64.const 1)
)
(set_global $builtins/i
(i32.const 1067450368)
)
(set_global $builtins/f
(f32.const 3.5032461608120427e-44)
)
(set_global $builtins/I
(i64.const 4608308318706860032)
)
(set_global $builtins/F
(f64.const 1.24e-322)
)
(drop
(current_memory)
)
(drop
(grow_memory
(i32.const 1)
)
)
(set_global $builtins/s
(current_memory)
)
(set_global $builtins/s
(grow_memory
(i32.const 1)
)
)
(set_global $builtins/i
(i32.const 10)
)
(set_global $builtins/I
(i64.const 200)
)
(set_global $builtins/f
(f32.const 1.25)
)
(set_global $builtins/F
(f64.const 25)
)
(if
(i32.eqz
(get_global $builtins/i)
)
(unreachable)
)
(if
(i32.eqz
(call $isNaN<f32>
(f32.const nan:0x400000)
)
)
(block
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 288)
(i32.const 0)
)
(unreachable)
)
)
(if
(i32.eqz
(call $isNaN<f64>
(f64.const nan:0x8000000000000)
)
)
(block
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 289)
(i32.const 0)
)
(unreachable)
)
)
(if
(call $isFinite<f32>
(f32.const nan:0x400000)
)
(block
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 290)
(i32.const 0)
)
(unreachable)
)
)
(if
(call $isFinite<f32>
(f32.const inf)
)
(block
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 291)
(i32.const 0)
)
(unreachable)
)
)
(if
(call $isFinite<f64>
(f64.const nan:0x8000000000000)
)
(block
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 292)
(i32.const 0)
)
(unreachable)
)
)
(if
(call $isFinite<f64>
(f64.const inf)
)
(block
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 293)
(i32.const 0)
)
(unreachable)
)
)
(if
(i32.eqz
(call $isFinite<f32>
(f32.const 0)
)
)
(block
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 294)
(i32.const 0)
)
(unreachable)
)
)
(if
(i32.eqz
(call $isFinite<f64>
(f64.const 0)
)
)
(block
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 295)
(i32.const 0)
)
(unreachable)
)
)
(drop
(call $isNaN<f64>
(f64.const 1)

View File

@ -196,33 +196,6 @@ store<i64>(8, <i64>1);
store<i64>(8, <i32>1); // must extend
// explicit load and store
i32.load8_s(8);
i32.load8_u(8);
i32.load16_s(8);
i32.load16_u(8);
i32.load(8);
i64.load8_s(8);
i64.load8_s(8);
i64.load16_s(8);
i64.load16_u(8);
i64.load32_s(8);
i64.load32_u(8);
i64.load(8);
f32.load(8);
f64.load(8);
i32.store8(8, 1);
i32.store16(8, 1);
i32.store(8, 1);
i64.store8(8, 1);
i64.store16(8, 1);
i64.store32(8, 1);
i64.store(8, 1);
f32.store(8, 1);
f64.store(8, 1);
// reinterpretation
reinterpret<i32>(1.25);
@ -336,6 +309,80 @@ assert(f64.MIN_SAFE_INTEGER == -9007199254740991);
assert(f64.MAX_SAFE_INTEGER == 9007199254740991);
assert(f64.EPSILON == 2.2204460492503131e-16);
// inline-assembler
f32.abs(1.0);
f64.abs(1.0);
f32.ceil(1.0);
f64.ceil(1.0);
i32.clz(1);
i64.clz(1);
f32.copysign(1.0, 2.0);
f64.copysign(1.0, 2.0);
i32.ctz(1);
i64.ctz(1);
f32.floor(1.0);
f64.floor(1.0);
f32.nearest(1.0);
f64.nearest(1.0);
i32.popcnt(1);
i64.popcnt(1);
i32.load8_s(8);
i32.load8_u(8);
i32.load16_s(8);
i32.load16_u(8);
i32.load(8);
i64.load8_s(8);
i64.load8_u(8);
i64.load16_s(8);
i64.load16_u(8);
i64.load32_s(8);
i64.load32_u(8);
i64.load(8);
f32.load(8);
f64.load(8);
f32.max(1.0, 2.0);
f64.max(1.0, 2.0);
f32.min(1.0, 2.0);
f64.min(1.0, 2.0);
i32.reinterpret_f32(1.0);
i64.reinterpret_f64(1.0);
f32.reinterpret_i32(1);
f64.reinterpret_i64(1);
i32.rotl(1, 2);
i64.rotl(1, 2);
i32.rotr(1, 2);
i64.rotr(1, 2);
f32.sqrt(1.0);
f64.sqrt(1.0);
i32.store8(8, 1);
i32.store16(8, 1);
i32.store(8, 1);
i64.store8(8, 1);
i64.store16(8, 1);
i64.store32(8, 1);
i64.store(8, 1);
f32.store(8, 1.0);
f64.store(8, 1.0);
f32.trunc(1.0);
f64.trunc(1.0);
// should be importable
import { isNaN as isItNaN } from "builtins";
isItNaN<f64>(1);

File diff suppressed because it is too large Load Diff

View File

@ -7031,6 +7031,172 @@
(i32.const 8)
(i64.const 1)
)
(set_global $builtins/i
(i32.const 1067450368)
)
(set_global $builtins/f
(f32.const 3.5032461608120427e-44)
)
(set_global $builtins/I
(i64.const 4608308318706860032)
)
(set_global $builtins/F
(f64.const 1.24e-322)
)
(drop
(current_memory)
)
(drop
(grow_memory
(i32.const 1)
)
)
(set_global $builtins/s
(current_memory)
)
(set_global $builtins/s
(grow_memory
(i32.const 1)
)
)
(set_global $builtins/i
(i32.const 10)
)
(set_global $builtins/I
(i64.const 200)
)
(set_global $builtins/f
(f32.const 1.25)
)
(set_global $builtins/F
(f64.const 25)
)
(if
(i32.eqz
(get_global $builtins/i)
)
(unreachable)
)
(if
(i32.eqz
(call $isNaN<f32>
(f32.const nan:0x400000)
)
)
(block
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 261)
(i32.const 0)
)
(unreachable)
)
)
(if
(i32.eqz
(call $isNaN<f64>
(f64.const nan:0x8000000000000)
)
)
(block
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 262)
(i32.const 0)
)
(unreachable)
)
)
(if
(call $isFinite<f32>
(f32.const nan:0x400000)
)
(block
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 263)
(i32.const 0)
)
(unreachable)
)
)
(if
(call $isFinite<f32>
(f32.const inf)
)
(block
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 264)
(i32.const 0)
)
(unreachable)
)
)
(if
(call $isFinite<f64>
(f64.const nan:0x8000000000000)
)
(block
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 265)
(i32.const 0)
)
(unreachable)
)
)
(if
(call $isFinite<f64>
(f64.const inf)
)
(block
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 266)
(i32.const 0)
)
(unreachable)
)
)
(if
(i32.eqz
(call $isFinite<f32>
(f32.const 0)
)
)
(block
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 267)
(i32.const 0)
)
(unreachable)
)
)
(if
(i32.eqz
(call $isFinite<f64>
(f64.const 0)
)
)
(block
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 268)
(i32.const 0)
)
(unreachable)
)
)
(drop
(i32.load8_s
(i32.const 8)
@ -7062,7 +7228,7 @@
)
)
(drop
(i64.load8_s
(i64.load8_u
(i32.const 8)
)
)
@ -7137,172 +7303,6 @@
(i32.const 8)
(f64.const 1)
)
(set_global $builtins/i
(i32.const 1067450368)
)
(set_global $builtins/f
(f32.const 3.5032461608120427e-44)
)
(set_global $builtins/I
(i64.const 4608308318706860032)
)
(set_global $builtins/F
(f64.const 1.24e-322)
)
(drop
(current_memory)
)
(drop
(grow_memory
(i32.const 1)
)
)
(set_global $builtins/s
(current_memory)
)
(set_global $builtins/s
(grow_memory
(i32.const 1)
)
)
(set_global $builtins/i
(i32.const 10)
)
(set_global $builtins/I
(i64.const 200)
)
(set_global $builtins/f
(f32.const 1.25)
)
(set_global $builtins/F
(f64.const 25)
)
(if
(i32.eqz
(get_global $builtins/i)
)
(unreachable)
)
(if
(i32.eqz
(call $isNaN<f32>
(f32.const nan:0x400000)
)
)
(block
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 288)
(i32.const 0)
)
(unreachable)
)
)
(if
(i32.eqz
(call $isNaN<f64>
(f64.const nan:0x8000000000000)
)
)
(block
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 289)
(i32.const 0)
)
(unreachable)
)
)
(if
(call $isFinite<f32>
(f32.const nan:0x400000)
)
(block
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 290)
(i32.const 0)
)
(unreachable)
)
)
(if
(call $isFinite<f32>
(f32.const inf)
)
(block
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 291)
(i32.const 0)
)
(unreachable)
)
)
(if
(call $isFinite<f64>
(f64.const nan:0x8000000000000)
)
(block
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 292)
(i32.const 0)
)
(unreachable)
)
)
(if
(call $isFinite<f64>
(f64.const inf)
)
(block
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 293)
(i32.const 0)
)
(unreachable)
)
)
(if
(i32.eqz
(call $isFinite<f32>
(f32.const 0)
)
)
(block
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 294)
(i32.const 0)
)
(unreachable)
)
)
(if
(i32.eqz
(call $isFinite<f64>
(f64.const 0)
)
)
(block
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 295)
(i32.const 0)
)
(unreachable)
)
)
(drop
(call $isNaN<f64>
(f64.const 1)

File diff suppressed because it is too large Load Diff

View File

@ -589,36 +589,37 @@
)
(f64.const -1)
)
(if (result f64)
(i32.eq
(get_local $2)
(i32.const 43)
)
(block (result f64)
(if
(i32.eqz
(tee_local $4
(i32.sub
(get_local $4)
(i32.const 1)
(block (result f64)
(if
(i32.eq
(get_local $2)
(i32.const 43)
)
(block
(if
(i32.eqz
(tee_local $4
(i32.sub
(get_local $4)
(i32.const 1)
)
)
)
(return
(f64.const nan:0x8000000000000)
)
)
(return
(f64.const nan:0x8000000000000)
)
)
(set_local $2
(i32.load16_u offset=4
(tee_local $3
(i32.add
(get_local $3)
(i32.const 2)
(set_local $2
(i32.load16_u offset=4
(tee_local $3
(i32.add
(get_local $3)
(i32.const 2)
)
)
)
)
)
(f64.const 1)
)
(f64.const 1)
)
@ -983,36 +984,37 @@
)
(f64.const -1)
)
(if (result f64)
(i32.eq
(get_local $2)
(i32.const 43)
)
(block (result f64)
(if
(i32.eqz
(tee_local $3
(i32.sub
(get_local $3)
(i32.const 1)
(block (result f64)
(if
(i32.eq
(get_local $2)
(i32.const 43)
)
(block
(if
(i32.eqz
(tee_local $3
(i32.sub
(get_local $3)
(i32.const 1)
)
)
)
(return
(f64.const nan:0x8000000000000)
)
)
(return
(f64.const nan:0x8000000000000)
)
)
(drop
(i32.load16_u offset=4
(tee_local $1
(i32.add
(get_local $1)
(i32.const 2)
(drop
(i32.load16_u offset=4
(tee_local $1
(i32.add
(get_local $1)
(i32.const 2)
)
)
)
)
)
(f64.const 1)
)
(f64.const 1)
)