Experimenting with inline-assembler-ish explicit builtins

Starting with explicit loads and stores as part of the respective type namespaces. Might become handy for use with portable code, because these can be polyfilled, while load<T> and store<T> can't.
This commit is contained in:
dcodeIO
2018-04-27 00:08:41 +02:00
parent d445608467
commit 06f99406be
18 changed files with 2234 additions and 1143 deletions

View File

@ -784,6 +784,112 @@
(i32.const 8)
(i64.const 1)
)
(drop
(i32.load8_s
(i32.const 8)
)
)
(drop
(i32.load8_u
(i32.const 8)
)
)
(drop
(i32.load16_s
(i32.const 8)
)
)
(drop
(i32.load16_u
(i32.const 8)
)
)
(drop
(i32.load
(i32.const 8)
)
)
(drop
(i64.load8_s
(i32.const 8)
)
)
(drop
(i64.load8_s
(i32.const 8)
)
)
(drop
(i64.load16_s
(i32.const 8)
)
)
(drop
(i64.load16_u
(i32.const 8)
)
)
(drop
(i64.load32_s
(i32.const 8)
)
)
(drop
(i64.load32_u
(i32.const 8)
)
)
(drop
(i64.load
(i32.const 8)
)
)
(drop
(f32.load
(i32.const 8)
)
)
(drop
(f64.load
(i32.const 8)
)
)
(i32.store8
(i32.const 8)
(i32.const 1)
)
(i32.store16
(i32.const 8)
(i32.const 1)
)
(i32.store
(i32.const 8)
(i32.const 1)
)
(i32.store8
(i32.const 8)
(i32.const 1)
)
(i32.store16
(i32.const 8)
(i32.const 1)
)
(i32.store
(i32.const 8)
(i32.const 1)
)
(i64.store
(i32.const 8)
(i64.const 1)
)
(f32.store
(i32.const 8)
(f32.const 1)
)
(f64.store
(i32.const 8)
(f64.const 1)
)
(set_global $builtins/i
(i32.const 1067450368)
)
@ -840,7 +946,7 @@
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 261)
(i32.const 288)
(i32.const 0)
)
(unreachable)
@ -856,7 +962,7 @@
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 262)
(i32.const 289)
(i32.const 0)
)
(unreachable)
@ -870,7 +976,7 @@
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 263)
(i32.const 290)
(i32.const 0)
)
(unreachable)
@ -884,7 +990,7 @@
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 264)
(i32.const 291)
(i32.const 0)
)
(unreachable)
@ -898,7 +1004,7 @@
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 265)
(i32.const 292)
(i32.const 0)
)
(unreachable)
@ -912,7 +1018,7 @@
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 266)
(i32.const 293)
(i32.const 0)
)
(unreachable)
@ -928,7 +1034,7 @@
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 267)
(i32.const 294)
(i32.const 0)
)
(unreachable)
@ -944,7 +1050,7 @@
(call $abort
(i32.const 0)
(i32.const 4)
(i32.const 268)
(i32.const 295)
(i32.const 0)
)
(unreachable)

View File

@ -196,6 +196,33 @@ 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);

File diff suppressed because it is too large Load Diff

View File

@ -7031,6 +7031,112 @@
(i32.const 8)
(i64.const 1)
)
(drop
(i32.load8_s
(i32.const 8)
)
)
(drop
(i32.load8_u
(i32.const 8)
)
)
(drop
(i32.load16_s
(i32.const 8)
)
)
(drop
(i32.load16_u
(i32.const 8)
)
)
(drop
(i32.load
(i32.const 8)
)
)
(drop
(i64.load8_s
(i32.const 8)
)
)
(drop
(i64.load8_s
(i32.const 8)
)
)
(drop
(i64.load16_s
(i32.const 8)
)
)
(drop
(i64.load16_u
(i32.const 8)
)
)
(drop
(i64.load32_s
(i32.const 8)
)
)
(drop
(i64.load32_u
(i32.const 8)
)
)
(drop
(i64.load
(i32.const 8)
)
)
(drop
(f32.load
(i32.const 8)
)
)
(drop
(f64.load
(i32.const 8)
)
)
(i32.store8
(i32.const 8)
(i32.const 1)
)
(i32.store16
(i32.const 8)
(i32.const 1)
)
(i32.store
(i32.const 8)
(i32.const 1)
)
(i32.store8
(i32.const 8)
(i32.const 1)
)
(i32.store16
(i32.const 8)
(i32.const 1)
)
(i32.store
(i32.const 8)
(i32.const 1)
)
(i64.store
(i32.const 8)
(i64.const 1)
)
(f32.store
(i32.const 8)
(f32.const 1)
)
(f64.store
(i32.const 8)
(f64.const 1)
)
(set_global $builtins/i
(i32.const 1067450368)
)
@ -7087,7 +7193,7 @@
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 261)
(i32.const 288)
(i32.const 0)
)
(unreachable)
@ -7103,7 +7209,7 @@
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 262)
(i32.const 289)
(i32.const 0)
)
(unreachable)
@ -7117,7 +7223,7 @@
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 263)
(i32.const 290)
(i32.const 0)
)
(unreachable)
@ -7131,7 +7237,7 @@
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 264)
(i32.const 291)
(i32.const 0)
)
(unreachable)
@ -7145,7 +7251,7 @@
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 265)
(i32.const 292)
(i32.const 0)
)
(unreachable)
@ -7159,7 +7265,7 @@
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 266)
(i32.const 293)
(i32.const 0)
)
(unreachable)
@ -7175,7 +7281,7 @@
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 267)
(i32.const 294)
(i32.const 0)
)
(unreachable)
@ -7191,7 +7297,7 @@
(call $abort
(i32.const 0)
(i32.const 28)
(i32.const 268)
(i32.const 295)
(i32.const 0)
)
(unreachable)

File diff suppressed because it is too large Load Diff