Skip to content

Commit e366255

Browse files
arm64: Add InterleavingXorEvenOdd & InterleavingXorOddEven (#116525)
* arm64: Add InterleavingXorEvenOdd & InterleavingXorOddEven * Implements #94020 * Remove duplicate functions * Add RWM flag
1 parent 8a2e997 commit e366255

File tree

6 files changed

+249
-0
lines changed

6 files changed

+249
-0
lines changed

src/coreclr/jit/hwintrinsiclistarm64sve.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,8 @@ HARDWARE_INTRINSIC(Sve2, BitwiseClearXor,
322322
HARDWARE_INTRINSIC(Sve2, BitwiseSelect, -1, 3, {INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_sve_bsl, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics)
323323
HARDWARE_INTRINSIC(Sve2, BitwiseSelectLeftInverted, -1, 3, {INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_sve_bsl1n, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics)
324324
HARDWARE_INTRINSIC(Sve2, BitwiseSelectRightInverted, -1, 3, {INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_sve_bsl2n, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics)
325+
HARDWARE_INTRINSIC(Sve2, InterleavingXorEvenOdd, -1, 3, {INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_sve_eorbt, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics)
326+
HARDWARE_INTRINSIC(Sve2, InterleavingXorOddEven, -1, 3, {INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_sve_eortb, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasRMWSemantics)
325327
HARDWARE_INTRINSIC(Sve2, ShiftArithmeticRounded, -1, -1, {INS_sve_srshl, INS_invalid, INS_sve_srshl, INS_invalid, INS_sve_srshl, INS_invalid, INS_sve_srshl, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation)
326328
HARDWARE_INTRINSIC(Sve2, ShiftArithmeticRoundedSaturate, -1, -1, {INS_sve_sqrshl, INS_invalid, INS_sve_sqrshl, INS_invalid, INS_sve_sqrshl, INS_invalid, INS_sve_sqrshl, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation)
327329
HARDWARE_INTRINSIC(Sve2, ShiftArithmeticSaturate, -1, -1, {INS_sve_sqshl, INS_invalid, INS_sve_sqshl, INS_invalid, INS_sve_sqshl, INS_invalid, INS_sve_sqshl, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation)

src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.PlatformNotSupported.cs

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,104 @@ internal Arm64() { }
433433
/// </summary>
434434
public static Vector<ulong> BitwiseSelectRightInverted(Vector<ulong> select, Vector<ulong> left, Vector<ulong> right) { throw new PlatformNotSupportedException(); }
435435

436+
/// Interleaving Xor
437+
438+
/// <summary>
439+
/// svint8_t sveorbt[_s8](svint8_t odd, svint8_t op1, svint8_t op2)
440+
/// EORBT Zd.B, Zn.B, Zm.B
441+
/// </summary>
442+
public static Vector<byte> InterleavingXorEvenOdd(Vector<byte> odd, Vector<byte> left, Vector<byte> right) { throw new PlatformNotSupportedException(); }
443+
444+
/// <summary>
445+
/// svint16_t sveorbt[_s16](svint16_t odd, svint16_t op1, svint16_t op2)
446+
/// EORBT Zd.H, Zn.H, Zm.H
447+
/// </summary>
448+
public static Vector<short> InterleavingXorEvenOdd(Vector<short> odd, Vector<short> left, Vector<short> right) { throw new PlatformNotSupportedException(); }
449+
450+
/// <summary>
451+
/// svint32_t sveorbt[_s32](svint32_t odd, svint32_t op1, svint32_t op2)
452+
/// EORBT Zd.S, Zn.S, Zm.S
453+
/// </summary>
454+
public static Vector<int> InterleavingXorEvenOdd(Vector<int> odd, Vector<int> left, Vector<int> right) { throw new PlatformNotSupportedException(); }
455+
456+
/// <summary>
457+
/// svint64_t sveorbt[_s64](svint64_t odd, svint64_t op1, svint64_t op2)
458+
/// EORBT Zd.D, Zn.D, Zm.D
459+
/// </summary>
460+
public static Vector<long> InterleavingXorEvenOdd(Vector<long> odd, Vector<long> left, Vector<long> right) { throw new PlatformNotSupportedException(); }
461+
462+
/// <summary>
463+
/// svint8_t sveorbt[_s8](svint8_t odd, svint8_t op1, svint8_t op2)
464+
/// EORBT Zd.B, Zn.B, Zm.B
465+
/// </summary>
466+
public static Vector<sbyte> InterleavingXorEvenOdd(Vector<sbyte> odd, Vector<sbyte> left, Vector<sbyte> right) { throw new PlatformNotSupportedException(); }
467+
468+
/// <summary>
469+
/// svint16_t sveorbt[_s16](svint16_t odd, svint16_t op1, svint16_t op2)
470+
/// EORBT Zd.H, Zn.H, Zm.H
471+
/// </summary>
472+
public static Vector<ushort> InterleavingXorEvenOdd(Vector<ushort> odd, Vector<ushort> left, Vector<ushort> right) { throw new PlatformNotSupportedException(); }
473+
474+
/// <summary>
475+
/// svint32_t sveorbt[_s32](svint32_t odd, svint32_t op1, svint32_t op2)
476+
/// EORBT Zd.S, Zn.S, Zm.S
477+
/// </summary>
478+
public static Vector<uint> InterleavingXorEvenOdd(Vector<uint> odd, Vector<uint> left, Vector<uint> right) { throw new PlatformNotSupportedException(); }
479+
480+
/// <summary>
481+
/// svint64_t sveorbt[_s64](svint64_t odd, svint64_t op1, svint64_t op2)
482+
/// EORBT Zd.D, Zn.D, Zm.D
483+
/// </summary>
484+
public static Vector<ulong> InterleavingXorEvenOdd(Vector<ulong> odd, Vector<ulong> left, Vector<ulong> right) { throw new PlatformNotSupportedException(); }
485+
486+
/// <summary>
487+
/// svint8_t sveortb[_s8](svint8_t even, svint8_t op1, svint8_t op2)
488+
/// EORTB Zd.B, Zn.B, Zm.B
489+
/// </summary>
490+
public static Vector<byte> InterleavingXorOddEven(Vector<byte> even, Vector<byte> left, Vector<byte> right) { throw new PlatformNotSupportedException(); }
491+
492+
/// <summary>
493+
/// svint16_t sveortb[_s16](svint16_t even, svint16_t op1, svint16_t op2)
494+
/// EORTB Zd.H, Zn.H, Zm.H
495+
/// </summary>
496+
public static Vector<short> InterleavingXorOddEven(Vector<short> even, Vector<short> left, Vector<short> right) { throw new PlatformNotSupportedException(); }
497+
498+
/// <summary>
499+
/// svint32_t sveortb[_s32](svint32_t even, svint32_t op1, svint32_t op2)
500+
/// EORTB Zd.S, Zn.S, Zm.S
501+
/// </summary>
502+
public static Vector<int> InterleavingXorOddEven(Vector<int> even, Vector<int> left, Vector<int> right) { throw new PlatformNotSupportedException(); }
503+
504+
/// <summary>
505+
/// svint64_t sveortb[_s64](svint64_t even, svint64_t op1, svint64_t op2)
506+
/// EORTB Zd.D, Zn.D, Zm.D
507+
/// </summary>
508+
public static Vector<long> InterleavingXorOddEven(Vector<long> even, Vector<long> left, Vector<long> right) { throw new PlatformNotSupportedException(); }
509+
510+
/// <summary>
511+
/// svint8_t sveortb[_s8](svint8_t even, svint8_t op1, svint8_t op2)
512+
/// EORTB Zd.B, Zn.B, Zm.B
513+
/// </summary>
514+
public static Vector<sbyte> InterleavingXorOddEven(Vector<sbyte> even, Vector<sbyte> left, Vector<sbyte> right) { throw new PlatformNotSupportedException(); }
515+
516+
/// <summary>
517+
/// svint16_t sveortb[_s16](svint16_t even, svint16_t op1, svint16_t op2)
518+
/// EORTB Zd.H, Zn.H, Zm.H
519+
/// </summary>
520+
public static Vector<ushort> InterleavingXorOddEven(Vector<ushort> even, Vector<ushort> left, Vector<ushort> right) { throw new PlatformNotSupportedException(); }
521+
522+
/// <summary>
523+
/// svint32_t sveortb[_s32](svint32_t even, svint32_t op1, svint32_t op2)
524+
/// EORTB Zd.S, Zn.S, Zm.S
525+
/// </summary>
526+
public static Vector<uint> InterleavingXorOddEven(Vector<uint> even, Vector<uint> left, Vector<uint> right) { throw new PlatformNotSupportedException(); }
527+
528+
/// <summary>
529+
/// svint64_t sveortb[_s64](svint64_t even, svint64_t op1, svint64_t op2)
530+
/// EORTB Zd.D, Zn.D, Zm.D
531+
/// </summary>
532+
public static Vector<ulong> InterleavingXorOddEven(Vector<ulong> even, Vector<ulong> left, Vector<ulong> right) { throw new PlatformNotSupportedException(); }
533+
436534

437535
// Rounding shift left
438536

src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve2.cs

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,104 @@ internal Arm64() { }
433433
/// </summary>
434434
public static unsafe Vector<ulong> BitwiseSelectRightInverted(Vector<ulong> select, Vector<ulong> left, Vector<ulong> right) => BitwiseSelectRightInverted(select, left, right);
435435

436+
/// Interleaving Xor
437+
438+
/// <summary>
439+
/// svint8_t sveorbt[_s8](svint8_t odd, svint8_t op1, svint8_t op2)
440+
/// EORBT Zd.B, Zn.B, Zm.B
441+
/// </summary>
442+
public static Vector<byte> InterleavingXorEvenOdd(Vector<byte> odd, Vector<byte> left, Vector<byte> right) => InterleavingXorEvenOdd(odd, left, right);
443+
444+
/// <summary>
445+
/// svint16_t sveorbt[_s16](svint16_t odd, svint16_t op1, svint16_t op2)
446+
/// EORBT Zd.H, Zn.H, Zm.H
447+
/// </summary>
448+
public static Vector<short> InterleavingXorEvenOdd(Vector<short> odd, Vector<short> left, Vector<short> right) => InterleavingXorEvenOdd(odd, left, right);
449+
450+
/// <summary>
451+
/// svint32_t sveorbt[_s32](svint32_t odd, svint32_t op1, svint32_t op2)
452+
/// EORBT Zd.S, Zn.S, Zm.S
453+
/// </summary>
454+
public static Vector<int> InterleavingXorEvenOdd(Vector<int> odd, Vector<int> left, Vector<int> right) => InterleavingXorEvenOdd(odd, left, right);
455+
456+
/// <summary>
457+
/// svint64_t sveorbt[_s64](svint64_t odd, svint64_t op1, svint64_t op2)
458+
/// EORBT Zd.D, Zn.D, Zm.D
459+
/// </summary>
460+
public static Vector<long> InterleavingXorEvenOdd(Vector<long> odd, Vector<long> left, Vector<long> right) => InterleavingXorEvenOdd(odd, left, right);
461+
462+
/// <summary>
463+
/// svint8_t sveorbt[_s8](svint8_t odd, svint8_t op1, svint8_t op2)
464+
/// EORBT Zd.B, Zn.B, Zm.B
465+
/// </summary>
466+
public static Vector<sbyte> InterleavingXorEvenOdd(Vector<sbyte> odd, Vector<sbyte> left, Vector<sbyte> right) => InterleavingXorEvenOdd(odd, left, right);
467+
468+
/// <summary>
469+
/// svint16_t sveorbt[_s16](svint16_t odd, svint16_t op1, svint16_t op2)
470+
/// EORBT Zd.H, Zn.H, Zm.H
471+
/// </summary>
472+
public static Vector<ushort> InterleavingXorEvenOdd(Vector<ushort> odd, Vector<ushort> left, Vector<ushort> right) => InterleavingXorEvenOdd(odd, left, right);
473+
474+
/// <summary>
475+
/// svint32_t sveorbt[_s32](svint32_t odd, svint32_t op1, svint32_t op2)
476+
/// EORBT Zd.S, Zn.S, Zm.S
477+
/// </summary>
478+
public static Vector<uint> InterleavingXorEvenOdd(Vector<uint> odd, Vector<uint> left, Vector<uint> right) => InterleavingXorEvenOdd(odd, left, right);
479+
480+
/// <summary>
481+
/// svint64_t sveorbt[_s64](svint64_t odd, svint64_t op1, svint64_t op2)
482+
/// EORBT Zd.D, Zn.D, Zm.D
483+
/// </summary>
484+
public static Vector<ulong> InterleavingXorEvenOdd(Vector<ulong> odd, Vector<ulong> left, Vector<ulong> right) => InterleavingXorEvenOdd(odd, left, right);
485+
486+
/// <summary>
487+
/// svint8_t sveortb[_s8](svint8_t even, svint8_t op1, svint8_t op2)
488+
/// EORTB Zd.B, Zn.B, Zm.B
489+
/// </summary>
490+
public static Vector<byte> InterleavingXorOddEven(Vector<byte> even, Vector<byte> left, Vector<byte> right) => InterleavingXorOddEven(even, left, right);
491+
492+
/// <summary>
493+
/// svint16_t sveortb[_s16](svint16_t even, svint16_t op1, svint16_t op2)
494+
/// EORTB Zd.H, Zn.H, Zm.H
495+
/// </summary>
496+
public static Vector<short> InterleavingXorOddEven(Vector<short> even, Vector<short> left, Vector<short> right) => InterleavingXorOddEven(even, left, right);
497+
498+
/// <summary>
499+
/// svint32_t sveortb[_s32](svint32_t even, svint32_t op1, svint32_t op2)
500+
/// EORTB Zd.S, Zn.S, Zm.S
501+
/// </summary>
502+
public static Vector<int> InterleavingXorOddEven(Vector<int> even, Vector<int> left, Vector<int> right) => InterleavingXorOddEven(even, left, right);
503+
504+
/// <summary>
505+
/// svint64_t sveortb[_s64](svint64_t even, svint64_t op1, svint64_t op2)
506+
/// EORTB Zd.D, Zn.D, Zm.D
507+
/// </summary>
508+
public static Vector<long> InterleavingXorOddEven(Vector<long> even, Vector<long> left, Vector<long> right) => InterleavingXorOddEven(even, left, right);
509+
510+
/// <summary>
511+
/// svint8_t sveortb[_s8](svint8_t even, svint8_t op1, svint8_t op2)
512+
/// EORTB Zd.B, Zn.B, Zm.B
513+
/// </summary>
514+
public static Vector<sbyte> InterleavingXorOddEven(Vector<sbyte> even, Vector<sbyte> left, Vector<sbyte> right) => InterleavingXorOddEven(even, left, right);
515+
516+
/// <summary>
517+
/// svint16_t sveortb[_s16](svint16_t even, svint16_t op1, svint16_t op2)
518+
/// EORTB Zd.H, Zn.H, Zm.H
519+
/// </summary>
520+
public static Vector<ushort> InterleavingXorOddEven(Vector<ushort> even, Vector<ushort> left, Vector<ushort> right) => InterleavingXorOddEven(even, left, right);
521+
522+
/// <summary>
523+
/// svint32_t sveortb[_s32](svint32_t even, svint32_t op1, svint32_t op2)
524+
/// EORTB Zd.S, Zn.S, Zm.S
525+
/// </summary>
526+
public static Vector<uint> InterleavingXorOddEven(Vector<uint> even, Vector<uint> left, Vector<uint> right) => InterleavingXorOddEven(even, left, right);
527+
528+
/// <summary>
529+
/// svint64_t sveortb[_s64](svint64_t even, svint64_t op1, svint64_t op2)
530+
/// EORTB Zd.D, Zn.D, Zm.D
531+
/// </summary>
532+
public static Vector<ulong> InterleavingXorOddEven(Vector<ulong> even, Vector<ulong> left, Vector<ulong> right) => InterleavingXorOddEven(even, left, right);
533+
436534

437535
// Rounding shift left
438536

src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6148,6 +6148,22 @@ internal Arm64() { }
61486148
public static System.Numerics.Vector<ushort> BitwiseSelectRightInverted(System.Numerics.Vector<ushort> select, System.Numerics.Vector<ushort> left, System.Numerics.Vector<ushort> right) { throw null; }
61496149
public static System.Numerics.Vector<uint> BitwiseSelectRightInverted(System.Numerics.Vector<uint> select, System.Numerics.Vector<uint> left, System.Numerics.Vector<uint> right) { throw null; }
61506150
public static System.Numerics.Vector<ulong> BitwiseSelectRightInverted(System.Numerics.Vector<ulong> select, System.Numerics.Vector<ulong> left, System.Numerics.Vector<ulong> right) { throw null; }
6151+
public static System.Numerics.Vector<byte> InterleavingXorEvenOdd(System.Numerics.Vector<byte> odd, System.Numerics.Vector<byte> left, System.Numerics.Vector<byte> right) { throw null; }
6152+
public static System.Numerics.Vector<short> InterleavingXorEvenOdd(System.Numerics.Vector<short> odd, System.Numerics.Vector<short> left, System.Numerics.Vector<short> right) { throw null; }
6153+
public static System.Numerics.Vector<int> InterleavingXorEvenOdd(System.Numerics.Vector<int> odd, System.Numerics.Vector<int> left, System.Numerics.Vector<int> right) { throw null; }
6154+
public static System.Numerics.Vector<long> InterleavingXorEvenOdd(System.Numerics.Vector<long> odd, System.Numerics.Vector<long> left, System.Numerics.Vector<long> right) { throw null; }
6155+
public static System.Numerics.Vector<sbyte> InterleavingXorEvenOdd(System.Numerics.Vector<sbyte> odd, System.Numerics.Vector<sbyte> left, System.Numerics.Vector<sbyte> right) { throw null; }
6156+
public static System.Numerics.Vector<ushort> InterleavingXorEvenOdd(System.Numerics.Vector<ushort> odd, System.Numerics.Vector<ushort> left, System.Numerics.Vector<ushort> right) { throw null; }
6157+
public static System.Numerics.Vector<uint> InterleavingXorEvenOdd(System.Numerics.Vector<uint> odd, System.Numerics.Vector<uint> left, System.Numerics.Vector<uint> right) { throw null; }
6158+
public static System.Numerics.Vector<ulong> InterleavingXorEvenOdd(System.Numerics.Vector<ulong> odd, System.Numerics.Vector<ulong> left, System.Numerics.Vector<ulong> right) { throw null; }
6159+
public static System.Numerics.Vector<byte> InterleavingXorOddEven(System.Numerics.Vector<byte> even, System.Numerics.Vector<byte> left, System.Numerics.Vector<byte> right) { throw null; }
6160+
public static System.Numerics.Vector<short> InterleavingXorOddEven(System.Numerics.Vector<short> even, System.Numerics.Vector<short> left, System.Numerics.Vector<short> right) { throw null; }
6161+
public static System.Numerics.Vector<int> InterleavingXorOddEven(System.Numerics.Vector<int> even, System.Numerics.Vector<int> left, System.Numerics.Vector<int> right) { throw null; }
6162+
public static System.Numerics.Vector<long> InterleavingXorOddEven(System.Numerics.Vector<long> even, System.Numerics.Vector<long> left, System.Numerics.Vector<long> right) { throw null; }
6163+
public static System.Numerics.Vector<sbyte> InterleavingXorOddEven(System.Numerics.Vector<sbyte> even, System.Numerics.Vector<sbyte> left, System.Numerics.Vector<sbyte> right) { throw null; }
6164+
public static System.Numerics.Vector<ushort> InterleavingXorOddEven(System.Numerics.Vector<ushort> even, System.Numerics.Vector<ushort> left, System.Numerics.Vector<ushort> right) { throw null; }
6165+
public static System.Numerics.Vector<uint> InterleavingXorOddEven(System.Numerics.Vector<uint> even, System.Numerics.Vector<uint> left, System.Numerics.Vector<uint> right) { throw null; }
6166+
public static System.Numerics.Vector<ulong> InterleavingXorOddEven(System.Numerics.Vector<ulong> even, System.Numerics.Vector<ulong> left, System.Numerics.Vector<ulong> right) { throw null; }
61516167
public static System.Numerics.Vector<short> ShiftArithmeticRounded(System.Numerics.Vector<short> value, System.Numerics.Vector<short> count) { throw null; }
61526168
public static System.Numerics.Vector<int> ShiftArithmeticRounded(System.Numerics.Vector<int> value, System.Numerics.Vector<int> count) { throw null; }
61536169
public static System.Numerics.Vector<long> ShiftArithmeticRounded(System.Numerics.Vector<long> value, System.Numerics.Vector<long> count) { throw null; }

0 commit comments

Comments
 (0)