From d0efc9e8743327347721afebcd1dfb4b068bcb23 Mon Sep 17 00:00:00 2001
From: TIHan <lol.tihan@gmail.com>
Date: Tue, 2 Jul 2024 12:54:41 -0700
Subject: [PATCH 01/24] Initial work

---
 src/coreclr/jit/gentree.cpp                   |   4 +-
 src/coreclr/jit/hwintrinsic.cpp               |   1 +
 src/coreclr/jit/hwintrinsiccodegenarm64.cpp   |   1 +
 src/coreclr/jit/hwintrinsiclistarm64sve.h     |   4 +
 .../Arm/Sve.PlatformNotSupported.cs           | 226 +++++++++
 .../src/System/Runtime/Intrinsics/Arm/Sve.cs  | 227 +++++++++
 .../ref/System.Runtime.Intrinsics.cs          |  43 ++
 .../GenerateHWIntrinsicTests_Arm.cs           |  25 +
 .../_SveLoadVectorFirstFaultingTest.template  | 436 ++++++++++++++++++
 9 files changed, 966 insertions(+), 1 deletion(-)
 create mode 100644 src/tests/JIT/HardwareIntrinsics/Arm/Shared/_SveLoadVectorFirstFaultingTest.template

diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp
index 6d3d670b2dc7de..97bad35e7425f0 100644
--- a/src/coreclr/jit/gentree.cpp
+++ b/src/coreclr/jit/gentree.cpp
@@ -27421,6 +27421,7 @@ bool GenTreeHWIntrinsic::OperIsMemoryLoad(GenTree** pAddr) const
             case NI_Sve_LoadVectorByteZeroExtendToUInt16:
             case NI_Sve_LoadVectorByteZeroExtendToUInt32:
             case NI_Sve_LoadVectorByteZeroExtendToUInt64:
+            case NI_Sve_LoadVectorFirstFaulting:
             case NI_Sve_LoadVectorInt16SignExtendToInt32:
             case NI_Sve_LoadVectorInt16SignExtendToInt64:
             case NI_Sve_LoadVectorInt16SignExtendToUInt32:
@@ -27451,6 +27452,7 @@ bool GenTreeHWIntrinsic::OperIsMemoryLoad(GenTree** pAddr) const
 
             case NI_Sve_GatherVector:
             case NI_Sve_GatherVectorByteZeroExtend:
+            case NI_Sve_GatherVectorFirstFaulting:
             case NI_Sve_GatherVectorInt16SignExtend:
             case NI_Sve_GatherVectorInt16WithByteOffsetsSignExtend:
             case NI_Sve_GatherVectorInt32SignExtend:
@@ -27542,7 +27544,7 @@ bool GenTreeHWIntrinsic::OperIsMemoryLoad(GenTree** pAddr) const
     {
 #ifdef TARGET_ARM64
         static_assert_no_msg(
-            AreContiguous(NI_Sve_GatherVector, NI_Sve_GatherVectorByteZeroExtend, NI_Sve_GatherVectorInt16SignExtend,
+            AreContiguous(NI_Sve_GatherVector, NI_Sve_GatherVectorByteZeroExtend, NI_Sve_GatherVectorFirstFaulting, NI_Sve_GatherVectorInt16SignExtend,
                           NI_Sve_GatherVectorInt16WithByteOffsetsSignExtend, NI_Sve_GatherVectorInt32SignExtend,
                           NI_Sve_GatherVectorInt32WithByteOffsetsSignExtend, NI_Sve_GatherVectorSByteSignExtend,
                           NI_Sve_GatherVectorUInt16WithByteOffsetsZeroExtend, NI_Sve_GatherVectorUInt16ZeroExtend,
diff --git a/src/coreclr/jit/hwintrinsic.cpp b/src/coreclr/jit/hwintrinsic.cpp
index 9db2767f507965..784f48035cf2ce 100644
--- a/src/coreclr/jit/hwintrinsic.cpp
+++ b/src/coreclr/jit/hwintrinsic.cpp
@@ -1858,6 +1858,7 @@ GenTree* Compiler::impHWIntrinsic(NamedIntrinsic        intrinsic,
 #elif defined(TARGET_ARM64)
                     case NI_Sve_GatherVector:
                     case NI_Sve_GatherVectorByteZeroExtend:
+                    case NI_Sve_GatherVectorFirstFaulting:
                     case NI_Sve_GatherVectorInt16SignExtend:
                     case NI_Sve_GatherVectorInt16WithByteOffsetsSignExtend:
                     case NI_Sve_GatherVectorInt32SignExtend:
diff --git a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp
index c568a3bad49774..ba7def282493bf 100644
--- a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp
+++ b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp
@@ -1994,6 +1994,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
 
             case NI_Sve_GatherVector:
             case NI_Sve_GatherVectorByteZeroExtend:
+            case NI_Sve_GatherVectorFirstFaulting:
             case NI_Sve_GatherVectorInt16SignExtend:
             case NI_Sve_GatherVectorInt16WithByteOffsetsSignExtend:
             case NI_Sve_GatherVectorInt32SignExtend:
diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h
index 688691124eab6d..244888e1dd39cd 100644
--- a/src/coreclr/jit/hwintrinsiclistarm64sve.h
+++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h
@@ -82,6 +82,7 @@ HARDWARE_INTRINSIC(Sve,           FusedMultiplySubtractBySelectedScalar,
 HARDWARE_INTRINSIC(Sve,           FusedMultiplySubtractNegated,                                     -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_fnmls,      INS_sve_fnmls},   HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_LowMaskedOperation|HW_Flag_FmaIntrinsic|HW_Flag_SpecialCodeGen)
 HARDWARE_INTRINSIC(Sve,           GatherVector,                                                     -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1w,       INS_sve_ld1w,       INS_sve_ld1d,       INS_sve_ld1d,       INS_sve_ld1w,       INS_sve_ld1d},    HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GatherVectorByteZeroExtend,                                       -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1b,       INS_sve_ld1b,       INS_sve_ld1b,       INS_sve_ld1b,       INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
+HARDWARE_INTRINSIC(Sve,           GatherVectorFirstFaulting,                                        -1,      3,      true,  {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ldff1w,     INS_sve_ldff1w,     INS_sve_ldff1d,     INS_sve_ldff1d,     INS_sve_ldff1w,     INS_sve_ldff1d},  HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GatherVectorInt16SignExtend,                                      -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1sh,      INS_sve_ld1sh,      INS_sve_ld1sh,      INS_sve_ld1sh,      INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GatherVectorInt16WithByteOffsetsSignExtend,                       -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1sh,      INS_sve_ld1sh,      INS_sve_ld1sh,      INS_sve_ld1sh,      INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GatherVectorInt32SignExtend,                                      -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1sw,      INS_sve_ld1sw,      INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
@@ -93,6 +94,7 @@ HARDWARE_INTRINSIC(Sve,           GatherVectorUInt32WithByteOffsetsZeroExtend,
 HARDWARE_INTRINSIC(Sve,           GatherVectorUInt32ZeroExtend,                                     -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1w,       INS_sve_ld1w,       INS_sve_ld1w,       INS_sve_ld1w,       INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GatherVectorWithByteOffsets,                                      -1,      3,      true,  {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1w,       INS_sve_ld1w,       INS_sve_ld1d,       INS_sve_ld1d,       INS_sve_ld1w,       INS_sve_ld1d},    HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GetActiveElementCount,                                            -1,      2,      true,  {INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp},    HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_ExplicitMaskedOperation)
+HARDWARE_INTRINSIC(Sve,           GetFfr,                                                           -1,      0,      true,  {INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
 HARDWARE_INTRINSIC(Sve,           InsertIntoShiftedVector,                                          -1,      2,      true,  {INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr},    HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics)
 HARDWARE_INTRINSIC(Sve,           LeadingSignCount,                                                 -1,     -1,      false, {INS_sve_cls,        INS_invalid,        INS_sve_cls,        INS_invalid,        INS_sve_cls,        INS_invalid,        INS_sve_cls,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           LeadingZeroCount,                                                 -1,     -1,      false, {INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
@@ -113,6 +115,7 @@ HARDWARE_INTRINSIC(Sve,           LoadVectorByteZeroExtendToInt64,
 HARDWARE_INTRINSIC(Sve,           LoadVectorByteZeroExtendToUInt16,                                 -1,      2,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1b,       INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           LoadVectorByteZeroExtendToUInt32,                                 -1,      2,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1b,       INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           LoadVectorByteZeroExtendToUInt64,                                 -1,      2,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1b,       INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
+HARDWARE_INTRINSIC(Sve,           LoadVectorFirstFaulting,                                          -1,      2,      true,  {INS_sve_ldff1b,     INS_sve_ldff1b,     INS_sve_ldff1h,     INS_sve_ldff1h,     INS_sve_ldff1w,     INS_sve_ldff1w,     INS_sve_ldff1d,     INS_sve_ldff1d,     INS_sve_ldff1w,     INS_sve_ldff1d},  HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           LoadVectorInt16NonFaultingSignExtendToInt32,                      -1,      -1,     false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ldnf1sh,    INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           LoadVectorInt16NonFaultingSignExtendToInt64,                      -1,      -1,     false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ldnf1sh,    INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           LoadVectorInt16NonFaultingSignExtendToUInt32,                     -1,      -1,     false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ldnf1sh,    INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
@@ -199,6 +202,7 @@ HARDWARE_INTRINSIC(Sve,           SaturatingIncrementBy64BitElementCount,
 HARDWARE_INTRINSIC(Sve,           SaturatingIncrementBy8BitElementCount,                             0,      3,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_sqincb,     INS_sve_uqincb,     INS_sve_sqincb,     INS_sve_uqincb,     INS_invalid,        INS_invalid},     HW_Category_Scalar,                HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_HasEnumOperand|HW_Flag_SpecialCodeGen|HW_Flag_SpecialImport|HW_Flag_HasRMWSemantics)
 HARDWARE_INTRINSIC(Sve,           SaturatingIncrementByActiveElementCount,                          -1,      2,      true,  {INS_invalid,        INS_sve_sqincp,     INS_sve_sqincp,     INS_sve_sqincp,     INS_sve_sqincp,     INS_sve_sqincp,     INS_sve_sqincp,     INS_sve_sqincp,     INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_SpecialImport|HW_Flag_BaseTypeFromSecondArg|HW_Flag_HasRMWSemantics)
 HARDWARE_INTRINSIC(Sve,           Scale,                                                            -1,      -1,     false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_fscale,     INS_sve_fscale},  HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasRMWSemantics)
+HARDWARE_INTRINSIC(Sve,           SetFfr,                                                           -1,      1,      true,  {INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           ShiftLeftLogical,                                                 -1,      -1,     false, {INS_sve_lsl,        INS_sve_lsl,        INS_sve_lsl,        INS_sve_lsl,        INS_sve_lsl,        INS_sve_lsl,        INS_sve_lsl,        INS_sve_lsl,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasRMWSemantics)
 HARDWARE_INTRINSIC(Sve,           ShiftRightArithmetic,                                             -1,      -1,     false, {INS_sve_asr,        INS_invalid,        INS_sve_asr,        INS_invalid,        INS_sve_asr,        INS_invalid,        INS_sve_asr,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasRMWSemantics)
 HARDWARE_INTRINSIC(Sve,           ShiftRightLogical,                                                -1,      -1,     false, {INS_invalid,        INS_sve_lsr,        INS_invalid,        INS_sve_lsr,        INS_invalid,        INS_sve_lsr,        INS_invalid,        INS_sve_lsr,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasRMWSemantics)
diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs
index 371da71f844edc..54e8ad9846c94a 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs
@@ -1939,6 +1939,115 @@ internal Arm64() { }
         public static unsafe Vector<ulong> GatherVectorByteZeroExtend(Vector<ulong> mask, byte* address, Vector<ulong> indices) { throw new PlatformNotSupportedException(); }
 
 
+        /// <summary>
+        /// svfloat64_t svldff1_gather_[s64]index[_f64](svbool_t pg, const float64_t *base, svint64_t indices)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zindices.D, LSL #3]
+        /// </summary>
+        public static unsafe Vector<double> GatherVectorFirstFaulting(Vector<double> mask, double* address, Vector<long> indices) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svfloat64_t svldff1_gather[_u64base]_f64(svbool_t pg, svuint64_t bases)
+        ///   LDFF1D Zresult.D, Pg/Z, [Zbases.D, #0]
+        /// </summary>
+        public static unsafe Vector<double> GatherVectorFirstFaulting(Vector<double> mask, Vector<ulong> addresses) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svfloat64_t svldff1_gather_[u64]index[_f64](svbool_t pg, const float64_t *base, svuint64_t indices)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zindices.D, LSL #3]
+        /// </summary>
+        public static unsafe Vector<double> GatherVectorFirstFaulting(Vector<double> mask, double* address, Vector<ulong> indices) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svint32_t svldff1_gather[_u32base]_s32(svbool_t pg, svuint32_t bases)
+        ///   LDFF1W Zresult.S, Pg/Z, [Zbases.S, #0]
+        /// </summary>
+        public static unsafe Vector<int> GatherVectorFirstFaulting(Vector<int> mask, Vector<uint> addresses) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svint32_t svldff1_gather_[s32]index[_s32](svbool_t pg, const int32_t *base, svint32_t indices)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zindices.S, SXTW #2]
+        /// </summary>
+        public static unsafe Vector<int> GatherVectorFirstFaulting(Vector<int> mask, int* address, Vector<int> indices) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svint32_t svldff1_gather_[u32]index[_s32](svbool_t pg, const int32_t *base, svuint32_t indices)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zindices.S, UXTW #2]
+        /// </summary>
+        public static unsafe Vector<int> GatherVectorFirstFaulting(Vector<int> mask, int* address, Vector<uint> indices) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svint64_t svldff1_gather[_u64base]_s64(svbool_t pg, svuint64_t bases)
+        ///   LDFF1D Zresult.D, Pg/Z, [Zbases.D, #0]
+        /// </summary>
+        public static unsafe Vector<long> GatherVectorFirstFaulting(Vector<long> mask, Vector<ulong> addresses) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svint64_t svldff1_gather_[s64]index[_s64](svbool_t pg, const int64_t *base, svint64_t indices)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zindices.D, LSL #3]
+        /// </summary>
+        public static unsafe Vector<long> GatherVectorFirstFaulting(Vector<long> mask, long* address, Vector<long> indices) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svint64_t svldff1_gather_[u64]index[_s64](svbool_t pg, const int64_t *base, svuint64_t indices)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zindices.D, LSL #3]
+        /// </summary>
+        public static unsafe Vector<long> GatherVectorFirstFaulting(Vector<long> mask, long* address, Vector<ulong> indices) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svfloat32_t svldff1_gather_[s32]index[_f32](svbool_t pg, const float32_t *base, svint32_t indices)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zindices.S, SXTW #2]
+        /// </summary>
+        public static unsafe Vector<float> GatherVectorFirstFaulting(Vector<float> mask, float* address, Vector<int> indices) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svfloat32_t svldff1_gather[_u32base]_f32(svbool_t pg, svuint32_t bases)
+        ///   LDFF1W Zresult.S, Pg/Z, [Zbases.S, #0]
+        /// </summary>
+        public static unsafe Vector<float> GatherVectorFirstFaulting(Vector<float> mask, Vector<uint> addresses) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svfloat32_t svldff1_gather_[u32]index[_f32](svbool_t pg, const float32_t *base, svuint32_t indices)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zindices.S, UXTW #2]
+        /// </summary>
+        public static unsafe Vector<float> GatherVectorFirstFaulting(Vector<float> mask, float* address, Vector<uint> indices) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svuint32_t svldff1_gather[_u32base]_u32(svbool_t pg, svuint32_t bases)
+        ///   LDFF1W Zresult.S, Pg/Z, [Zbases.S, #0]
+        /// </summary>
+        public static unsafe Vector<uint> GatherVectorFirstFaulting(Vector<uint> mask, Vector<uint> addresses) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svuint32_t svldff1_gather_[s32]index[_u32](svbool_t pg, const uint32_t *base, svint32_t indices)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zindices.S, SXTW #2]
+        /// </summary>
+        public static unsafe Vector<uint> GatherVectorFirstFaulting(Vector<uint> mask, uint* address, Vector<int> indices) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svuint32_t svldff1_gather_[u32]index[_u32](svbool_t pg, const uint32_t *base, svuint32_t indices)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zindices.S, UXTW #2]
+        /// </summary>
+        public static unsafe Vector<uint> GatherVectorFirstFaulting(Vector<uint> mask, uint* address, Vector<uint> indices) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svuint64_t svldff1_gather[_u64base]_u64(svbool_t pg, svuint64_t bases)
+        ///   LDFF1D Zresult.D, Pg/Z, [Zbases.D, #0]
+        /// </summary>
+        public static unsafe Vector<ulong> GatherVectorFirstFaulting(Vector<ulong> mask, Vector<ulong> addresses) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svuint64_t svldff1_gather_[s64]index[_u64](svbool_t pg, const uint64_t *base, svint64_t indices)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zindices.D, LSL #3]
+        /// </summary>
+        public static unsafe Vector<ulong> GatherVectorFirstFaulting(Vector<ulong> mask, ulong* address, Vector<long> indices) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svuint64_t svldff1_gather_[u64]index[_u64](svbool_t pg, const uint64_t *base, svuint64_t indices)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zindices.D, LSL #3]
+        /// </summary>
+        public static unsafe Vector<ulong> GatherVectorFirstFaulting(Vector<ulong> mask, ulong* address, Vector<ulong> indices) { throw new PlatformNotSupportedException(); }
+
+
         ///  Load 16-bit data and sign-extend
 
         /// <summary>
@@ -2604,6 +2713,13 @@ internal Arm64() { }
         public static unsafe ulong GetActiveElementCount(Vector<ulong> mask, Vector<ulong> from) { throw new PlatformNotSupportedException(); }
 
 
+        /// <summary>
+        /// svbool_t svrdffr()
+        ///   RDFFR Presult.B
+        /// </summary>
+        public static unsafe Vector<byte> GetFfr() { throw new PlatformNotSupportedException(); }
+
+
         ///  Insert scalar into shifted vector
 
         /// <summary>
@@ -3089,6 +3205,67 @@ internal Arm64() { }
         public static unsafe Vector<ulong> LoadVectorByteZeroExtendToUInt64(Vector<ulong> mask, byte* address) { throw new PlatformNotSupportedException(); }
 
 
+        /// <summary>
+        /// svuint8_t svldff1[_u8](svbool_t pg, const uint8_t *base)
+        ///   LDFF1B Zresult.B, Pg/Z, [Xbase, XZR]
+        /// </summary>
+        public static unsafe Vector<byte> LoadVectorFirstFaulting(Vector<byte> mask, byte* address) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svfloat64_t svldff1[_f64](svbool_t pg, const float64_t *base)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, XZR, LSL #3]
+        /// </summary>
+        public static unsafe Vector<double> LoadVectorFirstFaulting(Vector<double> mask, double* address) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svint16_t svldff1[_s16](svbool_t pg, const int16_t *base)
+        ///   LDFF1H Zresult.H, Pg/Z, [Xbase, XZR, LSL #1]
+        /// </summary>
+        public static unsafe Vector<short> LoadVectorFirstFaulting(Vector<short> mask, short* address) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svint32_t svldff1[_s32](svbool_t pg, const int32_t *base)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, XZR, LSL #2]
+        /// </summary>
+        public static unsafe Vector<int> LoadVectorFirstFaulting(Vector<int> mask, int* address) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svint64_t svldff1[_s64](svbool_t pg, const int64_t *base)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, XZR, LSL #3]
+        /// </summary>
+        public static unsafe Vector<long> LoadVectorFirstFaulting(Vector<long> mask, long* address) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svint8_t svldff1[_s8](svbool_t pg, const int8_t *base)
+        ///   LDFF1B Zresult.B, Pg/Z, [Xbase, XZR]
+        /// </summary>
+        public static unsafe Vector<sbyte> LoadVectorFirstFaulting(Vector<sbyte> mask, sbyte* address) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svfloat32_t svldff1[_f32](svbool_t pg, const float32_t *base)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, XZR, LSL #2]
+        /// </summary>
+        public static unsafe Vector<float> LoadVectorFirstFaulting(Vector<float> mask, float* address) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svuint16_t svldff1[_u16](svbool_t pg, const uint16_t *base)
+        ///   LDFF1H Zresult.H, Pg/Z, [Xbase, XZR, LSL #1]
+        /// </summary>
+        public static unsafe Vector<ushort> LoadVectorFirstFaulting(Vector<ushort> mask, ushort* address) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svuint32_t svldff1[_u32](svbool_t pg, const uint32_t *base)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, XZR, LSL #2]
+        /// </summary>
+        public static unsafe Vector<uint> LoadVectorFirstFaulting(Vector<uint> mask, uint* address) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svuint64_t svldff1[_u64](svbool_t pg, const uint64_t *base)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, XZR, LSL #3]
+        /// </summary>
+        public static unsafe Vector<ulong> LoadVectorFirstFaulting(Vector<ulong> mask, ulong* address) { throw new PlatformNotSupportedException(); }
+
+
         ///  LoadVectorInt16SignExtendToInt32 : Load 16-bit data and sign-extend
 
         /// <summary>
@@ -5654,6 +5831,55 @@ internal Arm64() { }
         public static unsafe Vector<float> Scale(Vector<float> left, Vector<int> right) { throw new PlatformNotSupportedException(); }
 
 
+        /// <summary>
+        /// void svwrffr(svbool_t op)
+        ///   WRFFR Pop.B
+        /// </summary>
+        public static unsafe void SetFfr(Vector<byte> value) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// void svwrffr(svbool_t op)
+        ///   WRFFR Pop.B
+        /// </summary>
+        public static unsafe void SetFfr(Vector<short> value) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// void svwrffr(svbool_t op)
+        ///   WRFFR Pop.B
+        /// </summary>
+        public static unsafe void SetFfr(Vector<int> value) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// void svwrffr(svbool_t op)
+        ///   WRFFR Pop.B
+        /// </summary>
+        public static unsafe void SetFfr(Vector<long> value) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// void svwrffr(svbool_t op)
+        ///   WRFFR Pop.B
+        /// </summary>
+        public static unsafe void SetFfr(Vector<sbyte> value) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// void svwrffr(svbool_t op)
+        ///   WRFFR Pop.B
+        /// </summary>
+        public static unsafe void SetFfr(Vector<ushort> value) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// void svwrffr(svbool_t op)
+        ///   WRFFR Pop.B
+        /// </summary>
+        public static unsafe void SetFfr(Vector<uint> value) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// void svwrffr(svbool_t op)
+        ///   WRFFR Pop.B
+        /// </summary>
+        public static unsafe void SetFfr(Vector<ulong> value) { throw new PlatformNotSupportedException(); }
+
+
         ///  Logical shift left
 
         /// <summary>
diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs
index 39d8dde224aa9d..be3b4cc81af9ca 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs
@@ -1996,6 +1996,116 @@ internal Arm64() { }
         /// </summary>
         public static unsafe Vector<ulong> GatherVectorByteZeroExtend(Vector<ulong> mask, byte* address, Vector<ulong> indices) => GatherVectorByteZeroExtend(mask, address, indices);
 
+
+        /// <summary>
+        /// svfloat64_t svldff1_gather_[s64]index[_f64](svbool_t pg, const float64_t *base, svint64_t indices)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zindices.D, LSL #3]
+        /// </summary>
+        public static unsafe Vector<double> GatherVectorFirstFaulting(Vector<double> mask, double* address, Vector<long> indices) => GatherVectorFirstFaulting(mask, address, indices);
+
+        /// <summary>
+        /// svfloat64_t svldff1_gather[_u64base]_f64(svbool_t pg, svuint64_t bases)
+        ///   LDFF1D Zresult.D, Pg/Z, [Zbases.D, #0]
+        /// </summary>
+        public static unsafe Vector<double> GatherVectorFirstFaulting(Vector<double> mask, Vector<ulong> addresses) => GatherVectorFirstFaulting(mask, addresses);
+
+        /// <summary>
+        /// svfloat64_t svldff1_gather_[u64]index[_f64](svbool_t pg, const float64_t *base, svuint64_t indices)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zindices.D, LSL #3]
+        /// </summary>
+        public static unsafe Vector<double> GatherVectorFirstFaulting(Vector<double> mask, double* address, Vector<ulong> indices) => GatherVectorFirstFaulting(mask, address, indices);
+
+        /// <summary>
+        /// svint32_t svldff1_gather[_u32base]_s32(svbool_t pg, svuint32_t bases)
+        ///   LDFF1W Zresult.S, Pg/Z, [Zbases.S, #0]
+        /// </summary>
+        public static unsafe Vector<int> GatherVectorFirstFaulting(Vector<int> mask, Vector<uint> addresses) => GatherVectorFirstFaulting(mask, addresses);
+
+        /// <summary>
+        /// svint32_t svldff1_gather_[s32]index[_s32](svbool_t pg, const int32_t *base, svint32_t indices)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zindices.S, SXTW #2]
+        /// </summary>
+        public static unsafe Vector<int> GatherVectorFirstFaulting(Vector<int> mask, int* address, Vector<int> indices) => GatherVectorFirstFaulting(mask, address, indices);
+
+        /// <summary>
+        /// svint32_t svldff1_gather_[u32]index[_s32](svbool_t pg, const int32_t *base, svuint32_t indices)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zindices.S, UXTW #2]
+        /// </summary>
+        public static unsafe Vector<int> GatherVectorFirstFaulting(Vector<int> mask, int* address, Vector<uint> indices) => GatherVectorFirstFaulting(mask, address, indices);
+
+        /// <summary>
+        /// svint64_t svldff1_gather[_u64base]_s64(svbool_t pg, svuint64_t bases)
+        ///   LDFF1D Zresult.D, Pg/Z, [Zbases.D, #0]
+        /// </summary>
+        public static unsafe Vector<long> GatherVectorFirstFaulting(Vector<long> mask, Vector<ulong> addresses) => GatherVectorFirstFaulting(mask, addresses);
+
+        /// <summary>
+        /// svint64_t svldff1_gather_[s64]index[_s64](svbool_t pg, const int64_t *base, svint64_t indices)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zindices.D, LSL #3]
+        /// </summary>
+        public static unsafe Vector<long> GatherVectorFirstFaulting(Vector<long> mask, long* address, Vector<long> indices) => GatherVectorFirstFaulting(mask, address, indices);
+
+        /// <summary>
+        /// svint64_t svldff1_gather_[u64]index[_s64](svbool_t pg, const int64_t *base, svuint64_t indices)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zindices.D, LSL #3]
+        /// </summary>
+        public static unsafe Vector<long> GatherVectorFirstFaulting(Vector<long> mask, long* address, Vector<ulong> indices) => GatherVectorFirstFaulting(mask, address, indices);
+
+        /// <summary>
+        /// svfloat32_t svldff1_gather_[s32]index[_f32](svbool_t pg, const float32_t *base, svint32_t indices)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zindices.S, SXTW #2]
+        /// </summary>
+        public static unsafe Vector<float> GatherVectorFirstFaulting(Vector<float> mask, float* address, Vector<int> indices) => GatherVectorFirstFaulting(mask, address, indices);
+
+        /// <summary>
+        /// svfloat32_t svldff1_gather[_u32base]_f32(svbool_t pg, svuint32_t bases)
+        ///   LDFF1W Zresult.S, Pg/Z, [Zbases.S, #0]
+        /// </summary>
+        public static unsafe Vector<float> GatherVectorFirstFaulting(Vector<float> mask, Vector<uint> addresses) => GatherVectorFirstFaulting(mask, addresses);
+
+        /// <summary>
+        /// svfloat32_t svldff1_gather_[u32]index[_f32](svbool_t pg, const float32_t *base, svuint32_t indices)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zindices.S, UXTW #2]
+        /// </summary>
+        public static unsafe Vector<float> GatherVectorFirstFaulting(Vector<float> mask, float* address, Vector<uint> indices) => GatherVectorFirstFaulting(mask, address, indices);
+
+        /// <summary>
+        /// svuint32_t svldff1_gather[_u32base]_u32(svbool_t pg, svuint32_t bases)
+        ///   LDFF1W Zresult.S, Pg/Z, [Zbases.S, #0]
+        /// </summary>
+        public static unsafe Vector<uint> GatherVectorFirstFaulting(Vector<uint> mask, Vector<uint> addresses) => GatherVectorFirstFaulting(mask, addresses);
+
+        /// <summary>
+        /// svuint32_t svldff1_gather_[s32]index[_u32](svbool_t pg, const uint32_t *base, svint32_t indices)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zindices.S, SXTW #2]
+        /// </summary>
+        public static unsafe Vector<uint> GatherVectorFirstFaulting(Vector<uint> mask, uint* address, Vector<int> indices) => GatherVectorFirstFaulting(mask, address, indices);
+
+        /// <summary>
+        /// svuint32_t svldff1_gather_[u32]index[_u32](svbool_t pg, const uint32_t *base, svuint32_t indices)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zindices.S, UXTW #2]
+        /// </summary>
+        public static unsafe Vector<uint> GatherVectorFirstFaulting(Vector<uint> mask, uint* address, Vector<uint> indices) => GatherVectorFirstFaulting(mask, address, indices);
+
+        /// <summary>
+        /// svuint64_t svldff1_gather[_u64base]_u64(svbool_t pg, svuint64_t bases)
+        ///   LDFF1D Zresult.D, Pg/Z, [Zbases.D, #0]
+        /// </summary>
+        public static unsafe Vector<ulong> GatherVectorFirstFaulting(Vector<ulong> mask, Vector<ulong> addresses) => GatherVectorFirstFaulting(mask, addresses);
+
+        /// <summary>
+        /// svuint64_t svldff1_gather_[s64]index[_u64](svbool_t pg, const uint64_t *base, svint64_t indices)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zindices.D, LSL #3]
+        /// </summary>
+        public static unsafe Vector<ulong> GatherVectorFirstFaulting(Vector<ulong> mask, ulong* address, Vector<long> indices) => GatherVectorFirstFaulting(mask, address, indices);
+
+        /// <summary>
+        /// svuint64_t svldff1_gather_[u64]index[_u64](svbool_t pg, const uint64_t *base, svuint64_t indices)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zindices.D, LSL #3]
+        /// </summary>
+        public static unsafe Vector<ulong> GatherVectorFirstFaulting(Vector<ulong> mask, ulong* address, Vector<ulong> indices) => GatherVectorFirstFaulting(mask, address, indices);
+
+
         ///  Load 16-bit data and sign-extend
 
         /// <summary>
@@ -2661,6 +2771,13 @@ internal Arm64() { }
         public static unsafe ulong GetActiveElementCount(Vector<ulong> mask, Vector<ulong> from) => GetActiveElementCount(mask, from);
 
 
+        /// <summary>
+        /// svbool_t svrdffr()
+        ///   RDFFR Presult.B
+        /// </summary>
+        public static unsafe Vector<byte> GetFfr() => GetFfr();
+
+
         ///  Insert scalar into shifted vector
 
         /// <summary>
@@ -3145,6 +3262,67 @@ internal Arm64() { }
         public static unsafe Vector<ulong> LoadVectorByteZeroExtendToUInt64(Vector<ulong> mask, byte* address) => LoadVectorByteZeroExtendToUInt64(mask, address);
 
 
+        /// <summary>
+        /// svuint8_t svldff1[_u8](svbool_t pg, const uint8_t *base)
+        ///   LDFF1B Zresult.B, Pg/Z, [Xbase, XZR]
+        /// </summary>
+        public static unsafe Vector<byte> LoadVectorFirstFaulting(Vector<byte> mask, byte* address) => LoadVectorFirstFaulting(mask, address);
+
+        /// <summary>
+        /// svfloat64_t svldff1[_f64](svbool_t pg, const float64_t *base)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, XZR, LSL #3]
+        /// </summary>
+        public static unsafe Vector<double> LoadVectorFirstFaulting(Vector<double> mask, double* address) => LoadVectorFirstFaulting(mask, address);
+
+        /// <summary>
+        /// svint16_t svldff1[_s16](svbool_t pg, const int16_t *base)
+        ///   LDFF1H Zresult.H, Pg/Z, [Xbase, XZR, LSL #1]
+        /// </summary>
+        public static unsafe Vector<short> LoadVectorFirstFaulting(Vector<short> mask, short* address) => LoadVectorFirstFaulting(mask, address);
+
+        /// <summary>
+        /// svint32_t svldff1[_s32](svbool_t pg, const int32_t *base)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, XZR, LSL #2]
+        /// </summary>
+        public static unsafe Vector<int> LoadVectorFirstFaulting(Vector<int> mask, int* address) => LoadVectorFirstFaulting(mask, address);
+
+        /// <summary>
+        /// svint64_t svldff1[_s64](svbool_t pg, const int64_t *base)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, XZR, LSL #3]
+        /// </summary>
+        public static unsafe Vector<long> LoadVectorFirstFaulting(Vector<long> mask, long* address) => LoadVectorFirstFaulting(mask, address);
+
+        /// <summary>
+        /// svint8_t svldff1[_s8](svbool_t pg, const int8_t *base)
+        ///   LDFF1B Zresult.B, Pg/Z, [Xbase, XZR]
+        /// </summary>
+        public static unsafe Vector<sbyte> LoadVectorFirstFaulting(Vector<sbyte> mask, sbyte* address) => LoadVectorFirstFaulting(mask, address);
+
+        /// <summary>
+        /// svfloat32_t svldff1[_f32](svbool_t pg, const float32_t *base)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, XZR, LSL #2]
+        /// </summary>
+        public static unsafe Vector<float> LoadVectorFirstFaulting(Vector<float> mask, float* address) => LoadVectorFirstFaulting(mask, address);
+
+        /// <summary>
+        /// svuint16_t svldff1[_u16](svbool_t pg, const uint16_t *base)
+        ///   LDFF1H Zresult.H, Pg/Z, [Xbase, XZR, LSL #1]
+        /// </summary>
+        public static unsafe Vector<ushort> LoadVectorFirstFaulting(Vector<ushort> mask, ushort* address) => LoadVectorFirstFaulting(mask, address);
+
+        /// <summary>
+        /// svuint32_t svldff1[_u32](svbool_t pg, const uint32_t *base)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, XZR, LSL #2]
+        /// </summary>
+        public static unsafe Vector<uint> LoadVectorFirstFaulting(Vector<uint> mask, uint* address) => LoadVectorFirstFaulting(mask, address);
+
+        /// <summary>
+        /// svuint64_t svldff1[_u64](svbool_t pg, const uint64_t *base)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, XZR, LSL #3]
+        /// </summary>
+        public static unsafe Vector<ulong> LoadVectorFirstFaulting(Vector<ulong> mask, ulong* address) => LoadVectorFirstFaulting(mask, address);
+
+
         ///  LoadVectorInt16SignExtendToInt32 : Load 16-bit data and sign-extend
 
         /// <summary>
@@ -5698,6 +5876,55 @@ internal Arm64() { }
         public static unsafe Vector<float> Scale(Vector<float> left, Vector<int> right) => Scale(left, right);
 
 
+        /// <summary>
+        /// void svwrffr(svbool_t op)
+        ///   WRFFR Pop.B
+        /// </summary>
+        public static unsafe void SetFfr(Vector<byte> value) => SetFfr(value);
+
+        /// <summary>
+        /// void svwrffr(svbool_t op)
+        ///   WRFFR Pop.B
+        /// </summary>
+        public static unsafe void SetFfr(Vector<short> value) => SetFfr(value);
+
+        /// <summary>
+        /// void svwrffr(svbool_t op)
+        ///   WRFFR Pop.B
+        /// </summary>
+        public static unsafe void SetFfr(Vector<int> value) => SetFfr(value);
+
+        /// <summary>
+        /// void svwrffr(svbool_t op)
+        ///   WRFFR Pop.B
+        /// </summary>
+        public static unsafe void SetFfr(Vector<long> value) => SetFfr(value);
+
+        /// <summary>
+        /// void svwrffr(svbool_t op)
+        ///   WRFFR Pop.B
+        /// </summary>
+        public static unsafe void SetFfr(Vector<sbyte> value) => SetFfr(value);
+
+        /// <summary>
+        /// void svwrffr(svbool_t op)
+        ///   WRFFR Pop.B
+        /// </summary>
+        public static unsafe void SetFfr(Vector<ushort> value) => SetFfr(value);
+
+        /// <summary>
+        /// void svwrffr(svbool_t op)
+        ///   WRFFR Pop.B
+        /// </summary>
+        public static unsafe void SetFfr(Vector<uint> value) => SetFfr(value);
+
+        /// <summary>
+        /// void svwrffr(svbool_t op)
+        ///   WRFFR Pop.B
+        /// </summary>
+        public static unsafe void SetFfr(Vector<ulong> value) => SetFfr(value);
+
+
         ///  Logical shift left
 
         /// <summary>
diff --git a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs
index 1904b956195d07..9d369c6761bc30 100644
--- a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs
+++ b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs
@@ -4475,6 +4475,26 @@ internal Arm64() { }
         public static unsafe System.Numerics.Vector<ulong> GatherVectorByteZeroExtend(System.Numerics.Vector<ulong> mask, byte* address, System.Numerics.Vector<long> indices) { throw null; }
         public static System.Numerics.Vector<ulong> GatherVectorByteZeroExtend(System.Numerics.Vector<ulong> mask, System.Numerics.Vector<ulong> addresses) { throw null; }
         public static unsafe System.Numerics.Vector<ulong> GatherVectorByteZeroExtend(System.Numerics.Vector<ulong> mask, byte* address, System.Numerics.Vector<ulong> indices) { throw null; }
+
+        public static unsafe System.Numerics.Vector<double> GatherVectorFirstFaulting(System.Numerics.Vector<double> mask, double* address, System.Numerics.Vector<long> indices) { throw null; }
+        public static unsafe System.Numerics.Vector<double> GatherVectorFirstFaulting(System.Numerics.Vector<double> mask, System.Numerics.Vector<ulong> addresses) { throw null; }
+        public static unsafe System.Numerics.Vector<double> GatherVectorFirstFaulting(System.Numerics.Vector<double> mask, double* address, System.Numerics.Vector<ulong> indices) { throw null; }
+        public static unsafe System.Numerics.Vector<int> GatherVectorFirstFaulting(System.Numerics.Vector<int> mask, System.Numerics.Vector<uint> addresses) { throw null; }
+        public static unsafe System.Numerics.Vector<int> GatherVectorFirstFaulting(System.Numerics.Vector<int> mask, int* address, System.Numerics.Vector<int> indices) { throw null; }
+        public static unsafe System.Numerics.Vector<int> GatherVectorFirstFaulting(System.Numerics.Vector<int> mask, int* address, System.Numerics.Vector<uint> indices) { throw null; }
+        public static unsafe System.Numerics.Vector<long> GatherVectorFirstFaulting(System.Numerics.Vector<long> mask, System.Numerics.Vector<ulong> addresses) { throw null; }
+        public static unsafe System.Numerics.Vector<long> GatherVectorFirstFaulting(System.Numerics.Vector<long> mask, long* address, System.Numerics.Vector<long> indices) { throw null; }
+        public static unsafe System.Numerics.Vector<long> GatherVectorFirstFaulting(System.Numerics.Vector<long> mask, long* address, System.Numerics.Vector<ulong> indices) { throw null; }
+        public static unsafe System.Numerics.Vector<float> GatherVectorFirstFaulting(System.Numerics.Vector<float> mask, float* address, System.Numerics.Vector<int> indices) { throw null; }
+        public static unsafe System.Numerics.Vector<float> GatherVectorFirstFaulting(System.Numerics.Vector<float> mask, System.Numerics.Vector<uint> addresses) { throw null; }
+        public static unsafe System.Numerics.Vector<float> GatherVectorFirstFaulting(System.Numerics.Vector<float> mask, float* address, System.Numerics.Vector<uint> indices) { throw null; }
+        public static unsafe System.Numerics.Vector<uint> GatherVectorFirstFaulting(System.Numerics.Vector<uint> mask, System.Numerics.Vector<uint> addresses) { throw null; }
+        public static unsafe System.Numerics.Vector<uint> GatherVectorFirstFaulting(System.Numerics.Vector<uint> mask, uint* address, System.Numerics.Vector<int> indices) { throw null; }
+        public static unsafe System.Numerics.Vector<uint> GatherVectorFirstFaulting(System.Numerics.Vector<uint> mask, uint* address, System.Numerics.Vector<uint> indices) { throw null; }
+        public static unsafe System.Numerics.Vector<ulong> GatherVectorFirstFaulting(System.Numerics.Vector<ulong> mask, System.Numerics.Vector<ulong> addresses) { throw null; }
+        public static unsafe System.Numerics.Vector<ulong> GatherVectorFirstFaulting(System.Numerics.Vector<ulong> mask, ulong* address, System.Numerics.Vector<long> indices) { throw null; }
+        public static unsafe System.Numerics.Vector<ulong> GatherVectorFirstFaulting(System.Numerics.Vector<ulong> mask, ulong* address, System.Numerics.Vector<ulong> indices) { throw null; }
+        
         public static unsafe System.Numerics.Vector<int> GatherVectorInt16SignExtend(System.Numerics.Vector<int> mask, short* address, System.Numerics.Vector<int> indices) { throw null; }
         // public static System.Numerics.Vector<int> GatherVectorInt16SignExtend(System.Numerics.Vector<int> mask, System.Numerics.Vector<uint> addresses) { throw null; }
         public static unsafe System.Numerics.Vector<int> GatherVectorInt16SignExtend(System.Numerics.Vector<int> mask, short* address, System.Numerics.Vector<uint> indices) { throw null; }
@@ -4582,6 +4602,8 @@ internal Arm64() { }
         public static ulong GetActiveElementCount(System.Numerics.Vector<uint> mask, System.Numerics.Vector<uint> from) { throw null; }
         public static ulong GetActiveElementCount(System.Numerics.Vector<ulong> mask, System.Numerics.Vector<ulong> from) { throw null; }
 
+        public static unsafe System.Numerics.Vector<byte> GetFfr() { throw null; }
+
         public static System.Numerics.Vector<byte> LeadingSignCount(System.Numerics.Vector<sbyte> value) { throw null; }
         public static System.Numerics.Vector<ushort> LeadingSignCount(System.Numerics.Vector<short> value) { throw null; }
         public static System.Numerics.Vector<uint> LeadingSignCount(System.Numerics.Vector<int> value) { throw null; }
@@ -4656,6 +4678,18 @@ internal Arm64() { }
         public static unsafe System.Numerics.Vector<ushort> LoadVectorByteZeroExtendToUInt16(System.Numerics.Vector<ushort> mask, byte* address) { throw null; }
         public static unsafe System.Numerics.Vector<uint> LoadVectorByteZeroExtendToUInt32(System.Numerics.Vector<uint> mask, byte* address) { throw null; }
         public static unsafe System.Numerics.Vector<ulong> LoadVectorByteZeroExtendToUInt64(System.Numerics.Vector<ulong> mask, byte* address) { throw null; }
+
+        public static unsafe System.Numerics.Vector<byte> LoadVectorFirstFaulting(System.Numerics.Vector<byte> mask, byte* address) { throw null; }
+        public static unsafe System.Numerics.Vector<double> LoadVectorFirstFaulting(System.Numerics.Vector<double> mask, double* address) { throw null; }
+        public static unsafe System.Numerics.Vector<short> LoadVectorFirstFaulting(System.Numerics.Vector<short> mask, short* address) { throw null; }
+        public static unsafe System.Numerics.Vector<int> LoadVectorFirstFaulting(System.Numerics.Vector<int> mask, int* address) { throw null; }
+        public static unsafe System.Numerics.Vector<long> LoadVectorFirstFaulting(System.Numerics.Vector<long> mask, long* address) { throw null; }
+        public static unsafe System.Numerics.Vector<sbyte> LoadVectorFirstFaulting(System.Numerics.Vector<sbyte> mask, sbyte* address) { throw null; }
+        public static unsafe System.Numerics.Vector<float> LoadVectorFirstFaulting(System.Numerics.Vector<float> mask, float* address) { throw null; }
+        public static unsafe System.Numerics.Vector<ushort> LoadVectorFirstFaulting(System.Numerics.Vector<ushort> mask, ushort* address) { throw null; }
+        public static unsafe System.Numerics.Vector<uint> LoadVectorFirstFaulting(System.Numerics.Vector<uint> mask, uint* address) { throw null; }
+        public static unsafe System.Numerics.Vector<ulong> LoadVectorFirstFaulting(System.Numerics.Vector<ulong> mask, ulong* address) { throw null; }
+
         public static unsafe System.Numerics.Vector<int> LoadVectorInt16SignExtendToInt32(System.Numerics.Vector<int> mask, short* address) { throw null; }
         public static unsafe System.Numerics.Vector<long> LoadVectorInt16SignExtendToInt64(System.Numerics.Vector<long> mask, short* address) { throw null; }
         public static unsafe System.Numerics.Vector<uint> LoadVectorInt16SignExtendToUInt32(System.Numerics.Vector<uint> mask, short* address) { throw null; }
@@ -5015,6 +5049,15 @@ internal Arm64() { }
         public static System.Numerics.Vector<double> Scale(System.Numerics.Vector<double> left, System.Numerics.Vector<long> right) { throw null; }
         public static System.Numerics.Vector<float> Scale(System.Numerics.Vector<float> left, System.Numerics.Vector<int> right) { throw null; }
 
+        public static unsafe void SetFfr(System.Numerics.Vector<byte> value) { throw null; }
+        public static unsafe void SetFfr(System.Numerics.Vector<short> value) { throw null; }
+        public static unsafe void SetFfr(System.Numerics.Vector<int> value) { throw null; }
+        public static unsafe void SetFfr(System.Numerics.Vector<long> value) { throw null; }
+        public static unsafe void SetFfr(System.Numerics.Vector<sbyte> value) { throw null; }
+        public static unsafe void SetFfr(System.Numerics.Vector<ushort> value) { throw null; }
+        public static unsafe void SetFfr(System.Numerics.Vector<uint> value) { throw null; }
+        public static unsafe void SetFfr(System.Numerics.Vector<ulong> value) { throw null; }
+
         public static System.Numerics.Vector<byte> ShiftLeftLogical(System.Numerics.Vector<byte> left, System.Numerics.Vector<byte> right) { throw null; }
         public static System.Numerics.Vector<byte> ShiftLeftLogical(System.Numerics.Vector<byte> left, System.Numerics.Vector<ulong> right) { throw null; }
         public static System.Numerics.Vector<short> ShiftLeftLogical(System.Numerics.Vector<short> left, System.Numerics.Vector<ushort> right) { throw null; }
diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
index 0719ba73f68c5e..60adf06b637d70 100644
--- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
+++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
@@ -181,6 +181,7 @@
     ("_SveBinaryOpTestTemplate.template",                "SveVecBinOpTest.template",                    new Dictionary<string, string> { ["TemplateName"] = "Simple",     ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogic,             ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_ValidationLogicForCndSel }),
     ("_SveBinaryOpTestTemplate.template",                "SveVecBinOpVecTest.template",                 new Dictionary<string, string> { ["TemplateName"] = "Simple",     ["TemplateValidationLogic"] = SimpleVecOpTest_VectorValidationLogic,       ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_VectorValidationLogicForCndSel }),
     ("_SveBinaryOpTestTemplate.template",                "SveVecBinOpConvertTest.template",             new Dictionary<string, string> { ["TemplateName"] = "Simple",     ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogic,             ["TemplateValidationLogicForCndSel"] = SimpleTernVecOpTest_ValidationLogicForCndSel }),
+    ("_SveLoadVectorFirstFaultingTest.template",         "SveLoadVectorFirstFaultingTest.template",     new Dictionary<string, string> { ["TemplateName"] = "Simple",     ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogic,             ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_ValidationLogicForCndSel }),
     ("_SveBinaryOpDifferentTypesTestTemplate.template",  "SveVecBinOpDifferentTypesTest.template",      new Dictionary<string, string> { ["TemplateName"] = "Simple",     ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogic,             ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_ValidationLogicForCndSel }),
     ("_SveBinaryMaskOpTestTemplate.template",            "SveMaskVecBinOpConvertTest.template",         new Dictionary<string, string> { ["TemplateName"] = "Simple",     ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogic,             ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_ValidationLogicForCndSel }),
     ("_SveImmBinaryOpTestTemplate.template",             "SveVecImmBinOpTest.template",                 new Dictionary<string, string> { ["TemplateName"] = "Simple",     ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogic,             ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_ValidationLogicForCndSel }),
@@ -3344,6 +3345,19 @@
     ("SveGatherVectorIndices.template",    new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorUInt32ZeroExtend_Indices_ulong_ulong",                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorUInt32ZeroExtend",                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",        ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
     ("SveGatherVectorIndices.template",    new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorUInt32ZeroExtend_Indices_uint_uint",                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorUInt32ZeroExtend",                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",        ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
 
+    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_float_int",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
+    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_int_int",                                                                      ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Int32",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
+    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_uint_int",                                                                     ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
+    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_float_uint",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
+    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_int_uint",                                                                     ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "Int32",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
+    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_uint_uint",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
+    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_double_long",                                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",  ["ExtendedElementType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
+    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_long_long",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",  ["ExtendedElementType"] = "Int64",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
+    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_ulong_long",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",  ["ExtendedElementType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
+    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_double_ulong",                                                                 ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
+    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_long_ulong",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "Int64",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
+    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_ulong_ulong",                                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
+
     ("SveGatherVectorByteOffsets.template",new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorWithByteOffsets_float_int",                                                             ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsets",                                          ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Byte",   ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",       ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
     ("SveGatherVectorByteOffsets.template",new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorWithByteOffsets_int_int",                                                               ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsets",                                          ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Byte",   ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",        ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
     ("SveGatherVectorByteOffsets.template",new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorWithByteOffsets_uint_int",                                                              ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsets",                                          ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Byte",   ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",       ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
@@ -3403,6 +3417,17 @@
     ("SveLoadNonFaultingUnOpTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorNonFaulting_uint",                                                                                    ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorNonFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()",     ["Cast"] = "(uint*)",                                                                                    ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
     ("SveLoadNonFaultingUnOpTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorNonFaulting_ulong",                                                                                   ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorNonFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()",     ["Cast"] = "(ulong*)",                                                                                   ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
 
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_float",                                                                                   ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Single",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_double",                                                                                  ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Double",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_sbyte",                                                                                   ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "SByte",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "SByte",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "SByte",                                                               ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()",                                                                                         ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_short",                                                                                   ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int16",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int16",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int16",                                                               ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()",                                                                                         ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_int",                                                                                     ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int32",                                                               ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                                                                                         ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_long",                                                                                    ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int64",                                                               ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                                                                                         ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_byte",                                                                                    ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Byte",    ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Byte",          ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Byte",                                                                ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetByte()",                                                                                          ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_ushort",                                                                                  ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt16",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt16",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "UInt16",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_uint",                                                                                    ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "UInt32",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_ulong",                                                                                   ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "UInt64",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
+
     ("SveLoadVectorMaskedTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorNonTemporal_float",                                                                                   ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorNonTemporal",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
     ("SveLoadVectorMaskedTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorNonTemporal_double",                                                                                  ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorNonTemporal",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
     ("SveLoadVectorMaskedTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorNonTemporal_sbyte",                                                                                   ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorNonTemporal",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "SByte",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "SByte",                                   ["Op2BaseType"] = "SByte",                                                               ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()",                                                                                         ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/_SveLoadVectorFirstFaultingTest.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/_SveLoadVectorFirstFaultingTest.template
new file mode 100644
index 00000000000000..0a10283036e836
--- /dev/null
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/_SveLoadVectorFirstFaultingTest.template
@@ -0,0 +1,436 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+/******************************************************************************
+ * This file is auto-generated from a template file by the GenerateTests.csx  *
+ * script in tests\src\JIT\HardwareIntrinsics.Arm\Shared. In order to make    *
+ * changes, please update the corresponding template and run according to the *
+ * directions listed in the file.                                             *
+ ******************************************************************************/
+
+using System;
+using System.Linq;
+using System.Numerics;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Runtime.Intrinsics;
+using System.Runtime.Intrinsics.Arm;
+using Xunit;
+
+namespace JIT.HardwareIntrinsics.Arm
+{
+    public static partial class Program
+    {
+        [Fact]
+        public static void {TestName}()
+        {
+            var test = new {TemplateName}BinaryOpTest__{TestName}();
+
+            if (test.IsSupported)
+            {
+                // Validates basic functionality works, using Unsafe.Read
+                test.RunBasicScenario_UnsafeRead();
+
+                if ({LoadIsa}.IsSupported)
+                {
+                    // Validates basic functionality works, using Load
+                    test.RunBasicScenario_Load();
+                }
+
+                // Validates calling via reflection works, using Unsafe.Read
+                test.RunReflectionScenario_UnsafeRead();
+
+                // Validates passing a local works, using Unsafe.Read
+                test.RunLclVarScenario_UnsafeRead();
+
+                // Validates passing an instance member of a class works
+                test.RunClassFldScenario();
+
+                // Validates passing the field of a local struct works
+                test.RunStructLclFldScenario();
+
+                // Validates passing an instance member of a struct works
+                test.RunStructFldScenario();
+
+                // Validates executing the test inside conditional, with op1 as falseValue
+                test.ConditionalSelect_Op1();
+
+                // Validates executing the test inside conditional, with op2 as falseValue
+                test.ConditionalSelect_Op2();
+
+                // Validates executing the test inside conditional, with op3 as falseValue
+                test.ConditionalSelect_FalseOp();
+
+                // Validates executing the test inside conditional, with op3 as zero
+                test.ConditionalSelect_ZeroOp();                
+            }
+            else
+            {
+                // Validates we throw on unsupported hardware
+                test.RunUnsupportedScenario();
+            }
+
+            if (!test.Succeeded)
+            {
+                throw new Exception("One or more scenarios did not complete as expected.");
+            }
+        }
+    }
+
+    public sealed unsafe class {TemplateName}BinaryOpTest__{TestName}
+    {
+        private struct DataTable
+        {
+            private byte[] inArray1;
+            private byte[] inArray2;
+            private byte[] outArray;
+
+            private GCHandle inHandle1;
+            private GCHandle inHandle2;
+            private GCHandle outHandle;
+
+            private ulong alignment;
+
+            public DataTable({Op1BaseType}[] inArray1, {Op2BaseType}[] inArray2, {RetBaseType}[] outArray, int alignment)
+            {
+                int sizeOfinArray1 = inArray1.Length * Unsafe.SizeOf<{Op1BaseType}>();
+                int sizeOfinArray2 = inArray2.Length * Unsafe.SizeOf<{Op2BaseType}>();
+                int sizeOfoutArray = outArray.Length * Unsafe.SizeOf<{RetBaseType}>();
+                if ((alignment != 64 && alignment != 16 && alignment != 8) || (alignment * 2) < sizeOfinArray1 || (alignment * 2) < sizeOfinArray2 || (alignment * 2) < sizeOfoutArray)
+                {
+                    throw new ArgumentException($"Invalid value of alignment: {alignment}, sizeOfinArray1: {sizeOfinArray1}, sizeOfinArray2: {sizeOfinArray2}, sizeOfoutArray: {sizeOfoutArray}");
+                }
+
+                this.inArray1 = new byte[alignment * 2];
+                this.inArray2 = new byte[alignment * 2];
+                this.outArray = new byte[alignment * 2];
+
+                this.inHandle1 = GCHandle.Alloc(this.inArray1, GCHandleType.Pinned);
+                this.inHandle2 = GCHandle.Alloc(this.inArray2, GCHandleType.Pinned);
+                this.outHandle = GCHandle.Alloc(this.outArray, GCHandleType.Pinned);
+
+                this.alignment = (ulong)alignment;
+
+                Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(inArray1Ptr), ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), (uint)sizeOfinArray1);
+                Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(inArray2Ptr), ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), (uint)sizeOfinArray2);
+            }
+
+            public void* inArray1Ptr => Align((byte*)(inHandle1.AddrOfPinnedObject().ToPointer()), alignment);
+            public void* inArray2Ptr => Align((byte*)(inHandle2.AddrOfPinnedObject().ToPointer()), alignment);
+            public void* outArrayPtr => Align((byte*)(outHandle.AddrOfPinnedObject().ToPointer()), alignment);
+
+            public void Dispose()
+            {
+                inHandle1.Free();
+                inHandle2.Free();
+                outHandle.Free();
+            }
+
+            private static unsafe void* Align(byte* buffer, ulong expectedAlignment)
+            {
+                return (void*)(((ulong)buffer + expectedAlignment - 1) & ~(expectedAlignment - 1));
+            }
+        }
+
+        private struct TestStruct
+        {
+            public {Op1VectorType}<{Op1BaseType}> _fld1;
+            public {Op2VectorType}<{Op2BaseType}> _fld2;
+
+            public static TestStruct Create()
+            {
+                var testStruct = new TestStruct();
+
+                for (var i = 0; i < Op1ElementCount; i++) { _data1[i] = {NextValueOp1}; }
+                Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1VectorType}<{Op1BaseType}>, byte>(ref testStruct._fld1), ref Unsafe.As<{Op1BaseType}, byte>(ref _data1[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
+                for (var i = 0; i < Op2ElementCount; i++) { _data2[i] = {NextValueOp2}; }
+                Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2VectorType}<{Op2BaseType}>, byte>(ref testStruct._fld2), ref Unsafe.As<{Op2BaseType}, byte>(ref _data2[0]), (uint)Unsafe.SizeOf<{Op2VectorType}<{Op2BaseType}>>());
+
+                return testStruct;
+            }
+
+            public void RunStructFldScenario({TemplateName}BinaryOpTest__{TestName} testClass)
+            {
+                var result = {Isa}.{Method}(_fld1, _fld2);
+
+                Unsafe.Write(testClass._dataTable.outArrayPtr, result);
+                testClass.ValidateResult(_fld1, _fld2, testClass._dataTable.outArrayPtr);
+            }
+        }
+
+        private static readonly int LargestVectorSize = {LargestVectorSize};
+
+        private static readonly int Op1ElementCount = Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() / sizeof({Op1BaseType});
+        private static readonly int Op2ElementCount = Unsafe.SizeOf<{Op2VectorType}<{Op2BaseType}>>() / sizeof({Op2BaseType});
+        private static readonly int RetElementCount = Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>() / sizeof({RetBaseType});
+
+        private static {Op1BaseType}[] _maskData = new {Op1BaseType}[Op1ElementCount];
+        private static {Op1BaseType}[] _data1 = new {Op1BaseType}[Op1ElementCount];
+        private static {Op2BaseType}[] _data2 = new {Op2BaseType}[Op2ElementCount];
+
+        private {Op1VectorType}<{Op1BaseType}> _mask;
+        private {Op1VectorType}<{Op1BaseType}> _fld1;
+        private {Op2VectorType}<{Op2BaseType}> _fld2;
+        private {Op2VectorType}<{Op2BaseType}> _falseFld;
+
+        private DataTable _dataTable;
+
+        public {TemplateName}BinaryOpTest__{TestName}()
+        {
+            Succeeded = true;
+
+            for (var i = 0; i < Op1ElementCount; i++) { _maskData[i] = ({Op1BaseType})({NextValueOp1} % 2); }
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1VectorType}<{Op1BaseType}>, byte>(ref _mask), ref Unsafe.As<{Op1BaseType}, byte>(ref _maskData[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
+            for (var i = 0; i < Op1ElementCount; i++) { _data1[i] = {NextValueOp1}; }
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1VectorType}<{Op1BaseType}>, byte>(ref _fld1), ref Unsafe.As<{Op1BaseType}, byte>(ref _data1[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
+            for (var i = 0; i < Op2ElementCount; i++) { _data2[i] = {NextValueOp2}; }
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2VectorType}<{Op2BaseType}>, byte>(ref _fld2), ref Unsafe.As<{Op2BaseType}, byte>(ref _data2[0]), (uint)Unsafe.SizeOf<{Op2VectorType}<{Op2BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2VectorType}<{Op2BaseType}>, byte>(ref _falseFld), ref Unsafe.As<{Op2BaseType}, byte>(ref _data2[0]), (uint)Unsafe.SizeOf<{Op2VectorType}<{Op2BaseType}>>());            
+
+            for (var i = 0; i < Op1ElementCount; i++) { _data1[i] = {NextValueOp1}; }
+            for (var i = 0; i < Op2ElementCount; i++) { _data2[i] = {NextValueOp2}; }
+            _dataTable = new DataTable(_data1, _data2, new {RetBaseType}[RetElementCount], LargestVectorSize);
+        }
+
+        public bool IsSupported => {Isa}.IsSupported;
+
+        public bool Succeeded { get; set; }
+
+        public void RunBasicScenario_UnsafeRead()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_UnsafeRead));
+
+            var result = {Isa}.{Method}(
+                Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr),
+                Unsafe.Read<{Op2VectorType}<{Op2BaseType}>>(_dataTable.inArray2Ptr)
+            );
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
+        }
+
+        public void RunBasicScenario_Load()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_Load));
+
+            {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All);
+
+            var result = {Isa}.{Method}(
+                {LoadIsa}.Load{Op1VectorType}(loadMask, ({Op1BaseType}*)(_dataTable.inArray1Ptr)),
+                {LoadIsa}.Load{Op2VectorType}(loadMask, ({Op2BaseType}*)(_dataTable.inArray2Ptr))
+            );
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
+        }
+
+        public void RunReflectionScenario_UnsafeRead()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_UnsafeRead));
+
+            var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof({Op1VectorType}<{Op1BaseType}>), typeof({Op2VectorType}<{Op2BaseType}>) })
+                                     .Invoke(null, new object[] {
+                                        Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr),
+                                        Unsafe.Read<{Op2VectorType}<{Op2BaseType}>>(_dataTable.inArray2Ptr)
+                                     });
+
+            Unsafe.Write(_dataTable.outArrayPtr, ({RetVectorType}<{RetBaseType}>)(result));
+            ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
+        }
+
+        public void RunLclVarScenario_UnsafeRead()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunLclVarScenario_UnsafeRead));
+
+            var op1 = Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr);
+            var op2 = Unsafe.Read<{Op2VectorType}<{Op2BaseType}>>(_dataTable.inArray2Ptr);
+            var result = {Isa}.{Method}(op1, op2);
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(op1, op2, _dataTable.outArrayPtr);
+        }
+
+        public void RunClassFldScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario));
+
+            var result = {Isa}.{Method}(_fld1, _fld2);
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(_fld1, _fld2, _dataTable.outArrayPtr);
+        }
+
+        public void RunStructLclFldScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario));
+
+            var test = TestStruct.Create();
+            var result = {Isa}.{Method}(test._fld1, test._fld2);
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(test._fld1, test._fld2, _dataTable.outArrayPtr);
+        }
+
+        public void RunStructFldScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario));
+
+            var test = TestStruct.Create();
+            test.RunStructFldScenario(this);
+        }
+
+        public void ConditionalSelect_Op1()
+        {
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op1_mask");
+            ConditionalSelectScenario(_mask, _fld1, _fld2, _fld1);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op1_zero");
+            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _fld1);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op1_all");
+            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _fld1);
+        }
+
+        public void ConditionalSelect_Op2()
+        {
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op2_mask");
+            ConditionalSelectScenario(_mask, _fld1, _fld2, _fld2);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op2_zero");
+            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _fld2);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op2_all");
+            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _fld2);
+        }
+
+        public void ConditionalSelect_FalseOp()
+        {
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_mask");
+            ConditionalSelectScenario(_mask, _fld1, _fld2, _falseFld);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_zero");
+            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _falseFld);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_all");
+            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _falseFld);            
+        }
+
+        public void ConditionalSelect_ZeroOp()
+        {
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_mask");
+            ConditionalSelectScenario(_mask, _fld1, _fld2, {Op1VectorType}<{Op1BaseType}>.Zero);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_zero");
+            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, {Op1VectorType}<{Op1BaseType}>.Zero);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_all");
+            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, {Op1VectorType}<{Op1BaseType}>.Zero);            
+        }
+
+        [method: MethodImpl(MethodImplOptions.AggressiveInlining)]
+        private void ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}> mask, {Op1VectorType}<{Op1BaseType}> op1, {Op1VectorType}<{Op1BaseType}> op2, {Op1VectorType}<{Op1BaseType}> falseOp)
+        {
+            var result = Sve.ConditionalSelect(mask, {Isa}.{Method}(op1, op2), falseOp);
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateConditionalSelectResult(mask, op1, op2, falseOp, _dataTable.outArrayPtr);
+        }
+
+        public void RunUnsupportedScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunUnsupportedScenario));
+
+            bool succeeded = false;
+
+            try
+            {
+                RunBasicScenario_UnsafeRead();
+            }
+            catch (PlatformNotSupportedException)
+            {
+                succeeded = true;
+            }
+
+            if (!succeeded)
+            {
+                Succeeded = false;
+            }
+        }
+
+        private void ValidateConditionalSelectResult({Op1VectorType}<{Op1BaseType}> maskOp, {Op1VectorType}<{Op1BaseType}> leftOp, {Op1VectorType}<{Op1BaseType}> rightOp, {Op1VectorType}<{Op1BaseType}> falseOp, void* output, [CallerMemberName] string method = "")
+        {
+            {Op1BaseType}[] mask = new {Op1BaseType}[Op1ElementCount];
+            {Op1BaseType}[] left = new {Op1BaseType}[Op1ElementCount];
+            {Op1BaseType}[] right = new {Op1BaseType}[Op1ElementCount];
+            {Op1BaseType}[] falseVal = new {Op1BaseType}[Op1ElementCount];
+            {RetBaseType}[] result = new {RetBaseType}[RetElementCount];
+
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref mask[0]), maskOp);
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref left[0]), leftOp);
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref right[0]), rightOp);
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref falseVal[0]), falseOp);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref result[0]), ref Unsafe.AsRef<byte>(output), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            bool succeeded = true;
+
+            {TemplateValidationLogicForCndSel}
+
+            if (!succeeded)
+            {
+                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1VectorType}<{Op1BaseType}>, {Op2VectorType}<{Op2BaseType}>): {method} failed:");
+                TestLibrary.TestFramework.LogInformation($"    mask: ({string.Join(", ", mask)})");
+                TestLibrary.TestFramework.LogInformation($"    left: ({string.Join(", ", left)})");
+                TestLibrary.TestFramework.LogInformation($"   right: ({string.Join(", ", right)})");
+                TestLibrary.TestFramework.LogInformation($" falseOp: ({string.Join(", ", falseVal)})");
+                TestLibrary.TestFramework.LogInformation($"  result: ({string.Join(", ", result)})");
+                TestLibrary.TestFramework.LogInformation(string.Empty);
+
+                Succeeded = false;
+            }
+        }
+
+        private void ValidateResult({Op1VectorType}<{Op1BaseType}> op1, {Op2VectorType}<{Op2BaseType}> op2, void* result, [CallerMemberName] string method = "")
+        {
+            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount];
+            {Op2BaseType}[] inArray2 = new {Op2BaseType}[Op2ElementCount];
+            {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), op1);
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), op2);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateResult(inArray1, inArray2, outArray, method);
+        }
+
+        private void ValidateResult(void* op1, void* op2, void* result, [CallerMemberName] string method = "")
+        {
+            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount];
+            {Op2BaseType}[] inArray2 = new {Op2BaseType}[Op2ElementCount];
+            {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), ref Unsafe.AsRef<byte>(op1), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), ref Unsafe.AsRef<byte>(op2), (uint)Unsafe.SizeOf<{Op2VectorType}<{Op2BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateResult(inArray1, inArray2, outArray, method);
+        }
+
+        private void ValidateResult({Op1BaseType}[] left, {Op2BaseType}[] right, {RetBaseType}[] result, [CallerMemberName] string method = "")
+        {
+            bool succeeded = true;
+
+            {TemplateValidationLogic}
+
+            if (!succeeded)
+            {
+                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1VectorType}<{Op1BaseType}>, {Op2VectorType}<{Op2BaseType}>): {method} failed:");
+                TestLibrary.TestFramework.LogInformation($"    left: ({string.Join(", ", left)})");
+                TestLibrary.TestFramework.LogInformation($"   right: ({string.Join(", ", right)})");
+                TestLibrary.TestFramework.LogInformation($"  result: ({string.Join(", ", result)})");
+                TestLibrary.TestFramework.LogInformation(string.Empty);
+
+                Succeeded = false;
+            }
+        }
+    }
+}

From a7773acce24352fa4623a9c9bfa825c60e31271a Mon Sep 17 00:00:00 2001
From: TIHan <lol.tihan@gmail.com>
Date: Tue, 2 Jul 2024 14:42:08 -0700
Subject: [PATCH 02/24] FirstFaulting partially works

---
 src/coreclr/jit/hwintrinsiccodegenarm64.cpp   |  11 +
 src/coreclr/jit/hwintrinsiclistarm64sve.h     |   4 +-
 .../GenerateHWIntrinsicTests_Arm.cs           |  21 +-
 .../_SveLoadVectorFirstFaultingTest.template  | 436 ------------------
 4 files changed, 23 insertions(+), 449 deletions(-)
 delete mode 100644 src/tests/JIT/HardwareIntrinsics/Arm/Shared/_SveLoadVectorFirstFaultingTest.template

diff --git a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp
index d44f9253014f02..3be591c1811ee4 100644
--- a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp
+++ b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp
@@ -2313,6 +2313,17 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
                 break;
             }
 
+            case NI_Sve_LoadVectorFirstFaulting:
+            {
+                insScalableOpts sopt = INS_SCALABLE_OPTS_LSL_N;
+                if (opt == INS_OPTS_SCALABLE_B)
+                {
+                    sopt = INS_SCALABLE_OPTS_NONE;
+                }
+                GetEmitter()->emitIns_R_R_R_R(ins, emitSize, targetReg, op1Reg, op2Reg, REG_ZR, opt, sopt);
+                break;
+            }
+
             default:
                 unreached();
         }
diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h
index 7ac94673586630..c003ff22ee99b8 100644
--- a/src/coreclr/jit/hwintrinsiclistarm64sve.h
+++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h
@@ -102,7 +102,7 @@ HARDWARE_INTRINSIC(Sve,           GatherVectorUInt32WithByteOffsetsZeroExtend,
 HARDWARE_INTRINSIC(Sve,           GatherVectorUInt32ZeroExtend,                                     -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1w,       INS_sve_ld1w,       INS_sve_ld1w,       INS_sve_ld1w,       INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GatherVectorWithByteOffsets,                                      -1,      3,      true,  {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1w,       INS_sve_ld1w,       INS_sve_ld1d,       INS_sve_ld1d,       INS_sve_ld1w,       INS_sve_ld1d},    HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GetActiveElementCount,                                            -1,      2,      true,  {INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp},    HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_ExplicitMaskedOperation)
-HARDWARE_INTRINSIC(Sve,           GetFfr,                                                           -1,      0,      true,  {INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
+HARDWARE_INTRINSIC(Sve,           GetFfr,                                                           -1,      0,      false, {INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
 HARDWARE_INTRINSIC(Sve,           InsertIntoShiftedVector,                                          -1,      2,      true,  {INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr},    HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics)
 HARDWARE_INTRINSIC(Sve,           LeadingSignCount,                                                 -1,     -1,      false, {INS_sve_cls,        INS_invalid,        INS_sve_cls,        INS_invalid,        INS_sve_cls,        INS_invalid,        INS_sve_cls,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           LeadingZeroCount,                                                 -1,     -1,      false, {INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
@@ -123,7 +123,7 @@ HARDWARE_INTRINSIC(Sve,           LoadVectorByteZeroExtendToInt64,
 HARDWARE_INTRINSIC(Sve,           LoadVectorByteZeroExtendToUInt16,                                 -1,      2,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1b,       INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           LoadVectorByteZeroExtendToUInt32,                                 -1,      2,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1b,       INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           LoadVectorByteZeroExtendToUInt64,                                 -1,      2,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1b,       INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
-HARDWARE_INTRINSIC(Sve,           LoadVectorFirstFaulting,                                          -1,      2,      true,  {INS_sve_ldff1b,     INS_sve_ldff1b,     INS_sve_ldff1h,     INS_sve_ldff1h,     INS_sve_ldff1w,     INS_sve_ldff1w,     INS_sve_ldff1d,     INS_sve_ldff1d,     INS_sve_ldff1w,     INS_sve_ldff1d},  HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
+HARDWARE_INTRINSIC(Sve,           LoadVectorFirstFaulting,                                          -1,      2,      true,  {INS_sve_ldff1b,     INS_sve_ldff1b,     INS_sve_ldff1h,     INS_sve_ldff1h,     INS_sve_ldff1w,     INS_sve_ldff1w,     INS_sve_ldff1d,     INS_sve_ldff1d,     INS_sve_ldff1w,     INS_sve_ldff1d},  HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_SpecialCodeGen)
 HARDWARE_INTRINSIC(Sve,           LoadVectorInt16NonFaultingSignExtendToInt32,                      -1,      -1,     false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ldnf1sh,    INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           LoadVectorInt16NonFaultingSignExtendToInt64,                      -1,      -1,     false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ldnf1sh,    INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           LoadVectorInt16NonFaultingSignExtendToUInt32,                     -1,      -1,     false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ldnf1sh,    INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
index a01ea0acee1696..d6c0179d2afabb 100644
--- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
+++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
@@ -181,7 +181,6 @@
     ("_SveBinaryOpTestTemplate.template",                "SveVecBinOpTest.template",                    new Dictionary<string, string> { ["TemplateName"] = "Simple",     ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogic,             ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_ValidationLogicForCndSel }),
     ("_SveBinaryOpTestTemplate.template",                "SveVecBinOpVecTest.template",                 new Dictionary<string, string> { ["TemplateName"] = "Simple",     ["TemplateValidationLogic"] = SimpleVecOpTest_VectorValidationLogic,       ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_VectorValidationLogicForCndSel }),
     ("_SveBinaryOpTestTemplate.template",                "SveVecBinOpConvertTest.template",             new Dictionary<string, string> { ["TemplateName"] = "Simple",     ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogic,             ["TemplateValidationLogicForCndSel"] = SimpleTernVecOpTest_ValidationLogicForCndSel }),
-    ("_SveLoadVectorFirstFaultingTest.template",         "SveLoadVectorFirstFaultingTest.template",     new Dictionary<string, string> { ["TemplateName"] = "Simple",     ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogic,             ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_ValidationLogicForCndSel }),
     ("_SveBinaryOpDifferentTypesTestTemplate.template",  "SveVecBinOpDifferentTypesTest.template",      new Dictionary<string, string> { ["TemplateName"] = "Simple",     ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogic,             ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_ValidationLogicForCndSel }),
     ("_SveBinaryMaskOpTestTemplate.template",            "SveMaskVecBinOpConvertTest.template",         new Dictionary<string, string> { ["TemplateName"] = "Simple",     ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogic,             ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_ValidationLogicForCndSel }),
     ("_SveImmBinaryOpTestTemplate.template",             "SveVecImmBinOpTest.template",                 new Dictionary<string, string> { ["TemplateName"] = "Simple",     ["TemplateValidationLogic"] = SimpleVecOpTest_ValidationLogic,             ["TemplateValidationLogicForCndSel"] = SimpleVecOpTest_ValidationLogicForCndSel }),
@@ -3503,16 +3502,16 @@
     ("SveLoadNonFaultingUnOpTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorNonFaulting_uint",                                                                                    ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorNonFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()",     ["Cast"] = "(uint*)",                                                                                    ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
     ("SveLoadNonFaultingUnOpTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorNonFaulting_ulong",                                                                                   ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorNonFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()",     ["Cast"] = "(ulong*)",                                                                                   ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
 
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_float",                                                                                   ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Single",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_double",                                                                                  ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Double",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_sbyte",                                                                                   ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "SByte",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "SByte",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "SByte",                                                               ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()",                                                                                         ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_short",                                                                                   ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int16",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int16",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int16",                                                               ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()",                                                                                         ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_int",                                                                                     ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int32",                                                               ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                                                                                         ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_long",                                                                                    ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int64",                                                               ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                                                                                         ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_byte",                                                                                    ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Byte",    ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Byte",          ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Byte",                                                                ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetByte()",                                                                                          ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_ushort",                                                                                  ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt16",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt16",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "UInt16",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_uint",                                                                                    ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "UInt32",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_ulong",                                                                                   ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "UInt64",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_float",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Single",                                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_double",                                                                                  ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Double",                                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_sbyte",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "SByte",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "SByte",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "SByte",                                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()",                                                                                         ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_short",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int16",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int16",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int16",                                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()",                                                                                         ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_int",                                                                                     ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int32",                                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                                                                                         ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_long",                                                                                    ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int64",                                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                                                                                         ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_byte",                                                                                    ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Byte",    ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Byte",          ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Byte",                                                                ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetByte()",                                   ["NextValueOp2"] = "TestLibrary.Generator.GetByte()",                                                                                          ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_ushort",                                                                                  ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt16",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt16",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "UInt16",                                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_uint",                                                                                    ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "UInt32",                                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_ulong",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "UInt64",                                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
 
     ("SveLoadVectorMaskedTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorNonTemporal_float",                                                                                   ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorNonTemporal",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
     ("SveLoadVectorMaskedTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorNonTemporal_double",                                                                                  ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorNonTemporal",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/_SveLoadVectorFirstFaultingTest.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/_SveLoadVectorFirstFaultingTest.template
deleted file mode 100644
index 0a10283036e836..00000000000000
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/_SveLoadVectorFirstFaultingTest.template
+++ /dev/null
@@ -1,436 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-/******************************************************************************
- * This file is auto-generated from a template file by the GenerateTests.csx  *
- * script in tests\src\JIT\HardwareIntrinsics.Arm\Shared. In order to make    *
- * changes, please update the corresponding template and run according to the *
- * directions listed in the file.                                             *
- ******************************************************************************/
-
-using System;
-using System.Linq;
-using System.Numerics;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-using System.Runtime.Intrinsics;
-using System.Runtime.Intrinsics.Arm;
-using Xunit;
-
-namespace JIT.HardwareIntrinsics.Arm
-{
-    public static partial class Program
-    {
-        [Fact]
-        public static void {TestName}()
-        {
-            var test = new {TemplateName}BinaryOpTest__{TestName}();
-
-            if (test.IsSupported)
-            {
-                // Validates basic functionality works, using Unsafe.Read
-                test.RunBasicScenario_UnsafeRead();
-
-                if ({LoadIsa}.IsSupported)
-                {
-                    // Validates basic functionality works, using Load
-                    test.RunBasicScenario_Load();
-                }
-
-                // Validates calling via reflection works, using Unsafe.Read
-                test.RunReflectionScenario_UnsafeRead();
-
-                // Validates passing a local works, using Unsafe.Read
-                test.RunLclVarScenario_UnsafeRead();
-
-                // Validates passing an instance member of a class works
-                test.RunClassFldScenario();
-
-                // Validates passing the field of a local struct works
-                test.RunStructLclFldScenario();
-
-                // Validates passing an instance member of a struct works
-                test.RunStructFldScenario();
-
-                // Validates executing the test inside conditional, with op1 as falseValue
-                test.ConditionalSelect_Op1();
-
-                // Validates executing the test inside conditional, with op2 as falseValue
-                test.ConditionalSelect_Op2();
-
-                // Validates executing the test inside conditional, with op3 as falseValue
-                test.ConditionalSelect_FalseOp();
-
-                // Validates executing the test inside conditional, with op3 as zero
-                test.ConditionalSelect_ZeroOp();                
-            }
-            else
-            {
-                // Validates we throw on unsupported hardware
-                test.RunUnsupportedScenario();
-            }
-
-            if (!test.Succeeded)
-            {
-                throw new Exception("One or more scenarios did not complete as expected.");
-            }
-        }
-    }
-
-    public sealed unsafe class {TemplateName}BinaryOpTest__{TestName}
-    {
-        private struct DataTable
-        {
-            private byte[] inArray1;
-            private byte[] inArray2;
-            private byte[] outArray;
-
-            private GCHandle inHandle1;
-            private GCHandle inHandle2;
-            private GCHandle outHandle;
-
-            private ulong alignment;
-
-            public DataTable({Op1BaseType}[] inArray1, {Op2BaseType}[] inArray2, {RetBaseType}[] outArray, int alignment)
-            {
-                int sizeOfinArray1 = inArray1.Length * Unsafe.SizeOf<{Op1BaseType}>();
-                int sizeOfinArray2 = inArray2.Length * Unsafe.SizeOf<{Op2BaseType}>();
-                int sizeOfoutArray = outArray.Length * Unsafe.SizeOf<{RetBaseType}>();
-                if ((alignment != 64 && alignment != 16 && alignment != 8) || (alignment * 2) < sizeOfinArray1 || (alignment * 2) < sizeOfinArray2 || (alignment * 2) < sizeOfoutArray)
-                {
-                    throw new ArgumentException($"Invalid value of alignment: {alignment}, sizeOfinArray1: {sizeOfinArray1}, sizeOfinArray2: {sizeOfinArray2}, sizeOfoutArray: {sizeOfoutArray}");
-                }
-
-                this.inArray1 = new byte[alignment * 2];
-                this.inArray2 = new byte[alignment * 2];
-                this.outArray = new byte[alignment * 2];
-
-                this.inHandle1 = GCHandle.Alloc(this.inArray1, GCHandleType.Pinned);
-                this.inHandle2 = GCHandle.Alloc(this.inArray2, GCHandleType.Pinned);
-                this.outHandle = GCHandle.Alloc(this.outArray, GCHandleType.Pinned);
-
-                this.alignment = (ulong)alignment;
-
-                Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(inArray1Ptr), ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), (uint)sizeOfinArray1);
-                Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(inArray2Ptr), ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), (uint)sizeOfinArray2);
-            }
-
-            public void* inArray1Ptr => Align((byte*)(inHandle1.AddrOfPinnedObject().ToPointer()), alignment);
-            public void* inArray2Ptr => Align((byte*)(inHandle2.AddrOfPinnedObject().ToPointer()), alignment);
-            public void* outArrayPtr => Align((byte*)(outHandle.AddrOfPinnedObject().ToPointer()), alignment);
-
-            public void Dispose()
-            {
-                inHandle1.Free();
-                inHandle2.Free();
-                outHandle.Free();
-            }
-
-            private static unsafe void* Align(byte* buffer, ulong expectedAlignment)
-            {
-                return (void*)(((ulong)buffer + expectedAlignment - 1) & ~(expectedAlignment - 1));
-            }
-        }
-
-        private struct TestStruct
-        {
-            public {Op1VectorType}<{Op1BaseType}> _fld1;
-            public {Op2VectorType}<{Op2BaseType}> _fld2;
-
-            public static TestStruct Create()
-            {
-                var testStruct = new TestStruct();
-
-                for (var i = 0; i < Op1ElementCount; i++) { _data1[i] = {NextValueOp1}; }
-                Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1VectorType}<{Op1BaseType}>, byte>(ref testStruct._fld1), ref Unsafe.As<{Op1BaseType}, byte>(ref _data1[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
-                for (var i = 0; i < Op2ElementCount; i++) { _data2[i] = {NextValueOp2}; }
-                Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2VectorType}<{Op2BaseType}>, byte>(ref testStruct._fld2), ref Unsafe.As<{Op2BaseType}, byte>(ref _data2[0]), (uint)Unsafe.SizeOf<{Op2VectorType}<{Op2BaseType}>>());
-
-                return testStruct;
-            }
-
-            public void RunStructFldScenario({TemplateName}BinaryOpTest__{TestName} testClass)
-            {
-                var result = {Isa}.{Method}(_fld1, _fld2);
-
-                Unsafe.Write(testClass._dataTable.outArrayPtr, result);
-                testClass.ValidateResult(_fld1, _fld2, testClass._dataTable.outArrayPtr);
-            }
-        }
-
-        private static readonly int LargestVectorSize = {LargestVectorSize};
-
-        private static readonly int Op1ElementCount = Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() / sizeof({Op1BaseType});
-        private static readonly int Op2ElementCount = Unsafe.SizeOf<{Op2VectorType}<{Op2BaseType}>>() / sizeof({Op2BaseType});
-        private static readonly int RetElementCount = Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>() / sizeof({RetBaseType});
-
-        private static {Op1BaseType}[] _maskData = new {Op1BaseType}[Op1ElementCount];
-        private static {Op1BaseType}[] _data1 = new {Op1BaseType}[Op1ElementCount];
-        private static {Op2BaseType}[] _data2 = new {Op2BaseType}[Op2ElementCount];
-
-        private {Op1VectorType}<{Op1BaseType}> _mask;
-        private {Op1VectorType}<{Op1BaseType}> _fld1;
-        private {Op2VectorType}<{Op2BaseType}> _fld2;
-        private {Op2VectorType}<{Op2BaseType}> _falseFld;
-
-        private DataTable _dataTable;
-
-        public {TemplateName}BinaryOpTest__{TestName}()
-        {
-            Succeeded = true;
-
-            for (var i = 0; i < Op1ElementCount; i++) { _maskData[i] = ({Op1BaseType})({NextValueOp1} % 2); }
-            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1VectorType}<{Op1BaseType}>, byte>(ref _mask), ref Unsafe.As<{Op1BaseType}, byte>(ref _maskData[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
-            for (var i = 0; i < Op1ElementCount; i++) { _data1[i] = {NextValueOp1}; }
-            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1VectorType}<{Op1BaseType}>, byte>(ref _fld1), ref Unsafe.As<{Op1BaseType}, byte>(ref _data1[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
-            for (var i = 0; i < Op2ElementCount; i++) { _data2[i] = {NextValueOp2}; }
-            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2VectorType}<{Op2BaseType}>, byte>(ref _fld2), ref Unsafe.As<{Op2BaseType}, byte>(ref _data2[0]), (uint)Unsafe.SizeOf<{Op2VectorType}<{Op2BaseType}>>());
-            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2VectorType}<{Op2BaseType}>, byte>(ref _falseFld), ref Unsafe.As<{Op2BaseType}, byte>(ref _data2[0]), (uint)Unsafe.SizeOf<{Op2VectorType}<{Op2BaseType}>>());            
-
-            for (var i = 0; i < Op1ElementCount; i++) { _data1[i] = {NextValueOp1}; }
-            for (var i = 0; i < Op2ElementCount; i++) { _data2[i] = {NextValueOp2}; }
-            _dataTable = new DataTable(_data1, _data2, new {RetBaseType}[RetElementCount], LargestVectorSize);
-        }
-
-        public bool IsSupported => {Isa}.IsSupported;
-
-        public bool Succeeded { get; set; }
-
-        public void RunBasicScenario_UnsafeRead()
-        {
-            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_UnsafeRead));
-
-            var result = {Isa}.{Method}(
-                Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr),
-                Unsafe.Read<{Op2VectorType}<{Op2BaseType}>>(_dataTable.inArray2Ptr)
-            );
-
-            Unsafe.Write(_dataTable.outArrayPtr, result);
-            ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
-        }
-
-        public void RunBasicScenario_Load()
-        {
-            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_Load));
-
-            {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All);
-
-            var result = {Isa}.{Method}(
-                {LoadIsa}.Load{Op1VectorType}(loadMask, ({Op1BaseType}*)(_dataTable.inArray1Ptr)),
-                {LoadIsa}.Load{Op2VectorType}(loadMask, ({Op2BaseType}*)(_dataTable.inArray2Ptr))
-            );
-
-            Unsafe.Write(_dataTable.outArrayPtr, result);
-            ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
-        }
-
-        public void RunReflectionScenario_UnsafeRead()
-        {
-            TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_UnsafeRead));
-
-            var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof({Op1VectorType}<{Op1BaseType}>), typeof({Op2VectorType}<{Op2BaseType}>) })
-                                     .Invoke(null, new object[] {
-                                        Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr),
-                                        Unsafe.Read<{Op2VectorType}<{Op2BaseType}>>(_dataTable.inArray2Ptr)
-                                     });
-
-            Unsafe.Write(_dataTable.outArrayPtr, ({RetVectorType}<{RetBaseType}>)(result));
-            ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
-        }
-
-        public void RunLclVarScenario_UnsafeRead()
-        {
-            TestLibrary.TestFramework.BeginScenario(nameof(RunLclVarScenario_UnsafeRead));
-
-            var op1 = Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr);
-            var op2 = Unsafe.Read<{Op2VectorType}<{Op2BaseType}>>(_dataTable.inArray2Ptr);
-            var result = {Isa}.{Method}(op1, op2);
-
-            Unsafe.Write(_dataTable.outArrayPtr, result);
-            ValidateResult(op1, op2, _dataTable.outArrayPtr);
-        }
-
-        public void RunClassFldScenario()
-        {
-            TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario));
-
-            var result = {Isa}.{Method}(_fld1, _fld2);
-
-            Unsafe.Write(_dataTable.outArrayPtr, result);
-            ValidateResult(_fld1, _fld2, _dataTable.outArrayPtr);
-        }
-
-        public void RunStructLclFldScenario()
-        {
-            TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario));
-
-            var test = TestStruct.Create();
-            var result = {Isa}.{Method}(test._fld1, test._fld2);
-
-            Unsafe.Write(_dataTable.outArrayPtr, result);
-            ValidateResult(test._fld1, test._fld2, _dataTable.outArrayPtr);
-        }
-
-        public void RunStructFldScenario()
-        {
-            TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario));
-
-            var test = TestStruct.Create();
-            test.RunStructFldScenario(this);
-        }
-
-        public void ConditionalSelect_Op1()
-        {
-            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op1_mask");
-            ConditionalSelectScenario(_mask, _fld1, _fld2, _fld1);
-            
-            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op1_zero");
-            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _fld1);
-            
-            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op1_all");
-            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _fld1);
-        }
-
-        public void ConditionalSelect_Op2()
-        {
-            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op2_mask");
-            ConditionalSelectScenario(_mask, _fld1, _fld2, _fld2);
-            
-            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op2_zero");
-            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _fld2);
-            
-            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_Op2_all");
-            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _fld2);
-        }
-
-        public void ConditionalSelect_FalseOp()
-        {
-            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_mask");
-            ConditionalSelectScenario(_mask, _fld1, _fld2, _falseFld);
-            
-            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_zero");
-            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _falseFld);
-            
-            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_all");
-            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _falseFld);            
-        }
-
-        public void ConditionalSelect_ZeroOp()
-        {
-            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_mask");
-            ConditionalSelectScenario(_mask, _fld1, _fld2, {Op1VectorType}<{Op1BaseType}>.Zero);
-            
-            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_zero");
-            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, {Op1VectorType}<{Op1BaseType}>.Zero);
-            
-            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_all");
-            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, {Op1VectorType}<{Op1BaseType}>.Zero);            
-        }
-
-        [method: MethodImpl(MethodImplOptions.AggressiveInlining)]
-        private void ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}> mask, {Op1VectorType}<{Op1BaseType}> op1, {Op1VectorType}<{Op1BaseType}> op2, {Op1VectorType}<{Op1BaseType}> falseOp)
-        {
-            var result = Sve.ConditionalSelect(mask, {Isa}.{Method}(op1, op2), falseOp);
-
-            Unsafe.Write(_dataTable.outArrayPtr, result);
-            ValidateConditionalSelectResult(mask, op1, op2, falseOp, _dataTable.outArrayPtr);
-        }
-
-        public void RunUnsupportedScenario()
-        {
-            TestLibrary.TestFramework.BeginScenario(nameof(RunUnsupportedScenario));
-
-            bool succeeded = false;
-
-            try
-            {
-                RunBasicScenario_UnsafeRead();
-            }
-            catch (PlatformNotSupportedException)
-            {
-                succeeded = true;
-            }
-
-            if (!succeeded)
-            {
-                Succeeded = false;
-            }
-        }
-
-        private void ValidateConditionalSelectResult({Op1VectorType}<{Op1BaseType}> maskOp, {Op1VectorType}<{Op1BaseType}> leftOp, {Op1VectorType}<{Op1BaseType}> rightOp, {Op1VectorType}<{Op1BaseType}> falseOp, void* output, [CallerMemberName] string method = "")
-        {
-            {Op1BaseType}[] mask = new {Op1BaseType}[Op1ElementCount];
-            {Op1BaseType}[] left = new {Op1BaseType}[Op1ElementCount];
-            {Op1BaseType}[] right = new {Op1BaseType}[Op1ElementCount];
-            {Op1BaseType}[] falseVal = new {Op1BaseType}[Op1ElementCount];
-            {RetBaseType}[] result = new {RetBaseType}[RetElementCount];
-
-            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref mask[0]), maskOp);
-            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref left[0]), leftOp);
-            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref right[0]), rightOp);
-            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref falseVal[0]), falseOp);
-            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref result[0]), ref Unsafe.AsRef<byte>(output), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
-
-            bool succeeded = true;
-
-            {TemplateValidationLogicForCndSel}
-
-            if (!succeeded)
-            {
-                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1VectorType}<{Op1BaseType}>, {Op2VectorType}<{Op2BaseType}>): {method} failed:");
-                TestLibrary.TestFramework.LogInformation($"    mask: ({string.Join(", ", mask)})");
-                TestLibrary.TestFramework.LogInformation($"    left: ({string.Join(", ", left)})");
-                TestLibrary.TestFramework.LogInformation($"   right: ({string.Join(", ", right)})");
-                TestLibrary.TestFramework.LogInformation($" falseOp: ({string.Join(", ", falseVal)})");
-                TestLibrary.TestFramework.LogInformation($"  result: ({string.Join(", ", result)})");
-                TestLibrary.TestFramework.LogInformation(string.Empty);
-
-                Succeeded = false;
-            }
-        }
-
-        private void ValidateResult({Op1VectorType}<{Op1BaseType}> op1, {Op2VectorType}<{Op2BaseType}> op2, void* result, [CallerMemberName] string method = "")
-        {
-            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount];
-            {Op2BaseType}[] inArray2 = new {Op2BaseType}[Op2ElementCount];
-            {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
-
-            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), op1);
-            Unsafe.WriteUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), op2);
-            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
-
-            ValidateResult(inArray1, inArray2, outArray, method);
-        }
-
-        private void ValidateResult(void* op1, void* op2, void* result, [CallerMemberName] string method = "")
-        {
-            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount];
-            {Op2BaseType}[] inArray2 = new {Op2BaseType}[Op2ElementCount];
-            {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
-
-            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), ref Unsafe.AsRef<byte>(op1), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
-            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), ref Unsafe.AsRef<byte>(op2), (uint)Unsafe.SizeOf<{Op2VectorType}<{Op2BaseType}>>());
-            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
-
-            ValidateResult(inArray1, inArray2, outArray, method);
-        }
-
-        private void ValidateResult({Op1BaseType}[] left, {Op2BaseType}[] right, {RetBaseType}[] result, [CallerMemberName] string method = "")
-        {
-            bool succeeded = true;
-
-            {TemplateValidationLogic}
-
-            if (!succeeded)
-            {
-                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1VectorType}<{Op1BaseType}>, {Op2VectorType}<{Op2BaseType}>): {method} failed:");
-                TestLibrary.TestFramework.LogInformation($"    left: ({string.Join(", ", left)})");
-                TestLibrary.TestFramework.LogInformation($"   right: ({string.Join(", ", right)})");
-                TestLibrary.TestFramework.LogInformation($"  result: ({string.Join(", ", result)})");
-                TestLibrary.TestFramework.LogInformation(string.Empty);
-
-                Succeeded = false;
-            }
-        }
-    }
-}

From 76b42bd4bc1b53f9d547a1695014d5cebb76b56d Mon Sep 17 00:00:00 2001
From: TIHan <lol.tihan@gmail.com>
Date: Tue, 2 Jul 2024 14:42:24 -0700
Subject: [PATCH 03/24] Added template

---
 .../SveLoadVectorFirstFaultingTest.template   | 270 ++++++++++++++++++
 1 file changed, 270 insertions(+)
 create mode 100644 src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template

diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
new file mode 100644
index 00000000000000..6db96f274322cf
--- /dev/null
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
@@ -0,0 +1,270 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+/******************************************************************************
+ * This file is auto-generated from a template file by the GenerateTests.csx  *
+ * script in tests\src\JIT\HardwareIntrinsics\Arm\Shared. In order to make    *
+ * changes, please update the corresponding template and run according to the *
+ * directions listed in the file.                                             *
+ ******************************************************************************/
+
+using System;
+using System.Numerics;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Runtime.Intrinsics;
+using System.Runtime.Intrinsics.Arm;
+using Xunit;
+
+namespace JIT.HardwareIntrinsics.Arm
+{
+    public static partial class Program
+    {
+        [Fact]
+        public static void {TestName}()
+        {
+            var test = new LoadUnaryOpTest__{TestName}();
+
+            if (test.IsSupported)
+            {
+                // Validates basic functionality works
+                test.RunBasicScenario_Load();
+
+                // Validates calling via reflection works
+                test.RunReflectionScenario_Load();
+
+                // Validates passing an instance member of a class works
+                test.RunClassFldScenario();
+
+                // Validates passing the field of a local struct works
+                test.RunStructLclFldScenario();
+
+                // Validates passing an instance member of a struct works
+                test.RunStructFldScenario();
+            }
+            else
+            {
+                // Validates we throw on unsupported hardware
+                test.RunUnsupportedScenario();
+            }
+
+            if (!test.Succeeded)
+            {
+                throw new Exception("One or more scenarios did not complete as expected.");
+            }
+        }
+    }
+
+    public sealed unsafe class LoadUnaryOpTest__{TestName}
+    {
+        private struct DataTable
+        {
+            private byte[] inArray1;
+            private byte[] outArray;
+
+            private GCHandle inHandle1;
+            private GCHandle outHandle;
+
+            private ulong alignment;
+
+            public DataTable({Op2BaseType}[] inArray1, {RetBaseType}[] outArray, int alignment)
+            {
+                int sizeOfinArray1 = inArray1.Length * Unsafe.SizeOf<{Op2BaseType}>();
+                int sizeOfoutArray = outArray.Length * Unsafe.SizeOf<{RetBaseType}>();
+                if ((alignment != 64 && alignment != 16 && alignment != 8) || (alignment * 2) < sizeOfinArray1 || (alignment * 2) < sizeOfoutArray)
+                {
+                    throw new ArgumentException($"Invalid value of alignment: {alignment}, sizeOfinArray1: {sizeOfinArray1}, sizeOfoutArray: {sizeOfoutArray}");
+                }
+
+                this.inArray1 = new byte[alignment * 2];
+                this.outArray = new byte[alignment * 2];
+
+                this.inHandle1 = GCHandle.Alloc(this.inArray1, GCHandleType.Pinned);
+                this.outHandle = GCHandle.Alloc(this.outArray, GCHandleType.Pinned);
+
+                this.alignment = (ulong)alignment;
+
+                Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(inArray1Ptr), ref Unsafe.As<{Op2BaseType}, byte>(ref inArray1[0]), (uint)sizeOfinArray1);
+
+            }
+
+            public void* inArray1Ptr => Align((byte*)(inHandle1.AddrOfPinnedObject().ToPointer()), alignment);
+            public void* outArrayPtr => Align((byte*)(outHandle.AddrOfPinnedObject().ToPointer()), alignment);
+
+            public void Dispose()
+            {
+                inHandle1.Free();
+                outHandle.Free();
+            }
+
+            private static unsafe void* Align(byte* buffer, ulong expectedAlignment)
+            {
+                return (void*)(((ulong)buffer + expectedAlignment - 1) & ~(expectedAlignment - 1));
+            }
+        }
+
+        private struct TestStruct
+        {
+            public {Op1VectorType}<{RetBaseType}> _fld1;
+
+            public static TestStruct Create()
+            {
+                var testStruct = new TestStruct();
+
+                for (var i = 0; i < Op2ElementCount; i++) { _data[i] = {NextValueOp2}; }
+                Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1VectorType}<{RetBaseType}>, byte>(ref testStruct._fld1), ref Unsafe.As<{Op1BaseType}, byte>(ref _data[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{RetBaseType}>>());
+
+                return testStruct;
+            }
+
+            public void RunStructFldScenario(LoadUnaryOpTest__{TestName} testClass)
+            {
+                {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All);
+
+                var result = {Isa}.{Method}(loadMask, ({Op2BaseType}*)testClass._dataTable.inArray1Ptr);
+
+                Unsafe.Write(testClass._dataTable.outArrayPtr, result);
+                testClass.ValidateResult(testClass._dataTable.inArray1Ptr, testClass._dataTable.outArrayPtr);
+            }
+        }   
+
+        private static readonly int LargestVectorSize = {LargestVectorSize};
+
+        private static readonly int Op2ElementCount = Unsafe.SizeOf<{RetVectorType}<{Op2BaseType}>>() / sizeof({Op2BaseType});
+        private static readonly int RetElementCount = Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>() / sizeof({RetBaseType});
+
+        private static {Op1BaseType}[] _data = new {Op1BaseType}[Op2ElementCount];
+
+        private {Op1VectorType}<{RetBaseType}> _fld1;
+
+        private DataTable _dataTable;
+
+        public LoadUnaryOpTest__{TestName}()
+        {
+            Succeeded = true;
+
+            for (var i = 0; i < Op2ElementCount; i++) { _data[i] = {NextValueOp2}; }
+            _dataTable = new DataTable(_data, new {RetBaseType}[RetElementCount], LargestVectorSize);
+        }
+
+        public bool IsSupported => {Isa}.IsSupported;
+
+        public bool Succeeded { get; set; }
+
+        public void RunBasicScenario_Load()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_Load));
+
+            {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All);
+
+            var result = {Isa}.{Method}(
+                loadMask,
+                ({Op2BaseType}*)(_dataTable.inArray1Ptr)
+            );
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(_dataTable.inArray1Ptr, _dataTable.outArrayPtr);
+        }
+
+        public void RunReflectionScenario_Load()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_Load));
+
+            {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All);
+
+            var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof(Vector<{Op1BaseType}>), typeof({Op2BaseType}*) })
+                                     .Invoke(null, new object[] {
+                                        loadMask,
+                                        Pointer.Box(_dataTable.inArray1Ptr, typeof({Op2BaseType}*))
+                                     });
+
+            Unsafe.Write(_dataTable.outArrayPtr, ({RetVectorType}<{RetBaseType}>)(result));
+            ValidateResult(_dataTable.inArray1Ptr, _dataTable.outArrayPtr);
+        }
+
+        public void RunClassFldScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario));
+
+            {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All);
+
+            _fld1 = {Isa}.{Method}(loadMask, ({Op2BaseType}*)_dataTable.inArray1Ptr);
+
+            Unsafe.Write(_dataTable.outArrayPtr, _fld1);
+            ValidateResult(_dataTable.inArray1Ptr, _dataTable.outArrayPtr);
+        }
+
+        public void RunStructLclFldScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario));
+
+            {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All);
+
+            var test = TestStruct.Create();
+            test._fld1 = {Isa}.{Method}(loadMask, ({Op2BaseType}*)_dataTable.inArray1Ptr);
+
+            Unsafe.Write(_dataTable.outArrayPtr, test._fld1);
+            ValidateResult(_dataTable.inArray1Ptr, _dataTable.outArrayPtr);
+        }
+
+        public void RunStructFldScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario));
+
+            var test = TestStruct.Create();
+            test.RunStructFldScenario(this);
+        }
+
+        public void RunUnsupportedScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunUnsupportedScenario));
+
+            Succeeded = false;
+
+            try
+            {
+                RunBasicScenario_Load();
+            }
+            catch (PlatformNotSupportedException)
+            {
+                Succeeded = true;
+            }
+        }
+
+        private void ValidateResult(void* firstOp, void* result, [CallerMemberName] string method = "")
+        {
+            {Op2BaseType}[] inArray = new {Op2BaseType}[Op2ElementCount];
+            {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray[0]), ref Unsafe.AsRef<byte>(firstOp), (uint)Unsafe.SizeOf<{RetVectorType}<{Op2BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateResult(inArray, outArray, method);
+        }
+
+        private void ValidateResult({Op2BaseType}[] firstOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
+        {
+            bool succeeded = true;
+
+            for (var i = 0; i < RetElementCount; i++)
+            {
+                if ({ValidateIterResult})
+                {
+                    succeeded = false;
+                    break;
+                }
+            }
+
+            if (!succeeded)
+            {
+                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1VectorType}<{Op1BaseType}>, {Op2BaseType}): {method} failed:");
+                TestLibrary.TestFramework.LogInformation($"  firstOp: ({string.Join(", ", firstOp)})");
+                TestLibrary.TestFramework.LogInformation($"   result: ({string.Join(", ", result)})");
+                TestLibrary.TestFramework.LogInformation(string.Empty);
+
+                Succeeded = false;
+            }
+        }
+    }
+}

From bb01e370b73f9b4a2f55af723c774f6d58462055 Mon Sep 17 00:00:00 2001
From: TIHan <lol.tihan@gmail.com>
Date: Wed, 3 Jul 2024 19:43:22 -0700
Subject: [PATCH 04/24] Trying to test first-faulting behavior

---
 src/coreclr/jit/fgdiagnostic.cpp              |   3 +
 src/coreclr/jit/gentree.cpp                   |   6 ++
 src/coreclr/jit/hwintrinsiccodegenarm64.cpp   |   7 ++
 src/coreclr/jit/hwintrinsiclistarm64sve.h     |   6 +-
 .../SveLoadVectorFirstFaultingTest.template   | 100 +++++++++++++++++-
 5 files changed, 114 insertions(+), 8 deletions(-)

diff --git a/src/coreclr/jit/fgdiagnostic.cpp b/src/coreclr/jit/fgdiagnostic.cpp
index ffc7a933b5cb51..c70e177b6c317a 100644
--- a/src/coreclr/jit/fgdiagnostic.cpp
+++ b/src/coreclr/jit/fgdiagnostic.cpp
@@ -3459,6 +3459,9 @@ void Compiler::fgDebugCheckFlags(GenTree* tree, BasicBlock* block)
 
 #if defined(TARGET_ARM64)
                     case NI_ArmBase_Yield:
+                    case NI_Sve_GatherVectorFirstFaulting:
+                    case NI_Sve_LoadVectorFirstFaulting:
+                    case NI_Sve_SetFfr:
                     {
                         assert(tree->OperRequiresCallFlag(this));
                         expectedFlags |= GTF_GLOB_REF;
diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp
index 485be7a5cd28db..1fcc4215a208d3 100644
--- a/src/coreclr/jit/gentree.cpp
+++ b/src/coreclr/jit/gentree.cpp
@@ -27983,6 +27983,9 @@ bool GenTreeHWIntrinsic::OperRequiresCallFlag() const
 
 #if defined(TARGET_ARM64)
             case NI_ArmBase_Yield:
+            case NI_Sve_GatherVectorFirstFaulting:
+            case NI_Sve_LoadVectorFirstFaulting:
+            case NI_Sve_SetFfr:
             {
                 return true;
             }
@@ -28165,6 +28168,9 @@ void GenTreeHWIntrinsic::Initialize(NamedIntrinsic intrinsicId)
 
 #if defined(TARGET_ARM64)
             case NI_ArmBase_Yield:
+            case NI_Sve_GatherVectorFirstFaulting:
+            case NI_Sve_LoadVectorFirstFaulting:
+            case NI_Sve_SetFfr:
             {
                 // Mark as a call and global reference, much as is done for GT_KEEPALIVE
                 gtFlags |= (GTF_CALL | GTF_GLOB_REF);
diff --git a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp
index 3be591c1811ee4..d1eaab44c7103f 100644
--- a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp
+++ b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp
@@ -2324,6 +2324,13 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
                 break;
             }
 
+            case NI_Sve_SetFfr:
+            {
+                assert(targetReg == REG_NA);
+                GetEmitter()->emitIns_R(ins, emitSize, op1Reg, opt);
+                break;
+            }
+
             default:
                 unreached();
         }
diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h
index c003ff22ee99b8..6d6587711c97a3 100644
--- a/src/coreclr/jit/hwintrinsiclistarm64sve.h
+++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h
@@ -90,7 +90,7 @@ HARDWARE_INTRINSIC(Sve,           GatherPrefetch64Bit,
 HARDWARE_INTRINSIC(Sve,           GatherPrefetch8Bit,                                               -1,     -1,      false, {INS_sve_prfb,       INS_sve_prfb,       INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasImmediateOperand|HW_Flag_HasEnumOperand)
 HARDWARE_INTRINSIC(Sve,           GatherVector,                                                     -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1w,       INS_sve_ld1w,       INS_sve_ld1d,       INS_sve_ld1d,       INS_sve_ld1w,       INS_sve_ld1d},    HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GatherVectorByteZeroExtend,                                       -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1b,       INS_sve_ld1b,       INS_sve_ld1b,       INS_sve_ld1b,       INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
-HARDWARE_INTRINSIC(Sve,           GatherVectorFirstFaulting,                                        -1,      3,      true,  {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ldff1w,     INS_sve_ldff1w,     INS_sve_ldff1d,     INS_sve_ldff1d,     INS_sve_ldff1w,     INS_sve_ldff1d},  HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
+HARDWARE_INTRINSIC(Sve,           GatherVectorFirstFaulting,                                        -1,      3,      true,  {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ldff1w,     INS_sve_ldff1w,     INS_sve_ldff1d,     INS_sve_ldff1d,     INS_sve_ldff1w,     INS_sve_ldff1d},  HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_SpecialSideEffectMask)
 HARDWARE_INTRINSIC(Sve,           GatherVectorInt16SignExtend,                                      -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1sh,      INS_sve_ld1sh,      INS_sve_ld1sh,      INS_sve_ld1sh,      INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GatherVectorInt16WithByteOffsetsSignExtend,                       -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1sh,      INS_sve_ld1sh,      INS_sve_ld1sh,      INS_sve_ld1sh,      INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GatherVectorInt32SignExtend,                                      -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1sw,      INS_sve_ld1sw,      INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
@@ -123,7 +123,7 @@ HARDWARE_INTRINSIC(Sve,           LoadVectorByteZeroExtendToInt64,
 HARDWARE_INTRINSIC(Sve,           LoadVectorByteZeroExtendToUInt16,                                 -1,      2,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1b,       INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           LoadVectorByteZeroExtendToUInt32,                                 -1,      2,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1b,       INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           LoadVectorByteZeroExtendToUInt64,                                 -1,      2,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1b,       INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
-HARDWARE_INTRINSIC(Sve,           LoadVectorFirstFaulting,                                          -1,      2,      true,  {INS_sve_ldff1b,     INS_sve_ldff1b,     INS_sve_ldff1h,     INS_sve_ldff1h,     INS_sve_ldff1w,     INS_sve_ldff1w,     INS_sve_ldff1d,     INS_sve_ldff1d,     INS_sve_ldff1w,     INS_sve_ldff1d},  HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_SpecialCodeGen)
+HARDWARE_INTRINSIC(Sve,           LoadVectorFirstFaulting,                                          -1,      2,      true,  {INS_sve_ldff1b,     INS_sve_ldff1b,     INS_sve_ldff1h,     INS_sve_ldff1h,     INS_sve_ldff1w,     INS_sve_ldff1w,     INS_sve_ldff1d,     INS_sve_ldff1d,     INS_sve_ldff1w,     INS_sve_ldff1d},  HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_SpecialCodeGen|HW_Flag_SpecialSideEffectMask)
 HARDWARE_INTRINSIC(Sve,           LoadVectorInt16NonFaultingSignExtendToInt32,                      -1,      -1,     false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ldnf1sh,    INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           LoadVectorInt16NonFaultingSignExtendToInt64,                      -1,      -1,     false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ldnf1sh,    INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           LoadVectorInt16NonFaultingSignExtendToUInt32,                     -1,      -1,     false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ldnf1sh,    INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
@@ -210,7 +210,7 @@ HARDWARE_INTRINSIC(Sve,           SaturatingIncrementBy64BitElementCount,
 HARDWARE_INTRINSIC(Sve,           SaturatingIncrementBy8BitElementCount,                             0,      3,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_sqincb,     INS_sve_uqincb,     INS_sve_sqincb,     INS_sve_uqincb,     INS_invalid,        INS_invalid},     HW_Category_Scalar,                HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_HasEnumOperand|HW_Flag_SpecialCodeGen|HW_Flag_SpecialImport|HW_Flag_HasRMWSemantics)
 HARDWARE_INTRINSIC(Sve,           SaturatingIncrementByActiveElementCount,                          -1,      2,      true,  {INS_invalid,        INS_sve_sqincp,     INS_sve_sqincp,     INS_sve_sqincp,     INS_sve_sqincp,     INS_sve_sqincp,     INS_sve_sqincp,     INS_sve_sqincp,     INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_SpecialImport|HW_Flag_BaseTypeFromSecondArg|HW_Flag_HasRMWSemantics)
 HARDWARE_INTRINSIC(Sve,           Scale,                                                            -1,      -1,     false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_fscale,     INS_sve_fscale},  HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasRMWSemantics)
-HARDWARE_INTRINSIC(Sve,           SetFfr,                                                           -1,      1,      true,  {INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation)
+HARDWARE_INTRINSIC(Sve,           SetFfr,                                                           -1,      1,      true,  {INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_BaseTypeFromFirstArg|HW_Flag_SpecialSideEffectMask|HW_Flag_SpecialCodeGen)
 HARDWARE_INTRINSIC(Sve,           ShiftLeftLogical,                                                 -1,      -1,     false, {INS_sve_lsl,        INS_sve_lsl,        INS_sve_lsl,        INS_sve_lsl,        INS_sve_lsl,        INS_sve_lsl,        INS_sve_lsl,        INS_sve_lsl,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasRMWSemantics)
 HARDWARE_INTRINSIC(Sve,           ShiftRightArithmetic,                                             -1,      -1,     false, {INS_sve_asr,        INS_invalid,        INS_sve_asr,        INS_invalid,        INS_sve_asr,        INS_invalid,        INS_sve_asr,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasRMWSemantics)
 HARDWARE_INTRINSIC(Sve,           ShiftRightLogical,                                                -1,      -1,     false, {INS_invalid,        INS_sve_lsr,        INS_invalid,        INS_sve_lsr,        INS_invalid,        INS_sve_lsr,        INS_invalid,        INS_sve_lsr,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasRMWSemantics)
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
index 6db96f274322cf..6cf38c1a27b54c 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
@@ -24,12 +24,13 @@ namespace JIT.HardwareIntrinsics.Arm
         [Fact]
         public static void {TestName}()
         {
-            var test = new LoadUnaryOpTest__{TestName}();
+            var test = new Sve__{TestName}();
 
             if (test.IsSupported)
             {
                 // Validates basic functionality works
                 test.RunBasicScenario_Load();
+                test.RunBasicScenario_LoadFirstFaulting();
 
                 // Validates calling via reflection works
                 test.RunReflectionScenario_Load();
@@ -56,14 +57,16 @@ namespace JIT.HardwareIntrinsics.Arm
         }
     }
 
-    public sealed unsafe class LoadUnaryOpTest__{TestName}
+    public sealed unsafe class Sve__{TestName}
     {
         private struct DataTable
         {
             private byte[] inArray1;
+            private byte[] inArray1Half;
             private byte[] outArray;
 
             private GCHandle inHandle1;
+            private GCHandle inHandle1Half;
             private GCHandle outHandle;
 
             private ulong alignment;
@@ -71,6 +74,7 @@ namespace JIT.HardwareIntrinsics.Arm
             public DataTable({Op2BaseType}[] inArray1, {RetBaseType}[] outArray, int alignment)
             {
                 int sizeOfinArray1 = inArray1.Length * Unsafe.SizeOf<{Op2BaseType}>();
+                int sizeOfinArray1Half = sizeOfinArray1 / 2;
                 int sizeOfoutArray = outArray.Length * Unsafe.SizeOf<{RetBaseType}>();
                 if ((alignment != 64 && alignment != 16 && alignment != 8) || (alignment * 2) < sizeOfinArray1 || (alignment * 2) < sizeOfoutArray)
                 {
@@ -78,23 +82,27 @@ namespace JIT.HardwareIntrinsics.Arm
                 }
 
                 this.inArray1 = new byte[alignment * 2];
+                this.inArray1Half = new byte[(alignment * 2) / 2];
                 this.outArray = new byte[alignment * 2];
 
                 this.inHandle1 = GCHandle.Alloc(this.inArray1, GCHandleType.Pinned);
+                this.inHandle1Half = GCHandle.Alloc(this.inArray1Half, GCHandleType.Pinned);
                 this.outHandle = GCHandle.Alloc(this.outArray, GCHandleType.Pinned);
 
                 this.alignment = (ulong)alignment;
 
                 Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(inArray1Ptr), ref Unsafe.As<{Op2BaseType}, byte>(ref inArray1[0]), (uint)sizeOfinArray1);
-
+                Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(inArray1HalfPtr), ref Unsafe.As<{Op2BaseType}, byte>(ref inArray1[0]), (uint)sizeOfinArray1Half);
             }
 
             public void* inArray1Ptr => Align((byte*)(inHandle1.AddrOfPinnedObject().ToPointer()), alignment);
+            public void* inArray1HalfPtr => Align((byte*)(inHandle1Half.AddrOfPinnedObject().ToPointer()), alignment);
             public void* outArrayPtr => Align((byte*)(outHandle.AddrOfPinnedObject().ToPointer()), alignment);
 
             public void Dispose()
             {
                 inHandle1.Free();
+                inHandle1Half.Free();
                 outHandle.Free();
             }
 
@@ -118,7 +126,7 @@ namespace JIT.HardwareIntrinsics.Arm
                 return testStruct;
             }
 
-            public void RunStructFldScenario(LoadUnaryOpTest__{TestName} testClass)
+            public void RunStructFldScenario(Sve__{TestName} testClass)
             {
                 {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All);
 
@@ -140,7 +148,7 @@ namespace JIT.HardwareIntrinsics.Arm
 
         private DataTable _dataTable;
 
-        public LoadUnaryOpTest__{TestName}()
+        public Sve__{TestName}()
         {
             Succeeded = true;
 
@@ -167,6 +175,24 @@ namespace JIT.HardwareIntrinsics.Arm
             ValidateResult(_dataTable.inArray1Ptr, _dataTable.outArrayPtr);
         }
 
+        public void RunBasicScenario_LoadFirstFaulting()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_LoadFirstFaulting));
+
+            {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All);
+
+            var op2Ptr = ({Op2BaseType}*)(_dataTable.inArray1HalfPtr);
+            Sve.SetFfr(Sve.CreateTrueMaskByte(SveMaskPattern.All));
+            var result = {Isa}.{Method}(
+                loadMask,
+                op2Ptr
+            );
+            var faultResult = Sve.GetFfr();
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateFirstFaultingResult(_dataTable.inArray1HalfPtr, _dataTable.outArrayPtr, faultResult.As<byte, {RetBaseType}>());
+        }
+
         public void RunReflectionScenario_Load()
         {
             TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_Load));
@@ -266,5 +292,69 @@ namespace JIT.HardwareIntrinsics.Arm
                 Succeeded = false;
             }
         }
+
+        private void ValidateFirstFaultingResult(void* firstOp, void* result, Vector<{RetBaseType}> faultResult, [CallerMemberName] string method = "")
+        {
+            {Op2BaseType}[] inArray = new {Op2BaseType}[Op2ElementCount / 2];
+            {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray[0]), ref Unsafe.AsRef<byte>(firstOp), (uint)Unsafe.SizeOf<{RetVectorType}<{Op2BaseType}>>() / 2);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateFirstFaultingResult(inArray, outArray, faultResult, method);
+        }
+
+        private void ValidateFirstFaultingResult({Op2BaseType}[] firstOp, {RetBaseType}[] result, Vector<{RetBaseType}> faultResult, [CallerMemberName] string method = "")
+        {
+            bool succeeded = true;
+
+            for (var i = 0; i < RetElementCount; i++)
+            {
+                if (i < (RetElementCount / 2))
+                {
+                    if ({ValidateIterResult})
+                    {
+                        succeeded = false;
+                        break;
+                    }
+                }
+                else
+                {
+                    if (result[i] != 0)
+                    {
+                        succeeded = false;
+                        break;
+                    }
+                }
+
+                if (i == (RetElementCount / 2))
+                {
+                    if (faultResult[i] != 0)
+                    {
+                        succeeded = false;
+                        break;
+                    }
+                }
+                else
+                {
+                    if (faultResult[i] != 1)
+                    {
+                        succeeded = false;
+                        break;
+                    }
+                }
+            }
+
+            if (!succeeded)
+            {
+                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}({Op1VectorType}<{Op1BaseType}>, {Op1VectorType}<{Op2BaseType}>): {method} failed:");
+                TestLibrary.TestFramework.LogInformation($"       firstOp: ({string.Join(", ", firstOp)})");
+                TestLibrary.TestFramework.LogInformation($"        result: ({string.Join(", ", result)})");
+                TestLibrary.TestFramework.LogInformation($"   faultResult: ({faultResult})");
+                TestLibrary.TestFramework.LogInformation(string.Empty);
+
+                Succeeded = false;
+            }
+        }
     }
 }

From a602b245c268fe6c4664c2cf58f0c2841c8248b0 Mon Sep 17 00:00:00 2001
From: TIHan <lol.tihan@gmail.com>
Date: Fri, 5 Jul 2024 19:37:07 -0700
Subject: [PATCH 05/24] Using BoundedMemory to test FirstFaulting behavior for
 LoadVector.

---
 .../System/Buffers/BoundedMemory.Windows.cs   | 18 ++--
 .../SveLoadVectorFirstFaultingTest.template   | 92 +++++++++++++------
 .../HardwareIntrinsics/Arm/Sve/Sve_r.csproj   |  5 +
 .../HardwareIntrinsics/Arm/Sve/Sve_ro.csproj  |  5 +
 4 files changed, 81 insertions(+), 39 deletions(-)

diff --git a/src/libraries/Common/tests/TestUtilities/System/Buffers/BoundedMemory.Windows.cs b/src/libraries/Common/tests/TestUtilities/System/Buffers/BoundedMemory.Windows.cs
index 96f40d61492e52..82572aaf14a188 100644
--- a/src/libraries/Common/tests/TestUtilities/System/Buffers/BoundedMemory.Windows.cs
+++ b/src/libraries/Common/tests/TestUtilities/System/Buffers/BoundedMemory.Windows.cs
@@ -288,38 +288,38 @@ protected override bool ReleaseHandle() =>
                 UnsafeNativeMethods.VirtualFree(handle, IntPtr.Zero, VirtualAllocAllocationType.MEM_RELEASE);
         }
 
-        private static partial class UnsafeNativeMethods
+        private static class UnsafeNativeMethods
         {
             private const string KERNEL32_LIB = "kernel32.dll";
 
             // https://msdn.microsoft.com/en-us/library/windows/desktop/aa366887(v=vs.85).aspx
-            [LibraryImport(KERNEL32_LIB, SetLastError = true)]
-            public static partial VirtualAllocHandle VirtualAlloc(
+            [DllImport(KERNEL32_LIB, SetLastError = true)]
+            public static extern VirtualAllocHandle VirtualAlloc(
                 IntPtr lpAddress,
                 IntPtr dwSize,
                 VirtualAllocAllocationType flAllocationType,
                 VirtualAllocProtection flProtect);
 
             // https://msdn.microsoft.com/en-us/library/windows/desktop/aa366892(v=vs.85).aspx
-            [LibraryImport(KERNEL32_LIB, SetLastError = true)]
+            [DllImport(KERNEL32_LIB, SetLastError = true)]
             [return: MarshalAs(UnmanagedType.Bool)]
-            public static partial bool VirtualFree(
+            public static extern bool VirtualFree(
                 IntPtr lpAddress,
                 IntPtr dwSize,
                 VirtualAllocAllocationType dwFreeType);
 
             // https://msdn.microsoft.com/en-us/library/windows/desktop/aa366898(v=vs.85).aspx
-            [LibraryImport(KERNEL32_LIB, SetLastError = true)]
+            [DllImport(KERNEL32_LIB, SetLastError = true)]
             [return: MarshalAs(UnmanagedType.Bool)]
-            public static partial bool VirtualProtect(
+            public static extern bool VirtualProtect(
                 IntPtr lpAddress,
                 IntPtr dwSize,
                 VirtualAllocProtection flNewProtect,
                 out VirtualAllocProtection lpflOldProtect);
 
             // https://msdn.microsoft.com/en-us/library/windows/desktop/aa366902(v=vs.85).aspx
-            [LibraryImport(KERNEL32_LIB, SetLastError = true)]
-            public static partial IntPtr VirtualQuery(
+            [DllImport(KERNEL32_LIB, SetLastError = true)]
+            public static extern IntPtr VirtualQuery(
                 IntPtr lpAddress,
                 out MEMORY_BASIC_INFORMATION lpBuffer,
                 IntPtr dwLength);
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
index 6cf38c1a27b54c..d92fa79e3c3924 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
@@ -9,6 +9,7 @@
  ******************************************************************************/
 
 using System;
+using System.Buffers;
 using System.Numerics;
 using System.Reflection;
 using System.Runtime.CompilerServices;
@@ -31,6 +32,7 @@ namespace JIT.HardwareIntrinsics.Arm
                 // Validates basic functionality works
                 test.RunBasicScenario_Load();
                 test.RunBasicScenario_LoadFirstFaulting();
+                test.RunBasicScenario_LoadFirstFaulting_IntermittentCalls();
 
                 // Validates calling via reflection works
                 test.RunReflectionScenario_Load();
@@ -62,11 +64,9 @@ namespace JIT.HardwareIntrinsics.Arm
         private struct DataTable
         {
             private byte[] inArray1;
-            private byte[] inArray1Half;
             private byte[] outArray;
 
             private GCHandle inHandle1;
-            private GCHandle inHandle1Half;
             private GCHandle outHandle;
 
             private ulong alignment;
@@ -74,7 +74,7 @@ namespace JIT.HardwareIntrinsics.Arm
             public DataTable({Op2BaseType}[] inArray1, {RetBaseType}[] outArray, int alignment)
             {
                 int sizeOfinArray1 = inArray1.Length * Unsafe.SizeOf<{Op2BaseType}>();
-                int sizeOfinArray1Half = sizeOfinArray1 / 2;
+                int sizeOfinBounded = new Random().Next(Unsafe.SizeOf<{Op2BaseType}>(), sizeOfinArray1 - 1);
                 int sizeOfoutArray = outArray.Length * Unsafe.SizeOf<{RetBaseType}>();
                 if ((alignment != 64 && alignment != 16 && alignment != 8) || (alignment * 2) < sizeOfinArray1 || (alignment * 2) < sizeOfoutArray)
                 {
@@ -82,27 +82,27 @@ namespace JIT.HardwareIntrinsics.Arm
                 }
 
                 this.inArray1 = new byte[alignment * 2];
-                this.inArray1Half = new byte[(alignment * 2) / 2];
                 this.outArray = new byte[alignment * 2];
 
                 this.inHandle1 = GCHandle.Alloc(this.inArray1, GCHandleType.Pinned);
-                this.inHandle1Half = GCHandle.Alloc(this.inArray1Half, GCHandleType.Pinned);
                 this.outHandle = GCHandle.Alloc(this.outArray, GCHandleType.Pinned);
 
                 this.alignment = (ulong)alignment;
 
+                this.inBounded = BoundedMemory.Allocate<byte>(sizeOfinBounded, PoisonPagePlacement.After);
+
                 Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(inArray1Ptr), ref Unsafe.As<{Op2BaseType}, byte>(ref inArray1[0]), (uint)sizeOfinArray1);
-                Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(inArray1HalfPtr), ref Unsafe.As<{Op2BaseType}, byte>(ref inArray1[0]), (uint)sizeOfinArray1Half);
+                Unsafe.CopyBlockUnaligned(ref inBounded.Span.GetPinnableReference(), ref Unsafe.As<{Op2BaseType}, byte>(ref inArray1[0]), (uint)sizeOfinBounded);
             }
 
+            public BoundedMemory<byte> inBounded;
+
             public void* inArray1Ptr => Align((byte*)(inHandle1.AddrOfPinnedObject().ToPointer()), alignment);
-            public void* inArray1HalfPtr => Align((byte*)(inHandle1Half.AddrOfPinnedObject().ToPointer()), alignment);
             public void* outArrayPtr => Align((byte*)(outHandle.AddrOfPinnedObject().ToPointer()), alignment);
 
             public void Dispose()
             {
                 inHandle1.Free();
-                inHandle1Half.Free();
                 outHandle.Free();
             }
 
@@ -181,16 +181,44 @@ namespace JIT.HardwareIntrinsics.Arm
 
             {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All);
 
-            var op2Ptr = ({Op2BaseType}*)(_dataTable.inArray1HalfPtr);
+            ref var op2Ref = ref (_dataTable.inBounded.Span.GetPinnableReference());
+            
+            Sve.SetFfr(Sve.CreateTrueMaskByte(SveMaskPattern.All));
+            var result = {Isa}.{Method}(
+                loadMask,
+                ({Op2BaseType}*)(Unsafe.AsPointer(ref op2Ref))
+            );
+            var faultResult = Sve.GetFfr();
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateFirstFaultingResult(ref op2Ref, _dataTable.inBounded.Span.Length, _dataTable.outArrayPtr, faultResult.As<byte, {RetBaseType}>());
+        }
+
+        [MethodImpl(MethodImplOptions.NoInlining)]
+        public static void ConsumeNothing()
+        {
+        }
+
+        public void RunBasicScenario_LoadFirstFaulting_IntermittentCalls()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_LoadFirstFaulting_IntermittentCalls));
+
+            {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All);
+
+            ref var op2Ref = ref (_dataTable.inBounded.Span.GetPinnableReference());
+            
             Sve.SetFfr(Sve.CreateTrueMaskByte(SveMaskPattern.All));
+            ConsumeNothing();
             var result = {Isa}.{Method}(
                 loadMask,
-                op2Ptr
+                ({Op2BaseType}*)(Unsafe.AsPointer(ref op2Ref))
             );
+            ConsumeNothing();
             var faultResult = Sve.GetFfr();
+            ConsumeNothing();
 
             Unsafe.Write(_dataTable.outArrayPtr, result);
-            ValidateFirstFaultingResult(_dataTable.inArray1HalfPtr, _dataTable.outArrayPtr, faultResult.As<byte, {RetBaseType}>());
+            ValidateFirstFaultingResult(ref op2Ref, _dataTable.inBounded.Span.Length, _dataTable.outArrayPtr, faultResult.As<byte, {RetBaseType}>());
         }
 
         public void RunReflectionScenario_Load()
@@ -293,12 +321,12 @@ namespace JIT.HardwareIntrinsics.Arm
             }
         }
 
-        private void ValidateFirstFaultingResult(void* firstOp, void* result, Vector<{RetBaseType}> faultResult, [CallerMemberName] string method = "")
+        private void ValidateFirstFaultingResult(ref byte firstOp, int size, void* result, Vector<{RetBaseType}> faultResult, [CallerMemberName] string method = "")
         {
-            {Op2BaseType}[] inArray = new {Op2BaseType}[Op2ElementCount / 2];
+            {Op2BaseType}[] inArray = new {Op2BaseType}[size / Unsafe.SizeOf<{Op2BaseType}>()];
             {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
 
-            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray[0]), ref Unsafe.AsRef<byte>(firstOp), (uint)Unsafe.SizeOf<{RetVectorType}<{Op2BaseType}>>() / 2);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray[0]), ref firstOp, (uint)(size));
             Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
 
             ValidateFirstFaultingResult(inArray, outArray, faultResult, method);
@@ -308,39 +336,43 @@ namespace JIT.HardwareIntrinsics.Arm
         {
             bool succeeded = true;
 
+            bool hitFault = false;
+
             for (var i = 0; i < RetElementCount; i++)
             {
-                if (i < (RetElementCount / 2))
+                if (hitFault)
                 {
-                    if ({ValidateIterResult})
+                    if (faultResult[i] != 0)
                     {
                         succeeded = false;
                         break;
                     }
-                }
-                else
-                {
+
                     if (result[i] != 0)
                     {
                         succeeded = false;
                         break;
                     }
                 }
-
-                if (i == (RetElementCount / 2))
+                else
                 {
-                    if (faultResult[i] != 0)
+                    if (faultResult[i] == 0)
                     {
-                        succeeded = false;
-                        break;
+                        // There has to be a valid value for the first element, so check it.
+                        if (i == 0)
+                        {
+                            succeeded = false;
+                            break;
+                        }
+                        hitFault = true;
                     }
-                }
-                else
-                {
-                    if (faultResult[i] != 1)
+                    else
                     {
-                        succeeded = false;
-                        break;
+                        if ({ValidateIterResult})
+                        {
+                            succeeded = false;
+                            break;
+                        }
                     }
                 }
             }
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Sve/Sve_r.csproj b/src/tests/JIT/HardwareIntrinsics/Arm/Sve/Sve_r.csproj
index 0918724cfff289..dd4135fc1c866a 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Sve/Sve_r.csproj
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Sve/Sve_r.csproj
@@ -10,5 +10,10 @@
     <Compile Include="Program.Sve.cs" />
     <Compile Include="..\Shared\Helpers.cs" />
     <Compile Include="..\Shared\Program.cs" />
+    <Compile Include="$(RepoRoot)src/libraries/Common/tests/TestUtilities/System/Buffers/BoundedMemory.cs" />
+    <Compile Include="$(RepoRoot)src/libraries/Common/tests/TestUtilities/System/Buffers/BoundedMemory.Creation.cs" />
+    <Compile Include="$(RepoRoot)src/libraries/Common/tests/TestUtilities/System/Buffers/BoundedMemory.Unix.cs" />
+    <Compile Include="$(RepoRoot)src/libraries/Common/tests/TestUtilities/System/Buffers/BoundedMemory.Windows.cs" />
+    <Compile Include="$(RepoRoot)src/libraries/Common/tests/TestUtilities/System/Buffers/PoisonPagePlacement.cs" />
   </ItemGroup>
 </Project>
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Sve/Sve_ro.csproj b/src/tests/JIT/HardwareIntrinsics/Arm/Sve/Sve_ro.csproj
index a9d4a43b42ae16..e23748ff74c8b0 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Sve/Sve_ro.csproj
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Sve/Sve_ro.csproj
@@ -10,5 +10,10 @@
     <Compile Include="Program.Sve.cs" />
     <Compile Include="..\Shared\Helpers.cs" />
     <Compile Include="..\Shared\Program.cs" />
+    <Compile Include="$(RepoRoot)src/libraries/Common/tests/TestUtilities/System/Buffers/BoundedMemory.cs" />
+    <Compile Include="$(RepoRoot)src/libraries/Common/tests/TestUtilities/System/Buffers/BoundedMemory.Creation.cs" />
+    <Compile Include="$(RepoRoot)src/libraries/Common/tests/TestUtilities/System/Buffers/BoundedMemory.Unix.cs" />
+    <Compile Include="$(RepoRoot)src/libraries/Common/tests/TestUtilities/System/Buffers/BoundedMemory.Windows.cs" />
+    <Compile Include="$(RepoRoot)src/libraries/Common/tests/TestUtilities/System/Buffers/PoisonPagePlacement.cs" />
   </ItemGroup>
 </Project>

From 60d410a2495ad4e813fd604e4dec2997ad00b736 Mon Sep 17 00:00:00 2001
From: TIHan <lol.tihan@gmail.com>
Date: Fri, 5 Jul 2024 20:02:15 -0700
Subject: [PATCH 06/24] Fix size in validation

---
 .../Arm/Shared/SveLoadVectorFirstFaultingTest.template          | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
index d92fa79e3c3924..7c0970962d02b9 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
@@ -326,7 +326,7 @@ namespace JIT.HardwareIntrinsics.Arm
             {Op2BaseType}[] inArray = new {Op2BaseType}[size / Unsafe.SizeOf<{Op2BaseType}>()];
             {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
 
-            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray[0]), ref firstOp, (uint)(size));
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray[0]), ref firstOp, (uint)(inArray.Length * Unsafe.SizeOf<{Op2BaseType}>()));
             Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
 
             ValidateFirstFaultingResult(inArray, outArray, faultResult, method);

From aee87d70bc863c54c49d052e7c8b5b17c70a6ecd Mon Sep 17 00:00:00 2001
From: TIHan <lol.tihan@gmail.com>
Date: Mon, 8 Jul 2024 12:02:32 -0700
Subject: [PATCH 07/24] Added more helper functions. Added conditional select
 tests for LoadVectorFirstFaulting.

---
 .../GenerateHWIntrinsicTests_Arm.cs           |  20 +--
 .../HardwareIntrinsics/Arm/Shared/Helpers.cs  | 109 +++++++++++++
 .../Shared/SveGatherVectorIndices.template    |  25 +--
 .../SveLoadVectorFirstFaultingTest.template   | 146 ++++++++----------
 4 files changed, 189 insertions(+), 111 deletions(-)

diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
index d6c0179d2afabb..c844ef1647fea8 100644
--- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
+++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
@@ -3502,16 +3502,16 @@
     ("SveLoadNonFaultingUnOpTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorNonFaulting_uint",                                                                                    ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorNonFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()",     ["Cast"] = "(uint*)",                                                                                    ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
     ("SveLoadNonFaultingUnOpTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorNonFaulting_ulong",                                                                                   ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorNonFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()",     ["Cast"] = "(ulong*)",                                                                                   ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
 
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_float",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Single",                                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_double",                                                                                  ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Double",                                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_sbyte",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "SByte",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "SByte",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "SByte",                                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()",                                                                                         ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_short",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int16",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int16",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int16",                                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()",                                                                                         ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_int",                                                                                     ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int32",                                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                                                                                         ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_long",                                                                                    ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int64",                                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                                                                                         ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_byte",                                                                                    ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Byte",    ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Byte",          ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Byte",                                                                ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetByte()",                                   ["NextValueOp2"] = "TestLibrary.Generator.GetByte()",                                                                                          ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_ushort",                                                                                  ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt16",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt16",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "UInt16",                                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_uint",                                                                                    ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "UInt32",                                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_ulong",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "UInt64",                                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_float",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Single",                                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_double",                                                                                  ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Double",                                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_sbyte",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "SByte",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "SByte",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "SByte",                                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_short",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int16",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int16",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int16",                                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_int",                                                                                     ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int32",                                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_long",                                                                                    ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int64",                                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_byte",                                                                                    ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Byte",    ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Byte",          ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Byte",                                                                ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetByte()",                                   ["NextValueOp2"] = "TestLibrary.Generator.GetByte()"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_ushort",                                                                                  ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt16",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt16",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "UInt16",                                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_uint",                                                                                    ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "UInt32",                                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_ulong",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "UInt64",                                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()"}),
 
     ("SveLoadVectorMaskedTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorNonTemporal_float",                                                                                   ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorNonTemporal",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
     ("SveLoadVectorMaskedTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorNonTemporal_double",                                                                                  ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorNonTemporal",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
index 3e987ec4612979..efe698688cdad0 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
@@ -7699,5 +7699,114 @@ public static T[] CreateBreakBeforePropagateMask<T>(T[] mask, T[] op1, T[] op2)
             }
             return result;
         }
+
+        private static T ConditionalSelectResult<T>(T maskResult, T result, T falseResult) where T : INumberBase<T>
+        {
+            return (maskResult != T.Zero) ? result : falseResult;
+        }
+
+        private static bool CheckLoadVectorBehaviorCore<T>(T[] firstOp, T[] result, Func<int, T, T> map) where T : INumberBase<T>
+        {
+            for (var i = 0; i < firstOp.Length; i++)
+            {
+                T loadResult = firstOp[i];
+                loadResult = map(i, loadResult);
+                if (result[i] != loadResult)
+                {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        public static bool CheckLoadVectorBehavior<T>(T[] firstOp, T[] result) where T : INumberBase<T>
+        {
+            return CheckLoadVectorBehaviorCore(firstOp, result, (_, loadResult) => loadResult);
+        }
+
+        public static bool CheckLoadVectorBehavior<T>(T[] maskOp, T[] firstOp, T[] result, T[] falseOp) where T : INumberBase<T>
+        {
+            return CheckLoadVectorBehaviorCore(firstOp, result, (i, loadResult) => ConditionalSelectResult(maskOp[i], loadResult, falseOp[i]));
+        }
+
+        private static bool CheckGatherVectorBehaviorCore<T, ExtendedElementT, Index>(T[] firstOp, ExtendedElementT[] secondOp, Index[] thirdOp, T[] result, Func<int, T, T> map) 
+                where T : INumberBase<T> 
+                where ExtendedElementT : INumberBase<ExtendedElementT> 
+                where Index : IBinaryInteger<Index>
+        {
+            for (var i = 0; i < firstOp.Length; i++)
+            {
+                T gatherResult = (firstOp[i] == T.Zero) ? T.Zero : T.CreateTruncating(secondOp[int.CreateChecked(thirdOp[i])]);
+                gatherResult = map(i, gatherResult);
+                if (result[i] != gatherResult)
+                {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        public static bool CheckGatherVectorBehavior<T, ExtendedElementT, Index>(T[] firstOp, ExtendedElementT[] secondOp, Index[] thirdOp, T[] result) 
+                where T : INumberBase<T> 
+                where ExtendedElementT : INumberBase<ExtendedElementT> 
+                where Index : IBinaryInteger<Index>
+        {
+            return CheckGatherVectorBehaviorCore(firstOp, secondOp, thirdOp, result, (_, gatherResult) => gatherResult);
+        }
+
+        public static bool CheckGatherVectorBehavior<T, ExtendedElementT, Index>(T[] maskOp, T[] firstOp, ExtendedElementT[] secondOp, Index[] thirdOp, T[] falseOp, T[] result) 
+                where T : INumberBase<T> 
+                where ExtendedElementT : INumberBase<ExtendedElementT> 
+                where Index : IBinaryInteger<Index>
+        {
+            return CheckGatherVectorBehaviorCore(firstOp, secondOp, thirdOp, result, (i, gatherResult) => ConditionalSelectResult(maskOp[i], gatherResult, falseOp[i]));
+        }
+
+        private static bool CheckFirstFaultingBehaviorCore<T>(T[] firstOp, T[] result, Vector<T> faultResult, Func<int, bool> checkIter) where T : INumberBase<T>
+        {
+            bool hitFault = false;
+
+            for (var i = 0; i < firstOp.Length; i++)
+            {
+                if (hitFault)
+                {
+                    if (faultResult[i] != T.Zero)
+                    {
+                        return false;
+                    }
+
+                    if (result[i] != T.Zero)
+                    {
+                        return false;
+                    }
+                }
+                else
+                {
+                    if (faultResult[i] == T.Zero)
+                    {
+                        // There has to be a valid value for the first element, so check it.
+                        if (i == 0)
+                        {
+                            return false;
+                        }
+                        hitFault = true;
+                    }
+                    else
+                    {
+                        if (!checkIter(i))
+                        {
+                            return false;
+                        }
+                    }
+                }
+            }
+
+            return true;
+        }
+
+        public static bool CheckLoadVectorFirstFaultingBehavior<T>(T[] firstOp, T[] result, Vector<T> faultResult) where T : INumberBase<T>
+        {
+            return CheckFirstFaultingBehaviorCore(firstOp, result, faultResult, i => firstOp[i] == result[i]);
+        }
     }
 }
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorIndices.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorIndices.template
index 1b97022a3ef583..89777e737ee1c6 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorIndices.template
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorIndices.template
@@ -443,17 +443,7 @@ namespace JIT.HardwareIntrinsics.Arm
 
         private void ValidateResult({Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {Op3BaseType}[] thirdOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
         {
-            bool succeeded = true;
-
-            for (var i = 0; i < RetElementCount; i++)
-            {
-                {RetBaseType} gatherResult = ({RetBaseType})(firstOp[i] == 0 ? 0 : ({ExtendedElementType})secondOp[thirdOp[i]]);
-                if (result[i] != gatherResult)
-                {
-                    succeeded = false;
-                    break;
-                }
-            }
+            var succeeded = Helpers.CheckGatherVectorBehavior<{RetBaseType}, {ExtendedElementType}, {Op3BaseType}>(firstOp, secondOp, thirdOp, result);
 
             if (!succeeded)
             {
@@ -545,18 +535,7 @@ namespace JIT.HardwareIntrinsics.Arm
 
         private void ValidateConditionalSelectResult({RetBaseType}[] maskOp, {Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {Op3BaseType}[] thirdOp, {RetBaseType}[] falseOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
         {
-            bool succeeded = true;
-
-            for (var i = 0; i < RetElementCount; i++)
-            {
-                {RetBaseType} gatherResult = ({RetBaseType})(firstOp[i] == 0 ? 0 : ({ExtendedElementType})secondOp[thirdOp[i]]);
-                {RetBaseType} iterResult = (maskOp[i] != 0) ? gatherResult : falseOp[i];
-                if (iterResult != result[i])
-                {
-                    succeeded = false;
-                    break;
-                }
-            }
+            var succeeded = Helpers.CheckGatherVectorBehavior(maskOp, firstOp, secondOp, thirdOp, falseOp, result);
 
             if (!succeeded)
             {
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
index 7c0970962d02b9..d446a36b50994a 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
@@ -32,7 +32,6 @@ namespace JIT.HardwareIntrinsics.Arm
                 // Validates basic functionality works
                 test.RunBasicScenario_Load();
                 test.RunBasicScenario_LoadFirstFaulting();
-                test.RunBasicScenario_LoadFirstFaulting_IntermittentCalls();
 
                 // Validates calling via reflection works
                 test.RunReflectionScenario_Load();
@@ -45,6 +44,9 @@ namespace JIT.HardwareIntrinsics.Arm
 
                 // Validates passing an instance member of a struct works
                 test.RunStructFldScenario();
+
+                // Validates using inside ConditionalSelect with zero falseValue
+                test.ConditionalSelect_ZeroOp();
             }
             else
             {
@@ -144,8 +146,14 @@ namespace JIT.HardwareIntrinsics.Arm
 
         private static {Op1BaseType}[] _data = new {Op1BaseType}[Op2ElementCount];
 
+        private static {RetBaseType}[] _maskData = new {RetBaseType}[RetElementCount];
+        private static {RetBaseType}[] _falseData = new {RetBaseType}[RetElementCount];
+
         private {Op1VectorType}<{RetBaseType}> _fld1;
 
+        private {Op1VectorType}<{Op1BaseType}> _mask;
+        private {Op1VectorType}<{Op1BaseType}> _falseFld;
+
         private DataTable _dataTable;
 
         public Sve__{TestName}()
@@ -154,6 +162,12 @@ namespace JIT.HardwareIntrinsics.Arm
 
             for (var i = 0; i < Op2ElementCount; i++) { _data[i] = {NextValueOp2}; }
             _dataTable = new DataTable(_data, new {RetBaseType}[RetElementCount], LargestVectorSize);
+
+            for (var i = 0; i < RetElementCount; i++) { _maskData[i] = ({RetBaseType})({NextValueOp1}); }
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetVectorType}<{RetBaseType}>, byte>(ref _mask), ref Unsafe.As<{RetBaseType}, byte>(ref _maskData[0]), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            for (var i = 0; i < RetElementCount; i++) { _falseData[i] = ({RetBaseType})({NextValueOp2}); }
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetVectorType}<{RetBaseType}>, byte>(ref _falseFld), ref Unsafe.As<{RetBaseType}, byte>(ref _falseData[0]), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
         }
 
         public bool IsSupported => {Isa}.IsSupported;
@@ -194,33 +208,6 @@ namespace JIT.HardwareIntrinsics.Arm
             ValidateFirstFaultingResult(ref op2Ref, _dataTable.inBounded.Span.Length, _dataTable.outArrayPtr, faultResult.As<byte, {RetBaseType}>());
         }
 
-        [MethodImpl(MethodImplOptions.NoInlining)]
-        public static void ConsumeNothing()
-        {
-        }
-
-        public void RunBasicScenario_LoadFirstFaulting_IntermittentCalls()
-        {
-            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_LoadFirstFaulting_IntermittentCalls));
-
-            {Op1VectorType}<{Op1BaseType}> loadMask = Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All);
-
-            ref var op2Ref = ref (_dataTable.inBounded.Span.GetPinnableReference());
-            
-            Sve.SetFfr(Sve.CreateTrueMaskByte(SveMaskPattern.All));
-            ConsumeNothing();
-            var result = {Isa}.{Method}(
-                loadMask,
-                ({Op2BaseType}*)(Unsafe.AsPointer(ref op2Ref))
-            );
-            ConsumeNothing();
-            var faultResult = Sve.GetFfr();
-            ConsumeNothing();
-
-            Unsafe.Write(_dataTable.outArrayPtr, result);
-            ValidateFirstFaultingResult(ref op2Ref, _dataTable.inBounded.Span.Length, _dataTable.outArrayPtr, faultResult.As<byte, {RetBaseType}>());
-        }
-
         public void RunReflectionScenario_Load()
         {
             TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_Load));
@@ -270,6 +257,27 @@ namespace JIT.HardwareIntrinsics.Arm
             test.RunStructFldScenario(this);
         }
 
+        public void ConditionalSelect_ZeroOp()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(ConditionalSelect_ZeroOp));
+            ConditionalSelectScenario(_mask, ref _fld1, {Op1VectorType}<{RetBaseType}>.Zero);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_zero");
+            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.Zero, ref _fld1, {Op1VectorType}<{Op1BaseType}>.Zero);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_all");
+            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.AllBitsSet, ref _fld1, {Op1VectorType}<{Op1BaseType}>.Zero);            
+        }        
+
+        [method: MethodImpl(MethodImplOptions.AggressiveInlining)]
+        private void ConditionalSelectScenario({RetVectorType}<{RetBaseType}> mask, ref {RetVectorType}<{Op2BaseType}> op1, {Op1VectorType}<{Op1BaseType}> falseOp)
+        {
+            var result = Sve.ConditionalSelect(mask, {Isa}.{Method}(Sve.CreateTrueMask{RetBaseType}(SveMaskPattern.All), ({Op2BaseType}*)Unsafe.AsPointer(ref op1)), falseOp);
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateConditionalSelectResult(mask, op1, falseOp, _dataTable.outArrayPtr);
+        }
+
         public void RunUnsupportedScenario()
         {
             TestLibrary.TestFramework.BeginScenario(nameof(RunUnsupportedScenario));
@@ -299,21 +307,44 @@ namespace JIT.HardwareIntrinsics.Arm
 
         private void ValidateResult({Op2BaseType}[] firstOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
         {
-            bool succeeded = true;
+            var succeeded = Helpers.CheckLoadVectorBehavior(firstOp, result);
 
-            for (var i = 0; i < RetElementCount; i++)
+            if (!succeeded)
             {
-                if ({ValidateIterResult})
-                {
-                    succeeded = false;
-                    break;
-                }
+                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1VectorType}<{Op1BaseType}>, {Op2BaseType}): {method} failed:");
+                TestLibrary.TestFramework.LogInformation($"  firstOp: ({string.Join(", ", firstOp)})");
+                TestLibrary.TestFramework.LogInformation($"   result: ({string.Join(", ", result)})");
+                TestLibrary.TestFramework.LogInformation(string.Empty);
+
+                Succeeded = false;
             }
+        }
+
+        private void ValidateConditionalSelectResult({RetVectorType}<{RetBaseType}> maskOp, {Op1VectorType}<{Op1BaseType}> op1, {RetVectorType}<{RetBaseType}> falseOp, void* result, [CallerMemberName] string method = "")
+        {
+            {RetBaseType}[] maskArray = new {RetBaseType}[RetElementCount];
+            {Op1BaseType}[] op1Array = new {Op1BaseType}[RetElementCount];
+            {RetBaseType}[] falseValArray = new {RetBaseType}[RetElementCount];
+            {RetBaseType}[] resultArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.WriteUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref maskArray[0]), maskOp);
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref op1Array[0]), op1);
+            Unsafe.WriteUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref falseValArray[0]), falseOp);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref resultArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateConditionalSelectResult(maskArray, op1Array, falseValArray, resultArray, method);
+        }
+
+        private void ValidateConditionalSelectResult({RetBaseType}[] maskOp, {Op1BaseType}[] firstOp, {RetBaseType}[] falseOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
+        {
+            var succeeded = Helpers.CheckLoadVectorBehavior(maskOp, firstOp, result, falseOp);
 
             if (!succeeded)
             {
-                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1VectorType}<{Op1BaseType}>, {Op2BaseType}): {method} failed:");
+                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}({Op1VectorType}<{Op1BaseType}>, {Op1VectorType}<{Op2BaseType}>): {method} failed:");
+                TestLibrary.TestFramework.LogInformation($"   maskOp: ({string.Join(", ", maskOp)})");
                 TestLibrary.TestFramework.LogInformation($"  firstOp: ({string.Join(", ", firstOp)})");
+                TestLibrary.TestFramework.LogInformation($"  falseOp: ({string.Join(", ", falseOp)})");
                 TestLibrary.TestFramework.LogInformation($"   result: ({string.Join(", ", result)})");
                 TestLibrary.TestFramework.LogInformation(string.Empty);
 
@@ -334,48 +365,7 @@ namespace JIT.HardwareIntrinsics.Arm
 
         private void ValidateFirstFaultingResult({Op2BaseType}[] firstOp, {RetBaseType}[] result, Vector<{RetBaseType}> faultResult, [CallerMemberName] string method = "")
         {
-            bool succeeded = true;
-
-            bool hitFault = false;
-
-            for (var i = 0; i < RetElementCount; i++)
-            {
-                if (hitFault)
-                {
-                    if (faultResult[i] != 0)
-                    {
-                        succeeded = false;
-                        break;
-                    }
-
-                    if (result[i] != 0)
-                    {
-                        succeeded = false;
-                        break;
-                    }
-                }
-                else
-                {
-                    if (faultResult[i] == 0)
-                    {
-                        // There has to be a valid value for the first element, so check it.
-                        if (i == 0)
-                        {
-                            succeeded = false;
-                            break;
-                        }
-                        hitFault = true;
-                    }
-                    else
-                    {
-                        if ({ValidateIterResult})
-                        {
-                            succeeded = false;
-                            break;
-                        }
-                    }
-                }
-            }
+            var succeeded = Helpers.CheckLoadVectorFirstFaultingBehavior(firstOp, result, faultResult);
 
             if (!succeeded)
             {

From 7f3bb3c9c8c4b7e9e4b1d4d5e935f6e0fcffefcd Mon Sep 17 00:00:00 2001
From: TIHan <lol.tihan@gmail.com>
Date: Mon, 8 Jul 2024 14:02:15 -0700
Subject: [PATCH 08/24] Added first-faulting behavior tests for
 GatherVectorFirstFaulting

---
 src/coreclr/jit/gentree.cpp                   |   2 +-
 .../GenerateHWIntrinsicTests_Arm.cs           |  24 +-
 .../HardwareIntrinsics/Arm/Shared/Helpers.cs  |  24 +-
 ...eGatherVectorFirstFaultingIndices.template | 632 ++++++++++++++++++
 4 files changed, 665 insertions(+), 17 deletions(-)
 create mode 100644 src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingIndices.template

diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp
index 1fcc4215a208d3..d4a81e029606db 100644
--- a/src/coreclr/jit/gentree.cpp
+++ b/src/coreclr/jit/gentree.cpp
@@ -27588,7 +27588,7 @@ bool GenTreeHWIntrinsic::OperIsMemoryLoad(GenTree** pAddr) const
                           NI_Sve_GatherVectorInt32WithByteOffsetsSignExtend, NI_Sve_GatherVectorSByteSignExtend,
                           NI_Sve_GatherVectorUInt16WithByteOffsetsZeroExtend, NI_Sve_GatherVectorUInt16ZeroExtend,
                           NI_Sve_GatherVectorUInt32WithByteOffsetsZeroExtend, NI_Sve_GatherVectorUInt32ZeroExtend));
-        assert(varTypeIsI(addr) || (varTypeIsSIMD(addr) && ((intrinsicId >= NI_Sve_GatherVector) &&
+        assert(varTypeIsI(addr) || (varTypeIsSIMD(addr) && ((intrinsicId >= NI_Sve_GatherPrefetch16Bit) &&
                                                             (intrinsicId <= NI_Sve_GatherVectorUInt32ZeroExtend))));
 #else
         assert(varTypeIsI(addr));
diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
index c844ef1647fea8..ebc5e9bafae73c 100644
--- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
+++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
@@ -3430,18 +3430,18 @@
     ("SveGatherVectorIndices.template",    new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorUInt32ZeroExtend_Indices_ulong_ulong",                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorUInt32ZeroExtend",                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",        ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
     ("SveGatherVectorIndices.template",    new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorUInt32ZeroExtend_Indices_uint_uint",                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorUInt32ZeroExtend",                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",        ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
 
-    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_float_int",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
-    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_int_int",                                                                      ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Int32",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
-    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_uint_int",                                                                     ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
-    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_float_uint",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
-    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_int_uint",                                                                     ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "Int32",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
-    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_uint_uint",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
-    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_double_long",                                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",  ["ExtendedElementType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
-    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_long_long",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",  ["ExtendedElementType"] = "Int64",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
-    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_ulong_long",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",  ["ExtendedElementType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
-    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_double_ulong",                                                                 ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
-    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_long_ulong",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "Int64",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
-    ("SveGatherVectorIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_ulong_ulong",                                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_float_int",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_int_int",                                                                      ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Int32",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_uint_int",                                                                     ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_float_uint",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_int_uint",                                                                     ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "Int32",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_uint_uint",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_double_long",                                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",  ["ExtendedElementType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_long_long",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",  ["ExtendedElementType"] = "Int64",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_ulong_long",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",  ["ExtendedElementType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_double_ulong",                                                                 ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_long_ulong",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "Int64",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_ulong_ulong",                                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
 
     ("SveGatherVectorByteOffsets.template",new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorWithByteOffsets_float_int",                                                             ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsets",                                          ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Byte",   ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",       ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
     ("SveGatherVectorByteOffsets.template",new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorWithByteOffsets_int_int",                                                               ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsets",                                          ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Byte",   ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",        ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
index efe698688cdad0..23a0c7fbd1d15e 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
@@ -7729,6 +7729,14 @@ public static bool CheckLoadVectorBehavior<T>(T[] maskOp, T[] firstOp, T[] resul
             return CheckLoadVectorBehaviorCore(firstOp, result, (i, loadResult) => ConditionalSelectResult(maskOp[i], loadResult, falseOp[i]));
         }
 
+        private static T GetGatherVectorResultByIndex<T, ExtendedElementT, Index>(int index, T[] firstOp, ExtendedElementT[] secondOp, Index[] thirdOp)
+                where T : INumberBase<T> 
+                where ExtendedElementT : INumberBase<ExtendedElementT> 
+                where Index : IBinaryInteger<Index>
+        {
+            return (firstOp[index] == T.Zero) ? T.Zero : T.CreateTruncating(secondOp[int.CreateChecked(thirdOp[index])]);
+        }
+
         private static bool CheckGatherVectorBehaviorCore<T, ExtendedElementT, Index>(T[] firstOp, ExtendedElementT[] secondOp, Index[] thirdOp, T[] result, Func<int, T, T> map) 
                 where T : INumberBase<T> 
                 where ExtendedElementT : INumberBase<ExtendedElementT> 
@@ -7736,7 +7744,7 @@ private static bool CheckGatherVectorBehaviorCore<T, ExtendedElementT, Index>(T[
         {
             for (var i = 0; i < firstOp.Length; i++)
             {
-                T gatherResult = (firstOp[i] == T.Zero) ? T.Zero : T.CreateTruncating(secondOp[int.CreateChecked(thirdOp[i])]);
+                T gatherResult = GetGatherVectorResultByIndex(i, firstOp, secondOp, thirdOp);
                 gatherResult = map(i, gatherResult);
                 if (result[i] != gatherResult)
                 {
@@ -7762,11 +7770,11 @@ public static bool CheckGatherVectorBehavior<T, ExtendedElementT, Index>(T[] mas
             return CheckGatherVectorBehaviorCore(firstOp, secondOp, thirdOp, result, (i, gatherResult) => ConditionalSelectResult(maskOp[i], gatherResult, falseOp[i]));
         }
 
-        private static bool CheckFirstFaultingBehaviorCore<T>(T[] firstOp, T[] result, Vector<T> faultResult, Func<int, bool> checkIter) where T : INumberBase<T>
+        private static bool CheckFirstFaultingBehaviorCore<T>(T[] result, Vector<T> faultResult, Func<int, bool> checkIter) where T : INumberBase<T>
         {
             bool hitFault = false;
 
-            for (var i = 0; i < firstOp.Length; i++)
+            for (var i = 0; i < result.Length; i++)
             {
                 if (hitFault)
                 {
@@ -7806,7 +7814,15 @@ private static bool CheckFirstFaultingBehaviorCore<T>(T[] firstOp, T[] result, V
 
         public static bool CheckLoadVectorFirstFaultingBehavior<T>(T[] firstOp, T[] result, Vector<T> faultResult) where T : INumberBase<T>
         {
-            return CheckFirstFaultingBehaviorCore(firstOp, result, faultResult, i => firstOp[i] == result[i]);
+            return CheckFirstFaultingBehaviorCore(result, faultResult, i => firstOp[i] == result[i]);
+        }
+
+        public static bool CheckGatherVectorFirstFaultingBehavior<T, ExtendedElementT, Index>(T[] firstOp, ExtendedElementT[] secondOp, Index[] thirdOp, T[] result, Vector<T> faultResult)
+                where T : INumberBase<T> 
+                where ExtendedElementT : INumberBase<ExtendedElementT> 
+                where Index : IBinaryInteger<Index>
+        {
+            return CheckFirstFaultingBehaviorCore(result, faultResult, i => GetGatherVectorResultByIndex(i, firstOp, secondOp, thirdOp) == result[i]);
         }
     }
 }
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingIndices.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingIndices.template
new file mode 100644
index 00000000000000..2d1a2721556633
--- /dev/null
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingIndices.template
@@ -0,0 +1,632 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+/******************************************************************************
+ * This file is auto-generated from a template file by the GenerateTests.csx  *
+ * script in tests\src\JIT\HardwareIntrinsics\Arm\Shared. In order to make    *
+ * changes, please update the corresponding template and run according to the *
+ * directions listed in the file.                                             *
+ ******************************************************************************/
+
+using System;
+using System.Buffers;
+using System.Numerics;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Runtime.Intrinsics;
+using System.Runtime.Intrinsics.Arm;
+using Xunit;
+
+namespace JIT.HardwareIntrinsics.Arm
+{
+    public static partial class Program
+    {
+        [Fact]
+        public static void {TestName}()
+        {
+            var test = new SveGatherVectorIndices__{TestName}();
+
+            if (test.IsSupported)
+            {
+                // Validates basic functionality works, using Unsafe.Read
+                test.RunBasicScenario_UnsafeRead();
+
+                // Validates basic functionality works
+                test.RunBasicScenario_Load();
+                test.RunBasicScenario_LoadFirstFaulting();
+
+                // Validates fully masked out load works.
+                test.RunBasicScenario_FalseMask();
+
+                // Validates fully masked out load with invalid address works.
+                test.RunBasicScenario_NonFaulting();
+
+                // Validates calling via reflection works, using Unsafe.Read
+                test.RunReflectionScenario_UnsafeRead();
+
+                // Validates passing a local works, using Unsafe.Read
+                test.RunLclVarScenario_UnsafeRead();
+
+                // Validates passing an instance member of a class works
+                test.RunClassFldScenario();
+
+                // Validates passing the field of a local struct works
+                test.RunStructLclFldScenario();
+
+                // Validates passing an instance member of a struct works
+                test.RunStructFldScenario();
+
+                // Validates using inside ConditionalSelect with value falseValue
+                // Currently, using this operation in ConditionalSelect() gives incorrect result
+                // when falseReg == targetReg because this instruction uses Pg/Z to update the targetReg
+                // instead of Pg/M to merge it. As such, the value of falseReg is lost. Ideally, such
+                // instructions should be marked similar to RMW (a different flag name) to make sure that
+                // we do not assign falseReg/targetReg same. Then, we would do something like this:
+                //
+                // ldnf1sh target, pg/z, [x0]
+                // sel mask, target, target, falseReg
+                //
+                // This needs more careful thinking, so disabling it for now.
+                // test.ConditionalSelect_FalseOp();
+
+                // Validates using inside ConditionalSelect with zero falseValue
+                test.ConditionalSelect_ZeroOp();
+            }
+            else
+            {
+                // Validates we throw on unsupported hardware
+                test.RunUnsupportedScenario();
+            }
+
+            if (!test.Succeeded)
+            {
+                throw new Exception("One or more scenarios did not complete as expected.");
+            }
+        }
+    }
+
+    public sealed unsafe class SveGatherVectorIndices__{TestName}
+    {
+        private struct DataTable
+        {
+            private byte[] inArray1;
+            private byte[] inArray2;
+            private byte[] inArray3;
+            private byte[] outArray;
+
+            private GCHandle inHandle1;
+            private GCHandle inHandle2;
+            private GCHandle inHandle3;
+            private GCHandle outHandle;
+
+            private ulong alignment;
+
+            public DataTable({Op1BaseType}[] inArray1, {Op2BaseType}[] inArray2, {Op3BaseType}[] inArray3, {RetBaseType}[] outArray, int alignment)
+            {
+                int sizeOfinArray1 = inArray1.Length * Unsafe.SizeOf<{Op1BaseType}>();
+                int sizeOfinArray2 = inArray2.Length * Unsafe.SizeOf<{Op2BaseType}>();
+                int sizeOfinArray3 = inArray3.Length * Unsafe.SizeOf<{Op3BaseType}>();
+                int sizeOfinBounded = new Random().Next(Unsafe.SizeOf<{Op2BaseType}>(), sizeOfinArray2 - 1);
+                int sizeOfoutArray = outArray.Length * Unsafe.SizeOf<{RetBaseType}>();
+
+                if ((alignment != 64 && alignment != 16 && alignment != 8) || (alignment * 2) < sizeOfinArray1 || (alignment * 2) < sizeOfinArray3 || (alignment * 2) < sizeOfoutArray)
+                {
+                    throw new ArgumentException($"Invalid value of alignment: {alignment}, sizeOfinArray1: {sizeOfinArray1}, sizeOfinArray2: {sizeOfinArray2}, sizeOfinArray3: {sizeOfinArray3}, sizeOfoutArray: {sizeOfoutArray}");
+                }
+
+                this.inArray1 = new byte[alignment * 2];
+                this.inArray2 = new byte[alignment + sizeOfinArray2];
+                this.inArray3 = new byte[alignment * 2];
+                this.outArray = new byte[alignment * 2];
+
+                this.inHandle1 = GCHandle.Alloc(this.inArray1, GCHandleType.Pinned);
+                this.inHandle2 = GCHandle.Alloc(this.inArray2, GCHandleType.Pinned);
+                this.inHandle3 = GCHandle.Alloc(this.inArray3, GCHandleType.Pinned);
+                this.outHandle = GCHandle.Alloc(this.outArray, GCHandleType.Pinned);
+
+                this.alignment = (ulong)alignment;
+
+                this.inBounded = BoundedMemory.Allocate<byte>(sizeOfinBounded, PoisonPagePlacement.After);
+
+                Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(inArray1Ptr), ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), (uint)sizeOfinArray1);
+                Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(inArray2Ptr), ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), (uint)sizeOfinArray2);
+                Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(inArray3Ptr), ref Unsafe.As<{Op3BaseType}, byte>(ref inArray3[0]), (uint)sizeOfinArray3);
+                Unsafe.CopyBlockUnaligned(ref inBounded.Span.GetPinnableReference(), ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), (uint)sizeOfinBounded);
+            }
+
+            public BoundedMemory<byte> inBounded;
+
+            public void* inArray1Ptr => Align((byte*)(inHandle1.AddrOfPinnedObject().ToPointer()), alignment);
+            public void* inArray2Ptr => Align((byte*)(inHandle2.AddrOfPinnedObject().ToPointer()), alignment);
+            public void* inArray3Ptr => Align((byte*)(inHandle3.AddrOfPinnedObject().ToPointer()), alignment);
+            public void* outArrayPtr => Align((byte*)(outHandle.AddrOfPinnedObject().ToPointer()), alignment);
+
+            public void Dispose()
+            {
+                inHandle1.Free();
+                inHandle2.Free();
+                inHandle3.Free();
+                outHandle.Free();
+            }
+
+            private static unsafe void* Align(byte* buffer, ulong expectedAlignment)
+            {
+                return (void*)(((ulong)buffer + expectedAlignment - 1) & ~(expectedAlignment - 1));
+            }
+        }
+
+        private struct TestStruct
+        {
+            public {Op1VectorType}<{Op1BaseType}> _fld1;
+            public {Op2BaseType}* _fld2;
+            public {Op3VectorType}<{Op3BaseType}> _fld3;
+
+            public static TestStruct Create(DataTable _dataTable)
+            {
+                var testStruct = new TestStruct();
+
+                for (var i = 0; i < Op1ElementCount; i++) { _data1[i] = {NextValueOp1}; }
+                for (var i = 0; i < Op2ElementCount; i++) { _data2[i] = {NextValueOp2}; }
+
+                // Ensure all values of _data3 fit within the number of _data2 elements
+                for (var i = 0; i < Op3ElementCount; i++) { _data3[i] = {NextValueOp3} % ({Op3BaseType})Op2ElementCount; }
+
+                Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1VectorType}<{Op1BaseType}>, byte>(ref testStruct._fld1), ref Unsafe.As<{Op1BaseType}, byte>(ref _data1[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
+                Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op3VectorType}<{Op3BaseType}>, byte>(ref testStruct._fld3), ref Unsafe.As<{Op3BaseType}, byte>(ref _data3[0]), (uint)Unsafe.SizeOf<{Op3VectorType}<{Op3BaseType}>>());
+
+                testStruct._fld2 = ({Op2BaseType}*)_dataTable.inArray2Ptr;
+
+                return testStruct;
+            }
+
+            public void RunStructFldScenario(SveGatherVectorIndices__{TestName} testClass)
+            {
+                var result = {Isa}.{Method}(_fld1, _fld2, _fld3);
+
+                Unsafe.Write(testClass._dataTable.outArrayPtr, result);
+                testClass.ValidateResult(_fld1, _fld2, _fld3, testClass._dataTable.outArrayPtr);
+            }
+        }
+
+        private static readonly int LargestVectorSize = {LargestVectorSize};
+
+        // A large enough buffer to hold many values. Op3 will index into Op2.
+        private static readonly int Op2ElementCount = 1024;
+
+        private static readonly int Op1ElementCount = Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() / sizeof({Op1BaseType});
+        private static readonly int Op3ElementCount = Unsafe.SizeOf<{Op3VectorType}<{Op3BaseType}>>() / sizeof({Op3BaseType});
+        private static readonly int RetElementCount = Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>() / sizeof({RetBaseType});
+
+        private static {Op1BaseType}[] _data1 = new {Op1BaseType}[Op1ElementCount];
+        private static {Op2BaseType}[] _data2 = new {Op2BaseType}[Op2ElementCount];
+        private static {Op3BaseType}[] _data3 = new {Op3BaseType}[Op3ElementCount];
+
+        private static {RetBaseType}[] _maskData = new {RetBaseType}[RetElementCount];
+        private static {RetBaseType}[] _falseData = new {RetBaseType}[RetElementCount];
+
+        private {Op1VectorType}<{Op1BaseType}> _fld1;
+        private {Op2BaseType}* _fld2;
+        private {Op3VectorType}<{Op3BaseType}> _fld3;
+
+        private {Op1VectorType}<{Op1BaseType}> _mask;
+        private {Op1VectorType}<{Op1BaseType}> _falseFld;
+
+        private DataTable _dataTable;
+
+        public SveGatherVectorIndices__{TestName}()
+        {
+            Succeeded = true;
+
+            for (var i = 0; i < Op1ElementCount; i++) { _data1[i] = {NextValueOp1}; }
+            for (var i = 0; i < Op2ElementCount; i++) { _data2[i] = {NextValueOp2}; }
+
+            // Ensure all values of _data3 fit within the number of _data2 elements
+            for (var i = 0; i < Op3ElementCount; i++) { _data3[i] = {NextValueOp3} % ({Op3BaseType})Op2ElementCount; }
+
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1VectorType}<{Op1BaseType}>, byte>(ref _fld1), ref Unsafe.As<{Op1BaseType}, byte>(ref _data1[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op3VectorType}<{Op3BaseType}>, byte>(ref _fld3), ref Unsafe.As<{Op3BaseType}, byte>(ref _data3[0]), (uint)Unsafe.SizeOf<{Op3VectorType}<{Op3BaseType}>>());
+
+            for (var i = 0; i < RetElementCount; i++) { _maskData[i] = ({RetBaseType})({NextValueOp1}); }
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetVectorType}<{RetBaseType}>, byte>(ref _mask), ref Unsafe.As<{RetBaseType}, byte>(ref _maskData[0]), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            for (var i = 0; i < RetElementCount; i++) { _falseData[i] = ({RetBaseType})({NextValueOp2}); }
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetVectorType}<{RetBaseType}>, byte>(ref _falseFld), ref Unsafe.As<{RetBaseType}, byte>(ref _falseData[0]), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            _dataTable = new DataTable(_data1, _data2, _data3, new {RetBaseType}[RetElementCount], LargestVectorSize);
+
+            _fld2 = ({Op2BaseType}*)_dataTable.inArray2Ptr;
+        }
+
+        public bool IsSupported => {Isa}.IsSupported;
+
+        public bool Succeeded { get; set; }
+
+        public void RunBasicScenario_UnsafeRead()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_UnsafeRead));
+
+            var result = {Isa}.{Method}(
+                Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr),
+                ({Op2BaseType}*)_dataTable.inArray2Ptr,
+                Unsafe.Read<{Op3VectorType}<{Op3BaseType}>>(_dataTable.inArray3Ptr)
+            );
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.inArray3Ptr, _dataTable.outArrayPtr);
+        }
+
+        public void RunBasicScenario_Load()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_Load));
+
+            {Op1VectorType}<{Op1BaseType}> loadMask1 = Sve.CreateTrueMask{Op1BaseType}(SveMaskPattern.All);
+            {Op3VectorType}<{Op3BaseType}> loadMask3 = Sve.CreateTrueMask{Op3BaseType}(SveMaskPattern.All);
+
+            var result = {Isa}.{Method}(
+                {LoadIsa}.Load{Op1VectorType}(loadMask1, ({Op1BaseType}*)(_dataTable.inArray1Ptr)),
+                ({Op2BaseType}*)_dataTable.inArray2Ptr,
+                {LoadIsa}.Load{Op3VectorType}(loadMask3, ({Op3BaseType}*)(_dataTable.inArray3Ptr))
+            );
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.inArray3Ptr, _dataTable.outArrayPtr);
+        }
+
+        public void RunBasicScenario_LoadFirstFaulting()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_LoadFirstFaulting));
+
+            {Op1VectorType}<{Op1BaseType}> loadMask1 = Sve.CreateTrueMask{Op1BaseType}(SveMaskPattern.All);
+            {Op3VectorType}<{Op3BaseType}> loadMask3 = Sve.CreateTrueMask{Op3BaseType}(SveMaskPattern.All);
+
+            var op1 = {LoadIsa}.Load{Op1VectorType}(loadMask1, ({Op1BaseType}*)(_dataTable.inArray1Ptr));
+            ref var op2Ref = ref (_dataTable.inBounded.Span.GetPinnableReference());
+            var op3 = {LoadIsa}.Load{Op3VectorType}(loadMask3, ({Op3BaseType}*)(_dataTable.inArray3Ptr));
+
+            // When testing first-faulting behavior, we need to make sure we can get the first element.
+            // So set the first active element of the index vector to 0.
+            for (var i = 0; i < Vector<{Op3BaseType}>.Count; i++)
+            {
+                if (loadMask3[i] != 0)
+                {
+                    op3 = op3.WithElement<{Op3BaseType}>(i, 0);
+                    break;
+                }
+            }
+
+            Sve.SetFfr(Sve.CreateTrueMaskByte(SveMaskPattern.All));
+            var result = {Isa}.{Method}(
+                op1,
+                ({Op2BaseType}*)(Unsafe.AsPointer(ref op2Ref)),
+                op3
+            );
+            var faultResult = Sve.GetFfr();
+
+            ref var op3Ref = ref op3;
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateFirstFaultingResult(_dataTable.inArray1Ptr, ref op2Ref, _dataTable.inBounded.Span.Length, Unsafe.AsPointer(ref op3Ref), _dataTable.outArrayPtr, faultResult.As<byte, {RetBaseType}>());
+        }
+
+        public void RunBasicScenario_FalseMask()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_FalseMask));
+
+            {Op1VectorType}<{Op1BaseType}> falseMask = Sve.CreateFalseMask{Op1BaseType}();
+
+            var result = {Isa}.{Method}(
+                falseMask,
+                ({Op2BaseType}*)_dataTable.inArray2Ptr,
+                Unsafe.Read<{Op3VectorType}<{Op3BaseType}>>(_dataTable.inArray3Ptr)
+            );
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateZeroResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.inArray3Ptr, _dataTable.outArrayPtr);
+        }
+
+        public void RunBasicScenario_NonFaulting()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_NonFaulting));
+
+            {Op1VectorType}<{Op1BaseType}> falseMask = Sve.CreateFalseMask{Op1BaseType}();
+
+            try
+            {
+                var result = {Isa}.{Method}(
+                    falseMask,
+                    default,
+                    Unsafe.Read<{Op3VectorType}<{Op3BaseType}>>(_dataTable.inArray3Ptr)
+                );
+
+                Unsafe.Write(_dataTable.outArrayPtr, result);
+                ValidateZeroResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.inArray3Ptr, _dataTable.outArrayPtr);
+            }
+            catch
+            {
+                Succeeded = false;
+            }
+        }
+
+        public void RunReflectionScenario_UnsafeRead()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_UnsafeRead));
+
+            var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof({Op1VectorType}<{Op1BaseType}>), typeof({Op2BaseType}*), typeof({Op3VectorType}<{Op3BaseType}>) })
+                                     .Invoke(null, new object[] {
+                                        Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr),
+                                        Pointer.Box(_dataTable.inArray2Ptr, typeof({Op2BaseType}*)),
+                                        Unsafe.Read<{Op3VectorType}<{Op3BaseType}>>(_dataTable.inArray3Ptr)
+                                     });
+
+            Unsafe.Write(_dataTable.outArrayPtr, ({RetVectorType}<{RetBaseType}>)(result));
+            ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.inArray3Ptr, _dataTable.outArrayPtr);
+        }
+
+        public void RunLclVarScenario_UnsafeRead()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunLclVarScenario_UnsafeRead));
+
+            var op1 = Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr);
+            var op2 = ({Op2BaseType}*)_dataTable.inArray2Ptr;
+            var op3 = Unsafe.Read<{Op3VectorType}<{Op3BaseType}>>(_dataTable.inArray3Ptr);
+            var result = {Isa}.{Method}(op1, op2, op3);
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(op1, op2, op3, _dataTable.outArrayPtr);
+        }
+
+        public void RunClassFldScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario));
+
+            var result = {Isa}.{Method}(_fld1, _fld2, _fld3);
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(_fld1, _fld2, _fld3, _dataTable.outArrayPtr);
+        }
+
+        public void RunStructLclFldScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario));
+
+            var test = TestStruct.Create(_dataTable);
+            var result = {Isa}.{Method}(test._fld1, test._fld2, test._fld3);
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(test._fld1, test._fld2, test._fld3, _dataTable.outArrayPtr);
+        }
+
+        public void RunStructFldScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario));
+
+            var test = TestStruct.Create(_dataTable);
+            test.RunStructFldScenario(this);
+        }
+
+
+        public void ConditionalSelect_FalseOp()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(ConditionalSelect_FalseOp));
+            ConditionalSelectScenario(_mask, _fld1, _fld2, _fld3, _falseFld);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_zero");
+            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _fld3, _falseFld);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_all");
+            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _fld3, _falseFld);            
+        }
+
+        public void ConditionalSelect_ZeroOp()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(ConditionalSelect_ZeroOp));
+            ConditionalSelectScenario(_mask, _fld1, _fld2, _fld3, {Op1VectorType}<{RetBaseType}>.Zero);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_zero");
+            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _fld3, {Op1VectorType}<{Op1BaseType}>.Zero);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_all");
+            ConditionalSelectScenario({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _fld3, {Op1VectorType}<{Op1BaseType}>.Zero);            
+        }        
+
+        [method: MethodImpl(MethodImplOptions.AggressiveInlining)]
+        private void ConditionalSelectScenario({RetVectorType}<{RetBaseType}> mask, {Op1VectorType}<{Op1BaseType}> op1, {Op2BaseType}* op2, {Op3VectorType}<{Op3BaseType}> op3, {Op1VectorType}<{Op1BaseType}> falseOp)
+        {
+            var result = Sve.ConditionalSelect(mask, {Isa}.{Method}(op1, op2, op3), falseOp);
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateConditionalSelectResult(mask, op1, op2, op3, falseOp, _dataTable.outArrayPtr);
+        }
+
+        public void RunUnsupportedScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunUnsupportedScenario));
+
+            Succeeded = false;
+
+            try
+            {
+                RunBasicScenario_Load();
+            }
+            catch (PlatformNotSupportedException)
+            {
+                Succeeded = true;
+            }
+        }
+
+        private void ValidateResult({Op1VectorType}<{Op1BaseType}> op1, {Op2BaseType}* op2, {Op3VectorType}<{Op3BaseType}> op3, void* result, [CallerMemberName] string method = "")
+        {
+            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount];
+            {Op2BaseType}[] inArray2 = new {Op2BaseType}[Op2ElementCount];
+            {Op3BaseType}[] inArray3 = new {Op3BaseType}[Op3ElementCount];
+            {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), op1);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), ref Unsafe.AsRef<byte>(op2), (uint)(Unsafe.SizeOf<{Op2BaseType}>() * Op2ElementCount));
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op3BaseType}, byte>(ref inArray3[0]), op3);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateResult(inArray1, inArray2, inArray3, outArray, method);
+        }
+
+        private void ValidateResult(void* firstOp, void* secondOp, void* thirdOp, void* result, [CallerMemberName] string method = "")
+        {
+            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount];
+            {Op2BaseType}[] inArray2 = new {Op2BaseType}[Op2ElementCount];
+            {Op3BaseType}[] inArray3 = new {Op3BaseType}[Op3ElementCount];
+            {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), ref Unsafe.AsRef<byte>(firstOp), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), ref Unsafe.AsRef<byte>(secondOp), (uint)(Unsafe.SizeOf<{Op2BaseType}>() * Op2ElementCount));
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op3BaseType}, byte>(ref inArray3[0]), ref Unsafe.AsRef<byte>(thirdOp), (uint)Unsafe.SizeOf<{Op3VectorType}<{Op3BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateResult(inArray1, inArray2, inArray3, outArray, method);
+        }
+
+        private void ValidateResult({Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {Op3BaseType}[] thirdOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
+        {
+            var succeeded = Helpers.CheckGatherVectorBehavior<{RetBaseType}, {ExtendedElementType}, {Op3BaseType}>(firstOp, secondOp, thirdOp, result);
+
+            if (!succeeded)
+            {
+                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1BaseType}, {Op2BaseType}, {Op3BaseType}): {method} failed:");
+                TestLibrary.TestFramework.LogInformation($"  firstOp: ({string.Join(", ", firstOp)})");
+                TestLibrary.TestFramework.LogInformation($"  secondOp: ({string.Join(", ", secondOp)})");
+                TestLibrary.TestFramework.LogInformation($"  thirdOp: ({string.Join(", ", thirdOp)})");
+                TestLibrary.TestFramework.LogInformation($"   result: ({string.Join(", ", result)})");
+                TestLibrary.TestFramework.LogInformation(string.Empty);
+
+                Succeeded = false;
+            }
+        }
+
+        private void ValidateZeroResult({Op1VectorType}<{Op1BaseType}> op1, {Op2BaseType}* op2, {Op3VectorType}<{Op3BaseType}> op3, void* result, [CallerMemberName] string method = "")
+        {
+            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount];
+            {Op2BaseType}[] inArray2 = new {Op2BaseType}[Op2ElementCount];
+            {Op3BaseType}[] inArray3 = new {Op3BaseType}[Op3ElementCount];
+            {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), op1);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), ref Unsafe.AsRef<byte>(op2), (uint)(Unsafe.SizeOf<{Op2BaseType}>() * Op2ElementCount));
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op3BaseType}, byte>(ref inArray3[0]), op3);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateZeroResult(inArray1, inArray2, inArray3, outArray, method);
+        }
+
+        private void ValidateZeroResult(void* firstOp, void* secondOp, void* thirdOp, void* result, [CallerMemberName] string method = "")
+        {
+            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount];
+            {Op2BaseType}[] inArray2 = new {Op2BaseType}[Op2ElementCount];
+            {Op3BaseType}[] inArray3 = new {Op3BaseType}[Op3ElementCount];
+            {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), ref Unsafe.AsRef<byte>(firstOp), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), ref Unsafe.AsRef<byte>(secondOp), (uint)(Unsafe.SizeOf<{Op2BaseType}>() * Op2ElementCount));
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op3BaseType}, byte>(ref inArray3[0]), ref Unsafe.AsRef<byte>(thirdOp), (uint)Unsafe.SizeOf<{Op3VectorType}<{Op3BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateZeroResult(inArray1, inArray2, inArray3, outArray, method);
+        }
+
+        private void ValidateZeroResult({Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {Op3BaseType}[] thirdOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
+        {
+            bool succeeded = true;
+
+            for (var i = 0; i < RetElementCount; i++)
+            {
+                if (result[i] != 0)
+                {
+                    succeeded = false;
+                    break;
+                }
+            }
+
+            if (!succeeded)
+            {
+                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1BaseType}, {Op2BaseType}, {Op3BaseType}): {method} failed:");
+                TestLibrary.TestFramework.LogInformation($"  firstOp: ({string.Join(", ", firstOp)})");
+                TestLibrary.TestFramework.LogInformation($"  secondOp: ({string.Join(", ", secondOp)})");
+                TestLibrary.TestFramework.LogInformation($"  thirdOp: ({string.Join(", ", thirdOp)})");
+                TestLibrary.TestFramework.LogInformation($"   result: ({string.Join(", ", result)})");
+                TestLibrary.TestFramework.LogInformation(string.Empty);
+
+                Succeeded = false;
+            }
+        }
+
+        private void ValidateConditionalSelectResult({RetVectorType}<{RetBaseType}> maskOp, {Op1VectorType}<{Op1BaseType}> op1, {Op2BaseType}* op2, {Op3VectorType}<{Op3BaseType}> op3, {RetVectorType}<{RetBaseType}> falseOp, void* result, [CallerMemberName] string method = "")
+        {
+            {RetBaseType}[] maskArray = new {RetBaseType}[RetElementCount];
+            {Op1BaseType}[] op1Array = new {Op1BaseType}[Op1ElementCount];
+            {Op2BaseType}[] op2Array = new {Op2BaseType}[Op2ElementCount];
+            {Op3BaseType}[] op3Array = new {Op3BaseType}[Op3ElementCount];
+            {RetBaseType}[] falseValArray = new {RetBaseType}[RetElementCount];
+            {RetBaseType}[] resultArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.WriteUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref maskArray[0]), maskOp);
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref op1Array[0]), op1);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref op2Array[0]), ref Unsafe.AsRef<byte>(op2), (uint)(Unsafe.SizeOf<{Op2BaseType}>() * Op2ElementCount));
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op3BaseType}, byte>(ref op3Array[0]), op3);
+            Unsafe.WriteUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref falseValArray[0]), falseOp);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref resultArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateConditionalSelectResult(maskArray, op1Array, op2Array, op3Array, falseValArray, resultArray, method);
+        }
+
+        private void ValidateConditionalSelectResult({RetBaseType}[] maskOp, {Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {Op3BaseType}[] thirdOp, {RetBaseType}[] falseOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
+        {
+            var succeeded = Helpers.CheckGatherVectorBehavior(maskOp, firstOp, secondOp, thirdOp, falseOp, result);
+
+            if (!succeeded)
+            {
+                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1BaseType}, {Op2BaseType}, {Op3BaseType}): {method} failed:");
+                TestLibrary.TestFramework.LogInformation($"   maskOp: ({string.Join(", ", maskOp)})");
+                TestLibrary.TestFramework.LogInformation($"  firstOp: ({string.Join(", ", firstOp)})");
+                TestLibrary.TestFramework.LogInformation($" secondOp: ({string.Join(", ", secondOp)})");
+                TestLibrary.TestFramework.LogInformation($"  thirdOp: ({string.Join(", ", thirdOp)})");
+                TestLibrary.TestFramework.LogInformation($"  falseOp: ({string.Join(", ", falseOp)})");
+                TestLibrary.TestFramework.LogInformation($"   result: ({string.Join(", ", result)})");
+                TestLibrary.TestFramework.LogInformation(string.Empty);
+
+                Succeeded = false;
+            }
+        }
+        
+        private void ValidateFirstFaultingResult(void* op1, ref byte op2, int op2Size, void* op3, void* result, Vector<{RetBaseType}> faultResult, [CallerMemberName] string method = "")
+        {
+            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount];
+            {Op2BaseType}[] inArray2 = new {Op2BaseType}[op2Size / Unsafe.SizeOf<{Op2BaseType}>()];
+            {Op3BaseType}[] inArray3 = new {Op3BaseType}[Op3ElementCount];
+            {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), ref Unsafe.AsRef<byte>(op1), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), ref op2, (uint)(inArray2.Length * Unsafe.SizeOf<{Op2BaseType}>()));
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op3BaseType}, byte>(ref inArray3[0]), ref Unsafe.AsRef<byte>(op3), (uint)Unsafe.SizeOf<{Op3VectorType}<{Op3BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+        
+            ValidateFirstFaultingResult(inArray1, inArray2, inArray3, outArray, faultResult, method);
+        }
+
+        private void ValidateFirstFaultingResult({Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {Op3BaseType}[] thirdOp, {RetBaseType}[] result, Vector<{RetBaseType}> faultResult, [CallerMemberName] string method = "")
+        {
+            var succeeded = Helpers.CheckGatherVectorFirstFaultingBehavior(firstOp, secondOp, thirdOp, result, faultResult);
+
+            if (!succeeded)
+            {
+                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1BaseType}, {Op2BaseType}, {Op3BaseType}): {method} failed:");
+                TestLibrary.TestFramework.LogInformation($"  firstOp: ({string.Join(", ", firstOp)})");
+                TestLibrary.TestFramework.LogInformation($"  secondOp: ({string.Join(", ", secondOp)})");
+                TestLibrary.TestFramework.LogInformation($"  thirdOp: ({string.Join(", ", thirdOp)})");
+                TestLibrary.TestFramework.LogInformation($"   result: ({string.Join(", ", result)})");
+                TestLibrary.TestFramework.LogInformation($"   faultResult: ({faultResult})");
+                TestLibrary.TestFramework.LogInformation(string.Empty);
+
+                Succeeded = false;
+            }
+        }
+    }
+}
\ No newline at end of file

From 3923946de956b4cad85f86f152208a853c6196d5 Mon Sep 17 00:00:00 2001
From: TIHan <lol.tihan@gmail.com>
Date: Mon, 8 Jul 2024 15:06:15 -0700
Subject: [PATCH 09/24] Added GetFfr suffix-style APIs

---
 src/coreclr/jit/hwintrinsiclistarm64sve.h     |  9 +++-
 .../Arm/Sve.PlatformNotSupported.cs           | 44 ++++++++++++++++++-
 .../src/System/Runtime/Intrinsics/Arm/Sve.cs  | 44 ++++++++++++++++++-
 .../ref/System.Runtime.Intrinsics.cs          |  9 +++-
 .../GenerateHWIntrinsicTests_Arm.cs           | 44 +++++++++----------
 ...eGatherVectorFirstFaultingIndices.template |  4 +-
 .../SveLoadVectorFirstFaultingTest.template   |  4 +-
 7 files changed, 128 insertions(+), 30 deletions(-)

diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h
index 094fe270b3b6d8..5102a097da93ec 100644
--- a/src/coreclr/jit/hwintrinsiclistarm64sve.h
+++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h
@@ -117,7 +117,14 @@ HARDWARE_INTRINSIC(Sve,           GatherVectorUInt32WithByteOffsetsZeroExtend,
 HARDWARE_INTRINSIC(Sve,           GatherVectorUInt32ZeroExtend,                                     -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1w,       INS_sve_ld1w,       INS_sve_ld1w,       INS_sve_ld1w,       INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GatherVectorWithByteOffsets,                                      -1,      3,      true,  {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1w,       INS_sve_ld1w,       INS_sve_ld1d,       INS_sve_ld1d,       INS_sve_ld1w,       INS_sve_ld1d},    HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GetActiveElementCount,                                            -1,      2,      true,  {INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp},    HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_ExplicitMaskedOperation)
-HARDWARE_INTRINSIC(Sve,           GetFfr,                                                           -1,      0,      false, {INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
+HARDWARE_INTRINSIC(Sve,           GetFfrByte,                                                       -1,      0,      false, {INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
+HARDWARE_INTRINSIC(Sve,           GetFfrInt16,                                                      -1,      0,      false, {INS_invalid,        INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
+HARDWARE_INTRINSIC(Sve,           GetFfrInt32,                                                      -1,      0,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
+HARDWARE_INTRINSIC(Sve,           GetFfrInt64,                                                      -1,      0,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
+HARDWARE_INTRINSIC(Sve,           GetFfrSByte,                                                      -1,      0,      false, {INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
+HARDWARE_INTRINSIC(Sve,           GetFfrUInt16,                                                     -1,      0,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
+HARDWARE_INTRINSIC(Sve,           GetFfrUInt32,                                                     -1,      0,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
+HARDWARE_INTRINSIC(Sve,           GetFfrUInt64,                                                     -1,      0,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
 HARDWARE_INTRINSIC(Sve,           InsertIntoShiftedVector,                                          -1,      2,      true,  {INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr},    HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics)
 HARDWARE_INTRINSIC(Sve,           LeadingSignCount,                                                 -1,     -1,      false, {INS_sve_cls,        INS_invalid,        INS_sve_cls,        INS_invalid,        INS_sve_cls,        INS_invalid,        INS_sve_cls,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           LeadingZeroCount,                                                 -1,     -1,      false, {INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs
index e3e1f756275de4..52082ba51a45b9 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs
@@ -4207,7 +4207,49 @@ internal Arm64() { }
         /// svbool_t svrdffr()
         ///   RDFFR Presult.B
         /// </summary>
-        public static unsafe Vector<byte> GetFfr() { throw new PlatformNotSupportedException(); }
+        public static Vector<byte> GetFfrByte() { throw new PlatformNotSupportedException(); }
+    
+        /// <summary>
+        /// svbool_t svrdffr()
+        ///   RDFFR Presult.B
+        /// </summary>
+        public static Vector<short> GetFfrInt16() { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svbool_t svrdffr()
+        ///   RDFFR Presult.B
+        /// </summary>
+        public static Vector<int> GetFfrInt32() { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svbool_t svrdffr()
+        ///   RDFFR Presult.B
+        /// </summary>
+        public static Vector<long> GetFfrInt64() { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svbool_t svrdffr()
+        ///   RDFFR Presult.B
+        /// </summary>
+        public static Vector<sbyte> GetFfrSByte() { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svbool_t svrdffr()
+        ///   RDFFR Presult.B
+        /// </summary>
+        public static Vector<ushort> GetFfrUInt16() { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svbool_t svrdffr()
+        ///   RDFFR Presult.B
+        /// </summary>
+        public static Vector<uint> GetFfrUInt32() { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svbool_t svrdffr()
+        ///   RDFFR Presult.B
+        /// </summary>
+        public static Vector<ulong> GetFfrUInt64() { throw new PlatformNotSupportedException(); }
 
 
         ///  Insert scalar into shifted vector
diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs
index 9b7b1be04767c0..82fe0681234d97 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs
@@ -4266,7 +4266,49 @@ internal Arm64() { }
         /// svbool_t svrdffr()
         ///   RDFFR Presult.B
         /// </summary>
-        public static unsafe Vector<byte> GetFfr() => GetFfr();
+        public static Vector<byte> GetFfrByte() => GetFfrByte();
+
+        /// <summary>
+        /// svbool_t svrdffr()
+        ///   RDFFR Presult.B
+        /// </summary>
+        public static Vector<short> GetFfrInt16() => GetFfrInt16();
+
+        /// <summary>
+        /// svbool_t svrdffr()
+        ///   RDFFR Presult.B
+        /// </summary>
+        public static Vector<int> GetFfrInt32() => GetFfrInt32();
+
+        /// <summary>
+        /// svbool_t svrdffr()
+        ///   RDFFR Presult.B
+        /// </summary>
+        public static Vector<long> GetFfrInt64() => GetFfrInt64();
+
+        /// <summary>
+        /// svbool_t svrdffr()
+        ///   RDFFR Presult.B
+        /// </summary>
+        public static Vector<sbyte> GetFfrSByte() => GetFfrSByte();
+
+        /// <summary>
+        /// svbool_t svrdffr()
+        ///   RDFFR Presult.B
+        /// </summary>
+        public static Vector<ushort> GetFfrUInt16() => GetFfrUInt16();
+
+        /// <summary>
+        /// svbool_t svrdffr()
+        ///   RDFFR Presult.B
+        /// </summary>
+        public static Vector<uint> GetFfrUInt32() => GetFfrUInt32();
+
+        /// <summary>
+        /// svbool_t svrdffr()
+        ///   RDFFR Presult.B
+        /// </summary>
+        public static Vector<ulong> GetFfrUInt64() => GetFfrUInt64();
 
 
         ///  Insert scalar into shifted vector
diff --git a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs
index ec7d7a187d2a68..1c11d841ea1a58 100644
--- a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs
+++ b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs
@@ -4853,7 +4853,14 @@ internal Arm64() { }
         public static ulong GetActiveElementCount(System.Numerics.Vector<uint> mask, System.Numerics.Vector<uint> from) { throw null; }
         public static ulong GetActiveElementCount(System.Numerics.Vector<ulong> mask, System.Numerics.Vector<ulong> from) { throw null; }
 
-        public static unsafe System.Numerics.Vector<byte> GetFfr() { throw null; }
+        public static System.Numerics.Vector<byte> GetFfrByte() { throw null; }
+        public static System.Numerics.Vector<short> GetFfrInt16() { throw null; }
+        public static System.Numerics.Vector<int> GetFfrInt32() { throw null; }
+        public static System.Numerics.Vector<long> GetFfrInt64() { throw null; }
+        public static System.Numerics.Vector<sbyte> GetFfrSByte() { throw null; }
+        public static System.Numerics.Vector<ushort> GetFfrUInt16() { throw null; }
+        public static System.Numerics.Vector<uint> GetFfrUInt32() { throw null; }
+        public static System.Numerics.Vector<ulong> GetFfrUInt64() { throw null; }
 
         public static System.Numerics.Vector<byte> LeadingSignCount(System.Numerics.Vector<sbyte> value) { throw null; }
         public static System.Numerics.Vector<ushort> LeadingSignCount(System.Numerics.Vector<short> value) { throw null; }
diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
index 4c7b0941fab113..0ea300ca19a515 100644
--- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
+++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
@@ -3604,18 +3604,18 @@
     ("SveGatherVectorIndices.template",    new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorUInt32ZeroExtend_Indices_ulong_ulong",                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorUInt32ZeroExtend",                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",        ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
     ("SveGatherVectorIndices.template",    new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorUInt32ZeroExtend_Indices_uint_uint",                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorUInt32ZeroExtend",                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",        ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
 
-    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_float_int",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
-    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_int_int",                                                                      ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Int32",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
-    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_uint_int",                                                                     ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
-    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_float_uint",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
-    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_int_uint",                                                                     ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "Int32",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
-    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_uint_uint",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
-    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_double_long",                                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",  ["ExtendedElementType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
-    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_long_long",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",  ["ExtendedElementType"] = "Int64",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
-    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_ulong_long",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",  ["ExtendedElementType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
-    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_double_ulong",                                                                 ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
-    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_long_ulong",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "Int64",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
-    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_ulong_ulong",                                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_float_int",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Single",   ["GetFfrType"] = "Byte",        ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_int_int",                                                                      ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Int32",    ["GetFfrType"] = "Int32",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_uint_int",                                                                     ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "UInt32",   ["GetFfrType"] = "UInt32",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_float_uint",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "Single",   ["GetFfrType"] = "Byte",        ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_int_uint",                                                                     ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "Int32",    ["GetFfrType"] = "Int32",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_uint_uint",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "UInt32",   ["GetFfrType"] = "UInt32",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_double_long",                                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",  ["ExtendedElementType"] = "Double",   ["GetFfrType"] = "Byte",        ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_long_long",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",  ["ExtendedElementType"] = "Int64",    ["GetFfrType"] = "Int64",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_ulong_long",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",  ["ExtendedElementType"] = "UInt64",   ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_double_ulong",                                                                 ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "Double",   ["GetFfrType"] = "Byte",        ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_long_ulong",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "Int64",    ["GetFfrType"] = "Int64",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_ulong_ulong",                                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "UInt64",   ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
 
     ("SveGatherVectorByteOffsets.template",new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorWithByteOffsets_float_int",                                                             ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsets",                                          ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Byte",   ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",       ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
     ("SveGatherVectorByteOffsets.template",new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorWithByteOffsets_int_int",                                                               ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsets",                                          ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Byte",   ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",        ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
@@ -3676,16 +3676,16 @@
     ("SveLoadNonFaultingUnOpTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorNonFaulting_uint",                                                                                    ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorNonFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()",     ["Cast"] = "(uint*)",                                                                                    ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
     ("SveLoadNonFaultingUnOpTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorNonFaulting_ulong",                                                                                   ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorNonFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()",     ["Cast"] = "(ulong*)",                                                                                   ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
 
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_float",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Single",                                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_double",                                                                                  ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Double",                                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_sbyte",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "SByte",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "SByte",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "SByte",                                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_short",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int16",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int16",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int16",                                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_int",                                                                                     ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int32",                                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_long",                                                                                    ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int64",                                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_byte",                                                                                    ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Byte",    ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Byte",          ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Byte",                                                                ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetByte()",                                   ["NextValueOp2"] = "TestLibrary.Generator.GetByte()"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_ushort",                                                                                  ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt16",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt16",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "UInt16",                                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_uint",                                                                                    ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "UInt32",                                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_ulong",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "UInt64",                                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_float",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Single",                ["GetFfrType"] = "Byte",                                                ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_double",                                                                                  ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Double",                ["GetFfrType"] = "Byte",                                                ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_sbyte",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "SByte",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "SByte",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "SByte",                 ["GetFfrType"] = "SByte",                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_short",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int16",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int16",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int16",                 ["GetFfrType"] = "Int16",                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_int",                                                                                     ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int32",                 ["GetFfrType"] = "Int32",                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_long",                                                                                    ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int64",                 ["GetFfrType"] = "Int64",                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetInt64()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_byte",                                                                                    ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Byte",    ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Byte",          ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Byte",                  ["GetFfrType"] = "Byte",                                                ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetByte()",                                   ["NextValueOp2"] = "TestLibrary.Generator.GetByte()"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_ushort",                                                                                  ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt16",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt16",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "UInt16",                ["GetFfrType"] = "UInt16",                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetUInt16()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetUInt16()"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_uint",                                                                                    ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "UInt32",                ["GetFfrType"] = "UInt32",                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_ulong",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "UInt64",                ["GetFfrType"] = "UInt64",                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()"}),
 
     ("SveLoadVectorMaskedTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorNonTemporal_float",                                                                                   ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorNonTemporal",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
     ("SveLoadVectorMaskedTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorNonTemporal_double",                                                                                  ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorNonTemporal",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                                                                                        ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingIndices.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingIndices.template
index 2d1a2721556633..20a372556c7481 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingIndices.template
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingIndices.template
@@ -301,12 +301,12 @@ namespace JIT.HardwareIntrinsics.Arm
                 ({Op2BaseType}*)(Unsafe.AsPointer(ref op2Ref)),
                 op3
             );
-            var faultResult = Sve.GetFfr();
+            var faultResult = Sve.GetFfr{GetFfrType}();
 
             ref var op3Ref = ref op3;
 
             Unsafe.Write(_dataTable.outArrayPtr, result);
-            ValidateFirstFaultingResult(_dataTable.inArray1Ptr, ref op2Ref, _dataTable.inBounded.Span.Length, Unsafe.AsPointer(ref op3Ref), _dataTable.outArrayPtr, faultResult.As<byte, {RetBaseType}>());
+            ValidateFirstFaultingResult(_dataTable.inArray1Ptr, ref op2Ref, _dataTable.inBounded.Span.Length, Unsafe.AsPointer(ref op3Ref), _dataTable.outArrayPtr, faultResult.As<{GetFfrType}, {RetBaseType}>());
         }
 
         public void RunBasicScenario_FalseMask()
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
index d446a36b50994a..9b004863c9f29a 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
@@ -202,10 +202,10 @@ namespace JIT.HardwareIntrinsics.Arm
                 loadMask,
                 ({Op2BaseType}*)(Unsafe.AsPointer(ref op2Ref))
             );
-            var faultResult = Sve.GetFfr();
+            var faultResult = Sve.GetFfr{GetFfrType}();
 
             Unsafe.Write(_dataTable.outArrayPtr, result);
-            ValidateFirstFaultingResult(ref op2Ref, _dataTable.inBounded.Span.Length, _dataTable.outArrayPtr, faultResult.As<byte, {RetBaseType}>());
+            ValidateFirstFaultingResult(ref op2Ref, _dataTable.inBounded.Span.Length, _dataTable.outArrayPtr, faultResult.As<{GetFfrType}, {RetBaseType}>());
         }
 
         public void RunReflectionScenario_Load()

From 461b6a3a32056e28979a8b6c86459fb1aa4b187b Mon Sep 17 00:00:00 2001
From: TIHan <lol.tihan@gmail.com>
Date: Mon, 8 Jul 2024 16:06:32 -0700
Subject: [PATCH 10/24] Fixing GatherVector tests

---
 .../Intrinsics/Arm/Sve.PlatformNotSupported.cs      |  2 +-
 .../SveGatherVectorFirstFaultingIndices.template    | 13 +++++++------
 .../Shared/SveLoadVectorFirstFaultingTest.template  |  2 +-
 3 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs
index 52082ba51a45b9..0ee8104c15d596 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs
@@ -4208,7 +4208,7 @@ internal Arm64() { }
         ///   RDFFR Presult.B
         /// </summary>
         public static Vector<byte> GetFfrByte() { throw new PlatformNotSupportedException(); }
-    
+
         /// <summary>
         /// svbool_t svrdffr()
         ///   RDFFR Presult.B
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingIndices.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingIndices.template
index 20a372556c7481..86c2827817d6a2 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingIndices.template
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingIndices.template
@@ -107,7 +107,7 @@ namespace JIT.HardwareIntrinsics.Arm
                 int sizeOfinArray1 = inArray1.Length * Unsafe.SizeOf<{Op1BaseType}>();
                 int sizeOfinArray2 = inArray2.Length * Unsafe.SizeOf<{Op2BaseType}>();
                 int sizeOfinArray3 = inArray3.Length * Unsafe.SizeOf<{Op3BaseType}>();
-                int sizeOfinBounded = new Random().Next(Unsafe.SizeOf<{Op2BaseType}>(), sizeOfinArray2 - 1);
+                int sizeOfinBounded = new Random().Next(Unsafe.SizeOf<{Op2BaseType}>(), Vector<{Op2BaseType}>.Count * Unsafe.SizeOf<{Op2BaseType}>() - 1);
                 int sizeOfoutArray = outArray.Length * Unsafe.SizeOf<{RetBaseType}>();
 
                 if ((alignment != 64 && alignment != 16 && alignment != 8) || (alignment * 2) < sizeOfinArray1 || (alignment * 2) < sizeOfinArray3 || (alignment * 2) < sizeOfoutArray)
@@ -288,7 +288,8 @@ namespace JIT.HardwareIntrinsics.Arm
             // So set the first active element of the index vector to 0.
             for (var i = 0; i < Vector<{Op3BaseType}>.Count; i++)
             {
-                if (loadMask3[i] != 0)
+                // op1 is the mask for GatherVector.
+                if (op1[i] != 0)
                 {
                     op3 = op3.WithElement<{Op3BaseType}>(i, 0);
                     break;
@@ -618,10 +619,10 @@ namespace JIT.HardwareIntrinsics.Arm
             if (!succeeded)
             {
                 TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1BaseType}, {Op2BaseType}, {Op3BaseType}): {method} failed:");
-                TestLibrary.TestFramework.LogInformation($"  firstOp: ({string.Join(", ", firstOp)})");
-                TestLibrary.TestFramework.LogInformation($"  secondOp: ({string.Join(", ", secondOp)})");
-                TestLibrary.TestFramework.LogInformation($"  thirdOp: ({string.Join(", ", thirdOp)})");
-                TestLibrary.TestFramework.LogInformation($"   result: ({string.Join(", ", result)})");
+                TestLibrary.TestFramework.LogInformation($"       firstOp: ({string.Join(", ", firstOp)})");
+                TestLibrary.TestFramework.LogInformation($"      secondOp: ({string.Join(", ", secondOp)})");
+                TestLibrary.TestFramework.LogInformation($"       thirdOp: ({string.Join(", ", thirdOp)})");
+                TestLibrary.TestFramework.LogInformation($"        result: ({string.Join(", ", result)})");
                 TestLibrary.TestFramework.LogInformation($"   faultResult: ({faultResult})");
                 TestLibrary.TestFramework.LogInformation(string.Empty);
 
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
index 9b004863c9f29a..4e7cb213d63d14 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
@@ -76,7 +76,7 @@ namespace JIT.HardwareIntrinsics.Arm
             public DataTable({Op2BaseType}[] inArray1, {RetBaseType}[] outArray, int alignment)
             {
                 int sizeOfinArray1 = inArray1.Length * Unsafe.SizeOf<{Op2BaseType}>();
-                int sizeOfinBounded = new Random().Next(Unsafe.SizeOf<{Op2BaseType}>(), sizeOfinArray1 - 1);
+                int sizeOfinBounded = new Random().Next(Unsafe.SizeOf<{Op2BaseType}>(), Vector<{Op2BaseType}>.Count * Unsafe.SizeOf<{Op2BaseType}>() - 1);
                 int sizeOfoutArray = outArray.Length * Unsafe.SizeOf<{RetBaseType}>();
                 if ((alignment != 64 && alignment != 16 && alignment != 8) || (alignment * 2) < sizeOfinArray1 || (alignment * 2) < sizeOfoutArray)
                 {

From d5b86757c11dcb879d97b2cf50d1ed331e585f62 Mon Sep 17 00:00:00 2001
From: TIHan <lol.tihan@gmail.com>
Date: Mon, 8 Jul 2024 16:25:58 -0700
Subject: [PATCH 11/24] Formatting

---
 src/coreclr/jit/gentree.cpp | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp
index c76cf2cd25189d..ffc0e51b83e1a2 100644
--- a/src/coreclr/jit/gentree.cpp
+++ b/src/coreclr/jit/gentree.cpp
@@ -26395,11 +26395,12 @@ bool GenTreeHWIntrinsic::OperIsMemoryLoad(GenTree** pAddr) const
     {
 #ifdef TARGET_ARM64
         static_assert_no_msg(
-            AreContiguous(NI_Sve_GatherVector, NI_Sve_GatherVectorByteZeroExtend, NI_Sve_GatherVectorFirstFaulting, NI_Sve_GatherVectorInt16SignExtend,
-                          NI_Sve_GatherVectorInt16WithByteOffsetsSignExtend, NI_Sve_GatherVectorInt32SignExtend,
-                          NI_Sve_GatherVectorInt32WithByteOffsetsSignExtend, NI_Sve_GatherVectorSByteSignExtend,
-                          NI_Sve_GatherVectorUInt16WithByteOffsetsZeroExtend, NI_Sve_GatherVectorUInt16ZeroExtend,
-                          NI_Sve_GatherVectorUInt32WithByteOffsetsZeroExtend, NI_Sve_GatherVectorUInt32ZeroExtend));
+            AreContiguous(NI_Sve_GatherVector, NI_Sve_GatherVectorByteZeroExtend, NI_Sve_GatherVectorFirstFaulting,
+                          NI_Sve_GatherVectorInt16SignExtend, NI_Sve_GatherVectorInt16WithByteOffsetsSignExtend,
+                          NI_Sve_GatherVectorInt32SignExtend, NI_Sve_GatherVectorInt32WithByteOffsetsSignExtend,
+                          NI_Sve_GatherVectorSByteSignExtend, NI_Sve_GatherVectorUInt16WithByteOffsetsZeroExtend,
+                          NI_Sve_GatherVectorUInt16ZeroExtend, NI_Sve_GatherVectorUInt32WithByteOffsetsZeroExtend,
+                          NI_Sve_GatherVectorUInt32ZeroExtend));
         assert(varTypeIsI(addr) || (varTypeIsSIMD(addr) && ((intrinsicId >= NI_Sve_GatherPrefetch16Bit) &&
                                                             (intrinsicId <= NI_Sve_GatherVectorUInt32ZeroExtend))));
 #else

From 07833e3d0a8577753f50c9aeabca55b15d76a6b6 Mon Sep 17 00:00:00 2001
From: TIHan <lol.tihan@gmail.com>
Date: Tue, 9 Jul 2024 12:28:14 -0700
Subject: [PATCH 12/24] Feedback

---
 src/coreclr/jit/fgdiagnostic.cpp            | 2 --
 src/coreclr/jit/gentree.cpp                 | 4 ----
 src/coreclr/jit/hwintrinsiccodegenarm64.cpp | 6 +-----
 3 files changed, 1 insertion(+), 11 deletions(-)

diff --git a/src/coreclr/jit/fgdiagnostic.cpp b/src/coreclr/jit/fgdiagnostic.cpp
index c8e669e3d0a044..322aae30ec500b 100644
--- a/src/coreclr/jit/fgdiagnostic.cpp
+++ b/src/coreclr/jit/fgdiagnostic.cpp
@@ -3467,8 +3467,6 @@ void Compiler::fgDebugCheckFlags(GenTree* tree, BasicBlock* block)
                     case NI_Sve_GatherPrefetch32Bit:
                     case NI_Sve_GatherPrefetch64Bit:
                     case NI_Sve_GatherPrefetch8Bit:
-                    case NI_Sve_GatherVectorFirstFaulting:
-                    case NI_Sve_LoadVectorFirstFaulting:
                     case NI_Sve_SetFfr:
                     {
                         assert(tree->OperRequiresCallFlag(this));
diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp
index ffc0e51b83e1a2..fc400064b7cd92 100644
--- a/src/coreclr/jit/gentree.cpp
+++ b/src/coreclr/jit/gentree.cpp
@@ -26804,8 +26804,6 @@ bool GenTreeHWIntrinsic::OperRequiresCallFlag() const
             case NI_Sve_GatherPrefetch32Bit:
             case NI_Sve_GatherPrefetch64Bit:
             case NI_Sve_GatherPrefetch8Bit:
-            case NI_Sve_GatherVectorFirstFaulting:
-            case NI_Sve_LoadVectorFirstFaulting:
             case NI_Sve_SetFfr:
             {
                 return true;
@@ -26997,8 +26995,6 @@ void GenTreeHWIntrinsic::Initialize(NamedIntrinsic intrinsicId)
             case NI_Sve_GatherPrefetch32Bit:
             case NI_Sve_GatherPrefetch64Bit:
             case NI_Sve_GatherPrefetch8Bit:
-            case NI_Sve_GatherVectorFirstFaulting:
-            case NI_Sve_LoadVectorFirstFaulting:
             case NI_Sve_SetFfr:
             {
                 // Mark as a call and global reference, much as is done for GT_KEEPALIVE
diff --git a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp
index dd24c268e1cb11..306cddea26e79b 100644
--- a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp
+++ b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp
@@ -2255,11 +2255,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
 
             case NI_Sve_LoadVectorFirstFaulting:
             {
-                insScalableOpts sopt = INS_SCALABLE_OPTS_LSL_N;
-                if (opt == INS_OPTS_SCALABLE_B)
-                {
-                    sopt = INS_SCALABLE_OPTS_NONE;
-                }
+                insScalableOpts sopt = (opt == INS_OPTS_SCALABLE_B) ? INS_SCALABLE_OPTS_NONE : INS_SCALABLE_OPTS_LSL_N;
                 GetEmitter()->emitIns_R_R_R_R(ins, emitSize, targetReg, op1Reg, op2Reg, REG_ZR, opt, sopt);
                 break;
             }

From 05fb46d44d34e8ae85a5fc406b096cc1ed49ad5c Mon Sep 17 00:00:00 2001
From: TIHan <lol.tihan@gmail.com>
Date: Tue, 9 Jul 2024 12:29:56 -0700
Subject: [PATCH 13/24] Feedback

---
 src/coreclr/jit/gentree.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp
index fc400064b7cd92..d579f8e10f8003 100644
--- a/src/coreclr/jit/gentree.cpp
+++ b/src/coreclr/jit/gentree.cpp
@@ -26401,7 +26401,7 @@ bool GenTreeHWIntrinsic::OperIsMemoryLoad(GenTree** pAddr) const
                           NI_Sve_GatherVectorSByteSignExtend, NI_Sve_GatherVectorUInt16WithByteOffsetsZeroExtend,
                           NI_Sve_GatherVectorUInt16ZeroExtend, NI_Sve_GatherVectorUInt32WithByteOffsetsZeroExtend,
                           NI_Sve_GatherVectorUInt32ZeroExtend));
-        assert(varTypeIsI(addr) || (varTypeIsSIMD(addr) && ((intrinsicId >= NI_Sve_GatherPrefetch16Bit) &&
+        assert(varTypeIsI(addr) || (varTypeIsSIMD(addr) && ((intrinsicId >= NI_Sve_GatherVector) &&
                                                             (intrinsicId <= NI_Sve_GatherVectorUInt32ZeroExtend))));
 #else
         assert(varTypeIsI(addr));

From c63f8785be42c3dd3a55c3f4365ec037968240f1 Mon Sep 17 00:00:00 2001
From: Tanner Gooding <tagoo@outlook.com>
Date: Wed, 10 Jul 2024 10:02:03 -0700
Subject: [PATCH 14/24] Ensure the P/Invokes are blittable

---
 .../System/Buffers/BoundedMemory.Windows.cs   | 43 ++++++++-----------
 1 file changed, 18 insertions(+), 25 deletions(-)

diff --git a/src/libraries/Common/tests/TestUtilities/System/Buffers/BoundedMemory.Windows.cs b/src/libraries/Common/tests/TestUtilities/System/Buffers/BoundedMemory.Windows.cs
index 82572aaf14a188..d6dc353ed2daa5 100644
--- a/src/libraries/Common/tests/TestUtilities/System/Buffers/BoundedMemory.Windows.cs
+++ b/src/libraries/Common/tests/TestUtilities/System/Buffers/BoundedMemory.Windows.cs
@@ -33,7 +33,7 @@ private static WindowsImplementation<T> AllocateWithoutDataPopulationWindows<T>(
 
             // Reserve and commit the entire range as NOACCESS.
 
-            VirtualAllocHandle handle = UnsafeNativeMethods.VirtualAlloc(
+            VirtualAllocHandle handle = VirtualAllocHandle.Allocate(
                 lpAddress: IntPtr.Zero,
                 dwSize: (IntPtr)totalBytesToAllocate /* cast throws OverflowException if out of range */,
                 flAllocationType: VirtualAllocAllocationType.MEM_RESERVE | VirtualAllocAllocationType.MEM_COMMIT,
@@ -91,9 +91,10 @@ internal VirtualAllocProtection Protection
                     try
                     {
                         _handle.DangerousAddRef(ref refAdded);
+                        MEMORY_BASIC_INFORMATION memoryInfo;
                         if (UnsafeNativeMethods.VirtualQuery(
                             lpAddress: _handle.DangerousGetHandle() + _byteOffsetIntoHandle,
-                            lpBuffer: out MEMORY_BASIC_INFORMATION memoryInfo,
+                            lpBuffer: &memoryInfo,
                             dwLength: (IntPtr)sizeof(MEMORY_BASIC_INFORMATION)) == IntPtr.Zero)
                         {
                             Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
@@ -117,11 +118,12 @@ internal VirtualAllocProtection Protection
                         try
                         {
                             _handle.DangerousAddRef(ref refAdded);
-                            if (!UnsafeNativeMethods.VirtualProtect(
+                            VirtualAllocProtection flOldProtect;
+                            if (UnsafeNativeMethods.VirtualProtect(
                                 lpAddress: _handle.DangerousGetHandle() + _byteOffsetIntoHandle,
                                 dwSize: (IntPtr)(&((T*)null)[_elementCount]),
                                 flNewProtect: value,
-                                lpflOldProtect: out _))
+                                lpflOldProtect: &flOldProtect) == 0)
                             {
                                 Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
                                 throw new InvalidOperationException("VirtualProtect failed unexpectedly.");
@@ -279,13 +281,20 @@ public VirtualAllocHandle()
             {
             }
 
+            internal static VirtualAllocHandle Allocate(IntPtr lpAddress, IntPtr dwSize, VirtualAllocAllocationType flAllocationType, VirtualAllocProtection flProtect)
+            {
+                VirtualAllocHandle retVal = new VirtualAllocHandle();
+                retVal.SetHandle(UnsafeNativeMethods.VirtualAlloc(lpAddress, dwSize, flAllocationType, flProtect));
+                return retVal;
+            }
+
             // Do not provide a finalizer - SafeHandle's critical finalizer will
             // call ReleaseHandle for you.
 
             public override bool IsInvalid => (handle == IntPtr.Zero);
 
             protected override bool ReleaseHandle() =>
-                UnsafeNativeMethods.VirtualFree(handle, IntPtr.Zero, VirtualAllocAllocationType.MEM_RELEASE);
+                UnsafeNativeMethods.VirtualFree(handle, IntPtr.Zero, VirtualAllocAllocationType.MEM_RELEASE) != 0;
         }
 
         private static class UnsafeNativeMethods
@@ -294,35 +303,19 @@ private static class UnsafeNativeMethods
 
             // https://msdn.microsoft.com/en-us/library/windows/desktop/aa366887(v=vs.85).aspx
             [DllImport(KERNEL32_LIB, SetLastError = true)]
-            public static extern VirtualAllocHandle VirtualAlloc(
-                IntPtr lpAddress,
-                IntPtr dwSize,
-                VirtualAllocAllocationType flAllocationType,
-                VirtualAllocProtection flProtect);
+            public static extern IntPtr VirtualAlloc(IntPtr lpAddress, IntPtr dwSize, VirtualAllocAllocationType flAllocationType, VirtualAllocProtection flProtect);
 
             // https://msdn.microsoft.com/en-us/library/windows/desktop/aa366892(v=vs.85).aspx
             [DllImport(KERNEL32_LIB, SetLastError = true)]
-            [return: MarshalAs(UnmanagedType.Bool)]
-            public static extern bool VirtualFree(
-                IntPtr lpAddress,
-                IntPtr dwSize,
-                VirtualAllocAllocationType dwFreeType);
+            public static extern int VirtualFree(IntPtr lpAddress, IntPtr dwSize, VirtualAllocAllocationType dwFreeType);
 
             // https://msdn.microsoft.com/en-us/library/windows/desktop/aa366898(v=vs.85).aspx
             [DllImport(KERNEL32_LIB, SetLastError = true)]
-            [return: MarshalAs(UnmanagedType.Bool)]
-            public static extern bool VirtualProtect(
-                IntPtr lpAddress,
-                IntPtr dwSize,
-                VirtualAllocProtection flNewProtect,
-                out VirtualAllocProtection lpflOldProtect);
+            public static extern int VirtualProtect(IntPtr lpAddress, IntPtr dwSize, VirtualAllocProtection flNewProtect, VirtualAllocProtection* lpflOldProtect);
 
             // https://msdn.microsoft.com/en-us/library/windows/desktop/aa366902(v=vs.85).aspx
             [DllImport(KERNEL32_LIB, SetLastError = true)]
-            public static extern IntPtr VirtualQuery(
-                IntPtr lpAddress,
-                out MEMORY_BASIC_INFORMATION lpBuffer,
-                IntPtr dwLength);
+            public static extern IntPtr VirtualQuery(IntPtr lpAddress, MEMORY_BASIC_INFORMATION* lpBuffer, IntPtr dwLength);
         }
     }
 }

From 6c28927435cdcdec16b2d79fc9a25f743e8f97b8 Mon Sep 17 00:00:00 2001
From: TIHan <lol.tihan@gmail.com>
Date: Fri, 12 Jul 2024 18:22:58 -0700
Subject: [PATCH 15/24] Fix build

---
 src/coreclr/jit/hwintrinsiclistarm64sve.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h
index 4dae38fd42bce4..6ae1c7e76fadcf 100644
--- a/src/coreclr/jit/hwintrinsiclistarm64sve.h
+++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h
@@ -233,8 +233,8 @@ HARDWARE_INTRINSIC(Sve,           SaturatingIncrementBy64BitElementCount,
 HARDWARE_INTRINSIC(Sve,           SaturatingIncrementBy8BitElementCount,                             0,      3,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_sqincb,     INS_sve_uqincb,     INS_sve_sqincb,     INS_sve_uqincb,     INS_invalid,        INS_invalid},     HW_Category_Scalar,                HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_HasEnumOperand|HW_Flag_SpecialCodeGen|HW_Flag_SpecialImport|HW_Flag_HasRMWSemantics)
 HARDWARE_INTRINSIC(Sve,           SaturatingIncrementByActiveElementCount,                          -1,      2,      true,  {INS_invalid,        INS_sve_sqincp,     INS_sve_sqincp,     INS_sve_sqincp,     INS_sve_sqincp,     INS_sve_sqincp,     INS_sve_sqincp,     INS_sve_sqincp,     INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_SpecialImport|HW_Flag_BaseTypeFromSecondArg|HW_Flag_HasRMWSemantics)
 HARDWARE_INTRINSIC(Sve,           Scale,                                                            -1,      -1,     false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_fscale,     INS_sve_fscale},  HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasRMWSemantics)
-HARDWARE_INTRINSIC(Sve,           SetFfr,                                                           -1,      1,      true,  {INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_BaseTypeFromFirstArg|HW_Flag_SpecialSideEffectMask|HW_Flag_SpecialCodeGen)
 HARDWARE_INTRINSIC(Sve,           Scatter,                                                          -1,      -1,     false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_st1w,       INS_sve_st1w,       INS_sve_st1d,       INS_sve_st1d,       INS_sve_st1w,       INS_sve_st1d},    HW_Category_MemoryStore,           HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
+HARDWARE_INTRINSIC(Sve,           SetFfr,                                                           -1,      1,      true,  {INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_sve_wrffr,      INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_BaseTypeFromFirstArg|HW_Flag_SpecialSideEffectMask|HW_Flag_SpecialCodeGen)
 HARDWARE_INTRINSIC(Sve,           ShiftLeftLogical,                                                 -1,      -1,     false, {INS_sve_lsl,        INS_sve_lsl,        INS_sve_lsl,        INS_sve_lsl,        INS_sve_lsl,        INS_sve_lsl,        INS_sve_lsl,        INS_sve_lsl,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasRMWSemantics)
 HARDWARE_INTRINSIC(Sve,           ShiftRightArithmetic,                                             -1,      -1,     false, {INS_sve_asr,        INS_invalid,        INS_sve_asr,        INS_invalid,        INS_sve_asr,        INS_invalid,        INS_sve_asr,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasRMWSemantics)
 HARDWARE_INTRINSIC(Sve,           ShiftRightArithmeticForDivide,                                    -1,      -1,     false, {INS_sve_asrd,       INS_invalid,        INS_sve_asrd,       INS_invalid,        INS_sve_asrd,       INS_invalid,        INS_sve_asrd,       INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_ShiftRightByImmediate, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasRMWSemantics|HW_Flag_HasImmediateOperand)

From fb2012ec8722870b48ebfa6b38ed952dbfe36a98 Mon Sep 17 00:00:00 2001
From: TIHan <lol.tihan@gmail.com>
Date: Fri, 12 Jul 2024 21:56:27 -0700
Subject: [PATCH 16/24] Remove checking for zeroes after the fault

---
 src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
index d1d5c06b8e1fe9..0b2cc688458c29 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
@@ -8196,11 +8196,6 @@ private static bool CheckFirstFaultingBehaviorCore<T>(T[] result, Vector<T> faul
                     {
                         return false;
                     }
-
-                    if (result[i] != T.Zero)
-                    {
-                        return false;
-                    }
                 }
                 else
                 {

From aca67599d748033a671b6d9c26d7095cc2c2fb44 Mon Sep 17 00:00:00 2001
From: TIHan <lol.tihan@gmail.com>
Date: Mon, 15 Jul 2024 18:43:59 -0700
Subject: [PATCH 17/24] Added GatherVectorFirstFaultingVectorBases test
 template, but currently without the FirstFaulting test. Added SveFfrTest
 template.

---
 src/coreclr/jit/hwintrinsiccodegenarm64.cpp   |   1 +
 src/coreclr/jit/hwintrinsiclistarm64sve.h     |   2 +-
 .../Arm/Sve.PlatformNotSupported.cs           |  33 +-
 .../src/System/Runtime/Intrinsics/Arm/Sve.cs  |  33 +-
 .../ref/System.Runtime.Intrinsics.cs          |   6 +-
 .../GenerateHWIntrinsicTests_Arm.cs           |  13 +
 .../HardwareIntrinsics/Arm/Shared/Helpers.cs  |  94 ++-
 .../Arm/Shared/SveFfrTest.template            | 325 ++++++++++
 ...eGatherVectorFirstFaultingIndices.template |   4 +-
 ...herVectorFirstFaultingVectorBases.template | 600 ++++++++++++++++++
 .../Shared/SveGatherVectorIndices.template    |  18 +-
 .../SveGatherVectorVectorBases.template       |  41 +-
 12 files changed, 1070 insertions(+), 100 deletions(-)
 create mode 100644 src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveFfrTest.template
 create mode 100644 src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingVectorBases.template

diff --git a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp
index 24d75c6820c621..05e333eb335c82 100644
--- a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp
+++ b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp
@@ -2288,6 +2288,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
 
             case NI_Sve_LoadVectorFirstFaulting:
             {
+                assert(op3Reg == REG_NA);
                 insScalableOpts sopt = (opt == INS_OPTS_SCALABLE_B) ? INS_SCALABLE_OPTS_NONE : INS_SCALABLE_OPTS_LSL_N;
                 GetEmitter()->emitIns_R_R_R_R(ins, emitSize, targetReg, op1Reg, op2Reg, REG_ZR, opt, sopt);
                 break;
diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h
index 6ae1c7e76fadcf..b7420689beb457 100644
--- a/src/coreclr/jit/hwintrinsiclistarm64sve.h
+++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h
@@ -106,7 +106,7 @@ HARDWARE_INTRINSIC(Sve,           GatherPrefetch64Bit,
 HARDWARE_INTRINSIC(Sve,           GatherPrefetch8Bit,                                               -1,     -1,      false, {INS_sve_prfb,       INS_sve_prfb,       INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_Special,               HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasImmediateOperand|HW_Flag_HasEnumOperand|HW_Flag_SpecialSideEffect_Other)
 HARDWARE_INTRINSIC(Sve,           GatherVector,                                                     -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1w,       INS_sve_ld1w,       INS_sve_ld1d,       INS_sve_ld1d,       INS_sve_ld1w,       INS_sve_ld1d},    HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GatherVectorByteZeroExtend,                                       -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1b,       INS_sve_ld1b,       INS_sve_ld1b,       INS_sve_ld1b,       INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
-HARDWARE_INTRINSIC(Sve,           GatherVectorFirstFaulting,                                        -1,      3,      true,  {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ldff1w,     INS_sve_ldff1w,     INS_sve_ldff1d,     INS_sve_ldff1d,     INS_sve_ldff1w,     INS_sve_ldff1d},  HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_SpecialSideEffectMask)
+HARDWARE_INTRINSIC(Sve,           GatherVectorFirstFaulting,                                        -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ldff1w,     INS_sve_ldff1w,     INS_sve_ldff1d,     INS_sve_ldff1d,     INS_sve_ldff1w,     INS_sve_ldff1d},  HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_SpecialSideEffectMask)
 HARDWARE_INTRINSIC(Sve,           GatherVectorInt16SignExtend,                                      -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1sh,      INS_sve_ld1sh,      INS_sve_ld1sh,      INS_sve_ld1sh,      INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GatherVectorInt16WithByteOffsetsSignExtend,                       -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1sh,      INS_sve_ld1sh,      INS_sve_ld1sh,      INS_sve_ld1sh,      INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GatherVectorInt32SignExtend,                                      -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1sw,      INS_sve_ld1sw,      INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs
index 43e6b508ccb045..6d0adc13677083 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs
@@ -3462,11 +3462,12 @@ internal Arm64() { }
         /// </summary>
         public static unsafe Vector<double> GatherVectorFirstFaulting(Vector<double> mask, double* address, Vector<ulong> indices) { throw new PlatformNotSupportedException(); }
 
-        /// <summary>
-        /// svint32_t svldff1_gather[_u32base]_s32(svbool_t pg, svuint32_t bases)
-        ///   LDFF1W Zresult.S, Pg/Z, [Zbases.S, #0]
-        /// </summary>
-        public static unsafe Vector<int> GatherVectorFirstFaulting(Vector<int> mask, Vector<uint> addresses) { throw new PlatformNotSupportedException(); }
+        // <summary>
+        // svint32_t svldff1_gather[_u32base]_s32(svbool_t pg, svuint32_t bases)
+        //   LDFF1W Zresult.S, Pg/Z, [Zbases.S, #0]
+        // </summary>
+        // Removed as per #103297
+        // public static unsafe Vector<int> GatherVectorFirstFaulting(Vector<int> mask, Vector<uint> addresses) { throw new PlatformNotSupportedException(); }
 
         /// <summary>
         /// svint32_t svldff1_gather_[s32]index[_s32](svbool_t pg, const int32_t *base, svint32_t indices)
@@ -3504,11 +3505,12 @@ internal Arm64() { }
         /// </summary>
         public static unsafe Vector<float> GatherVectorFirstFaulting(Vector<float> mask, float* address, Vector<int> indices) { throw new PlatformNotSupportedException(); }
 
-        /// <summary>
-        /// svfloat32_t svldff1_gather[_u32base]_f32(svbool_t pg, svuint32_t bases)
-        ///   LDFF1W Zresult.S, Pg/Z, [Zbases.S, #0]
-        /// </summary>
-        public static unsafe Vector<float> GatherVectorFirstFaulting(Vector<float> mask, Vector<uint> addresses) { throw new PlatformNotSupportedException(); }
+        // <summary>
+        // svfloat32_t svldff1_gather[_u32base]_f32(svbool_t pg, svuint32_t bases)
+        //   LDFF1W Zresult.S, Pg/Z, [Zbases.S, #0]
+        // </summary>
+        // Removed as per #103297
+        // public static unsafe Vector<float> GatherVectorFirstFaulting(Vector<float> mask, Vector<uint> addresses) { throw new PlatformNotSupportedException(); }
 
         /// <summary>
         /// svfloat32_t svldff1_gather_[u32]index[_f32](svbool_t pg, const float32_t *base, svuint32_t indices)
@@ -3516,11 +3518,12 @@ internal Arm64() { }
         /// </summary>
         public static unsafe Vector<float> GatherVectorFirstFaulting(Vector<float> mask, float* address, Vector<uint> indices) { throw new PlatformNotSupportedException(); }
 
-        /// <summary>
-        /// svuint32_t svldff1_gather[_u32base]_u32(svbool_t pg, svuint32_t bases)
-        ///   LDFF1W Zresult.S, Pg/Z, [Zbases.S, #0]
-        /// </summary>
-        public static unsafe Vector<uint> GatherVectorFirstFaulting(Vector<uint> mask, Vector<uint> addresses) { throw new PlatformNotSupportedException(); }
+        // <summary>
+        // svuint32_t svldff1_gather[_u32base]_u32(svbool_t pg, svuint32_t bases)
+        //   LDFF1W Zresult.S, Pg/Z, [Zbases.S, #0]
+        // </summary>
+        // Removed as per #103297
+        // public static unsafe Vector<uint> GatherVectorFirstFaulting(Vector<uint> mask, Vector<uint> addresses) { throw new PlatformNotSupportedException(); }
 
         /// <summary>
         /// svuint32_t svldff1_gather_[s32]index[_u32](svbool_t pg, const uint32_t *base, svint32_t indices)
diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs
index b21998104287c0..ed64f367321ef8 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs
@@ -3521,11 +3521,12 @@ internal Arm64() { }
         /// </summary>
         public static unsafe Vector<double> GatherVectorFirstFaulting(Vector<double> mask, double* address, Vector<ulong> indices) => GatherVectorFirstFaulting(mask, address, indices);
 
-        /// <summary>
-        /// svint32_t svldff1_gather[_u32base]_s32(svbool_t pg, svuint32_t bases)
-        ///   LDFF1W Zresult.S, Pg/Z, [Zbases.S, #0]
-        /// </summary>
-        public static unsafe Vector<int> GatherVectorFirstFaulting(Vector<int> mask, Vector<uint> addresses) => GatherVectorFirstFaulting(mask, addresses);
+        // <summary>
+        // svint32_t svldff1_gather[_u32base]_s32(svbool_t pg, svuint32_t bases)
+        //   LDFF1W Zresult.S, Pg/Z, [Zbases.S, #0]
+        // </summary>
+        // Removed as per #103297
+        // public static unsafe Vector<int> GatherVectorFirstFaulting(Vector<int> mask, Vector<uint> addresses) => GatherVectorFirstFaulting(mask, addresses);
 
         /// <summary>
         /// svint32_t svldff1_gather_[s32]index[_s32](svbool_t pg, const int32_t *base, svint32_t indices)
@@ -3563,11 +3564,12 @@ internal Arm64() { }
         /// </summary>
         public static unsafe Vector<float> GatherVectorFirstFaulting(Vector<float> mask, float* address, Vector<int> indices) => GatherVectorFirstFaulting(mask, address, indices);
 
-        /// <summary>
-        /// svfloat32_t svldff1_gather[_u32base]_f32(svbool_t pg, svuint32_t bases)
-        ///   LDFF1W Zresult.S, Pg/Z, [Zbases.S, #0]
-        /// </summary>
-        public static unsafe Vector<float> GatherVectorFirstFaulting(Vector<float> mask, Vector<uint> addresses) => GatherVectorFirstFaulting(mask, addresses);
+        // <summary>
+        // svfloat32_t svldff1_gather[_u32base]_f32(svbool_t pg, svuint32_t bases)
+        //   LDFF1W Zresult.S, Pg/Z, [Zbases.S, #0]
+        // </summary>
+        // Removed as per #103297
+        // public static unsafe Vector<float> GatherVectorFirstFaulting(Vector<float> mask, Vector<uint> addresses) => GatherVectorFirstFaulting(mask, addresses);
 
         /// <summary>
         /// svfloat32_t svldff1_gather_[u32]index[_f32](svbool_t pg, const float32_t *base, svuint32_t indices)
@@ -3575,11 +3577,12 @@ internal Arm64() { }
         /// </summary>
         public static unsafe Vector<float> GatherVectorFirstFaulting(Vector<float> mask, float* address, Vector<uint> indices) => GatherVectorFirstFaulting(mask, address, indices);
 
-        /// <summary>
-        /// svuint32_t svldff1_gather[_u32base]_u32(svbool_t pg, svuint32_t bases)
-        ///   LDFF1W Zresult.S, Pg/Z, [Zbases.S, #0]
-        /// </summary>
-        public static unsafe Vector<uint> GatherVectorFirstFaulting(Vector<uint> mask, Vector<uint> addresses) => GatherVectorFirstFaulting(mask, addresses);
+        // <summary>
+        // svuint32_t svldff1_gather[_u32base]_u32(svbool_t pg, svuint32_t bases)
+        //   LDFF1W Zresult.S, Pg/Z, [Zbases.S, #0]
+        // </summary>
+        // Removed as per #103297
+        // public static unsafe Vector<uint> GatherVectorFirstFaulting(Vector<uint> mask, Vector<uint> addresses) => GatherVectorFirstFaulting(mask, addresses);
 
         /// <summary>
         /// svuint32_t svldff1_gather_[s32]index[_u32](svbool_t pg, const uint32_t *base, svint32_t indices)
diff --git a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs
index 9c059c533564f4..71263bd49943df 100644
--- a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs
+++ b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs
@@ -4853,16 +4853,16 @@ internal Arm64() { }
         public static unsafe System.Numerics.Vector<double> GatherVectorFirstFaulting(System.Numerics.Vector<double> mask, double* address, System.Numerics.Vector<long> indices) { throw null; }
         public static unsafe System.Numerics.Vector<double> GatherVectorFirstFaulting(System.Numerics.Vector<double> mask, System.Numerics.Vector<ulong> addresses) { throw null; }
         public static unsafe System.Numerics.Vector<double> GatherVectorFirstFaulting(System.Numerics.Vector<double> mask, double* address, System.Numerics.Vector<ulong> indices) { throw null; }
-        public static unsafe System.Numerics.Vector<int> GatherVectorFirstFaulting(System.Numerics.Vector<int> mask, System.Numerics.Vector<uint> addresses) { throw null; }
+        // public static unsafe System.Numerics.Vector<int> GatherVectorFirstFaulting(System.Numerics.Vector<int> mask, System.Numerics.Vector<uint> addresses) { throw null; }
         public static unsafe System.Numerics.Vector<int> GatherVectorFirstFaulting(System.Numerics.Vector<int> mask, int* address, System.Numerics.Vector<int> indices) { throw null; }
         public static unsafe System.Numerics.Vector<int> GatherVectorFirstFaulting(System.Numerics.Vector<int> mask, int* address, System.Numerics.Vector<uint> indices) { throw null; }
         public static unsafe System.Numerics.Vector<long> GatherVectorFirstFaulting(System.Numerics.Vector<long> mask, System.Numerics.Vector<ulong> addresses) { throw null; }
         public static unsafe System.Numerics.Vector<long> GatherVectorFirstFaulting(System.Numerics.Vector<long> mask, long* address, System.Numerics.Vector<long> indices) { throw null; }
         public static unsafe System.Numerics.Vector<long> GatherVectorFirstFaulting(System.Numerics.Vector<long> mask, long* address, System.Numerics.Vector<ulong> indices) { throw null; }
         public static unsafe System.Numerics.Vector<float> GatherVectorFirstFaulting(System.Numerics.Vector<float> mask, float* address, System.Numerics.Vector<int> indices) { throw null; }
-        public static unsafe System.Numerics.Vector<float> GatherVectorFirstFaulting(System.Numerics.Vector<float> mask, System.Numerics.Vector<uint> addresses) { throw null; }
+        // public static unsafe System.Numerics.Vector<float> GatherVectorFirstFaulting(System.Numerics.Vector<float> mask, System.Numerics.Vector<uint> addresses) { throw null; }
         public static unsafe System.Numerics.Vector<float> GatherVectorFirstFaulting(System.Numerics.Vector<float> mask, float* address, System.Numerics.Vector<uint> indices) { throw null; }
-        public static unsafe System.Numerics.Vector<uint> GatherVectorFirstFaulting(System.Numerics.Vector<uint> mask, System.Numerics.Vector<uint> addresses) { throw null; }
+        // public static unsafe System.Numerics.Vector<uint> GatherVectorFirstFaulting(System.Numerics.Vector<uint> mask, System.Numerics.Vector<uint> addresses) { throw null; }
         public static unsafe System.Numerics.Vector<uint> GatherVectorFirstFaulting(System.Numerics.Vector<uint> mask, uint* address, System.Numerics.Vector<int> indices) { throw null; }
         public static unsafe System.Numerics.Vector<uint> GatherVectorFirstFaulting(System.Numerics.Vector<uint> mask, uint* address, System.Numerics.Vector<uint> indices) { throw null; }
         public static unsafe System.Numerics.Vector<ulong> GatherVectorFirstFaulting(System.Numerics.Vector<ulong> mask, System.Numerics.Vector<ulong> addresses) { throw null; }
diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
index a002de75109e8f..50b052a2fd5c69 100644
--- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
+++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
@@ -3484,6 +3484,15 @@
     ("SveExtractVectorTest.template",        new Dictionary<string, string> { ["TestName"] = "SveExtractVector_UInt32_1",                                                                              ["Isa"] = "Sve",       ["LoadIsa"] = "Sve", ["Method"] = "ExtractVector",                                                     ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt32",                                                              ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()",        ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",        ["ElementIndex"] = "1",                                                        ["ValidateIterResult"] = "Helpers.ExtractVector(firstOp, secondOp, ElementIndex, i) != result[i]"}),
     ("SveExtractVectorTest.template",        new Dictionary<string, string> { ["TestName"] = "SveExtractVector_UInt64_1",                                                                              ["Isa"] = "Sve",       ["LoadIsa"] = "Sve", ["Method"] = "ExtractVector",                                                     ["RetVectorType"] = "Vector", ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector", ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector", ["Op2BaseType"] = "UInt64",                                                              ["LargestVectorSize"] = "64", ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()",        ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",        ["ElementIndex"] = "1",                                                        ["ValidateIterResult"] = "Helpers.ExtractVector(firstOp, secondOp, ElementIndex, i) != result[i]"}),
 
+    ("SveFfrTest.template", new Dictionary<string, string> { ["TestName"] = "Sve_Ffr_byte",                                                                                                            ["VectorBaseType"] = "Byte",   ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskByte()"}),
+    ("SveFfrTest.template", new Dictionary<string, string> { ["TestName"] = "Sve_Ffr_short",                                                                                                           ["VectorBaseType"] = "Int16",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt16()"}),
+    ("SveFfrTest.template", new Dictionary<string, string> { ["TestName"] = "Sve_Ffr_int",                                                                                                             ["VectorBaseType"] = "Int32",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()"}),
+    ("SveFfrTest.template", new Dictionary<string, string> { ["TestName"] = "Sve_Ffr_long",                                                                                                            ["VectorBaseType"] = "Int64",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()"}),
+    ("SveFfrTest.template", new Dictionary<string, string> { ["TestName"] = "Sve_Ffr_sbyte",                                                                                                           ["VectorBaseType"] = "SByte",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSByte()"}),
+    ("SveFfrTest.template", new Dictionary<string, string> { ["TestName"] = "Sve_Ffr_ushort",                                                                                                          ["VectorBaseType"] = "UInt16", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt16()"}),
+    ("SveFfrTest.template", new Dictionary<string, string> { ["TestName"] = "Sve_Ffr_uint",                                                                                                            ["VectorBaseType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()"}),
+    ("SveFfrTest.template", new Dictionary<string, string> { ["TestName"] = "Sve_Ffr_ulong",                                                                                                           ["VectorBaseType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()"}),
+    
     // ("SveGatherVectorVectorBases.template", new Dictionary<string, string> { ["TestName"] = "Sve_GatherVector_Bases_float_uint",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVector",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single", ["Op2VectorType"] = "Vector",    ["Op2BaseType"] = "UInt32",                                                           ["ExtendedElementType"] = "Single", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueBase"] = "TestLibrary.Generator.GetSingle()"}),
     // ("SveGatherVectorVectorBases.template", new Dictionary<string, string> { ["TestName"] = "Sve_GatherVector_Bases_int_uint",                                                                     ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVector",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",  ["Op2VectorType"] = "Vector",    ["Op2BaseType"] = "UInt32",                                                           ["ExtendedElementType"] = "Int32",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueBase"] = "TestLibrary.Generator.GetInt32()"}),
     // ("SveGatherVectorVectorBases.template", new Dictionary<string, string> { ["TestName"] = "Sve_GatherVector_Bases_uint_uint",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVector",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32", ["Op2VectorType"] = "Vector",    ["Op2BaseType"] = "UInt32",                                                           ["ExtendedElementType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueBase"] = "TestLibrary.Generator.GetUInt32()"}),
@@ -3607,6 +3616,10 @@
     ("SveGatherVectorIndices.template",    new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorUInt32ZeroExtend_Indices_ulong_ulong",                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorUInt32ZeroExtend",                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",        ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
     ("SveGatherVectorIndices.template",    new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorUInt32ZeroExtend_Indices_uint_uint",                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorUInt32ZeroExtend",                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",        ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
 
+    ("SveGatherVectorFirstFaultingVectorBases.template",            new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorFirstFaulting_Bases_double_ulong",                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double", ["Op2VectorType"] = "Vector",    ["Op2BaseType"] = "UInt64",                                                              ["ExtendedElementType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",        ["NextValueBase"] = "TestLibrary.Generator.GetDouble()"}),
+    ("SveGatherVectorFirstFaultingVectorBases.template",            new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorFirstFaulting_Bases_long_ulong",                                                     ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",  ["Op2VectorType"] = "Vector",    ["Op2BaseType"] = "UInt64",                                                              ["ExtendedElementType"] = "Int64",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",        ["NextValueBase"] = "TestLibrary.Generator.GetInt64()"}),
+    ("SveGatherVectorFirstFaultingVectorBases.template",            new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorFirstFaulting_Bases_ulong_ulong",                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector",    ["Op2BaseType"] = "UInt64",                                                              ["ExtendedElementType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",        ["NextValueBase"] = "TestLibrary.Generator.GetUInt64()"}),
+    
     ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_float_int",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Single",   ["GetFfrType"] = "Byte",        ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
     ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_int_int",                                                                      ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Int32",    ["GetFfrType"] = "Int32",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
     ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_uint_int",                                                                     ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "UInt32",   ["GetFfrType"] = "UInt32",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
index 0b2cc688458c29..a4a57bc9e89b0a 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
@@ -8119,6 +8119,12 @@ private static T ConditionalSelectResult<T>(T maskResult, T result, T falseResul
             return (maskResult != T.Zero) ? result : falseResult;
         }
 
+        private static T ConditionalSelectTrueResult<T>(T maskResult, T result, T trueResult) where T : INumberBase<T>
+        {
+            return (maskResult != T.Zero) ? trueResult : result;
+        }
+
+
         private static bool CheckLoadVectorBehaviorCore<T>(T[] firstOp, T[] result, Func<int, T, T> map) where T : INumberBase<T>
         {
             for (var i = 0; i < firstOp.Length; i++)
@@ -8143,22 +8149,30 @@ public static bool CheckLoadVectorBehavior<T>(T[] maskOp, T[] firstOp, T[] resul
             return CheckLoadVectorBehaviorCore(firstOp, result, (i, loadResult) => ConditionalSelectResult(maskOp[i], loadResult, falseOp[i]));
         }
 
-        private static T GetGatherVectorResultByIndex<T, ExtendedElementT, Index>(int index, T[] firstOp, ExtendedElementT[] secondOp, Index[] thirdOp)
+        private static T GetGatherVectorResultByIndex<T, ExtendedElementT, Index>(int index, T[] mask, ExtendedElementT[] data, Index[] indices)
                 where T : INumberBase<T> 
                 where ExtendedElementT : INumberBase<ExtendedElementT> 
                 where Index : IBinaryInteger<Index>
         {
-            return (firstOp[index] == T.Zero) ? T.Zero : T.CreateTruncating(secondOp[int.CreateChecked(thirdOp[index])]);
+            return (mask[index] == T.Zero) ? T.Zero : T.CreateTruncating(data[int.CreateChecked(indices[index])]);
         }
 
-        private static bool CheckGatherVectorBehaviorCore<T, ExtendedElementT, Index>(T[] firstOp, ExtendedElementT[] secondOp, Index[] thirdOp, T[] result, Func<int, T, T> map) 
+        private static unsafe T GetGatherVectorBasesResultByIndex<T, AddressT, ExtendedElementT>(int index, T[] mask, AddressT[] data)
                 where T : INumberBase<T> 
+                where AddressT : unmanaged, INumberBase<AddressT>
+                where ExtendedElementT : unmanaged, INumberBase<ExtendedElementT>
+        {
+            return (mask[index] == T.Zero) ? T.Zero : T.CreateTruncating(*(ExtendedElementT*)Unsafe.BitCast<AddressT, nint>(data[index]));
+        }
+
+        private static bool CheckGatherVectorBehaviorCore<T, ExtendedElementT, Index>(T[] mask, ExtendedElementT[] data, Index[] indices, T[] result, Func<int, T, T> map) 
+                where T : INumberBase<T>
                 where ExtendedElementT : INumberBase<ExtendedElementT> 
                 where Index : IBinaryInteger<Index>
         {
-            for (var i = 0; i < firstOp.Length; i++)
+            for (var i = 0; i < mask.Length; i++)
             {
-                T gatherResult = GetGatherVectorResultByIndex(i, firstOp, secondOp, thirdOp);
+                T gatherResult = GetGatherVectorResultByIndex(i, mask, data, indices);
                 gatherResult = map(i, gatherResult);
                 if (result[i] != gatherResult)
                 {
@@ -8168,20 +8182,70 @@ private static bool CheckGatherVectorBehaviorCore<T, ExtendedElementT, Index>(T[
             return true;
         }
 
-        public static bool CheckGatherVectorBehavior<T, ExtendedElementT, Index>(T[] firstOp, ExtendedElementT[] secondOp, Index[] thirdOp, T[] result) 
+        private static bool CheckGatherVectorBasesBehaviorCore<T, AddressT, ExtendedElementT>(T[] mask, AddressT[] data, T[] result, Func<int, T, T> map) 
+                where T : INumberBase<T> 
+                where AddressT : unmanaged, INumberBase<AddressT>
+                where ExtendedElementT : unmanaged, INumberBase<ExtendedElementT>
+        {
+            for (var i = 0; i < mask.Length; i++)
+            {
+                T gatherResult = GetGatherVectorBasesResultByIndex<T, AddressT, ExtendedElementT>(i, mask, data);
+                gatherResult = map(i, gatherResult);
+                if (result[i] != gatherResult)
+                {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        public static bool CheckGatherVectorBehavior<T, ExtendedElementT, Index>(T[] mask, ExtendedElementT[] data, Index[] indices, T[] result) 
                 where T : INumberBase<T> 
                 where ExtendedElementT : INumberBase<ExtendedElementT> 
                 where Index : IBinaryInteger<Index>
         {
-            return CheckGatherVectorBehaviorCore(firstOp, secondOp, thirdOp, result, (_, gatherResult) => gatherResult);
+            return CheckGatherVectorBehaviorCore(mask, data, indices, result, (_, gatherResult) => gatherResult);
         }
 
-        public static bool CheckGatherVectorBehavior<T, ExtendedElementT, Index>(T[] maskOp, T[] firstOp, ExtendedElementT[] secondOp, Index[] thirdOp, T[] falseOp, T[] result) 
+        public static bool CheckGatherVectorConditionalSelectBehavior<T, ExtendedElementT, Index>(T[] cndSelMask, T[] mask, ExtendedElementT[] data, Index[] indices, T[] cndSelFalse, T[] result) 
                 where T : INumberBase<T> 
                 where ExtendedElementT : INumberBase<ExtendedElementT> 
                 where Index : IBinaryInteger<Index>
         {
-            return CheckGatherVectorBehaviorCore(firstOp, secondOp, thirdOp, result, (i, gatherResult) => ConditionalSelectResult(maskOp[i], gatherResult, falseOp[i]));
+            return CheckGatherVectorBehaviorCore(mask, data, indices, result, (i, gatherResult) => ConditionalSelectResult(cndSelMask[i], gatherResult, cndSelFalse[i]));
+        }
+
+        public static bool CheckGatherVectorConditionalSelectTrueBehavior<T, ExtendedElementT, Index>(T[] cndSelMask, T[] mask, ExtendedElementT[] data, Index[] indices, T[] cndSelTrue, T[] result) 
+                where T : INumberBase<T> 
+                where ExtendedElementT : INumberBase<ExtendedElementT> 
+                where Index : IBinaryInteger<Index>
+        {
+            return CheckGatherVectorBehaviorCore(mask, data, indices, result, (i, gatherResult) => ConditionalSelectTrueResult(cndSelMask[i], gatherResult, cndSelTrue[i]));
+        }
+
+
+        public static bool CheckGatherVectorBasesBehavior<T, AddressT, ExtendedElementT>(T[] mask, AddressT[] data, T[] result) 
+                where T : INumberBase<T> 
+                where AddressT : unmanaged, INumberBase<AddressT>
+                where ExtendedElementT : unmanaged, INumberBase<ExtendedElementT> 
+        {
+            return CheckGatherVectorBasesBehaviorCore<T, AddressT, ExtendedElementT>(mask, data, result, (_, gatherResult) => gatherResult);
+        }
+
+        public static bool CheckGatherVectorBasesConditionalSelectBehavior<T, AddressT, ExtendedElementT>(T[] cndSelMask, T[] mask, AddressT[] data, T[] cndSelFalse, T[] result) 
+                where T : INumberBase<T> 
+                where AddressT : unmanaged, INumberBase<AddressT>
+                where ExtendedElementT : unmanaged, INumberBase<ExtendedElementT>
+        {
+            return CheckGatherVectorBasesBehaviorCore<T, AddressT, ExtendedElementT>(mask, data, result, (i, gatherResult) => ConditionalSelectResult(cndSelMask[i], gatherResult, cndSelFalse[i]));
+        }
+
+        public static bool CheckGatherVectorBasesConditionalSelectTrueBehavior<T, AddressT, ExtendedElementT>(T[] cndSelMask, T[] mask, AddressT[] data, T[] cndSelTrue, T[] result) 
+                where T : INumberBase<T> 
+                where AddressT : unmanaged, INumberBase<AddressT>
+                where ExtendedElementT : unmanaged, INumberBase<ExtendedElementT>
+        {
+            return CheckGatherVectorBasesBehaviorCore<T, AddressT, ExtendedElementT>(mask, data, result, (i, gatherResult) => ConditionalSelectTrueResult(cndSelMask[i], gatherResult, cndSelTrue[i]));
         }
 
         private static bool CheckFirstFaultingBehaviorCore<T>(T[] result, Vector<T> faultResult, Func<int, bool> checkIter) where T : INumberBase<T>
@@ -8226,12 +8290,20 @@ public static bool CheckLoadVectorFirstFaultingBehavior<T>(T[] firstOp, T[] resu
             return CheckFirstFaultingBehaviorCore(result, faultResult, i => firstOp[i] == result[i]);
         }
 
-        public static bool CheckGatherVectorFirstFaultingBehavior<T, ExtendedElementT, Index>(T[] firstOp, ExtendedElementT[] secondOp, Index[] thirdOp, T[] result, Vector<T> faultResult)
+        public static bool CheckGatherVectorFirstFaultingBehavior<T, ExtendedElementT, Index>(T[] mask, ExtendedElementT[] data, Index[] indices, T[] result, Vector<T> faultResult)
                 where T : INumberBase<T> 
                 where ExtendedElementT : INumberBase<ExtendedElementT> 
                 where Index : IBinaryInteger<Index>
         {
-            return CheckFirstFaultingBehaviorCore(result, faultResult, i => GetGatherVectorResultByIndex(i, firstOp, secondOp, thirdOp) == result[i]);
+            return CheckFirstFaultingBehaviorCore(result, faultResult, i => GetGatherVectorResultByIndex(i, mask, data, indices) == result[i]);
+        }
+
+        public static bool CheckGatherVectorBasesFirstFaultingBehavior<T, AddressT, ExtendedElementT>(T[] mask, AddressT[] data, T[] result, Vector<T> faultResult)
+                where T : INumberBase<T> 
+                where AddressT : unmanaged, INumberBase<AddressT>
+                where ExtendedElementT : unmanaged, INumberBase<ExtendedElementT> 
+        {
+            return CheckFirstFaultingBehaviorCore(result, faultResult, i => GetGatherVectorBasesResultByIndex<T, AddressT, ExtendedElementT>(i, mask, data) == result[i]);
         }
         
         private static byte ConditionalExtract(byte[] op1, byte op2, byte[] op3, bool after)
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveFfrTest.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveFfrTest.template
new file mode 100644
index 00000000000000..dfb7e6a2b26292
--- /dev/null
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveFfrTest.template
@@ -0,0 +1,325 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+/******************************************************************************
+ * This file is auto-generated from a template file by the GenerateTests.csx  *
+ * script in tests\src\JIT\HardwareIntrinsics.Arm\Shared. In order to make    *
+ * changes, please update the corresponding template and run according to the *
+ * directions listed in the file.                                             *
+ ******************************************************************************/
+
+using System;
+using System.Numerics;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Runtime.Intrinsics;
+using System.Runtime.Intrinsics.Arm;
+using Xunit;
+
+namespace JIT.HardwareIntrinsics.Arm
+{
+    public static partial class Program
+    {
+        [Fact]
+        public static void {TestName}()
+        {
+            var test = new SveFfrTest__{TestName}();
+
+            if (test.IsSupported)
+            {
+                // Validates basic functionality works, using Unsafe.Read
+                test.RunBasicScenario_UnsafeRead();
+
+                if (Sve.IsSupported)
+                {
+                    // Validates basic functionality works, using Load
+                    test.RunBasicScenario_Load();
+                }
+
+                // Validates calling via reflection works, using Unsafe.Read
+                test.RunReflectionScenario_UnsafeRead();
+
+                // Validates passing a local works, using Unsafe.Read
+                test.RunLclVarScenario_UnsafeRead();
+
+                // Validates passing an instance member of a class works
+                test.RunClassFldScenario();
+
+                // Validates passing the field of a local struct works
+                test.RunStructLclFldScenario();
+
+                // Validates passing an instance member of a struct works
+                test.RunStructFldScenario();
+            }
+            else
+            {
+                // Validates we throw on unsupported hardware
+                test.RunUnsupportedScenario();
+            }
+
+            if (!test.Succeeded)
+            {
+                throw new Exception("One or more scenarios did not complete as expected.");
+            }
+        }
+    }
+
+    public sealed unsafe class SveFfrTest__{TestName}
+    {
+        private struct DataTable
+        {
+            private byte[] inArray1;
+            private byte[] outArray;
+
+            private GCHandle inHandle1;
+            private GCHandle outHandle;
+
+            private ulong alignment;
+
+            public DataTable({VectorBaseType}[] inArray1, {VectorBaseType}[] outArray, int alignment)
+            {
+                int sizeOfinArray1 = inArray1.Length * Unsafe.SizeOf<{VectorBaseType}>();
+                int sizeOfoutArray = outArray.Length * Unsafe.SizeOf<{VectorBaseType}>();
+                if ((alignment != 64 && alignment != 16 && alignment != 8) || (alignment * 2) < sizeOfinArray1 || (alignment * 2) < sizeOfoutArray)
+                {
+                    throw new ArgumentException($"Invalid value of alignment: {alignment}, sizeOfinArray1: {sizeOfinArray1}, sizeOfoutArray: {sizeOfoutArray}");
+                }
+
+                this.inArray1 = new byte[alignment * 2];
+                this.outArray = new byte[alignment * 2];
+
+                this.inHandle1 = GCHandle.Alloc(this.inArray1, GCHandleType.Pinned);
+                this.outHandle = GCHandle.Alloc(this.outArray, GCHandleType.Pinned);
+
+                this.alignment = (ulong)alignment;
+
+                Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(inArray1Ptr), ref Unsafe.As<{VectorBaseType}, byte>(ref inArray1[0]), (uint)sizeOfinArray1);
+            }
+
+            public void* inArray1Ptr => Align((byte*)(inHandle1.AddrOfPinnedObject().ToPointer()), alignment);
+            public void* outArrayPtr => Align((byte*)(outHandle.AddrOfPinnedObject().ToPointer()), alignment);
+
+            public void Dispose()
+            {
+                inHandle1.Free();
+                outHandle.Free();
+            }
+
+            private static unsafe void* Align(byte* buffer, ulong expectedAlignment)
+            {
+                return (void*)(((ulong)buffer + expectedAlignment - 1) & ~(expectedAlignment - 1));
+            }
+        }
+
+        private struct TestStruct
+        {
+            public Vector<{VectorBaseType}> _fld1;
+
+            public static TestStruct Create()
+            {
+                var testStruct = new TestStruct();
+
+                for (var i = 0; i < Op1ElementCount; i++) { _data1[i] = {NextValueOp1}; }
+                Unsafe.CopyBlockUnaligned(ref Unsafe.As<Vector<{VectorBaseType}>, byte>(ref testStruct._fld1), ref Unsafe.As<{VectorBaseType}, byte>(ref _data1[0]), (uint)Unsafe.SizeOf<Vector<{VectorBaseType}>>());
+
+                return testStruct;
+            }
+
+            public void RunStructFldScenario(SveFfrTest__{TestName} testClass)
+            {
+                Sve.SetFfr(_fld1);
+                var result = Sve.GetFfr{VectorBaseType}();
+
+                Unsafe.Write(testClass._dataTable.outArrayPtr, result);
+                testClass.ValidateResult(_fld1, testClass._dataTable.outArrayPtr);
+            }
+        }
+
+        private static readonly int LargestVectorSize = {LargestVectorSize};
+
+        private static readonly int Op1ElementCount = Unsafe.SizeOf<Vector<{VectorBaseType}>>() / sizeof({VectorBaseType});
+        private static readonly int RetElementCount = Unsafe.SizeOf<Vector<{VectorBaseType}>>() / sizeof({VectorBaseType});
+
+        private static {VectorBaseType}[] _maskData = new {VectorBaseType}[Op1ElementCount];
+        private static {VectorBaseType}[] _data1 = new {VectorBaseType}[Op1ElementCount];
+
+        private Vector<{VectorBaseType}> _mask;
+        private Vector<{VectorBaseType}> _fld1;
+        private Vector<{VectorBaseType}> _falseFld;
+
+        private DataTable _dataTable;
+
+        public SveFfrTest__{TestName}()
+        {
+            Succeeded = true;
+
+            for (var i = 0; i < Op1ElementCount; i++) { _maskData[i] = ({VectorBaseType})({NextValueOp1} % 2); }
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<Vector<{VectorBaseType}>, byte>(ref _mask), ref Unsafe.As<{VectorBaseType}, byte>(ref _maskData[0]), (uint)Unsafe.SizeOf<Vector<{VectorBaseType}>>());
+            for (var i = 0; i < Op1ElementCount; i++) { _data1[i] = {NextValueOp1}; }
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<Vector<{VectorBaseType}>, byte>(ref _fld1), ref Unsafe.As<{VectorBaseType}, byte>(ref _data1[0]), (uint)Unsafe.SizeOf<Vector<{VectorBaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<Vector<{VectorBaseType}>, byte>(ref _falseFld), ref Unsafe.As<{VectorBaseType}, byte>(ref _data1[0]), (uint)Unsafe.SizeOf<Vector<{VectorBaseType}>>());            
+
+            for (var i = 0; i < Op1ElementCount; i++) { _data1[i] = {NextValueOp1}; }
+            _dataTable = new DataTable(_data1, new {VectorBaseType}[RetElementCount], LargestVectorSize);
+        }
+
+        public bool IsSupported => Sve.IsSupported;
+
+        public bool Succeeded { get; set; }
+
+        public void RunBasicScenario_UnsafeRead()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_UnsafeRead));
+
+            Sve.SetFfr(
+                Unsafe.Read<Vector<{VectorBaseType}>>(_dataTable.inArray1Ptr)
+            );
+            var result = Sve.GetFfr{VectorBaseType}();
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(_dataTable.inArray1Ptr, _dataTable.outArrayPtr);
+        }
+
+        public void RunBasicScenario_Load()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_Load));
+
+            Vector<{VectorBaseType}> loadMask = Sve.CreateTrueMask{VectorBaseType}(SveMaskPattern.All);
+
+            Sve.SetFfr(
+                Sve.LoadVector(loadMask, ({VectorBaseType}*)(_dataTable.inArray1Ptr))
+            );
+            var result = Sve.GetFfr{VectorBaseType}();
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(_dataTable.inArray1Ptr, _dataTable.outArrayPtr);
+        }
+
+        public void RunReflectionScenario_UnsafeRead()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_UnsafeRead));
+
+            typeof(Sve).GetMethod(nameof(Sve.SetFfr), new Type[] { typeof(Vector<{VectorBaseType}>) })
+                                     .Invoke(null, new object[] {
+                                        Unsafe.Read<Vector<{VectorBaseType}>>(_dataTable.inArray1Ptr)
+                                     });
+
+            var result = typeof(Sve).GetMethod(nameof(Sve.GetFfr{VectorBaseType}), new Type[] { })
+                                     .Invoke(null, new object[] { });
+
+            // We cannot validate the results because the FFR register is trashed.
+            // Unsafe.Write(_dataTable.outArrayPtr, (Vector<{VectorBaseType}>)(result));
+            // ValidateResult(_dataTable.inArray1Ptr, _dataTable.outArrayPtr);
+        }
+
+        public void RunLclVarScenario_UnsafeRead()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunLclVarScenario_UnsafeRead));
+
+            var op1 = Unsafe.Read<Vector<{VectorBaseType}>>(_dataTable.inArray1Ptr);
+            Sve.SetFfr(op1);
+            var result = Sve.GetFfr{VectorBaseType}();
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(op1, _dataTable.outArrayPtr);
+        }
+
+        public void RunClassFldScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario));
+
+            Sve.SetFfr(_fld1);
+            var result = Sve.GetFfr{VectorBaseType}();
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(_fld1, _dataTable.outArrayPtr);
+        }
+
+        public void RunStructLclFldScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario));
+
+            var test = TestStruct.Create();
+            Sve.SetFfr(test._fld1);
+            var result = Sve.GetFfr{VectorBaseType}();
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(test._fld1, _dataTable.outArrayPtr);
+        }
+
+        public void RunStructFldScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario));
+
+            var test = TestStruct.Create();
+            test.RunStructFldScenario(this);
+        }
+
+        public void RunUnsupportedScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunUnsupportedScenario));
+
+            bool succeeded = false;
+
+            try
+            {
+                RunBasicScenario_UnsafeRead();
+            }
+            catch (PlatformNotSupportedException)
+            {
+                succeeded = true;
+            }
+
+            if (!succeeded)
+            {
+                Succeeded = false;
+            }
+        }
+
+        private void ValidateResult(Vector<{VectorBaseType}> op1, void* result, [CallerMemberName] string method = "")
+        {
+            {VectorBaseType}[] inArray1 = new {VectorBaseType}[Op1ElementCount];
+            {VectorBaseType}[] outArray = new {VectorBaseType}[RetElementCount];
+
+            Unsafe.WriteUnaligned(ref Unsafe.As<{VectorBaseType}, byte>(ref inArray1[0]), op1);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{VectorBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<Vector<{VectorBaseType}>>());
+
+            ValidateResult(inArray1, outArray, method);
+        }
+
+        private void ValidateResult(void* op1, void* result, [CallerMemberName] string method = "")
+        {
+            {VectorBaseType}[] inArray1 = new {VectorBaseType}[Op1ElementCount];
+            {VectorBaseType}[] outArray = new {VectorBaseType}[RetElementCount];
+
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{VectorBaseType}, byte>(ref inArray1[0]), ref Unsafe.AsRef<byte>(op1), (uint)Unsafe.SizeOf<Vector<{VectorBaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{VectorBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<Vector<{VectorBaseType}>>());
+
+            ValidateResult(inArray1, outArray, method);
+        }
+
+        private void ValidateResult({VectorBaseType}[] firstOp, {VectorBaseType}[] result, [CallerMemberName] string method = "")
+        {
+            bool succeeded = true;
+
+            for (var i = 0; i < firstOp.Length; i++)
+            {
+                if (firstOp[i] != result[i])
+                {
+                    succeeded = false;
+                    break;
+                }
+            }
+
+            if (!succeeded)
+            {
+                TestLibrary.TestFramework.LogInformation($"{nameof(Sve)}.{nameof(Sve.SetFfr)}<{VectorBaseType}>(Vector<{VectorBaseType}>): SetFfr failed:");
+                TestLibrary.TestFramework.LogInformation($" firstOp: ({string.Join(", ", firstOp)})");
+                TestLibrary.TestFramework.LogInformation($"  result: ({string.Join(", ", result)})");
+                TestLibrary.TestFramework.LogInformation(string.Empty);
+
+                Succeeded = false;
+            }
+        }
+    }
+}
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingIndices.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingIndices.template
index 86c2827817d6a2..c45dfc62d86d25 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingIndices.template
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingIndices.template
@@ -34,6 +34,8 @@ namespace JIT.HardwareIntrinsics.Arm
 
                 // Validates basic functionality works
                 test.RunBasicScenario_Load();
+
+                // Validates basic functionality of first-faulting behavior
                 test.RunBasicScenario_LoadFirstFaulting();
 
                 // Validates fully masked out load works.
@@ -580,7 +582,7 @@ namespace JIT.HardwareIntrinsics.Arm
 
         private void ValidateConditionalSelectResult({RetBaseType}[] maskOp, {Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {Op3BaseType}[] thirdOp, {RetBaseType}[] falseOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
         {
-            var succeeded = Helpers.CheckGatherVectorBehavior(maskOp, firstOp, secondOp, thirdOp, falseOp, result);
+            var succeeded = Helpers.CheckGatherVectorConditionalSelectBehavior(maskOp, firstOp, secondOp, thirdOp, falseOp, result);
 
             if (!succeeded)
             {
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingVectorBases.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingVectorBases.template
new file mode 100644
index 00000000000000..d4bc14542bef4b
--- /dev/null
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingVectorBases.template
@@ -0,0 +1,600 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+/******************************************************************************
+ * This file is auto-generated from a template file by the GenerateTests.csx  *
+ * script in tests\src\JIT\HardwareIntrinsics\Arm\Shared. In order to make    *
+ * changes, please update the corresponding template and run according to the *
+ * directions listed in the file.                                             *
+ ******************************************************************************/
+
+using System;
+using System.Numerics;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Runtime.Intrinsics;
+using System.Runtime.Intrinsics.Arm;
+using Xunit;
+
+namespace JIT.HardwareIntrinsics.Arm
+{
+    public static partial class Program
+    {
+        [Fact]
+        public static void {TestName}()
+        {
+            var test = new SveGatherVectorVectorBasesTest__{TestName}();
+
+            if (test.IsSupported)
+            {
+                // Validates basic functionality works, using Unsafe.Read
+                test.RunBasicScenario_UnsafeRead();
+
+                // Validates basic functionality works
+                test.RunBasicScenario_Load();
+
+                // Validates fully masked out load works.
+                test.RunBasicScenario_FalseMask();
+
+                // Validates fully masked out load with invalid address works.
+                test.RunBasicScenario_NonFaulting();
+
+                // Validates calling via reflection works, using Unsafe.Read
+                test.RunReflectionScenario_UnsafeRead();
+
+                // Validates passing a local works, using Unsafe.Read
+                test.RunLclVarScenario_UnsafeRead();
+
+                // Validates passing an instance member of a class works
+                test.RunClassFldScenario();
+
+                // Validates passing the field of a local struct works
+                test.RunStructLclFldScenario();
+
+                // Validates passing an instance member of a struct works
+                test.RunStructFldScenario();
+
+                // Validates using inside ConditionalSelect with value falseValue
+                // Currently, using this operation in ConditionalSelect() gives incorrect result
+                // when falseReg == targetReg because this instruction uses Pg/Z to update the targetReg
+                // instead of Pg/M to merge it. As such, the value of falseReg is lost. Ideally, such
+                // instructions should be marked similar to RMW (a different flag name) to make sure that
+                // we do not assign falseReg/targetReg same. Then, we would do something like this:
+                //
+                // ldnf1sh target, pg/z, [x0]
+                // sel mask, target, target, falseReg
+                //
+                // This needs more careful thinking, so disabling it for now.
+                // test.ConditionalSelect_FalseOp();
+
+                // Validates using inside ConditionalSelect with zero falseValue
+                test.ConditionalSelect_ZeroOp();
+            }
+            else
+            {
+                // Validates we throw on unsupported hardware
+                test.RunUnsupportedScenario();
+            }
+
+            if (!test.Succeeded)
+            {
+                throw new Exception("One or more scenarios did not complete as expected.");
+            }
+        }
+    }
+
+    public sealed unsafe class SveGatherVectorVectorBasesTest__{TestName}
+    {
+        private struct DataTable
+        {
+            private byte[] inArray1;
+            private byte[] inArray2;
+            private byte[] baseArray;
+            private byte[] outArray;
+
+            private GCHandle inHandle1;
+            private GCHandle inHandle2;
+            private GCHandle baseHandle;
+            private GCHandle outHandle;
+
+            private ulong alignment;
+
+            public DataTable({Op1BaseType}[] inArray1, {Op2BaseType}[] inArray2, {RetBaseType}[] baseArray, {RetBaseType}[] outArray, int alignment)
+            {
+                int sizeOfinArray1 = inArray1.Length * Unsafe.SizeOf<{Op1BaseType}>();
+                int sizeOfinArray2 = inArray2.Length * Unsafe.SizeOf<{Op2BaseType}>();
+                int sizeOfBaseArray = baseArray.Length * Unsafe.SizeOf<{RetBaseType}>();
+                int sizeOfoutArray = outArray.Length * Unsafe.SizeOf<{RetBaseType}>();
+
+                if ((alignment != 64 && alignment != 16 && alignment != 8) || (alignment * 2) < sizeOfinArray1 || (alignment * 2) < sizeOfinArray2 || (alignment * 2) < sizeOfoutArray)
+                {
+                    throw new ArgumentException($"Invalid value of alignment: {alignment}, sizeOfinArray1: {sizeOfinArray1}, sizeOfinArray2: {sizeOfinArray2}, sizeOfoutArray: {sizeOfoutArray}");
+                }
+
+                this.inArray1 = new byte[alignment * 2];
+                this.inArray2 = new byte[alignment * 2];
+                this.baseArray = new byte[alignment + sizeOfBaseArray];
+                this.outArray = new byte[alignment * 2];
+
+                this.inHandle1 = GCHandle.Alloc(this.inArray1, GCHandleType.Pinned);
+                this.inHandle2 = GCHandle.Alloc(this.inArray2, GCHandleType.Pinned);
+                this.baseHandle = GCHandle.Alloc(this.baseArray, GCHandleType.Pinned);
+                this.outHandle = GCHandle.Alloc(this.outArray, GCHandleType.Pinned);
+
+                this.alignment = (ulong)alignment;
+
+                Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(inArray1Ptr), ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), (uint)sizeOfinArray1);
+                Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(baseArrayPtr), ref Unsafe.As<{RetBaseType}, byte>(ref baseArray[0]), (uint)sizeOfBaseArray);
+
+                // Add the base pointer to the offsets within inArray2 to create complete pointers.
+                for (var i = 0; i < inArray2.Length; i++) { inArray2[i] += ({Op2BaseType})baseArrayPtr; }
+                Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(inArray2Ptr), ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), (uint)sizeOfinArray2);
+            }
+
+            public void* inArray1Ptr => Align((byte*)(inHandle1.AddrOfPinnedObject().ToPointer()), alignment);
+            public void* inArray2Ptr => Align((byte*)(inHandle2.AddrOfPinnedObject().ToPointer()), alignment);
+            public void* baseArrayPtr => Align((byte*)(baseHandle.AddrOfPinnedObject().ToPointer()), alignment);
+            public void* outArrayPtr => Align((byte*)(outHandle.AddrOfPinnedObject().ToPointer()), alignment);
+
+            public void Dispose()
+            {
+                inHandle1.Free();
+                inHandle2.Free();
+                baseHandle.Free();
+                outHandle.Free();
+            }
+
+            private static unsafe void* Align(byte* buffer, ulong expectedAlignment)
+            {
+                return (void*)(((ulong)buffer + expectedAlignment - 1) & ~(expectedAlignment - 1));
+            }
+        }
+
+        private struct TestStruct
+        {
+            public {Op1VectorType}<{Op1BaseType}> _fld1;
+            public {Op2VectorType}<{Op2BaseType}> _fld2;
+
+            public static TestStruct Create(DataTable _dataTable)
+            {
+                var testStruct = new TestStruct();
+
+                for (var i = 0; i < BaseElementCount; i++) { _datab[i] = {NextValueBase}; }
+                for (var i = 0; i < Op1ElementCount; i++) { _data1[i] = {NextValueOp1}; }
+                for (var i = 0; i < Op2ElementCount; i++) { _data2[i] = {NextValueOp2}; }
+
+                // Fill full of offsets into the data buffer.
+                for (var i = 0; i < Op2ElementCount; i++) { _data2[i] = {NextValueOp2} % ({Op2BaseType})BaseElementCount; }
+
+                // Add the base pointer to the offsets within inArray2 to create complete pointers.
+                for (var i = 0; i < Op2ElementCount; i++) { _data2[i] += ({Op2BaseType})_dataTable.baseArrayPtr; }
+
+                Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1VectorType}<{Op1BaseType}>, byte>(ref testStruct._fld1), ref Unsafe.As<{Op1BaseType}, byte>(ref _data1[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
+                Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2VectorType}<{Op2BaseType}>, byte>(ref testStruct._fld2), ref Unsafe.As<{Op2BaseType}, byte>(ref _data2[0]), (uint)Unsafe.SizeOf<{Op2VectorType}<{Op2BaseType}>>());
+
+                return testStruct;
+            }
+
+            public void RunStructFldScenario(SveGatherVectorVectorBasesTest__{TestName} testClass)
+            {
+                var result = {Isa}.{Method}(_fld1, _fld2);
+
+                Unsafe.Write(testClass._dataTable.outArrayPtr, result);
+                testClass.ValidateResult(_fld1, _fld2, testClass._dataTable.outArrayPtr);
+            }
+        }
+
+        private static readonly int LargestVectorSize = {LargestVectorSize};
+
+        // A large enough buffer to hold many values.
+        // Values in Op2 will point to locations within this buffer.
+        private static readonly int BaseElementCount = 1024;
+        private static {RetBaseType}[] _datab = new {RetBaseType}[BaseElementCount];
+
+        private static readonly int Op1ElementCount = Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() / sizeof({Op1BaseType});
+        private static readonly int Op2ElementCount = Unsafe.SizeOf<{Op2VectorType}<{Op2BaseType}>>() / sizeof({Op2BaseType});
+        private static readonly int RetElementCount = Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>() / sizeof({RetBaseType});
+
+        private static {Op1BaseType}[] _data1 = new {Op1BaseType}[Op1ElementCount];
+        private static {Op2BaseType}[] _data2 = new {Op2BaseType}[Op2ElementCount];
+
+        private static {RetBaseType}[] _maskData = new {RetBaseType}[RetElementCount];
+        private static {RetBaseType}[] _falseData = new {RetBaseType}[RetElementCount];
+
+        private {Op1VectorType}<{Op1BaseType}> _fld1;
+        private {Op2VectorType}<{Op2BaseType}> _fld2;
+
+        private {Op1VectorType}<{Op1BaseType}> _mask;
+        private {Op1VectorType}<{Op1BaseType}> _falseFld;
+
+        private DataTable _dataTable;
+
+        public SveGatherVectorVectorBasesTest__{TestName}()
+        {
+            Succeeded = true;
+
+            for (var i = 0; i < BaseElementCount; i++) { _datab[i] = {NextValueBase}; }
+            for (var i = 0; i < Op1ElementCount; i++) { _data1[i] = {NextValueOp1}; }
+
+            // Fill full of offsets into the data buffer. They wil be expanded to full pointers inside the DataTable constructor.
+            for (var i = 0; i < Op2ElementCount; i++) { _data2[i] = {NextValueOp2} % ({Op2BaseType})BaseElementCount; }
+
+            for (var i = 0; i < RetElementCount; i++) { _maskData[i] = ({RetBaseType})({NextValueOp1}); }
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetVectorType}<{RetBaseType}>, byte>(ref _mask), ref Unsafe.As<{RetBaseType}, byte>(ref _maskData[0]), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            for (var i = 0; i < RetElementCount; i++) { _falseData[i] = ({RetBaseType})({NextValueOp2}); }
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetVectorType}<{RetBaseType}>, byte>(ref _falseFld), ref Unsafe.As<{RetBaseType}, byte>(ref _falseData[0]), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            _dataTable = new DataTable(_data1, _data2, _datab, new {RetBaseType}[RetElementCount], LargestVectorSize);
+
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1VectorType}<{Op1BaseType}>, byte>(ref _fld1), ref Unsafe.As<{Op1BaseType}, byte>(ref _data1[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2VectorType}<{Op2BaseType}>, byte>(ref _fld2), ref Unsafe.As<{Op2BaseType}, byte>(ref _data2[0]), (uint)Unsafe.SizeOf<{Op2VectorType}<{Op2BaseType}>>());
+        }
+
+        public bool IsSupported => {Isa}.IsSupported;
+
+        public bool Succeeded { get; set; }
+
+        public void RunBasicScenario_UnsafeRead()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_UnsafeRead));
+
+            var result = {Isa}.{Method}(
+                Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr),
+                Unsafe.Read<{Op2VectorType}<{Op2BaseType}>>(_dataTable.inArray2Ptr)
+            );
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
+        }
+
+        public void RunBasicScenario_Load()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_Load));
+
+            {Op1VectorType}<{Op1BaseType}> loadMask1 = Sve.CreateTrueMask{Op1BaseType}(SveMaskPattern.All);
+            {Op2VectorType}<{Op2BaseType}> loadMask2 = Sve.CreateTrueMask{Op2BaseType}(SveMaskPattern.All);
+
+            var result = {Isa}.{Method}(
+                {LoadIsa}.Load{Op1VectorType}(loadMask1, ({Op1BaseType}*)(_dataTable.inArray1Ptr)),
+                {LoadIsa}.Load{Op2VectorType}(loadMask2, ({Op2BaseType}*)(_dataTable.inArray2Ptr))
+            );
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
+        }
+
+
+        public void RunBasicScenario_FalseMask()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_FalseMask));
+
+            {Op1VectorType}<{Op1BaseType}> falseMask = Sve.CreateFalseMask{Op1BaseType}();
+
+            var result = {Isa}.{Method}(
+                falseMask,
+                Unsafe.Read<{Op2VectorType}<{Op2BaseType}>>(_dataTable.inArray2Ptr)
+            );
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateZeroResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
+        }
+
+        public void RunBasicScenario_NonFaulting()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_NonFaulting));
+
+            {Op1VectorType}<{Op1BaseType}> falseMask = Sve.CreateFalseMask{Op1BaseType}();
+
+            try
+            {
+                var result = {Isa}.{Method}(
+                    falseMask,
+                    {Op2VectorType}<{Op2BaseType}>.Zero
+                );
+
+                Unsafe.Write(_dataTable.outArrayPtr, result);
+                ValidateZeroResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
+            }
+            catch
+            {
+                Succeeded = false;
+            }
+        }
+
+        public void RunReflectionScenario_UnsafeRead()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_UnsafeRead));
+
+            var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof({Op1VectorType}<{Op1BaseType}>), typeof({Op1VectorType}<{Op2BaseType}>) })
+                                     .Invoke(null, new object[] {
+                                        Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr),
+                                        Unsafe.Read<{Op2VectorType}<{Op2BaseType}>>(_dataTable.inArray2Ptr),
+                                     });
+
+            Unsafe.Write(_dataTable.outArrayPtr, ({RetVectorType}<{RetBaseType}>)(result));
+            ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
+        }
+
+        public void RunLclVarScenario_UnsafeRead()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunLclVarScenario_UnsafeRead));
+
+            var op1 = Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr);
+            var op2 = Unsafe.Read<{Op2VectorType}<{Op2BaseType}>>(_dataTable.inArray2Ptr);
+            var result = {Isa}.{Method}(op1, op2);
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(op1, op2, _dataTable.outArrayPtr);
+        }
+
+        public void RunClassFldScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario));
+
+            var result = {Isa}.{Method}(_fld1, _fld2);
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(_fld1, _fld2, _dataTable.outArrayPtr);
+        }
+
+        public void RunStructLclFldScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario));
+
+            var test = TestStruct.Create(_dataTable);
+            var result = {Isa}.{Method}(test._fld1, test._fld2);
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(test._fld1, test._fld2, _dataTable.outArrayPtr);
+        }
+
+        public void RunStructFldScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario));
+
+            var test = TestStruct.Create(_dataTable);
+            test.RunStructFldScenario(this);
+        }
+
+        public void ConditionalSelect_FalseOp()
+        {
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_mask - operation in TrueValue");
+            ConditionalSelectScenario_TrueValue(_mask, _fld1, _fld2, _falseFld);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_zero - operation in TrueValue");
+            ConditionalSelectScenario_TrueValue({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _falseFld);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_all - operation in TrueValue");
+            ConditionalSelectScenario_TrueValue({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _falseFld);
+
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_mask - operation in FalseValue");
+            ConditionalSelectScenario_FalseValue(_mask, _fld1, _fld2, _falseFld);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_zero - operation in FalseValue");
+            ConditionalSelectScenario_FalseValue({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _falseFld);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_all - operation in FalseValue");
+            ConditionalSelectScenario_FalseValue({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _falseFld);
+        }
+
+        public void ConditionalSelect_ZeroOp()
+        {
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_mask - operation in TrueValue");
+            ConditionalSelectScenario_TrueValue(_mask, _fld1, _fld2, {Op1VectorType}<{RetBaseType}>.Zero);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_zero - operation in TrueValue");
+            ConditionalSelectScenario_TrueValue({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, {Op1VectorType}<{Op1BaseType}>.Zero);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_all - operation in TrueValue");
+            ConditionalSelectScenario_TrueValue({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, {Op1VectorType}<{Op1BaseType}>.Zero);
+
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_mask - operation in FalseValue");
+            ConditionalSelectScenario_FalseValue(_mask, _fld1, _fld2, {Op1VectorType}<{RetBaseType}>.Zero);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_zero - operation in FalseValue");
+            ConditionalSelectScenario_FalseValue({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, {Op1VectorType}<{Op1BaseType}>.Zero);
+            
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_all - operation in FalseValue");
+            ConditionalSelectScenario_FalseValue({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, {Op1VectorType}<{Op1BaseType}>.Zero);
+        }
+
+        [method: MethodImpl(MethodImplOptions.AggressiveInlining)]
+        private void ConditionalSelectScenario_TrueValue({RetVectorType}<{RetBaseType}> mask, {Op1VectorType}<{Op1BaseType}> op1, {Op2VectorType}<{Op2BaseType}> op2, {Op1VectorType}<{Op1BaseType}> falseOp)
+        {
+            var result = Sve.ConditionalSelect(mask, {Isa}.{Method}(op1, op2), falseOp);
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateConditionalSelectResult_TrueValue(mask, op1, op2, falseOp, _dataTable.outArrayPtr);
+        }
+
+        [method: MethodImpl(MethodImplOptions.AggressiveInlining)]
+        private void ConditionalSelectScenario_FalseValue({RetVectorType}<{RetBaseType}> mask, {Op1VectorType}<{Op1BaseType}> op1, {Op2VectorType}<{Op2BaseType}> op2, {Op1VectorType}<{Op1BaseType}> trueOp)
+        {
+            var result = Sve.ConditionalSelect(mask, trueOp, {Isa}.{Method}(op1, op2));
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateConditionalSelectResult_FalseValue(mask, op1, op2, trueOp, _dataTable.outArrayPtr);
+        }
+
+        public void RunUnsupportedScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunUnsupportedScenario));
+
+            Succeeded = false;
+
+            try
+            {
+                RunBasicScenario_Load();
+            }
+            catch (PlatformNotSupportedException)
+            {
+                Succeeded = true;
+            }
+        }
+
+        private void ValidateResult({Op1VectorType}<{Op1BaseType}> op1, {Op2VectorType}<{Op2BaseType}> op2, void* result, [CallerMemberName] string method = "")
+        {
+            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount];
+            {Op2BaseType}[] inArray2 = new {Op2BaseType}[Op2ElementCount];
+            {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), op1);
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), op2);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateResult(inArray1, inArray2, outArray, method);
+        }
+
+        private void ValidateResult(void* firstOp, void* secondOp, void* result, [CallerMemberName] string method = "")
+        {            
+            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount];
+            {Op2BaseType}[] inArray2 = new {Op2BaseType}[Op2ElementCount];
+            {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), ref Unsafe.AsRef<byte>(firstOp), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), ref Unsafe.AsRef<byte>(secondOp), (uint)(Unsafe.SizeOf<{Op2VectorType}<{Op2BaseType}>>()));
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateResult(inArray1, inArray2, outArray, method);
+        }
+
+        private void ValidateResult({Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
+        {
+            var succeeded = Helpers.CheckGatherVectorBasesBehavior<{Op1BaseType}, {Op2BaseType}, {ExtendedElementType}>(firstOp, secondOp, result);
+
+            if (!succeeded)
+            {
+                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1BaseType}, {Op2BaseType}, {Op2BaseType}): {method} failed:");
+                TestLibrary.TestFramework.LogInformation($"  firstOp: ({string.Join(", ", firstOp)})");
+                TestLibrary.TestFramework.LogInformation($"  secondOp: ({string.Join(", ", secondOp)})");
+                TestLibrary.TestFramework.LogInformation($"   result: ({string.Join(", ", result)})");
+                TestLibrary.TestFramework.LogInformation(string.Empty);
+
+                Succeeded = false;
+            }
+        }
+
+        private void ValidateZeroResult({Op1VectorType}<{Op1BaseType}> op1, {Op2VectorType}<{Op2BaseType}> op2, void* result, [CallerMemberName] string method = "")
+        {
+            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount];
+            {Op2BaseType}[] inArray2 = new {Op2BaseType}[Op2ElementCount];
+            {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), op1);
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), op2);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateZeroResult(inArray1, inArray2, outArray, method);
+        }
+
+        private void ValidateZeroResult(void* firstOp, void* secondOp, void* result, [CallerMemberName] string method = "")
+        {            
+            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount];
+            {Op2BaseType}[] inArray2 = new {Op2BaseType}[Op2ElementCount];
+            {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), ref Unsafe.AsRef<byte>(firstOp), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), ref Unsafe.AsRef<byte>(secondOp), (uint)(Unsafe.SizeOf<{Op2VectorType}<{Op2BaseType}>>()));
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateZeroResult(inArray1, inArray2, outArray, method);
+        }
+
+        private void ValidateZeroResult({Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
+        {
+            bool succeeded = true;
+
+            for (var i = 0; i < RetElementCount; i++)
+            {
+                if (result[i] != 0)
+                {
+                    succeeded = false;
+                    break;
+                }
+            }
+
+            if (!succeeded)
+            {
+                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1BaseType}, {Op2BaseType}, {Op2BaseType}): {method} failed:");
+                TestLibrary.TestFramework.LogInformation($"  firstOp: ({string.Join(", ", firstOp)})");
+                TestLibrary.TestFramework.LogInformation($"  secondOp: ({string.Join(", ", secondOp)})");
+                TestLibrary.TestFramework.LogInformation($"   result: ({string.Join(", ", result)})");
+                TestLibrary.TestFramework.LogInformation(string.Empty);
+
+                Succeeded = false;
+            }
+        }
+
+        private void ValidateConditionalSelectResult_TrueValue({RetVectorType}<{RetBaseType}> maskOp, {Op1VectorType}<{Op1BaseType}> op1, {Op2VectorType}<{Op2BaseType}> op2, {RetVectorType}<{RetBaseType}> falseOp, void* result, [CallerMemberName] string method = "")
+        {
+            {RetBaseType}[] maskArray = new {RetBaseType}[RetElementCount];
+            {Op1BaseType}[] op1Array = new {Op1BaseType}[Op1ElementCount];
+            {Op2BaseType}[] op2Array = new {Op2BaseType}[Op2ElementCount];
+            {RetBaseType}[] falseValArray = new {RetBaseType}[RetElementCount];
+            {RetBaseType}[] resultArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.WriteUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref maskArray[0]), maskOp);
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref op1Array[0]), op1);
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref op2Array[0]), op2);
+            Unsafe.WriteUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref falseValArray[0]), falseOp);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref resultArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateConditionalSelectResult_TrueValue(maskArray, op1Array, op2Array, falseValArray, resultArray, method);
+        }
+
+        private void ValidateConditionalSelectResult_TrueValue({RetBaseType}[] maskOp, {Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {RetBaseType}[] falseOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
+        {
+            var succeeded = Helpers.CheckGatherVectorBasesConditionalSelectBehavior<{Op1BaseType}, {Op2BaseType}, {ExtendedElementType}>(maskOp, firstOp, secondOp, falseOp, result);
+
+            if (!succeeded)
+            {
+                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1BaseType}, {Op2BaseType}, {Op2BaseType}): {method} failed:");
+                TestLibrary.TestFramework.LogInformation($"   maskOp: ({string.Join(", ", maskOp)})");
+                TestLibrary.TestFramework.LogInformation($"  firstOp: ({string.Join(", ", firstOp)})");
+                TestLibrary.TestFramework.LogInformation($" secondOp: ({string.Join(", ", secondOp)})");
+                TestLibrary.TestFramework.LogInformation($"  falseOp: ({string.Join(", ", falseOp)})");
+                TestLibrary.TestFramework.LogInformation($"   result: ({string.Join(", ", result)})");
+                TestLibrary.TestFramework.LogInformation(string.Empty);
+
+                Succeeded = false;
+            }
+        }
+
+        private void ValidateConditionalSelectResult_FalseValue({RetVectorType}<{RetBaseType}> maskOp, {Op1VectorType}<{Op1BaseType}> op1, {Op2VectorType}<{Op2BaseType}> op2, {RetVectorType}<{RetBaseType}> trueOp, void* result, [CallerMemberName] string method = "")
+        {
+            {RetBaseType}[] maskArray = new {RetBaseType}[RetElementCount];
+            {Op1BaseType}[] op1Array = new {Op1BaseType}[Op1ElementCount];
+            {Op2BaseType}[] op2Array = new {Op2BaseType}[Op2ElementCount];
+            {RetBaseType}[] trueValArray = new {RetBaseType}[RetElementCount];
+            {RetBaseType}[] resultArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.WriteUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref maskArray[0]), maskOp);
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref op1Array[0]), op1);
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref op2Array[0]), op2);
+            Unsafe.WriteUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref trueValArray[0]), trueOp);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref resultArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateConditionalSelectResult_FalseValue(maskArray, op1Array, op2Array, trueValArray, resultArray, method);
+        }
+
+        private void ValidateConditionalSelectResult_FalseValue({RetBaseType}[] maskOp, {Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {RetBaseType}[] trueOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
+        {
+            var succeeded = Helpers.CheckGatherVectorBasesConditionalSelectTrueBehavior<{Op1BaseType}, {Op2BaseType}, {ExtendedElementType}>(maskOp, firstOp, secondOp, trueOp, result);
+
+            if (!succeeded)
+            {
+                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1BaseType}, {Op2BaseType}, {Op2BaseType}): {method} failed:");
+                TestLibrary.TestFramework.LogInformation($"   maskOp: ({string.Join(", ", maskOp)})");
+                TestLibrary.TestFramework.LogInformation($"  firstOp: ({string.Join(", ", firstOp)})");
+                TestLibrary.TestFramework.LogInformation($" secondOp: ({string.Join(", ", secondOp)})");
+                TestLibrary.TestFramework.LogInformation($"  trueOp: ({string.Join(", ", trueOp)})");
+                TestLibrary.TestFramework.LogInformation($"   result: ({string.Join(", ", result)})");
+                TestLibrary.TestFramework.LogInformation(string.Empty);
+
+                Succeeded = false;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorIndices.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorIndices.template
index f31b9b63bd52d7..094cb1eec218fa 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorIndices.template
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorIndices.template
@@ -562,7 +562,7 @@ namespace JIT.HardwareIntrinsics.Arm
 
         private void ValidateConditionalSelectResult_TrueValue({RetBaseType}[] maskOp, {Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {Op3BaseType}[] thirdOp, {RetBaseType}[] falseOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
         {
-            var succeeded = Helpers.CheckGatherVectorBehavior(maskOp, firstOp, secondOp, thirdOp, falseOp, result);
+            var succeeded = Helpers.CheckGatherVectorConditionalSelectBehavior(maskOp, firstOp, secondOp, thirdOp, falseOp, result);
 
             if (!succeeded)
             {
@@ -600,21 +600,7 @@ namespace JIT.HardwareIntrinsics.Arm
 
         private void ValidateConditionalSelectResult_FalseValue({RetBaseType}[] maskOp, {Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {Op3BaseType}[] thirdOp, {RetBaseType}[] trueOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
         {
-            bool succeeded = true;
-
-            for (var i = 0; i < RetElementCount; i++)
-            {
-                {RetBaseType} gatherResult = ({RetBaseType})(firstOp[i] == 0 ? 0 : ({ExtendedElementType})secondOp[thirdOp[i]]);
-                {RetBaseType} iterResult = (maskOp[i] != 0) ? trueOp[i] : gatherResult;
-                if (maskOp[i] != 0)
-                {
-                    if (iterResult != result[i])
-                    {
-                        succeeded = false;
-                        break;
-                    }
-                }
-            }
+            var succeeded = Helpers.CheckGatherVectorConditionalSelectTrueBehavior(maskOp, firstOp, secondOp, thirdOp, trueOp, result);
 
             if (!succeeded)
             {
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorVectorBases.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorVectorBases.template
index eb5a2b2b65e830..d4bc14542bef4b 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorVectorBases.template
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorVectorBases.template
@@ -462,17 +462,7 @@ namespace JIT.HardwareIntrinsics.Arm
 
         private void ValidateResult({Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
         {
-            bool succeeded = true;
-
-            for (var i = 0; i < RetElementCount; i++)
-            {
-                {RetBaseType} gatherResult = ({RetBaseType})(firstOp[i] == 0 ? 0 : *({ExtendedElementType}*)(secondOp[i]));
-                if (result[i] != gatherResult)
-                {
-                    succeeded = false;
-                    break;
-                }
-            }
+            var succeeded = Helpers.CheckGatherVectorBasesBehavior<{Op1BaseType}, {Op2BaseType}, {ExtendedElementType}>(firstOp, secondOp, result);
 
             if (!succeeded)
             {
@@ -556,18 +546,7 @@ namespace JIT.HardwareIntrinsics.Arm
 
         private void ValidateConditionalSelectResult_TrueValue({RetBaseType}[] maskOp, {Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {RetBaseType}[] falseOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
         {
-            bool succeeded = true;
-
-            for (var i = 0; i < RetElementCount; i++)
-            {
-                {RetBaseType} gatherResult = ({RetBaseType})(firstOp[i] == 0 ? 0 : *({ExtendedElementType}*)(secondOp[i]));
-                {RetBaseType} iterResult = (maskOp[i] != 0) ? gatherResult : falseOp[i];
-                if (iterResult != result[i])
-                {
-                    succeeded = false;
-                    break;
-                }
-            }
+            var succeeded = Helpers.CheckGatherVectorBasesConditionalSelectBehavior<{Op1BaseType}, {Op2BaseType}, {ExtendedElementType}>(maskOp, firstOp, secondOp, falseOp, result);
 
             if (!succeeded)
             {
@@ -602,21 +581,7 @@ namespace JIT.HardwareIntrinsics.Arm
 
         private void ValidateConditionalSelectResult_FalseValue({RetBaseType}[] maskOp, {Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {RetBaseType}[] trueOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
         {
-            bool succeeded = true;
-
-            for (var i = 0; i < RetElementCount; i++)
-            {
-                {RetBaseType} gatherResult = ({RetBaseType})(firstOp[i] == 0 ? 0 : *({ExtendedElementType}*)(secondOp[i]));
-                {RetBaseType} iterResult = (maskOp[i] != 0) ? trueOp[i] : gatherResult;
-                if (maskOp[i] != 0)
-                {
-                    if (iterResult != result[i])
-                    {
-                        succeeded = false;
-                        break;
-                    }
-                }
-            }
+            var succeeded = Helpers.CheckGatherVectorBasesConditionalSelectTrueBehavior<{Op1BaseType}, {Op2BaseType}, {ExtendedElementType}>(maskOp, firstOp, secondOp, trueOp, result);
 
             if (!succeeded)
             {

From d781fdc9e74bcb6a0b6c667108022c67463ff2d0 Mon Sep 17 00:00:00 2001
From: TIHan <lol.tihan@gmail.com>
Date: Tue, 16 Jul 2024 16:11:35 -0700
Subject: [PATCH 18/24] Mark GetFfr methods as side-effectful

---
 src/coreclr/jit/fgdiagnostic.cpp          |  8 ++++++++
 src/coreclr/jit/gentree.cpp               | 16 ++++++++++++++++
 src/coreclr/jit/hwintrinsiclistarm64sve.h | 16 ++++++++--------
 3 files changed, 32 insertions(+), 8 deletions(-)

diff --git a/src/coreclr/jit/fgdiagnostic.cpp b/src/coreclr/jit/fgdiagnostic.cpp
index 322aae30ec500b..067890f3d9b84f 100644
--- a/src/coreclr/jit/fgdiagnostic.cpp
+++ b/src/coreclr/jit/fgdiagnostic.cpp
@@ -3468,6 +3468,14 @@ void Compiler::fgDebugCheckFlags(GenTree* tree, BasicBlock* block)
                     case NI_Sve_GatherPrefetch64Bit:
                     case NI_Sve_GatherPrefetch8Bit:
                     case NI_Sve_SetFfr:
+                    case NI_Sve_GetFfrByte:
+                    case NI_Sve_GetFfrInt16:
+                    case NI_Sve_GetFfrInt32:
+                    case NI_Sve_GetFfrInt64:
+                    case NI_Sve_GetFfrSByte:
+                    case NI_Sve_GetFfrUInt16:
+                    case NI_Sve_GetFfrUInt32:
+                    case NI_Sve_GetFfrUInt64:
                     {
                         assert(tree->OperRequiresCallFlag(this));
                         expectedFlags |= GTF_GLOB_REF;
diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp
index 9aedea5052d6cd..a188f8f85c78dc 100644
--- a/src/coreclr/jit/gentree.cpp
+++ b/src/coreclr/jit/gentree.cpp
@@ -27129,6 +27129,14 @@ bool GenTreeHWIntrinsic::OperRequiresCallFlag() const
             case NI_Sve_GatherPrefetch64Bit:
             case NI_Sve_GatherPrefetch8Bit:
             case NI_Sve_SetFfr:
+            case NI_Sve_GetFfrByte:
+            case NI_Sve_GetFfrInt16:
+            case NI_Sve_GetFfrInt32:
+            case NI_Sve_GetFfrInt64:
+            case NI_Sve_GetFfrSByte:
+            case NI_Sve_GetFfrUInt16:
+            case NI_Sve_GetFfrUInt32:
+            case NI_Sve_GetFfrUInt64:
             {
                 return true;
             }
@@ -27320,6 +27328,14 @@ void GenTreeHWIntrinsic::Initialize(NamedIntrinsic intrinsicId)
             case NI_Sve_GatherPrefetch64Bit:
             case NI_Sve_GatherPrefetch8Bit:
             case NI_Sve_SetFfr:
+            case NI_Sve_GetFfrByte:
+            case NI_Sve_GetFfrInt16:
+            case NI_Sve_GetFfrInt32:
+            case NI_Sve_GetFfrInt64:
+            case NI_Sve_GetFfrSByte:
+            case NI_Sve_GetFfrUInt16:
+            case NI_Sve_GetFfrUInt32:
+            case NI_Sve_GetFfrUInt64:
             {
                 // Mark as a call and global reference, much as is done for GT_KEEPALIVE
                 gtFlags |= (GTF_CALL | GTF_GLOB_REF);
diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h
index b7420689beb457..80198445588384 100644
--- a/src/coreclr/jit/hwintrinsiclistarm64sve.h
+++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h
@@ -118,14 +118,14 @@ HARDWARE_INTRINSIC(Sve,           GatherVectorUInt32WithByteOffsetsZeroExtend,
 HARDWARE_INTRINSIC(Sve,           GatherVectorUInt32ZeroExtend,                                     -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1w,       INS_sve_ld1w,       INS_sve_ld1w,       INS_sve_ld1w,       INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GatherVectorWithByteOffsets,                                      -1,      3,      true,  {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1w,       INS_sve_ld1w,       INS_sve_ld1d,       INS_sve_ld1d,       INS_sve_ld1w,       INS_sve_ld1d},    HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GetActiveElementCount,                                            -1,      2,      true,  {INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp},    HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_ExplicitMaskedOperation)
-HARDWARE_INTRINSIC(Sve,           GetFfrByte,                                                       -1,      0,      false, {INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
-HARDWARE_INTRINSIC(Sve,           GetFfrInt16,                                                      -1,      0,      false, {INS_invalid,        INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
-HARDWARE_INTRINSIC(Sve,           GetFfrInt32,                                                      -1,      0,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
-HARDWARE_INTRINSIC(Sve,           GetFfrInt64,                                                      -1,      0,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
-HARDWARE_INTRINSIC(Sve,           GetFfrSByte,                                                      -1,      0,      false, {INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
-HARDWARE_INTRINSIC(Sve,           GetFfrUInt16,                                                     -1,      0,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
-HARDWARE_INTRINSIC(Sve,           GetFfrUInt32,                                                     -1,      0,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
-HARDWARE_INTRINSIC(Sve,           GetFfrUInt64,                                                     -1,      0,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
+HARDWARE_INTRINSIC(Sve,           GetFfrByte,                                                       -1,      0,      false, {INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask|HW_Flag_SpecialSideEffectMask)
+HARDWARE_INTRINSIC(Sve,           GetFfrInt16,                                                      -1,      0,      false, {INS_invalid,        INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask|HW_Flag_SpecialSideEffectMask)
+HARDWARE_INTRINSIC(Sve,           GetFfrInt32,                                                      -1,      0,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask|HW_Flag_SpecialSideEffectMask)
+HARDWARE_INTRINSIC(Sve,           GetFfrInt64,                                                      -1,      0,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask|HW_Flag_SpecialSideEffectMask)
+HARDWARE_INTRINSIC(Sve,           GetFfrSByte,                                                      -1,      0,      false, {INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask|HW_Flag_SpecialSideEffectMask)
+HARDWARE_INTRINSIC(Sve,           GetFfrUInt16,                                                     -1,      0,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask|HW_Flag_SpecialSideEffectMask)
+HARDWARE_INTRINSIC(Sve,           GetFfrUInt32,                                                     -1,      0,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask|HW_Flag_SpecialSideEffectMask)
+HARDWARE_INTRINSIC(Sve,           GetFfrUInt64,                                                     -1,      0,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask|HW_Flag_SpecialSideEffectMask)
 HARDWARE_INTRINSIC(Sve,           InsertIntoShiftedVector,                                          -1,      2,      true,  {INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr,       INS_sve_insr},    HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_HasRMWSemantics)
 HARDWARE_INTRINSIC(Sve,           LeadingSignCount,                                                 -1,     -1,      false, {INS_sve_cls,        INS_invalid,        INS_sve_cls,        INS_invalid,        INS_sve_cls,        INS_invalid,        INS_sve_cls,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           LeadingZeroCount,                                                 -1,     -1,      false, {INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_sve_clz,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)

From a73fe353b283d8deaf2c6b5070b22e0c5c34c387 Mon Sep 17 00:00:00 2001
From: TIHan <lol.tihan@gmail.com>
Date: Fri, 19 Jul 2024 16:38:04 -0700
Subject: [PATCH 19/24] Verifying expected fault result. Test weaks.

---
 .../GenerateHWIntrinsicTests_Arm.cs           |  18 +--
 .../HardwareIntrinsics/Arm/Shared/Helpers.cs  | 122 +++++++++++++++++-
 ...eGatherVectorFirstFaultingIndices.template |  45 +++++--
 ...herVectorFirstFaultingVectorBases.template |  82 ++++++++++++
 .../SveLoadVectorFirstFaultingTest.template   |   8 +-
 5 files changed, 248 insertions(+), 27 deletions(-)

diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
index 50b052a2fd5c69..0ba683a3e691a9 100644
--- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
+++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
@@ -3616,20 +3616,20 @@
     ("SveGatherVectorIndices.template",    new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorUInt32ZeroExtend_Indices_ulong_ulong",                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorUInt32ZeroExtend",                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",        ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
     ("SveGatherVectorIndices.template",    new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorUInt32ZeroExtend_Indices_uint_uint",                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorUInt32ZeroExtend",                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "UInt32", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",        ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
 
-    ("SveGatherVectorFirstFaultingVectorBases.template",            new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorFirstFaulting_Bases_double_ulong",                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double", ["Op2VectorType"] = "Vector",    ["Op2BaseType"] = "UInt64",                                                              ["ExtendedElementType"] = "Double", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",        ["NextValueBase"] = "TestLibrary.Generator.GetDouble()"}),
-    ("SveGatherVectorFirstFaultingVectorBases.template",            new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorFirstFaulting_Bases_long_ulong",                                                     ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",  ["Op2VectorType"] = "Vector",    ["Op2BaseType"] = "UInt64",                                                              ["ExtendedElementType"] = "Int64",  ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",        ["NextValueBase"] = "TestLibrary.Generator.GetInt64()"}),
-    ("SveGatherVectorFirstFaultingVectorBases.template",            new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorFirstFaulting_Bases_ulong_ulong",                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector",    ["Op2BaseType"] = "UInt64",                                                              ["ExtendedElementType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",        ["NextValueBase"] = "TestLibrary.Generator.GetUInt64()"}),
+    ("SveGatherVectorFirstFaultingVectorBases.template",            new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorFirstFaulting_Bases_double_ulong",                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double", ["Op2VectorType"] = "Vector",    ["Op2BaseType"] = "UInt64",                                                              ["ExtendedElementType"] = "Double", ["GetFfrType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",        ["NextValueBase"] = "TestLibrary.Generator.GetDouble()"}),
+    ("SveGatherVectorFirstFaultingVectorBases.template",            new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorFirstFaulting_Bases_long_ulong",                                                     ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",  ["Op2VectorType"] = "Vector",    ["Op2BaseType"] = "UInt64",                                                              ["ExtendedElementType"] = "Int64",  ["GetFfrType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",        ["NextValueBase"] = "TestLibrary.Generator.GetInt64()"}),
+    ("SveGatherVectorFirstFaultingVectorBases.template",            new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorFirstFaulting_Bases_ulong_ulong",                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64", ["Op2VectorType"] = "Vector",    ["Op2BaseType"] = "UInt64",                                                              ["ExtendedElementType"] = "UInt64", ["GetFfrType"] = "UInt64", ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",        ["NextValueBase"] = "TestLibrary.Generator.GetUInt64()"}),
     
-    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_float_int",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Single",   ["GetFfrType"] = "Byte",        ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_float_int",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Single",   ["GetFfrType"] = "UInt32",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
     ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_int_int",                                                                      ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Int32",    ["GetFfrType"] = "Int32",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
     ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_uint_int",                                                                     ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "UInt32",   ["GetFfrType"] = "UInt32",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
-    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_float_uint",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "Single",   ["GetFfrType"] = "Byte",        ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_float_uint",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "Single",   ["GetFfrType"] = "UInt32",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
     ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_int_uint",                                                                     ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "Int32",    ["GetFfrType"] = "Int32",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
     ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_uint_uint",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32", ["ExtendedElementType"] = "UInt32",   ["GetFfrType"] = "UInt32",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
-    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_double_long",                                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",  ["ExtendedElementType"] = "Double",   ["GetFfrType"] = "Byte",        ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_double_long",                                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",  ["ExtendedElementType"] = "Double",   ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
     ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_long_long",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",  ["ExtendedElementType"] = "Int64",    ["GetFfrType"] = "Int64",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
     ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_ulong_long",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",  ["ExtendedElementType"] = "UInt64",   ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
-    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_double_ulong",                                                                 ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "Double",   ["GetFfrType"] = "Byte",        ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
+    ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_double_ulong",                                                                 ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "Double",   ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
     ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_long_ulong",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "Int64",    ["GetFfrType"] = "Int64",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
     ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_ulong_ulong",                                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "UInt64",   ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
 
@@ -3692,8 +3692,8 @@
     ("SveLoadNonFaultingUnOpTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorNonFaulting_uint",                                                                                    ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorNonFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp1"] = "TestLibrary.Generator.GetUInt32()",     ["Cast"] = "(uint*)",                                                                                    ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
     ("SveLoadNonFaultingUnOpTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorNonFaulting_ulong",                                                                                   ["Isa"] = "Sve",                                    ["Method"] = "LoadVectorNonFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64",                                                              ["LargestVectorSize"] = "64",                                                                ["NextValueOp1"] = "TestLibrary.Generator.GetUInt64()",     ["Cast"] = "(ulong*)",                                                                                   ["ValidateIterResult"] = "firstOp[i] != result[i]"}),
 
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_float",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Single",                ["GetFfrType"] = "Byte",                                                ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()"}),
-    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_double",                                                                                  ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Double",                ["GetFfrType"] = "Byte",                                                ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_float",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Single",                ["GetFfrType"] = "UInt32",                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetSingle()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()"}),
+    ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_double",                                                                                  ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",        ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Double",                ["GetFfrType"] = "UInt64",                                              ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetDouble()",                                 ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()"}),
     ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_sbyte",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "SByte",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "SByte",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "SByte",                 ["GetFfrType"] = "SByte",                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetSByte()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetSByte()"}),
     ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_short",                                                                                   ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int16",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int16",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int16",                 ["GetFfrType"] = "Int16",                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetInt16()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetInt16()"}),
     ("SveLoadVectorFirstFaultingTest.template",    new Dictionary<string, string> { ["TestName"] = "Sve_LoadVectorFirstFaulting_int",                                                                                     ["Isa"] = "Sve",      ["LoadIsa"] = "Sve",                              ["Method"] = "LoadVectorFirstFaulting",                                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",         ["Op2VectorType"] = "Vector",                          ["Op2BaseType"] = "Int32",                 ["GetFfrType"] = "Int32",                                               ["LargestVectorSize"] = "64",                               ["NextValueOp1"] = "TestLibrary.Generator.GetInt32()",                                  ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()"}),
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
index a4a57bc9e89b0a..0f547a235b38ab 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
@@ -8248,7 +8248,9 @@ public static bool CheckGatherVectorBasesConditionalSelectTrueBehavior<T, Addres
             return CheckGatherVectorBasesBehaviorCore<T, AddressT, ExtendedElementT>(mask, data, result, (i, gatherResult) => ConditionalSelectTrueResult(cndSelMask[i], gatherResult, cndSelTrue[i]));
         }
 
-        private static bool CheckFirstFaultingBehaviorCore<T>(T[] result, Vector<T> faultResult, Func<int, bool> checkIter) where T : INumberBase<T>
+        private static bool CheckFirstFaultingBehaviorCore<T, TFault>(T[] result, Vector<TFault> faultResult, Func<int, bool> checkIter) 
+                where T : INumberBase<T>
+                where TFault : INumberBase<TFault>
         {
             bool hitFault = false;
 
@@ -8256,14 +8258,14 @@ private static bool CheckFirstFaultingBehaviorCore<T>(T[] result, Vector<T> faul
             {
                 if (hitFault)
                 {
-                    if (faultResult[i] != T.Zero)
+                    if (faultResult[i] != TFault.Zero)
                     {
                         return false;
                     }
                 }
                 else
                 {
-                    if (faultResult[i] == T.Zero)
+                    if (faultResult[i] == TFault.Zero)
                     {
                         // There has to be a valid value for the first element, so check it.
                         if (i == 0)
@@ -8285,24 +8287,132 @@ private static bool CheckFirstFaultingBehaviorCore<T>(T[] result, Vector<T> faul
             return true;
         }
 
-        public static bool CheckLoadVectorFirstFaultingBehavior<T>(T[] firstOp, T[] result, Vector<T> faultResult) where T : INumberBase<T>
+        private static bool CheckFaultResultHasAtLeastOneZero<T>(Vector<T> faultResult) where T : INumberBase<T>
+        {
+            for (var i = 0; i < Vector<T>.Count; i++)
+            {
+                if (faultResult[i] == T.Zero)
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        public static bool CheckLoadVectorFirstFaultingBehavior<T, TFault>(T[] firstOp, T[] result, Vector<TFault> faultResult) 
+                where T : INumberBase<T> 
+                where TFault : INumberBase<TFault>
         {
+            // Checking first faulting behavior requires at least one zero to ensure we are testing the behavior.
+            if (!CheckFaultResultHasAtLeastOneZero(faultResult))
+            {
+                TestLibrary.TestFramework.LogInformation("Fault result requires at least one zero.");
+                return false;
+            }
+
+            var validElementCount = firstOp.Length;
+            var expectedFaultResult = 
+                InitVector<TFault>(i =>
+                {
+                    if (i < validElementCount)
+                    {
+                        return TFault.One;
+                    }
+                    return TFault.Zero;
+                });
+            if (expectedFaultResult != faultResult)
+            {
+                TestLibrary.TestFramework.LogInformation($"Expected fault result: {expectedFaultResult}\nActual fault result: {faultResult}");
+                return false;
+            }
+
             return CheckFirstFaultingBehaviorCore(result, faultResult, i => firstOp[i] == result[i]);
         }
 
-        public static bool CheckGatherVectorFirstFaultingBehavior<T, ExtendedElementT, Index>(T[] mask, ExtendedElementT[] data, Index[] indices, T[] result, Vector<T> faultResult)
+        public static bool CheckGatherVectorFirstFaultingBehavior<T, ExtendedElementT, Index, TFault>(T[] mask, ExtendedElementT[] data, Index[] indices, T[] result, Vector<TFault> faultResult)
                 where T : INumberBase<T> 
                 where ExtendedElementT : INumberBase<ExtendedElementT> 
                 where Index : IBinaryInteger<Index>
+                where TFault : INumberBase<TFault>
         {
+            // Checking first faulting behavior requires at least one zero to ensure we are testing the behavior.
+            if (!CheckFaultResultHasAtLeastOneZero(faultResult))
+            {
+                TestLibrary.TestFramework.LogInformation("Fault result requires at least one zero.");
+                return false;
+            }
+
+            var hasFaulted = false;
+            var expectedFaultResult = 
+                InitVector<TFault>(i =>
+                {
+                    if (hasFaulted)
+                    {
+                        return TFault.Zero;
+                    }
+
+                    if (mask[i] == T.Zero)
+                    {
+                        return TFault.One;
+                    }
+
+                    var index = int.CreateChecked(indices[i]);
+                    if (index < 0 || index >= data.Length)
+                    {
+                        hasFaulted = true;
+                        return TFault.Zero;
+                    }
+                    return TFault.One;
+                });
+            if (expectedFaultResult != faultResult)
+            {
+                TestLibrary.TestFramework.LogInformation($"Expected fault result: {expectedFaultResult}\nActual fault result: {faultResult}");
+                return false;
+            }
+
             return CheckFirstFaultingBehaviorCore(result, faultResult, i => GetGatherVectorResultByIndex(i, mask, data, indices) == result[i]);
         }
 
-        public static bool CheckGatherVectorBasesFirstFaultingBehavior<T, AddressT, ExtendedElementT>(T[] mask, AddressT[] data, T[] result, Vector<T> faultResult)
+        public static bool CheckGatherVectorBasesFirstFaultingBehavior<T, AddressT, ExtendedElementT, TFault>(T[] mask, AddressT[] data, T[] result, Vector<TFault> faultResult)
                 where T : INumberBase<T> 
                 where AddressT : unmanaged, INumberBase<AddressT>
                 where ExtendedElementT : unmanaged, INumberBase<ExtendedElementT> 
+                where TFault : INumberBase<TFault>
         {
+            // Checking first faulting behavior requires at least one zero to ensure we are testing the behavior.
+            if (!CheckFaultResultHasAtLeastOneZero(faultResult))
+            {
+                TestLibrary.TestFramework.LogInformation("Fault result requires at least one zero.");
+                return false;
+            }
+
+            var hasFaulted = false;
+            var expectedFaultResult = 
+                InitVector<TFault>(i =>
+                {
+                    if (hasFaulted)
+                    {
+                        return TFault.Zero;
+                    }
+                    
+                    if (mask[i] == T.Zero)
+                    {
+                        return TFault.One;
+                    }
+
+                    if (data[i] == AddressT.Zero)
+                    {
+                        hasFaulted = true;
+                        return TFault.Zero;
+                    }
+                    return TFault.One;
+                });
+            if (expectedFaultResult != faultResult)
+            {
+                TestLibrary.TestFramework.LogInformation($"Expected fault result: {expectedFaultResult}\nActual fault result: {faultResult}");
+                return false;
+            }
+
             return CheckFirstFaultingBehaviorCore(result, faultResult, i => GetGatherVectorBasesResultByIndex<T, AddressT, ExtendedElementT>(i, mask, data) == result[i]);
         }
         
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingIndices.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingIndices.template
index c45dfc62d86d25..f06ff9f2e2e6d6 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingIndices.template
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingIndices.template
@@ -286,18 +286,44 @@ namespace JIT.HardwareIntrinsics.Arm
             ref var op2Ref = ref (_dataTable.inBounded.Span.GetPinnableReference());
             var op3 = {LoadIsa}.Load{Op3VectorType}(loadMask3, ({Op3BaseType}*)(_dataTable.inArray3Ptr));
 
+            // We know this is outside the bounds because 'inBounded' will never be the full size of a Vector<T>.
+            var outsideBoundsIndex = ({Op3BaseType})(Vector<{Op2BaseType}>.Count - 1);
+
             // When testing first-faulting behavior, we need to make sure we can get the first element.
             // So set the first active element of the index vector to 0.
+            var firstActiveElement = -1;
             for (var i = 0; i < Vector<{Op3BaseType}>.Count; i++)
             {
                 // op1 is the mask for GatherVector.
                 if (op1[i] != 0)
                 {
-                    op3 = op3.WithElement<{Op3BaseType}>(i, 0);
-                    break;
+                    if (firstActiveElement == -1)
+                    {
+                        op3 = op3.WithElement<{Op3BaseType}>(i, 0);
+                        firstActiveElement = i;
+                    }
+                    else if (op3[i] < 0 || op3[i] > outsideBoundsIndex)
+                    {
+                        op3 = op3.WithElement<{Op3BaseType}>(i, outsideBoundsIndex);
+                    }
                 }
             }
 
+            // Force at least one element to cause a fault (required for testing). So set the last element to an index outside the bounds.
+            var lastIndex = Vector<{Op3BaseType}>.Count - 1;
+
+            // Ensure we at least have one element that we can read.
+            if ((firstActiveElement == -1) || (firstActiveElement == lastIndex))
+            {
+                op1 = op1.WithElement<{Op1BaseType}>(0, 1);
+                op3 = op3.WithElement<{Op3BaseType}>(0, 0);
+            }
+
+            op1 = op1.WithElement<{Op1BaseType}>(lastIndex, 1);
+
+            // Force an index outside the bounds.
+            op3 = op3.WithElement<{Op3BaseType}>(lastIndex, outsideBoundsIndex);
+
             Sve.SetFfr(Sve.CreateTrueMaskByte(SveMaskPattern.All));
             var result = {Isa}.{Method}(
                 op1,
@@ -306,10 +332,11 @@ namespace JIT.HardwareIntrinsics.Arm
             );
             var faultResult = Sve.GetFfr{GetFfrType}();
 
+            ref var op1Ref = ref op1;
             ref var op3Ref = ref op3;
 
             Unsafe.Write(_dataTable.outArrayPtr, result);
-            ValidateFirstFaultingResult(_dataTable.inArray1Ptr, ref op2Ref, _dataTable.inBounded.Span.Length, Unsafe.AsPointer(ref op3Ref), _dataTable.outArrayPtr, faultResult.As<{GetFfrType}, {RetBaseType}>());
+            ValidateFirstFaultingResult(Unsafe.AsPointer(ref op1Ref), ref op2Ref, _dataTable.inBounded.Span.Length, Unsafe.AsPointer(ref op3Ref), _dataTable.outArrayPtr, faultResult);
         }
 
         public void RunBasicScenario_FalseMask()
@@ -599,22 +626,22 @@ namespace JIT.HardwareIntrinsics.Arm
             }
         }
         
-        private void ValidateFirstFaultingResult(void* op1, ref byte op2, int op2Size, void* op3, void* result, Vector<{RetBaseType}> faultResult, [CallerMemberName] string method = "")
+        private void ValidateFirstFaultingResult(void* op1, ref byte op2, int op2Size, void* op3, void* result, Vector<{GetFfrType}> faultResult, [CallerMemberName] string method = "")
         {
-            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount];
+            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Vector<{Op1BaseType}>.Count];
             {Op2BaseType}[] inArray2 = new {Op2BaseType}[op2Size / Unsafe.SizeOf<{Op2BaseType}>()];
-            {Op3BaseType}[] inArray3 = new {Op3BaseType}[Op3ElementCount];
+            {Op3BaseType}[] inArray3 = new {Op3BaseType}[Vector<{Op3BaseType}>.Count];
             {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
 
-            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), ref Unsafe.AsRef<byte>(op1), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), ref Unsafe.AsRef<byte>(op1), (uint)(inArray1.Length * Unsafe.SizeOf<{Op1BaseType}>()));
             Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), ref op2, (uint)(inArray2.Length * Unsafe.SizeOf<{Op2BaseType}>()));
-            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op3BaseType}, byte>(ref inArray3[0]), ref Unsafe.AsRef<byte>(op3), (uint)Unsafe.SizeOf<{Op3VectorType}<{Op3BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op3BaseType}, byte>(ref inArray3[0]), ref Unsafe.AsRef<byte>(op3), (uint)(inArray3.Length * Unsafe.SizeOf<{Op3BaseType}>()));
             Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
         
             ValidateFirstFaultingResult(inArray1, inArray2, inArray3, outArray, faultResult, method);
         }
 
-        private void ValidateFirstFaultingResult({Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {Op3BaseType}[] thirdOp, {RetBaseType}[] result, Vector<{RetBaseType}> faultResult, [CallerMemberName] string method = "")
+        private void ValidateFirstFaultingResult({Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {Op3BaseType}[] thirdOp, {RetBaseType}[] result, Vector<{GetFfrType}> faultResult, [CallerMemberName] string method = "")
         {
             var succeeded = Helpers.CheckGatherVectorFirstFaultingBehavior(firstOp, secondOp, thirdOp, result, faultResult);
 
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingVectorBases.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingVectorBases.template
index d4bc14542bef4b..5ba9b48264f1f5 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingVectorBases.template
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorFirstFaultingVectorBases.template
@@ -9,6 +9,7 @@
  ******************************************************************************/
 
 using System;
+using System.Buffers;
 using System.Numerics;
 using System.Reflection;
 using System.Runtime.CompilerServices;
@@ -34,6 +35,9 @@ namespace JIT.HardwareIntrinsics.Arm
                 // Validates basic functionality works
                 test.RunBasicScenario_Load();
 
+                // Validates basic functionality of first-faulting behavior
+                test.RunBasicScenario_LoadFirstFaulting();
+
                 // Validates fully masked out load works.
                 test.RunBasicScenario_FalseMask();
 
@@ -90,11 +94,13 @@ namespace JIT.HardwareIntrinsics.Arm
         {
             private byte[] inArray1;
             private byte[] inArray2;
+            private byte[] inArray2Ffr;
             private byte[] baseArray;
             private byte[] outArray;
 
             private GCHandle inHandle1;
             private GCHandle inHandle2;
+            private GCHandle inHandle2Ffr;
             private GCHandle baseHandle;
             private GCHandle outHandle;
 
@@ -114,11 +120,13 @@ namespace JIT.HardwareIntrinsics.Arm
 
                 this.inArray1 = new byte[alignment * 2];
                 this.inArray2 = new byte[alignment * 2];
+                this.inArray2Ffr = new byte[alignment * 2];
                 this.baseArray = new byte[alignment + sizeOfBaseArray];
                 this.outArray = new byte[alignment * 2];
 
                 this.inHandle1 = GCHandle.Alloc(this.inArray1, GCHandleType.Pinned);
                 this.inHandle2 = GCHandle.Alloc(this.inArray2, GCHandleType.Pinned);
+                this.inHandle2Ffr = GCHandle.Alloc(this.inArray2Ffr, GCHandleType.Pinned);
                 this.baseHandle = GCHandle.Alloc(this.baseArray, GCHandleType.Pinned);
                 this.outHandle = GCHandle.Alloc(this.outArray, GCHandleType.Pinned);
 
@@ -127,13 +135,34 @@ namespace JIT.HardwareIntrinsics.Arm
                 Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(inArray1Ptr), ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), (uint)sizeOfinArray1);
                 Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(baseArrayPtr), ref Unsafe.As<{RetBaseType}, byte>(ref baseArray[0]), (uint)sizeOfBaseArray);
 
+                var inArray2Ffr = new {Op2BaseType}[inArray2.Length];
+                inArray2.CopyTo(inArray2Ffr, 0);
+
                 // Add the base pointer to the offsets within inArray2 to create complete pointers.
                 for (var i = 0; i < inArray2.Length; i++) { inArray2[i] += ({Op2BaseType})baseArrayPtr; }
                 Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(inArray2Ptr), ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), (uint)sizeOfinArray2);
+
+                // Add the base pointer to the offsets within inArray2Ffr to create complete pointers.
+                var random = new Random();
+                for (var i = 0; i < inArray2Ffr.Length; i++) 
+                {
+                    // In order to test the first-faulting behavior, we need to put in null pointers after the first active element (element 0).
+                    // We will always cause a fault on the last element for testing.
+                    if (((i != 0) && (random.Next() % 2) == 0) || (i == (inArray2Ffr.Length - 1)))
+                    {
+                        inArray2Ffr[i] = default; // nullptr
+                    }
+                    else
+                    {
+                        inArray2Ffr[i] += ({Op2BaseType})baseArrayPtr;
+                    }
+                }
+                Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(inArray2FfrPtr), ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2Ffr[0]), (uint)sizeOfinArray2);
             }
 
             public void* inArray1Ptr => Align((byte*)(inHandle1.AddrOfPinnedObject().ToPointer()), alignment);
             public void* inArray2Ptr => Align((byte*)(inHandle2.AddrOfPinnedObject().ToPointer()), alignment);
+            public void* inArray2FfrPtr => Align((byte*)(inHandle2Ffr.AddrOfPinnedObject().ToPointer()), alignment);
             public void* baseArrayPtr => Align((byte*)(baseHandle.AddrOfPinnedObject().ToPointer()), alignment);
             public void* outArrayPtr => Align((byte*)(outHandle.AddrOfPinnedObject().ToPointer()), alignment);
 
@@ -141,6 +170,7 @@ namespace JIT.HardwareIntrinsics.Arm
             {
                 inHandle1.Free();
                 inHandle2.Free();
+                inHandle2Ffr.Free();
                 baseHandle.Free();
                 outHandle.Free();
             }
@@ -265,6 +295,28 @@ namespace JIT.HardwareIntrinsics.Arm
             ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
         }
 
+        public void RunBasicScenario_LoadFirstFaulting()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_LoadFirstFaulting));
+
+            {Op1VectorType}<{Op1BaseType}> loadMask1 = Sve.CreateTrueMask{Op1BaseType}(SveMaskPattern.All);
+            {Op2VectorType}<{Op2BaseType}> loadMask2 = Sve.CreateTrueMask{Op2BaseType}(SveMaskPattern.All);
+
+            var op1 = {LoadIsa}.Load{Op1VectorType}(loadMask1, ({Op1BaseType}*)(_dataTable.inArray1Ptr));
+            var op2 = {LoadIsa}.Load{Op2VectorType}(loadMask2, ({Op2BaseType}*)(_dataTable.inArray2FfrPtr));
+
+            // Force op1 (mask) to have the first and last element to be active.
+            op1 = op1.WithElement<{Op1BaseType}>(0, 1).WithElement<{Op1BaseType}>(Vector<{Op1BaseType}>.Count - 1, 1);
+
+            Sve.SetFfr(Sve.CreateTrueMaskByte(SveMaskPattern.All));
+            var result = {Isa}.{Method}(op1, op2);
+            var faultResult = Sve.GetFfr{GetFfrType}();
+
+            ref var op1Ref = ref op1;
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateFirstFaultingResult(Unsafe.AsPointer(ref op1Ref), _dataTable.inArray2FfrPtr, _dataTable.outArrayPtr, faultResult);
+        }
 
         public void RunBasicScenario_FalseMask()
         {
@@ -596,5 +648,35 @@ namespace JIT.HardwareIntrinsics.Arm
                 Succeeded = false;
             }
         }
+
+        private void ValidateFirstFaultingResult(void* op1, void* op2, void* result, Vector<{GetFfrType}> faultResult, [CallerMemberName] string method = "")
+        {
+            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount];
+            {Op2BaseType}[] inArray2 = new {Op2BaseType}[Op2ElementCount];
+            {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), ref Unsafe.AsRef<byte>(op1), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), ref Unsafe.AsRef<byte>(op2), (uint)Unsafe.SizeOf<{Op2VectorType}<{Op2BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+        
+            ValidateFirstFaultingResult(inArray1, inArray2, outArray, faultResult, method);
+        }
+
+        private void ValidateFirstFaultingResult({Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {RetBaseType}[] result, Vector<{GetFfrType}> faultResult, [CallerMemberName] string method = "")
+        {
+            var succeeded = Helpers.CheckGatherVectorBasesFirstFaultingBehavior<{Op1BaseType}, {Op2BaseType}, {ExtendedElementType}, {GetFfrType}>(firstOp, secondOp, result, faultResult);
+
+            if (!succeeded)
+            {
+                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1BaseType}, {Op2BaseType}): {method} failed:");
+                TestLibrary.TestFramework.LogInformation($"       firstOp: ({string.Join(", ", firstOp)})");
+                TestLibrary.TestFramework.LogInformation($"      secondOp: ({string.Join(", ", secondOp)})");
+                TestLibrary.TestFramework.LogInformation($"        result: ({string.Join(", ", result)})");
+                TestLibrary.TestFramework.LogInformation($"   faultResult: ({faultResult})");
+                TestLibrary.TestFramework.LogInformation(string.Empty);
+
+                Succeeded = false;
+            }
+        }
     }
 }
\ No newline at end of file
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
index 4e7cb213d63d14..c0e489d1389500 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveLoadVectorFirstFaultingTest.template
@@ -31,6 +31,8 @@ namespace JIT.HardwareIntrinsics.Arm
             {
                 // Validates basic functionality works
                 test.RunBasicScenario_Load();
+
+                // Validates basic functionality of first-faulting behavior
                 test.RunBasicScenario_LoadFirstFaulting();
 
                 // Validates calling via reflection works
@@ -205,7 +207,7 @@ namespace JIT.HardwareIntrinsics.Arm
             var faultResult = Sve.GetFfr{GetFfrType}();
 
             Unsafe.Write(_dataTable.outArrayPtr, result);
-            ValidateFirstFaultingResult(ref op2Ref, _dataTable.inBounded.Span.Length, _dataTable.outArrayPtr, faultResult.As<{GetFfrType}, {RetBaseType}>());
+            ValidateFirstFaultingResult(ref op2Ref, _dataTable.inBounded.Span.Length, _dataTable.outArrayPtr, faultResult);
         }
 
         public void RunReflectionScenario_Load()
@@ -352,7 +354,7 @@ namespace JIT.HardwareIntrinsics.Arm
             }
         }
 
-        private void ValidateFirstFaultingResult(ref byte firstOp, int size, void* result, Vector<{RetBaseType}> faultResult, [CallerMemberName] string method = "")
+        private void ValidateFirstFaultingResult(ref byte firstOp, int size, void* result, Vector<{GetFfrType}> faultResult, [CallerMemberName] string method = "")
         {
             {Op2BaseType}[] inArray = new {Op2BaseType}[size / Unsafe.SizeOf<{Op2BaseType}>()];
             {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
@@ -363,7 +365,7 @@ namespace JIT.HardwareIntrinsics.Arm
             ValidateFirstFaultingResult(inArray, outArray, faultResult, method);
         }
 
-        private void ValidateFirstFaultingResult({Op2BaseType}[] firstOp, {RetBaseType}[] result, Vector<{RetBaseType}> faultResult, [CallerMemberName] string method = "")
+        private void ValidateFirstFaultingResult({Op2BaseType}[] firstOp, {RetBaseType}[] result, Vector<{GetFfrType}> faultResult, [CallerMemberName] string method = "")
         {
             var succeeded = Helpers.CheckLoadVectorFirstFaultingBehavior(firstOp, result, faultResult);
 

From ad5ec2e23cbdf7de0d30d8d3dc47263dbb09432f Mon Sep 17 00:00:00 2001
From: TIHan <lol.tihan@gmail.com>
Date: Fri, 19 Jul 2024 17:18:07 -0700
Subject: [PATCH 20/24] Fix build

---
 .../System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs
index 819021d8fd7932..235abf9affcf77 100644
--- a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs
+++ b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs
@@ -5531,7 +5531,7 @@ internal Arm64() { }
         public static unsafe void SetFfr(System.Numerics.Vector<sbyte> value) { throw null; }
         public static unsafe void SetFfr(System.Numerics.Vector<ushort> value) { throw null; }
         public static unsafe void SetFfr(System.Numerics.Vector<uint> value) { throw null; }
-        public static unsafe void SetFfr(System.Numerics.Vector<ulong> value) { throw null; 
+        public static unsafe void SetFfr(System.Numerics.Vector<ulong> value) { throw null; }
 
         public static System.Numerics.Vector<byte> ShiftLeftLogical(System.Numerics.Vector<byte> left, System.Numerics.Vector<byte> right) { throw null; }
         public static System.Numerics.Vector<byte> ShiftLeftLogical(System.Numerics.Vector<byte> left, System.Numerics.Vector<ulong> right) { throw null; }

From a8919e32d34fec766eabd42e4b8b31dcc4ba5e9d Mon Sep 17 00:00:00 2001
From: "Aman Khalid (from Dev Box)" <amankhalid@microsoft.com>
Date: Mon, 22 Jul 2024 14:16:53 -0400
Subject: [PATCH 21/24] Add GatherVectorWithByteOffsetFirstFaulting

---
 src/coreclr/jit/gentree.cpp                   |   1 +
 src/coreclr/jit/hwintrinsic.cpp               |   1 +
 src/coreclr/jit/hwintrinsiccodegenarm64.cpp   |   1 +
 src/coreclr/jit/hwintrinsiclistarm64sve.h     |   1 +
 src/coreclr/jit/lsraarm64.cpp                 |   1 +
 .../Arm/Sve.PlatformNotSupported.cs           |  75 ++
 .../src/System/Runtime/Intrinsics/Arm/Sve.cs  |  75 ++
 .../ref/System.Runtime.Intrinsics.cs          |  13 +
 .../GenerateHWIntrinsicTests_Arm.cs           |  13 +
 .../HardwareIntrinsics/Arm/Shared/Helpers.cs  |   1 +
 ...therVectorByteOffsetFirstFaulting.template | 737 ++++++++++++++++++
 11 files changed, 919 insertions(+)
 create mode 100644 src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorByteOffsetFirstFaulting.template

diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp
index a0f0938feba51a..36d7fdd0e11b1a 100644
--- a/src/coreclr/jit/gentree.cpp
+++ b/src/coreclr/jit/gentree.cpp
@@ -26548,6 +26548,7 @@ bool GenTreeHWIntrinsic::OperIsMemoryLoad(GenTree** pAddr) const
                 break;
 
             case NI_Sve_GatherVectorWithByteOffsets:
+            case NI_Sve_GatherVectorWithByteOffsetFirstFaulting:
             case NI_Sve_LoadVector:
             case NI_Sve_LoadVectorNonTemporal:
             case NI_Sve_LoadVector128AndReplicateToVector:
diff --git a/src/coreclr/jit/hwintrinsic.cpp b/src/coreclr/jit/hwintrinsic.cpp
index 0541962fa78aaf..5dae442a8fd0f3 100644
--- a/src/coreclr/jit/hwintrinsic.cpp
+++ b/src/coreclr/jit/hwintrinsic.cpp
@@ -2228,6 +2228,7 @@ GenTree* Compiler::impHWIntrinsic(NamedIntrinsic        intrinsic,
                     case NI_Sve_GatherVectorUInt32WithByteOffsetsZeroExtend:
                     case NI_Sve_GatherVectorUInt32ZeroExtend:
                     case NI_Sve_GatherVectorWithByteOffsets:
+                    case NI_Sve_GatherVectorWithByteOffsetFirstFaulting:
                         assert(varTypeIsSIMD(op3->TypeGet()));
                         if (numArgs == 3)
                         {
diff --git a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp
index 8bd7bf28ac4e19..473cd9d7ba590a 100644
--- a/src/coreclr/jit/hwintrinsiccodegenarm64.cpp
+++ b/src/coreclr/jit/hwintrinsiccodegenarm64.cpp
@@ -2101,6 +2101,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
             }
 
             case NI_Sve_GatherVectorWithByteOffsets:
+            case NI_Sve_GatherVectorWithByteOffsetFirstFaulting:
             {
                 assert(!varTypeIsSIMD(intrin.op2->gtType));
                 assert(intrin.numOperands == 3);
diff --git a/src/coreclr/jit/hwintrinsiclistarm64sve.h b/src/coreclr/jit/hwintrinsiclistarm64sve.h
index 15d76c87e67c80..dffe29b2c65d2d 100644
--- a/src/coreclr/jit/hwintrinsiclistarm64sve.h
+++ b/src/coreclr/jit/hwintrinsiclistarm64sve.h
@@ -121,6 +121,7 @@ HARDWARE_INTRINSIC(Sve,           GatherVectorUInt16WithByteOffsetsZeroExtend,
 HARDWARE_INTRINSIC(Sve,           GatherVectorUInt16ZeroExtend,                                     -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1h,       INS_sve_ld1h,       INS_sve_ld1h,       INS_sve_ld1h,       INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GatherVectorUInt32WithByteOffsetsZeroExtend,                      -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1w,       INS_sve_ld1w,       INS_sve_ld1w,       INS_sve_ld1w,       INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GatherVectorUInt32ZeroExtend,                                     -1,     -1,      false, {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1w,       INS_sve_ld1w,       INS_sve_ld1w,       INS_sve_ld1w,       INS_invalid,        INS_invalid},     HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
+HARDWARE_INTRINSIC(Sve,           GatherVectorWithByteOffsetFirstFaulting,                          -1,      3,      true,  {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ldff1w,     INS_sve_ldff1w,     INS_sve_ldff1d,     INS_sve_ldff1d,     INS_sve_ldff1w,     INS_sve_ldff1d},  HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_SpecialSideEffectMask)
 HARDWARE_INTRINSIC(Sve,           GatherVectorWithByteOffsets,                                      -1,      3,      true,  {INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_sve_ld1w,       INS_sve_ld1w,       INS_sve_ld1d,       INS_sve_ld1d,       INS_sve_ld1w,       INS_sve_ld1d},    HW_Category_MemoryLoad,            HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GetActiveElementCount,                                            -1,      2,      true,  {INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp,       INS_sve_cntp},    HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_ExplicitMaskedOperation)
 HARDWARE_INTRINSIC(Sve,           GetFfrByte,                                                       -1,      0,      false, {INS_invalid,        INS_sve_rdffr,      INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid,        INS_invalid},     HW_Category_SIMD,                  HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask|HW_Flag_SpecialSideEffectMask)
diff --git a/src/coreclr/jit/lsraarm64.cpp b/src/coreclr/jit/lsraarm64.cpp
index 5d6cf7f1945e4c..8cdf0fe868f667 100644
--- a/src/coreclr/jit/lsraarm64.cpp
+++ b/src/coreclr/jit/lsraarm64.cpp
@@ -2081,6 +2081,7 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree, int* pDstCou
                 case NI_Sve_GatherVectorUInt16ZeroExtend:
                 case NI_Sve_GatherVectorUInt32WithByteOffsetsZeroExtend:
                 case NI_Sve_GatherVectorUInt32ZeroExtend:
+                case NI_Sve_GatherVectorWithByteOffsetFirstFaulting:
                     assert(intrinsicTree->OperIsMemoryLoadOrStore());
                     FALLTHROUGH;
 
diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs
index b815c360381e80..b0156d29404182 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs
@@ -4263,6 +4263,81 @@ internal Arm64() { }
         public static unsafe Vector<ulong> GatherVectorUInt32ZeroExtend(Vector<ulong> mask, uint* address, Vector<ulong> indices) { throw new PlatformNotSupportedException(); }
 
 
+        ///  Unextended load, first-faulting
+
+        /// <summary>
+        /// svfloat64_t svldff1_gather_[s64]offset[_f64](svbool_t pg, const float64_t *base, svint64_t offsets)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zoffsets.D]
+        /// </summary>
+        public static unsafe Vector<double> GatherVectorWithByteOffsetFirstFaulting(Vector<double> mask, double* address, Vector<long> offsets) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svfloat64_t svldff1_gather_[u64]offset[_f64](svbool_t pg, const float64_t *base, svuint64_t offsets)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zoffsets.D]
+        /// </summary>
+        public static unsafe Vector<double> GatherVectorWithByteOffsetFirstFaulting(Vector<double> mask, double* address, Vector<ulong> offsets) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svint32_t svldff1_gather_[s32]offset[_s32](svbool_t pg, const int32_t *base, svint32_t offsets)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zoffsets.S, SXTW]
+        /// </summary>
+        public static unsafe Vector<int> GatherVectorWithByteOffsetFirstFaulting(Vector<int> mask, int* address, Vector<int> offsets) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svint32_t svldff1_gather_[u32]offset[_s32](svbool_t pg, const int32_t *base, svuint32_t offsets)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zoffsets.S, UXTW]
+        /// </summary>
+        public static unsafe Vector<int> GatherVectorWithByteOffsetFirstFaulting(Vector<int> mask, int* address, Vector<uint> offsets) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svint64_t svldff1_gather_[s64]offset[_s64](svbool_t pg, const int64_t *base, svint64_t offsets)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zoffsets.D]
+        /// </summary>
+        public static unsafe Vector<long> GatherVectorWithByteOffsetFirstFaulting(Vector<long> mask, long* address, Vector<long> offsets) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svint64_t svldff1_gather_[u64]offset[_s64](svbool_t pg, const int64_t *base, svuint64_t offsets)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zoffsets.D]
+        /// </summary>
+        public static unsafe Vector<long> GatherVectorWithByteOffsetFirstFaulting(Vector<long> mask, long* address, Vector<ulong> offsets) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svfloat32_t svldff1_gather_[s32]offset[_f32](svbool_t pg, const float32_t *base, svint32_t offsets)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zoffsets.S, SXTW]
+        /// </summary>
+        public static unsafe Vector<float> GatherVectorWithByteOffsetFirstFaulting(Vector<float> mask, float* address, Vector<int> offsets) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svfloat32_t svldff1_gather_[u32]offset[_f32](svbool_t pg, const float32_t *base, svuint32_t offsets)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zoffsets.S, UXTW]
+        /// </summary>
+        public static unsafe Vector<float> GatherVectorWithByteOffsetFirstFaulting(Vector<float> mask, float* address, Vector<uint> offsets) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svuint32_t svldff1_gather_[s32]offset[_u32](svbool_t pg, const uint32_t *base, svint32_t offsets)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zoffsets.S, SXTW]
+        /// </summary>
+        public static unsafe Vector<uint> GatherVectorWithByteOffsetFirstFaulting(Vector<uint> mask, uint* address, Vector<int> offsets) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svuint32_t svldff1_gather_[u32]offset[_u32](svbool_t pg, const uint32_t *base, svuint32_t offsets)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zoffsets.S, UXTW]
+        /// </summary>
+        public static unsafe Vector<uint> GatherVectorWithByteOffsetFirstFaulting(Vector<uint> mask, uint* address, Vector<uint> offsets) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svuint64_t svldff1_gather_[s64]offset[_u64](svbool_t pg, const uint64_t *base, svint64_t offsets)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zoffsets.D]
+        /// </summary>
+        public static unsafe Vector<ulong> GatherVectorWithByteOffsetFirstFaulting(Vector<ulong> mask, ulong* address, Vector<long> offsets) { throw new PlatformNotSupportedException(); }
+
+        /// <summary>
+        /// svuint64_t svldff1_gather_[u64]offset[_u64](svbool_t pg, const uint64_t *base, svuint64_t offsets)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zoffsets.D]
+        /// </summary>
+        public static unsafe Vector<ulong> GatherVectorWithByteOffsetFirstFaulting(Vector<ulong> mask, ulong* address, Vector<ulong> offsets) { throw new PlatformNotSupportedException(); }
+
+
         ///  Unextended load
 
         /// <summary>
diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs
index b9e7001b954c79..fdce6e07d732eb 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs
@@ -4321,6 +4321,81 @@ internal Arm64() { }
         public static unsafe Vector<ulong> GatherVectorUInt32ZeroExtend(Vector<ulong> mask, uint* address, Vector<ulong> indices) => GatherVectorUInt32ZeroExtend(mask, address, indices);
 
 
+        ///  Unextended load, first-faulting
+
+        /// <summary>
+        /// svfloat64_t svldff1_gather_[s64]offset[_f64](svbool_t pg, const float64_t *base, svint64_t offsets)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zoffsets.D]
+        /// </summary>
+        public static unsafe Vector<double> GatherVectorWithByteOffsetFirstFaulting(Vector<double> mask, double* address, Vector<long> offsets) => GatherVectorWithByteOffsetFirstFaulting(mask, address, offsets);
+
+        /// <summary>
+        /// svfloat64_t svldff1_gather_[u64]offset[_f64](svbool_t pg, const float64_t *base, svuint64_t offsets)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zoffsets.D]
+        /// </summary>
+        public static unsafe Vector<double> GatherVectorWithByteOffsetFirstFaulting(Vector<double> mask, double* address, Vector<ulong> offsets) => GatherVectorWithByteOffsetFirstFaulting(mask, address, offsets);
+
+        /// <summary>
+        /// svint32_t svldff1_gather_[s32]offset[_s32](svbool_t pg, const int32_t *base, svint32_t offsets)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zoffsets.S, SXTW]
+        /// </summary>
+        public static unsafe Vector<int> GatherVectorWithByteOffsetFirstFaulting(Vector<int> mask, int* address, Vector<int> offsets) => GatherVectorWithByteOffsetFirstFaulting(mask, address, offsets);
+
+        /// <summary>
+        /// svint32_t svldff1_gather_[u32]offset[_s32](svbool_t pg, const int32_t *base, svuint32_t offsets)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zoffsets.S, UXTW]
+        /// </summary>
+        public static unsafe Vector<int> GatherVectorWithByteOffsetFirstFaulting(Vector<int> mask, int* address, Vector<uint> offsets) => GatherVectorWithByteOffsetFirstFaulting(mask, address, offsets);
+
+        /// <summary>
+        /// svint64_t svldff1_gather_[s64]offset[_s64](svbool_t pg, const int64_t *base, svint64_t offsets)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zoffsets.D]
+        /// </summary>
+        public static unsafe Vector<long> GatherVectorWithByteOffsetFirstFaulting(Vector<long> mask, long* address, Vector<long> offsets) => GatherVectorWithByteOffsetFirstFaulting(mask, address, offsets);
+
+        /// <summary>
+        /// svint64_t svldff1_gather_[u64]offset[_s64](svbool_t pg, const int64_t *base, svuint64_t offsets)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zoffsets.D]
+        /// </summary>
+        public static unsafe Vector<long> GatherVectorWithByteOffsetFirstFaulting(Vector<long> mask, long* address, Vector<ulong> offsets) => GatherVectorWithByteOffsetFirstFaulting(mask, address, offsets);
+
+        /// <summary>
+        /// svfloat32_t svldff1_gather_[s32]offset[_f32](svbool_t pg, const float32_t *base, svint32_t offsets)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zoffsets.S, SXTW]
+        /// </summary>
+        public static unsafe Vector<float> GatherVectorWithByteOffsetFirstFaulting(Vector<float> mask, float* address, Vector<int> offsets) => GatherVectorWithByteOffsetFirstFaulting(mask, address, offsets);
+
+        /// <summary>
+        /// svfloat32_t svldff1_gather_[u32]offset[_f32](svbool_t pg, const float32_t *base, svuint32_t offsets)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zoffsets.S, UXTW]
+        /// </summary>
+        public static unsafe Vector<float> GatherVectorWithByteOffsetFirstFaulting(Vector<float> mask, float* address, Vector<uint> offsets) => GatherVectorWithByteOffsetFirstFaulting(mask, address, offsets);
+
+        /// <summary>
+        /// svuint32_t svldff1_gather_[s32]offset[_u32](svbool_t pg, const uint32_t *base, svint32_t offsets)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zoffsets.S, SXTW]
+        /// </summary>
+        public static unsafe Vector<uint> GatherVectorWithByteOffsetFirstFaulting(Vector<uint> mask, uint* address, Vector<int> offsets) => GatherVectorWithByteOffsetFirstFaulting(mask, address, offsets);
+
+        /// <summary>
+        /// svuint32_t svldff1_gather_[u32]offset[_u32](svbool_t pg, const uint32_t *base, svuint32_t offsets)
+        ///   LDFF1W Zresult.S, Pg/Z, [Xbase, Zoffsets.S, UXTW]
+        /// </summary>
+        public static unsafe Vector<uint> GatherVectorWithByteOffsetFirstFaulting(Vector<uint> mask, uint* address, Vector<uint> offsets) => GatherVectorWithByteOffsetFirstFaulting(mask, address, offsets);
+
+        /// <summary>
+        /// svuint64_t svldff1_gather_[s64]offset[_u64](svbool_t pg, const uint64_t *base, svint64_t offsets)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zoffsets.D]
+        /// </summary>
+        public static unsafe Vector<ulong> GatherVectorWithByteOffsetFirstFaulting(Vector<ulong> mask, ulong* address, Vector<long> offsets) => GatherVectorWithByteOffsetFirstFaulting(mask, address, offsets);
+
+        /// <summary>
+        /// svuint64_t svldff1_gather_[u64]offset[_u64](svbool_t pg, const uint64_t *base, svuint64_t offsets)
+        ///   LDFF1D Zresult.D, Pg/Z, [Xbase, Zoffsets.D]
+        /// </summary>
+        public static unsafe Vector<ulong> GatherVectorWithByteOffsetFirstFaulting(Vector<ulong> mask, ulong* address, Vector<ulong> offsets) => GatherVectorWithByteOffsetFirstFaulting(mask, address, offsets);
+
+
         ///  Unextended load
 
         /// <summary>
diff --git a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs
index 235abf9affcf77..111a6751d3bd0c 100644
--- a/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs
+++ b/src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs
@@ -4985,6 +4985,19 @@ internal Arm64() { }
         public static System.Numerics.Vector<ulong> GatherVectorUInt32ZeroExtend(System.Numerics.Vector<ulong> mask, System.Numerics.Vector<ulong> addresses) { throw null; }
         public static unsafe System.Numerics.Vector<ulong> GatherVectorUInt32ZeroExtend(System.Numerics.Vector<ulong> mask, uint* address, System.Numerics.Vector<ulong> indices) { throw null; }
 
+        public static unsafe System.Numerics.Vector<double> GatherVectorWithByteOffsetFirstFaulting(System.Numerics.Vector<double> mask, double* address, System.Numerics.Vector<long> offsets) { throw null; }
+        public static unsafe System.Numerics.Vector<double> GatherVectorWithByteOffsetFirstFaulting(System.Numerics.Vector<double> mask, double* address, System.Numerics.Vector<ulong> offsets) { throw null; }
+        public static unsafe System.Numerics.Vector<int> GatherVectorWithByteOffsetFirstFaulting(System.Numerics.Vector<int> mask, int* address, System.Numerics.Vector<int> offsets) { throw null; }
+        public static unsafe System.Numerics.Vector<int> GatherVectorWithByteOffsetFirstFaulting(System.Numerics.Vector<int> mask, int* address, System.Numerics.Vector<uint> offsets) { throw null; }
+        public static unsafe System.Numerics.Vector<long> GatherVectorWithByteOffsetFirstFaulting(System.Numerics.Vector<long> mask, long* address, System.Numerics.Vector<long> offsets) { throw null; }
+        public static unsafe System.Numerics.Vector<long> GatherVectorWithByteOffsetFirstFaulting(System.Numerics.Vector<long> mask, long* address, System.Numerics.Vector<ulong> offsets) { throw null; }
+        public static unsafe System.Numerics.Vector<float> GatherVectorWithByteOffsetFirstFaulting(System.Numerics.Vector<float> mask, float* address, System.Numerics.Vector<int> offsets) { throw null; }
+        public static unsafe System.Numerics.Vector<float> GatherVectorWithByteOffsetFirstFaulting(System.Numerics.Vector<float> mask, float* address, System.Numerics.Vector<uint> offsets) { throw null; }
+        public static unsafe System.Numerics.Vector<uint> GatherVectorWithByteOffsetFirstFaulting(System.Numerics.Vector<uint> mask, uint* address, System.Numerics.Vector<int> offsets) { throw null; }
+        public static unsafe System.Numerics.Vector<uint> GatherVectorWithByteOffsetFirstFaulting(System.Numerics.Vector<uint> mask, uint* address, System.Numerics.Vector<uint> offsets) { throw null; }
+        public static unsafe System.Numerics.Vector<ulong> GatherVectorWithByteOffsetFirstFaulting(System.Numerics.Vector<ulong> mask, ulong* address, System.Numerics.Vector<long> offsets) { throw null; }
+        public static unsafe System.Numerics.Vector<ulong> GatherVectorWithByteOffsetFirstFaulting(System.Numerics.Vector<ulong> mask, ulong* address, System.Numerics.Vector<ulong> offsets) { throw null; }
+
         public static unsafe System.Numerics.Vector<double> GatherVectorWithByteOffsets(System.Numerics.Vector<double> mask, double* address, System.Numerics.Vector<long> offsets) { throw null; }
         public static unsafe System.Numerics.Vector<double> GatherVectorWithByteOffsets(System.Numerics.Vector<double> mask, double* address, System.Numerics.Vector<ulong> offsets) { throw null; }
         public static unsafe System.Numerics.Vector<int> GatherVectorWithByteOffsets(System.Numerics.Vector<int> mask, int* address, System.Numerics.Vector<int> offsets) { throw null; }
diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
index beb23342bc8725..640fd1bb23d641 100644
--- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
+++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
@@ -3665,6 +3665,19 @@
     ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_long_ulong",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "Int64",    ["GetFfrType"] = "Int64",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
     ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_ulong_ulong",                                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "UInt64",   ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
 
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_float_int",                                                              ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",                                        ["GetFfrType"] = "Byte",        ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_int",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",                                        ["GetFfrType"] = "Int32",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_uint_int",                                                               ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",                                        ["GetFfrType"] = "UInt32",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_float_uint",                                                             ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32",                                       ["GetFfrType"] = "Byte",        ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_int_uint",                                                               ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32",                                       ["GetFfrType"] = "Int32",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_uint",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32",                                       ["GetFfrType"] = "UInt32",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_double_long",                                                            ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",                                        ["GetFfrType"] = "Byte",        ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_long",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",                                        ["GetFfrType"] = "Int64",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_ulong_long",                                                             ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",                                        ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_double_ulong",                                                           ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64",                                       ["GetFfrType"] = "Byte",        ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_long_ulong",                                                             ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64",                                       ["GetFfrType"] = "Int64",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_ulong",                                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64",                                       ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
+
     ("SveGatherVectorByteOffsets.template",new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorWithByteOffsets_float_int",                                                             ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsets",                                          ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Byte",   ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",       ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
     ("SveGatherVectorByteOffsets.template",new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorWithByteOffsets_int_int",                                                               ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsets",                                          ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Byte",   ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",        ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
     ("SveGatherVectorByteOffsets.template",new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorWithByteOffsets_uint_int",                                                              ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsets",                                          ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Byte",   ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",       ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
index c7ca861fbcb0a5..3e3be735b1ec83 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
@@ -8569,6 +8569,7 @@ private static bool CheckGatherVectorBehaviorCore<T, ExtendedElementT, Index>(T[
                 gatherResult = map(i, gatherResult);
                 if (result[i] != gatherResult)
                 {
+                    Console.WriteLine($"API: {result[i]}, helper: {gatherResult}");
                     return false;
                 }
             }
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorByteOffsetFirstFaulting.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorByteOffsetFirstFaulting.template
new file mode 100644
index 00000000000000..c254d6958d9662
--- /dev/null
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorByteOffsetFirstFaulting.template
@@ -0,0 +1,737 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+/******************************************************************************
+ * This file is auto-generated from a template file by the GenerateTests.csx  *
+ * script in tests\src\JIT\HardwareIntrinsics\Arm\Shared. In order to make    *
+ * changes, please update the corresponding template and run according to the *
+ * directions listed in the file.                                             *
+ ******************************************************************************/
+
+using System;
+using System.Buffers;
+using System.Numerics;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Runtime.Intrinsics;
+using System.Runtime.Intrinsics.Arm;
+using Xunit;
+
+namespace JIT.HardwareIntrinsics.Arm
+{
+    public static partial class Program
+    {
+        [Fact]
+        public static void {TestName}()
+        {
+            var test = new SveGatherVectorIndices__{TestName}();
+
+            if (test.IsSupported)
+            {
+                // Validates basic functionality works, using Unsafe.Read
+                test.RunBasicScenario_UnsafeRead();
+
+                // Validates basic functionality works
+                test.RunBasicScenario_Load();
+
+                // Validates basic functionality of first-faulting behavior
+                test.RunBasicScenario_LoadFirstFaulting();
+
+                // Validates fully masked out load works.
+                test.RunBasicScenario_FalseMask();
+
+                // Validates fully masked out load with invalid address works.
+                test.RunBasicScenario_NonFaulting();
+
+                // Validates calling via reflection works, using Unsafe.Read
+                test.RunReflectionScenario_UnsafeRead();
+
+                // Validates passing a local works, using Unsafe.Read
+                test.RunLclVarScenario_UnsafeRead();
+
+                // Validates passing an instance member of a class works
+                test.RunClassFldScenario();
+
+                // Validates passing the field of a local struct works
+                test.RunStructLclFldScenario();
+
+                // Validates passing an instance member of a struct works
+                test.RunStructFldScenario();
+
+                // Validates using inside ConditionalSelect with value falseValue
+                // Currently, using this operation in ConditionalSelect() gives incorrect result
+                // when falseReg == targetReg because this instruction uses Pg/Z to update the targetReg
+                // instead of Pg/M to merge it. As such, the value of falseReg is lost. Ideally, such
+                // instructions should be marked similar to RMW (a different flag name) to make sure that
+                // we do not assign falseReg/targetReg same. Then, we would do something like this:
+                //
+                // ldnf1sh target, pg/z, [x0]
+                // sel mask, target, target, falseReg
+                //
+                // This needs more careful thinking, so disabling it for now.
+                // test.ConditionalSelect_FalseOp();
+
+                // Validates using inside ConditionalSelect with zero falseValue
+                test.ConditionalSelect_ZeroOp();
+            }
+            else
+            {
+                // Validates we throw on unsupported hardware
+                test.RunUnsupportedScenario();
+            }
+
+            if (!test.Succeeded)
+            {
+                throw new Exception("One or more scenarios did not complete as expected.");
+            }
+        }
+    }
+
+    public sealed unsafe class SveGatherVectorIndices__{TestName}
+    {
+        private struct DataTable
+        {
+            private byte[] inArray1;
+            private byte[] inArray2;
+            private byte[] inArray3;
+            private byte[] outArray;
+
+            private GCHandle inHandle1;
+            private GCHandle inHandle2;
+            private GCHandle inHandle3;
+            private GCHandle outHandle;
+
+            private ulong alignment;
+
+            public DataTable({Op1BaseType}[] inArray1, {Op2BaseType}[] inArray2, {Op3BaseType}[] inArray3, {RetBaseType}[] outArray, int alignment)
+            {
+                int sizeOfinArray1 = inArray1.Length * Unsafe.SizeOf<{Op1BaseType}>();
+                int sizeOfinArray2 = inArray2.Length * Unsafe.SizeOf<{Op2BaseType}>();
+                int sizeOfinArray3 = inArray3.Length * Unsafe.SizeOf<{Op3BaseType}>();
+                int sizeOfinBounded = new Random().Next(Unsafe.SizeOf<{Op2BaseType}>(), Vector<{Op2BaseType}>.Count * Unsafe.SizeOf<{Op2BaseType}>() - 1);
+                int sizeOfoutArray = outArray.Length * Unsafe.SizeOf<{RetBaseType}>();
+
+                if ((alignment != 64 && alignment != 16 && alignment != 8) || (alignment * 2) < sizeOfinArray1 || (alignment * 2) < sizeOfinArray3 || (alignment * 2) < sizeOfoutArray)
+                {
+                    throw new ArgumentException($"Invalid value of alignment: {alignment}, sizeOfinArray1: {sizeOfinArray1}, sizeOfinArray2: {sizeOfinArray2}, sizeOfinArray3: {sizeOfinArray3}, sizeOfoutArray: {sizeOfoutArray}");
+                }
+
+                this.inArray1 = new byte[alignment * 2];
+                this.inArray2 = new byte[alignment + sizeOfinArray2];
+                this.inArray3 = new byte[alignment * 2];
+                this.outArray = new byte[alignment * 2];
+
+                this.inHandle1 = GCHandle.Alloc(this.inArray1, GCHandleType.Pinned);
+                this.inHandle2 = GCHandle.Alloc(this.inArray2, GCHandleType.Pinned);
+                this.inHandle3 = GCHandle.Alloc(this.inArray3, GCHandleType.Pinned);
+                this.outHandle = GCHandle.Alloc(this.outArray, GCHandleType.Pinned);
+
+                this.alignment = (ulong)alignment;
+
+                this.inBounded = BoundedMemory.Allocate<byte>(sizeOfinBounded, PoisonPagePlacement.After);
+
+                Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(inArray1Ptr), ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), (uint)sizeOfinArray1);
+                Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(inArray2Ptr), ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), (uint)sizeOfinArray2);
+                Unsafe.CopyBlockUnaligned(ref Unsafe.AsRef<byte>(inArray3Ptr), ref Unsafe.As<{Op3BaseType}, byte>(ref inArray3[0]), (uint)sizeOfinArray3);
+                Unsafe.CopyBlockUnaligned(ref inBounded.Span.GetPinnableReference(), ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), (uint)sizeOfinBounded);
+            }
+
+            public BoundedMemory<byte> inBounded;
+
+            public void* inArray1Ptr => Align((byte*)(inHandle1.AddrOfPinnedObject().ToPointer()), alignment);
+            public void* inArray2Ptr => Align((byte*)(inHandle2.AddrOfPinnedObject().ToPointer()), alignment);
+            public void* inArray3Ptr => Align((byte*)(inHandle3.AddrOfPinnedObject().ToPointer()), alignment);
+            public void* outArrayPtr => Align((byte*)(outHandle.AddrOfPinnedObject().ToPointer()), alignment);
+
+            public void Dispose()
+            {
+                inHandle1.Free();
+                inHandle2.Free();
+                inHandle3.Free();
+                outHandle.Free();
+            }
+
+            private static unsafe void* Align(byte* buffer, ulong expectedAlignment)
+            {
+                return (void*)(((ulong)buffer + expectedAlignment - 1) & ~(expectedAlignment - 1));
+            }
+        }
+
+        private struct TestStruct
+        {
+            public {Op1VectorType}<{Op1BaseType}> _fld1;
+            public {Op2BaseType}* _fld2;
+            public {Op3VectorType}<{Op3BaseType}> _fld3;
+
+            public static TestStruct Create(DataTable _dataTable)
+            {
+                var testStruct = new TestStruct();
+
+                for (var i = 0; i < Op1ElementCount; i++) { _data1[i] = {NextValueOp1}; }
+                for (var i = 0; i < Op2ElementCount; i++) { _data2[i] = {NextValueOp2}; }
+
+                // Ensure all values of _data3 fit within the number of _data2 elements
+                for (var i = 0; i < Op3ElementCount; i++) { _data3[i] = {NextValueOp3} % ({Op3BaseType})Op2ElementCount; }
+
+                Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1VectorType}<{Op1BaseType}>, byte>(ref testStruct._fld1), ref Unsafe.As<{Op1BaseType}, byte>(ref _data1[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
+                Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op3VectorType}<{Op3BaseType}>, byte>(ref testStruct._fld3), ref Unsafe.As<{Op3BaseType}, byte>(ref _data3[0]), (uint)Unsafe.SizeOf<{Op3VectorType}<{Op3BaseType}>>());
+
+                testStruct._fld2 = ({Op2BaseType}*)_dataTable.inArray2Ptr;
+
+                return testStruct;
+            }
+
+            public void RunStructFldScenario(SveGatherVectorIndices__{TestName} testClass)
+            {
+                var result = {Isa}.{Method}(_fld1, _fld2, _fld3);
+
+                Unsafe.Write(testClass._dataTable.outArrayPtr, result);
+                testClass.ValidateResult(_fld1, _fld2, _fld3, testClass._dataTable.outArrayPtr);
+            }
+        }
+
+        private static readonly int LargestVectorSize = {LargestVectorSize};
+
+        // A large enough buffer to hold many values. Op3 will index into Op2.
+        private static readonly int Op2ElementCount = 1024;
+
+        private static readonly int Op1ElementCount = Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>() / sizeof({Op1BaseType});
+        private static readonly int Op3ElementCount = Unsafe.SizeOf<{Op3VectorType}<{Op3BaseType}>>() / sizeof({Op3BaseType});
+        private static readonly int RetElementCount = Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>() / sizeof({RetBaseType});
+
+        private static {Op1BaseType}[] _data1 = new {Op1BaseType}[Op1ElementCount];
+        private static {Op2BaseType}[] _data2 = new {Op2BaseType}[Op2ElementCount];
+        private static {Op3BaseType}[] _data3 = new {Op3BaseType}[Op3ElementCount];
+
+        private static {RetBaseType}[] _maskData = new {RetBaseType}[RetElementCount];
+        private static {RetBaseType}[] _falseData = new {RetBaseType}[RetElementCount];
+
+        private {Op1VectorType}<{Op1BaseType}> _fld1;
+        private {Op2BaseType}* _fld2;
+        private {Op3VectorType}<{Op3BaseType}> _fld3;
+
+        private {Op1VectorType}<{Op1BaseType}> _mask;
+        private {Op1VectorType}<{Op1BaseType}> _falseFld;
+
+        private DataTable _dataTable;
+
+        public SveGatherVectorIndices__{TestName}()
+        {
+            Succeeded = true;
+
+            for (var i = 0; i < Op1ElementCount; i++) { _data1[i] = {NextValueOp1}; }
+            for (var i = 0; i < Op2ElementCount; i++) { _data2[i] = {NextValueOp2}; }
+
+            // Ensure all values of _data3 fit within the number of _data2 elements
+            for (var i = 0; i < Op3ElementCount; i++) { _data3[i] = {NextValueOp3} % ({Op3BaseType})Op2ElementCount; }
+
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1VectorType}<{Op1BaseType}>, byte>(ref _fld1), ref Unsafe.As<{Op1BaseType}, byte>(ref _data1[0]), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op3VectorType}<{Op3BaseType}>, byte>(ref _fld3), ref Unsafe.As<{Op3BaseType}, byte>(ref _data3[0]), (uint)Unsafe.SizeOf<{Op3VectorType}<{Op3BaseType}>>());
+
+            for (var i = 0; i < RetElementCount; i++) { _maskData[i] = ({RetBaseType})({NextValueOp1}); }
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetVectorType}<{RetBaseType}>, byte>(ref _mask), ref Unsafe.As<{RetBaseType}, byte>(ref _maskData[0]), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            for (var i = 0; i < RetElementCount; i++) { _falseData[i] = ({RetBaseType})({NextValueOp2}); }
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetVectorType}<{RetBaseType}>, byte>(ref _falseFld), ref Unsafe.As<{RetBaseType}, byte>(ref _falseData[0]), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            _dataTable = new DataTable(_data1, _data2, _data3, new {RetBaseType}[RetElementCount], LargestVectorSize);
+
+            _fld2 = ({Op2BaseType}*)_dataTable.inArray2Ptr;
+        }
+
+        public bool IsSupported => {Isa}.IsSupported;
+
+        public bool Succeeded { get; set; }
+
+        public void RunBasicScenario_UnsafeRead()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_UnsafeRead));
+
+            var result = {Isa}.{Method}(
+                Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr),
+                ({Op2BaseType}*)_dataTable.inArray2Ptr,
+                Unsafe.Read<{Op3VectorType}<{Op3BaseType}>>(_dataTable.inArray3Ptr)
+            );
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.inArray3Ptr, _dataTable.outArrayPtr);
+        }
+
+        public void RunBasicScenario_Load()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_Load));
+
+            {Op1VectorType}<{Op1BaseType}> loadMask1 = Sve.CreateTrueMask{Op1BaseType}(SveMaskPattern.All);
+            {Op3VectorType}<{Op3BaseType}> loadMask3 = Sve.CreateTrueMask{Op3BaseType}(SveMaskPattern.All);
+
+            var result = {Isa}.{Method}(
+                {LoadIsa}.Load{Op1VectorType}(loadMask1, ({Op1BaseType}*)(_dataTable.inArray1Ptr)),
+                ({Op2BaseType}*)_dataTable.inArray2Ptr,
+                {LoadIsa}.Load{Op3VectorType}(loadMask3, ({Op3BaseType}*)(_dataTable.inArray3Ptr))
+            );
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.inArray3Ptr, _dataTable.outArrayPtr);
+        }
+
+        public void RunBasicScenario_LoadFirstFaulting()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_LoadFirstFaulting));
+
+            {Op1VectorType}<{Op1BaseType}> loadMask1 = Sve.CreateTrueMask{Op1BaseType}(SveMaskPattern.All);
+            {Op3VectorType}<{Op3BaseType}> loadMask3 = Sve.CreateTrueMask{Op3BaseType}(SveMaskPattern.All);
+
+            var op1 = {LoadIsa}.Load{Op1VectorType}(loadMask1, ({Op1BaseType}*)(_dataTable.inArray1Ptr));
+            ref var op2Ref = ref (_dataTable.inBounded.Span.GetPinnableReference());
+            var op3 = {LoadIsa}.Load{Op3VectorType}(loadMask3, ({Op3BaseType}*)(_dataTable.inArray3Ptr));
+
+            // When testing first-faulting behavior, we need to make sure we can get the first element.
+            // So set the first active element of the index vector to 0.
+            for (var i = 0; i < Vector<{Op3BaseType}>.Count; i++)
+            {
+                // op1 is the mask for GatherVector.
+                if (op1[i] != 0)
+                {
+                    op3 = op3.WithElement<{Op3BaseType}>(i, 0);
+                    break;
+                }
+            }
+
+            Sve.SetFfr(Sve.CreateTrueMaskByte(SveMaskPattern.All));
+            var result = {Isa}.{Method}(
+                op1,
+                ({Op2BaseType}*)(Unsafe.AsPointer(ref op2Ref)),
+                op3
+            );
+            var faultResult = Sve.GetFfr{GetFfrType}();
+
+            ref var op3Ref = ref op3;
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateFirstFaultingResult(_dataTable.inArray1Ptr, ref op2Ref, _dataTable.inBounded.Span.Length, Unsafe.AsPointer(ref op3Ref), _dataTable.outArrayPtr, faultResult.As<{GetFfrType}, {RetBaseType}>());
+        }
+
+        public void RunBasicScenario_FalseMask()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_FalseMask));
+
+            {Op1VectorType}<{Op1BaseType}> falseMask = Sve.CreateFalseMask{Op1BaseType}();
+
+            var result = {Isa}.{Method}(
+                falseMask,
+                ({Op2BaseType}*)_dataTable.inArray2Ptr,
+                Unsafe.Read<{Op3VectorType}<{Op3BaseType}>>(_dataTable.inArray3Ptr)
+            );
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateZeroResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.inArray3Ptr, _dataTable.outArrayPtr);
+        }
+
+        public void RunBasicScenario_NonFaulting()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunBasicScenario_NonFaulting));
+
+            {Op1VectorType}<{Op1BaseType}> falseMask = Sve.CreateFalseMask{Op1BaseType}();
+
+            try
+            {
+                var result = {Isa}.{Method}(
+                    falseMask,
+                    default,
+                    Unsafe.Read<{Op3VectorType}<{Op3BaseType}>>(_dataTable.inArray3Ptr)
+                );
+
+                Unsafe.Write(_dataTable.outArrayPtr, result);
+                ValidateZeroResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.inArray3Ptr, _dataTable.outArrayPtr);
+            }
+            catch
+            {
+                Succeeded = false;
+            }
+        }
+
+        public void RunReflectionScenario_UnsafeRead()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunReflectionScenario_UnsafeRead));
+
+            var result = typeof({Isa}).GetMethod(nameof({Isa}.{Method}), new Type[] { typeof({Op1VectorType}<{Op1BaseType}>), typeof({Op2BaseType}*), typeof({Op3VectorType}<{Op3BaseType}>) })
+                                     .Invoke(null, new object[] {
+                                        Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr),
+                                        Pointer.Box(_dataTable.inArray2Ptr, typeof({Op2BaseType}*)),
+                                        Unsafe.Read<{Op3VectorType}<{Op3BaseType}>>(_dataTable.inArray3Ptr)
+                                     });
+
+            Unsafe.Write(_dataTable.outArrayPtr, ({RetVectorType}<{RetBaseType}>)(result));
+            ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.inArray3Ptr, _dataTable.outArrayPtr);
+        }
+
+        public void RunLclVarScenario_UnsafeRead()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunLclVarScenario_UnsafeRead));
+
+            var op1 = Unsafe.Read<{Op1VectorType}<{Op1BaseType}>>(_dataTable.inArray1Ptr);
+            var op2 = ({Op2BaseType}*)_dataTable.inArray2Ptr;
+            var op3 = Unsafe.Read<{Op3VectorType}<{Op3BaseType}>>(_dataTable.inArray3Ptr);
+            var result = {Isa}.{Method}(op1, op2, op3);
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(op1, op2, op3, _dataTable.outArrayPtr);
+        }
+
+        public void RunClassFldScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunClassFldScenario));
+
+            var result = {Isa}.{Method}(_fld1, _fld2, _fld3);
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(_fld1, _fld2, _fld3, _dataTable.outArrayPtr);
+        }
+
+        public void RunStructLclFldScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunStructLclFldScenario));
+
+            var test = TestStruct.Create(_dataTable);
+            var result = {Isa}.{Method}(test._fld1, test._fld2, test._fld3);
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateResult(test._fld1, test._fld2, test._fld3, _dataTable.outArrayPtr);
+        }
+
+        public void RunStructFldScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunStructFldScenario));
+
+            var test = TestStruct.Create(_dataTable);
+            test.RunStructFldScenario(this);
+        }
+
+        public void ConditionalSelect_FalseOp()
+        {
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_mask - operation in TrueValue");
+            ConditionalSelectScenario_TrueValue(_mask, _fld1, _fld2, _fld3, _falseFld);
+
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_zero - operation in TrueValue");
+            ConditionalSelectScenario_TrueValue({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _fld3, _falseFld);
+
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_all - operation in TrueValue");
+            ConditionalSelectScenario_TrueValue({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _fld3, _falseFld);
+
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_mask - operation in FalseValue");
+            ConditionalSelectScenario_FalseValue(_mask, _fld1, _fld2, _fld3, _falseFld);
+
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_zero - operation in FalseValue");
+            ConditionalSelectScenario_FalseValue({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _fld3, _falseFld);
+
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_FalseOp_all - operation in FalseValue");
+            ConditionalSelectScenario_FalseValue({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _fld3, _falseFld);
+        }
+
+        public void ConditionalSelect_ZeroOp()
+        {
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_mask - operation in TrueValue");
+            ConditionalSelectScenario_TrueValue(_mask, _fld1, _fld2, _fld3, {Op1VectorType}<{RetBaseType}>.Zero);
+
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_zero - operation in TrueValue");
+            ConditionalSelectScenario_TrueValue({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _fld3, {Op1VectorType}<{Op1BaseType}>.Zero);
+
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_all - operation in TrueValue");
+            ConditionalSelectScenario_TrueValue({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _fld3, {Op1VectorType}<{Op1BaseType}>.Zero);
+
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_mask - operation in FalseValue");
+            ConditionalSelectScenario_FalseValue(_mask, _fld1, _fld2, _fld3, {Op1VectorType}<{RetBaseType}>.Zero);
+
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_zero - operation in FalseValue");
+            ConditionalSelectScenario_FalseValue({Op1VectorType}<{Op1BaseType}>.Zero, _fld1, _fld2, _fld3, {Op1VectorType}<{Op1BaseType}>.Zero);
+
+            TestLibrary.TestFramework.BeginScenario("ConditionalSelect_ZeroOp_all - operation in FalseValue");
+            ConditionalSelectScenario_FalseValue({Op1VectorType}<{Op1BaseType}>.AllBitsSet, _fld1, _fld2, _fld3, {Op1VectorType}<{Op1BaseType}>.Zero);
+        }
+
+        [method: MethodImpl(MethodImplOptions.AggressiveInlining)]
+        private void ConditionalSelectScenario_TrueValue({RetVectorType}<{RetBaseType}> mask, {Op1VectorType}<{Op1BaseType}> op1, {Op2BaseType}* op2, {Op3VectorType}<{Op3BaseType}> op3, {Op1VectorType}<{Op1BaseType}> falseOp)
+        {
+            var result = Sve.ConditionalSelect(mask, {Isa}.{Method}(op1, op2, op3), falseOp);
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateConditionalSelectResult_TrueValue(mask, op1, op2, op3, falseOp, _dataTable.outArrayPtr);
+        }
+
+        [method: MethodImpl(MethodImplOptions.AggressiveInlining)]
+        private void ConditionalSelectScenario_FalseValue({RetVectorType}<{RetBaseType}> mask, {Op1VectorType}<{Op1BaseType}> op1, {Op2BaseType}* op2, {Op3VectorType}<{Op3BaseType}> op3, {Op1VectorType}<{Op1BaseType}> trueOp)
+        {
+            var result = Sve.ConditionalSelect(mask, trueOp, {Isa}.{Method}(op1, op2, op3));
+
+            Unsafe.Write(_dataTable.outArrayPtr, result);
+            ValidateConditionalSelectResult_FalseValue(mask, op1, op2, op3, trueOp, _dataTable.outArrayPtr);
+        }
+
+        public void RunUnsupportedScenario()
+        {
+            TestLibrary.TestFramework.BeginScenario(nameof(RunUnsupportedScenario));
+
+            Succeeded = false;
+
+            try
+            {
+                RunBasicScenario_Load();
+            }
+            catch (PlatformNotSupportedException)
+            {
+                Succeeded = true;
+            }
+        }
+
+        private void ValidateResult({Op1VectorType}<{Op1BaseType}> op1, {Op2BaseType}* op2, {Op3VectorType}<{Op3BaseType}> op3, void* result, [CallerMemberName] string method = "")
+        {
+            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount];
+            byte[] inArray2 = new byte[Unsafe.SizeOf<{Op2BaseType}>() * Op2ElementCount];
+            {Op3BaseType}[] inArray3 = new {Op3BaseType}[Op3ElementCount];
+            {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), op1);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<byte, byte>(ref inArray2[0]), ref Unsafe.AsRef<byte>(op2), (uint)(Unsafe.SizeOf<{Op2BaseType}>() * Op2ElementCount));
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op3BaseType}, byte>(ref inArray3[0]), op3);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateResult(inArray1, inArray2, inArray3, outArray, method);
+        }
+
+        private void ValidateResult(void* firstOp, void* secondOp, void* thirdOp, void* result, [CallerMemberName] string method = "")
+        {
+            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount];
+            byte[] inArray2 = new byte[Unsafe.SizeOf<{Op2BaseType}>() * Op2ElementCount];
+            {Op3BaseType}[] inArray3 = new {Op3BaseType}[Op3ElementCount];
+            {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), ref Unsafe.AsRef<byte>(firstOp), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<byte, byte>(ref inArray2[0]), ref Unsafe.AsRef<byte>(secondOp), (uint)(Unsafe.SizeOf<{Op2BaseType}>() * Op2ElementCount));
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op3BaseType}, byte>(ref inArray3[0]), ref Unsafe.AsRef<byte>(thirdOp), (uint)Unsafe.SizeOf<{Op3VectorType}<{Op3BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateResult(inArray1, inArray2, inArray3, outArray, method);
+        }
+
+        private void ValidateResult({Op1BaseType}[] firstOp, byte[] secondOp, {Op3BaseType}[] thirdOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
+        {
+            bool succeeded = true;
+
+            for (var i = 0; i < RetElementCount; i++)
+            {
+                {RetBaseType} element = Helpers.Load{RetBaseType}FromByteArray(secondOp, thirdOp[i]);
+                {RetBaseType} gatherResult = ({RetBaseType})(firstOp[i] == 0 ? 0 : element);
+                if (result[i] != gatherResult)
+                {
+                    succeeded = false;
+                    break;
+                }
+            }
+
+            if (!succeeded)
+            {
+                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1BaseType}, {Op2BaseType}, {Op3BaseType}): {method} failed:");
+                TestLibrary.TestFramework.LogInformation($"  firstOp: ({string.Join(", ", firstOp)})");
+                TestLibrary.TestFramework.LogInformation($"  secondOp: ({string.Join(", ", secondOp)})");
+                TestLibrary.TestFramework.LogInformation($"  thirdOp: ({string.Join(", ", thirdOp)})");
+                TestLibrary.TestFramework.LogInformation($"   result: ({string.Join(", ", result)})");
+                TestLibrary.TestFramework.LogInformation(string.Empty);
+
+                Succeeded = false;
+            }
+        }
+
+        private void ValidateZeroResult({Op1VectorType}<{Op1BaseType}> op1, {Op2BaseType}* op2, {Op3VectorType}<{Op3BaseType}> op3, void* result, [CallerMemberName] string method = "")
+        {
+            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount];
+            byte[] inArray2 = new byte[Unsafe.SizeOf<{Op2BaseType}>() * Op2ElementCount];
+            {Op3BaseType}[] inArray3 = new {Op3BaseType}[Op3ElementCount];
+            {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), op1);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<byte, byte>(ref inArray2[0]), ref Unsafe.AsRef<byte>(op2), (uint)(Unsafe.SizeOf<{Op2BaseType}>() * Op2ElementCount));
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op3BaseType}, byte>(ref inArray3[0]), op3);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateZeroResult(inArray1, inArray2, inArray3, outArray, method);
+        }
+
+        private void ValidateZeroResult(void* firstOp, void* secondOp, void* thirdOp, void* result, [CallerMemberName] string method = "")
+        {
+            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount];
+            byte[] inArray2 = new byte[Unsafe.SizeOf<{Op2BaseType}>() * Op2ElementCount];
+            {Op3BaseType}[] inArray3 = new {Op3BaseType}[Op3ElementCount];
+            {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), ref Unsafe.AsRef<byte>(firstOp), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<byte, byte>(ref inArray2[0]), ref Unsafe.AsRef<byte>(secondOp), (uint)(Unsafe.SizeOf<{Op2BaseType}>() * Op2ElementCount));
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op3BaseType}, byte>(ref inArray3[0]), ref Unsafe.AsRef<byte>(thirdOp), (uint)Unsafe.SizeOf<{Op3VectorType}<{Op3BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateZeroResult(inArray1, inArray2, inArray3, outArray, method);
+        }
+
+        private void ValidateZeroResult({Op1BaseType}[] firstOp, byte[] secondOp, {Op3BaseType}[] thirdOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
+        {
+            bool succeeded = true;
+
+            for (var i = 0; i < RetElementCount; i++)
+            {
+                if (result[i] != 0)
+                {
+                    succeeded = false;
+                    break;
+                }
+            }
+
+            if (!succeeded)
+            {
+                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1BaseType}, {Op2BaseType}, {Op3BaseType}): {method} failed:");
+                TestLibrary.TestFramework.LogInformation($"  firstOp: ({string.Join(", ", firstOp)})");
+                TestLibrary.TestFramework.LogInformation($"  secondOp: ({string.Join(", ", secondOp)})");
+                TestLibrary.TestFramework.LogInformation($"  thirdOp: ({string.Join(", ", thirdOp)})");
+                TestLibrary.TestFramework.LogInformation($"   result: ({string.Join(", ", result)})");
+                TestLibrary.TestFramework.LogInformation(string.Empty);
+
+                Succeeded = false;
+            }
+        }
+
+        private void ValidateConditionalSelectResult_TrueValue({RetVectorType}<{RetBaseType}> maskOp, {Op1VectorType}<{Op1BaseType}> op1, {Op2BaseType}* op2, {Op3VectorType}<{Op3BaseType}> op3, {RetVectorType}<{RetBaseType}> falseOp, void* result, [CallerMemberName] string method = "")
+        {
+            {RetBaseType}[] maskArray = new {RetBaseType}[RetElementCount];
+            {Op1BaseType}[] op1Array = new {Op1BaseType}[Op1ElementCount];
+            byte[] op2Array = new byte[Unsafe.SizeOf<{Op2BaseType}>() * Op2ElementCount];
+            {Op3BaseType}[] op3Array = new {Op3BaseType}[Op3ElementCount];
+            {RetBaseType}[] falseValArray = new {RetBaseType}[RetElementCount];
+            {RetBaseType}[] resultArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.WriteUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref maskArray[0]), maskOp);
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref op1Array[0]), op1);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<byte, byte>(ref op2Array[0]), ref Unsafe.AsRef<byte>(op2), (uint)(Unsafe.SizeOf<{Op2BaseType}>() * Op2ElementCount));
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op3BaseType}, byte>(ref op3Array[0]), op3);
+            Unsafe.WriteUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref falseValArray[0]), falseOp);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref resultArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateConditionalSelectResult_TrueValue(maskArray, op1Array, op2Array, op3Array, falseValArray, resultArray, method);
+        }
+
+        private void ValidateConditionalSelectResult_TrueValue({RetBaseType}[] maskOp, {Op1BaseType}[] firstOp, byte[] secondOp, {Op3BaseType}[] thirdOp, {RetBaseType}[] falseOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
+        {
+            bool succeeded = true;
+
+            for (var i = 0; i < RetElementCount; i++)
+            {
+                {RetBaseType} element = Helpers.Load{RetBaseType}FromByteArray(secondOp, thirdOp[i]);
+                {RetBaseType} gatherResult = ({RetBaseType})(firstOp[i] == 0 ? 0 : element);
+                {RetBaseType} iterResult = (maskOp[i] != 0) ? gatherResult : falseOp[i];
+                if (iterResult != result[i])
+                {
+                    succeeded = false;
+                    break;
+                }
+            }
+
+            if (!succeeded)
+            {
+                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1BaseType}, {Op2BaseType}, {Op3BaseType}): {method} failed:");
+                TestLibrary.TestFramework.LogInformation($"   maskOp: ({string.Join(", ", maskOp)})");
+                TestLibrary.TestFramework.LogInformation($"  firstOp: ({string.Join(", ", firstOp)})");
+                TestLibrary.TestFramework.LogInformation($" secondOp: ({string.Join(", ", secondOp)})");
+                TestLibrary.TestFramework.LogInformation($"  thirdOp: ({string.Join(", ", thirdOp)})");
+                TestLibrary.TestFramework.LogInformation($"  falseOp: ({string.Join(", ", falseOp)})");
+                TestLibrary.TestFramework.LogInformation($"   result: ({string.Join(", ", result)})");
+                TestLibrary.TestFramework.LogInformation(string.Empty);
+
+                Succeeded = false;
+            }
+        }
+
+        private void ValidateConditionalSelectResult_FalseValue({RetVectorType}<{RetBaseType}> maskOp, {Op1VectorType}<{Op1BaseType}> op1, {Op2BaseType}* op2, {Op3VectorType}<{Op3BaseType}> op3, {RetVectorType}<{RetBaseType}> trueOp, void* result, [CallerMemberName] string method = "")
+        {
+            {RetBaseType}[] maskArray = new {RetBaseType}[RetElementCount];
+            {Op1BaseType}[] op1Array = new {Op1BaseType}[Op1ElementCount];
+            byte[] op2Array = new byte[Unsafe.SizeOf<{Op2BaseType}>() * Op2ElementCount];
+            {Op3BaseType}[] op3Array = new {Op3BaseType}[Op3ElementCount];
+            {RetBaseType}[] trueValArray = new {RetBaseType}[RetElementCount];
+            {RetBaseType}[] resultArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.WriteUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref maskArray[0]), maskOp);
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref op1Array[0]), op1);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<byte, byte>(ref op2Array[0]), ref Unsafe.AsRef<byte>(op2), (uint)(Unsafe.SizeOf<{Op2BaseType}>() * Op2ElementCount));
+            Unsafe.WriteUnaligned(ref Unsafe.As<{Op3BaseType}, byte>(ref op3Array[0]), op3);
+            Unsafe.WriteUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref trueValArray[0]), trueOp);
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref resultArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+
+            ValidateConditionalSelectResult_FalseValue(maskArray, op1Array, op2Array, op3Array, trueValArray, resultArray, method);
+        }
+
+        private void ValidateConditionalSelectResult_FalseValue({RetBaseType}[] maskOp, {Op1BaseType}[] firstOp, byte[] secondOp, {Op3BaseType}[] thirdOp, {RetBaseType}[] trueOp, {RetBaseType}[] result, [CallerMemberName] string method = "")
+        {
+            bool succeeded = true;
+
+            for (var i = 0; i < RetElementCount; i++)
+            {
+                {RetBaseType} element = Helpers.Load{RetBaseType}FromByteArray(secondOp, thirdOp[i]);
+                {RetBaseType} gatherResult = ({RetBaseType})(firstOp[i] == 0 ? 0 : element);
+                {RetBaseType} iterResult = (maskOp[i] != 0) ? trueOp[i] : gatherResult;
+                if (maskOp[i] != 0)
+                {
+                    if (iterResult != result[i])
+                    {
+                        succeeded = false;
+                        break;
+                    }
+                }
+            }
+
+            if (!succeeded)
+            {
+                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1BaseType}, {Op2BaseType}, {Op3BaseType}): {method} failed:");
+                TestLibrary.TestFramework.LogInformation($"   maskOp: ({string.Join(", ", maskOp)})");
+                TestLibrary.TestFramework.LogInformation($"  firstOp: ({string.Join(", ", firstOp)})");
+                TestLibrary.TestFramework.LogInformation($" secondOp: ({string.Join(", ", secondOp)})");
+                TestLibrary.TestFramework.LogInformation($"  thirdOp: ({string.Join(", ", thirdOp)})");
+                TestLibrary.TestFramework.LogInformation($"  trueOp: ({string.Join(", ", trueOp)})");
+                TestLibrary.TestFramework.LogInformation($"   result: ({string.Join(", ", result)})");
+                TestLibrary.TestFramework.LogInformation(string.Empty);
+
+                Succeeded = false;
+            }
+        }
+
+        private void ValidateFirstFaultingResult(void* op1, ref byte op2, int op2Size, void* op3, void* result, Vector<{RetBaseType}> faultResult, [CallerMemberName] string method = "")
+        {
+            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount];
+            {Op2BaseType}[] inArray2 = new {Op2BaseType}[op2Size / Unsafe.SizeOf<{Op2BaseType}>()];
+            {Op3BaseType}[] inArray3 = new {Op3BaseType}[Op3ElementCount];
+            {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
+
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), ref Unsafe.AsRef<byte>(op1), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), ref op2, (uint)(inArray2.Length * Unsafe.SizeOf<{Op2BaseType}>()));
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op3BaseType}, byte>(ref inArray3[0]), ref Unsafe.AsRef<byte>(op3), (uint)Unsafe.SizeOf<{Op3VectorType}<{Op3BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
+        
+            ValidateFirstFaultingResult(inArray1, inArray2, inArray3, outArray, faultResult, method);
+        }
+
+        private void ValidateFirstFaultingResult({Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {Op3BaseType}[] thirdOp, {RetBaseType}[] result, Vector<{RetBaseType}> faultResult, [CallerMemberName] string method = "")
+        {
+            var succeeded = Helpers.CheckGatherVectorFirstFaultingBehavior(firstOp, secondOp, thirdOp, result, faultResult);
+
+            if (!succeeded)
+            {
+                TestLibrary.TestFramework.LogInformation($"{nameof({Isa})}.{nameof({Isa}.{Method})}<{RetBaseType}>({Op1BaseType}, {Op2BaseType}, {Op3BaseType}): {method} failed:");
+                TestLibrary.TestFramework.LogInformation($"       firstOp: ({string.Join(", ", firstOp)})");
+                TestLibrary.TestFramework.LogInformation($"      secondOp: ({string.Join(", ", secondOp)})");
+                TestLibrary.TestFramework.LogInformation($"       thirdOp: ({string.Join(", ", thirdOp)})");
+                TestLibrary.TestFramework.LogInformation($"        result: ({string.Join(", ", result)})");
+                TestLibrary.TestFramework.LogInformation($"   faultResult: ({faultResult})");
+                TestLibrary.TestFramework.LogInformation(string.Empty);
+
+                Succeeded = false;
+            }
+        }
+    }
+}
\ No newline at end of file

From 7fc3b217f223c22df64a3a472d4eefa50cb55fd8 Mon Sep 17 00:00:00 2001
From: "Aman Khalid (from Dev Box)" <amankhalid@microsoft.com>
Date: Tue, 23 Jul 2024 12:24:01 -0400
Subject: [PATCH 22/24] Fix tests

---
 .../GenerateHWIntrinsicTests_Arm.cs           |  8 ++--
 ...therVectorByteOffsetFirstFaulting.template | 45 +++++++++++++++----
 2 files changed, 40 insertions(+), 13 deletions(-)

diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
index 640fd1bb23d641..983fb43e2add02 100644
--- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
+++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
@@ -3665,16 +3665,16 @@
     ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_long_ulong",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "Int64",    ["GetFfrType"] = "Int64",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
     ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_ulong_ulong",                                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "UInt64",   ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
 
-    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_float_int",                                                              ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",                                        ["GetFfrType"] = "Byte",        ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_float_int",                                                              ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",                                        ["GetFfrType"] = "UInt32",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
     ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_int",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",                                        ["GetFfrType"] = "Int32",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
     ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_uint_int",                                                               ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",                                        ["GetFfrType"] = "UInt32",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
-    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_float_uint",                                                             ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32",                                       ["GetFfrType"] = "Byte",        ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_float_uint",                                                             ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32",                                       ["GetFfrType"] = "UInt32",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
     ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_int_uint",                                                               ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32",                                       ["GetFfrType"] = "Int32",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
     ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_uint",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32",                                       ["GetFfrType"] = "UInt32",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
-    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_double_long",                                                            ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",                                        ["GetFfrType"] = "Byte",        ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_double_long",                                                            ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",                                        ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
     ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_long",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",                                        ["GetFfrType"] = "Int64",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
     ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_ulong_long",                                                             ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",                                        ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
-    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_double_ulong",                                                           ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64",                                       ["GetFfrType"] = "Byte",        ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_double_ulong",                                                           ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64",                                       ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
     ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_long_ulong",                                                             ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64",                                       ["GetFfrType"] = "Int64",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
     ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_ulong",                                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64",                                       ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
 
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorByteOffsetFirstFaulting.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorByteOffsetFirstFaulting.template
index c254d6958d9662..54dd928ccbd5e7 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorByteOffsetFirstFaulting.template
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorByteOffsetFirstFaulting.template
@@ -286,18 +286,44 @@ namespace JIT.HardwareIntrinsics.Arm
             ref var op2Ref = ref (_dataTable.inBounded.Span.GetPinnableReference());
             var op3 = {LoadIsa}.Load{Op3VectorType}(loadMask3, ({Op3BaseType}*)(_dataTable.inArray3Ptr));
 
+            // We know this is outside the bounds because 'inBounded' will never be the full size of a Vector<T>.
+            var outsideBoundsIndex = ({Op3BaseType})(Vector<{Op2BaseType}>.Count - 1);
+
             // When testing first-faulting behavior, we need to make sure we can get the first element.
             // So set the first active element of the index vector to 0.
+            var firstActiveElement = -1;
             for (var i = 0; i < Vector<{Op3BaseType}>.Count; i++)
             {
                 // op1 is the mask for GatherVector.
                 if (op1[i] != 0)
                 {
-                    op3 = op3.WithElement<{Op3BaseType}>(i, 0);
-                    break;
+                    if (firstActiveElement == -1)
+                    {
+                        op3 = op3.WithElement<{Op3BaseType}>(i, 0);
+                        firstActiveElement = i;
+                    }
+                    else if (op3[i] < 0 || op3[i] > (outsideBoundsIndex * sizeof({Op2BaseType})))
+                    {
+                        op3 = op3.WithElement<{Op3BaseType}>(i, (outsideBoundsIndex * sizeof({Op2BaseType})));
+                    }
                 }
             }
 
+            // Force at least one element to cause a fault (required for testing). So set the last element to an index outside the bounds.
+            var lastIndex = Vector<{Op3BaseType}>.Count - 1;
+
+            // Ensure we at least have one element that we can read.
+            if ((firstActiveElement == -1) || (firstActiveElement == lastIndex))
+            {
+                op1 = op1.WithElement<{Op1BaseType}>(0, 1);
+                op3 = op3.WithElement<{Op3BaseType}>(0, 0);
+            }
+
+            op1 = op1.WithElement<{Op1BaseType}>(lastIndex, 1);
+
+            // Force an index outside the bounds.
+            op3 = op3.WithElement<{Op3BaseType}>(lastIndex, (outsideBoundsIndex * sizeof({Op2BaseType})));
+
             Sve.SetFfr(Sve.CreateTrueMaskByte(SveMaskPattern.All));
             var result = {Isa}.{Method}(
                 op1,
@@ -306,10 +332,11 @@ namespace JIT.HardwareIntrinsics.Arm
             );
             var faultResult = Sve.GetFfr{GetFfrType}();
 
+            ref var op1Ref = ref op1;
             ref var op3Ref = ref op3;
 
             Unsafe.Write(_dataTable.outArrayPtr, result);
-            ValidateFirstFaultingResult(_dataTable.inArray1Ptr, ref op2Ref, _dataTable.inBounded.Span.Length, Unsafe.AsPointer(ref op3Ref), _dataTable.outArrayPtr, faultResult.As<{GetFfrType}, {RetBaseType}>());
+            ValidateFirstFaultingResult(Unsafe.AsPointer(ref op1Ref), ref op2Ref, _dataTable.inBounded.Span.Length, Unsafe.AsPointer(ref op3Ref), _dataTable.outArrayPtr, faultResult);
         }
 
         public void RunBasicScenario_FalseMask()
@@ -701,22 +728,22 @@ namespace JIT.HardwareIntrinsics.Arm
             }
         }
 
-        private void ValidateFirstFaultingResult(void* op1, ref byte op2, int op2Size, void* op3, void* result, Vector<{RetBaseType}> faultResult, [CallerMemberName] string method = "")
+        private void ValidateFirstFaultingResult(void* op1, ref byte op2, int op2Size, void* op3, void* result, Vector<{GetFfrType}> faultResult, [CallerMemberName] string method = "")
         {
-            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Op1ElementCount];
+            {Op1BaseType}[] inArray1 = new {Op1BaseType}[Vector<{Op1BaseType}>.Count];
             {Op2BaseType}[] inArray2 = new {Op2BaseType}[op2Size / Unsafe.SizeOf<{Op2BaseType}>()];
-            {Op3BaseType}[] inArray3 = new {Op3BaseType}[Op3ElementCount];
+            {Op3BaseType}[] inArray3 = new {Op3BaseType}[Vector<{Op3BaseType}>.Count];
             {RetBaseType}[] outArray = new {RetBaseType}[RetElementCount];
 
-            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), ref Unsafe.AsRef<byte>(op1), (uint)Unsafe.SizeOf<{Op1VectorType}<{Op1BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op1BaseType}, byte>(ref inArray1[0]), ref Unsafe.AsRef<byte>(op1), (uint)(inArray1.Length * Unsafe.SizeOf<{Op1BaseType}>()));
             Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op2BaseType}, byte>(ref inArray2[0]), ref op2, (uint)(inArray2.Length * Unsafe.SizeOf<{Op2BaseType}>()));
-            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op3BaseType}, byte>(ref inArray3[0]), ref Unsafe.AsRef<byte>(op3), (uint)Unsafe.SizeOf<{Op3VectorType}<{Op3BaseType}>>());
+            Unsafe.CopyBlockUnaligned(ref Unsafe.As<{Op3BaseType}, byte>(ref inArray3[0]), ref Unsafe.AsRef<byte>(op3), (uint)(inArray3.Length * Unsafe.SizeOf<{Op3BaseType}>()));
             Unsafe.CopyBlockUnaligned(ref Unsafe.As<{RetBaseType}, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<{RetVectorType}<{RetBaseType}>>());
         
             ValidateFirstFaultingResult(inArray1, inArray2, inArray3, outArray, faultResult, method);
         }
 
-        private void ValidateFirstFaultingResult({Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {Op3BaseType}[] thirdOp, {RetBaseType}[] result, Vector<{RetBaseType}> faultResult, [CallerMemberName] string method = "")
+        private void ValidateFirstFaultingResult({Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {Op3BaseType}[] thirdOp, {RetBaseType}[] result, Vector<{GetFfrType}> faultResult, [CallerMemberName] string method = "")
         {
             var succeeded = Helpers.CheckGatherVectorFirstFaultingBehavior(firstOp, secondOp, thirdOp, result, faultResult);
 

From 7ac278764db696b6a140ba1723f7d544349c49bc Mon Sep 17 00:00:00 2001
From: "Aman Khalid (from Dev Box)" <amankhalid@microsoft.com>
Date: Tue, 23 Jul 2024 12:36:45 -0400
Subject: [PATCH 23/24] Remove log

---
 src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
index 3e3be735b1ec83..c7ca861fbcb0a5 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
@@ -8569,7 +8569,6 @@ private static bool CheckGatherVectorBehaviorCore<T, ExtendedElementT, Index>(T[
                 gatherResult = map(i, gatherResult);
                 if (result[i] != gatherResult)
                 {
-                    Console.WriteLine($"API: {result[i]}, helper: {gatherResult}");
                     return false;
                 }
             }

From aa8b720eb70e845754ec229611f833ac70dd6e42 Mon Sep 17 00:00:00 2001
From: "Aman Khalid (from Dev Box)" <amankhalid@microsoft.com>
Date: Tue, 23 Jul 2024 19:42:24 -0400
Subject: [PATCH 24/24] Fix validation

---
 .../GenerateHWIntrinsicTests_Arm.cs           | 24 ++---
 .../HardwareIntrinsics/Arm/Shared/Helpers.cs  | 88 +++++++++++++++++++
 ...therVectorByteOffsetFirstFaulting.template |  8 +-
 3 files changed, 104 insertions(+), 16 deletions(-)

diff --git a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
index 983fb43e2add02..267ce261ce2884 100644
--- a/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
+++ b/src/tests/Common/GenerateHWIntrinsicTests/GenerateHWIntrinsicTests_Arm.cs
@@ -3665,18 +3665,18 @@
     ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_long_ulong",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "Int64",    ["GetFfrType"] = "Int64",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
     ("SveGatherVectorFirstFaultingIndices.template",   new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorFirstFaulting_Indices_ulong_ulong",                                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorFirstFaulting",                                                         ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64", ["ExtendedElementType"] = "UInt64",   ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
 
-    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_float_int",                                                              ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",                                        ["GetFfrType"] = "UInt32",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
-    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_int",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",                                        ["GetFfrType"] = "Int32",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
-    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_uint_int",                                                               ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",                                        ["GetFfrType"] = "UInt32",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
-    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_float_uint",                                                             ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32",                                       ["GetFfrType"] = "UInt32",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
-    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_int_uint",                                                               ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32",                                       ["GetFfrType"] = "Int32",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
-    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_uint",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32",                                       ["GetFfrType"] = "UInt32",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()"}),
-    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_double_long",                                                            ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",                                        ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
-    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_long",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",                                        ["GetFfrType"] = "Int64",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
-    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_ulong_long",                                                             ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",                                        ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()"}),
-    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_double_ulong",                                                           ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64",                                       ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
-    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_long_ulong",                                                             ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64",                                       ["GetFfrType"] = "Int64",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
-    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_ulong",                                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64",                                       ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()"}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_float_int",                                                              ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",                                        ["GetFfrType"] = "UInt32",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["ConvertFunc"] = "BitConverter.SingleToInt32Bits"}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_int",                                                                    ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",                                        ["GetFfrType"] = "Int32",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["ConvertFunc"] = ""}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_uint_int",                                                               ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",                                        ["GetFfrType"] = "UInt32",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()", ["ConvertFunc"] = ""}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_float_uint",                                                             ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32",                                       ["GetFfrType"] = "UInt32",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["ConvertFunc"] = "BitConverter.SingleToInt32Bits"}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_int_uint",                                                               ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32",                                       ["GetFfrType"] = "Int32",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["ConvertFunc"] = ""}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_uint",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt32",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt32",                                  ["Op2BaseType"] = "UInt32", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt32",                                       ["GetFfrType"] = "UInt32",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt32()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt32()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt32()", ["ConvertFunc"] = ""}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_double_long",                                                            ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",                                        ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()", ["ConvertFunc"] = "BitConverter.DoubleToInt64Bits"}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_long",                                                                   ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",                                        ["GetFfrType"] = "Int64",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()", ["ConvertFunc"] = ""}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_ulong_long",                                                             ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int64",                                        ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetInt64()", ["ConvertFunc"] = ""}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_double_ulong",                                                           ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Double",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Double",                                  ["Op2BaseType"] = "Double", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64",                                       ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskDouble()",      ["NextValueOp2"] = "TestLibrary.Generator.GetDouble()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()", ["ConvertFunc"] = "BitConverter.DoubleToInt64Bits"}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_long_ulong",                                                             ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int64",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int64",                                   ["Op2BaseType"] = "Int64",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64",                                       ["GetFfrType"] = "Int64",       ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt64()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt64()",                     ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()", ["ConvertFunc"] = ""}),
+    ("SveGatherVectorByteOffsetFirstFaulting.template",new Dictionary<string, string> { ["TestName"] = "Sve_GatherVectorWithByteOffsetFirstFaulting_ulong",                                                                  ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsetFirstFaulting",                                           ["RetVectorType"] = "Vector",    ["RetBaseType"] = "UInt64",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "UInt64",                                  ["Op2BaseType"] = "UInt64", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "UInt64",                                       ["GetFfrType"] = "UInt64",      ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskUInt64()",      ["NextValueOp2"] = "TestLibrary.Generator.GetUInt64()",                    ["NextValueOp3"] = "TestLibrary.Generator.GetUInt64()", ["ConvertFunc"] = ""}),
 
     ("SveGatherVectorByteOffsets.template",new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorWithByteOffsets_float_int",                                                             ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsets",                                          ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Single",  ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Single",                                  ["Op2BaseType"] = "Single", ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Byte",   ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskSingle()",      ["NextValueOp2"] = "TestLibrary.Generator.GetSingle()",       ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
     ("SveGatherVectorByteOffsets.template",new Dictionary<string, string> {["TestName"] = "Sve_GatherVectorWithByteOffsets_int_int",                                                               ["Isa"] = "Sve",           ["LoadIsa"] = "Sve",     ["Method"] = "GatherVectorWithByteOffsets",                                          ["RetVectorType"] = "Vector",    ["RetBaseType"] = "Int32",   ["Op1VectorType"] = "Vector",    ["Op1BaseType"] = "Int32",                                   ["Op2BaseType"] = "Int32",  ["Op3VectorType"] = "Vector",    ["Op3BaseType"] = "Int32",  ["ExtendedElementType"] = "Byte",   ["LargestVectorSize"] = "64", ["NextValueOp1"] = "Helpers.getMaskInt32()",       ["NextValueOp2"] = "TestLibrary.Generator.GetInt32()",        ["NextValueOp3"] = "TestLibrary.Generator.GetInt32()"}),
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
index c7ca861fbcb0a5..eff2e1a9433c8c 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/Helpers.cs
@@ -8558,6 +8558,47 @@ private static unsafe T GetGatherVectorBasesResultByIndex<T, AddressT, ExtendedE
             return (mask[index] == T.Zero) ? T.Zero : T.CreateTruncating(*(ExtendedElementT*)Unsafe.BitCast<AddressT, nint>(data[index]));
         }
 
+        private static bool GetGatherVectorResultByByteOffset<T, Offset>(int index, T[] mask, byte[] data, Offset[] offsets, T result)
+                where T : INumberBase<T>
+                where Offset : IBinaryInteger<Offset>
+        {
+            if (mask[index] == T.Zero)
+            {
+                return result == T.Zero;
+            }
+
+            int offset = int.CreateChecked(offsets[index]);
+
+            if (typeof(T) == typeof(int))
+            {
+                return result == T.CreateTruncating(LoadInt32FromByteArray(data, offset));
+            }
+            else if (typeof(T) == typeof(uint))
+            {
+                return result == T.CreateTruncating(LoadUInt32FromByteArray(data, offset));
+            }
+            else if (typeof(T) == typeof(long))
+            {
+                return result == T.CreateTruncating(LoadInt64FromByteArray(data, offset));
+            }
+            else if (typeof(T) == typeof(ulong))
+            {
+                return result == T.CreateTruncating(LoadUInt64FromByteArray(data, offset));
+            }
+            else if (typeof(T) == typeof(float))
+            {
+                return BitConverter.SingleToInt32Bits((float)(object)result) == LoadInt32FromByteArray(data, offset);
+            }
+            else if (typeof(T) == typeof(double))
+            {
+                return BitConverter.DoubleToInt64Bits((double)(object)result) == LoadInt64FromByteArray(data, offset);
+            }
+            else
+            {
+                return false;
+            }
+        }
+
         private static bool CheckGatherVectorBehaviorCore<T, ExtendedElementT, Index>(T[] mask, ExtendedElementT[] data, Index[] indices, T[] result, Func<int, T, T> map) 
                 where T : INumberBase<T>
                 where ExtendedElementT : INumberBase<ExtendedElementT> 
@@ -8809,6 +8850,53 @@ public static bool CheckGatherVectorBasesFirstFaultingBehavior<T, AddressT, Exte
             return CheckFirstFaultingBehaviorCore(result, faultResult, i => GetGatherVectorBasesResultByIndex<T, AddressT, ExtendedElementT>(i, mask, data) == result[i]);
         }
         
+        public static bool CheckGatherVectorWithByteOffsetFirstFaultingBehavior<T, ExtendedElementT, Offset, TFault>(T[] mask, ExtendedElementT[] data, Offset[] offsets, T[] result, Vector<TFault> faultResult)
+                where T : INumberBase<T>
+                where ExtendedElementT : INumberBase<ExtendedElementT>
+                where Offset : IBinaryInteger<Offset>
+                where TFault : INumberBase<TFault>
+        {
+            // Checking first faulting behavior requires at least one zero to ensure we are testing the behavior.
+            if (!CheckFaultResultHasAtLeastOneZero(faultResult))
+            {
+                TestLibrary.TestFramework.LogInformation("Fault result requires at least one zero.");
+                return false;
+            }
+
+            var hasFaulted = false;
+            var expectedFaultResult =
+                InitVector<TFault>(i =>
+                {
+                    if (hasFaulted)
+                    {
+                        return TFault.Zero;
+                    }
+
+                    if (mask[i] == T.Zero)
+                    {
+                        return TFault.One;
+                    }
+
+                    var offset = int.CreateChecked(offsets[i]);
+                    var endOffset = data.Length * Unsafe.SizeOf<ExtendedElementT>();
+                    if (offset < 0 || offset >= endOffset)
+                    {
+                        hasFaulted = true;
+                        return TFault.Zero;
+                    }
+                    return TFault.One;
+                });
+            if (expectedFaultResult != faultResult)
+            {
+                TestLibrary.TestFramework.LogInformation($"Expected fault result: {expectedFaultResult}\nActual fault result: {faultResult}");
+                return false;
+            }
+
+            byte[] bytes = new byte[data.Length * Unsafe.SizeOf<ExtendedElementT>()];
+            Buffer.BlockCopy(data, 0, bytes, 0, bytes.Length);
+            return CheckFirstFaultingBehaviorCore(result, faultResult, i => GetGatherVectorResultByByteOffset<T, Offset>(i, mask, bytes, offsets, result[i]));
+        }
+
         public static T[] CreateBreakPropagateMask<T>(T[] op1, T[] op2) where T : IBinaryInteger<T>
         {
             var count = op1.Length;
diff --git a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorByteOffsetFirstFaulting.template b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorByteOffsetFirstFaulting.template
index 54dd928ccbd5e7..6cb1706098a507 100644
--- a/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorByteOffsetFirstFaulting.template
+++ b/src/tests/JIT/HardwareIntrinsics/Arm/Shared/SveGatherVectorByteOffsetFirstFaulting.template
@@ -549,7 +549,7 @@ namespace JIT.HardwareIntrinsics.Arm
             {
                 {RetBaseType} element = Helpers.Load{RetBaseType}FromByteArray(secondOp, thirdOp[i]);
                 {RetBaseType} gatherResult = ({RetBaseType})(firstOp[i] == 0 ? 0 : element);
-                if (result[i] != gatherResult)
+                if ({ConvertFunc}(result[i]) != {ConvertFunc}(gatherResult))
                 {
                     succeeded = false;
                     break;
@@ -653,7 +653,7 @@ namespace JIT.HardwareIntrinsics.Arm
                 {RetBaseType} element = Helpers.Load{RetBaseType}FromByteArray(secondOp, thirdOp[i]);
                 {RetBaseType} gatherResult = ({RetBaseType})(firstOp[i] == 0 ? 0 : element);
                 {RetBaseType} iterResult = (maskOp[i] != 0) ? gatherResult : falseOp[i];
-                if (iterResult != result[i])
+                if ({ConvertFunc}(iterResult) != {ConvertFunc}(result[i]))
                 {
                     succeeded = false;
                     break;
@@ -705,7 +705,7 @@ namespace JIT.HardwareIntrinsics.Arm
                 {RetBaseType} iterResult = (maskOp[i] != 0) ? trueOp[i] : gatherResult;
                 if (maskOp[i] != 0)
                 {
-                    if (iterResult != result[i])
+                    if ({ConvertFunc}(iterResult) != {ConvertFunc}(result[i]))
                     {
                         succeeded = false;
                         break;
@@ -745,7 +745,7 @@ namespace JIT.HardwareIntrinsics.Arm
 
         private void ValidateFirstFaultingResult({Op1BaseType}[] firstOp, {Op2BaseType}[] secondOp, {Op3BaseType}[] thirdOp, {RetBaseType}[] result, Vector<{GetFfrType}> faultResult, [CallerMemberName] string method = "")
         {
-            var succeeded = Helpers.CheckGatherVectorFirstFaultingBehavior(firstOp, secondOp, thirdOp, result, faultResult);
+            var succeeded = Helpers.CheckGatherVectorWithByteOffsetFirstFaultingBehavior(firstOp, secondOp, thirdOp, result, faultResult);
 
             if (!succeeded)
             {