Diego Frias
a58704296c
LibWasm: Remove type information from Value
...
Gets fib(30) from 380ms to 340ms.
2024-08-07 01:10:20 +02:00
Diego Frias
a2448308fd
LibWasm: Directly remove from the stack when clearing a label
...
Theoretically, the previous "pop, then push" method should be faster,
but it's actually faster to just remove from the stack directly.
2024-08-07 01:10:20 +02:00
Diego Frias
b73b17aab4
LibWasm: Inline bytecode interpreter instruction interpretation
...
Gets fib(30) from 480ms to 380ms.
2024-08-07 01:10:20 +02:00
Diego Frias
a3b077c641
LibWasm: Split main interpreter stack into three
...
Instead of one stack to hold frames, labels, and values, there is now
three separate stacks. This speeds up fib(30) from 580ms to 480ms.
2024-08-07 01:10:20 +02:00
Diego Frias
15510fb42e
LibWasm: Simplify downcasting in bytecode interpreter
2024-08-07 01:10:20 +02:00
Diego Frias
23cfee2205
LibWasm: Clean up module sections API
...
Remove `for_each_section_of_type` in favor of making the module's
sections defined as distinct fields. This means it is no longer possible
to have two of the same section (which is invalid in WebAssembly, for
anything other than custom sections).
2024-08-01 11:44:07 +02:00
Diego Frias
dc52998341
LibWasm: Remove Module::functions
...
`Module::functions` created clones of all of the functions in the
module. It provided a _slightly_ better API, but ended up costing around
40ms when instantiating spidermonkey.
2024-07-28 02:56:32 +02:00
Diego Frias
4e8376d07e
LibWasm: Remove unused vector methods of the interpreter
2024-07-24 23:23:09 +02:00
Diego Frias
9cc3e7d32d
LibWasm: Fix SIMD shuffle and swizzle
...
`swizzle` had the wrong operands, and the vector masking boolean logic
was incorrect in the internal `shuffle_or_0` implementation. `shuffle`
was previously implemented as a dynamic swizzle, when it uses an
immediate operand for lane indices in the spec.
2024-07-24 23:23:09 +02:00
Diego Frias
d841742c35
LibWasm: Fix SIMD bit shift right
...
Set the sign in the vector's element type (even though it's a bit
redundant).
2024-07-24 23:23:09 +02:00
Diego Frias
4b9649282e
LibWasm: Implement the rest of the SIMD conversions
2024-07-20 11:17:29 +02:00
Diego Frias
21c5084d23
LibWasm: Fix v128.any_true instruction
2024-07-20 11:17:29 +02:00
Diego Frias
616048c67e
LibWasm: Implement integer conversion and narrowing SIMD instructions
2024-07-20 11:17:29 +02:00
Diego Frias
146646b597
LibWasm: Implement bitmask and float conversion instructions
2024-07-20 11:17:29 +02:00
Diego Frias
ea67bc989f
LibWasm: Remove some unnecessary memory checks
...
Also make `store_to_memory` take a `MemoryArgument` so that we no longer
have to make "synthetic instructions" in some scenarios.
2024-07-19 03:19:04 +02:00
Diego Frias
56ae6b3968
LibWasm: Remove some dead code
2024-07-19 03:19:04 +02:00
Ali Mohammad Pur
8cf0f36f7d
LibWasm: Replace a hashtable with an RBTree to make instantiation faster
...
...by about 40%.
2024-07-18 14:54:50 +02:00
Ali Mohammad Pur
e22408b8b4
LibWasm: Make import errors a bit more descriptive and helpful
...
Instead of "yeah something went wrong", show what went wrong.
2024-07-18 14:54:50 +02:00
Hendiadyoin1
144e822de2
LibWasm: Use shuffle_or_0 in for vector swizzles and shuffles
...
Otherwise we'd hit a VERIFY in AK::SIMD::shuffle() when that operand
contains an out-of-range value, the spec tests indicate that a swizzle
with an out-of-range index should return 0.
(cherry picked from commit cd454a1e3d0bc8b3342ed39891c9b27409ecc829)
2024-07-17 09:56:13 -06:00
Ali Mohammad Pur
8c8310f0bd
LibWasm: Make Absolute/Negate<SignedIntegral> explicitly work mod 2^N
...
Previously we relied on signed overflow, this commit makes the same
behaviour explicit (avoiding UB in the process).
2024-07-16 15:09:03 +02:00
Diego Frias
8a0ef17d9a
LibWasm: Correctly validate v128_load*_lane instructions
2024-07-15 09:58:04 -06:00
Diego Frias
f5326f1747
LibWasm: Implement rest of SIMD load/store instructions
...
Also implement `v128.any_true`.
2024-07-15 09:58:04 -06:00
Enver Balalic
f0a306fe50
LibWasm: Implement most of iNxM SIMD operations
...
With this we pass an additional ~2100 tests.
We are left with 7106 WASM fails :).
There's still some test cases in the iNxM tests that fail with
this PR, but they are somewhat weird.
Co-authored-by: Diego Frias <styx5242@gmail.com >
2024-07-14 11:35:11 +02:00
Diego
4c7ef01b44
LibWasm: Fix sign issues in SIMD cmp ops
2024-07-13 14:38:10 +02:00
Diego Frias
13a8c2a79d
LibWasm: Make SIMD float min/max operations binary ops
...
They previously acted like comparison operators, which was not correct.
2024-07-13 01:27:55 +02:00
Diego
3efb11f5d8
LibWasm: Validate stack correctly in v128_store*_lane instructions
...
Previously the validator put a `v128` on the stack, which is not what
the spec defines.
2024-07-13 00:04:02 +02:00
Diego
420a626554
LibWasm: Make memory.grow grow the memory's type
...
After a `memory.grow`, the type of the memory instance should be
updated so potential memory imports on the boundary are unlinkable.
2024-07-11 01:31:22 +02:00
Diego
d07cf26894
LibWasm: Fix loop arity for single-type blocktypes
...
Single-type blocktypes previously gave loop labels an arity of 1, even
though they're shorthand for `[] -> [T]`.
2024-07-11 00:51:03 +02:00
Diego
625fbc8085
LibWasm: Implement SIMD bitwise operations
2024-07-11 00:50:08 +02:00
Diego
e8fd8982f8
LibWasm: Give names to functions exported to JS via ref.func
...
https://webassembly.github.io/spec/js-api/index.html#name-of-the-webassembly-function
2024-07-10 00:37:18 +02:00
Diego
5382fbb617
LibWasm: Remove Wasm::ValueType::Kind::Null* variants
...
As far as I know, they're not in the spec and don't serve any purposes
in the internals of LibWasm.
2024-07-09 14:22:00 +02:00
Diego
31c7e98a4a
LibWasm: Fix comparisons between 0.0 and -0.0
...
According to the spec, -0.0 < 0.0.
2024-07-08 15:12:16 +02:00
Diego
c882498d44
LibWasm: Fix some floating-point conversion issues
...
NaN bit patterns are now (hopefully) preserved. `static_cast` does not
preserve the bit pattern of a given NaN, so ideally we'd use some other
sort of cast and avoid `static_cast` altogether, but that's a large
change for this commit. For now, this fixes the issues found in spec
tests.
2024-07-08 15:12:16 +02:00
Diego
fce8ed1563
LibWasm: Validate potentially empty else branch in if instruction
2024-07-04 21:47:07 +02:00
Diego
3b40667413
LibWasm: Check source and destination offsets in memory.init
...
Overflows are no longer possible.
2024-06-22 20:52:32 +02:00
Diego
0e705f431e
LibWasm: Check exports for valid ref.func targets
2024-06-18 16:58:33 +02:00
Diego
bd97091cbb
LibWasm: Ensure that global.get only accesses imports in const exprs
2024-06-18 16:58:33 +02:00
Diego
78c56d80f9
LibWasm: Check data segment offset at correct time during instantiation
...
The data segment offset should be checked _before_ checking if the
contents of the segment are non-existent.
2024-06-18 16:58:33 +02:00
Diego
c2a0c4f581
LibWasm: Report start function traps during instantiation
2024-06-18 16:58:33 +02:00
Diego
3225e6fad2
LibWasm: Improve element validation and instantiation
2024-06-17 01:55:42 +02:00
Diego
4c3071c7c2
LibWasm: Implement rest of table instructions
2024-06-17 00:58:31 +02:00
Diego
6e419db26c
LibWasm: Tighten validation algorithm
...
The big improvement included in this commit is stack height mismatch
validation. There are other minor improvements included (related to the
validation algorithm). The method of supporting stack polymorphism has
changed to be more like the spec, which was necessary for confidently
handling stack height mismatches.
See:
https://webassembly.github.io/spec/core/appendix/algorithm.html
2024-06-13 17:21:23 +02:00
Diego
8217a77728
LibWasm: Refactor validator to use one stack for frame information
...
Previously, the validator had a lot of extraneous information related to
frames. Now, there's just one stack with all the necessary information
derived from it.
2024-06-13 17:21:23 +02:00
Diego
b92bd12a8e
LibWasm: Make loops work
...
This commit should hopefully allow for `loop.wast` to be run in CI.
2024-06-13 12:15:20 +02:00
Diego
cf7937e369
LibWasm: Make memory.fill fill with single bytes
...
Previously, `memory.fill` filled memory with 4-byte values, even though
`memory.fill` should fill with just one byte. Also fixes some other
issues with some of the bulk memory instructions, like `memory.init`.
2024-06-13 12:13:18 +02:00
Diego
d20f1a99f8
LibWasm: Validate imports
2024-06-11 02:43:55 +02:00
Diego
67749300c3
LibWasm: Validate that data section exists for some instructions
2024-06-11 01:45:12 +02:00
Diego
a7b1a9ded7
LibWasm: Disallow multiple start sections
2024-06-11 01:45:12 +02:00
Diego
3d7c824607
LibWasm: Make sure no duplicate export names are possible
2024-06-11 01:45:12 +02:00
Diego
e64ac8c177
LibWasm: Validate number of data sections
2024-06-11 01:45:12 +02:00