Update to .NET 10 RC 1

Resolves: RHEL-114568
This commit is contained in:
Omair Majid 2025-09-14 11:20:32 -04:00
parent 6a9eaf61cf
commit 29b229a63f
5 changed files with 700 additions and 24 deletions

6
.gitignore vendored
View File

@ -58,3 +58,9 @@
/dotnet-prebuilts-10.0.100-preview.6.25302.104-x64.tar.gz
/dotnet-prebuilts-10.0.100-preview.6.25358.103-ppc64le.tar.gz
/dotnet-prebuilts-10.0.100-preview.6.25358.103-s390x.tar.gz
/dotnet-10.0.100-rc.1.25451.107.tar.gz
/dotnet-10.0.100-rc.1.25451.107.tar.gz.sig
/dotnet-prebuilts-10.0.100-rc.1.25420.111-x64.tar.gz
/dotnet-prebuilts-10.0.100-rc.1.25420.111-arm64.tar.gz
/dotnet-prebuilts-10.0.100-rc.1.25451.107-ppc64le.tar.gz
/dotnet-prebuilts-10.0.100-rc.1.25451.107-s390x.tar.gz

View File

@ -1,4 +1,4 @@
%bcond_with bootstrap
%bcond_without bootstrap
# LTO triggers a compilation error for a source level issue. Given that LTO should not
# change the validity of any given source and the nature of the error (undefined enum), I
@ -14,20 +14,20 @@
# upstream can produce releases with a different tag than the SDK version
#%%global upstream_tag v%%{runtime_version}
%global upstream_tag v10.0.0-preview.6.25358.103
%global upstream_tag v10.0.100-rc.1.25451.107
%global upstream_tag_without_v %(echo %{upstream_tag} | sed -e 's|^v||')
%global hostfxr_version %{runtime_version}
%global runtime_version 10.0.0-preview.6.25358.103
%global aspnetcore_runtime_version 10.0.0-preview.6.25358.103
%global sdk_version 10.0.100-preview.6.25358.103
%global runtime_version 10.0.0-rc.1.25451.107
%global aspnetcore_runtime_version 10.0.0-rc.1.25451.107
%global sdk_version 10.0.100-rc.1.25451.107
%global sdk_feature_band_version %(echo %{sdk_version} | cut -d '-' -f 1 | sed -e 's|[[:digit:]][[:digit:]]$|00|')
%global templates_version %{aspnetcore_runtime_version}
#%%global templates_version %%(echo %%{runtime_version} | awk 'BEGIN { FS="."; OFS="." } {print $1, $2, $3+1 }')
%global runtime_rpm_version 10.0.0~preview.6.25358.103
%global aspnetcore_runtime_rpm_version 10.0.0~preview.6.25358.103
%global sdk_rpm_version 10.0.100~preview.6.25358.103
%global runtime_rpm_version 10.0.0~rc.1.25451.107
%global aspnetcore_runtime_rpm_version 10.0.0~rc.1.25451.107
%global sdk_rpm_version 10.0.100~rc.1.25451.107
%global use_bundled_brotli 0
%global use_bundled_libunwind 1
@ -77,7 +77,7 @@
Name: dotnet%{dotnetver}
Version: %{sdk_rpm_version}
Release: 0.7%{?dist}
Release: 0.8%{?dist}
Summary: .NET Runtime and SDK
License: 0BSD AND Apache-2.0 AND (Apache-2.0 WITH LLVM-exception) AND APSL-2.0 AND BSD-2-Clause AND BSD-3-Clause AND BSD-4-Clause AND BSL-1.0 AND bzip2-1.0.6 AND CC0-1.0 AND CC-BY-3.0 AND CC-BY-4.0 AND CC-PDDC AND CNRI-Python AND EPL-1.0 AND GPL-2.0-only AND (GPL-2.0-only WITH GCC-exception-2.0) AND GPL-2.0-or-later AND GPL-3.0-only AND ICU AND ISC AND LGPL-2.1-only AND LGPL-2.1-or-later AND LicenseRef-Fedora-Public-Domain AND LicenseRef-ISO-8879 AND MIT AND MIT-Wu AND MS-PL AND MS-RL AND NCSA AND OFL-1.1 AND OpenSSL AND Unicode-DFS-2015 AND Unicode-DFS-2016 AND W3C-19980720 AND X11 AND Zlib
@ -89,7 +89,7 @@ Source2: https://dotnet.microsoft.com/download/dotnet/release-key-2023.as
Source3: https://github.com/dotnet/dotnet/releases/download/%{upstream_tag}/release.json
%if %{with bootstrap}
# The bootstrap SDK version is one listed in the global.json file of the main source archive
%global bootstrap_sdk_version 10.0.100-preview.6.25302.104
%global bootstrap_sdk_version 10.0.100-rc.1.25420.111
# The source is generated on a Fedora box via:
# ./build-dotnet-bootstrap-tarball %%{upstream_tag}
Source10: dotnet-prebuilts-%{bootstrap_sdk_version}-x64.tar.gz
@ -97,7 +97,7 @@ Source11: dotnet-prebuilts-%{bootstrap_sdk_version}-arm64.tar.gz
# To generate ppc64le and s390x archives:
# 1. Build the VMR commit in cross-build mode for the architecture
# 2. Use `build-prebuilt-archive` to create the archive from the VMR
%global bootstrap_sdk_version_ppc64le_s390x 10.0.100-preview.6.25358.103
%global bootstrap_sdk_version_ppc64le_s390x 10.0.100-rc.1.25451.107
Source12: dotnet-prebuilts-%{bootstrap_sdk_version_ppc64le_s390x}-ppc64le.tar.gz
Source13: dotnet-prebuilts-%{bootstrap_sdk_version_ppc64le_s390x}-s390x.tar.gz
%endif
@ -115,6 +115,8 @@ Patch0: runtime-re-enable-implicit-rejection.patch
Patch1: runtime-openssl-sha1.patch
# fix an error caused by combining Fedora's CFLAGS with how .NET builds some assembly files
Patch2: runtime-disable-fortify-on-ilasm-parser.patch
# Add SIMD fallback paths for z13
Patch3: runtime-118376-z13-simd.patch
ExclusiveArch: aarch64 ppc64le s390x x86_64
@ -436,7 +438,7 @@ applications using the .NET SDK.
}
%dotnet_targeting_pack dotnet-apphost-pack-%{dotnetver} %{runtime_rpm_version} Microsoft.NETCore.App %{dotnetver} Microsoft.NETCore.App.Host.%{runtime_id}
%dotnet_targeting_pack dotnet-targeting-pack-%{dotnetver} %{runtime_rpm_version} Microsoft.NETCore.App %{dotnetver} Microsoft.NETCore.App.Ref
%dotnet_targeting_pack dotnet-targeting-pack-%{dotnetver} %{runtime_rpm_version} Microsoft.NETCore.App.Ref %{dotnetver} Microsoft.NETCore.App.Ref
%dotnet_targeting_pack aspnetcore-targeting-pack-%{dotnetver} %{aspnetcore_runtime_rpm_version} Microsoft.AspNetCore.App %{dotnetver} Microsoft.AspNetCore.App.Ref
@ -666,6 +668,7 @@ find -depth -name 'artifacts' -type d -print -exec rm -rf {} \;
./build.sh \
--source-only \
--release-manifest %{SOURCE3} \
--branding default \
%if %{without bootstrap}
--with-sdk previously-built-dotnet \
%endif
@ -797,8 +800,10 @@ rm %{buildroot}%{_libdir}/dotnet/ThirdPartyNotices.txt
rm %{buildroot}%{_libdir}/dotnet/dotnet
%endif
# Removed by upstream in .NET 10 RC 1
# Removed by upstream in .NET 10 RC 2
rm -r %{buildroot}%{_libdir}/dotnet/packs/NETStandard.Library.Ref/2.1.0
rmdir %{buildroot}%{_libdir}/dotnet/packs/NETStandard.Library.Ref
%check
@ -871,8 +876,6 @@ export COMPlus_LTTng=0
%dir %{_libdir}/dotnet/sdk
%dir %{_libdir}/dotnet/sdk-manifests
%{_libdir}/dotnet/sdk-manifests/%{sdk_feature_band_version}*
# FIXME is using a 8.0.100 version a bug in the SDK?
%{_libdir}/dotnet/sdk-manifests/8.0.100/
%{_libdir}/dotnet/metadata
%ifnarch %{mono_archs}
%{_libdir}/dotnet/library-packs
@ -890,6 +893,8 @@ export COMPlus_LTTng=0
%dir %{_libdir}/dotnet/packs
%dir %{_libdir}/dotnet/packs/runtime.%{runtime_id}.Microsoft.DotNet.ILCompiler/
%{_libdir}/dotnet/packs/runtime.%{runtime_id}.Microsoft.DotNet.ILCompiler/%{runtime_version}*
%dir %{_libdir}/dotnet/packs/Microsoft.NETCore.App.Runtime.NativeAOT.%{runtime_id}/
%{_libdir}/dotnet/packs/Microsoft.NETCore.App.Runtime.NativeAOT.%{runtime_id}/%{runtime_version}*
%endif
%files -n dotnet-sdk-%{dotnetver}-source-built-artifacts
@ -899,6 +904,10 @@ export COMPlus_LTTng=0
%changelog
* Sun Sep 14 2025 Omair Majid <omajid@redhat.com> - 10.0.100~preview.6.25358.103-0.8
- Update to .NET 10 RC 1
- Resolves: RHEL-114568
* Thu Sep 04 2025 Omair Majid <omajid@redhat.com> - 10.0.100~preview.6.25358.103-0.7
- Drop netstandard-targeting-pack-2.1, it's being removed by upstream in RC 1
- Related: RHEL-98673

