Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[wasm] Add narrow methods to PackedSimd #83084

Merged
merged 2 commits into from
Mar 7, 2023

Conversation

radekdoulik
Copy link
Member

Add them as internal as the approved API contains wrong methods for these. #53730 (comment)

This will allow faster implementation of IndexOfAnyValues for wasm. #82789 (comment)

Add them as internal as the approved API contains wrong methods for
these. dotnet#53730 (comment)

This will allow faster implementation of IndexOfAnyValues for wasm.
dotnet#82789 (comment)
@ghost
Copy link

ghost commented Mar 7, 2023

Tagging subscribers to this area: @dotnet/area-system-runtime-intrinsics
See info in area-owners.md if you want to be subscribed.

Issue Details

Add them as internal as the approved API contains wrong methods for these. #53730 (comment)

This will allow faster implementation of IndexOfAnyValues for wasm. #82789 (comment)

Author: radekdoulik
Assignees: radekdoulik
Labels:

area-System.Runtime.Intrinsics

Milestone: -

@radekdoulik
Copy link
Member Author

radekdoulik commented Mar 7, 2023

As the documentation is a bit unclear (the text and binary format parts could be explained differently about the inputs), I checked the results with this test, running with node. It looks like the inputs are indeed treated as signed integers here.

    static void TestNarrow()
    {
            System.Console.WriteLine($"IsSupported: {PackedSimd.IsSupported}");

            (var v1, var v2, var vns, var vnu) = System.TestPackedSimd.TestNarrow();

            System.Console.WriteLine($"v1: {v1} v2: {v2}");
            System.Console.WriteLine($"vns: {vns} vnu: {vnu}");

            System.Console.WriteLine("signed");
            for (int i=0; i<4; i++) {
                System.Console.WriteLine($" {v1[i],12} [{v1[i]:X8}] --> [{vns[i]:X4}] {vns[i],6}");
            }
            for (int i=0; i<4; i++) {
                System.Console.WriteLine($" {v2[i],12} [{v2[i]:X8}] --> [{vns[i+4]:X4}] {vns[i+4],6}");
            }

            System.Console.WriteLine("unsigned");
            for (int i=0; i<4; i++) {
                System.Console.WriteLine($"  {v1[i],12} [{v1[i]:X8}] --> [{vnu[i]:X4}] {vnu[i],6}");
            }
            for (int i=0; i<4; i++) {
                System.Console.WriteLine($"  {v2[i],12} [{v2[i]:X8}] --> [{vnu[i+4]:X4}] {vnu[i+4],6}");
            }
    }
    [CLSCompliant(false)]
    public partial class TestPackedSimd
    {
        private static int Next()
        {
            return System.Random.Shared.Next(0x3ffff) - 0x1ffff;
        }

        public static (Vector128<int>, Vector128<int>, Vector128<short>, Vector128<ushort>) TestNarrow()
        {
            var v1 = Vector128.Create(Next(), Next(), Next(), Next());
            var v2 = Vector128.Create(Next(), Next(), Next(), Next());

            var vns = PackedSimd.ConvertNarrowingSignedSaturate(v1, v2);
            var vnu = PackedSimd.ConvertNarrowingUnsignedSaturate(v1, v2);

            return (v1, v2, vns, vnu);
        }
    }
  IsSupported: True
  v1: <11742, -35700, -58383, 101864> v2: <83369, -3341, 95004, -111954>
  vns: <11742, -32768, -32768, 32767, 32767, -3341, 32767, -32768> vnu: <11742, 0, 0, 65535, 65535, 0, 65535, 0>
  signed
          11742 [00002DDE] --> [2DDE]  11742
         -35700 [FFFF748C] --> [8000] -32768
         -58383 [FFFF1BF1] --> [8000] -32768
         101864 [00018DE8] --> [7FFF]  32767
          83369 [000145A9] --> [7FFF]  32767
          -3341 [FFFFF2F3] --> [F2F3]  -3341
          95004 [0001731C] --> [7FFF]  32767
        -111954 [FFFE4AAE] --> [8000] -32768
  unsigned
           11742 [00002DDE] --> [2DDE]  11742
          -35700 [FFFF748C] --> [0000]      0
          -58383 [FFFF1BF1] --> [0000]      0
          101864 [00018DE8] --> [FFFF]  65535
           83369 [000145A9] --> [FFFF]  65535
           -3341 [FFFFF2F3] --> [0000]      0
           95004 [0001731C] --> [FFFF]  65535
         -111954 [FFFE4AAE] --> [0000]      0

@radekdoulik
Copy link
Member Author

The relevant code from the test above:

  local.get $3
  local.get $13
  local.get $15
  i16x8.narrow.i32x4.s    [SIMD]
  v128.store offset:96 align:4    [SIMD]
  local.get $3
  local.get $13
  local.get $15
  i16x8.narrow.i32x4.u    [SIMD]
  v128.store offset:112 align:4    [SIMD]

@radekdoulik
Copy link
Member Author

The failing builds are unrelated

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants