diff --git a/Eigen/src/Core/arch/SVE/PacketMath.h b/Eigen/src/Core/arch/SVE/PacketMath.h
index 3f847a9..924f897 100644
--- a/Eigen/src/Core/arch/SVE/PacketMath.h
+++ b/Eigen/src/Core/arch/SVE/PacketMath.h
@@ -86,22 +86,22 @@
 EIGEN_STRONG_INLINE PacketXi plset<PacketXi>(const numext::int32_t& a) {
   numext::int32_t c[packet_traits<numext::int32_t>::size];
   for (int i = 0; i < packet_traits<numext::int32_t>::size; i++) c[i] = i;
-  return svadd_s32_z(svptrue_b32(), pset1<PacketXi>(a), svld1_s32(svptrue_b32(), c));
+  return svadd_s32_x(svptrue_b32(), pset1<PacketXi>(a), svld1_s32(svptrue_b32(), c));
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXi padd<PacketXi>(const PacketXi& a, const PacketXi& b) {
-  return svadd_s32_z(svptrue_b32(), a, b);
+  return svadd_s32_x(svptrue_b32(), a, b);
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXi psub<PacketXi>(const PacketXi& a, const PacketXi& b) {
-  return svsub_s32_z(svptrue_b32(), a, b);
+  return svsub_s32_x(svptrue_b32(), a, b);
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXi pnegate(const PacketXi& a) {
-  return svneg_s32_z(svptrue_b32(), a);
+  return svneg_s32_x(svptrue_b32(), a);
 }
 
 template <>
@@ -111,27 +111,27 @@
 
 template <>
 EIGEN_STRONG_INLINE PacketXi pmul<PacketXi>(const PacketXi& a, const PacketXi& b) {
-  return svmul_s32_z(svptrue_b32(), a, b);
+  return svmul_s32_x(svptrue_b32(), a, b);
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXi pdiv<PacketXi>(const PacketXi& a, const PacketXi& b) {
-  return svdiv_s32_z(svptrue_b32(), a, b);
+  return svdiv_s32_x(svptrue_b32(), a, b);
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXi pmadd(const PacketXi& a, const PacketXi& b, const PacketXi& c) {
-  return svmla_s32_z(svptrue_b32(), c, a, b);
+  return svmla_s32_x(svptrue_b32(), c, a, b);
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXi pmin<PacketXi>(const PacketXi& a, const PacketXi& b) {
-  return svmin_s32_z(svptrue_b32(), a, b);
+  return svmin_s32_x(svptrue_b32(), a, b);
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXi pmax<PacketXi>(const PacketXi& a, const PacketXi& b) {
-  return svmax_s32_z(svptrue_b32(), a, b);
+  return svmax_s32_x(svptrue_b32(), a, b);
 }
 
 template <>
@@ -151,47 +151,47 @@
 
 template <>
 EIGEN_STRONG_INLINE PacketXi ptrue<PacketXi>(const PacketXi& /*a*/) {
-  return svdup_n_s32_z(svptrue_b32(), 0xffffffffu);
+  return svdup_n_s32_x(svptrue_b32(), 0xffffffffu);
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXi pzero<PacketXi>(const PacketXi& /*a*/) {
-  return svdup_n_s32_z(svptrue_b32(), 0);
+  return svdup_n_s32_x(svptrue_b32(), 0);
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXi pand<PacketXi>(const PacketXi& a, const PacketXi& b) {
-  return svand_s32_z(svptrue_b32(), a, b);
+  return svand_s32_x(svptrue_b32(), a, b);
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXi por<PacketXi>(const PacketXi& a, const PacketXi& b) {
-  return svorr_s32_z(svptrue_b32(), a, b);
+  return svorr_s32_x(svptrue_b32(), a, b);
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXi pxor<PacketXi>(const PacketXi& a, const PacketXi& b) {
-  return sveor_s32_z(svptrue_b32(), a, b);
+  return sveor_s32_x(svptrue_b32(), a, b);
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXi pandnot<PacketXi>(const PacketXi& a, const PacketXi& b) {
-  return svbic_s32_z(svptrue_b32(), a, b);
+  return svbic_s32_x(svptrue_b32(), a, b);
 }
 
 template <int N>
 EIGEN_STRONG_INLINE PacketXi parithmetic_shift_right(PacketXi a) {
-  return svasrd_n_s32_z(svptrue_b32(), a, N);
+  return svasrd_n_s32_x(svptrue_b32(), a, N);
 }
 
 template <int N>
 EIGEN_STRONG_INLINE PacketXi plogical_shift_right(PacketXi a) {
-  return svreinterpret_s32_u32(svlsr_n_u32_z(svptrue_b32(), svreinterpret_u32_s32(a), N));
+  return svreinterpret_s32_u32(svlsr_n_u32_x(svptrue_b32(), svreinterpret_u32_s32(a), N));
 }
 
 template <int N>
 EIGEN_STRONG_INLINE PacketXi plogical_shift_left(PacketXi a) {
-  return svlsl_n_s32_z(svptrue_b32(), a, N);
+  return svlsl_n_s32_x(svptrue_b32(), a, N);
 }
 
 template <>
@@ -257,7 +257,7 @@
 
 template <>
 EIGEN_STRONG_INLINE PacketXi pabs(const PacketXi& a) {
-  return svabs_s32_z(svptrue_b32(), a);
+  return svabs_s32_x(svptrue_b32(), a);
 }
 
 template <>
@@ -270,29 +270,29 @@
   EIGEN_STATIC_ASSERT((EIGEN_ARM64_SVE_VL % 128 == 0), EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT);
 
   // Multiply the vector by its reverse
-  svint32_t prod = svmul_s32_z(svptrue_b32(), a, svrev_s32(a));
+  svint32_t prod = svmul_s32_x(svptrue_b32(), a, svrev_s32(a));
   svint32_t half_prod;
 
   // Extract the high half of the vector. Depending on the VL more reductions need to be done
   if (EIGEN_ARM64_SVE_VL >= 2048) {
     half_prod = svtbl_s32(prod, svindex_u32(32, 1));
-    prod = svmul_s32_z(svptrue_b32(), prod, half_prod);
+    prod = svmul_s32_x(svptrue_b32(), prod, half_prod);
   }
   if (EIGEN_ARM64_SVE_VL >= 1024) {
     half_prod = svtbl_s32(prod, svindex_u32(16, 1));
-    prod = svmul_s32_z(svptrue_b32(), prod, half_prod);
+    prod = svmul_s32_x(svptrue_b32(), prod, half_prod);
   }
   if (EIGEN_ARM64_SVE_VL >= 512) {
     half_prod = svtbl_s32(prod, svindex_u32(8, 1));
-    prod = svmul_s32_z(svptrue_b32(), prod, half_prod);
+    prod = svmul_s32_x(svptrue_b32(), prod, half_prod);
   }
   if (EIGEN_ARM64_SVE_VL >= 256) {
     half_prod = svtbl_s32(prod, svindex_u32(4, 1));
-    prod = svmul_s32_z(svptrue_b32(), prod, half_prod);
+    prod = svmul_s32_x(svptrue_b32(), prod, half_prod);
   }
   // Last reduction
   half_prod = svtbl_s32(prod, svindex_u32(2, 1));
-  prod = svmul_s32_z(svptrue_b32(), prod, half_prod);
+  prod = svmul_s32_x(svptrue_b32(), prod, half_prod);
 
   // The reduction is done to the first element.
   return pfirst<PacketXi>(prod);
@@ -386,29 +386,29 @@
 
 template <>
 EIGEN_STRONG_INLINE PacketXf pset1frombits<PacketXf>(numext::uint32_t from) {
-  return svreinterpret_f32_u32(svdup_n_u32_z(svptrue_b32(), from));
+  return svreinterpret_f32_u32(svdup_n_u32_x(svptrue_b32(), from));
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXf plset<PacketXf>(const float& a) {
   float c[packet_traits<float>::size];
   for (int i = 0; i < packet_traits<float>::size; i++) c[i] = i;
-  return svadd_f32_z(svptrue_b32(), pset1<PacketXf>(a), svld1_f32(svptrue_b32(), c));
+  return svadd_f32_x(svptrue_b32(), pset1<PacketXf>(a), svld1_f32(svptrue_b32(), c));
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXf padd<PacketXf>(const PacketXf& a, const PacketXf& b) {
-  return svadd_f32_z(svptrue_b32(), a, b);
+  return svadd_f32_x(svptrue_b32(), a, b);
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXf psub<PacketXf>(const PacketXf& a, const PacketXf& b) {
-  return svsub_f32_z(svptrue_b32(), a, b);
+  return svsub_f32_x(svptrue_b32(), a, b);
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXf pnegate(const PacketXf& a) {
-  return svneg_f32_z(svptrue_b32(), a);
+  return svneg_f32_x(svptrue_b32(), a);
 }
 
 template <>
@@ -418,22 +418,22 @@
 
 template <>
 EIGEN_STRONG_INLINE PacketXf pmul<PacketXf>(const PacketXf& a, const PacketXf& b) {
-  return svmul_f32_z(svptrue_b32(), a, b);
+  return svmul_f32_x(svptrue_b32(), a, b);
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXf pdiv<PacketXf>(const PacketXf& a, const PacketXf& b) {
-  return svdiv_f32_z(svptrue_b32(), a, b);
+  return svdiv_f32_x(svptrue_b32(), a, b);
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXf pmadd(const PacketXf& a, const PacketXf& b, const PacketXf& c) {
-  return svmla_f32_z(svptrue_b32(), c, a, b);
+  return svmla_f32_x(svptrue_b32(), c, a, b);
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXf pmin<PacketXf>(const PacketXf& a, const PacketXf& b) {
-  return svmin_f32_z(svptrue_b32(), a, b);
+  return svmin_f32_x(svptrue_b32(), a, b);
 }
 
 template <>
@@ -443,12 +443,12 @@
 
 template <>
 EIGEN_STRONG_INLINE PacketXf pmin<PropagateNumbers, PacketXf>(const PacketXf& a, const PacketXf& b) {
-  return svminnm_f32_z(svptrue_b32(), a, b);
+  return svminnm_f32_x(svptrue_b32(), a, b);
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXf pmax<PacketXf>(const PacketXf& a, const PacketXf& b) {
-  return svmax_f32_z(svptrue_b32(), a, b);
+  return svmax_f32_x(svptrue_b32(), a, b);
 }
 
 template <>
@@ -458,7 +458,7 @@
 
 template <>
 EIGEN_STRONG_INLINE PacketXf pmax<PropagateNumbers, PacketXf>(const PacketXf& a, const PacketXf& b) {
-  return svmaxnm_f32_z(svptrue_b32(), a, b);
+  return svmaxnm_f32_x(svptrue_b32(), a, b);
 }
 
 // Float comparisons in SVE return svbool (predicate). Use svdup to set active
@@ -478,43 +478,43 @@
   return svreinterpret_f32_u32(svdup_n_u32_z(svcmpeq_f32(svptrue_b32(), a, b), 0xffffffffu));
 }
 
-// Do a predicate inverse (svnot_b_z) on the predicate resulted from the
+// Do a predicate inverse (svnot_b_x) on the predicate resulted from the
 // greater/equal comparison (svcmpge_f32). Then fill a float vector with the
 // active elements.
 template <>
 EIGEN_STRONG_INLINE PacketXf pcmp_lt_or_nan<PacketXf>(const PacketXf& a, const PacketXf& b) {
-  return svreinterpret_f32_u32(svdup_n_u32_z(svnot_b_z(svptrue_b32(), svcmpge_f32(svptrue_b32(), a, b)), 0xffffffffu));
+  return svreinterpret_f32_u32(svdup_n_u32_z(svnot_b_x(svptrue_b32(), svcmpge_f32(svptrue_b32(), a, b)), 0xffffffffu));
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXf pfloor<PacketXf>(const PacketXf& a) {
-  return svrintm_f32_z(svptrue_b32(), a);
+  return svrintm_f32_x(svptrue_b32(), a);
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXf ptrue<PacketXf>(const PacketXf& /*a*/) {
-  return svreinterpret_f32_u32(svdup_n_u32_z(svptrue_b32(), 0xffffffffu));
+  return svreinterpret_f32_u32(svdup_n_u32_x(svptrue_b32(), 0xffffffffu));
 }
 
 // Logical Operations are not supported for float, so reinterpret casts
 template <>
 EIGEN_STRONG_INLINE PacketXf pand<PacketXf>(const PacketXf& a, const PacketXf& b) {
-  return svreinterpret_f32_u32(svand_u32_z(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(b)));
+  return svreinterpret_f32_u32(svand_u32_x(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(b)));
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXf por<PacketXf>(const PacketXf& a, const PacketXf& b) {
-  return svreinterpret_f32_u32(svorr_u32_z(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(b)));
+  return svreinterpret_f32_u32(svorr_u32_x(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(b)));
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXf pxor<PacketXf>(const PacketXf& a, const PacketXf& b) {
-  return svreinterpret_f32_u32(sveor_u32_z(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(b)));
+  return svreinterpret_f32_u32(sveor_u32_x(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(b)));
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXf pandnot<PacketXf>(const PacketXf& a, const PacketXf& b) {
-  return svreinterpret_f32_u32(svbic_u32_z(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(b)));
+  return svreinterpret_f32_u32(svbic_u32_x(svptrue_b32(), svreinterpret_u32_f32(a), svreinterpret_u32_f32(b)));
 }
 
 template <>
@@ -579,7 +579,7 @@
 
 template <>
 EIGEN_STRONG_INLINE PacketXf pabs(const PacketXf& a) {
-  return svabs_f32_z(svptrue_b32(), a);
+  return svabs_f32_x(svptrue_b32(), a);
 }
 
 // TODO(tellenbach): Should this go into MathFunctions.h? If so, change for
@@ -601,29 +601,29 @@
 EIGEN_STRONG_INLINE float predux_mul<PacketXf>(const PacketXf& a) {
   EIGEN_STATIC_ASSERT((EIGEN_ARM64_SVE_VL % 128 == 0), EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT);
   // Multiply the vector by its reverse
-  svfloat32_t prod = svmul_f32_z(svptrue_b32(), a, svrev_f32(a));
+  svfloat32_t prod = svmul_f32_x(svptrue_b32(), a, svrev_f32(a));
   svfloat32_t half_prod;
 
   // Extract the high half of the vector. Depending on the VL more reductions need to be done
   if (EIGEN_ARM64_SVE_VL >= 2048) {
     half_prod = svtbl_f32(prod, svindex_u32(32, 1));
-    prod = svmul_f32_z(svptrue_b32(), prod, half_prod);
+    prod = svmul_f32_x(svptrue_b32(), prod, half_prod);
   }
   if (EIGEN_ARM64_SVE_VL >= 1024) {
     half_prod = svtbl_f32(prod, svindex_u32(16, 1));
-    prod = svmul_f32_z(svptrue_b32(), prod, half_prod);
+    prod = svmul_f32_x(svptrue_b32(), prod, half_prod);
   }
   if (EIGEN_ARM64_SVE_VL >= 512) {
     half_prod = svtbl_f32(prod, svindex_u32(8, 1));
-    prod = svmul_f32_z(svptrue_b32(), prod, half_prod);
+    prod = svmul_f32_x(svptrue_b32(), prod, half_prod);
   }
   if (EIGEN_ARM64_SVE_VL >= 256) {
     half_prod = svtbl_f32(prod, svindex_u32(4, 1));
-    prod = svmul_f32_z(svptrue_b32(), prod, half_prod);
+    prod = svmul_f32_x(svptrue_b32(), prod, half_prod);
   }
   // Last reduction
   half_prod = svtbl_f32(prod, svindex_u32(2, 1));
-  prod = svmul_f32_z(svptrue_b32(), prod, half_prod);
+  prod = svmul_f32_x(svptrue_b32(), prod, half_prod);
 
   // The reduction is done to the first element.
   return pfirst<PacketXf>(prod);
diff --git a/Eigen/src/Core/arch/SVE/TypeCasting.h b/Eigen/src/Core/arch/SVE/TypeCasting.h
index b451676..c7027b3 100644
--- a/Eigen/src/Core/arch/SVE/TypeCasting.h
+++ b/Eigen/src/Core/arch/SVE/TypeCasting.h
@@ -28,12 +28,12 @@
 
 template <>
 EIGEN_STRONG_INLINE PacketXf pcast<PacketXi, PacketXf>(const PacketXi& a) {
-  return svcvt_f32_s32_z(svptrue_b32(), a);
+  return svcvt_f32_s32_x(svptrue_b32(), a);
 }
 
 template <>
 EIGEN_STRONG_INLINE PacketXi pcast<PacketXf, PacketXi>(const PacketXf& a) {
-  return svcvt_s32_f32_z(svptrue_b32(), a);
+  return svcvt_s32_f32_x(svptrue_b32(), a);
 }
 
 template <>
