diff --git a/.gcc-toolset-13-gcc.metadata b/.gcc-toolset-13-gcc.metadata
index 717c2cc..876f677 100644
--- a/.gcc-toolset-13-gcc.metadata
+++ b/.gcc-toolset-13-gcc.metadata
@@ -1,4 +1,4 @@
-8ebd6709d853b5be064b5a0499927c721ac172f8 SOURCES/gcc-13.2.1-20231205.tar.xz
+e1fb4ded21712a1724ce05b86ff738ee6d21256c SOURCES/gcc-13.3.1-20240611.tar.xz
ae5fbb33bcb442121fbbf482a93f6b3c84d489ee SOURCES/isl-0.24.tar.bz2
003af8bc05476507f4dd02340b727b72b404e275 SOURCES/newlib-cygwin-9e09d6ed83cce4777a5950412647ccc603040409.tar.xz
6bfe7ac1b208935ee2c0939bb47cfe775c1c81b3 SOURCES/nvptx-tools-aa3404ad5a496cda5d79a50bedb1344fd63e8763.tar.xz
diff --git a/.gitignore b/.gitignore
index 0eedc39..f568836 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,4 @@
-SOURCES/gcc-13.2.1-20231205.tar.xz
+SOURCES/gcc-13.3.1-20240611.tar.xz
SOURCES/isl-0.24.tar.bz2
SOURCES/newlib-cygwin-9e09d6ed83cce4777a5950412647ccc603040409.tar.xz
SOURCES/nvptx-tools-aa3404ad5a496cda5d79a50bedb1344fd63e8763.tar.xz
diff --git a/SOURCES/gcc13-libstdc++-compat.patch b/SOURCES/gcc13-libstdc++-compat.patch
index 814ffea..67cb374 100644
--- a/SOURCES/gcc13-libstdc++-compat.patch
+++ b/SOURCES/gcc13-libstdc++-compat.patch
@@ -4916,7 +4916,7 @@
+asm (".hidden _ZN9__gnu_cxxeqIPKwNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEEEEbRKNS_17__normal_iteratorIT_T0_EESE_");
+asm (".hidden _ZN9__gnu_cxxeqIPwNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEEEEEbRKNS_17__normal_iteratorIT_T0_EESD_");
+asm (".hidden _ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE17_M_use_local_dataEv");
-+asm (".hidden _ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE11_S_allocateERS3_m");
++//asm (".hidden _ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE11_S_allocateERS3_m");
--- libstdc++-v3/src/nonshared11/istream-inst.cc.jj 2023-05-19 12:22:56.739882146 +0200
+++ libstdc++-v3/src/nonshared11/istream-inst.cc 2023-05-19 13:36:14.104840565 +0200
@@ -0,0 +1,132 @@
@@ -7802,7 +7802,7 @@
+asm (".hidden _ZN9__gnu_cxxeqIPKcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEbRKNS_17__normal_iteratorIT_T0_EESE_");
+asm (".hidden _ZN9__gnu_cxxeqIPcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEbRKNS_17__normal_iteratorIT_T0_EESD_");
+asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE17_M_use_local_dataEv");
-+asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE11_S_allocateERS3_m");
++//asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE11_S_allocateERS3_m");
--- libstdc++-v3/src/nonshared11/cow-stdexcept80.cc.jj 2023-05-19 12:22:56.747882033 +0200
+++ libstdc++-v3/src/nonshared11/cow-stdexcept80.cc 2023-05-19 13:36:14.097840663 +0200
@@ -0,0 +1,76 @@
@@ -8804,7 +8804,7 @@
+ $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LTLDFLAGS) -o $@
--- libstdc++-v3/src/nonshared20/tzdb80.cc.jj 2023-05-19 20:25:50.447297532 +0200
+++ libstdc++-v3/src/nonshared20/tzdb80.cc 2023-05-19 19:51:19.200552634 +0200
-@@ -0,0 +1,122 @@
+@@ -0,0 +1,128 @@
+// Copyright The GNU Toolchain Authors.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
@@ -8894,7 +8894,6 @@
+#if 0
+asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev");
+asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED1Ev");
-+asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_disposeEv");
+#endif
+asm (".hidden _ZTSSt19_Sp_make_shared_tag");
+asm (".hidden _ZNSt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE2EE10_M_releaseEv");
@@ -8906,14 +8905,21 @@
+asm (".hidden _ZTISt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE2EE");
+asm (".hidden _ZZNSt19_Sp_make_shared_tag5_S_tiEvE5__tag");
+asm (".hidden _ZZNSt8__detail18__waiter_pool_base6_S_forEPKvE3__w");
-+#if defined(__aarch64__)
-+asm (".hidden _ZNKSt10filesystem7__cxx114path8iteratordeEv");
++asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_disposeEv");
++#if defined(__aarch64__) || defined(__x86_64__)
++//asm (".hidden _ZSt25__unguarded_linear_insertIN9__gnu_cxx17__normal_iteratorIPNSt6chrono9time_zoneESt6vectorIS3_SaIS3_EEEENS0_5__ops14_Val_comp_iterIZNSt6ranges8__detail16__make_comp_projINSB_4lessEMS3_KDoFSt17basic_string_viewIcSt11char_traitsIcEEvEEEDaRT_RT0_EUlOSL_OSN_E_EEEvSL_SN_");
+#endif
+asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_assignERKS4_");
+asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EOS4_");
+asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2EOS4_");
+asm (".hidden _ZSt23__atomic_wait_address_vIiZNKSt13__atomic_baseIiE4waitEiSt12memory_orderEUlvE_EvPKT_S4_T0_");
++#if defined(__i386__) || defined(__x86_64__)
++asm (".hidden _ZNKSt10filesystem7__cxx114path8iteratordeEv");
++#endif
+#if defined(__i386__)
++asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEjjPKcj");
++asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7reserveEj");
++asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_replaceEjjPKcj");
+asm (".hidden _ZSt16__introsort_loopIN9__gnu_cxx17__normal_iteratorIPNSt6chrono9time_zoneESt6vectorIS3_SaIS3_EEEEiNS0_5__ops15_Iter_comp_iterIZNSt6ranges8__detail16__make_comp_projINSB_4lessESt8identityEEDaRT_RT0_EUlOSG_OSI_E_EEEvSG_SG_SI_T1_");
+asm (".hidden _ZSt16__introsort_loopIN9__gnu_cxx17__normal_iteratorIPNSt6chrono9time_zoneESt6vectorIS3_SaIS3_EEEEiNS0_5__ops15_Iter_comp_iterIZNSt6ranges8__detail16__make_comp_projINSB_4lessEMS3_KDoFSt17basic_string_viewIcSt11char_traitsIcEEvEEEDaRT_RT0_EUlOSL_OSN_E_EEEvSL_SL_SN_T1_");
+asm (".hidden _ZSt16__introsort_loopIN9__gnu_cxx17__normal_iteratorIPNSt6chrono14time_zone_linkESt6vectorIS3_SaIS3_EEEEiNS0_5__ops15_Iter_comp_iterIZNSt6ranges8__detail16__make_comp_projINSB_4lessESt8identityEEDaRT_RT0_EUlOSG_OSI_E_EEEvSG_SG_SI_T1_");
@@ -9893,7 +9899,7 @@
+asm (".hidden _ZNSt8__detail31__from_chars_alnum_to_val_tableILb0EE5valueE");
--- libstdc++-v3/src/nonshared17/floating_from_chars110.cc.jj 2023-05-19 18:08:44.662186963 +0200
+++ libstdc++-v3/src/nonshared17/floating_from_chars110.cc 2023-05-19 19:46:37.242530879 +0200
-@@ -0,0 +1,34 @@
+@@ -0,0 +1,53 @@
+// Copyright (C) 2019-2023 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
@@ -9918,16 +9924,35 @@
+
+#define _GLIBCXX_NONSHARED_CXX11_110
+#include "../c++17/floating_from_chars.cc"
-+asm (".hidden _ZSt10from_charsIiENSt9enable_ifIXsrSt5__or_IJS1_IJSt7is_sameINSt9remove_cvIT_E4typeEaES2_IS6_sES2_IS6_iES2_IS6_lES2_IS6_xES2_IS6_nEEES1_IJS2_IS6_hES2_IS6_tES2_IS6_jES2_IS6_mES2_IS6_yES2_IS6_oEEES2_IcS6_EEE5valueESt17from_chars_resultE4typeEPKcSR_RS4_i");
-+asm (".hidden _ZSt10from_charsIiENSt9enable_ifIXsrSt5__or_IIS1_IISt7is_sameINSt9remove_cvIT_E4typeEaES2_IS6_sES2_IS6_iES2_IS6_lES2_IS6_xES2_IS6_nEEES1_IIS2_IS6_hES2_IS6_tES2_IS6_jES2_IS6_mES2_IS6_yES2_IS6_oEEES2_IcS6_EEE5valueESt17from_chars_resultE4typeEPKcSR_RS4_i");
+#ifndef __s390x__
-+asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcENSt3pmr21polymorphic_allocatorIcEEE9_M_createERmm");
+#ifndef __i386__
++#if !defined(__aarch64__)
++asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcENSt3pmr21polymorphic_allocatorIcEEE9_M_mutateEmmPKcm");
++asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcENSt3pmr21polymorphic_allocatorIcEEE9_M_createERmm");
+asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcENSt3pmr21polymorphic_allocatorIcEEE15_M_replace_coldEPcmPKcmm");
+#endif
++asm (".hidden _ZSt10from_charsIiENSt9enable_ifIXsrSt5__or_IJS1_IJSt7is_sameINSt9remove_cvIT_E4typeEaES2_IS6_sES2_IS6_iES2_IS6_lES2_IS6_xES2_IS6_nEEES1_IJS2_IS6_hES2_IS6_tES2_IS6_jES2_IS6_mES2_IS6_yES2_IS6_oEEES2_IcS6_EEE5valueESt17from_chars_resultE4typeEPKcSR_RS4_i");
++asm (".hidden _ZSt10from_charsIiENSt9enable_ifIXsrSt5__or_IIS1_IISt7is_sameINSt9remove_cvIT_E4typeEaES2_IS6_sES2_IS6_iES2_IS6_lES2_IS6_xES2_IS6_nEEES1_IIS2_IS6_hES2_IS6_tES2_IS6_jES2_IS6_mES2_IS6_yES2_IS6_oEEES2_IcS6_EEE5valueESt17from_chars_resultE4typeEPKcSR_RS4_i");
++#endif
++#endif
++#if defined (__s390x__)
++asm (".hidden _ZSt10from_charsIiENSt9enable_ifIXsrSt5__or_IIS1_IISt7is_sameINSt9remove_cvIT_E4typeEaES2_IS6_sES2_IS6_iES2_IS6_lES2_IS6_xES2_IS6_nEEES1_IIS2_IS6_hES2_IS6_tES2_IS6_jES2_IS6_mES2_IS6_yES2_IS6_oEEES2_IcS6_EEE5valueESt17from_chars_resultE4typeEPKcSR_RS4_i");
++asm (".hidden _ZSt10from_charsIiENSt9enable_ifIXsrSt5__or_IJS1_IJSt7is_sameINSt9remove_cvIT_E4typeEaES2_IS6_sES2_IS6_iES2_IS6_lES2_IS6_xES2_IS6_nEEES1_IJS2_IS6_hES2_IS6_tES2_IS6_jES2_IS6_mES2_IS6_yES2_IS6_oEEES2_IcS6_EEE5valueESt17from_chars_resultE4typeEPKcSR_RS4_i");
++#endif
++#if defined (__powerpc64__)
++asm (".hidden _ZSt10from_charsPKcS0_Ru9__ieee128St12chars_format");
++//asm (".hidden _ZSt8to_charsPcS_u9__ieee128");
++//asm (".hidden _ZSt8to_charsPcS_u9__ieee128St12chars_format");
++//asm (".hidden _ZSt8to_charsPcS_u9__ieee128St12chars_formati");
+#endif
-+asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcENSt3pmr21polymorphic_allocatorIcEEE9_M_mutateEmmPKcm");
+asm (".hidden _ZNSt8__detail31__from_chars_alnum_to_val_tableILb0EE5valueE");
++#ifdef __i386__
++asm (".hidden _ZSt10from_charsIiENSt9enable_ifIXsrSt5__or_IJS1_IJSt7is_sameINSt9remove_cvIT_E4typeEaES2_IS6_sES2_IS6_iES2_IS6_lES2_IS6_xEEES1_IJS2_IS6_hES2_IS6_tES2_IS6_jES2_IS6_mES2_IS6_yEEES2_IcS6_EEE5valueESt17from_chars_resultE4typeEPKcSP_RS4_i");
++asm (".hidden _ZSt10from_charsIiENSt9enable_ifIXsrSt5__or_IIS1_IISt7is_sameINSt9remove_cvIT_E4typeEaES2_IS6_sES2_IS6_iES2_IS6_lES2_IS6_xEEES1_IIS2_IS6_hES2_IS6_tES2_IS6_jES2_IS6_mES2_IS6_yEEES2_IcS6_EEE5valueESt17from_chars_resultE4typeEPKcSP_RS4_i");
++asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcENSt3pmr21polymorphic_allocatorIcEEE15_M_replace_coldEPcjPKcjj");
++asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcENSt3pmr21polymorphic_allocatorIcEEE9_M_createERjj");
++asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcENSt3pmr21polymorphic_allocatorIcEEE9_M_mutateEjjPKcj");
++#endif
--- libstdc++-v3/src/nonshared17/cow-fs_ops.cc.jj 2023-05-19 12:22:56.799881298 +0200
+++ libstdc++-v3/src/nonshared17/cow-fs_ops.cc 2023-05-19 19:21:04.451145483 +0200
@@ -0,0 +1,83 @@
@@ -10144,7 +10169,7 @@
+asm (".hidden _ZNSbIwSt11char_traitsIwESaIwEE12_M_leak_hardEv");
+asm (".hidden _ZNSs12_M_leak_hardEv");
+asm (".hidden _ZNSs4swapERSs");
-+asm (".hidden _ZNSs6appendERKSs");
++//asm (".hidden _ZNSs6appendERKSs");
+asm (".hidden _ZNSt10filesystem4path5_List5beginEv");
+asm (".hidden _ZNSt10filesystem4path7_Parser4nextEv");
+asm (".hidden _ZNSt10filesystem4pathD1Ev");
@@ -10452,7 +10477,7 @@
+//asm (".hidden _ZNSt16_Sp_counted_baseILN9__gnu_cxx12_Lock_policyE2EE24_M_release_last_use_coldEv");
+asm (".hidden _ZNSt12_Destroy_auxILb0EE9__destroyIPNSt10filesystem7__cxx114path5_CmptEEEvT_S7_");
+asm (".hidden _ZNKSt10filesystem7__cxx114path5_List5_Impl4copyEv");
-+asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm");
++//asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm");
+asm (".hidden _ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6resizeEmw");
+asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6resizeEmc");
+#endif
@@ -10473,7 +10498,7 @@
+//asm (".hidden _ZNSt10filesystem7__cxx114path7_Parser4nextEv");
+asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_replaceEjjPKcj");
+asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7reserveEj");
-+asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcj");
++//asm (".hidden _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcj");
+asm (".hidden _ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE6resizeEjw");
+#endif
+asm (".hidden _ZNSt10filesystem7__cxx114path8_CodecvtIwED0Ev");
@@ -12025,7 +12050,7 @@
+#include "../c++17/string-inst.cc"
--- libstdc++-v3/src/nonshared17/floating_to_chars110.cc.jj 2023-05-19 18:08:54.897043256 +0200
+++ libstdc++-v3/src/nonshared17/floating_to_chars110.cc 2023-05-19 19:39:17.219738117 +0200
-@@ -0,0 +1,27 @@
+@@ -0,0 +1,31 @@
+// Copyright (C) 2019-2023 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
@@ -12050,9 +12075,13 @@
+
+#define _GLIBCXX_NONSHARED_CXX11_110
+#include "../c++17/floating_to_chars.cc"
++#if !defined(__i386__)
+asm (".hidden _ZSt12__to_chars_iIoENSt9enable_ifIXsrSt5__or_IJS1_IJSt7is_sameINSt9remove_cvIT_E4typeEaES2_IS6_sES2_IS6_iES2_IS6_lES2_IS6_xES2_IS6_nEEES1_IJS2_IS6_hES2_IS6_tES2_IS6_jES2_IS6_mES2_IS6_yES2_IS6_oEEES2_IcS6_EEE5valueESt15to_chars_resultE4typeEPcSQ_S4_i");
+asm (".hidden _ZSt12__to_chars_iIoENSt9enable_ifIXsrSt5__or_IIS1_IISt7is_sameINSt9remove_cvIT_E4typeEaES2_IS6_sES2_IS6_iES2_IS6_lES2_IS6_xES2_IS6_nEEES1_IIS2_IS6_hES2_IS6_tES2_IS6_jES2_IS6_mES2_IS6_yES2_IS6_oEEES2_IcS6_EEE5valueESt15to_chars_resultE4typeEPcSQ_S4_i");
++#endif
++#if !defined(__s390x__) && !defined(__aarch64__)
+asm (".hidden _ZNSt8__detail18__to_chars_10_implIjEEvPcjT_");
++#endif
--- libstdc++-v3/src/nonshared17/string-inst110.cc.jj 2023-05-19 20:14:44.341711057 +0200
+++ libstdc++-v3/src/nonshared17/string-inst110.cc 2023-05-19 19:41:57.743474432 +0200
@@ -0,0 +1,37 @@
@@ -12728,8 +12757,8 @@
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
--#line 12190 "configure"
-+#line 12192 "configure"
+-#line 12192 "configure"
++#line 12194 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -12737,8 +12766,8 @@
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
--#line 12296 "configure"
-+#line 12298 "configure"
+-#line 12298 "configure"
++#line 12300 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -12746,8 +12775,8 @@
# Fake what AC_TRY_COMPILE does.
cat > conftest.$ac_ext << EOF
--#line 16020 "configure"
-+#line 16022 "configure"
+-#line 16036 "configure"
++#line 16038 "configure"
int main()
{
typedef bool atomic_type;
@@ -12755,8 +12784,8 @@
rm -f conftest*
cat > conftest.$ac_ext << EOF
--#line 16055 "configure"
-+#line 16057 "configure"
+-#line 16071 "configure"
++#line 16073 "configure"
int main()
{
typedef short atomic_type;
@@ -12764,8 +12793,8 @@
rm -f conftest*
cat > conftest.$ac_ext << EOF
--#line 16090 "configure"
-+#line 16092 "configure"
+-#line 16106 "configure"
++#line 16108 "configure"
int main()
{
// NB: _Atomic_word not necessarily int.
@@ -12773,8 +12802,8 @@
rm -f conftest*
cat > conftest.$ac_ext << EOF
--#line 16126 "configure"
-+#line 16128 "configure"
+-#line 16142 "configure"
++#line 16144 "configure"
int main()
{
typedef long long atomic_type;
@@ -12782,8 +12811,8 @@
# unnecessary for this test.
cat > conftest.$ac_ext << EOF
--#line 16282 "configure"
-+#line 16284 "configure"
+-#line 16298 "configure"
++#line 16300 "configure"
int main()
{
_Decimal32 d1;
@@ -12791,8 +12820,8 @@
# unnecessary for this test.
cat > conftest.$ac_ext << EOF
--#line 16324 "configure"
-+#line 16326 "configure"
+-#line 16340 "configure"
++#line 16342 "configure"
template
struct same
{ typedef T2 type; };
diff --git a/SOURCES/gcc13-libstdc++-docs.patch b/SOURCES/gcc13-libstdc++-docs.patch
index ce94f5d..b007822 100644
--- a/SOURCES/gcc13-libstdc++-docs.patch
+++ b/SOURCES/gcc13-libstdc++-docs.patch
@@ -4,7 +4,7 @@
FSF
-+ Release 13.2.1
++ Release 13.3.1
+
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation
@@ -17,7 +17,7 @@
- The API documentation, rendered into HTML, can be viewed online
+ The API documentation, rendered into HTML, can be viewed locally
-+ for the 13.2.1 release,
++ for the 13.3.1 release,
+ online
for each GCC release
and
diff --git a/SOURCES/gcc13-pr107071.patch b/SOURCES/gcc13-pr107071.patch
new file mode 100644
index 0000000..5d459a0
--- /dev/null
+++ b/SOURCES/gcc13-pr107071.patch
@@ -0,0 +1,28 @@
+commit c8c587b854c9e85fc9ce58c8192d532205f0ee1f
+Author: Tamar Christina
+Date: Wed Feb 21 11:42:13 2024 +0000
+
+ AArch64: skip modes_1.f90 [PR107071]
+
+ This test has never worked on AArch64 since the day it was committed. It has
+ a number of issues that prevent it from working on AArch64:
+
+ The testfailures seem to be known and triaged, so until that's fixed there's
+ no point in running this test.
+
+ gcc/testsuite/ChangeLog:
+
+ PR fortran/107071
+ * gfortran.dg/ieee/modes_1.f90: skip aarch64, arm.
+
+diff --git a/gcc/testsuite/gfortran.dg/ieee/modes_1.f90 b/gcc/testsuite/gfortran.dg/ieee/modes_1.f90
+index 205c47f3800..e29d8c678e6 100644
+--- a/gcc/testsuite/gfortran.dg/ieee/modes_1.f90
++++ b/gcc/testsuite/gfortran.dg/ieee/modes_1.f90
+@@ -1,5 +1,5 @@
+ ! { dg-do run }
+-!
++! { dg-skip-if "PR libfortran/78314" { aarch64*-*-gnu* arm*-*-gnueabi arm*-*-gnueabihf } }
+ ! Test IEEE_MODES_TYPE, IEEE_GET_MODES and IEEE_SET_MODES
+
+
diff --git a/SOURCES/gcc13-pr110792.patch b/SOURCES/gcc13-pr110792.patch
deleted file mode 100644
index ce129f9..0000000
--- a/SOURCES/gcc13-pr110792.patch
+++ /dev/null
@@ -1,163 +0,0 @@
-PR target/110792: Early clobber issues with rot32di2_doubleword on i386.
-
-This patch is a conservative fix for PR target/110792, a wrong-code
-regression affecting doubleword rotations by BITS_PER_WORD, which
-effectively swaps the highpart and lowpart words, when the source to be
-rotated resides in memory. The issue is that if the register used to
-hold the lowpart of the destination is mentioned in the address of
-the memory operand, the current define_insn_and_split unintentionally
-clobbers it before reading the highpart.
-
-Hence, for the testcase, the incorrectly generated code looks like:
-
- salq $4, %rdi // calculate address
- movq WHIRL_S+8(%rdi), %rdi // accidentally clobber addr
- movq WHIRL_S(%rdi), %rbp // load (wrong) lowpart
-
-Traditionally, the textbook way to fix this would be to add an
-explicit early clobber to the instruction's constraints.
-
- (define_insn_and_split "32di2_doubleword"
-- [(set (match_operand:DI 0 "register_operand" "=r,r,r")
-+ [(set (match_operand:DI 0 "register_operand" "=r,r,&r")
- (any_rotate:DI (match_operand:DI 1 "nonimmediate_operand" "0,r,o")
- (const_int 32)))]
-
-but unfortunately this currently generates significantly worse code,
-due to a strange choice of reloads (effectively memcpy), which ends up
-looking like:
-
- salq $4, %rdi // calculate address
- movdqa WHIRL_S(%rdi), %xmm0 // load the double word in SSE reg.
- movaps %xmm0, -16(%rsp) // store the SSE reg back to the stack
- movq -8(%rsp), %rdi // load highpart
- movq -16(%rsp), %rbp // load lowpart
-
-Note that reload's "&" doesn't distinguish between the memory being
-early clobbered, vs the registers used in an addressing mode being
-early clobbered.
-
-The fix proposed in this patch is to remove the third alternative, that
-allowed offsetable memory as an operand, forcing reload to place the
-operand into a register before the rotation. This results in:
-
- salq $4, %rdi
- movq WHIRL_S(%rdi), %rax
- movq WHIRL_S+8(%rdi), %rdi
- movq %rax, %rbp
-
-I believe there's a more advanced solution, by swapping the order of
-the loads (if first destination register is mentioned in the address),
-or inserting a lea insn (if both destination registers are mentioned
-in the address), but this fix is a minimal "safe" solution, that
-should hopefully be suitable for backporting.
-
-2023-08-06 Roger Sayle
-
-gcc/testsuite/ChangeLog
- PR target/110792
- * gcc.target/i386/pr110792.c: Remove dg-final scan-assembler-not.
-
-2023-08-03 Roger Sayle
-
-gcc/ChangeLog
- PR target/110792
- * config/i386/i386.md (ti3): For rotations by 64 bits
- place operand in a register before gen_64ti2_doubleword.
- (di3): Likewise, for rotations by 32 bits, place
- operand in a register before gen_32di2_doubleword.
- (32di2_doubleword): Constrain operand to be in register.
- (64ti2_doubleword): Likewise.
-
-gcc/testsuite/ChangeLog
- PR target/110792
- * g++.target/i386/pr110792.C: New 32-bit C++ test case.
- * gcc.target/i386/pr110792.c: New 64-bit C test case.
-
---- gcc/config/i386/i386.md
-+++ gcc/config/i386/i386.md
-@@ -15341,7 +15341,10 @@ (define_expand "ti3"
- emit_insn (gen_ix86_ti3_doubleword
- (operands[0], operands[1], operands[2]));
- else if (CONST_INT_P (operands[2]) && INTVAL (operands[2]) == 64)
-- emit_insn (gen_64ti2_doubleword (operands[0], operands[1]));
-+ {
-+ operands[1] = force_reg (TImode, operands[1]);
-+ emit_insn (gen_64ti2_doubleword (operands[0], operands[1]));
-+ }
- else
- {
- rtx amount = force_reg (QImode, operands[2]);
-@@ -15376,7 +15379,10 @@ (define_expand "di3"
- emit_insn (gen_ix86_di3_doubleword
- (operands[0], operands[1], operands[2]));
- else if (CONST_INT_P (operands[2]) && INTVAL (operands[2]) == 32)
-- emit_insn (gen_32di2_doubleword (operands[0], operands[1]));
-+ {
-+ operands[1] = force_reg (DImode, operands[1]);
-+ emit_insn (gen_32di2_doubleword (operands[0], operands[1]));
-+ }
- else
- FAIL;
-
-@@ -15544,8 +15550,8 @@ (define_insn_and_split "ix86_rotr3_doubleword"
- })
-
- (define_insn_and_split "32di2_doubleword"
-- [(set (match_operand:DI 0 "register_operand" "=r,r,r")
-- (any_rotate:DI (match_operand:DI 1 "nonimmediate_operand" "0,r,o")
-+ [(set (match_operand:DI 0 "register_operand" "=r,r")
-+ (any_rotate:DI (match_operand:DI 1 "register_operand" "0,r")
- (const_int 32)))]
- "!TARGET_64BIT"
- "#"
-@@ -15562,8 +15568,8 @@ (define_insn_and_split "32di2_doubleword"
- })
-
- (define_insn_and_split "64ti2_doubleword"
-- [(set (match_operand:TI 0 "register_operand" "=r,r,r")
-- (any_rotate:TI (match_operand:TI 1 "nonimmediate_operand" "0,r,o")
-+ [(set (match_operand:TI 0 "register_operand" "=r,r")
-+ (any_rotate:TI (match_operand:TI 1 "register_operand" "0,r")
- (const_int 64)))]
- "TARGET_64BIT"
- "#"
---- gcc/testsuite/g++.target/i386/pr110792.C
-+++ gcc/testsuite/g++.target/i386/pr110792.C
-@@ -0,0 +1,16 @@
-+/* { dg-do compile { target ia32 } } */
-+/* { dg-options "-O2" } */
-+
-+template
-+inline T rotr(T input)
-+{
-+ return static_cast((input >> ROT) | (input << (8 * sizeof(T) - ROT)));
-+}
-+
-+unsigned long long WHIRL_S[256] = {0x18186018C07830D8};
-+unsigned long long whirl(unsigned char x0)
-+{
-+ const unsigned long long s4 = WHIRL_S[x0&0xFF];
-+ return rotr<32>(s4);
-+}
-+/* { dg-final { scan-assembler-not "movl\tWHIRL_S\\+4\\(,%eax,8\\), %eax" } } */
---- gcc/testsuite/gcc.target/i386/pr110792.c
-+++ gcc/testsuite/gcc.target/i386/pr110792.c
-@@ -0,0 +1,17 @@
-+/* { dg-do compile { target int128 } } */
-+/* { dg-options "-O2" } */
-+
-+static inline unsigned __int128 rotr(unsigned __int128 input)
-+{
-+ return ((input >> 64) | (input << (64)));
-+}
-+
-+unsigned __int128 WHIRL_S[256] = {((__int128)0x18186018C07830D8) << 64 |0x18186018C07830D8};
-+unsigned __int128 whirl(unsigned char x0)
-+{
-+ register int t __asm("rdi") = x0&0xFF;
-+ const unsigned __int128 s4 = WHIRL_S[t];
-+ register unsigned __int128 tt __asm("rdi") = rotr(s4);
-+ asm("":::"memory");
-+ return tt;
-+}
diff --git a/SOURCES/gcc13-testsuite-aarch64-add-fno-stack-protector.patch b/SOURCES/gcc13-testsuite-aarch64-add-fno-stack-protector.patch
deleted file mode 100644
index 01ca906..0000000
--- a/SOURCES/gcc13-testsuite-aarch64-add-fno-stack-protector.patch
+++ /dev/null
@@ -1,500 +0,0 @@
-From 3439b79cb7f97464d65316a94d40d49505fb2150 Mon Sep 17 00:00:00 2001
-From: Marek Polacek
-Date: Wed, 6 Dec 2023 15:34:24 -0500
-Subject: [PATCH] aarch64: add -fno-stack-protector to tests
-
-These tests fail when the testsuite is executed with -fstack-protector-strong.
-To avoid this, this patch adds -fno-stack-protector to dg-options.
-
-The list of FAILs is appended. As you can see, it's mostly about
-scan-assembler-* which are sort of expected to fail with the stack
-protector on.
-
-FAIL: gcc.target/aarch64/ldp_stp_unaligned_2.c scan-assembler-not mov\\tx[0-9]+, sp
-FAIL: gcc.target/aarch64/shadow_call_stack_5.c scan-assembler-times stp\\\\tx29, x30, \\\\[sp\\\\] 1
-FAIL: gcc.target/aarch64/shadow_call_stack_5.c scan-assembler ldr\\\\tx29, \\\\[sp\\\\]
-FAIL: gcc.target/aarch64/shadow_call_stack_6.c scan-assembler-times str\\\\tx30, \\\\[sp\\\\] 1
-FAIL: gcc.target/aarch64/shadow_call_stack_7.c scan-assembler-times stp\\\\tx19, x30, \\\\[sp, -[0-9]+\\\\]! 1
-FAIL: gcc.target/aarch64/shadow_call_stack_7.c scan-assembler ldr\\\\tx19, \\\\[sp\\\\], [0-9]+
-FAIL: gcc.target/aarch64/shadow_call_stack_8.c scan-assembler-times stp\\\\tx19, x20, \\\\[sp, -[0-9]+\\\\]! 1
-FAIL: gcc.target/aarch64/shadow_call_stack_8.c scan-assembler ldp\\\\tx19, x20, \\\\[sp\\\\], [0-9]+
-FAIL: gcc.target/aarch64/stack-check-12.c scan-assembler-times str\\\\txzr, 2
-FAIL: gcc.target/aarch64/stack-check-prologue-11.c scan-assembler-times str\\\\s+xzr, \\\\[sp, 1024\\\\] 1
-FAIL: gcc.target/aarch64/stack-check-prologue-12.c scan-assembler-times str\\\\s+xzr, \\\\[sp, 1024\\\\] 1
-FAIL: gcc.target/aarch64/stack-check-prologue-13.c scan-assembler-times str\\\\s+xzr, \\\\[sp, 1024\\\\] 1
-FAIL: gcc.target/aarch64/stack-check-prologue-13.c scan-assembler-times str\\\\s+x30, \\\\[sp\\\\] 1
-FAIL: gcc.target/aarch64/stack-check-prologue-14.c scan-assembler-times str\\\\s+xzr, \\\\[sp, 1024\\\\] 1
-FAIL: gcc.target/aarch64/stack-check-prologue-14.c scan-assembler-times str\\\\s+x30, \\\\[sp\\\\] 1
-FAIL: gcc.target/aarch64/stack-check-prologue-15.c scan-assembler-times str\\\\s+xzr, \\\\[sp, 1024\\\\] 1
-FAIL: gcc.target/aarch64/stack-check-prologue-15.c scan-assembler-times str\\\\s+x30, \\\\[sp\\\\] 1
-FAIL: gcc.target/aarch64/stack-check-prologue-17.c check-function-bodies test1
-FAIL: gcc.target/aarch64/stack-check-prologue-17.c check-function-bodies test2
-FAIL: gcc.target/aarch64/stack-check-prologue-18.c check-function-bodies test1
-FAIL: gcc.target/aarch64/stack-check-prologue-18.c check-function-bodies test2
-FAIL: gcc.target/aarch64/stack-check-prologue-18.c check-function-bodies test3
-FAIL: gcc.target/aarch64/stack-check-prologue-19.c check-function-bodies test1
-FAIL: gcc.target/aarch64/stack-check-prologue-19.c check-function-bodies test2
-FAIL: gcc.target/aarch64/stack-check-prologue-19.c check-function-bodies test3
-FAIL: gcc.target/aarch64/stack-check-prologue-2.c scan-assembler-times str\\\\s+xzr, 0
-FAIL: gcc.target/aarch64/stack-check-prologue-5.c scan-assembler-times str\\\\s+xzr, \\\\[sp, 1024\\\\] 1
-FAIL: gcc.target/aarch64/stack-check-prologue-6.c scan-assembler-times str\\\\s+xzr, \\\\[sp, 1024\\\\] 1
-FAIL: gcc.target/aarch64/stack-check-prologue-8.c scan-assembler-times str\\\\s+xzr, \\\\[sp, 1024\\\\] 2
-FAIL: gcc.target/aarch64/stack-check-prologue-9.c scan-assembler-times str\\\\s+xzr, \\\\[sp, 1024\\\\] 1
-FAIL: gcc.target/aarch64/test_frame_1.c scan-assembler-times str\\tx30, \\\\[sp, -[0-9]+\\\\]! 2
-FAIL: gcc.target/aarch64/test_frame_10.c scan-assembler-times stp\\tx19, x30, \\\\[sp, [0-9]+\\\\] 1
-FAIL: gcc.target/aarch64/test_frame_10.c scan-assembler ldp\\tx19, x30, \\\\[sp, [0-9]+\\\\]
-FAIL: gcc.target/aarch64/test_frame_11.c scan-assembler-times stp\\tx29, x30, \\\\[sp, -[0-9]+\\\\]! 2
-FAIL: gcc.target/aarch64/test_frame_13.c scan-assembler-times stp\\tx29, x30, \\\\[sp\\\\] 1
-FAIL: gcc.target/aarch64/test_frame_15.c scan-assembler-times stp\\tx29, x30, \\\\[sp, [0-9]+\\\\] 1
-FAIL: gcc.target/aarch64/test_frame_2.c scan-assembler-times stp\\tx19, x30, \\\\[sp, -[0-9]+\\\\]! 1
-FAIL: gcc.target/aarch64/test_frame_2.c scan-assembler ldp\\tx19, x30, \\\\[sp\\\\], [0-9]+
-FAIL: gcc.target/aarch64/test_frame_4.c scan-assembler-times stp\\tx19, x30, \\\\[sp, -[0-9]+\\\\]! 1
-FAIL: gcc.target/aarch64/test_frame_4.c scan-assembler ldp\\tx19, x30, \\\\[sp\\\\], [0-9]+
-FAIL: gcc.target/aarch64/test_frame_6.c scan-assembler-times str\\tx30, \\\\[sp\\\\] 1
-FAIL: gcc.target/aarch64/test_frame_7.c scan-assembler-times stp\\tx19, x30, \\\\[sp] 1
-FAIL: gcc.target/aarch64/test_frame_8.c scan-assembler-times str\\tx30, \\\\[sp, [0-9]+\\\\] 1
-FAIL: gcc.target/aarch64/test_frame_8.c scan-assembler ldr\\tx30, \\\\[sp, [0-9]+\\\\]
-FAIL: gcc.target/aarch64/sve/struct_vect_24.c scan-assembler-times cmp\\\\s+x[0-9]+, 61440 4
-FAIL: gcc.target/aarch64/sve/struct_vect_24.c scan-assembler-times sub\\\\s+x[0-9]+, x[0-9]+, 61440 4
-FAIL: gcc.target/aarch64/sve/struct_vect_24.c scan-assembler-times cmp\\s+x[0-9]+, 61440 4
-FAIL: gcc.target/aarch64/sve/struct_vect_24.c scan-assembler-times sub\\s+x[0-9]+, x[0-9]+, 61440 4
-
-gcc/testsuite/ChangeLog:
-
- * gcc.target/aarch64/ldp_stp_unaligned_2.c: Use -fno-stack-protector.
- * gcc.target/aarch64/shadow_call_stack_5.c: Likewise.
- * gcc.target/aarch64/shadow_call_stack_6.c: Likewise.
- * gcc.target/aarch64/shadow_call_stack_7.c: Likewise.
- * gcc.target/aarch64/shadow_call_stack_8.c: Likewise.
- * gcc.target/aarch64/stack-check-12.c: Likewise.
- * gcc.target/aarch64/stack-check-prologue-11.c: Likewise.
- * gcc.target/aarch64/stack-check-prologue-12.c: Likewise.
- * gcc.target/aarch64/stack-check-prologue-13.c: Likewise.
- * gcc.target/aarch64/stack-check-prologue-14.c: Likewise.
- * gcc.target/aarch64/stack-check-prologue-15.c: Likewise.
- * gcc.target/aarch64/stack-check-prologue-17.c: Likewise.
- * gcc.target/aarch64/stack-check-prologue-18.c: Likewise.
- * gcc.target/aarch64/stack-check-prologue-19.c: Likewise.
- * gcc.target/aarch64/stack-check-prologue-2.c: Likewise.
- * gcc.target/aarch64/stack-check-prologue-5.c: Likewise.
- * gcc.target/aarch64/stack-check-prologue-6.c: Likewise.
- * gcc.target/aarch64/stack-check-prologue-8.c: Likewise.
- * gcc.target/aarch64/stack-check-prologue-9.c: Likewise.
- * gcc.target/aarch64/sve/struct_vect_24.c: Likewise.
- * gcc.target/aarch64/test_frame_1.c: Likewise.
- * gcc.target/aarch64/test_frame_10.c: Likewise.
- * gcc.target/aarch64/test_frame_11.c: Likewise.
- * gcc.target/aarch64/test_frame_13.c: Likewise.
- * gcc.target/aarch64/test_frame_15.c: Likewise.
- * gcc.target/aarch64/test_frame_2.c: Likewise.
- * gcc.target/aarch64/test_frame_4.c: Likewise.
- * gcc.target/aarch64/test_frame_6.c: Likewise.
- * gcc.target/aarch64/test_frame_7.c: Likewise.
- * gcc.target/aarch64/test_frame_8.c: Likewise.
----
- gcc/testsuite/gcc.target/aarch64/ldp_stp_unaligned_2.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/shadow_call_stack_5.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/shadow_call_stack_6.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/shadow_call_stack_7.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/shadow_call_stack_8.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/stack-check-12.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/stack-check-prologue-11.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/stack-check-prologue-12.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/stack-check-prologue-13.c | 4 ++--
- gcc/testsuite/gcc.target/aarch64/stack-check-prologue-14.c | 4 ++--
- gcc/testsuite/gcc.target/aarch64/stack-check-prologue-15.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/stack-check-prologue-17.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/stack-check-prologue-18.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/stack-check-prologue-19.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/stack-check-prologue-2.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/stack-check-prologue-5.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/stack-check-prologue-6.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/stack-check-prologue-8.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/stack-check-prologue-9.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/sve/struct_vect_24.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/test_frame_1.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/test_frame_10.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/test_frame_11.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/test_frame_13.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/test_frame_15.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/test_frame_2.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/test_frame_4.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/test_frame_6.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/test_frame_7.c | 2 +-
- gcc/testsuite/gcc.target/aarch64/test_frame_8.c | 2 +-
- 30 files changed, 32 insertions(+), 32 deletions(-)
-
-diff --git a/gcc/testsuite/gcc.target/aarch64/ldp_stp_unaligned_2.c b/gcc/testsuite/gcc.target/aarch64/ldp_stp_unaligned_2.c
-index 1e46755a39a..50d7d7a2d5d 100644
---- a/gcc/testsuite/gcc.target/aarch64/ldp_stp_unaligned_2.c
-+++ b/gcc/testsuite/gcc.target/aarch64/ldp_stp_unaligned_2.c
-@@ -1,4 +1,4 @@
--/* { dg-options "-O2 -fomit-frame-pointer" } */
-+/* { dg-options "-O2 -fomit-frame-pointer -fno-stack-protector" } */
-
- /* Check that we split unaligned LDP/STP into base and aligned offset. */
-
-diff --git a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_5.c b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_5.c
-index d88357ca04d..d7f82984ff5 100644
---- a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_5.c
-+++ b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_5.c
-@@ -7,7 +7,7 @@
- * optimized code should use "ldr x29, [sp]" to restore x29 only. */
-
- /* { dg-do compile } */
--/* { dg-options "-O2 -fno-omit-frame-pointer -fsanitize=shadow-call-stack -fno-exceptions -ffixed-x18 --save-temps" } */
-+/* { dg-options "-O2 -fno-omit-frame-pointer -fsanitize=shadow-call-stack -fno-exceptions -ffixed-x18 --save-temps -fno-stack-protector" } */
-
- #include "test_frame_common.h"
-
-diff --git a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_6.c b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_6.c
-index 83b74834c6a..8d088aecc20 100644
---- a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_6.c
-+++ b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_6.c
-@@ -7,7 +7,7 @@
- * optimized code should not restore x30 in epilogue. */
-
- /* { dg-do compile } */
--/* { dg-options "-O2 -fomit-frame-pointer -fsanitize=shadow-call-stack -fno-exceptions -ffixed-x18 --save-temps" } */
-+/* { dg-options "-O2 -fomit-frame-pointer -fsanitize=shadow-call-stack -fno-exceptions -ffixed-x18 --save-temps -fno-stack-protector" } */
-
- #include "test_frame_common.h"
-
-diff --git a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_7.c b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_7.c
-index 5537fb3293a..a2f376e0091 100644
---- a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_7.c
-+++ b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_7.c
-@@ -7,7 +7,7 @@
- * optimized code should use "ldr x19, [sp], x" to restore x19 only. */
-
- /* { dg-do compile } */
--/* { dg-options "-O2 -fomit-frame-pointer -fsanitize=shadow-call-stack -fno-exceptions -ffixed-x18 --save-temps" } */
-+/* { dg-options "-O2 -fomit-frame-pointer -fsanitize=shadow-call-stack -fno-exceptions -ffixed-x18 --save-temps -fno-stack-protector" } */
-
- #include "test_frame_common.h"
-
-diff --git a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_8.c b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_8.c
-index b03f26f7bcf..5162cbb3917 100644
---- a/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_8.c
-+++ b/gcc/testsuite/gcc.target/aarch64/shadow_call_stack_8.c
-@@ -9,7 +9,7 @@
- * optimized code should not restore x30 in epilogue. */
-
- /* { dg-do compile } */
--/* { dg-options "-O0 -fomit-frame-pointer -fsanitize=shadow-call-stack -fno-exceptions -ffixed-x18 --save-temps" } */
-+/* { dg-options "-O0 -fomit-frame-pointer -fsanitize=shadow-call-stack -fno-exceptions -ffixed-x18 --save-temps -fno-stack-protector" } */
-
- int func1 (void)
- {
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-12.c b/gcc/testsuite/gcc.target/aarch64/stack-check-12.c
-index be5a57a9ec6..e1a4c67b041 100644
---- a/gcc/testsuite/gcc.target/aarch64/stack-check-12.c
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-12.c
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16 -fno-asynchronous-unwind-tables -fno-unwind-tables" } */
-+/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16 -fno-asynchronous-unwind-tables -fno-unwind-tables -fno-stack-protector" } */
- /* { dg-require-effective-target supports_stack_clash_protection } */
-
- typedef unsigned __attribute__((mode(DI))) uint64_t;
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-11.c b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-11.c
-index 741f2f5fadc..d57aece05bb 100644
---- a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-11.c
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-11.c
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16" } */
-+/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16 -fno-stack-protector" } */
- /* { dg-require-effective-target supports_stack_clash_protection } */
-
- #define SIZE (6 * 64 * 1024) + (1 * 32 * 1024)
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-12.c b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-12.c
-index ece68003ade..895d130e4fa 100644
---- a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-12.c
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-12.c
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16 -fomit-frame-pointer -momit-leaf-frame-pointer" } */
-+/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16 -fomit-frame-pointer -momit-leaf-frame-pointer -fno-stack-protector" } */
- /* { dg-require-effective-target supports_stack_clash_protection } */
-
- void
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-13.c b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-13.c
-index 0fc900c6943..1f1a6c497be 100644
---- a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-13.c
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-13.c
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16 -fomit-frame-pointer -momit-leaf-frame-pointer" } */
-+/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16 -fomit-frame-pointer -momit-leaf-frame-pointer -fno-stack-protector" } */
- /* { dg-require-effective-target supports_stack_clash_protection } */
-
- void h (void) __attribute__ ((noreturn));
-@@ -17,4 +17,4 @@ f (void)
-
- /* SIZE is more than 1 guard-size, but only one 64KB page is used, expect only 1
- probe. Leaf function and omitting leaf pointers, tail call to noreturn which
-- may only omit an epilogue and not a prologue. Checking for LR saving. */
-\ No newline at end of file
-+ may only omit an epilogue and not a prologue. Checking for LR saving. */
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-14.c b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-14.c
-index ea733f861e7..facb3cb72a7 100644
---- a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-14.c
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-14.c
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16 -fomit-frame-pointer -momit-leaf-frame-pointer" } */
-+/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16 -fomit-frame-pointer -momit-leaf-frame-pointer -fno-stack-protector" } */
- /* { dg-require-effective-target supports_stack_clash_protection } */
-
- void h (void) __attribute__ ((noreturn));
-@@ -21,4 +21,4 @@ f (void)
- probe at 1024 and one implicit probe due to LR being saved. Leaf function
- and omitting leaf pointers, tail call to noreturn which may only omit an
- epilogue and not a prologue and control flow in between. Checking for
-- LR saving. */
-\ No newline at end of file
-+ LR saving. */
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-15.c b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-15.c
-index 63df4a5609a..f2ac60a6214 100644
---- a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-15.c
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-15.c
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16 -fomit-frame-pointer -momit-leaf-frame-pointer" } */
-+/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16 -fomit-frame-pointer -momit-leaf-frame-pointer -fno-stack-protector" } */
- /* { dg-require-effective-target supports_stack_clash_protection } */
-
- void g (volatile int *x) ;
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-17.c b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-17.c
-index f0ec1389771..1cf6fbbb085 100644
---- a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-17.c
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-17.c
-@@ -1,4 +1,4 @@
--/* { dg-options "-O2 -fstack-clash-protection -fomit-frame-pointer --param stack-clash-protection-guard-size=12" } */
-+/* { dg-options "-O2 -fstack-clash-protection -fomit-frame-pointer --param stack-clash-protection-guard-size=12 -fno-stack-protector" } */
- /* { dg-final { check-function-bodies "**" "" } } */
-
- void f(int, ...);
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-18.c b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-18.c
-index 6383bec5ebc..2e06346c158 100644
---- a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-18.c
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-18.c
-@@ -1,4 +1,4 @@
--/* { dg-options "-O2 -fstack-clash-protection -fomit-frame-pointer --param stack-clash-protection-guard-size=12" } */
-+/* { dg-options "-O2 -fstack-clash-protection -fomit-frame-pointer --param stack-clash-protection-guard-size=12 -fno-stack-protector" } */
- /* { dg-final { check-function-bodies "**" "" } } */
-
- void f(int, ...);
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-19.c b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-19.c
-index 562039b5e9b..38eab4d36ab 100644
---- a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-19.c
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-19.c
-@@ -1,4 +1,4 @@
--/* { dg-options "-O2 -fstack-clash-protection -fomit-frame-pointer --param stack-clash-protection-guard-size=12 -fsanitize=shadow-call-stack -ffixed-x18" } */
-+/* { dg-options "-O2 -fstack-clash-protection -fomit-frame-pointer --param stack-clash-protection-guard-size=12 -fsanitize=shadow-call-stack -ffixed-x18 -fno-stack-protector" } */
- /* { dg-final { check-function-bodies "**" "" } } */
-
- void f(int, ...);
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-2.c b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-2.c
-index 61c52a251a7..b37f62cad27 100644
---- a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-2.c
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-2.c
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16" } */
-+/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16 -fno-stack-protector" } */
- /* { dg-require-effective-target supports_stack_clash_protection } */
-
- #define SIZE 2 * 1024
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-5.c b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-5.c
-index 2ee16350127..34a438671d0 100644
---- a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-5.c
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-5.c
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16" } */
-+/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16 -fno-stack-protector" } */
- /* { dg-require-effective-target supports_stack_clash_protection } */
-
- #define SIZE 64 * 1024
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-6.c b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-6.c
-index 3c9b606cbe0..a4e34e2fe6a 100644
---- a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-6.c
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-6.c
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16" } */
-+/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16 -fno-stack-protector" } */
- /* { dg-require-effective-target supports_stack_clash_protection } */
-
- #define SIZE 65 * 1024
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-8.c b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-8.c
-index 333f5fcc360..277dce4c71e 100644
---- a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-8.c
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-8.c
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16" } */
-+/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16 -fno-stack-protector" } */
- /* { dg-require-effective-target supports_stack_clash_protection } */
-
- #define SIZE 128 * 1024
-diff --git a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-9.c b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-9.c
-index a3ff89b5581..a21305541c1 100644
---- a/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-9.c
-+++ b/gcc/testsuite/gcc.target/aarch64/stack-check-prologue-9.c
-@@ -1,5 +1,5 @@
- /* { dg-do compile } */
--/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16" } */
-+/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=16 -fno-stack-protector" } */
- /* { dg-require-effective-target supports_stack_clash_protection } */
-
- #define SIZE 6 * 64 * 1024
-diff --git a/gcc/testsuite/gcc.target/aarch64/sve/struct_vect_24.c b/gcc/testsuite/gcc.target/aarch64/sve/struct_vect_24.c
-index 68a9d5e3d2e..19be6de0c2e 100644
---- a/gcc/testsuite/gcc.target/aarch64/sve/struct_vect_24.c
-+++ b/gcc/testsuite/gcc.target/aarch64/sve/struct_vect_24.c
-@@ -1,6 +1,6 @@
- /* { dg-do compile } */
- /* { dg-require-effective-target supports_stack_clash_protection } */
--/* { dg-options "-O3 -fopenmp-simd -fstack-clash-protection --param stack-clash-protection-guard-size=16" } */
-+/* { dg-options "-O3 -fopenmp-simd -fstack-clash-protection --param stack-clash-protection-guard-size=16 -fno-stack-protector" } */
-
- #include
-
-diff --git a/gcc/testsuite/gcc.target/aarch64/test_frame_1.c b/gcc/testsuite/gcc.target/aarch64/test_frame_1.c
-index f906b073545..c9b8822b4b1 100644
---- a/gcc/testsuite/gcc.target/aarch64/test_frame_1.c
-+++ b/gcc/testsuite/gcc.target/aarch64/test_frame_1.c
-@@ -6,7 +6,7 @@
- * optimized code should use "str !" for stack adjustment. */
-
- /* { dg-do run } */
--/* { dg-options "-O2 -fomit-frame-pointer --save-temps" } */
-+/* { dg-options "-O2 -fomit-frame-pointer --save-temps -fno-stack-protector" } */
-
- #include "test_frame_common.h"
-
-diff --git a/gcc/testsuite/gcc.target/aarch64/test_frame_10.c b/gcc/testsuite/gcc.target/aarch64/test_frame_10.c
-index c54ab2d0ccb..fe5cbd9ed05 100644
---- a/gcc/testsuite/gcc.target/aarch64/test_frame_10.c
-+++ b/gcc/testsuite/gcc.target/aarch64/test_frame_10.c
-@@ -7,7 +7,7 @@
- * Use a single stack adjustment, no writeback. */
-
- /* { dg-do run } */
--/* { dg-options "-O2 -fomit-frame-pointer --save-temps" } */
-+/* { dg-options "-O2 -fomit-frame-pointer --save-temps -fno-stack-protector" } */
-
- #include "test_frame_common.h"
-
-diff --git a/gcc/testsuite/gcc.target/aarch64/test_frame_11.c b/gcc/testsuite/gcc.target/aarch64/test_frame_11.c
-index f162cc091e0..11cf471168d 100644
---- a/gcc/testsuite/gcc.target/aarch64/test_frame_11.c
-+++ b/gcc/testsuite/gcc.target/aarch64/test_frame_11.c
-@@ -5,7 +5,7 @@
- * optimized code should use "stp !" for stack adjustment. */
-
- /* { dg-do run } */
--/* { dg-options "-O2 --save-temps" } */
-+/* { dg-options "-O2 --save-temps -fno-stack-protector" } */
-
- #include "test_frame_common.h"
-
-diff --git a/gcc/testsuite/gcc.target/aarch64/test_frame_13.c b/gcc/testsuite/gcc.target/aarch64/test_frame_13.c
-index 74b3370fa46..ec56963c038 100644
---- a/gcc/testsuite/gcc.target/aarch64/test_frame_13.c
-+++ b/gcc/testsuite/gcc.target/aarch64/test_frame_13.c
-@@ -5,7 +5,7 @@
- * Use a single stack adjustment, no writeback. */
-
- /* { dg-do run } */
--/* { dg-options "-O2 --save-temps" } */
-+/* { dg-options "-O2 --save-temps -fno-stack-protector" } */
-
- #include "test_frame_common.h"
-
-diff --git a/gcc/testsuite/gcc.target/aarch64/test_frame_15.c b/gcc/testsuite/gcc.target/aarch64/test_frame_15.c
-index bed6714b4fe..4247008de8e 100644
---- a/gcc/testsuite/gcc.target/aarch64/test_frame_15.c
-+++ b/gcc/testsuite/gcc.target/aarch64/test_frame_15.c
-@@ -6,7 +6,7 @@
- * Use a single stack adjustment, no writeback. */
-
- /* { dg-do run } */
--/* { dg-options "-O2 --save-temps" } */
-+/* { dg-options "-O2 --save-temps -fno-stack-protector" } */
-
- #include "test_frame_common.h"
-
-diff --git a/gcc/testsuite/gcc.target/aarch64/test_frame_2.c b/gcc/testsuite/gcc.target/aarch64/test_frame_2.c
-index 0d715314cb8..9c4243b6480 100644
---- a/gcc/testsuite/gcc.target/aarch64/test_frame_2.c
-+++ b/gcc/testsuite/gcc.target/aarch64/test_frame_2.c
-@@ -6,7 +6,7 @@
- * optimized code should use "stp !" for stack adjustment. */
-
- /* { dg-do run } */
--/* { dg-options "-O2 -fomit-frame-pointer --save-temps" } */
-+/* { dg-options "-O2 -fomit-frame-pointer --save-temps -fno-stack-protector" } */
-
- #include "test_frame_common.h"
-
-diff --git a/gcc/testsuite/gcc.target/aarch64/test_frame_4.c b/gcc/testsuite/gcc.target/aarch64/test_frame_4.c
-index b41229c42f4..8d0bed93e44 100644
---- a/gcc/testsuite/gcc.target/aarch64/test_frame_4.c
-+++ b/gcc/testsuite/gcc.target/aarch64/test_frame_4.c
-@@ -6,7 +6,7 @@
- * we can use "stp !" to optimize stack adjustment. */
-
- /* { dg-do run } */
--/* { dg-options "-O2 -fomit-frame-pointer --save-temps" } */
-+/* { dg-options "-O2 -fomit-frame-pointer --save-temps -fno-stack-protector" } */
-
- #include "test_frame_common.h"
-
-diff --git a/gcc/testsuite/gcc.target/aarch64/test_frame_6.c b/gcc/testsuite/gcc.target/aarch64/test_frame_6.c
-index 56259c945d2..2944a8bbe16 100644
---- a/gcc/testsuite/gcc.target/aarch64/test_frame_6.c
-+++ b/gcc/testsuite/gcc.target/aarch64/test_frame_6.c
-@@ -6,7 +6,7 @@
- * use a single stack adjustment, no writeback. */
-
- /* { dg-do run } */
--/* { dg-options "-O2 -fomit-frame-pointer --save-temps" } */
-+/* { dg-options "-O2 -fomit-frame-pointer --save-temps -fno-stack-protector" } */
-
- #include "test_frame_common.h"
-
-diff --git a/gcc/testsuite/gcc.target/aarch64/test_frame_7.c b/gcc/testsuite/gcc.target/aarch64/test_frame_7.c
-index 5702656a5da..ca371632d81 100644
---- a/gcc/testsuite/gcc.target/aarch64/test_frame_7.c
-+++ b/gcc/testsuite/gcc.target/aarch64/test_frame_7.c
-@@ -6,7 +6,7 @@
- * use a single stack adjustment, no writeback. */
-
- /* { dg-do run } */
--/* { dg-options "-O2 -fomit-frame-pointer --save-temps" } */
-+/* { dg-options "-O2 -fomit-frame-pointer --save-temps -fno-stack-protector" } */
-
- #include "test_frame_common.h"
-
-diff --git a/gcc/testsuite/gcc.target/aarch64/test_frame_8.c b/gcc/testsuite/gcc.target/aarch64/test_frame_8.c
-index 75a68b41e08..084e8fac373 100644
---- a/gcc/testsuite/gcc.target/aarch64/test_frame_8.c
-+++ b/gcc/testsuite/gcc.target/aarch64/test_frame_8.c
-@@ -5,7 +5,7 @@
- * number of callee-saved reg == 1. */
-
- /* { dg-do run } */
--/* { dg-options "-O2 -fomit-frame-pointer --save-temps" } */
-+/* { dg-options "-O2 -fomit-frame-pointer --save-temps -fno-stack-protector" } */
-
- #include "test_frame_common.h"
-
-
-base-commit: 1bd15d87031e8bf8fe9585fbc166b315303f676c
---
-2.43.0
-
diff --git a/SOURCES/gcc13-vector-merge-1.patch b/SOURCES/gcc13-vector-merge-1.patch
new file mode 100644
index 0000000..039fe24
--- /dev/null
+++ b/SOURCES/gcc13-vector-merge-1.patch
@@ -0,0 +1,522 @@
+commit 361bfcec901ca882130e338aebaa2ebc6ea2dc3b
+Author: Kewen Lin
+Date: Thu Jun 20 20:23:56 2024 -0500
+
+ rs6000: Fix wrong RTL patterns for vector merge high/low word on LE
+
+ Commit r12-4496 changes some define_expands and define_insns
+ for vector merge high/low word, which are altivec_vmrg[hl]w,
+ vsx_xxmrg[hl]w_. These defines are mainly for
+ built-in function vec_merge{h,l}, __builtin_vsx_xxmrghw,
+ __builtin_vsx_xxmrghw_4si and some internal gen function
+ needs. These functions should consider endianness, taking
+ vec_mergeh as example, as PVIPR defines, vec_mergeh "Merges
+ the first halves (in element order) of two vectors", it does
+ note it's in element order. So it's mapped into vmrghw on
+ BE while vmrglw on LE respectively. Although the mapped
+ insns are different, as the discussion in PR106069, the RTL
+ pattern should be still the same, it is conformed before
+ commit r12-4496, define_expand altivec_vmrghw got expanded
+ into:
+
+ (vec_select:VSX_W
+ (vec_concat:
+ (match_operand:VSX_W 1 "register_operand" "wa,v")
+ (match_operand:VSX_W 2 "register_operand" "wa,v"))
+ (parallel [(const_int 0) (const_int 4)
+ (const_int 1) (const_int 5)])))]
+
+ on both BE and LE then. But commit r12-4496 changed it to
+ expand into:
+
+ (vec_select:VSX_W
+ (vec_concat:
+ (match_operand:VSX_W 1 "register_operand" "wa,v")
+ (match_operand:VSX_W 2 "register_operand" "wa,v"))
+ (parallel [(const_int 0) (const_int 4)
+ (const_int 1) (const_int 5)])))]
+
+ on BE, and
+
+ (vec_select:VSX_W
+ (vec_concat:
+ (match_operand:VSX_W 1 "register_operand" "wa,v")
+ (match_operand:VSX_W 2 "register_operand" "wa,v"))
+ (parallel [(const_int 2) (const_int 6)
+ (const_int 3) (const_int 7)])))]
+
+ on LE, although the mapped insn are still vmrghw on BE and
+ vmrglw on LE, the associated RTL pattern is completely
+ wrong and inconsistent with the mapped insn. If optimization
+ passes leave this pattern alone, even if its pattern doesn't
+ represent its mapped insn, it's still fine, that's why simple
+ testing on bif doesn't expose this issue. But once some
+ optimization pass such as combine does some changes basing
+ on this wrong pattern, because the pattern doesn't match the
+ semantics that the expanded insn is intended to represent,
+ it would cause the unexpected result.
+
+ So this patch is to fix the wrong RTL pattern, ensure the
+ associated RTL patterns become the same as before which can
+ have the same semantic as their mapped insns. With the
+ proposed patch, the expanders like altivec_vmrghw expands
+ into altivec_vmrghb_direct_be or altivec_vmrglb_direct_le
+ depending on endianness, "direct" can easily show which
+ insn would be generated, _be and _le are mainly for the
+ different RTL patterns as endianness.
+
+ Co-authored-by: Xionghu Luo
+
+ PR target/106069
+ PR target/115355
+
+ gcc/ChangeLog:
+
+ * config/rs6000/altivec.md (altivec_vmrghw_direct_): Rename
+ to ...
+ (altivec_vmrghw_direct__be): ... this. Add the condition
+ BYTES_BIG_ENDIAN.
+ (altivec_vmrghw_direct__le): New define_insn.
+ (altivec_vmrglw_direct_): Rename to ...
+ (altivec_vmrglw_direct__be): ... this. Add the condition
+ BYTES_BIG_ENDIAN.
+ (altivec_vmrglw_direct__le): New define_insn.
+ (altivec_vmrghw): Adjust by calling gen_altivec_vmrghw_direct_v4si_be
+ for BE and gen_altivec_vmrglw_direct_v4si_le for LE.
+ (altivec_vmrglw): Adjust by calling gen_altivec_vmrglw_direct_v4si_be
+ for BE and gen_altivec_vmrghw_direct_v4si_le for LE.
+ (vec_widen_umult_hi_v8hi): Adjust the call to
+ gen_altivec_vmrghw_direct_v4si by gen_altivec_vmrghw for BE
+ and by gen_altivec_vmrglw for LE.
+ (vec_widen_smult_hi_v8hi): Likewise.
+ (vec_widen_umult_lo_v8hi): Adjust the call to
+ gen_altivec_vmrglw_direct_v4si by gen_altivec_vmrglw for BE
+ and by gen_altivec_vmrghw for LE
+ (vec_widen_smult_lo_v8hi): Likewise.
+ * config/rs6000/rs6000.cc (altivec_expand_vec_perm_const): Replace
+ CODE_FOR_altivec_vmrghw_direct_v4si by
+ CODE_FOR_altivec_vmrghw_direct_v4si_be for BE and
+ CODE_FOR_altivec_vmrghw_direct_v4si_le for LE. And replace
+ CODE_FOR_altivec_vmrglw_direct_v4si by
+ CODE_FOR_altivec_vmrglw_direct_v4si_be for BE and
+ CODE_FOR_altivec_vmrglw_direct_v4si_le for LE.
+ * config/rs6000/vsx.md (vsx_xxmrghw_): Adjust by calling
+ gen_altivec_vmrghw_direct_v4si_be for BE and
+ gen_altivec_vmrglw_direct_v4si_le for LE.
+ (vsx_xxmrglw_): Adjust by calling
+ gen_altivec_vmrglw_direct_v4si_be for BE and
+ gen_altivec_vmrghw_direct_v4si_le for LE.
+
+ gcc/testsuite/ChangeLog:
+
+ * g++.target/powerpc/pr106069.C: New test.
+ * gcc.target/powerpc/pr115355.c: New test.
+
+ (cherry picked from commit 52c112800d9f44457c4832309a48c00945811313)
+
+diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md
+index ad1224e0b57..92e2e4a4090 100644
+--- a/gcc/config/rs6000/altivec.md
++++ b/gcc/config/rs6000/altivec.md
+@@ -1212,16 +1212,18 @@ (define_expand "altivec_vmrghw"
+ (use (match_operand:V4SI 2 "register_operand"))]
+ "VECTOR_MEM_ALTIVEC_P (V4SImode)"
+ {
+- rtx (*fun) (rtx, rtx, rtx);
+- fun = BYTES_BIG_ENDIAN ? gen_altivec_vmrghw_direct_v4si
+- : gen_altivec_vmrglw_direct_v4si;
+- if (!BYTES_BIG_ENDIAN)
+- std::swap (operands[1], operands[2]);
+- emit_insn (fun (operands[0], operands[1], operands[2]));
++ if (BYTES_BIG_ENDIAN)
++ emit_insn (gen_altivec_vmrghw_direct_v4si_be (operands[0],
++ operands[1],
++ operands[2]));
++ else
++ emit_insn (gen_altivec_vmrglw_direct_v4si_le (operands[0],
++ operands[2],
++ operands[1]));
+ DONE;
+ })
+
+-(define_insn "altivec_vmrghw_direct_"
++(define_insn "altivec_vmrghw_direct__be"
+ [(set (match_operand:VSX_W 0 "register_operand" "=wa,v")
+ (vec_select:VSX_W
+ (vec_concat:
+@@ -1229,7 +1231,21 @@ (define_insn "altivec_vmrghw_direct_"
+ (match_operand:VSX_W 2 "register_operand" "wa,v"))
+ (parallel [(const_int 0) (const_int 4)
+ (const_int 1) (const_int 5)])))]
+- "TARGET_ALTIVEC"
++ "TARGET_ALTIVEC && BYTES_BIG_ENDIAN"
++ "@
++ xxmrghw %x0,%x1,%x2
++ vmrghw %0,%1,%2"
++ [(set_attr "type" "vecperm")])
++
++(define_insn "altivec_vmrghw_direct__le"
++ [(set (match_operand:VSX_W 0 "register_operand" "=wa,v")
++ (vec_select:VSX_W
++ (vec_concat:
++ (match_operand:VSX_W 2 "register_operand" "wa,v")
++ (match_operand:VSX_W 1 "register_operand" "wa,v"))
++ (parallel [(const_int 2) (const_int 6)
++ (const_int 3) (const_int 7)])))]
++ "TARGET_ALTIVEC && !BYTES_BIG_ENDIAN"
+ "@
+ xxmrghw %x0,%x1,%x2
+ vmrghw %0,%1,%2"
+@@ -1318,16 +1334,18 @@ (define_expand "altivec_vmrglw"
+ (use (match_operand:V4SI 2 "register_operand"))]
+ "VECTOR_MEM_ALTIVEC_P (V4SImode)"
+ {
+- rtx (*fun) (rtx, rtx, rtx);
+- fun = BYTES_BIG_ENDIAN ? gen_altivec_vmrglw_direct_v4si
+- : gen_altivec_vmrghw_direct_v4si;
+- if (!BYTES_BIG_ENDIAN)
+- std::swap (operands[1], operands[2]);
+- emit_insn (fun (operands[0], operands[1], operands[2]));
++ if (BYTES_BIG_ENDIAN)
++ emit_insn (gen_altivec_vmrglw_direct_v4si_be (operands[0],
++ operands[1],
++ operands[2]));
++ else
++ emit_insn (gen_altivec_vmrghw_direct_v4si_le (operands[0],
++ operands[2],
++ operands[1]));
+ DONE;
+ })
+
+-(define_insn "altivec_vmrglw_direct_"
++(define_insn "altivec_vmrglw_direct__be"
+ [(set (match_operand:VSX_W 0 "register_operand" "=wa,v")
+ (vec_select:VSX_W
+ (vec_concat:
+@@ -1335,7 +1353,21 @@ (define_insn "altivec_vmrglw_direct_"
+ (match_operand:VSX_W 2 "register_operand" "wa,v"))
+ (parallel [(const_int 2) (const_int 6)
+ (const_int 3) (const_int 7)])))]
+- "TARGET_ALTIVEC"
++ "TARGET_ALTIVEC && BYTES_BIG_ENDIAN"
++ "@
++ xxmrglw %x0,%x1,%x2
++ vmrglw %0,%1,%2"
++ [(set_attr "type" "vecperm")])
++
++(define_insn "altivec_vmrglw_direct__le"
++ [(set (match_operand:VSX_W 0 "register_operand" "=wa,v")
++ (vec_select:VSX_W
++ (vec_concat:
++ (match_operand:VSX_W 2 "register_operand" "wa,v")
++ (match_operand:VSX_W 1 "register_operand" "wa,v"))
++ (parallel [(const_int 0) (const_int 4)
++ (const_int 1) (const_int 5)])))]
++ "TARGET_ALTIVEC && !BYTES_BIG_ENDIAN"
+ "@
+ xxmrglw %x0,%x1,%x2
+ vmrglw %0,%1,%2"
+@@ -3807,13 +3839,13 @@ (define_expand "vec_widen_umult_hi_v8hi"
+ {
+ emit_insn (gen_altivec_vmuleuh (ve, operands[1], operands[2]));
+ emit_insn (gen_altivec_vmulouh (vo, operands[1], operands[2]));
+- emit_insn (gen_altivec_vmrghw_direct_v4si (operands[0], ve, vo));
++ emit_insn (gen_altivec_vmrghw (operands[0], ve, vo));
+ }
+ else
+ {
+ emit_insn (gen_altivec_vmulouh (ve, operands[1], operands[2]));
+ emit_insn (gen_altivec_vmuleuh (vo, operands[1], operands[2]));
+- emit_insn (gen_altivec_vmrghw_direct_v4si (operands[0], vo, ve));
++ emit_insn (gen_altivec_vmrglw (operands[0], ve, vo));
+ }
+ DONE;
+ })
+@@ -3832,13 +3864,13 @@ (define_expand "vec_widen_umult_lo_v8hi"
+ {
+ emit_insn (gen_altivec_vmuleuh (ve, operands[1], operands[2]));
+ emit_insn (gen_altivec_vmulouh (vo, operands[1], operands[2]));
+- emit_insn (gen_altivec_vmrglw_direct_v4si (operands[0], ve, vo));
++ emit_insn (gen_altivec_vmrglw (operands[0], ve, vo));
+ }
+ else
+ {
+ emit_insn (gen_altivec_vmulouh (ve, operands[1], operands[2]));
+ emit_insn (gen_altivec_vmuleuh (vo, operands[1], operands[2]));
+- emit_insn (gen_altivec_vmrglw_direct_v4si (operands[0], vo, ve));
++ emit_insn (gen_altivec_vmrghw (operands[0], ve, vo));
+ }
+ DONE;
+ })
+@@ -3857,13 +3889,13 @@ (define_expand "vec_widen_smult_hi_v8hi"
+ {
+ emit_insn (gen_altivec_vmulesh (ve, operands[1], operands[2]));
+ emit_insn (gen_altivec_vmulosh (vo, operands[1], operands[2]));
+- emit_insn (gen_altivec_vmrghw_direct_v4si (operands[0], ve, vo));
++ emit_insn (gen_altivec_vmrghw (operands[0], ve, vo));
+ }
+ else
+ {
+ emit_insn (gen_altivec_vmulosh (ve, operands[1], operands[2]));
+ emit_insn (gen_altivec_vmulesh (vo, operands[1], operands[2]));
+- emit_insn (gen_altivec_vmrghw_direct_v4si (operands[0], vo, ve));
++ emit_insn (gen_altivec_vmrglw (operands[0], ve, vo));
+ }
+ DONE;
+ })
+@@ -3882,13 +3914,13 @@ (define_expand "vec_widen_smult_lo_v8hi"
+ {
+ emit_insn (gen_altivec_vmulesh (ve, operands[1], operands[2]));
+ emit_insn (gen_altivec_vmulosh (vo, operands[1], operands[2]));
+- emit_insn (gen_altivec_vmrglw_direct_v4si (operands[0], ve, vo));
++ emit_insn (gen_altivec_vmrglw (operands[0], ve, vo));
+ }
+ else
+ {
+ emit_insn (gen_altivec_vmulosh (ve, operands[1], operands[2]));
+ emit_insn (gen_altivec_vmulesh (vo, operands[1], operands[2]));
+- emit_insn (gen_altivec_vmrglw_direct_v4si (operands[0], vo, ve));
++ emit_insn (gen_altivec_vmrghw (operands[0], ve, vo));
+ }
+ DONE;
+ })
+diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
+index 9cfde1a52ea..b3d648312f1 100644
+--- a/gcc/config/rs6000/rs6000.cc
++++ b/gcc/config/rs6000/rs6000.cc
+@@ -23174,8 +23174,8 @@ altivec_expand_vec_perm_const (rtx target, rtx op0, rtx op1,
+ : CODE_FOR_altivec_vmrglh_direct,
+ {0, 1, 16, 17, 2, 3, 18, 19, 4, 5, 20, 21, 6, 7, 22, 23}},
+ {OPTION_MASK_ALTIVEC,
+- BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrghw_direct_v4si
+- : CODE_FOR_altivec_vmrglw_direct_v4si,
++ BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrghw_direct_v4si_be
++ : CODE_FOR_altivec_vmrglw_direct_v4si_le,
+ {0, 1, 2, 3, 16, 17, 18, 19, 4, 5, 6, 7, 20, 21, 22, 23}},
+ {OPTION_MASK_ALTIVEC,
+ BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrglb_direct
+@@ -23186,8 +23186,8 @@ altivec_expand_vec_perm_const (rtx target, rtx op0, rtx op1,
+ : CODE_FOR_altivec_vmrghh_direct,
+ {8, 9, 24, 25, 10, 11, 26, 27, 12, 13, 28, 29, 14, 15, 30, 31}},
+ {OPTION_MASK_ALTIVEC,
+- BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrglw_direct_v4si
+- : CODE_FOR_altivec_vmrghw_direct_v4si,
++ BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrglw_direct_v4si_be
++ : CODE_FOR_altivec_vmrghw_direct_v4si_le,
+ {8, 9, 10, 11, 24, 25, 26, 27, 12, 13, 14, 15, 28, 29, 30, 31}},
+ {OPTION_MASK_P8_VECTOR,
+ BYTES_BIG_ENDIAN ? CODE_FOR_p8_vmrgew_v4sf_direct
+diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md
+index f70d69ee4b9..b9a1bfb5c16 100644
+--- a/gcc/config/rs6000/vsx.md
++++ b/gcc/config/rs6000/vsx.md
+@@ -4683,12 +4683,14 @@ (define_expand "vsx_xxmrghw_"
+ (const_int 1) (const_int 5)])))]
+ "VECTOR_MEM_VSX_P (mode)"
+ {
+- rtx (*fun) (rtx, rtx, rtx);
+- fun = BYTES_BIG_ENDIAN ? gen_altivec_vmrghw_direct_
+- : gen_altivec_vmrglw_direct_;
+- if (!BYTES_BIG_ENDIAN)
+- std::swap (operands[1], operands[2]);
+- emit_insn (fun (operands[0], operands[1], operands[2]));
++ if (BYTES_BIG_ENDIAN)
++ emit_insn (gen_altivec_vmrghw_direct_v4si_be (operands[0],
++ operands[1],
++ operands[2]));
++ else
++ emit_insn (gen_altivec_vmrglw_direct_v4si_le (operands[0],
++ operands[2],
++ operands[1]));
+ DONE;
+ }
+ [(set_attr "type" "vecperm")])
+@@ -4703,12 +4705,14 @@ (define_expand "vsx_xxmrglw_"
+ (const_int 3) (const_int 7)])))]
+ "VECTOR_MEM_VSX_P (mode)"
+ {
+- rtx (*fun) (rtx, rtx, rtx);
+- fun = BYTES_BIG_ENDIAN ? gen_altivec_vmrglw_direct_
+- : gen_altivec_vmrghw_direct_;
+- if (!BYTES_BIG_ENDIAN)
+- std::swap (operands[1], operands[2]);
+- emit_insn (fun (operands[0], operands[1], operands[2]));
++ if (BYTES_BIG_ENDIAN)
++ emit_insn (gen_altivec_vmrglw_direct_v4si_be (operands[0],
++ operands[1],
++ operands[2]));
++ else
++ emit_insn (gen_altivec_vmrghw_direct_v4si_le (operands[0],
++ operands[2],
++ operands[1]));
+ DONE;
+ }
+ [(set_attr "type" "vecperm")])
+diff --git a/gcc/testsuite/g++.target/powerpc/pr106069.C b/gcc/testsuite/g++.target/powerpc/pr106069.C
+new file mode 100644
+index 00000000000..537207d2fe8
+--- /dev/null
++++ b/gcc/testsuite/g++.target/powerpc/pr106069.C
+@@ -0,0 +1,119 @@
++/* { dg-options "-O -fno-tree-forwprop -maltivec" } */
++/* { dg-require-effective-target vmx_hw } */
++/* { dg-do run } */
++
++typedef __attribute__ ((altivec (vector__))) unsigned native_simd_type;
++
++union
++{
++ native_simd_type V;
++ int R[4];
++} store_le_vec;
++
++struct S
++{
++ S () = default;
++ S (unsigned B0)
++ {
++ native_simd_type val{B0};
++ m_simd = val;
++ }
++ void store_le (unsigned int out[])
++ {
++ store_le_vec.V = m_simd;
++ unsigned int x0 = store_le_vec.R[0];
++ __builtin_memcpy (out, &x0, 4);
++ }
++ S rotl (unsigned int r)
++ {
++ native_simd_type rot{r};
++ return __builtin_vec_rl (m_simd, rot);
++ }
++ void operator+= (S other)
++ {
++ m_simd = __builtin_vec_add (m_simd, other.m_simd);
++ }
++ void operator^= (S other)
++ {
++ m_simd = __builtin_vec_xor (m_simd, other.m_simd);
++ }
++ static void transpose (S &B0, S B1, S B2, S B3)
++ {
++ native_simd_type T0 = __builtin_vec_mergeh (B0.m_simd, B2.m_simd);
++ native_simd_type T1 = __builtin_vec_mergeh (B1.m_simd, B3.m_simd);
++ native_simd_type T2 = __builtin_vec_mergel (B0.m_simd, B2.m_simd);
++ native_simd_type T3 = __builtin_vec_mergel (B1.m_simd, B3.m_simd);
++ B0 = __builtin_vec_mergeh (T0, T1);
++ B3 = __builtin_vec_mergel (T2, T3);
++ }
++ S (native_simd_type x) : m_simd (x) {}
++ native_simd_type m_simd;
++};
++
++void
++foo (unsigned int output[], unsigned state[])
++{
++ S R00 = state[0];
++ S R01 = state[0];
++ S R02 = state[2];
++ S R03 = state[0];
++ S R05 = state[5];
++ S R06 = state[6];
++ S R07 = state[7];
++ S R08 = state[8];
++ S R09 = state[9];
++ S R10 = state[10];
++ S R11 = state[11];
++ S R12 = state[12];
++ S R13 = state[13];
++ S R14 = state[4];
++ S R15 = state[15];
++ for (int r = 0; r != 10; ++r)
++ {
++ R09 += R13;
++ R11 += R15;
++ R05 ^= R09;
++ R06 ^= R10;
++ R07 ^= R11;
++ R07 = R07.rotl (7);
++ R00 += R05;
++ R01 += R06;
++ R02 += R07;
++ R15 ^= R00;
++ R12 ^= R01;
++ R13 ^= R02;
++ R00 += R05;
++ R01 += R06;
++ R02 += R07;
++ R15 ^= R00;
++ R12 = R12.rotl (8);
++ R13 = R13.rotl (8);
++ R10 += R15;
++ R11 += R12;
++ R08 += R13;
++ R09 += R14;
++ R05 ^= R10;
++ R06 ^= R11;
++ R07 ^= R08;
++ R05 = R05.rotl (7);
++ R06 = R06.rotl (7);
++ R07 = R07.rotl (7);
++ }
++ R00 += state[0];
++ S::transpose (R00, R01, R02, R03);
++ R00.store_le (output);
++}
++
++unsigned int res[1];
++unsigned main_state[]{1634760805, 60878, 2036477234, 6,
++ 0, 825562964, 1471091955, 1346092787,
++ 506976774, 4197066702, 518848283, 118491664,
++ 0, 0, 0, 0};
++int
++main ()
++{
++ foo (res, main_state);
++ if (res[0] != 0x41fcef98)
++ __builtin_abort ();
++ return 0;
++}
+diff --git a/gcc/testsuite/gcc.target/powerpc/pr115355.c b/gcc/testsuite/gcc.target/powerpc/pr115355.c
+new file mode 100644
+index 00000000000..8955126b808
+--- /dev/null
++++ b/gcc/testsuite/gcc.target/powerpc/pr115355.c
+@@ -0,0 +1,37 @@
++/* { dg-do run } */
++/* { dg-require-effective-target p9vector_hw } */
++/* Force vectorization with -fno-vect-cost-model to have vector unpack
++ which exposes the issue in PR115355. */
++/* { dg-options "-O2 -mdejagnu-cpu=power9 -fno-vect-cost-model" } */
++
++/* Verify it runs successfully. */
++
++__attribute__((noipa))
++void setToIdentityGOOD(unsigned long long *mVec, unsigned int mLen)
++{
++ #pragma GCC novector
++ for (unsigned int i = 0; i < mLen; i++)
++ mVec[i] = i;
++}
++
++__attribute__((noipa))
++void setToIdentityBAD(unsigned long long *mVec, unsigned int mLen)
++{
++ for (unsigned int i = 0; i < mLen; i++)
++ mVec[i] = i;
++}
++
++unsigned long long vec1[100];
++unsigned long long vec2[100];
++
++int main()
++{
++ unsigned int l = 29;
++ setToIdentityGOOD (vec1, 29);
++ setToIdentityBAD (vec2, 29);
++
++ if (__builtin_memcmp (vec1, vec2, l * sizeof (vec1[0])) != 0)
++ __builtin_abort ();
++
++ return 0;
++}
diff --git a/SOURCES/gcc13-vector-merge-2.patch b/SOURCES/gcc13-vector-merge-2.patch
new file mode 100644
index 0000000..3a5cbfb
--- /dev/null
+++ b/SOURCES/gcc13-vector-merge-2.patch
@@ -0,0 +1,240 @@
+commit ffdd377fc07cdc7b62669d354e23f30940eaaffe
+Author: Kewen Lin
+Date: Wed Jun 26 02:16:17 2024 -0500
+
+ rs6000: Fix wrong RTL patterns for vector merge high/low char on LE
+
+ Commit r12-4496 changes some define_expands and define_insns
+ for vector merge high/low char, which are altivec_vmrg[hl]b.
+ These defines are mainly for built-in function vec_merge{h,l}
+ and some internal gen function needs. These functions should
+ consider endianness, taking vec_mergeh as example, as PVIPR
+ defines, vec_mergeh "Merges the first halves (in element order)
+ of two vectors", it does note it's in element order. So it's
+ mapped into vmrghb on BE while vmrglb on LE respectively.
+ Although the mapped insns are different, as the discussion in
+ PR106069, the RTL pattern should be still the same, it is
+ conformed before commit r12-4496, but gets changed into
+ different patterns on BE and LE starting from commit r12-4496.
+ Similar to 32-bit element case in commit log of r15-1504, this
+ 8-bit element pattern on LE doesn't actually match what the
+ underlying insn is intended to represent, once some optimization
+ like combine does some changes basing on it, it would cause
+ the unexpected consequence. The newly constructed test case
+ pr106069-1.c is a typical example for this issue.
+
+ So this patch is to fix the wrong RTL pattern, ensure the
+ associated RTL patterns become the same as before which can
+ have the same semantic as their mapped insns. With the
+ proposed patch, the expanders like altivec_vmrghb expands
+ into altivec_vmrghb_direct_be or altivec_vmrglb_direct_le
+ depending on endianness, "direct" can easily show which
+ insn would be generated, _be and _le are mainly for the
+ different RTL patterns as endianness.
+
+ Co-authored-by: Xionghu Luo
+
+ PR target/106069
+ PR target/115355
+
+ gcc/ChangeLog:
+
+ * config/rs6000/altivec.md (altivec_vmrghb_direct): Rename to ...
+ (altivec_vmrghb_direct_be): ... this. Add condition BYTES_BIG_ENDIAN.
+ (altivec_vmrghb_direct_le): New define_insn.
+ (altivec_vmrglb_direct): Rename to ...
+ (altivec_vmrglb_direct_be): ... this. Add condition BYTES_BIG_ENDIAN.
+ (altivec_vmrglb_direct_le): New define_insn.
+ (altivec_vmrghb): Adjust by calling gen_altivec_vmrghb_direct_be
+ for BE and gen_altivec_vmrglb_direct_le for LE.
+ (altivec_vmrglb): Adjust by calling gen_altivec_vmrglb_direct_be
+ for BE and gen_altivec_vmrghb_direct_le for LE.
+ * config/rs6000/rs6000.cc (altivec_expand_vec_perm_const): Replace
+ CODE_FOR_altivec_vmrghb_direct by
+ CODE_FOR_altivec_vmrghb_direct_be for BE and
+ CODE_FOR_altivec_vmrghb_direct_le for LE. And replace
+ CODE_FOR_altivec_vmrglb_direct by
+ CODE_FOR_altivec_vmrglb_direct_be for BE and
+ CODE_FOR_altivec_vmrglb_direct_le for LE.
+
+ gcc/testsuite/ChangeLog:
+
+ * gcc.target/powerpc/pr106069-1.c: New test.
+
+ (cherry picked from commit 62520e4e9f7e2fe8a16ee57a4bd35da2e921ae22)
+
+diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md
+index 92e2e4a4090..47664204bc5 100644
+--- a/gcc/config/rs6000/altivec.md
++++ b/gcc/config/rs6000/altivec.md
+@@ -1152,15 +1152,16 @@ (define_expand "altivec_vmrghb"
+ (use (match_operand:V16QI 2 "register_operand"))]
+ "TARGET_ALTIVEC"
+ {
+- rtx (*fun) (rtx, rtx, rtx) = BYTES_BIG_ENDIAN ? gen_altivec_vmrghb_direct
+- : gen_altivec_vmrglb_direct;
+- if (!BYTES_BIG_ENDIAN)
+- std::swap (operands[1], operands[2]);
+- emit_insn (fun (operands[0], operands[1], operands[2]));
++ if (BYTES_BIG_ENDIAN)
++ emit_insn (
++ gen_altivec_vmrghb_direct_be (operands[0], operands[1], operands[2]));
++ else
++ emit_insn (
++ gen_altivec_vmrglb_direct_le (operands[0], operands[2], operands[1]));
+ DONE;
+ })
+
+-(define_insn "altivec_vmrghb_direct"
++(define_insn "altivec_vmrghb_direct_be"
+ [(set (match_operand:V16QI 0 "register_operand" "=v")
+ (vec_select:V16QI
+ (vec_concat:V32QI
+@@ -1174,7 +1175,25 @@ (define_insn "altivec_vmrghb_direct"
+ (const_int 5) (const_int 21)
+ (const_int 6) (const_int 22)
+ (const_int 7) (const_int 23)])))]
+- "TARGET_ALTIVEC"
++ "TARGET_ALTIVEC && BYTES_BIG_ENDIAN"
++ "vmrghb %0,%1,%2"
++ [(set_attr "type" "vecperm")])
++
++(define_insn "altivec_vmrghb_direct_le"
++ [(set (match_operand:V16QI 0 "register_operand" "=v")
++ (vec_select:V16QI
++ (vec_concat:V32QI
++ (match_operand:V16QI 2 "register_operand" "v")
++ (match_operand:V16QI 1 "register_operand" "v"))
++ (parallel [(const_int 8) (const_int 24)
++ (const_int 9) (const_int 25)
++ (const_int 10) (const_int 26)
++ (const_int 11) (const_int 27)
++ (const_int 12) (const_int 28)
++ (const_int 13) (const_int 29)
++ (const_int 14) (const_int 30)
++ (const_int 15) (const_int 31)])))]
++ "TARGET_ALTIVEC && !BYTES_BIG_ENDIAN"
+ "vmrghb %0,%1,%2"
+ [(set_attr "type" "vecperm")])
+
+@@ -1274,15 +1293,16 @@ (define_expand "altivec_vmrglb"
+ (use (match_operand:V16QI 2 "register_operand"))]
+ "TARGET_ALTIVEC"
+ {
+- rtx (*fun) (rtx, rtx, rtx) = BYTES_BIG_ENDIAN ? gen_altivec_vmrglb_direct
+- : gen_altivec_vmrghb_direct;
+- if (!BYTES_BIG_ENDIAN)
+- std::swap (operands[1], operands[2]);
+- emit_insn (fun (operands[0], operands[1], operands[2]));
++ if (BYTES_BIG_ENDIAN)
++ emit_insn (
++ gen_altivec_vmrglb_direct_be (operands[0], operands[1], operands[2]));
++ else
++ emit_insn (
++ gen_altivec_vmrghb_direct_le (operands[0], operands[2], operands[1]));
+ DONE;
+ })
+
+-(define_insn "altivec_vmrglb_direct"
++(define_insn "altivec_vmrglb_direct_be"
+ [(set (match_operand:V16QI 0 "register_operand" "=v")
+ (vec_select:V16QI
+ (vec_concat:V32QI
+@@ -1296,7 +1316,25 @@ (define_insn "altivec_vmrglb_direct"
+ (const_int 13) (const_int 29)
+ (const_int 14) (const_int 30)
+ (const_int 15) (const_int 31)])))]
+- "TARGET_ALTIVEC"
++ "TARGET_ALTIVEC && BYTES_BIG_ENDIAN"
++ "vmrglb %0,%1,%2"
++ [(set_attr "type" "vecperm")])
++
++(define_insn "altivec_vmrglb_direct_le"
++ [(set (match_operand:V16QI 0 "register_operand" "=v")
++ (vec_select:V16QI
++ (vec_concat:V32QI
++ (match_operand:V16QI 2 "register_operand" "v")
++ (match_operand:V16QI 1 "register_operand" "v"))
++ (parallel [(const_int 0) (const_int 16)
++ (const_int 1) (const_int 17)
++ (const_int 2) (const_int 18)
++ (const_int 3) (const_int 19)
++ (const_int 4) (const_int 20)
++ (const_int 5) (const_int 21)
++ (const_int 6) (const_int 22)
++ (const_int 7) (const_int 23)])))]
++ "TARGET_ALTIVEC && !BYTES_BIG_ENDIAN"
+ "vmrglb %0,%1,%2"
+ [(set_attr "type" "vecperm")])
+
+diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
+index b3d648312f1..10088033aa1 100644
+--- a/gcc/config/rs6000/rs6000.cc
++++ b/gcc/config/rs6000/rs6000.cc
+@@ -23166,8 +23166,8 @@ altivec_expand_vec_perm_const (rtx target, rtx op0, rtx op1,
+ CODE_FOR_altivec_vpkuwum_direct,
+ {2, 3, 6, 7, 10, 11, 14, 15, 18, 19, 22, 23, 26, 27, 30, 31}},
+ {OPTION_MASK_ALTIVEC,
+- BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrghb_direct
+- : CODE_FOR_altivec_vmrglb_direct,
++ BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrghb_direct_be
++ : CODE_FOR_altivec_vmrglb_direct_le,
+ {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}},
+ {OPTION_MASK_ALTIVEC,
+ BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrghh_direct
+@@ -23178,8 +23178,8 @@ altivec_expand_vec_perm_const (rtx target, rtx op0, rtx op1,
+ : CODE_FOR_altivec_vmrglw_direct_v4si_le,
+ {0, 1, 2, 3, 16, 17, 18, 19, 4, 5, 6, 7, 20, 21, 22, 23}},
+ {OPTION_MASK_ALTIVEC,
+- BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrglb_direct
+- : CODE_FOR_altivec_vmrghb_direct,
++ BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrglb_direct_be
++ : CODE_FOR_altivec_vmrghb_direct_le,
+ {8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31}},
+ {OPTION_MASK_ALTIVEC,
+ BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrglh_direct
+diff --git a/gcc/testsuite/gcc.target/powerpc/pr106069-1.c b/gcc/testsuite/gcc.target/powerpc/pr106069-1.c
+new file mode 100644
+index 00000000000..4945d8fedfb
+--- /dev/null
++++ b/gcc/testsuite/gcc.target/powerpc/pr106069-1.c
+@@ -0,0 +1,39 @@
++/* { dg-do run } */
++/* { dg-options "-O2" } */
++/* { dg-require-effective-target vmx_hw } */
++
++/* Test vector merge for 8-bit element size,
++ it will abort if the RTL pattern isn't expected. */
++
++#include "altivec.h"
++
++__attribute__((noipa))
++signed char elem_6 (vector signed char a, vector signed char b)
++{
++ vector signed char c = vec_mergeh (a,b);
++ return vec_extract (c, 6);
++}
++
++__attribute__((noipa))
++unsigned char elem_15 (vector unsigned char a, vector unsigned char b)
++{
++ vector unsigned char c = vec_mergel (a,b);
++ return vec_extract (c, 15);
++}
++
++int
++main ()
++{
++ vector unsigned char v1
++ = {3, 33, 22, 12, 34, 14, 5, 25, 30, 11, 0, 21, 17, 27, 38, 8};
++ vector unsigned char v2
++ = {81, 82, 83, 84, 68, 67, 66, 65, 99, 100, 101, 102, 250, 125, 0, 6};
++ signed char x1 = elem_6 ((vector signed char) v1, (vector signed char) v2);
++ unsigned char x2 = elem_15 (v1, v2);
++
++ if (x1 != 12 || x2 != 6)
++ __builtin_abort ();
++
++ return 0;
++}
++
diff --git a/SOURCES/gcc13-vector-merge-3.patch b/SOURCES/gcc13-vector-merge-3.patch
new file mode 100644
index 0000000..c6ee970
--- /dev/null
+++ b/SOURCES/gcc13-vector-merge-3.patch
@@ -0,0 +1,306 @@
+commit bab38d9271ce3f26cb64b8cb712351eb3fedd559
+Author: Kewen Lin
+Date: Wed Jun 26 02:16:17 2024 -0500
+
+ rs6000: Fix wrong RTL patterns for vector merge high/low short on LE
+
+ Commit r12-4496 changes some define_expands and define_insns
+ for vector merge high/low short, which are altivec_vmrg[hl]h.
+ These defines are mainly for built-in function vec_merge{h,l}
+ and some internal gen function needs. These functions should
+ consider endianness, taking vec_mergeh as example, as PVIPR
+ defines, vec_mergeh "Merges the first halves (in element order)
+ of two vectors", it does note it's in element order. So it's
+ mapped into vmrghh on BE while vmrglh on LE respectively.
+ Although the mapped insns are different, as the discussion in
+ PR106069, the RTL pattern should be still the same, it is
+ conformed before commit r12-4496, but gets changed into
+ different patterns on BE and LE starting from commit r12-4496.
+ Similar to 32-bit element case in commit log of r15-1504, this
+ 16-bit element pattern on LE doesn't actually match what the
+ underlying insn is intended to represent, once some optimization
+ like combine does some changes basing on it, it would cause
+ the unexpected consequence. The newly constructed test case
+ pr106069-2.c is a typical example for this issue on element type
+ short.
+
+ So this patch is to fix the wrong RTL pattern, ensure the
+ associated RTL patterns become the same as before which can
+ have the same semantic as their mapped insns. With the
+ proposed patch, the expanders like altivec_vmrghh expands
+ into altivec_vmrghh_direct_be or altivec_vmrglh_direct_le
+ depending on endianness, "direct" can easily show which
+ insn would be generated, _be and _le are mainly for the
+ different RTL patterns as endianness.
+
+ Co-authored-by: Xionghu Luo
+
+ PR target/106069
+ PR target/115355
+
+ gcc/ChangeLog:
+
+ * config/rs6000/altivec.md (altivec_vmrghh_direct): Rename to ...
+ (altivec_vmrghh_direct_be): ... this. Add condition BYTES_BIG_ENDIAN.
+ (altivec_vmrghh_direct_le): New define_insn.
+ (altivec_vmrglh_direct): Rename to ...
+ (altivec_vmrglh_direct_be): ... this. Add condition BYTES_BIG_ENDIAN.
+ (altivec_vmrglh_direct_le): New define_insn.
+ (altivec_vmrghh): Adjust by calling gen_altivec_vmrghh_direct_be
+ for BE and gen_altivec_vmrglh_direct_le for LE.
+ (altivec_vmrglh): Adjust by calling gen_altivec_vmrglh_direct_be
+ for BE and gen_altivec_vmrghh_direct_le for LE.
+ (vec_widen_umult_hi_v16qi): Adjust the call to
+ gen_altivec_vmrghh_direct by gen_altivec_vmrghh for BE
+ and by gen_altivec_vmrglh for LE.
+ (vec_widen_smult_hi_v16qi): Likewise.
+ (vec_widen_umult_lo_v16qi): Adjust the call to
+ gen_altivec_vmrglh_direct by gen_altivec_vmrglh for BE
+ and by gen_altivec_vmrghh for LE.
+ (vec_widen_smult_lo_v16qi): Likewise.
+ * config/rs6000/rs6000.cc (altivec_expand_vec_perm_const): Replace
+ CODE_FOR_altivec_vmrghh_direct by
+ CODE_FOR_altivec_vmrghh_direct_be for BE and
+ CODE_FOR_altivec_vmrghh_direct_le for LE. And replace
+ CODE_FOR_altivec_vmrglh_direct by
+ CODE_FOR_altivec_vmrglh_direct_be for BE and
+ CODE_FOR_altivec_vmrglh_direct_le for LE.
+
+ gcc/testsuite/ChangeLog:
+
+ * gcc.target/powerpc/pr106069-2.c: New test.
+
+ (cherry picked from commit 812c70bf4981958488331d4ea5af8709b5321da1)
+
+diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md
+index 47664204bc5..6557393a97c 100644
+--- a/gcc/config/rs6000/altivec.md
++++ b/gcc/config/rs6000/altivec.md
+@@ -1203,17 +1203,18 @@ (define_expand "altivec_vmrghh"
+ (use (match_operand:V8HI 2 "register_operand"))]
+ "TARGET_ALTIVEC"
+ {
+- rtx (*fun) (rtx, rtx, rtx) = BYTES_BIG_ENDIAN ? gen_altivec_vmrghh_direct
+- : gen_altivec_vmrglh_direct;
+- if (!BYTES_BIG_ENDIAN)
+- std::swap (operands[1], operands[2]);
+- emit_insn (fun (operands[0], operands[1], operands[2]));
++ if (BYTES_BIG_ENDIAN)
++ emit_insn (
++ gen_altivec_vmrghh_direct_be (operands[0], operands[1], operands[2]));
++ else
++ emit_insn (
++ gen_altivec_vmrglh_direct_le (operands[0], operands[2], operands[1]));
+ DONE;
+ })
+
+-(define_insn "altivec_vmrghh_direct"
++(define_insn "altivec_vmrghh_direct_be"
+ [(set (match_operand:V8HI 0 "register_operand" "=v")
+- (vec_select:V8HI
++ (vec_select:V8HI
+ (vec_concat:V16HI
+ (match_operand:V8HI 1 "register_operand" "v")
+ (match_operand:V8HI 2 "register_operand" "v"))
+@@ -1221,7 +1222,21 @@ (define_insn "altivec_vmrghh_direct"
+ (const_int 1) (const_int 9)
+ (const_int 2) (const_int 10)
+ (const_int 3) (const_int 11)])))]
+- "TARGET_ALTIVEC"
++ "TARGET_ALTIVEC && BYTES_BIG_ENDIAN"
++ "vmrghh %0,%1,%2"
++ [(set_attr "type" "vecperm")])
++
++(define_insn "altivec_vmrghh_direct_le"
++ [(set (match_operand:V8HI 0 "register_operand" "=v")
++ (vec_select:V8HI
++ (vec_concat:V16HI
++ (match_operand:V8HI 2 "register_operand" "v")
++ (match_operand:V8HI 1 "register_operand" "v"))
++ (parallel [(const_int 4) (const_int 12)
++ (const_int 5) (const_int 13)
++ (const_int 6) (const_int 14)
++ (const_int 7) (const_int 15)])))]
++ "TARGET_ALTIVEC && !BYTES_BIG_ENDIAN"
+ "vmrghh %0,%1,%2"
+ [(set_attr "type" "vecperm")])
+
+@@ -1344,15 +1359,16 @@ (define_expand "altivec_vmrglh"
+ (use (match_operand:V8HI 2 "register_operand"))]
+ "TARGET_ALTIVEC"
+ {
+- rtx (*fun) (rtx, rtx, rtx) = BYTES_BIG_ENDIAN ? gen_altivec_vmrglh_direct
+- : gen_altivec_vmrghh_direct;
+- if (!BYTES_BIG_ENDIAN)
+- std::swap (operands[1], operands[2]);
+- emit_insn (fun (operands[0], operands[1], operands[2]));
++ if (BYTES_BIG_ENDIAN)
++ emit_insn (
++ gen_altivec_vmrglh_direct_be (operands[0], operands[1], operands[2]));
++ else
++ emit_insn (
++ gen_altivec_vmrghh_direct_le (operands[0], operands[2], operands[1]));
+ DONE;
+ })
+
+-(define_insn "altivec_vmrglh_direct"
++(define_insn "altivec_vmrglh_direct_be"
+ [(set (match_operand:V8HI 0 "register_operand" "=v")
+ (vec_select:V8HI
+ (vec_concat:V16HI
+@@ -1362,7 +1378,21 @@ (define_insn "altivec_vmrglh_direct"
+ (const_int 5) (const_int 13)
+ (const_int 6) (const_int 14)
+ (const_int 7) (const_int 15)])))]
+- "TARGET_ALTIVEC"
++ "TARGET_ALTIVEC && BYTES_BIG_ENDIAN"
++ "vmrglh %0,%1,%2"
++ [(set_attr "type" "vecperm")])
++
++(define_insn "altivec_vmrglh_direct_le"
++ [(set (match_operand:V8HI 0 "register_operand" "=v")
++ (vec_select:V8HI
++ (vec_concat:V16HI
++ (match_operand:V8HI 2 "register_operand" "v")
++ (match_operand:V8HI 1 "register_operand" "v"))
++ (parallel [(const_int 0) (const_int 8)
++ (const_int 1) (const_int 9)
++ (const_int 2) (const_int 10)
++ (const_int 3) (const_int 11)])))]
++ "TARGET_ALTIVEC && !BYTES_BIG_ENDIAN"
+ "vmrglh %0,%1,%2"
+ [(set_attr "type" "vecperm")])
+
+@@ -3777,13 +3807,13 @@ (define_expand "vec_widen_umult_hi_v16qi"
+ {
+ emit_insn (gen_altivec_vmuleub (ve, operands[1], operands[2]));
+ emit_insn (gen_altivec_vmuloub (vo, operands[1], operands[2]));
+- emit_insn (gen_altivec_vmrghh_direct (operands[0], ve, vo));
++ emit_insn (gen_altivec_vmrghh (operands[0], ve, vo));
+ }
+ else
+ {
+ emit_insn (gen_altivec_vmuloub (ve, operands[1], operands[2]));
+ emit_insn (gen_altivec_vmuleub (vo, operands[1], operands[2]));
+- emit_insn (gen_altivec_vmrghh_direct (operands[0], vo, ve));
++ emit_insn (gen_altivec_vmrglh (operands[0], ve, vo));
+ }
+ DONE;
+ })
+@@ -3802,13 +3832,13 @@ (define_expand "vec_widen_umult_lo_v16qi"
+ {
+ emit_insn (gen_altivec_vmuleub (ve, operands[1], operands[2]));
+ emit_insn (gen_altivec_vmuloub (vo, operands[1], operands[2]));
+- emit_insn (gen_altivec_vmrglh_direct (operands[0], ve, vo));
++ emit_insn (gen_altivec_vmrglh (operands[0], ve, vo));
+ }
+ else
+ {
+ emit_insn (gen_altivec_vmuloub (ve, operands[1], operands[2]));
+ emit_insn (gen_altivec_vmuleub (vo, operands[1], operands[2]));
+- emit_insn (gen_altivec_vmrglh_direct (operands[0], vo, ve));
++ emit_insn (gen_altivec_vmrghh (operands[0], ve, vo));
+ }
+ DONE;
+ })
+@@ -3827,13 +3857,13 @@ (define_expand "vec_widen_smult_hi_v16qi"
+ {
+ emit_insn (gen_altivec_vmulesb (ve, operands[1], operands[2]));
+ emit_insn (gen_altivec_vmulosb (vo, operands[1], operands[2]));
+- emit_insn (gen_altivec_vmrghh_direct (operands[0], ve, vo));
++ emit_insn (gen_altivec_vmrghh (operands[0], ve, vo));
+ }
+ else
+ {
+ emit_insn (gen_altivec_vmulosb (ve, operands[1], operands[2]));
+ emit_insn (gen_altivec_vmulesb (vo, operands[1], operands[2]));
+- emit_insn (gen_altivec_vmrghh_direct (operands[0], vo, ve));
++ emit_insn (gen_altivec_vmrglh (operands[0], ve, vo));
+ }
+ DONE;
+ })
+@@ -3852,13 +3882,13 @@ (define_expand "vec_widen_smult_lo_v16qi"
+ {
+ emit_insn (gen_altivec_vmulesb (ve, operands[1], operands[2]));
+ emit_insn (gen_altivec_vmulosb (vo, operands[1], operands[2]));
+- emit_insn (gen_altivec_vmrglh_direct (operands[0], ve, vo));
++ emit_insn (gen_altivec_vmrglh (operands[0], ve, vo));
+ }
+ else
+ {
+ emit_insn (gen_altivec_vmulosb (ve, operands[1], operands[2]));
+ emit_insn (gen_altivec_vmulesb (vo, operands[1], operands[2]));
+- emit_insn (gen_altivec_vmrglh_direct (operands[0], vo, ve));
++ emit_insn (gen_altivec_vmrghh (operands[0], ve, vo));
+ }
+ DONE;
+ })
+diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
+index 10088033aa1..76eb89ad529 100644
+--- a/gcc/config/rs6000/rs6000.cc
++++ b/gcc/config/rs6000/rs6000.cc
+@@ -23170,8 +23170,8 @@ altivec_expand_vec_perm_const (rtx target, rtx op0, rtx op1,
+ : CODE_FOR_altivec_vmrglb_direct_le,
+ {0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23}},
+ {OPTION_MASK_ALTIVEC,
+- BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrghh_direct
+- : CODE_FOR_altivec_vmrglh_direct,
++ BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrghh_direct_be
++ : CODE_FOR_altivec_vmrglh_direct_le,
+ {0, 1, 16, 17, 2, 3, 18, 19, 4, 5, 20, 21, 6, 7, 22, 23}},
+ {OPTION_MASK_ALTIVEC,
+ BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrghw_direct_v4si_be
+@@ -23182,8 +23182,8 @@ altivec_expand_vec_perm_const (rtx target, rtx op0, rtx op1,
+ : CODE_FOR_altivec_vmrghb_direct_le,
+ {8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31}},
+ {OPTION_MASK_ALTIVEC,
+- BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrglh_direct
+- : CODE_FOR_altivec_vmrghh_direct,
++ BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrglh_direct_be
++ : CODE_FOR_altivec_vmrghh_direct_le,
+ {8, 9, 24, 25, 10, 11, 26, 27, 12, 13, 28, 29, 14, 15, 30, 31}},
+ {OPTION_MASK_ALTIVEC,
+ BYTES_BIG_ENDIAN ? CODE_FOR_altivec_vmrglw_direct_v4si_be
+diff --git a/gcc/testsuite/gcc.target/powerpc/pr106069-2.c b/gcc/testsuite/gcc.target/powerpc/pr106069-2.c
+new file mode 100644
+index 00000000000..283e3290fb3
+--- /dev/null
++++ b/gcc/testsuite/gcc.target/powerpc/pr106069-2.c
+@@ -0,0 +1,37 @@
++/* { dg-do run } */
++/* { dg-options "-O2" } */
++/* { dg-require-effective-target vmx_hw } */
++
++/* Test vector merge for 16-bit element size,
++ it will abort if the RTL pattern isn't expected. */
++
++#include "altivec.h"
++
++__attribute__((noipa))
++signed short elem_2 (vector signed short a, vector signed short b)
++{
++ vector signed short c = vec_mergeh (a,b);
++ return vec_extract (c, 2);
++}
++
++__attribute__((noipa))
++unsigned short elem_7 (vector unsigned short a, vector unsigned short b)
++{
++ vector unsigned short c = vec_mergel (a,b);
++ return vec_extract (c, 7);
++}
++
++int
++main ()
++{
++ vector unsigned short v1 = {3, 22, 12, 34, 5, 25, 30, 11};
++ vector unsigned short v2 = {84, 168, 267, 966, 65, 399, 999, 99};
++ signed short x1 = elem_2 ((vector signed short) v1, (vector signed short) v2);
++ unsigned short x2 = elem_7 (v1, v2);
++
++ if (x1 != 22 || x2 != 99)
++ __builtin_abort ();
++
++ return 0;
++}
++
diff --git a/SOURCES/gcc13-znver5.patch b/SOURCES/gcc13-znver5.patch
new file mode 100644
index 0000000..967d073
--- /dev/null
+++ b/SOURCES/gcc13-znver5.patch
@@ -0,0 +1,2246 @@
+From 9ae3d1ceadd90c134fc4365b36ceb552decb227f Mon Sep 17 00:00:00 2001
+From: Marek Polacek
+Date: Thu, 30 May 2024 16:21:45 -0400
+Subject: [PATCH] Add AMD znver5 processor enablement with scheduler model
+
+2024-02-14 Jan Hubicka
+ Karthiban Anbazhagan
+
+gcc/ChangeLog:
+ * common/config/i386/cpuinfo.h (get_amd_cpu): Recognize znver5.
+ * common/config/i386/i386-common.cc (processor_names): Add znver5.
+ (processor_alias_table): Likewise.
+ * common/config/i386/i386-cpuinfo.h (processor_types): Add new zen
+ family.
+ (processor_subtypes): Add znver5.
+ * config.gcc (x86_64-*-* |...): Likewise.
+ * config/i386/driver-i386.cc (host_detect_local_cpu): Let
+ march=native detect znver5 cpu's.
+ * config/i386/i386-c.cc (ix86_target_macros_internal): Add
+ znver5.
+ * config/i386/i386-options.cc (m_ZNVER5): New definition
+ (processor_cost_table): Add znver5.
+ * config/i386/i386.cc (ix86_reassociation_width): Likewise.
+ * config/i386/i386.h (processor_type): Add PROCESSOR_ZNVER5
+ (PTA_ZNVER5): New definition.
+ * config/i386/i386.md (define_attr "cpu"): Add znver5.
+ (Scheduling descriptions) Add znver5.md.
+ * config/i386/x86-tune-costs.h (znver5_cost): New definition.
+ * config/i386/x86-tune-sched.cc (ix86_issue_rate): Add znver5.
+ (ix86_adjust_cost): Likewise.
+ * config/i386/x86-tune.def (avx512_move_by_pieces): Add m_ZNVER5.
+ (avx512_store_by_pieces): Add m_ZNVER5.
+ * doc/extend.texi: Add znver5.
+ * doc/invoke.texi: Likewise.
+ * config/i386/znver4.md: Rename to zn4zn5.md; combine znver4 and znver5 Scheduler.
+
+gcc/testsuite/ChangeLog:
+ * g++.target/i386/mv29.C: Handle znver5 arch.
+ * gcc.target/i386/funcspec-56.inc:Likewise.
+---
+ gcc/common/config/i386/cpuinfo.h | 16 +
+ gcc/common/config/i386/i386-common.cc | 6 +-
+ gcc/common/config/i386/i386-cpuinfo.h | 2 +
+ gcc/config.gcc | 14 +-
+ gcc/config/i386/driver-i386.cc | 5 +
+ gcc/config/i386/i386-c.cc | 7 +
+ gcc/config/i386/i386-options.cc | 6 +-
+ gcc/config/i386/i386.cc | 3 +-
+ gcc/config/i386/i386.h | 3 +
+ gcc/config/i386/i386.md | 5 +-
+ gcc/config/i386/x86-tune-costs.h | 136 +++
+ gcc/config/i386/x86-tune-sched.cc | 2 +
+ gcc/config/i386/x86-tune.def | 4 +-
+ gcc/config/i386/{znver4.md => zn4zn5.md} | 817 ++++++++++++++++--
+ gcc/doc/extend.texi | 3 +
+ gcc/doc/invoke.texi | 10 +
+ gcc/testsuite/g++.target/i386/mv29.C | 6 +
+ gcc/testsuite/gcc.target/i386/funcspec-56.inc | 2 +
+ 18 files changed, 986 insertions(+), 61 deletions(-)
+ rename gcc/config/i386/{znver4.md => zn4zn5.md} (55%)
+
+diff --git a/gcc/common/config/i386/cpuinfo.h b/gcc/common/config/i386/cpuinfo.h
+index 441fae0cdc9..a2e28e47a7d 100644
+--- a/gcc/common/config/i386/cpuinfo.h
++++ b/gcc/common/config/i386/cpuinfo.h
+@@ -310,6 +310,22 @@ get_amd_cpu (struct __processor_model *cpu_model,
+ cpu_model->__cpu_subtype = AMDFAM19H_ZNVER3;
+ }
+ break;
++ case 0x1a:
++ cpu_model->__cpu_type = AMDFAM1AH;
++ if (model <= 0x77)
++ {
++ cpu = "znver5";
++ CHECK___builtin_cpu_is ("znver5");
++ cpu_model->__cpu_subtype = AMDFAM1AH_ZNVER5;
++ }
++ else if (has_cpu_feature (cpu_model, cpu_features2,
++ FEATURE_AVX512VP2INTERSECT))
++ {
++ cpu = "znver5";
++ CHECK___builtin_cpu_is ("znver5");
++ cpu_model->__cpu_subtype = AMDFAM1AH_ZNVER5;
++ }
++ break;
+ default:
+ break;
+ }
+diff --git a/gcc/common/config/i386/i386-common.cc b/gcc/common/config/i386/i386-common.cc
+index a8809889360..f3610155807 100644
+--- a/gcc/common/config/i386/i386-common.cc
++++ b/gcc/common/config/i386/i386-common.cc
+@@ -1983,7 +1983,8 @@ const char *const processor_names[] =
+ "znver1",
+ "znver2",
+ "znver3",
+- "znver4"
++ "znver4",
++ "znver5"
+ };
+
+ /* Guarantee that the array is aligned with enum processor_type. */
+@@ -2243,6 +2244,9 @@ const pta processor_alias_table[] =
+ {"znver4", PROCESSOR_ZNVER4, CPU_ZNVER4,
+ PTA_ZNVER4,
+ M_CPU_SUBTYPE (AMDFAM19H_ZNVER4), P_PROC_AVX512F},
++ {"znver5", PROCESSOR_ZNVER5, CPU_ZNVER5,
++ PTA_ZNVER5,
++ M_CPU_SUBTYPE (AMDFAM1AH_ZNVER5), P_PROC_AVX512F},
+ {"btver1", PROCESSOR_BTVER1, CPU_GENERIC,
+ PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
+ | PTA_SSSE3 | PTA_SSE4A | PTA_ABM | PTA_CX16 | PTA_PRFCHW
+diff --git a/gcc/common/config/i386/i386-cpuinfo.h b/gcc/common/config/i386/i386-cpuinfo.h
+index 254dfec70e5..77db97e36b3 100644
+--- a/gcc/common/config/i386/i386-cpuinfo.h
++++ b/gcc/common/config/i386/i386-cpuinfo.h
+@@ -62,6 +62,7 @@ enum processor_types
+ ZHAOXIN_FAM7H,
+ INTEL_SIERRAFOREST,
+ INTEL_GRANDRIDGE,
++ AMDFAM1AH,
+ CPU_TYPE_MAX,
+ BUILTIN_CPU_TYPE_MAX = CPU_TYPE_MAX
+ };
+@@ -99,6 +100,7 @@ enum processor_subtypes
+ AMDFAM19H_ZNVER4,
+ INTEL_COREI7_GRANITERAPIDS,
+ INTEL_COREI7_GRANITERAPIDS_D,
++ AMDFAM1AH_ZNVER5,
+ CPU_SUBTYPE_MAX
+ };
+
+diff --git a/gcc/config.gcc b/gcc/config.gcc
+index c3b73d05eb7..ae332a88768 100644
+--- a/gcc/config.gcc
++++ b/gcc/config.gcc
+@@ -675,9 +675,9 @@ c7 esther"
+ # 64-bit x86 processors supported by --with-arch=. Each processor
+ # MUST be separated by exactly one space.
+ x86_64_archs="amdfam10 athlon64 athlon64-sse3 barcelona bdver1 bdver2 \
+-bdver3 bdver4 znver1 znver2 znver3 znver4 btver1 btver2 k8 k8-sse3 opteron \
+-opteron-sse3 nocona core2 corei7 corei7-avx core-avx-i core-avx2 atom \
+-slm nehalem westmere sandybridge ivybridge haswell broadwell bonnell \
++bdver3 bdver4 znver1 znver2 znver3 znver4 znver5 btver1 btver2 k8 k8-sse3 \
++opteron opteron-sse3 nocona core2 corei7 corei7-avx core-avx-i core-avx2 \
++atom slm nehalem westmere sandybridge ivybridge haswell broadwell bonnell \
+ silvermont knl knm skylake-avx512 cannonlake icelake-client icelake-server \
+ skylake goldmont goldmont-plus tremont cascadelake tigerlake cooperlake \
+ sapphirerapids alderlake rocketlake eden-x2 nano nano-1000 nano-2000 nano-3000 \
+@@ -3681,6 +3681,10 @@ case ${target} in
+ arch=znver4
+ cpu=znver4
+ ;;
++ znver5-*)
++ arch=znver5
++ cpu=znver5
++ ;;
+ bdver4-*)
+ arch=bdver4
+ cpu=bdver4
+@@ -3814,6 +3818,10 @@ case ${target} in
+ arch=znver4
+ cpu=znver4
+ ;;
++ znver5-*)
++ arch=znver5
++ cpu=znver5
++ ;;
+ bdver4-*)
+ arch=bdver4
+ cpu=bdver4
+diff --git a/gcc/config/i386/driver-i386.cc b/gcc/config/i386/driver-i386.cc
+index 6a998f5dea5..f4eee496924 100644
+--- a/gcc/config/i386/driver-i386.cc
++++ b/gcc/config/i386/driver-i386.cc
+@@ -465,6 +465,8 @@ const char *host_detect_local_cpu (int argc, const char **argv)
+ processor = PROCESSOR_GEODE;
+ else if (has_feature (FEATURE_MOVBE) && family == 22)
+ processor = PROCESSOR_BTVER2;
++ else if (has_feature (FEATURE_AVX512VP2INTERSECT))
++ processor = PROCESSOR_ZNVER5;
+ else if (has_feature (FEATURE_AVX512F))
+ processor = PROCESSOR_ZNVER4;
+ else if (has_feature (FEATURE_VAES))
+@@ -793,6 +795,9 @@ const char *host_detect_local_cpu (int argc, const char **argv)
+ case PROCESSOR_ZNVER4:
+ cpu = "znver4";
+ break;
++ case PROCESSOR_ZNVER5:
++ cpu = "znver5";
++ break;
+ case PROCESSOR_BTVER1:
+ cpu = "btver1";
+ break;
+diff --git a/gcc/config/i386/i386-c.cc b/gcc/config/i386/i386-c.cc
+index 5b886e8a760..bbefb66e194 100644
+--- a/gcc/config/i386/i386-c.cc
++++ b/gcc/config/i386/i386-c.cc
+@@ -136,6 +136,10 @@ ix86_target_macros_internal (HOST_WIDE_INT isa_flag,
+ def_or_undef (parse_in, "__znver4");
+ def_or_undef (parse_in, "__znver4__");
+ break;
++ case PROCESSOR_ZNVER5:
++ def_or_undef (parse_in, "__znver5");
++ def_or_undef (parse_in, "__znver5__");
++ break;
+ case PROCESSOR_BTVER1:
+ def_or_undef (parse_in, "__btver1");
+ def_or_undef (parse_in, "__btver1__");
+@@ -353,6 +357,9 @@ ix86_target_macros_internal (HOST_WIDE_INT isa_flag,
+ case PROCESSOR_ZNVER4:
+ def_or_undef (parse_in, "__tune_znver4__");
+ break;
++ case PROCESSOR_ZNVER5:
++ def_or_undef (parse_in, "__tune_znver5__");
++ break;
+ case PROCESSOR_BTVER1:
+ def_or_undef (parse_in, "__tune_btver1__");
+ break;
+diff --git a/gcc/config/i386/i386-options.cc b/gcc/config/i386/i386-options.cc
+index c1229475138..86102851d4d 100644
+--- a/gcc/config/i386/i386-options.cc
++++ b/gcc/config/i386/i386-options.cc
+@@ -165,11 +165,12 @@ along with GCC; see the file COPYING3. If not see
+ #define m_ZNVER2 (HOST_WIDE_INT_1U<integer move cost is 2. */
++
++ /* reg-reg moves are done by renaming and thus they are even cheaper than
++ 1 cycle. Because reg-reg move cost is 2 and following tables correspond
++ to doubles of latencies, we do not model this correctly. It does not
++ seem to make practical difference to bump prices up even more. */
++ 6, /* cost for loading QImode using
++ movzbl. */
++ {6, 6, 6}, /* cost of loading integer registers
++ in QImode, HImode and SImode.
++ Relative to reg-reg move (2). */
++ {8, 8, 8}, /* cost of storing integer
++ registers. */
++ 2, /* cost of reg,reg fld/fst. */
++ {14, 14, 17}, /* cost of loading fp registers
++ in SFmode, DFmode and XFmode. */
++ {12, 12, 16}, /* cost of storing fp registers
++ in SFmode, DFmode and XFmode. */
++ 2, /* cost of moving MMX register. */
++ {6, 6}, /* cost of loading MMX registers
++ in SImode and DImode. */
++ {8, 8}, /* cost of storing MMX registers
++ in SImode and DImode. */
++ 2, 2, 3, /* cost of moving XMM,YMM,ZMM
++ register. */
++ {6, 6, 10, 10, 12}, /* cost of loading SSE registers
++ in 32,64,128,256 and 512-bit. */
++ {8, 8, 8, 12, 12}, /* cost of storing SSE registers
++ in 32,64,128,256 and 512-bit. */
++ 6, 8, /* SSE->integer and integer->SSE
++ moves. */
++ 8, 8, /* mask->integer and integer->mask moves */
++ {6, 6, 6}, /* cost of loading mask register
++ in QImode, HImode, SImode. */
++ {8, 8, 8}, /* cost if storing mask register
++ in QImode, HImode, SImode. */
++ 2, /* cost of moving mask register. */
++ /* End of register allocator costs. */
++ },
++
++ COSTS_N_INSNS (1), /* cost of an add instruction. */
++ /* TODO: Lea with 3 components has cost 2. */
++ COSTS_N_INSNS (1), /* cost of a lea instruction. */
++ COSTS_N_INSNS (1), /* variable shift costs. */
++ COSTS_N_INSNS (1), /* constant shift costs. */
++ {COSTS_N_INSNS (3), /* cost of starting multiply for QI. */
++ COSTS_N_INSNS (3), /* HI. */
++ COSTS_N_INSNS (3), /* SI. */
++ COSTS_N_INSNS (3), /* DI. */
++ COSTS_N_INSNS (3)}, /* other. */
++ 0, /* cost of multiply per each bit
++ set. */
++ {COSTS_N_INSNS (10), /* cost of a divide/mod for QI. */
++ COSTS_N_INSNS (11), /* HI. */
++ COSTS_N_INSNS (13), /* SI. */
++ COSTS_N_INSNS (16), /* DI. */
++ COSTS_N_INSNS (16)}, /* other. */
++ COSTS_N_INSNS (1), /* cost of movsx. */
++ COSTS_N_INSNS (1), /* cost of movzx. */
++ 8, /* "large" insn. */
++ 9, /* MOVE_RATIO. */
++ 6, /* CLEAR_RATIO */
++ {6, 6, 6}, /* cost of loading integer registers
++ in QImode, HImode and SImode.
++ Relative to reg-reg move (2). */
++ {8, 8, 8}, /* cost of storing integer
++ registers. */
++ {6, 6, 10, 10, 12}, /* cost of loading SSE registers
++ in 32bit, 64bit, 128bit, 256bit and 512bit */
++ {8, 8, 8, 12, 12}, /* cost of storing SSE register
++ in 32bit, 64bit, 128bit, 256bit and 512bit */
++ {6, 6, 6, 6, 6}, /* cost of unaligned loads. */
++ {8, 8, 8, 8, 8}, /* cost of unaligned stores. */
++ 2, 2, 2, /* cost of moving XMM,YMM,ZMM
++ register. */
++ 6, /* cost of moving SSE register to integer. */
++ /* VGATHERDPD is 17 uops and throughput is 4, VGATHERDPS is 24 uops,
++ throughput 5. Approx 7 uops do not depend on vector size and every load
++ is 5 uops. */
++ 14, 10, /* Gather load static, per_elt. */
++ 14, 20, /* Gather store static, per_elt. */
++ 32, /* size of l1 cache. */
++ 1024, /* size of l2 cache. */
++ 64, /* size of prefetch block. */
++ /* New AMD processors never drop prefetches; if they cannot be performed
++ immediately, they are queued. We set number of simultaneous prefetches
++ to a large constant to reflect this (it probably is not a good idea not
++ to limit number of prefetches at all, as their execution also takes some
++ time). */
++ 100, /* number of parallel prefetches. */
++ 3, /* Branch cost. */
++ COSTS_N_INSNS (7), /* cost of FADD and FSUB insns. */
++ COSTS_N_INSNS (7), /* cost of FMUL instruction. */
++ /* Latency of fdiv is 8-15. */
++ COSTS_N_INSNS (15), /* cost of FDIV instruction. */
++ COSTS_N_INSNS (1), /* cost of FABS instruction. */
++ COSTS_N_INSNS (1), /* cost of FCHS instruction. */
++ /* Latency of fsqrt is 4-10. */
++ COSTS_N_INSNS (25), /* cost of FSQRT instruction. */
++
++ COSTS_N_INSNS (1), /* cost of cheap SSE instruction. */
++ COSTS_N_INSNS (3), /* cost of ADDSS/SD SUBSS/SD insns. */
++ COSTS_N_INSNS (3), /* cost of MULSS instruction. */
++ COSTS_N_INSNS (3), /* cost of MULSD instruction. */
++ COSTS_N_INSNS (4), /* cost of FMA SS instruction. */
++ COSTS_N_INSNS (4), /* cost of FMA SD instruction. */
++ COSTS_N_INSNS (10), /* cost of DIVSS instruction. */
++ /* 9-13. */
++ COSTS_N_INSNS (13), /* cost of DIVSD instruction. */
++ COSTS_N_INSNS (14), /* cost of SQRTSS instruction. */
++ COSTS_N_INSNS (20), /* cost of SQRTSD instruction. */
++ /* Zen can execute 4 integer operations per cycle. FP operations
++ take 3 cycles and it can execute 2 integer additions and 2
++ multiplications thus reassociation may make sense up to with of 6.
++ SPEC2k6 bencharks suggests
++ that 4 works better than 6 probably due to register pressure.
++
++ Integer vector operations are taken by FP unit and execute 3 vector
++ plus/minus operations per cycle but only one multiply. This is adjusted
++ in ix86_reassociation_width. */
++ 4, 4, 3, 6, /* reassoc int, fp, vec_int, vec_fp. */
++ znver2_memcpy,
++ znver2_memset,
++ COSTS_N_INSNS (4), /* cond_taken_branch_cost. */
++ COSTS_N_INSNS (2), /* cond_not_taken_branch_cost. */
++ "16", /* Loop alignment. */
++ "16", /* Jump alignment. */
++ "0:0:8", /* Label alignment. */
++ "16", /* Func alignment. */
++ 4, /* Small unroll limit. */
++ 2, /* Small unroll factor. */
++};
++
+ /* skylake_cost should produce code tuned for Skylake familly of CPUs. */
+ static stringop_algs skylake_memcpy[2] = {
+ {libcall,
+diff --git a/gcc/config/i386/x86-tune-sched.cc b/gcc/config/i386/x86-tune-sched.cc
+index df4113d4eab..cbaba5f9e3c 100644
+--- a/gcc/config/i386/x86-tune-sched.cc
++++ b/gcc/config/i386/x86-tune-sched.cc
+@@ -69,6 +69,7 @@ ix86_issue_rate (void)
+ case PROCESSOR_ZNVER2:
+ case PROCESSOR_ZNVER3:
+ case PROCESSOR_ZNVER4:
++ case PROCESSOR_ZNVER5:
+ case PROCESSOR_CORE2:
+ case PROCESSOR_NEHALEM:
+ case PROCESSOR_SANDYBRIDGE:
+@@ -417,6 +418,7 @@ ix86_adjust_cost (rtx_insn *insn, int dep_type, rtx_insn *dep_insn, int cost,
+ case PROCESSOR_ZNVER2:
+ case PROCESSOR_ZNVER3:
+ case PROCESSOR_ZNVER4:
++ case PROCESSOR_ZNVER5:
+ /* Stack engine allows to execute push&pop instructions in parall. */
+ if ((insn_type == TYPE_PUSH || insn_type == TYPE_POP)
+ && (dep_insn_type == TYPE_PUSH || dep_insn_type == TYPE_POP))
+diff --git a/gcc/config/i386/x86-tune.def b/gcc/config/i386/x86-tune.def
+index 0fd5bb4430e..48ca9167bf4 100644
+--- a/gcc/config/i386/x86-tune.def
++++ b/gcc/config/i386/x86-tune.def
+@@ -572,12 +572,12 @@ DEF_TUNE (X86_TUNE_AVX256_STORE_BY_PIECES, "avx256_store_by_pieces",
+ /* X86_TUNE_AVX512_MOVE_BY_PIECES: Optimize move_by_pieces with 512-bit
+ AVX instructions. */
+ DEF_TUNE (X86_TUNE_AVX512_MOVE_BY_PIECES, "avx512_move_by_pieces",
+- m_SAPPHIRERAPIDS | m_ZNVER4)
++ m_SAPPHIRERAPIDS | m_ZNVER4 | m_ZNVER5)
+
+ /* X86_TUNE_AVX512_STORE_BY_PIECES: Optimize store_by_pieces with 512-bit
+ AVX instructions. */
+ DEF_TUNE (X86_TUNE_AVX512_STORE_BY_PIECES, "avx512_store_by_pieces",
+- m_SAPPHIRERAPIDS | m_ZNVER4)
++ m_SAPPHIRERAPIDS | m_ZNVER4 | m_ZNVER5)
+
+ /*****************************************************************************/
+ /*****************************************************************************/
+diff --git a/gcc/config/i386/znver4.md b/gcc/config/i386/zn4zn5.md
+similarity index 55%
+rename from gcc/config/i386/znver4.md
+rename to gcc/config/i386/zn4zn5.md
+index 47802a7de2b..ba9cfbb5dfc 100644
+--- a/gcc/config/i386/znver4.md
++++ b/gcc/config/i386/zn4zn5.md
+@@ -1,4 +1,4 @@
+-;; Copyright (C) 2012-2023 Free Software Foundation, Inc.
++;; Copyright (C) 2012-2024 Free Software Foundation, Inc.
+ ;;
+ ;; This file is part of GCC.
+ ;;
+@@ -21,7 +21,7 @@
+ (define_attr "znver4_decode" "direct,vector,double"
+ (const_string "direct"))
+
+-;; AMD znver4 Scheduling
++;; AMD znver4 and znver5 Scheduling
+ ;; Modeling automatons for zen decoders, integer execution pipes,
+ ;; AGU pipes, branch, floating point execution and fp store units.
+ (define_automaton "znver4, znver4_ieu, znver4_idiv, znver4_fdiv, znver4_agu, znver4_fpu, znver4_fp_store")
+@@ -44,32 +44,44 @@ (define_reservation "znver4-direct" "znver4-decode0|znver4-decode1|znver4-decode
+ (define_reservation "znver4-double" "znver4-direct")
+
+
+-;; Integer unit 4 ALU pipes.
++;; Integer unit 4 ALU pipes in znver4 6 ALU pipes in znver5.
+ (define_cpu_unit "znver4-ieu0" "znver4_ieu")
+ (define_cpu_unit "znver4-ieu1" "znver4_ieu")
+ (define_cpu_unit "znver4-ieu2" "znver4_ieu")
+ (define_cpu_unit "znver4-ieu3" "znver4_ieu")
++(define_cpu_unit "znver5-ieu4" "znver4_ieu")
++(define_cpu_unit "znver5-ieu5" "znver4_ieu")
++
+ ;; Znver4 has an additional branch unit.
+ (define_cpu_unit "znver4-bru0" "znver4_ieu")
++
+ (define_reservation "znver4-ieu" "znver4-ieu0|znver4-ieu1|znver4-ieu2|znver4-ieu3")
++(define_reservation "znver5-ieu" "znver4-ieu0|znver4-ieu1|znver4-ieu2|znver4-ieu3|znver5-ieu4|znver5-ieu5")
+
+-;; 3 AGU pipes in znver4
++;; 3 AGU pipes in znver4 and 4 AGU pipes in znver5
+ (define_cpu_unit "znver4-agu0" "znver4_agu")
+ (define_cpu_unit "znver4-agu1" "znver4_agu")
+ (define_cpu_unit "znver4-agu2" "znver4_agu")
++(define_cpu_unit "znver5-agu3" "znver4_agu")
++
+ (define_reservation "znver4-agu-reserve" "znver4-agu0|znver4-agu1|znver4-agu2")
++(define_reservation "znver5-agu-reserve" "znver4-agu0|znver4-agu1|znver4-agu2|znver5-agu3")
+
+ ;; Load is 4 cycles. We do not model reservation of load unit.
+ (define_reservation "znver4-load" "znver4-agu-reserve")
+ (define_reservation "znver4-store" "znver4-agu-reserve")
++(define_reservation "znver5-load" "znver5-agu-reserve")
++(define_reservation "znver5-store" "znver5-agu-reserve")
+
+ ;; vectorpath (microcoded) instructions are single issue instructions.
+ ;; So, they occupy all the integer units.
++;; This is used for both Znver4 and Znver5, since reserving extra units not used otherwise
++;; is harmless.
+ (define_reservation "znver4-ivector" "znver4-ieu0+znver4-ieu1
+- +znver4-ieu2+znver4-ieu3+znver4-bru0
+- +znver4-agu0+znver4-agu1+znver4-agu2")
++ +znver4-ieu2+znver4-ieu3+znver5-ieu4+znver5-ieu5+znver4-bru0
++ +znver4-agu0+znver4-agu1+znver4-agu2+znver5-agu3")
+
+-;; Floating point unit 4 FP pipes.
++;; Floating point unit 4 FP pipes in znver4 and znver5.
+ (define_cpu_unit "znver4-fpu0" "znver4_fpu")
+ (define_cpu_unit "znver4-fpu1" "znver4_fpu")
+ (define_cpu_unit "znver4-fpu2" "znver4_fpu")
+@@ -77,10 +89,6 @@ (define_cpu_unit "znver4-fpu3" "znver4_fpu")
+
+ (define_reservation "znver4-fpu" "znver4-fpu0|znver4-fpu1|znver4-fpu2|znver4-fpu3")
+
+-(define_reservation "znver4-fvector" "znver4-fpu0+znver4-fpu1
+- +znver4-fpu2+znver4-fpu3
+- +znver4-agu0+znver4-agu1+znver4-agu2")
+-
+ ;; DIV units
+ (define_cpu_unit "znver4-idiv" "znver4_idiv")
+ (define_cpu_unit "znver4-fdiv" "znver4_fdiv")
+@@ -89,6 +97,19 @@ (define_cpu_unit "znver4-fdiv" "znver4_fdiv")
+ ;; throughput is limited to only one per cycle.
+ (define_cpu_unit "znver4-fp-store" "znver4_fp_store")
+
++;; Floating point store unit 2 FP pipes in znver5.
++(define_cpu_unit "znver5-fp-store0" "znver4_fp_store")
++(define_cpu_unit "znver5-fp-store1" "znver4_fp_store")
++
++;; This is used for both Znver4 and Znver5, since reserving extra units not used otherwise
++;; is harmless.
++(define_reservation "znver4-fvector" "znver4-fpu0+znver4-fpu1
++ +znver4-fpu2+znver4-fpu3+znver5-fp-store0+znver5-fp-store1
++ +znver4-agu0+znver4-agu1+znver4-agu2+znver5-agu3")
++
++(define_reservation "znver5-fp-store256" "znver5-fp-store0|znver5-fp-store1")
++(define_reservation "znver5-fp-store-512" "znver5-fp-store0+znver5-fp-store1")
++
+
+ ;; Integer Instructions
+ ;; Move instructions
+@@ -100,6 +121,13 @@ (define_insn_reservation "znver4_imov_double" 1
+ (eq_attr "memory" "none"))))
+ "znver4-double,znver4-ieu")
+
++(define_insn_reservation "znver5_imov_double" 1
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "znver1_decode" "double")
++ (and (eq_attr "type" "imov")
++ (eq_attr "memory" "none"))))
++ "znver4-double,znver5-ieu")
++
+ (define_insn_reservation "znver4_imov_double_load" 5
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "znver1_decode" "double")
+@@ -107,6 +135,13 @@ (define_insn_reservation "znver4_imov_double_load" 5
+ (eq_attr "memory" "load"))))
+ "znver4-double,znver4-load,znver4-ieu")
+
++(define_insn_reservation "znver5_imov_double_load" 5
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "znver1_decode" "double")
++ (and (eq_attr "type" "imov")
++ (eq_attr "memory" "load"))))
++ "znver4-double,znver5-load,znver5-ieu")
++
+ ;; imov, imovx
+ (define_insn_reservation "znver4_imov" 1
+ (and (eq_attr "cpu" "znver4")
+@@ -114,12 +149,24 @@ (define_insn_reservation "znver4_imov" 1
+ (eq_attr "memory" "none")))
+ "znver4-direct,znver4-ieu")
+
++(define_insn_reservation "znver5_imov" 1
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "imov,imovx")
++ (eq_attr "memory" "none")))
++ "znver4-direct,znver5-ieu")
++
+ (define_insn_reservation "znver4_imov_load" 5
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "imov,imovx")
+ (eq_attr "memory" "load")))
+ "znver4-direct,znver4-load,znver4-ieu")
+
++(define_insn_reservation "znver5_imov_load" 5
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "imov,imovx")
++ (eq_attr "memory" "load")))
++ "znver4-direct,znver5-load,znver5-ieu")
++
+ ;; Push Instruction
+ (define_insn_reservation "znver4_push" 1
+ (and (eq_attr "cpu" "znver4")
+@@ -127,12 +174,24 @@ (define_insn_reservation "znver4_push" 1
+ (eq_attr "memory" "store")))
+ "znver4-direct,znver4-store")
+
++(define_insn_reservation "znver5_push" 1
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "push")
++ (eq_attr "memory" "store")))
++ "znver4-direct,znver5-store")
++
+ (define_insn_reservation "znver4_push_mem" 5
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "push")
+ (eq_attr "memory" "both")))
+ "znver4-direct,znver4-load,znver4-store")
+
++(define_insn_reservation "znver5_push_mem" 5
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "push")
++ (eq_attr "memory" "both")))
++ "znver4-direct,znver5-load,znver5-store")
++
+ ;; Pop instruction
+ (define_insn_reservation "znver4_pop" 4
+ (and (eq_attr "cpu" "znver4")
+@@ -140,16 +199,28 @@ (define_insn_reservation "znver4_pop" 4
+ (eq_attr "memory" "load")))
+ "znver4-direct,znver4-load")
+
++(define_insn_reservation "znver5_pop" 4
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "pop")
++ (eq_attr "memory" "load")))
++ "znver4-direct,znver5-load")
++
+ (define_insn_reservation "znver4_pop_mem" 5
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "pop")
+ (eq_attr "memory" "both")))
+ "znver4-direct,znver4-load,znver4-store")
+
++(define_insn_reservation "znver5_pop_mem" 5
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "pop")
++ (eq_attr "memory" "both")))
++ "znver4-direct,znver5-load,znver5-store")
++
+ ;; Integer Instructions or General instructions
+ ;; Multiplications
+ (define_insn_reservation "znver4_imul" 3
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "imul")
+ (eq_attr "memory" "none")))
+ "znver4-direct,znver4-ieu1")
+@@ -160,30 +231,36 @@ (define_insn_reservation "znver4_imul_load" 7
+ (eq_attr "memory" "load")))
+ "znver4-direct,znver4-load,znver4-ieu1")
+
++(define_insn_reservation "znver5_imul_load" 7
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "imul")
++ (eq_attr "memory" "load")))
++ "znver4-direct,znver5-load,znver4-ieu1")
++
+ ;; Divisions
+ (define_insn_reservation "znver4_idiv_DI" 18
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "idiv")
+ (and (eq_attr "mode" "DI")
+ (eq_attr "memory" "none"))))
+ "znver4-double,znver4-idiv*10")
+
+ (define_insn_reservation "znver4_idiv_SI" 12
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "idiv")
+ (and (eq_attr "mode" "SI")
+ (eq_attr "memory" "none"))))
+ "znver4-double,znver4-idiv*6")
+
+ (define_insn_reservation "znver4_idiv_HI" 10
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "idiv")
+ (and (eq_attr "mode" "HI")
+ (eq_attr "memory" "none"))))
+ "znver4-double,znver4-idiv*4")
+
+ (define_insn_reservation "znver4_idiv_QI" 9
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "idiv")
+ (and (eq_attr "mode" "QI")
+ (eq_attr "memory" "none"))))
+@@ -196,6 +273,13 @@ (define_insn_reservation "znver4_idiv_DI_load" 22
+ (eq_attr "memory" "load"))))
+ "znver4-double,znver4-load,znver4-idiv*10")
+
++(define_insn_reservation "znver5_idiv_DI_load" 22
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "idiv")
++ (and (eq_attr "mode" "DI")
++ (eq_attr "memory" "load"))))
++ "znver4-double,znver5-load,znver4-idiv*10")
++
+ (define_insn_reservation "znver4_idiv_SI_load" 16
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "idiv")
+@@ -203,6 +287,13 @@ (define_insn_reservation "znver4_idiv_SI_load" 16
+ (eq_attr "memory" "load"))))
+ "znver4-double,znver4-load,znver4-idiv*6")
+
++(define_insn_reservation "znver5_idiv_SI_load" 16
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "idiv")
++ (and (eq_attr "mode" "SI")
++ (eq_attr "memory" "load"))))
++ "znver4-double,znver5-load,znver4-idiv*6")
++
+ (define_insn_reservation "znver4_idiv_HI_load" 14
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "idiv")
+@@ -210,6 +301,13 @@ (define_insn_reservation "znver4_idiv_HI_load" 14
+ (eq_attr "memory" "load"))))
+ "znver4-double,znver4-load,znver4-idiv*4")
+
++(define_insn_reservation "znver5_idiv_HI_load" 14
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "idiv")
++ (and (eq_attr "mode" "HI")
++ (eq_attr "memory" "load"))))
++ "znver4-double,znver5-load,znver4-idiv*4")
++
+ (define_insn_reservation "znver4_idiv_QI_load" 13
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "idiv")
+@@ -217,6 +315,13 @@ (define_insn_reservation "znver4_idiv_QI_load" 13
+ (eq_attr "memory" "load"))))
+ "znver4-double,znver4-load,znver4-idiv*4")
+
++(define_insn_reservation "znver5_idiv_QI_load" 13
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "idiv")
++ (and (eq_attr "mode" "QI")
++ (eq_attr "memory" "load"))))
++ "znver4-double,znver5-load,znver4-idiv*4")
++
+ ;; INTEGER/GENERAL Instructions
+ (define_insn_reservation "znver4_insn" 1
+ (and (eq_attr "cpu" "znver4")
+@@ -224,14 +329,26 @@ (define_insn_reservation "znver4_insn" 1
+ (eq_attr "memory" "none,unknown")))
+ "znver4-direct,znver4-ieu")
+
++(define_insn_reservation "znver5_insn" 1
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "alu,alu1,negnot,rotate1,ishift1,test,incdec,icmp")
++ (eq_attr "memory" "none,unknown")))
++ "znver4-direct,znver5-ieu")
++
+ (define_insn_reservation "znver4_insn_load" 5
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "alu,alu1,negnot,rotate1,ishift1,test,incdec,icmp")
+ (eq_attr "memory" "load")))
+ "znver4-direct,znver4-load,znver4-ieu")
+
++(define_insn_reservation "znver5_insn_load" 5
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "alu,alu1,negnot,rotate1,ishift1,test,incdec,icmp")
++ (eq_attr "memory" "load")))
++ "znver4-direct,znver5-load,znver5-ieu")
++
+ (define_insn_reservation "znver4_insn2" 1
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "icmov,setcc")
+ (eq_attr "memory" "none,unknown")))
+ "znver4-direct,znver4-ieu0|znver4-ieu3")
+@@ -242,8 +359,14 @@ (define_insn_reservation "znver4_insn2_load" 5
+ (eq_attr "memory" "load")))
+ "znver4-direct,znver4-load,znver4-ieu0|znver4-ieu3")
+
++(define_insn_reservation "znver5_insn2_load" 5
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "icmov,setcc")
++ (eq_attr "memory" "load")))
++ "znver4-direct,znver5-load,znver4-ieu0|znver4-ieu3")
++
+ (define_insn_reservation "znver4_rotate" 1
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "rotate")
+ (eq_attr "memory" "none,unknown")))
+ "znver4-direct,znver4-ieu1|znver4-ieu2")
+@@ -254,27 +377,51 @@ (define_insn_reservation "znver4_rotate_load" 5
+ (eq_attr "memory" "load")))
+ "znver4-direct,znver4-load,znver4-ieu1|znver4-ieu2")
+
++(define_insn_reservation "znver5_rotate_load" 5
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "rotate")
++ (eq_attr "memory" "load")))
++ "znver4-direct,znver5-load,znver4-ieu1|znver4-ieu2")
++
+ (define_insn_reservation "znver4_insn_store" 1
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "alu,alu1,negnot,rotate1,ishift1,test,incdec,icmp")
+ (eq_attr "memory" "store")))
+ "znver4-direct,znver4-ieu,znver4-store")
+
++(define_insn_reservation "znver5_insn_store" 1
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "alu,alu1,negnot,rotate1,ishift1,test,incdec,icmp")
++ (eq_attr "memory" "store")))
++ "znver4-direct,znver4-ieu,znver5-store")
++
+ (define_insn_reservation "znver4_insn2_store" 1
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "icmov,setcc")
+ (eq_attr "memory" "store")))
+ "znver4-direct,znver4-ieu0|znver4-ieu3,znver4-store")
+
++(define_insn_reservation "znver5_insn2_store" 1
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "icmov,setcc")
++ (eq_attr "memory" "store")))
++ "znver4-direct,znver4-ieu0|znver4-ieu3,znver5-store")
++
+ (define_insn_reservation "znver4_rotate_store" 1
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "rotate")
+ (eq_attr "memory" "store")))
+ "znver4-direct,znver4-ieu1|znver4-ieu2,znver4-store")
+
++(define_insn_reservation "znver5_rotate_store" 1
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "rotate")
++ (eq_attr "memory" "store")))
++ "znver4-direct,znver4-ieu1|znver4-ieu2,znver5-store")
++
+ ;; alu1 instructions
+ (define_insn_reservation "znver4_alu1_vector" 3
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "znver1_decode" "vector")
+ (and (eq_attr "type" "alu1")
+ (eq_attr "memory" "none,unknown"))))
+@@ -287,15 +434,27 @@ (define_insn_reservation "znver4_alu1_vector_load" 7
+ (eq_attr "memory" "load"))))
+ "znver4-vector,znver4-load,znver4-ivector*3")
+
++(define_insn_reservation "znver5_alu1_vector_load" 7
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "znver1_decode" "vector")
++ (and (eq_attr "type" "alu1")
++ (eq_attr "memory" "load"))))
++ "znver4-vector,znver5-load,znver4-ivector*3")
++
+ ;; Call Instruction
+ (define_insn_reservation "znver4_call" 1
+ (and (eq_attr "cpu" "znver4")
+ (eq_attr "type" "call,callv"))
+ "znver4-double,znver4-ieu0|znver4-bru0,znver4-store")
+
++(define_insn_reservation "znver5_call" 1
++ (and (eq_attr "cpu" "znver5")
++ (eq_attr "type" "call,callv"))
++ "znver4-double,znver4-ieu0|znver4-bru0,znver5-store")
++
+ ;; Branches
+ (define_insn_reservation "znver4_branch" 1
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "ibr")
+ (eq_attr "memory" "none")))
+ "znver4-direct,znver4-ieu0|znver4-bru0")
+@@ -306,8 +465,14 @@ (define_insn_reservation "znver4_branch_load" 5
+ (eq_attr "memory" "load")))
+ "znver4-direct,znver4-load,znver4-ieu0|znver4-bru0")
+
++(define_insn_reservation "znver5_branch_load" 5
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ibr")
++ (eq_attr "memory" "load")))
++ "znver4-direct,znver5-load,znver4-ieu0|znver4-bru0")
++
+ (define_insn_reservation "znver4_branch_vector" 2
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "ibr")
+ (eq_attr "memory" "none,unknown")))
+ "znver4-vector,znver4-ivector*2")
+@@ -318,21 +483,36 @@ (define_insn_reservation "znver4_branch_vector_load" 6
+ (eq_attr "memory" "load")))
+ "znver4-vector,znver4-load,znver4-ivector*2")
+
++(define_insn_reservation "znver5_branch_vector_load" 6
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ibr")
++ (eq_attr "memory" "load")))
++ "znver4-vector,znver5-load,znver4-ivector*2")
++
+ ;; LEA instruction with simple addressing
+ (define_insn_reservation "znver4_lea" 1
+ (and (eq_attr "cpu" "znver4")
+ (eq_attr "type" "lea"))
+ "znver4-direct,znver4-ieu")
+
++(define_insn_reservation "znver5_lea" 1
++ (and (eq_attr "cpu" "znver5")
++ (eq_attr "type" "lea"))
++ "znver4-direct,znver5-ieu")
+ ;; Leave
+ (define_insn_reservation "znver4_leave" 1
+ (and (eq_attr "cpu" "znver4")
+ (eq_attr "type" "leave"))
+ "znver4-double,znver4-ieu,znver4-store")
+
++(define_insn_reservation "znver5_leave" 1
++ (and (eq_attr "cpu" "znver5")
++ (eq_attr "type" "leave"))
++ "znver4-double,znver5-ieu,znver5-store")
++
+ ;; STR and ISHIFT are microcoded.
+ (define_insn_reservation "znver4_str" 3
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "str")
+ (eq_attr "memory" "none")))
+ "znver4-vector,znver4-ivector*3")
+@@ -343,8 +523,14 @@ (define_insn_reservation "znver4_str_load" 7
+ (eq_attr "memory" "load")))
+ "znver4-vector,znver4-load,znver4-ivector*3")
+
++(define_insn_reservation "znver5_str_load" 7
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "str")
++ (eq_attr "memory" "load")))
++ "znver4-vector,znver5-load,znver4-ivector*3")
++
+ (define_insn_reservation "znver4_ishift" 2
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "ishift")
+ (eq_attr "memory" "none")))
+ "znver4-vector,znver4-ivector*2")
+@@ -355,9 +541,15 @@ (define_insn_reservation "znver4_ishift_load" 6
+ (eq_attr "memory" "load")))
+ "znver4-vector,znver4-load,znver4-ivector*2")
+
++(define_insn_reservation "znver5_ishift_load" 6
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ishift")
++ (eq_attr "memory" "load")))
++ "znver4-vector,znver5-load,znver4-ivector*2")
++
+ ;; Other vector type
+ (define_insn_reservation "znver4_ieu_vector" 5
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "other,multi")
+ (eq_attr "memory" "none,unknown")))
+ "znver4-vector,znver4-ivector*5")
+@@ -368,15 +560,21 @@ (define_insn_reservation "znver4_ieu_vector_load" 9
+ (eq_attr "memory" "load")))
+ "znver4-vector,znver4-load,znver4-ivector*5")
+
++(define_insn_reservation "znver5_ieu_vector_load" 9
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "other,multi")
++ (eq_attr "memory" "load")))
++ "znver4-vector,znver5-load,znver4-ivector*5")
++
+ ;; Floating Point
+ ;; FP movs
+ (define_insn_reservation "znver4_fp_cmov" 4
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (eq_attr "type" "fcmov"))
+ "znver4-vector,znver4-fvector*3")
+
+ (define_insn_reservation "znver4_fp_mov_direct" 1
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (eq_attr "type" "fmov"))
+ "znver4-direct,znver4-fpu0|znver4-fpu1")
+
+@@ -388,6 +586,13 @@ (define_insn_reservation "znver4_fp_mov_direct_load" 6
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu0|znver4-fpu1")
+
++(define_insn_reservation "znver5_fp_mov_direct_load" 6
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "znver1_decode" "direct")
++ (and (eq_attr "type" "fmov")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fpu0|znver4-fpu1")
++
+ ;;FST
+ (define_insn_reservation "znver4_fp_mov_direct_store" 6
+ (and (eq_attr "cpu" "znver4")
+@@ -396,6 +601,13 @@ (define_insn_reservation "znver4_fp_mov_direct_store" 6
+ (eq_attr "memory" "store"))))
+ "znver4-direct,znver4-fpu0|znver4-fpu1,znver4-fp-store")
+
++(define_insn_reservation "znver5_fp_mov_direct_store" 6
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "znver1_decode" "direct")
++ (and (eq_attr "type" "fmov")
++ (eq_attr "memory" "store"))))
++ "znver4-direct,znver4-fpu0|znver4-fpu1,znver5-fp-store256")
++
+ ;;FILD
+ (define_insn_reservation "znver4_fp_mov_double_load" 13
+ (and (eq_attr "cpu" "znver4")
+@@ -404,6 +616,13 @@ (define_insn_reservation "znver4_fp_mov_double_load" 13
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu1")
+
++(define_insn_reservation "znver5_fp_mov_double_load" 13
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "znver1_decode" "double")
++ (and (eq_attr "type" "fmov")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fpu1")
++
+ ;;FIST
+ (define_insn_reservation "znver4_fp_mov_double_store" 7
+ (and (eq_attr "cpu" "znver4")
+@@ -412,9 +631,16 @@ (define_insn_reservation "znver4_fp_mov_double_store" 7
+ (eq_attr "memory" "store"))))
+ "znver4-double,znver4-fpu1,znver4-fp-store")
+
++(define_insn_reservation "znver5_fp_mov_double_store" 7
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "znver1_decode" "double")
++ (and (eq_attr "type" "fmov")
++ (eq_attr "memory" "store"))))
++ "znver4-double,znver4-fpu1,znver5-fp-store256")
++
+ ;; FSQRT
+ (define_insn_reservation "znver4_fsqrt" 22
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "fpspc")
+ (and (eq_attr "mode" "XF")
+ (eq_attr "memory" "none"))))
+@@ -422,20 +648,20 @@ (define_insn_reservation "znver4_fsqrt" 22
+
+ ;; FPSPC instructions
+ (define_insn_reservation "znver4_fp_spc" 6
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "fpspc")
+ (eq_attr "memory" "none")))
+ "znver4-vector,znver4-fvector*6")
+
+ (define_insn_reservation "znver4_fp_insn_vector" 6
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "znver1_decode" "vector")
+ (eq_attr "type" "mmxcvt,sselog1,ssemov")))
+ "znver4-vector,znver4-fvector*6")
+
+ ;; FADD, FSUB, FMUL
+ (define_insn_reservation "znver4_fp_op_mul" 7
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "fop,fmul")
+ (eq_attr "memory" "none")))
+ "znver4-direct,znver4-fpu0")
+@@ -446,9 +672,14 @@ (define_insn_reservation "znver4_fp_op_mul_load" 12
+ (eq_attr "memory" "load")))
+ "znver4-direct,znver4-load,znver4-fpu0")
+
++(define_insn_reservation "znver5_fp_op_mul_load" 12
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "fop,fmul")
++ (eq_attr "memory" "load")))
++ "znver4-direct,znver5-load,znver4-fpu0")
+ ;; FDIV
+ (define_insn_reservation "znver4_fp_div" 15
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "fdiv")
+ (eq_attr "memory" "none")))
+ "znver4-direct,znver4-fdiv*6")
+@@ -459,6 +690,12 @@ (define_insn_reservation "znver4_fp_div_load" 20
+ (eq_attr "memory" "load")))
+ "znver4-direct,znver4-load,znver4-fdiv*6")
+
++(define_insn_reservation "znver5_fp_div_load" 20
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "fdiv")
++ (eq_attr "memory" "load")))
++ "znver4-direct,znver5-load,znver4-fdiv*6")
++
+ (define_insn_reservation "znver4_fp_idiv_load" 24
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "fdiv")
+@@ -466,15 +703,27 @@ (define_insn_reservation "znver4_fp_idiv_load" 24
+ (eq_attr "memory" "load"))))
+ "znver4-double,znver4-load,znver4-fdiv*6")
+
++(define_insn_reservation "znver5_fp_idiv_load" 24
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "fdiv")
++ (and (eq_attr "fp_int_src" "true")
++ (eq_attr "memory" "load"))))
++ "znver4-double,znver5-load,znver4-fdiv*6")
++
+ ;; FABS, FCHS
+ (define_insn_reservation "znver4_fp_fsgn" 1
+ (and (eq_attr "cpu" "znver4")
+ (eq_attr "type" "fsgn"))
+ "znver4-direct,znver4-fpu0|znver4-fpu1")
+
++(define_insn_reservation "znver5_fp_fsgn" 1
++ (and (eq_attr "cpu" "znver5")
++ (eq_attr "type" "fsgn"))
++ "znver4-direct,znver4-fpu1|znver4-fpu2")
++
+ ;; FCMP
+ (define_insn_reservation "znver4_fp_fcmp" 3
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "fcmp")
+ (eq_attr "memory" "none")))
+ "znver4-direct,znver4-fpu1")
+@@ -486,14 +735,21 @@ (define_insn_reservation "znver4_fp_fcmp_double" 4
+ (eq_attr "memory" "none"))))
+ "znver4-double,znver4-fpu1,znver4-fpu2")
+
++(define_insn_reservation "znver5_fp_fcmp_double" 4
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "fcmp")
++ (and (eq_attr "znver1_decode" "double")
++ (eq_attr "memory" "none"))))
++ "znver4-double,znver4-fpu1,znver5-fp-store256")
++
+ ;; MMX, SSE, SSEn.n instructions
+ (define_insn_reservation "znver4_fp_mmx " 1
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (eq_attr "type" "mmx"))
+ "znver4-direct,znver4-fpu1|znver4-fpu2")
+
+ (define_insn_reservation "znver4_mmx_add_cmp" 1
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "mmxadd,mmxcmp")
+ (eq_attr "memory" "none")))
+ "znver4-direct,znver4-fpu")
+@@ -504,32 +760,62 @@ (define_insn_reservation "znver4_mmx_add_cmp_load" 6
+ (eq_attr "memory" "load")))
+ "znver4-direct,znver4-load,znver4-fpu")
+
++(define_insn_reservation "znver5_mmx_add_cmp_load" 6
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "mmxadd,mmxcmp")
++ (eq_attr "memory" "load")))
++ "znver4-direct,znver5-load,znver4-fpu")
++
+ (define_insn_reservation "znver4_mmx_insn" 1
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "mmxcvt,sseshuf,sseshuf1,mmxshft")
+ (eq_attr "memory" "none")))
+ "znver4-direct,znver4-fpu1|znver4-fpu2")
+
++(define_insn_reservation "znver5_mmx_insn" 1
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "mmxcvt,sseshuf,sseshuf1,mmxshft")
++ (eq_attr "memory" "none")))
++ "znver4-direct,znver4-fpu0|znver4-fpu1|znver4-fpu2|znver4-fpu3")
++
+ (define_insn_reservation "znver4_mmx_insn_load" 6
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "mmxcvt,sseshuf,sseshuf1,mmxshft")
+ (eq_attr "memory" "load")))
+ "znver4-direct,znver4-load,znver4-fpu1|znver4-fpu2")
+
++(define_insn_reservation "znver5_mmx_insn_load" 6
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "mmxcvt,sseshuf,sseshuf1,mmxshft")
++ (eq_attr "memory" "load")))
++ "znver4-direct,znver5-load,znver4-fpu0|znver4-fpu1|znver4-fpu2|znver4-fpu3")
++
+ (define_insn_reservation "znver4_mmx_mov" 1
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "mmxmov")
+ (eq_attr "memory" "store")))
+ "znver4-direct,znver4-fp-store")
+
++(define_insn_reservation "znver5_mmx_mov" 1
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "mmxmov")
++ (eq_attr "memory" "store")))
++ "znver4-direct,znver5-fp-store256")
++
+ (define_insn_reservation "znver4_mmx_mov_load" 6
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "mmxmov")
+ (eq_attr "memory" "both")))
+ "znver4-direct,znver4-load,znver4-fp-store")
+
++(define_insn_reservation "znver5_mmx_mov_load" 6
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "mmxmov")
++ (eq_attr "memory" "both")))
++ "znver4-direct,znver5-load,znver5-fp-store256")
++
+ (define_insn_reservation "znver4_mmx_mul" 3
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "mmxmul")
+ (eq_attr "memory" "none")))
+ "znver4-direct,znver4-fpu0|znver4-fpu3")
+@@ -540,9 +826,15 @@ (define_insn_reservation "znver4_mmx_mul_load" 8
+ (eq_attr "memory" "load")))
+ "znver4-direct,znver4-load,znver4-fpu0|znver4-fpu3")
+
++(define_insn_reservation "znver5_mmx_mul_load" 8
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "mmxmul")
++ (eq_attr "memory" "load")))
++ "znver4-direct,znver5-load,znver4-fpu0|znver4-fpu3")
++
+ ;; AVX instructions
+ (define_insn_reservation "znver4_sse_log" 1
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "sselog")
+ (and (eq_attr "mode" "V4SF,V8SF,V2DF,V4DF,QI,HI,SI,DI,TI,OI")
+ (eq_attr "memory" "none"))))
+@@ -555,6 +847,13 @@ (define_insn_reservation "znver4_sse_log_load" 6
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu")
+
++(define_insn_reservation "znver5_sse_log_load" 6
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sselog")
++ (and (eq_attr "mode" "V4SF,V8SF,V2DF,V4DF,QI,HI,SI,DI,TI,OI")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fpu")
++
+ (define_insn_reservation "znver4_sse_log1" 1
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "sselog1")
+@@ -562,6 +861,13 @@ (define_insn_reservation "znver4_sse_log1" 1
+ (eq_attr "memory" "store"))))
+ "znver4-direct,znver4-fpu1|znver4-fpu2,znver4-fp-store")
+
++(define_insn_reservation "znver5_sse_log1" 1
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sselog1")
++ (and (eq_attr "mode" "V4SF,V8SF,V2DF,V4DF,QI,HI,SI,DI,TI,OI")
++ (eq_attr "memory" "store"))))
++ "znver4-direct,znver4-fpu1|znver4-fpu2,znver5-fp-store256")
++
+ (define_insn_reservation "znver4_sse_log1_load" 6
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "sselog1")
+@@ -569,20 +875,39 @@ (define_insn_reservation "znver4_sse_log1_load" 6
+ (eq_attr "memory" "both"))))
+ "znver4-direct,znver4-load,znver4-fpu1|znver4-fpu2,znver4-fp-store")
+
++(define_insn_reservation "znver5_sse_log1_load" 6
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sselog1")
++ (and (eq_attr "mode" "V4SF,V8SF,V2DF,V4DF,QI,HI,SI,DI,TI,OI")
++ (eq_attr "memory" "both"))))
++ "znver4-direct,znver5-load,znver4-fpu1|znver4-fpu2,znver5-fp-store256")
++
+ (define_insn_reservation "znver4_sse_comi" 1
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssecomi")
+ (eq_attr "memory" "store")))
+ "znver4-double,znver4-fpu2|znver4-fpu3,znver4-fp-store")
+
++(define_insn_reservation "znver5_sse_comi" 1
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssecomi")
++ (eq_attr "memory" "store")))
++ "znver4-double,znver4-fpu2|znver4-fpu3,znver5-fp-store256")
++
+ (define_insn_reservation "znver4_sse_comi_load" 6
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssecomi")
+ (eq_attr "memory" "both")))
+ "znver4-double,znver4-load,znver4-fpu2|znver4-fpu3,znver4-fp-store")
+
++(define_insn_reservation "znver5_sse_comi_load" 6
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssecomi")
++ (eq_attr "memory" "both")))
++ "znver4-double,znver5-load,znver4-fpu2|znver4-fpu3,znver5-fp-store256")
++
+ (define_insn_reservation "znver4_sse_test" 1
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "prefix_extra" "1")
+ (and (eq_attr "type" "ssecomi")
+ (eq_attr "memory" "none"))))
+@@ -595,8 +920,15 @@ (define_insn_reservation "znver4_sse_test_load" 6
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu1|znver4-fpu2")
+
++(define_insn_reservation "znver5_sse_test_load" 6
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "prefix_extra" "1")
++ (and (eq_attr "type" "ssecomi")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fpu1|znver4-fpu2")
++
+ (define_insn_reservation "znver4_sse_imul" 3
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "sseimul")
+ (and (eq_attr "mode" "QI,HI,SI,DI,TI,OI")
+ (eq_attr "memory" "none"))))
+@@ -609,8 +941,15 @@ (define_insn_reservation "znver4_sse_imul_load" 8
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu0|znver4-fpu1")
+
++(define_insn_reservation "znver5_sse_imul_load" 8
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sseimul")
++ (and (eq_attr "mode" "QI,HI,SI,DI,TI,OI")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fpu0|znver4-fpu1")
++
+ (define_insn_reservation "znver4_sse_mov" 1
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "ssemov")
+ (and (eq_attr "mode" "QI,HI,SI,DI,TI,OI")
+ (eq_attr "memory" "none"))))
+@@ -623,6 +962,13 @@ (define_insn_reservation "znver4_sse_mov_load" 6
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu1|znver4-fpu2")
+
++(define_insn_reservation "znver5_sse_mov_load" 6
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssemov")
++ (and (eq_attr "mode" "QI,HI,SI,DI,TI,OI")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fpu1|znver4-fpu2")
++
+ (define_insn_reservation "znver4_sse_mov_store" 1
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssemov")
+@@ -630,8 +976,15 @@ (define_insn_reservation "znver4_sse_mov_store" 1
+ (eq_attr "memory" "store"))))
+ "znver4-direct,znver4-fpu1|znver4-fpu2,znver4-fp-store")
+
++(define_insn_reservation "znver5_sse_mov_store" 1
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssemov")
++ (and (eq_attr "mode" "QI,HI,SI,DI,TI,OI")
++ (eq_attr "memory" "store"))))
++ "znver4-direct,znver4-fpu1|znver4-fpu2,znver5-fp-store256")
++
+ (define_insn_reservation "znver4_sse_mov_fp" 1
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "ssemov")
+ (and (eq_attr "mode" "V16SF,V8DF,V8SF,V4DF,V4SF,V2DF,V2SF,V1DF,SF")
+ (eq_attr "memory" "none"))))
+@@ -644,6 +997,13 @@ (define_insn_reservation "znver4_sse_mov_fp_load" 6
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu")
+
++(define_insn_reservation "znver5_sse_mov_fp_load" 6
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssemov")
++ (and (eq_attr "mode" "V16SF,V8DF,V8SF,V4DF,V4SF,V2DF,V2SF,V1DF,SF")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fpu")
++
+ (define_insn_reservation "znver4_sse_mov_fp_store" 1
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssemov")
+@@ -651,8 +1011,22 @@ (define_insn_reservation "znver4_sse_mov_fp_store" 1
+ (eq_attr "memory" "store"))))
+ "znver4-direct,znver4-fp-store")
+
++(define_insn_reservation "znver5_sse_mov_fp_store" 1
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssemov")
++ (and (eq_attr "mode" "V8SF,V4DF,V4SF,V2DF,V2SF,V1DF,SF")
++ (eq_attr "memory" "store"))))
++ "znver4-direct,znver5-fp-store256")
++
++(define_insn_reservation "znver5_sse_mov_fp_store_512" 1
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssemov")
++ (and (eq_attr "mode" "V16SF,V8DF")
++ (eq_attr "memory" "store"))))
++ "znver4-direct,znver5-fp-store-512")
++
+ (define_insn_reservation "znver4_sse_add" 3
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "sseadd")
+ (and (eq_attr "mode" "V8SF,V4DF,V4SF,V2DF,V2SF,V1DF,SF")
+ (eq_attr "memory" "none"))))
+@@ -665,8 +1039,15 @@ (define_insn_reservation "znver4_sse_add_load" 8
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu2|znver4-fpu3")
+
++(define_insn_reservation "znver5_sse_add_load" 8
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sseadd")
++ (and (eq_attr "mode" "V8SF,V4DF,V4SF,V2DF,V2SF,V1DF,SF")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fpu2|znver4-fpu3")
++
+ (define_insn_reservation "znver4_sse_add1" 4
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "sseadd1")
+ (and (eq_attr "mode" "V8SF,V4DF,V4SF,V2DF,V2SF,V1DF,SF")
+ (eq_attr "memory" "none"))))
+@@ -679,8 +1060,15 @@ (define_insn_reservation "znver4_sse_add1_load" 9
+ (eq_attr "memory" "load"))))
+ "znver4-vector,znver4-load,znver4-fvector*2")
+
++(define_insn_reservation "znver5_sse_add1_load" 9
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sseadd1")
++ (and (eq_attr "mode" "V8SF,V4DF,V4SF,V2DF,V2SF,V1DF,SF")
++ (eq_attr "memory" "load"))))
++ "znver4-vector,znver5-load,znver4-fvector*2")
++
+ (define_insn_reservation "znver4_sse_iadd" 1
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "sseiadd")
+ (and (eq_attr "mode" "QI,HI,SI,DI,TI,OI")
+ (eq_attr "memory" "none"))))
+@@ -693,8 +1081,15 @@ (define_insn_reservation "znver4_sse_iadd_load" 6
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu")
+
++(define_insn_reservation "znver5_sse_iadd_load" 6
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sseiadd")
++ (and (eq_attr "mode" "QI,HI,SI,DI,TI,OI")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fpu")
++
+ (define_insn_reservation "znver4_sse_mul" 3
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "ssemul")
+ (and (eq_attr "mode" "V8SF,V4DF,V4SF,V2DF,V2SF,V1DF,SF")
+ (eq_attr "memory" "none"))))
+@@ -707,15 +1102,22 @@ (define_insn_reservation "znver4_sse_mul_load" 8
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu0|znver4-fpu1")
+
++(define_insn_reservation "znver5_sse_mul_load" 8
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssemul")
++ (and (eq_attr "mode" "V8SF,V4DF,V4SF,V2DF,V2SF,V1DF,SF")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fpu0|znver4-fpu1")
++
+ (define_insn_reservation "znver4_sse_div_pd" 13
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "ssediv")
+ (and (eq_attr "mode" "V4DF,V2DF,V1DF")
+ (eq_attr "memory" "none"))))
+ "znver4-direct,znver4-fdiv*5")
+
+ (define_insn_reservation "znver4_sse_div_ps" 10
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "ssediv")
+ (and (eq_attr "mode" "V8SF,V4SF,V2SF,SF")
+ (eq_attr "memory" "none"))))
+@@ -728,6 +1130,13 @@ (define_insn_reservation "znver4_sse_div_pd_load" 18
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fdiv*5")
+
++(define_insn_reservation "znver5_sse_div_pd_load" 18
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssediv")
++ (and (eq_attr "mode" "V4DF,V2DF,V1DF")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fdiv*5")
++
+ (define_insn_reservation "znver4_sse_div_ps_load" 15
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssediv")
+@@ -735,8 +1144,15 @@ (define_insn_reservation "znver4_sse_div_ps_load" 15
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fdiv*3")
+
++(define_insn_reservation "znver5_sse_div_ps_load" 15
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssediv")
++ (and (eq_attr "mode" "V8SF,V4SF,V2SF,SF")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fdiv*3")
++
+ (define_insn_reservation "znver4_sse_cmp_avx" 1
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "ssecmp")
+ (and (eq_attr "prefix" "vex")
+ (eq_attr "memory" "none"))))
+@@ -749,20 +1165,39 @@ (define_insn_reservation "znver4_sse_cmp_avx_load" 6
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu0|znver4-fpu1")
+
++(define_insn_reservation "znver5_sse_cmp_avx_load" 6
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssecmp")
++ (and (eq_attr "prefix" "vex")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fpu0|znver4-fpu1")
++
+ (define_insn_reservation "znver4_sse_comi_avx" 1
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssecomi")
+ (eq_attr "memory" "store")))
+ "znver4-direct,znver4-fpu2+znver4-fpu3,znver4-fp-store")
+
++(define_insn_reservation "znver5_sse_comi_avx" 1
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssecomi")
++ (eq_attr "memory" "store")))
++ "znver4-direct,znver4-fpu2+znver4-fpu3,znver5-fp-store256")
++
+ (define_insn_reservation "znver4_sse_comi_avx_load" 6
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssecomi")
+ (eq_attr "memory" "both")))
+ "znver4-direct,znver4-load,znver4-fpu2+znver4-fpu3,znver4-fp-store")
+
++(define_insn_reservation "znver5_sse_comi_avx_load" 6
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssecomi")
++ (eq_attr "memory" "both")))
++ "znver4-direct,znver5-load,znver4-fpu2+znver4-fpu3,znver5-fp-store256")
++
+ (define_insn_reservation "znver4_sse_cvt" 3
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "ssecvt")
+ (and (eq_attr "mode" "V8SF,V4DF,V4SF,V2DF,V2SF,V1DF,SF")
+ (eq_attr "memory" "none"))))
+@@ -775,8 +1210,15 @@ (define_insn_reservation "znver4_sse_cvt_load" 8
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu2|znver4-fpu3")
+
++(define_insn_reservation "znver5_sse_cvt_load" 8
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssecvt")
++ (and (eq_attr "mode" "V8SF,V4DF,V4SF,V2DF,V2SF,V1DF,SF")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fpu2|znver4-fpu3")
++
+ (define_insn_reservation "znver4_sse_icvt" 3
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "ssecvt")
+ (and (eq_attr "mode" "SI")
+ (eq_attr "memory" "none"))))
+@@ -789,6 +1231,13 @@ (define_insn_reservation "znver4_sse_icvt_store" 4
+ (eq_attr "memory" "store"))))
+ "znver4-double,znver4-fpu2|znver4-fpu3,znver4-fp-store")
+
++(define_insn_reservation "znver5_sse_icvt_store" 4
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssecvt")
++ (and (eq_attr "mode" "SI")
++ (eq_attr "memory" "store"))))
++ "znver4-double,znver4-fpu2|znver4-fpu3,znver5-fp-store256")
++
+ (define_insn_reservation "znver4_sse_shuf" 1
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "sseshuf")
+@@ -796,6 +1245,13 @@ (define_insn_reservation "znver4_sse_shuf" 1
+ (eq_attr "memory" "none"))))
+ "znver4-direct,znver4-fpu1|znver4-fpu2")
+
++(define_insn_reservation "znver5_sse_shuf" 1
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sseshuf")
++ (and (eq_attr "mode" "V8SF,V4DF,V4SF,V2DF,V2SF,V1DF,SF")
++ (eq_attr "memory" "none"))))
++ "znver4-direct,znver4-fpu1|znver4-fpu2|znver4-fpu3")
++
+ (define_insn_reservation "znver4_sse_shuf_load" 6
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "sseshuf")
+@@ -803,8 +1259,15 @@ (define_insn_reservation "znver4_sse_shuf_load" 6
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu")
+
++(define_insn_reservation "znver5_sse_shuf_load" 6
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sseshuf")
++ (and (eq_attr "mode" "V8SF,V4DF,V4SF,V2DF,V2SF,V1DF,SF")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fpu")
++
+ (define_insn_reservation "znver4_sse_ishuf" 3
+- (and (eq_attr "cpu" "znver4")
++ (and (eq_attr "cpu" "znver4,znver5")
+ (and (eq_attr "type" "sseshuf")
+ (and (eq_attr "mode" "OI")
+ (eq_attr "memory" "none"))))
+@@ -817,6 +1280,13 @@ (define_insn_reservation "znver4_sse_ishuf_load" 8
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu1|znver4-fpu2")
+
++(define_insn_reservation "znver5_sse_ishuf_load" 8
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sseshuf")
++ (and (eq_attr "mode" "OI")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fpu1|znver4-fpu2")
++
+ ;; AVX512 instructions
+ (define_insn_reservation "znver4_sse_log_evex" 1
+ (and (eq_attr "cpu" "znver4")
+@@ -825,6 +1295,13 @@ (define_insn_reservation "znver4_sse_log_evex" 1
+ (eq_attr "memory" "none"))))
+ "znver4-direct,znver4-fpu0*2|znver4-fpu1*2|znver4-fpu2*2|znver4-fpu3*2")
+
++(define_insn_reservation "znver5_sse_log_evex" 1
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sselog")
++ (and (eq_attr "mode" "V16SF,V8DF,XI")
++ (eq_attr "memory" "none"))))
++ "znver4-direct,znver4-fpu0|znver4-fpu1|znver4-fpu2|znver4-fpu3")
++
+ (define_insn_reservation "znver4_sse_log_evex_load" 7
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "sselog")
+@@ -832,6 +1309,13 @@ (define_insn_reservation "znver4_sse_log_evex_load" 7
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu0*2|znver4-fpu1*2|znver4-fpu2*2|znver4-fpu3*2")
+
++(define_insn_reservation "znver5_sse_log_evex_load" 7
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sselog")
++ (and (eq_attr "mode" "V16SF,V8DF,XI")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fpu0|znver4-fpu1|znver4-fpu2|znver4-fpu3")
++
+ (define_insn_reservation "znver4_sse_log1_evex" 1
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "sselog1")
+@@ -839,6 +1323,13 @@ (define_insn_reservation "znver4_sse_log1_evex" 1
+ (eq_attr "memory" "none"))))
+ "znver4-direct,znver4-fpu1*2|znver4-fpu2*2,znver4-fp-store")
+
++(define_insn_reservation "znver5_sse_log1_evex" 1
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sselog1")
++ (and (eq_attr "mode" "V16SF,V8DF,XI")
++ (eq_attr "memory" "none"))))
++ "znver4-direct,znver4-fpu1|znver4-fpu2,znver5-fp-store-512")
++
+ (define_insn_reservation "znver4_sse_log1_evex_load" 7
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "sselog1")
+@@ -846,6 +1337,13 @@ (define_insn_reservation "znver4_sse_log1_evex_load" 7
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu1*2|znver4-fpu2*2,znver4-fp-store")
+
++(define_insn_reservation "znver5_sse_log1_evex_load" 7
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sselog1")
++ (and (eq_attr "mode" "V16SF,V8DF,XI")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fpu1|znver4-fpu2,znver5-fp-store-512")
++
+ (define_insn_reservation "znver4_sse_mul_evex" 3
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssemul")
+@@ -853,6 +1351,13 @@ (define_insn_reservation "znver4_sse_mul_evex" 3
+ (eq_attr "memory" "none"))))
+ "znver4-direct,znver4-fpu0*2|znver4-fpu1*2")
+
++(define_insn_reservation "znver5_sse_mul_evex" 3
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssemul")
++ (and (eq_attr "mode" "V16SF,V8DF")
++ (eq_attr "memory" "none"))))
++ "znver4-direct,znver4-fpu0|znver4-fpu1")
++
+ (define_insn_reservation "znver4_sse_mul_evex_load" 9
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssemul")
+@@ -860,6 +1365,13 @@ (define_insn_reservation "znver4_sse_mul_evex_load" 9
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu0*2|znver4-fpu1*2")
+
++(define_insn_reservation "znver5_sse_mul_evex_load" 9
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssemul")
++ (and (eq_attr "mode" "V16SF,V8DF")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver4-load,znver4-fpu0|znver4-fpu1")
++
+ (define_insn_reservation "znver4_sse_imul_evex" 3
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "sseimul")
+@@ -867,6 +1379,13 @@ (define_insn_reservation "znver4_sse_imul_evex" 3
+ (eq_attr "memory" "none"))))
+ "znver4-direct,znver4-fpu0*2|znver4-fpu3*2")
+
++(define_insn_reservation "znver5_sse_imul_evex" 3
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sseimul")
++ (and (eq_attr "mode" "XI")
++ (eq_attr "memory" "none"))))
++ "znver4-direct,znver4-fpu0|znver4-fpu3")
++
+ (define_insn_reservation "znver4_sse_imul_evex_load" 9
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "sseimul")
+@@ -874,6 +1393,13 @@ (define_insn_reservation "znver4_sse_imul_evex_load" 9
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu0*2|znver4-fpu1*2")
+
++(define_insn_reservation "znver5_sse_imul_evex_load" 9
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sseimul")
++ (and (eq_attr "mode" "XI")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver4-load,znver4-fpu0|znver4-fpu1")
++
+ (define_insn_reservation "znver4_sse_mov_evex" 4
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssemov")
+@@ -881,6 +1407,13 @@ (define_insn_reservation "znver4_sse_mov_evex" 4
+ (eq_attr "memory" "none"))))
+ "znver4-direct,znver4-fpu1*2|znver4-fpu2*2")
+
++(define_insn_reservation "znver5_sse_mov_evex" 2
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssemov")
++ (and (eq_attr "mode" "XI")
++ (eq_attr "memory" "none"))))
++ "znver4-direct,znver4-fpu1|znver4-fpu2")
++
+ (define_insn_reservation "znver4_sse_mov_evex_load" 10
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssemov")
+@@ -888,6 +1421,13 @@ (define_insn_reservation "znver4_sse_mov_evex_load" 10
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu1*2|znver4-fpu2*2")
+
++(define_insn_reservation "znver5_sse_mov_evex_load" 8
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssemov")
++ (and (eq_attr "mode" "XI")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver4-load,znver4-fpu1|znver4-fpu2")
++
+ (define_insn_reservation "znver4_sse_mov_evex_store" 5
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssemov")
+@@ -895,6 +1435,13 @@ (define_insn_reservation "znver4_sse_mov_evex_store" 5
+ (eq_attr "memory" "store"))))
+ "znver4-direct,znver4-fpu1*2|znver4-fpu2*2,znver4-fp-store")
+
++(define_insn_reservation "znver5_sse_mov_evex_store" 3
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssemov")
++ (and (eq_attr "mode" "XI")
++ (eq_attr "memory" "store"))))
++ "znver4-direct,znver4-fpu1|znver4-fpu2,znver5-fp-store-512")
++
+ (define_insn_reservation "znver4_sse_add_evex" 3
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "sseadd")
+@@ -902,6 +1449,13 @@ (define_insn_reservation "znver4_sse_add_evex" 3
+ (eq_attr "memory" "none"))))
+ "znver4-direct,znver4-fpu2*2|znver4-fpu3*2")
+
++(define_insn_reservation "znver5_sse_add_evex" 2
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sseadd")
++ (and (eq_attr "mode" "V16SF,V8DF")
++ (eq_attr "memory" "none"))))
++ "znver4-direct,znver4-fpu2|znver4-fpu3")
++
+ (define_insn_reservation "znver4_sse_add_evex_load" 9
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "sseadd")
+@@ -909,6 +1463,13 @@ (define_insn_reservation "znver4_sse_add_evex_load" 9
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu2*2|znver4-fpu3*2")
+
++(define_insn_reservation "znver5_sse_add_evex_load" 8
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sseadd")
++ (and (eq_attr "mode" "V16SF,V8DF")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver4-load,znver4-fpu2|znver4-fpu3")
++
+ (define_insn_reservation "znver4_sse_iadd_evex" 1
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "sseiadd")
+@@ -916,6 +1477,13 @@ (define_insn_reservation "znver4_sse_iadd_evex" 1
+ (eq_attr "memory" "none"))))
+ "znver4-direct,znver4-fpu0*2|znver4-fpu1*2|znver4-fpu2*2|znver4-fpu3*2")
+
++(define_insn_reservation "znver5_sse_iadd_evex" 1
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sseiadd")
++ (and (eq_attr "mode" "XI")
++ (eq_attr "memory" "none"))))
++ "znver4-direct,znver4-fpu0|znver4-fpu1|znver4-fpu2|znver4-fpu3")
++
+ (define_insn_reservation "znver4_sse_iadd_evex_load" 7
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "sseiadd")
+@@ -923,6 +1491,13 @@ (define_insn_reservation "znver4_sse_iadd_evex_load" 7
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu0*2|znver4-fpu1*2|znver4-fpu2*2|znver4-fpu3*2")
+
++(define_insn_reservation "znver5_sse_iadd_evex_load" 7
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sseiadd")
++ (and (eq_attr "mode" "XI")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver4-load,znver4-fpu0|znver4-fpu1|znver4-fpu2|znver4-fpu3")
++
+ (define_insn_reservation "znver4_sse_div_pd_evex" 13
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssediv")
+@@ -930,6 +1505,13 @@ (define_insn_reservation "znver4_sse_div_pd_evex" 13
+ (eq_attr "memory" "none"))))
+ "znver4-direct,znver4-fdiv*9")
+
++(define_insn_reservation "znver5_sse_div_pd_evex" 13
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssediv")
++ (and (eq_attr "mode" "V8DF")
++ (eq_attr "memory" "none"))))
++ "znver4-direct,znver4-fdiv*9")
++
+ (define_insn_reservation "znver4_sse_div_ps_evex" 10
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssediv")
+@@ -937,6 +1519,13 @@ (define_insn_reservation "znver4_sse_div_ps_evex" 10
+ (eq_attr "memory" "none"))))
+ "znver4-direct,znver4-fdiv*6")
+
++(define_insn_reservation "znver5_sse_div_ps_evex" 10
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssediv")
++ (and (eq_attr "mode" "V16SF")
++ (eq_attr "memory" "none"))))
++ "znver4-direct,znver4-fdiv*6")
++
+ (define_insn_reservation "znver4_sse_div_pd_evex_load" 19
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssediv")
+@@ -944,6 +1533,13 @@ (define_insn_reservation "znver4_sse_div_pd_evex_load" 19
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fdiv*9")
+
++(define_insn_reservation "znver5_sse_div_pd_evex_load" 19
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssediv")
++ (and (eq_attr "mode" "V8DF")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fdiv*9")
++
+ (define_insn_reservation "znver4_sse_div_ps_evex_load" 16
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssediv")
+@@ -951,6 +1547,13 @@ (define_insn_reservation "znver4_sse_div_ps_evex_load" 16
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fdiv*6")
+
++(define_insn_reservation "znver5_sse_div_ps_evex_load" 16
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssediv")
++ (and (eq_attr "mode" "V16SF")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fdiv*6")
++
+ (define_insn_reservation "znver4_sse_cmp_avx128" 3
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssecmp")
+@@ -959,6 +1562,14 @@ (define_insn_reservation "znver4_sse_cmp_avx128" 3
+ (eq_attr "memory" "none")))))
+ "znver4-direct,znver4-fpu0*2|znver4-fpu1*2")
+
++(define_insn_reservation "znver5_sse_cmp_avx128" 3
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssecmp")
++ (and (eq_attr "mode" "V4SF,V2DF,V2SF,V1DF,SF")
++ (and (eq_attr "prefix" "evex")
++ (eq_attr "memory" "none")))))
++ "znver4-direct,znver4-fpu1|znver4-fpu2")
++
+ (define_insn_reservation "znver4_sse_cmp_avx128_load" 9
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssecmp")
+@@ -967,6 +1578,14 @@ (define_insn_reservation "znver4_sse_cmp_avx128_load" 9
+ (eq_attr "memory" "load")))))
+ "znver4-direct,znver4-load,znver4-fpu0*2|znver4-fpu1*2")
+
++(define_insn_reservation "znver5_sse_cmp_avx128_load" 9
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssecmp")
++ (and (eq_attr "mode" "V4SF,V2DF,V2SF,V1DF,SF")
++ (and (eq_attr "prefix" "evex")
++ (eq_attr "memory" "load")))))
++ "znver4-direct,znver5-load,znver4-fpu1|znver4-fpu2")
++
+ (define_insn_reservation "znver4_sse_cmp_avx256" 4
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssecmp")
+@@ -975,6 +1594,14 @@ (define_insn_reservation "znver4_sse_cmp_avx256" 4
+ (eq_attr "memory" "none")))))
+ "znver4-direct,znver4-fpu0*2|znver4-fpu1*2")
+
++(define_insn_reservation "znver5_sse_cmp_avx256" 4
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssecmp")
++ (and (eq_attr "mode" "V8SF,V4DF")
++ (and (eq_attr "prefix" "evex")
++ (eq_attr "memory" "none")))))
++ "znver4-direct,znver4-fpu1|znver4-fpu2")
++
+ (define_insn_reservation "znver4_sse_cmp_avx256_load" 10
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssecmp")
+@@ -983,6 +1610,14 @@ (define_insn_reservation "znver4_sse_cmp_avx256_load" 10
+ (eq_attr "memory" "load")))))
+ "znver4-direct,znver4-load,znver4-fpu0*2|znver4-fpu1*2")
+
++(define_insn_reservation "znver5_sse_cmp_avx256_load" 10
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssecmp")
++ (and (eq_attr "mode" "V8SF,V4DF")
++ (and (eq_attr "prefix" "evex")
++ (eq_attr "memory" "load")))))
++ "znver4-direct,znver5-load,znver4-fpu1|znver4-fpu2")
++
+ (define_insn_reservation "znver4_sse_cmp_avx512" 5
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssecmp")
+@@ -991,6 +1626,14 @@ (define_insn_reservation "znver4_sse_cmp_avx512" 5
+ (eq_attr "memory" "none")))))
+ "znver4-direct,znver4-fpu0*2|znver4-fpu1*2")
+
++(define_insn_reservation "znver5_sse_cmp_avx512" 5
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssecmp")
++ (and (eq_attr "mode" "V16SF,V8DF")
++ (and (eq_attr "prefix" "evex")
++ (eq_attr "memory" "none")))))
++ "znver4-direct,znver4-fpu1|znver4-fpu2")
++
+ (define_insn_reservation "znver4_sse_cmp_avx512_load" 11
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssecmp")
+@@ -999,6 +1642,14 @@ (define_insn_reservation "znver4_sse_cmp_avx512_load" 11
+ (eq_attr "memory" "load")))))
+ "znver4-direct,znver4-load,znver4-fpu0*2|znver4-fpu1*2")
+
++(define_insn_reservation "znver5_sse_cmp_avx512_load" 11
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssecmp")
++ (and (eq_attr "mode" "V16SF,V8DF")
++ (and (eq_attr "prefix" "evex")
++ (eq_attr "memory" "load")))))
++ "znver4-direct,znver5-load,znver4-fpu1|znver4-fpu2")
++
+ (define_insn_reservation "znver4_sse_cvt_evex" 6
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssecvt")
+@@ -1006,6 +1657,13 @@ (define_insn_reservation "znver4_sse_cvt_evex" 6
+ (eq_attr "memory" "none"))))
+ "znver4-direct,znver4-fpu1*2|znver4-fpu2*2,znver4-fpu2*2|znver4-fpu3*2")
+
++(define_insn_reservation "znver5_sse_cvt_evex" 6
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssecvt")
++ (and (eq_attr "mode" "V16SF,V8DF")
++ (eq_attr "memory" "none"))))
++ "znver4-direct,znver4-fpu1|znver4-fpu2,znver4-fpu2|znver4-fpu3")
++
+ (define_insn_reservation "znver4_sse_cvt_evex_load" 12
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssecvt")
+@@ -1013,6 +1671,13 @@ (define_insn_reservation "znver4_sse_cvt_evex_load" 12
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu1*2|znver4-fpu2*2,znver4-fpu2*2|znver4-fpu3*2")
+
++(define_insn_reservation "znver5_sse_cvt_evex_load" 12
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssecvt")
++ (and (eq_attr "mode" "V16SF,V8DF")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fpu1|znver4-fpu2,znver4-fpu2|znver4-fpu3")
++
+ (define_insn_reservation "znver4_sse_shuf_evex" 1
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "sseshuf")
+@@ -1020,6 +1685,13 @@ (define_insn_reservation "znver4_sse_shuf_evex" 1
+ (eq_attr "memory" "none"))))
+ "znver4-direct,znver4-fpu0*2|znver4-fpu1*2|znver4-fpu2*2|znver4-fpu3*2")
+
++(define_insn_reservation "znver5_sse_shuf_evex" 1
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sseshuf")
++ (and (eq_attr "mode" "V16SF,V8DF")
++ (eq_attr "memory" "none"))))
++ "znver4-direct,znver4-fpu0|znver4-fpu1|znver4-fpu2|znver4-fpu3")
++
+ (define_insn_reservation "znver4_sse_shuf_evex_load" 7
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "sseshuf")
+@@ -1027,6 +1699,13 @@ (define_insn_reservation "znver4_sse_shuf_evex_load" 7
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu0*2|znver4-fpu1*2|znver4-fpu2*2|znver4-fpu3*2")
+
++(define_insn_reservation "znver5_sse_shuf_evex_load" 7
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sseshuf")
++ (and (eq_attr "mode" "V16SF,V8DF")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fpu0|znver4-fpu1|znver4-fpu2|znver4-fpu3")
++
+ (define_insn_reservation "znver4_sse_ishuf_evex" 4
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "sseshuf")
+@@ -1034,6 +1713,13 @@ (define_insn_reservation "znver4_sse_ishuf_evex" 4
+ (eq_attr "memory" "none"))))
+ "znver4-direct,znver4-fpu1*2|znver4-fpu2*2")
+
++(define_insn_reservation "znver5_sse_ishuf_evex" 5
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sseshuf")
++ (and (eq_attr "mode" "XI")
++ (eq_attr "memory" "none"))))
++ "znver4-direct,znver4-fpu1|znver4-fpu2")
++
+ (define_insn_reservation "znver4_sse_ishuf_evex_load" 10
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "sseshuf")
+@@ -1041,18 +1727,37 @@ (define_insn_reservation "znver4_sse_ishuf_evex_load" 10
+ (eq_attr "memory" "load"))))
+ "znver4-direct,znver4-load,znver4-fpu1*2|znver4-fpu2*2")
+
++(define_insn_reservation "znver5_sse_ishuf_evex_load" 10
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sseshuf")
++ (and (eq_attr "mode" "XI")
++ (eq_attr "memory" "load"))))
++ "znver4-direct,znver5-load,znver4-fpu1|znver4-fpu2")
++
+ (define_insn_reservation "znver4_sse_muladd" 4
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "ssemuladd")
+ (eq_attr "memory" "none")))
+ "znver4-direct,znver4-fpu0*2|znver4-fpu1*2")
+
++(define_insn_reservation "znver5_sse_muladd" 4
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "ssemuladd")
++ (eq_attr "memory" "none")))
++ "znver4-direct,znver4-fpu0|znver4-fpu1")
++
+ (define_insn_reservation "znver4_sse_muladd_load" 10
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "sseshuf")
+ (eq_attr "memory" "load")))
+ "znver4-direct,znver4-load,znver4-fpu0*2|znver4-fpu1*2")
+
++(define_insn_reservation "znver5_sse_muladd_load" 10
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "sseshuf")
++ (eq_attr "memory" "load")))
++ "znver4-direct,znver5-load,znver4-fpu1|znver4-fpu2")
++
+ ;; AVX512 mask instructions
+
+ (define_insn_reservation "znver4_sse_mskmov" 2
+@@ -1061,8 +1766,20 @@ (define_insn_reservation "znver4_sse_mskmov" 2
+ (eq_attr "memory" "none")))
+ "znver4-direct,znver4-fpu0*2|znver4-fpu1*2")
+
++(define_insn_reservation "znver5_sse_mskmov" 2
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "mskmov")
++ (eq_attr "memory" "none")))
++ "znver4-direct,znver4-fpu0|znver4-fpu1")
++
+ (define_insn_reservation "znver4_sse_msklog" 1
+ (and (eq_attr "cpu" "znver4")
+ (and (eq_attr "type" "msklog")
+ (eq_attr "memory" "none")))
+ "znver4-direct,znver4-fpu2*2|znver4-fpu3*2")
++
++(define_insn_reservation "znver5_sse_msklog" 1
++ (and (eq_attr "cpu" "znver5")
++ (and (eq_attr "type" "msklog")
++ (eq_attr "memory" "none")))
++ "znver4-direct,znver4-fpu0|znver4-fpu3")
+diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
+index d6fcd611339..5c6ce67b7d1 100644
+--- a/gcc/doc/extend.texi
++++ b/gcc/doc/extend.texi
+@@ -22060,6 +22060,9 @@ AMD Family 19h Zen version 3.
+
+ @item znver4
+ AMD Family 19h Zen version 4.
++
++@item znver5
++AMD Family 1ah Zen version 5.
+ @end table
+
+ Here is an example:
+diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
+index 792ce283bb9..9bec6eb01bd 100644
+--- a/gcc/doc/invoke.texi
++++ b/gcc/doc/invoke.texi
+@@ -32660,6 +32660,16 @@ WBNOINVD, PKU, VPCLMULQDQ, VAES, AVX512F, AVX512DQ, AVX512IFMA, AVX512CD,
+ AVX512BW, AVX512VL, AVX512BF16, AVX512VBMI, AVX512VBMI2, AVX512VNNI,
+ AVX512BITALG, AVX512VPOPCNTDQ, GFNI and 64-bit instruction set extensions.)
+
++@item znver5
++AMD Family 1ah core based CPUs with x86-64 instruction set support. (This
++supersets BMI, BMI2, CLWB, F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED,
++MWAITX, SHA, CLZERO, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A,
++SSSE3, SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT, RDPID,
++WBNOINVD, PKU, VPCLMULQDQ, VAES, AVX512F, AVX512DQ, AVX512IFMA, AVX512CD,
++AVX512BW, AVX512VL, AVX512BF16, AVX512VBMI, AVX512VBMI2, AVX512VNNI,
++AVX512BITALG, AVX512VPOPCNTDQ, GFNI, AVXVNNI, MOVDIRI, MOVDIR64B,
++AVX512VP2INTERSECT, PREFETCHI and 64-bit instruction set extensions.)
++
+ @item btver1
+ CPUs based on AMD Family 14h cores with x86-64 instruction set support. (This
+ supersets MMX, SSE, SSE2, SSE3, SSSE3, SSE4A, CX16, ABM and 64-bit
+diff --git a/gcc/testsuite/g++.target/i386/mv29.C b/gcc/testsuite/g++.target/i386/mv29.C
+index a8dd8ac4803..ab229534edd 100644
+--- a/gcc/testsuite/g++.target/i386/mv29.C
++++ b/gcc/testsuite/g++.target/i386/mv29.C
+@@ -53,6 +53,10 @@ int __attribute__ ((target("arch=znver4"))) foo () {
+ return 10;
+ }
+
++int __attribute__ ((target("arch=znver5"))) foo () {
++ return 11;
++}
++
+ int main ()
+ {
+ int val = foo ();
+@@ -77,6 +81,8 @@ int main ()
+ assert (val == 9);
+ else if (__builtin_cpu_is ("znver4"))
+ assert (val == 10);
++ else if (__builtin_cpu_is ("znver5"))
++ assert (val == 11);
+ else
+ assert (val == 0);
+
+diff --git a/gcc/testsuite/gcc.target/i386/funcspec-56.inc b/gcc/testsuite/gcc.target/i386/funcspec-56.inc
+index f466962c36c..6bfdcdade82 100644
+--- a/gcc/testsuite/gcc.target/i386/funcspec-56.inc
++++ b/gcc/testsuite/gcc.target/i386/funcspec-56.inc
+@@ -221,6 +221,7 @@ extern void test_arch_znver1 (void) __attribute__((__target__("arch=
+ extern void test_arch_znver2 (void) __attribute__((__target__("arch=znver2")));
+ extern void test_arch_znver3 (void) __attribute__((__target__("arch=znver3")));
+ extern void test_arch_znver4 (void) __attribute__((__target__("arch=znver4")));
++extern void test_arch_znver5 (void) __attribute__((__target__("arch=znver5")));
+
+ extern void test_tune_nocona (void) __attribute__((__target__("tune=nocona")));
+ extern void test_tune_core2 (void) __attribute__((__target__("tune=core2")));
+@@ -245,6 +246,7 @@ extern void test_tune_znver1 (void) __attribute__((__target__("tune=
+ extern void test_tune_znver2 (void) __attribute__((__target__("tune=znver2")));
+ extern void test_tune_znver3 (void) __attribute__((__target__("tune=znver3")));
+ extern void test_tune_znver4 (void) __attribute__((__target__("tune=znver4")));
++extern void test_tune_znver5 (void) __attribute__((__target__("tune=znver5")));
+
+ extern void test_fpmath_sse (void) __attribute__((__target__("sse2,fpmath=sse")));
+ extern void test_fpmath_387 (void) __attribute__((__target__("sse2,fpmath=387")));
+--
+2.45.1
+
diff --git a/SPECS/gcc.spec b/SPECS/gcc.spec
index 644e1ce..f5d4827 100644
--- a/SPECS/gcc.spec
+++ b/SPECS/gcc.spec
@@ -5,13 +5,13 @@ BuildRequires: scl-utils-build
%{?scl:%global __strip %%{_scl_root}/usr/bin/strip}
%{?scl:%global __objdump %%{_scl_root}/usr/bin/objdump}
%{?scl:%scl_package gcc}
-%global DATE 20231205
-%global gitrev f783814ad6a04ae5ef44595216596a2b75eda15b
-%global gcc_version 13.2.1
+%global DATE 20240611
+%global gitrev 03b1a31f9807251f378fcecb29c4669eed357eb2
+%global gcc_version 13.3.1
%global gcc_major 13
# Note, gcc_release must be integer, if you want to add suffixes to
# %%{release}, append them after %%{gcc_release} on Release: line.
-%global gcc_release 6
+%global gcc_release 2
%global nvptx_tools_gitrev aa3404ad5a496cda5d79a50bedb1344fd63e8763
%global newlib_cygwin_gitrev 9e09d6ed83cce4777a5950412647ccc603040409
%global mpc_version 1.0.3
@@ -146,10 +146,10 @@ BuildRequires: scl-utils-build
%else
%global build_annobin_plugin 0
%endif
-Summary: GCC version 13
+Summary: GCC version %{gcc_major}
Name: %{?scl_prefix}gcc
Version: %{gcc_version}
-Release: %{gcc_release}.2%{?dist}
+Release: %{gcc_release}.1%{?dist}
# libgcc, libgfortran, libgomp, libstdc++ and crtstuff have
# GCC Runtime Exception.
License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD
@@ -329,7 +329,11 @@ Patch8: gcc13-no-add-needed.patch
Patch9: gcc13-Wno-format-security.patch
Patch10: gcc13-rh1574936.patch
Patch11: gcc13-d-shared-libphobos.patch
-Patch12: gcc13-pr110792.patch
+Patch12: gcc13-znver5.patch
+Patch13: gcc13-pr107071.patch
+Patch14: gcc13-vector-merge-1.patch
+Patch15: gcc13-vector-merge-2.patch
+Patch16: gcc13-vector-merge-3.patch
Patch50: isl-rh2155127.patch
@@ -361,7 +365,6 @@ Patch3018: 0021-libstdc++-disable-tests.patch
Patch3019: 0022-libstdc++-revert-behavior.patch
Patch3021: gcc13-testsuite-p10.patch
Patch3023: gcc13-testsuite-dwarf.patch
-Patch3024: gcc13-testsuite-aarch64-add-fno-stack-protector.patch
%if 0%{?rhel} == 9
%global nonsharedver 110
@@ -392,10 +395,11 @@ Patch3024: gcc13-testsuite-aarch64-add-fno-stack-protector.patch
%endif
%description
-The %{?scl_prefix}gcc%{!?scl:13} package contains the GNU Compiler Collection version 10.
+The %{?scl_prefix}gcc%{!?scl:13} package contains the GNU Compiler Collection
+version %{gcc_major}.
%package -n libgcc
-Summary: GCC version 13 shared support library
+Summary: GCC version %{gcc_major} shared support library
Autoreq: false
%description -n libgcc
@@ -403,7 +407,7 @@ This package contains GCC shared support library which is needed
e.g. for exception handling support.
%package c++
-Summary: C++ support for GCC version 13
+Summary: C++ support for GCC version %{gcc_major}
Requires: %{?scl_prefix}gcc%{!?scl:13} = %{version}-%{release}
Requires: libstdc++
Requires: %{?scl_prefix}libstdc++%{!?scl:13}-devel = %{version}-%{release}
@@ -411,8 +415,8 @@ Autoreq: true
%description c++
This package adds C++ support to the GNU Compiler Collection
-version 13. It includes support for most of the current C++ specification
-and a lot of support for the upcoming C++ specification.
+version %{gcc_major}. It includes support for most of the current C++
+specification and a lot of support for the upcoming C++ specification.
%package -n libstdc++
Summary: GNU Standard C++ Library
@@ -442,7 +446,7 @@ Manual, doxygen generated API information and Frequently Asked Questions
for the GNU standard C++ library.
%package gfortran
-Summary: Fortran support for GCC 13
+Summary: Fortran support for GCC %{gcc_major}
Requires: %{?scl_prefix}gcc%{!?scl:13} = %{version}-%{release}
%if 0%{?rhel} > 7
Requires: libgfortran >= 8.1.1
@@ -465,18 +469,18 @@ programs with the GNU Compiler Collection.
%package gdb-plugin
-Summary: GCC 13 plugin for GDB
+Summary: GCC %{gcc_major} plugin for GDB
Requires: %{?scl_prefix}gcc%{!?scl:13} = %{version}-%{release}
%description gdb-plugin
-This package contains GCC 13 plugin for GDB C expression evaluation.
+This package contains GCC %{gcc_major} plugin for GDB C expression evaluation.
%package -n %{?scl_prefix}libgccjit
Summary: Library for embedding GCC inside programs and libraries
Requires: %{?scl_prefix}gcc%{!?scl:13} = %{version}-%{release}
%description -n %{?scl_prefix}libgccjit
-This package contains shared library with GCC 13 JIT front-end.
+This package contains shared library with GCC %{gcc_major} JIT front-end.
%package -n %{?scl_prefix}libgccjit-devel
Summary: Support for embedding GCC inside programs and libraries
@@ -486,7 +490,7 @@ Requires: %{?scl_prefix}libgccjit = %{version}-%{release}
#Requires: %%{?scl_prefix}libgccjit-docs = %%{version}-%%{release}
%description -n %{?scl_prefix}libgccjit-devel
-This package contains header files for GCC 13 JIT front end.
+This package contains header files for GCC %{gcc_major} JIT front end.
%package -n %{?scl_prefix}libgccjit-docs
Summary: Documentation for embedding GCC inside programs and libraries
@@ -500,10 +504,10 @@ Requires(post): /sbin/install-info
Requires(preun): /sbin/install-info
%description -n %{?scl_prefix}libgccjit-docs
-This package contains documentation for GCC 13 JIT front-end.
+This package contains documentation for GCC %{gcc_major} JIT front-end.
%package -n libquadmath
-Summary: GCC 13 __float128 shared support library
+Summary: GCC %{gcc_major} __float128 shared support library
Requires(post): /sbin/install-info
Requires(preun): /sbin/install-info
@@ -512,7 +516,7 @@ This package contains GCC shared support library which is needed
for __float128 math support and for Fortran REAL*16 support.
%package -n %{?scl_prefix}libquadmath-devel
-Summary: GCC 13 __float128 support
+Summary: GCC %{gcc_major} __float128 support
Group: Development/Libraries
%if 0%{!?scl:1}
Requires: %{?scl_prefix}libquadmath%{_isa} = %{version}-%{release}
@@ -553,7 +557,7 @@ Requires: libmpc-devel >= 0.8.1
%description plugin-devel
This package contains header files and other support files
-for compiling GCC 13 plugins. The GCC plugin ABI is currently
+for compiling GCC %{gcc_major} plugins. The GCC plugin ABI is currently
not stable, so plugins must be rebuilt any time GCC is updated.
%package -n libatomic
@@ -575,10 +579,10 @@ Requires: libatomic%{_isa} >= 4.8.0
This package contains GNU Atomic static libraries.
%package -n libasan8
-Summary: The Address Sanitizer runtime library from GCC 13
+Summary: The Address Sanitizer runtime library from GCC %{gcc_major}
%description -n libasan8
-This package contains the Address Sanitizer library from GCC 13
+This package contains the Address Sanitizer library from GCC %{gcc_major}
which is used for -fsanitize=address instrumented programs.
%package -n %{?scl_prefix}libasan-devel
@@ -695,7 +699,11 @@ so that there cannot be any synchronization problems.
%patch -P10 -p0 -b .rh1574936~
%endif
%patch -P11 -p0 -b .d-shared-libphobos~
-%patch -P12 -p0 -b .pr110792~
+%patch -P12 -p1 -b .znver5~
+%patch -P13 -p1 -b .pr107071~
+%patch -P14 -p1 -b .vector-merge-1~
+%patch -P15 -p1 -b .vector-merge-2~
+%patch -P16 -p1 -b .vector-merge-3~
%if 0%{?rhel} >= 6
%patch -P100 -p1 -b .fortran-fdec-duplicates~
@@ -743,7 +751,6 @@ rm -f libphobos/testsuite/libphobos.gc/forkgc2.d
%endif
%patch -P3021 -p1 -b .dts-test-21~
%patch -P3023 -p1 -b .dts-test-23~
-%patch -P3024 -p1 -b .dts-test-24~
find gcc/testsuite -name \*.pr96939~ | xargs rm -f
@@ -1181,7 +1188,8 @@ CC="`$ANNOBIN_FLAGS --build-cc`" CXX="`$ANNOBIN_FLAGS --build-cxx`" \
CFLAGS="$ANNOBIN_CFLAGS1 $ANNOBIN_CFLAGS2 $ANNOBIN_LDFLAGS" \
CXXFLAGS="$ANNOBIN_CFLAGS1 `$ANNOBIN_FLAGS --build-includes` $ANNOBIN_CFLAGS2 $ANNOBIN_LDFLAGS" \
./configure --with-gcc-plugin-dir=%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_major}/plugin \
- --without-annocheck --without-tests --without-docs --disable-rpath --without-debuginfod
+ --without-annocheck --without-tests --without-docs --disable-rpath --without-debuginfod \
+ --without-clang-plugin --without-llvm-plugin
make
cd ../..
%endif
@@ -1826,7 +1834,7 @@ ln -sf ../../../%{multilib_32_arch}-%{_vendor}-%{_target_os}%{?_gnu}/%{gcc_major
%if 0%{?_enable_debug_packages}
mkdir -p $RPM_BUILD_ROOT%{?scl:%{_root_prefix}}%{!?scl:%{_prefix}}/lib/debug%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_major}
adirs="$FULLPATH"
-if [ $FULLLPATH -ne $FULLPATH ]; then
+if [ "$FULLLPATH" != "$FULLPATH" ]; then
adirs="$adirs $FULLLPATH"
fi
for f in `find $adirs -maxdepth 1 -a \
@@ -2907,6 +2915,86 @@ fi
%endif
%changelog
+* Fri Jul 12 2024 Marek Polacek 13.3.1-2.1
+- fix wrong RTL patterns for vector merge high/low word on LE (RHEL-45191)
+
+* Tue Jun 11 2024 Marek Polacek 13.3.1-2
+- update from releases/gcc-13 branch
+ - PRs ada/114398, ada/114708, c/114493, c++/111529, c++/113598,
+ fortran/110415, fortran/114827, fortran/115150, libstdc++/114940,
+ libstdc++/115269, middle-end/108789, rtl-optimization/114902,
+ rtl-optimization/115092, target/113281, target/113719, target/115297,
+ target/115317, target/115324, tree-optimization/115192,
+ tree-optimization/115307, tree-optimization/115337
+- fix a shell condition (RHEL-40722)
+- backport a fix for modes_1.f90 (RHEL-40234)
+- fix up pointer types to may_alias structures (PR c/114493, RHEL-39736)
+
+* Mon Jun 3 2024 Marek Polacek 13.3.1-1
+- update from releases/gcc-13 branch
+ - GCC 13.3 release
+ - PRs analyzer/104042, analyzer/108171, analyzer/109251, analyzer/109577,
+ analyzer/110014, analyzer/110112, analyzer/110700, analyzer/110882,
+ analyzer/111289, analyzer/112790, analyzer/112889, analyzer/112969,
+ analyzer/113253, analyzer/113333, analyzer/114408, analyzer/114473,
+ bootstrap/106472, bootstrap/114369, c/112571, c/114780, c++/89224,
+ c++/97990, c++/100667, c++/103825, c++/110006, c++/111284, c++/112769,
+ c++/113141, c++/113966, c++/114303, c++/114377, c++/114537,
+ c++/114561, c++/114562, c++/114572, c++/114580, c++/114634,
+ c++/114691, c++/114709, debug/112718, driver/111700, fortran/36337,
+ fortran/50410, fortran/55978, fortran/89462, fortran/93678,
+ fortran/95374, fortran/101135, fortran/102003, fortran/103707,
+ fortran/103715, fortran/103716, fortran/104352, fortran/106987,
+ fortran/106999, fortran/107426, fortran/110987, fortran/112407,
+ fortran/113799, fortran/113866, fortran/113885, fortran/113956,
+ fortran/114001, fortran/114474, fortran/114535, fortran/114739,
+ fortran/114825, fortran/115039, gcov-profile/114115,
+ gcov-profile/114715, ipa/92606, ipa/108007, ipa/111571, ipa/112616,
+ ipa/113359, ipa/113907, ipa/113964, jit/110466, libgcc/111731,
+ libquadmath/114533, libstdc++/66146, libstdc++/93672,
+ libstdc++/104606, libstdc++/107800, libstdc++/108976,
+ libstdc++/110050, libstdc++/110054, libstdc++/113841,
+ libstdc++/114147, libstdc++/114316, libstdc++/114359,
+ libstdc++/114367, libstdc++/114401, libstdc++/114750,
+ libstdc++/114803, libstdc++/114863, libstdc++/115063, lto/114655,
+ middle-end/110027, middle-end/111151, middle-end/111632,
+ middle-end/111683, middle-end/112684, middle-end/112732,
+ middle-end/113396, middle-end/113622, middle-end/114070,
+ middle-end/114348, middle-end/114552, middle-end/114599,
+ middle-end/114734, middle-end/114753, middle-end/114907,
+ rtl-optimization/54052, rtl-optimization/114415,
+ rtl-optimization/114768, rtl-optimization/114924, sanitizer/97696,
+ sanitizer/114687, sanitizer/114743, sanitizer/114956,
+ sanitizer/115172, target/88309, target/101865, target/105522,
+ target/110621, target/111234, target/111600, target/111610,
+ target/111822, target/112397, target/113095, target/113233,
+ target/113950, target/114049, target/114130, target/114160,
+ target/114172, target/114175, target/114272, target/114747,
+ target/114752, target/114794, target/114837, target/114848,
+ target/114981, testsuite/111066, testsuite/112297, testsuite/114034,
+ testsuite/114036, testsuite/114662, tree-optimization/91838,
+ tree-optimization/109925, tree-optimization/110838,
+ tree-optimization/111009, tree-optimization/111268,
+ tree-optimization/111407, tree-optimization/111736,
+ tree-optimization/111882, tree-optimization/112281,
+ tree-optimization/112303, tree-optimization/112793,
+ tree-optimization/112961, tree-optimization/112991,
+ tree-optimization/113552, tree-optimization/113630,
+ tree-optimization/113670, tree-optimization/113831,
+ tree-optimization/113910, tree-optimization/114027,
+ tree-optimization/114115, tree-optimization/114121,
+ tree-optimization/114203, tree-optimization/114231,
+ tree-optimization/114246, tree-optimization/114375,
+ tree-optimization/114396, tree-optimization/114485,
+ tree-optimization/114566, tree-optimization/114672,
+ tree-optimization/114733, tree-optimization/114736,
+ tree-optimization/114749, tree-optimization/114787,
+ tree-optimization/114799, tree-optimization/114876,
+ tree-optimization/114965, tree-optimization/115143,
+ tree-optimization/115152, tree-optimization/115154
+- add --without-clang-plugin --without-llvm-plugin to annobin configure
+ options
+
* Mon Dec 11 2023 Marek Polacek 13.2.1-6.2
- use the system dir in --with-libstdcxx-zoneinfo (RHEL-20522)