Skip to content

Arm VectorTableLookup and VectorTableExtension - Part 2 #81599

Description

@tannergooding

Background and Motivation

We reviewed and approved the variants of these instructions that take 1 input in #1277. As part of that review, we also considered the variants that take 2-4 inputs. However, we did not approve those variants due to open questions around how the JIT could efficiently handle everything and whether it should be exposed as a tuple or custom type.

We're now at a point where we have settled on a design for how the JIT handles this and have opted for using ValueTuple, which we have already successfully done in several other hwintrinsic APIs.

API Proposal

namespace System.Runtime.Intrinsics.Arm;

public partial class AdvSimd
{
    public static Vector64<byte>  VectorTableLookup((Vector128<byte> Row0, Vector128<byte> Row1)  table, Vector64<byte>  byteIndexes);
    public static Vector64<sbyte> VectorTableLookup((Vector128<sbyte> Row0, Vector128<byte> Row1) table, Vector64<sbyte> byteIndexes);

    public static Vector64<byte>  VectorTableLookupExtension(Vector64<byte> defaultValues, (Vector128<byte>  Row0, Vector128<byte>  Row1) table, Vector64<byte>  byteIndexes);
    public static Vector64<sbyte> VectorTableLookupExtension(Vector64<byte> defaultValues, (Vector128<sbyte> Row0, Vector128<sbyte> Row1) table, Vector64<sbyte> byteIndexes);

    public partial class Arm32
    {
        public static Vector64<byte>  VectorTableLookup ((Vector64<byte>  Row0, Vector64<byte>  Row1) table, Vector64<byte> byteIndexes);
        public static Vector64<sbyte> VectorTableLookup ((Vector64<sbyte> Row0, Vector64<sbyte> Row1) table, Vector64<sbyte> byteIndexes);

        public static Vector64<byte>  VectorTableLookup ((Vector64<byte>  Row0, Vector64<byte>  Row1, Vector64<byte>  Row2) table, Vector64<byte> byteIndexes);
        public static Vector64<sbyte> VectorTableLookup ((Vector64<sbyte> Row0, Vector64<sbyte> Row1, Vector64<sbyte> Row2) table, Vector64<sbyte> byteIndexes);

        public static Vector64<byte>  VectorTableLookup ((Vector64<byte>  Row0, Vector64<byte>  Row1, Vector64<byte>  Row2, Vector64<byte>  Row3) table, Vector64<byte> byteIndexes);
        public static Vector64<sbyte> VectorTableLookup ((Vector64<sbyte> Row0, Vector64<sbyte> Row1, Vector64<sbyte> Row2, Vector64<sbyte> Row3) table, Vector64<sbyte> byteIndexes);

        public static Vector64<byte>  VectorTableLookupExtension (Vector64<byte> defaultValues, (Vector64<byte>  Row0, Vector64<byte>  Row1) table, Vector64<byte> byteIndexes);
        public static Vector64<sbyte> VectorTableLookupExtension (Vector64<byte> defaultValues, (Vector64<sbyte> Row0, Vector64<sbyte> Row1) table, Vector64<sbyte> byteIndexes);

        public static Vector64<byte>  VectorTableLookupExtension (Vector64<byte> defaultValues, (Vector64<byte>  Row0, Vector64<byte>  Row1,Vector64<byte>  Row2) table, Vector64<byte> byteIndexes);
        public static Vector64<sbyte> VectorTableLookupExtension (Vector64<byte> defaultValues, (Vector64<sbyte> Row0, Vector64<sbyte> Row1,Vector64<sbyte> Row2) table, Vector64<sbyte> byteIndexes);

        public static Vector64<byte>  VectorTableLookupExtension (Vector64<byte> defaultValues, (Vector64<byte>  Row0, Vector64<byte>  Row1, Vector64<byte> Row2, Vector64<byte>  Row3) table, Vector64<byte> byteIndexes);
        public static Vector64<sbyte> VectorTableLookupExtension (Vector64<byte> defaultValues, (Vector64<sbyte> Row0, Vector64<sbyte> Row1, Vector64<sbyte>Row2, Vector64<sbyte> Row3) table, Vector64<sbyte> byteIndexes);
    }

    public partial class Arm64
    {
        public static Vector64<byte>   VectorTableLookup ((Vector128<byte>  Row0, Vector128<byte>  Row1, Vector128<byte>  Row2) table, Vector64<byte> byteIndexes);
        public static Vector64<sbyte>  VectorTableLookup ((Vector128<sbyte> Row0, Vector128<sbyte> Row1, Vector128<sbyte> Row2) table, Vector64<sbyte> byteIndexes);

