Commit Graph

25 Commits

Author SHA1 Message Date
Diego Frias
519d3674fa 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.

(cherry picked from commit 9cc3e7d32d150dd30d683c1a8cf0bd59676f14ab)
2024-07-29 14:34:01 +02:00
Diego Frias
f92916b4ce LibWasm: Fix SIMD bit shift right
Set the sign in the vector's element type (even though it's a bit
redundant).

(cherry picked from commit d841742c3582e086613bda41a9679dfa6f7f2393)
2024-07-29 14:34:01 +02:00
Diego Frias
73ed02a3d4 LibWasm: Implement the rest of the SIMD conversions
(cherry picked from commit 4b9649282ebfef46e645e404e09f3b50b578d56f)
2024-07-29 14:34:01 +02:00
Diego Frias
b47c9dfe45 LibWasm: Implement integer conversion and narrowing SIMD instructions
(cherry picked from commit 616048c67e47c88d8426b46f83ecf13e6f9826e8)
2024-07-29 14:34:01 +02:00
Diego Frias
c510c5375f LibWasm: Implement bitmask and float conversion instructions
(cherry picked from commit 146646b59741c1300461056e384dae50815d1621)
2024-07-29 14:34:01 +02:00
Ali Mohammad Pur
68aa4cbb91 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).

(cherry picked from commit 8c8310f0bddc874a9f7f07c4158f0abc799357d4)
2024-07-16 17:35:43 +02:00
Enver Balalic
34b3015c16 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.

(cherry picked from commit b4acd4fb0b7f4105c7ef673ccc00904114c3c468)

Co-authored-by: Diego Frias <styx5242@gmail.com>
2024-07-16 17:35:43 +02:00
Diego
b896f27a45 LibWasm: Fix sign issues in SIMD cmp ops
(cherry picked from commit 1e1dcd89438c5b0b8ad34682de4f1c7c62cbacb9)
2024-07-16 17:35:43 +02:00
Diego
7df774c473 LibWasm: Implement SIMD bitwise operations
(cherry picked from commit 2ab676860e56216cf0560dac1aafd4e5656ec586)
2024-07-16 17:35:43 +02:00
Diego
29ae76925f LibWasm: Fix comparisons between 0.0 and -0.0
According to the spec, -0.0 < 0.0.

(cherry picked from commit 31c7e98a4a46c2d0ef93c5fca47d64d05b96449f)
2024-07-10 01:10:12 +02:00
Diego
3ed4cac2a5 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.

(cherry picked from commit c882498d4450c4c2e46d77a8ab36afc4eb412c00)
2024-07-10 01:10:12 +02:00
Hendiadyoin1
cd454a1e3d 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.
2024-07-05 00:52:30 +02:00
Enver Balalic
b43d2307cd LibWasm: Implement f32x4 and f64x2 arithmetic SIMD ops
Adds all the arithmetic ops for f32x4 and f64x2 SIMD instructions.

With this, we pass 8375 additional tests :)

Quite a few of the spec tests for this are still failing.
I confirmed with the wasmer runtime manually for a number of them,
and we seem to match their and results. I'm not really sure
what's happening here, a spec bug or wasmer is broken in
the same way.

18476 failed before.
10101 failed after.
2024-06-09 16:30:09 +02:00
Ali Mohammad Pur
5a40ce442b LibWasm: Remove uses of AK::Result
Closes #23500.
2024-03-12 17:10:47 +01:00
Ali Mohammad Pur
56ba869c57 LibWasm: Implement all remaining comparison SIMD instructions 2024-02-18 23:50:50 +01:00
Ali Mohammad Pur
82b7368de1 LibWasm: Implement 15 more SIMD instructions 2024-02-18 23:50:50 +01:00
Ali Mohammad Pur
3c176bafee LibWasm: Implement a few SIMD instructions 2023-08-21 13:39:32 +03:30
Andrew Kaster
9a66a9ac4a LibWasm: Split SaturatingTruncate conversion function by float/non-float
It's possible to construct a floating point value that when converted to
double is not larger than i64::max(), but when remaining a float is
larger. This patch avoids that edge case with some even less exciting if
constexpr branches to fix a float-cast-overflow UBSAN error on macOS
with llvm 15.0.6.
2022-12-25 07:58:58 -07:00
Linus Groh
d26aabff04 Everywhere: Run clang-format 2022-12-03 23:52:23 +00:00
sin-ack
3f3f45580a Everywhere: Add sv suffix to strings relying on StringView(char const*)
Each of these strings would previously rely on StringView's char const*
constructor overload, which would call __builtin_strlen on the string.
Since we now have operator ""sv, we can replace these with much simpler
versions. This opens the door to being able to remove
StringView(char const*).

No functional changes.
2022-07-12 23:11:35 +02:00
Nick Johnson
08e4a1a4dc AK+Everywhere: Replace __builtin bit functions
In order to reduce our reliance on __builtin_{ffs, clz, ctz, popcount},
this commit removes all calls to these functions and replaces them with
the equivalent functions in AK/BuiltinWrappers.h.
2021-12-21 22:13:51 +01:00
Andreas Kling
6ad427993a Everywhere: Behaviour => Behavior 2021-09-07 13:53:14 +02:00
Ali Mohammad Pur
f492e98f19 LibWasm: Make the Truncate operator trap on undefined results 2021-08-30 22:47:02 +02:00
Ali Mohammad Pur
2c7e2e351a LibWasm: Implement fx.nearest using nearbyint() instead of round()
This instruction wants RoundingMode::ToEven, so let's use the correct
function.
2021-08-30 22:47:02 +02:00
Ali Mohammad Pur
563b402f04 LibWasm: Replace the numeric operation macros with templated functions
This should make debugging and profiling much better, at little to no
runtime cost.
Also moves off the operator definitions to a separate header, so it
should also improve the editing experience quite a bit.
2021-08-12 21:03:53 +02:00