View File

@ -1,11 +1,11 @@
{
"release": "10.0.0-preview.6",
"release": "10.0.0-rc.1",
"channel": "10.0",
"tag": "v10.0.0-preview.6.25358.103",
"sdkVersion": "10.0.100-preview.6.25358.103",
"runtimeVersion": "10.0.0-preview.6.25358.103",
"aspNetCoreVersion": "10.0.0-preview.6.25358.103",
"tag": "v10.0.100-rc.1.25451.107",
"sdkVersion": "10.0.100-rc.1.25451.107",
"runtimeVersion": "10.0.0-rc.1.25451.107",
"aspNetCoreVersion": "10.0.0-rc.1.25451.107",
"sourceRepository": "https://github.com/dotnet/dotnet",
"sourceVersion": "75972a5ba730bdaf7cf3a34f528ab0f5c7f05183",
"officialBuildId": "20250708.3"
"sourceVersion": "2db1f5ee2bdda2e8d873769325fabede32e420e0",
"officialBuildId": "20250901.7"
}

View File

@ -0,0 +1,657 @@
From 97f2fb6ab2988c03917a937cc1552356ff5f7069 Mon Sep 17 00:00:00 2001
From: saitama951 <sanjamkumar360@gmail.com>
Date: Tue, 5 Aug 2025 07:12:13 +0000
Subject: [PATCH 1/4] [S390X] Add simd fallback support for unsupported s390x
architectures
Vector facility was introduced in the z13, which majorly
introduces vector int/short/long/double variants of the
vector instructions. with the release of z14 we introduced
vector float variant as part of vector enhancement facility 1.
This patch majorly supports z13 and previous generations.
---
src/mono/mono/mini/simd-intrinsics.c | 113 +++++++++++++++++++++++--
src/mono/mono/utils/mono-hwcap-s390x.c | 1 +
src/mono/mono/utils/mono-hwcap-vars.h | 1 +
3 files changed, 109 insertions(+), 6 deletions(-)
diff --git a/src/runtime/src/mono/mono/mini/simd-intrinsics.c b/src/runtime/src/mono/mono/mini/simd-intrinsics.c
index 88143637310ef9..b8f78487cd85e6 100644
--- a/src/runtime/src/mono/mono/mini/simd-intrinsics.c
+++ b/src/runtime/src/mono/mono/mini/simd-intrinsics.c
@@ -2112,6 +2112,8 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
}
#elif defined(TARGET_S390X)
if (type_enum_is_float(arg0_type)) {
+ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4))
+ return NULL;
return emit_simd_ins_for_sig (cfg, klass, arg0_type == MONO_TYPE_R8 ? OP_S390_VFLPDB : OP_S390_VFLPSB, -1, arg0_type, fsig, args);
} else {
return emit_simd_ins_for_sig (cfg, klass, OP_VECTOR_IABS, -1, arg0_type, fsig, args);
@@ -2135,11 +2137,17 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
if (!is_element_type_primitive (fsig->params [0]) || !is_element_type_primitive (fsig->params [1]))
return NULL;
+#if defined(TARGET_S390X)
+ if (!mono_hwcap_s390x_has_ve1 && ((id == SN_Max) || (id == SN_Min) || (id == SN_MaxNative) || (id == SN_MinNative) || (id !=SN_Xor) || (id != SN_BitwiseAnd) || (id != SN_BitwiseOr)) && arg0_type == MONO_TYPE_R4)
+ return NULL;
+#endif
+
#if !defined(TARGET_ARM64) && !defined(TARGET_S390X)
if (((id == SN_Max) || (id == SN_Min)) && type_enum_is_float(arg0_type))
return NULL;
#endif
+
return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, arg0_type, id);
}
case SN_Divide: {
@@ -2149,7 +2157,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
if (!is_element_type_primitive (fsig->params [0]) ||
!(MONO_TYPE_IS_VECTOR_PRIMITIVE (fsig->params [1]) || is_element_type_primitive (fsig->params [1])))
return NULL;
-
+#if defined(TARGET_S390X)
+ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4))
+ return NULL;
+#endif
return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, arg0_type, id);
}
case SN_Multiply: {
@@ -2170,7 +2181,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
return NULL;
} else if (!(is_element_type_primitive (fsig->params [0]) && is_element_type_primitive (fsig->params [1])))
return NULL;
-
+#if defined(TARGET_S390X)
+ if (!mono_hwcap_s390x_has_ve1 && (vector_inner_type == MONO_TYPE_R4))
+ return NULL;
+#endif
return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, vector_inner_type, id);
}
case SN_AndNot: {
@@ -2198,13 +2212,17 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
int add_op;
if (type_enum_is_float (arg0_type)) {
+#if defined(TARGET_S390X)
+ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4))
+ return NULL;
+#endif
mul_op = OP_FMUL;
add_op = OP_FADD;
} else {
mul_op = OP_IMUL;
add_op = OP_IADD;
-#ifdef TARGET_ARM64
+#if defined(TARGET_ARM64) || defined(TARGET_S390X)
if (!COMPILE_LLVM (cfg) && (arg0_type == MONO_TYPE_I8 || arg0_type == MONO_TYPE_U8 || arg0_type == MONO_TYPE_I || arg0_type == MONO_TYPE_U))
return NULL;
#endif
@@ -2274,6 +2292,8 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
int ceil_or_floor = id == SN_Ceiling ? 10 : 9;
return emit_simd_ins_for_sig (cfg, klass, OP_SSE41_ROUNDP, ceil_or_floor, arg0_type, fsig, args);
#elif defined(TARGET_S390X)
+ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4))
+ return NULL;
int ceil_or_floor = id == SN_Ceiling ? 6 : 7;
switch (arg0_type){
case MONO_TYPE_R4:
@@ -2464,6 +2484,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
return emit_vector_create_scalar (cfg, vklass, etype, args [0], is_unsafe);
}
case SN_Dot: {
+#if defined(TARGET_S390X)
+ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4))
+ return NULL;
+#endif
return emit_dot (cfg, klass, fsig->params [0], arg0_type, args [0]->dreg, args [1]->dreg);
}
case SN_Equals:
@@ -2472,6 +2496,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
if (!is_element_type_primitive (fsig->params [0]))
return NULL;
MonoClass *arg_class = mono_class_from_mono_type_internal (fsig->params [0]);
+#ifdef TARGET_S390X
+ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4))
+ return NULL;
+#endif
if (id == SN_Equals)
return emit_xcompare (cfg, klass, arg0_type, args [0], args [1]);
@@ -2733,7 +2761,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
case SN_LessThanOrEqual: {
if (!is_element_type_primitive (fsig->params [0]))
return NULL;
-
+#ifdef TARGET_S390X
+ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4))
+ return NULL;
+#endif
return emit_xcompare_for_intrinsic (cfg, klass, id, arg0_type, args [0], args [1]);
}
case SN_GreaterThanAll:
@@ -2750,7 +2781,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
g_assert (fsig->param_count == 2 &&
fsig->ret->type == MONO_TYPE_BOOLEAN &&
mono_metadata_type_equal (fsig->params [0], fsig->params [1]));
-
+#ifdef TARGET_S390X
+ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4))
+ return NULL;
+#endif
gboolean is_all = FALSE;
switch (id) {
case SN_GreaterThanAll:
@@ -2857,6 +2891,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
return NULL;
if (!type_enum_is_float(arg0_type))
return emit_xzero (cfg, klass);
+#ifdef TARGET_S390X
+ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4))
+ return NULL;
+#endif
int op = -1;
#if defined(TARGET_ARM64) || defined(TARGET_AMD64) || defined(TARGET_WASM) || defined(TARGET_S390X)
op = OP_ONES_COMPLEMENT;
@@ -2879,7 +2917,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
return emit_xones (cfg, klass);
}
}
-
+#ifdef TARGET_S390X
+ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4))
+ return NULL;
+#endif
MonoInst *arg0 = args [0];
MonoClass *op_klass = klass;
@@ -2907,6 +2948,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
case SN_IsPositiveInfinity: {
if (!is_element_type_primitive (fsig->params [0]))
return NULL;
+#ifdef TARGET_S390X
+ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4))
+ return NULL;
+#endif
if (arg0_type == MONO_TYPE_R4) {
guint32 value[4];
@@ -2984,6 +3029,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
case SN_IsZero: {
if (!is_element_type_primitive (fsig->params [0]))
return NULL;
+#ifdef TARGET_S390X
+ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4))
+ return NULL;
+#endif
return emit_xcompare (cfg, klass, arg0_type, args [0], emit_xzero (cfg, klass));
}
case SN_Narrow: {
@@ -3129,7 +3178,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
case SN_OnesComplement: {
if (!is_element_type_primitive (fsig->params [0]))
return NULL;
+#ifdef TARGET_S390X
+ if (!mono_hwcap_s390x_has_ve1 && (id == SN_Negate) && (arg0_type == MONO_TYPE_R4))
return emit_simd_ins_for_unary_op (cfg, klass, fsig, args, arg0_type, id);
+#endif
}
case SN_Shuffle: {
MonoType *etype = get_vector_t_elem_type (fsig->ret);
@@ -3295,6 +3347,9 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
return emit_simd_ins_for_sig (cfg, klass, OP_XOP_X_X, instc0, arg0_type, fsig, args);
#elif defined(TARGET_S390X)
+ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4))
+ return NULL;
+
int instc0 = arg0_type == MONO_TYPE_R4 ? OP_S390_VFSQSB : OP_S390_VFSQDB;
return emit_simd_ins_for_sig (cfg, klass, instc0, 0, arg0_type, fsig, args);
#else
@@ -3792,6 +3847,10 @@ emit_sri_vector_t (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
if (fsig->param_count != 2 )
return NULL;
arg0_type = fsig->param_count > 0 ? get_underlying_type (fsig->params [0]) : MONO_TYPE_VOID;
+#ifdef TARGET_S390X
+ if (!mono_hwcap_s390x_has_ve1 && ((id !=SN_op_ExclusiveOr) || (id != SN_op_BitwiseAnd) || (id != SN_op_BitwiseOr)) && arg0_type == MONO_TYPE_R4)
+ return NULL;
+#endif
return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, arg0_type, id);
}
@@ -3800,6 +3859,10 @@ emit_sri_vector_t (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
if (fsig->param_count != 2 )
return NULL;
MonoClass *arg_class = mono_class_from_mono_type_internal (fsig->params [0]);
+#ifdef TARGET_S390X
+ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4))
+ return NULL;
+#endif
switch (id) {
case SN_op_Equality: return emit_xequal (cfg, arg_class, arg0_type, args [0], args [1]);
case SN_op_Inequality: return emit_not_xequal (cfg, arg_class, arg0_type, args [0], args [1]);
@@ -3810,6 +3873,10 @@ emit_sri_vector_t (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
case SN_op_UnaryNegation:
if (fsig->param_count != 1 )
return NULL;
+#if defined(TARGET_S390X)
+ if (!mono_hwcap_s390x_has_ve1 && (id == SN_op_UnaryNegation) && (arg0_type == MONO_TYPE_R4))
+ return NULL;
+#endif
return emit_simd_ins_for_unary_op (cfg, klass, fsig, args, arg0_type, id);
case SN_op_UnaryPlus:
if (fsig->param_count != 1)
@@ -4150,10 +4217,18 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
#ifndef TARGET_ARM64
if ((id == SN_Max) || (id == SN_Min))
return NULL;
+#endif
+#ifdef TARGET_S390X
+ if (!mono_hwcap_s390x_has_ve1 && ((id == SN_Max) || (id == SN_Min) || (id == SN_MaxNative) || (id == SN_MinNative)))
+ return NULL;
#endif
return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, MONO_TYPE_R4, id);
}
case SN_Dot: {
+#ifdef TARGET_S390X
+ if (!mono_hwcap_s390x_has_ve1)
+ return NULL;
+#endif
return emit_dot (cfg, klass, fsig->params [0], MONO_TYPE_R4, args [0]->dreg, args [1]->dreg);
}
case SN_Negate:
@@ -4172,6 +4247,10 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
return emit_simd_ins_for_sig (cfg, cmethod->klass, OP_XOP_OVR_X_X, INTRINS_AARCH64_ADV_SIMD_FABS, MONO_TYPE_R4, fsig, args);
#endif
}
+#ifdef TARGET_S390X
+ if (!mono_hwcap_s390x_has_ve1)
+ return NULL;
+#endif
// MAX(x,0-x)
MonoInst *zero = emit_xzero (cfg, klass);
MonoInst *neg = emit_simd_ins (cfg, klass, OP_XBINOP, zero->dreg, args [0]->dreg);
@@ -4185,12 +4264,20 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
case SN_op_Equality: {
if (!(fsig->param_count == 2 && mono_metadata_type_equal (fsig->params [0], type) && mono_metadata_type_equal (fsig->params [1], type)))
return NULL;
+#ifdef TARGET_S390X
+ if (!mono_hwcap_s390x_has_ve1)
+ return NULL;
+#endif
MonoClass *arg_class = mono_class_from_mono_type_internal (fsig->params [0]);
return emit_xequal (cfg, arg_class, MONO_TYPE_R4, args [0], args [1]);
}
case SN_op_Inequality: {
if (!(fsig->param_count == 2 && mono_metadata_type_equal (fsig->params [0], type) && mono_metadata_type_equal (fsig->params [1], type)))
return NULL;
+#ifdef TARGET_S390X
+ if (!mono_hwcap_s390x_has_ve1)
+ return NULL;
+#endif
MonoClass *arg_class = mono_class_from_mono_type_internal (fsig->params [0]);
return emit_not_xequal (cfg, arg_class, MONO_TYPE_R4, args [0], args [1]);
}
@@ -4201,6 +4288,11 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
ins = emit_simd_ins (cfg, klass, OP_XOP_X_X, args [0]->dreg, -1);
ins->inst_c0 = (IntrinsicId)INTRINS_SIMD_SQRT_R4;
return ins;
+#elif defined(TARGET_S390X)
+ if (!mono_hwcap_s390x_has_ve1)
+ return NULL;
+ ins = emit_simd_ins (cfg, klass, OP_S390_VFSQSB, args [0]->dreg, -1);
+ return ins;
#else
return NULL;
#endif
@@ -4215,6 +4307,10 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
if (id == SN_Clamp)
return NULL;
#endif
+#ifdef TARGET_S390X
+ if (!mono_hwcap_s390x_has_ve1)
+ return NULL;
+#endif
MonoInst *max = emit_simd_ins (cfg, klass, OP_XBINOP, args[0]->dreg, args[1]->dreg);
max->inst_c0 = OP_FMAX;
@@ -6865,6 +6961,11 @@ static MonoInst*
emit_simd_intrinsics (const char *class_ns, const char *class_name, MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, MonoInst **args)
{
MonoInst *ins;
+#ifdef TARGET_S390X
+ /* vector facility was introduced in z13 */
+ if (!mono_hwcap_s390x_has_vec)
+ return NULL;
+#endif
if (cfg->opt & MONO_OPT_SIMD) {
ins = arch_emit_simd_intrinsics (class_ns, class_name, cfg, cmethod, fsig, args);
diff --git a/src/runtime/src/mono/mono/utils/mono-hwcap-s390x.c b/src/runtime/src/mono/mono/utils/mono-hwcap-s390x.c
index ddc828bbc046a0..7f735066e238b8 100644
--- a/src/runtime/src/mono/mono/utils/mono-hwcap-s390x.c
+++ b/src/runtime/src/mono/mono/utils/mono-hwcap-s390x.c
@@ -157,6 +157,7 @@ mono_hwcap_arch_init (void)
mono_hwcap_s390x_has_fpe = facs.fpe;
mono_hwcap_s390x_has_vec = facs.vec;
+ mono_hwcap_s390x_has_ve1 = facs.ve1;
mono_hwcap_s390x_has_mlt = facs.multi;
mono_hwcap_s390x_has_ia = facs.ia;
mono_hwcap_s390x_has_gie = facs.gie;
diff --git a/src/runtime/src/mono/mono/utils/mono-hwcap-vars.h b/src/runtime/src/mono/mono/utils/mono-hwcap-vars.h
index 98f4eb29115e83..391910a919c76e 100644
--- a/src/runtime/src/mono/mono/utils/mono-hwcap-vars.h
+++ b/src/runtime/src/mono/mono/utils/mono-hwcap-vars.h
@@ -54,6 +54,7 @@ MONO_HWCAP_VAR(riscv_has_stdext_v)
#elif defined (TARGET_S390X)
MONO_HWCAP_VAR(s390x_has_fpe)
+MONO_HWCAP_VAR(s390x_has_ve1)
MONO_HWCAP_VAR(s390x_has_vec)
MONO_HWCAP_VAR(s390x_has_mlt)
MONO_HWCAP_VAR(s390x_has_ia)
From f5e4c47373482aedd36b7f9c579739f3e8160432 Mon Sep 17 00:00:00 2001
From: Sanjam Panda <36253777+saitama951@users.noreply.github.com>
Date: Tue, 5 Aug 2025 14:45:51 +0530
Subject: [PATCH 2/4] Apply suggestions from code review
fix code style
Co-authored-by: kasperk81 <83082615+kasperk81@users.noreply.github.com>
---
src/mono/mono/mini/simd-intrinsics.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/runtime/src/mono/mono/mini/simd-intrinsics.c b/src/runtime/src/mono/mono/mini/simd-intrinsics.c
index b8f78487cd85e6..0b33399d8634b5 100644
--- a/src/runtime/src/mono/mono/mini/simd-intrinsics.c
+++ b/src/runtime/src/mono/mono/mini/simd-intrinsics.c
@@ -2183,7 +2183,7 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
return NULL;
#if defined(TARGET_S390X)
if (!mono_hwcap_s390x_has_ve1 && (vector_inner_type == MONO_TYPE_R4))
- return NULL;
+ return NULL;
#endif
return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, vector_inner_type, id);
}
@@ -2783,7 +2783,7 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
mono_metadata_type_equal (fsig->params [0], fsig->params [1]));
#ifdef TARGET_S390X
if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4))
- return NULL;
+ return NULL;
#endif
gboolean is_all = FALSE;
switch (id) {
@@ -4227,7 +4227,7 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
case SN_Dot: {
#ifdef TARGET_S390X
if (!mono_hwcap_s390x_has_ve1)
- return NULL;
+ return NULL;
#endif
return emit_dot (cfg, klass, fsig->params [0], MONO_TYPE_R4, args [0]->dreg, args [1]->dreg);
}
@@ -4249,7 +4249,7 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
}
#ifdef TARGET_S390X
if (!mono_hwcap_s390x_has_ve1)
- return NULL;
+ return NULL;
#endif
// MAX(x,0-x)
MonoInst *zero = emit_xzero (cfg, klass);
@@ -4266,7 +4266,7 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
return NULL;
#ifdef TARGET_S390X
if (!mono_hwcap_s390x_has_ve1)
- return NULL;
+ return NULL;
#endif
MonoClass *arg_class = mono_class_from_mono_type_internal (fsig->params [0]);
return emit_xequal (cfg, arg_class, MONO_TYPE_R4, args [0], args [1]);
@@ -4276,7 +4276,7 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
return NULL;
#ifdef TARGET_S390X
if (!mono_hwcap_s390x_has_ve1)
- return NULL;
+ return NULL;
#endif
MonoClass *arg_class = mono_class_from_mono_type_internal (fsig->params [0]);
return emit_not_xequal (cfg, arg_class, MONO_TYPE_R4, args [0], args [1]);
@@ -4309,7 +4309,7 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
#endif
#ifdef TARGET_S390X
if (!mono_hwcap_s390x_has_ve1)
- return NULL;
+ return NULL;
#endif
MonoInst *max = emit_simd_ins (cfg, klass, OP_XBINOP, args[0]->dreg, args[1]->dreg);
From 579eda9bc245938bbb2a932064ba552528b7457d Mon Sep 17 00:00:00 2001
From: saitama951 <sanjamkumar360@gmail.com>
Date: Wed, 6 Aug 2025 04:35:56 +0000
Subject: [PATCH 3/4] fix errors * fix test case failures on arm64 * fix more
code style reviews
---
src/mono/mono/mini/simd-intrinsics.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/runtime/src/mono/mono/mini/simd-intrinsics.c b/src/runtime/src/mono/mono/mini/simd-intrinsics.c
index 0b33399d8634b5..fab77158e8bdf5 100644
--- a/src/runtime/src/mono/mono/mini/simd-intrinsics.c
+++ b/src/runtime/src/mono/mono/mini/simd-intrinsics.c
@@ -2782,7 +2782,7 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
fsig->ret->type == MONO_TYPE_BOOLEAN &&
mono_metadata_type_equal (fsig->params [0], fsig->params [1]));
#ifdef TARGET_S390X
- if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4))
+ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4))
return NULL;
#endif
gboolean is_all = FALSE;
@@ -3180,8 +3180,9 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
return NULL;
#ifdef TARGET_S390X
if (!mono_hwcap_s390x_has_ve1 && (id == SN_Negate) && (arg0_type == MONO_TYPE_R4))
- return emit_simd_ins_for_unary_op (cfg, klass, fsig, args, arg0_type, id);
+ return NULL;
#endif
+ return emit_simd_ins_for_unary_op (cfg, klass, fsig, args, arg0_type, id);
}
case SN_Shuffle: {
MonoType *etype = get_vector_t_elem_type (fsig->ret);
@@ -3849,7 +3850,7 @@ emit_sri_vector_t (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
arg0_type = fsig->param_count > 0 ? get_underlying_type (fsig->params [0]) : MONO_TYPE_VOID;
#ifdef TARGET_S390X
if (!mono_hwcap_s390x_has_ve1 && ((id !=SN_op_ExclusiveOr) || (id != SN_op_BitwiseAnd) || (id != SN_op_BitwiseOr)) && arg0_type == MONO_TYPE_R4)
- return NULL;
+ return NULL;
#endif
return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, arg0_type, id);
@@ -4220,7 +4221,7 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
#endif
#ifdef TARGET_S390X
if (!mono_hwcap_s390x_has_ve1 && ((id == SN_Max) || (id == SN_Min) || (id == SN_MaxNative) || (id == SN_MinNative)))
- return NULL;
+ return NULL;
#endif
return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, MONO_TYPE_R4, id);
}
From 9f2dad96c5bf08f462577f11100249fdb3f060a6 Mon Sep 17 00:00:00 2001
From: saitama951 <sanjamkumar360@gmail.com>
Date: Thu, 14 Aug 2025 12:51:00 +0000
Subject: [PATCH 4/4] address review comments
---
src/mono/mono/mini/mini-s390x.h | 2 +-
src/mono/mono/mini/mini.h | 11 ++++++++
src/mono/mono/mini/simd-intrinsics.c | 38 +++++++---------------------
3 files changed, 21 insertions(+), 30 deletions(-)
diff --git a/src/runtime/src/mono/mono/mini/mini-s390x.h b/src/runtime/src/mono/mono/mini/mini-s390x.h
index 6e680ba9c6374b..82b2f411f4d439 100644
--- a/src/runtime/src/mono/mono/mini/mini-s390x.h
+++ b/src/runtime/src/mono/mono/mini/mini-s390x.h
@@ -83,7 +83,7 @@ struct SeqPointInfo {
#define MONO_ARCH_HAVE_SETUP_RESUME_FROM_SIGNAL_HANDLER_CTX 1
#define MONO_ARCH_HAVE_UNWIND_BACKTRACE 1
#define MONO_ARCH_FLOAT32_SUPPORTED 1
-#define MONO_ARCH_SIMD_INTRINSICS mono_hwcap_s390x_has_vec
+#define MONO_ARCH_SIMD_INTRINSICS 1
#define MONO_ARCH_NEED_SIMD_BANK 1
#define MONO_ARCH_USE_SHARED_FP_SIMD_BANK 1
#define S390_STACK_ALIGNMENT 8
diff --git a/src/runtime/src/mono/mono/mini/mini.h b/src/runtime/src/mono/mono/mini/mini.h
index 30e5f5c4728811..65b38b751e8c45 100644
--- a/src/runtime/src/mono/mono/mini/mini.h
+++ b/src/runtime/src/mono/mono/mini/mini.h
@@ -64,6 +64,12 @@ typedef struct SeqPointInfo SeqPointInfo;
#include "mono/metadata/callspec.h"
#include "mono/metadata/icall-signatures.h"
+/* we use runtime checks to fallback to scalar ops for/
+ * older z/Architectures
+ */
+#ifdef TARGET_S390X
+#include <mono/utils/mono-hwcap.h>
+#endif
/*
* The mini code should not have any compile time dependencies on the GC being used, so the same object file from mini/
* can be linked into both mono and mono-sgen.
@@ -3015,6 +3021,11 @@ mini_safepoints_enabled (void)
static inline gboolean
mini_class_is_simd (MonoCompile *cfg, MonoClass *klass)
{
+#ifdef TARGET_S390X
+ /* vector facility was introduced in z13 */
+ if (!mono_hwcap_s390x_has_vec)
+ return FALSE;
+#endif
#ifdef MONO_ARCH_SIMD_INTRINSICS
if (!(((cfg)->opt & MONO_OPT_SIMD) && m_class_is_simd_type (klass)))
return FALSE;
diff --git a/src/runtime/src/mono/mono/mini/simd-intrinsics.c b/src/runtime/src/mono/mono/mini/simd-intrinsics.c
index fab77158e8bdf5..ebe0637605fe5a 100644
--- a/src/runtime/src/mono/mono/mini/simd-intrinsics.c
+++ b/src/runtime/src/mono/mono/mini/simd-intrinsics.c
@@ -2138,7 +2138,9 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
return NULL;
#if defined(TARGET_S390X)
- if (!mono_hwcap_s390x_has_ve1 && ((id == SN_Max) || (id == SN_Min) || (id == SN_MaxNative) || (id == SN_MinNative) || (id !=SN_Xor) || (id != SN_BitwiseAnd) || (id != SN_BitwiseOr)) && arg0_type == MONO_TYPE_R4)
+ if (!mono_hwcap_s390x_has_ve1 && arg0_type == MONO_TYPE_R4)
+ return NULL;
+ if (!mono_hwcap_s390x_has_ve1 && ((id == SN_Max) || (id == SN_Min) || (id == SN_MaxNative) || (id == SN_MinNative)) && (arg0_type == MONO_TYPE_R8))
return NULL;
#endif
@@ -2147,7 +2149,6 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi
return NULL;
#endif
-
return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, arg0_type, id);
}
case SN_Divide: {
@@ -3849,7 +3850,7 @@ emit_sri_vector_t (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
return NULL;
arg0_type = fsig->param_count > 0 ? get_underlying_type (fsig->params [0]) : MONO_TYPE_VOID;
#ifdef TARGET_S390X
- if (!mono_hwcap_s390x_has_ve1 && ((id !=SN_op_ExclusiveOr) || (id != SN_op_BitwiseAnd) || (id != SN_op_BitwiseOr)) && arg0_type == MONO_TYPE_R4)
+ if (!mono_hwcap_s390x_has_ve1 && arg0_type == MONO_TYPE_R4)
return NULL;
#endif
return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, arg0_type, id);
@@ -3968,6 +3969,11 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
return NULL;
#endif
+#ifdef TARGET_S390X
+ if (!mono_hwcap_s390x_has_ve1)
+ return NULL;
+#endif
+
if (!(cfg->opt & MONO_OPT_SIMD))
return NULL;
@@ -4218,18 +4224,10 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
#ifndef TARGET_ARM64
if ((id == SN_Max) || (id == SN_Min))
return NULL;
-#endif
-#ifdef TARGET_S390X
- if (!mono_hwcap_s390x_has_ve1 && ((id == SN_Max) || (id == SN_Min) || (id == SN_MaxNative) || (id == SN_MinNative)))
- return NULL;
#endif
return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, MONO_TYPE_R4, id);
}
case SN_Dot: {
-#ifdef TARGET_S390X
- if (!mono_hwcap_s390x_has_ve1)
- return NULL;
-#endif
return emit_dot (cfg, klass, fsig->params [0], MONO_TYPE_R4, args [0]->dreg, args [1]->dreg);
}
case SN_Negate:
@@ -4248,10 +4246,6 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
return emit_simd_ins_for_sig (cfg, cmethod->klass, OP_XOP_OVR_X_X, INTRINS_AARCH64_ADV_SIMD_FABS, MONO_TYPE_R4, fsig, args);
#endif
}
-#ifdef TARGET_S390X
- if (!mono_hwcap_s390x_has_ve1)
- return NULL;
-#endif
// MAX(x,0-x)
MonoInst *zero = emit_xzero (cfg, klass);
MonoInst *neg = emit_simd_ins (cfg, klass, OP_XBINOP, zero->dreg, args [0]->dreg);
@@ -4265,20 +4259,12 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
case SN_op_Equality: {
if (!(fsig->param_count == 2 && mono_metadata_type_equal (fsig->params [0], type) && mono_metadata_type_equal (fsig->params [1], type)))
return NULL;
-#ifdef TARGET_S390X
- if (!mono_hwcap_s390x_has_ve1)
- return NULL;
-#endif
MonoClass *arg_class = mono_class_from_mono_type_internal (fsig->params [0]);
return emit_xequal (cfg, arg_class, MONO_TYPE_R4, args [0], args [1]);
}
case SN_op_Inequality: {
if (!(fsig->param_count == 2 && mono_metadata_type_equal (fsig->params [0], type) && mono_metadata_type_equal (fsig->params [1], type)))
return NULL;
-#ifdef TARGET_S390X
- if (!mono_hwcap_s390x_has_ve1)
- return NULL;
-#endif
MonoClass *arg_class = mono_class_from_mono_type_internal (fsig->params [0]);
return emit_not_xequal (cfg, arg_class, MONO_TYPE_R4, args [0], args [1]);
}
@@ -4290,8 +4276,6 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
ins->inst_c0 = (IntrinsicId)INTRINS_SIMD_SQRT_R4;
return ins;
#elif defined(TARGET_S390X)
- if (!mono_hwcap_s390x_has_ve1)
- return NULL;
ins = emit_simd_ins (cfg, klass, OP_S390_VFSQSB, args [0]->dreg, -1);
return ins;
#else
@@ -4308,10 +4292,6 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f
if (id == SN_Clamp)
return NULL;
#endif
-#ifdef TARGET_S390X
- if (!mono_hwcap_s390x_has_ve1)
- return NULL;
-#endif
MonoInst *max = emit_simd_ins (cfg, klass, OP_XBINOP, args[0]->dreg, args[1]->dreg);
max->inst_c0 = OP_FMAX;

View File

@ -1,2 +1,6 @@
SHA512 (dotnet-10.0.0-preview.6.25358.103.tar.gz) = 46285769f9f11455fae027d2c92fd2ee2754b05b19d174eac319cdee7ff2463dbc0539d42be926cd9cb0852b98dc5d1a42d1193d777edc6b33c480937ef778b7
SHA512 (dotnet-10.0.0-preview.6.25358.103.tar.gz.sig) = 2d60152c308d39cc5e0dc08b5da4264583d6677bb856473aaa2d6649597a120953c8725525b98e4b11cba4712c61cf8cdaa610518e000dfb97162dc6823597c7
SHA512 (dotnet-10.0.100-rc.1.25451.107.tar.gz) = 41de62257785dcd6f4d180b62f672b2a1fa599e8a63985ea1b578da340cca32a3905caf8699114ea370799bf3ba033bc6cc8e83e3498da34cf1cf178f7e982f7
SHA512 (dotnet-10.0.100-rc.1.25451.107.tar.gz.sig) = ae8723da5fb35f3c103ec8819d08bb9c21666ed08c4b1bcad97c5ac0c1b7bc60f668a59feac9c0c0ce795905dab281aeabecc6a1a66aa2fd8d9fa8bb8d701133
SHA512 (dotnet-prebuilts-10.0.100-rc.1.25420.111-x64.tar.gz) = 105df63912a12d1bef77004421840cd5fd32658a030ae80557c82dd4dc1b7c9c5a55c0b9c4cf56624adb64e444c9e902cf1a959769f169f18d7281a7357aacb7
SHA512 (dotnet-prebuilts-10.0.100-rc.1.25420.111-arm64.tar.gz) = e53a53728a1200f308125d539efa6b578e33a6e504a5709de4edcfe3d262c00e25fbd25eda535ff356027ccc69dc6314a76fa43b25d96529aee1e5cf5c4acbce
SHA512 (dotnet-prebuilts-10.0.100-rc.1.25451.107-ppc64le.tar.gz) = 3f455b2ebe7d921162b286db98eadfdbe79769655a3419a8c10910ea66baa986e8346cee8c73cb95cf1d150400702d1b12f55c5bdb037c9b94cc81c1e59102e6
SHA512 (dotnet-prebuilts-10.0.100-rc.1.25451.107-s390x.tar.gz) = ee3fdf8d01d11a682ac04603794fbe90ae9d489506139909f20b70bf2a026ef0e4e293c6c42cea85491849239f4ed47c426fdb40248adcafea13b001b284a44e