        public static Vector64<byte>   VectorTableLookup ((Vector128<byte>  Row0, Vector128<byte>  Row1, Vector128<byte>  Row2, Vector128<byte>  Row3) table, Vector64<byte> byteIndexes);
        public static Vector64<sbyte>  VectorTableLookup ((Vector128<sbyte> Row0, Vector128<sbyte> Row1, Vector128<sbyte> Row2, Vector128<sbyte> Row3) table, Vector64<sbyte> byteIndexes);

        public static Vector128<byte>  VectorTableLookup ((Vector128<byte>  Row0, Vector128<byte>  Row1) table, Vector128<byte> byteIndexes);
        public static Vector128<sbyte> VectorTableLookup ((Vector128<sbyte> Row0, Vector128<sbyte> Row1) table, Vector128<sbyte> byteIndexes);

        public static Vector128<byte>  VectorTableLookup ((Vector128<byte>  Row0, Vector128<byte>  Row1, Vector128<byte>  Row2) table, Vector128<byte> byteIndexes);
        public static Vector128<sbyte> VectorTableLookup ((Vector128<sbyte> Row0, Vector128<sbyte> Row1, Vector128<sbyte> Row2) table, Vector128<sbyte> byteIndexes);

        public static Vector128<byte>  VectorTableLookup ((Vector128<byte>  Row0, Vector128<byte>  Row1, Vector128<byte>  Row2, Vector128<byte>  Row3) table, Vector128<byte> byteIndexes);
        public static Vector128<sbyte> VectorTableLookup ((Vector128<sbyte> Row0, Vector128<sbyte> Row1, Vector128<sbyte> Row2, Vector128<sbyte> Row3) table, Vector128<sbyte> byteIndexes);

        public static Vector64<byte>   VectorTableLookupExtension (Vector64<byte>  defaultValues, (Vector128<byte>  Row0, Vector128<byte>  Row1, Vector128<byte>  Row2) table, Vector64<byte> byteIndexes);
        public static Vector64<sbyte>  VectorTableLookupExtension (Vector64<byte>  defaultValues, (Vector128<sbyte> Row0, Vector128<sbyte> Row1, Vector128<sbyte> Row2) table, Vector64<sbyte> byteIndexes);

        public static Vector64<byte>   VectorTableLookupExtension (Vector64<byte>  defaultValues, (Vector128<byte>  Row0, Vector128<byte>  Row1, Vector128<byte>  Row2, Vector128<byte>  Row3) table, Vector64<byte> byteIndexes);
        public static Vector64<sbyte>  VectorTableLookupExtension (Vector64<byte>  defaultValues, (Vector128<sbyte> Row0, Vector128<sbyte> Row1, Vector128<sbyte> Row2, Vector128<sbyte> Row3) table, Vector64<sbyte> byteIndexes);

        public static Vector128<byte>  VectorTableLookupExtension (Vector128<byte> defaultValues, (Vector128<byte>  Row0, Vector128<byte>  Row1) table, Vector128<byte> byteIndexes);
        public static Vector128<sbyte> VectorTableLookupExtension (Vector128<byte> defaultValues, (Vector128<sbyte> Row0, Vector128<sbyte> Row1) table, Vector128<sbyte> byteIndexes);

        public static Vector128<byte>  VectorTableLookupExtension (Vector128<byte> defaultValues, (Vector128<byte>  Row0, Vector128<byte>  Row1, Vector128<byte>  Row2) table, Vector128<byte> byteIndexes);
        public static Vector128<sbyte> VectorTableLookupExtension (Vector128<byte> defaultValues, (Vector128<sbyte> Row0, Vector128<sbyte> Row1, Vector128<sbyte> Row2) table, Vector128<sbyte> byteIndexes);

        public static Vector128<byte>  VectorTableLookupExtension (Vector128<byte> defaultValues, (Vector128<byte>  Row0, Vector128<byte>  Row1, Vector128<byte>  Row2, Vector128<byte>  Row3) table, Vector128<byte> byteIndexes);
        public static Vector128<sbyte> VectorTableLookupExtension (Vector128<byte> defaultValues, (Vector128<sbyte> Row0, Vector128<sbyte> Row1, Vector128<sbyte> Row2, Vector128<sbyte> Row3) table, Vector128<sbyte> byteIndexes);
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    api-approvedAPI was approved in API review, it can be implementedarea-System.Runtime.IntrinsicsblockingMarks issues that we want to fast track in order to unblock other important work

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions