From 10c52b3866572df9f84e41d8045cbf8c6ce6ab04 Mon Sep 17 00:00:00 2001
From: Stefan Schulze Frielinghaus <stefansf@gcc.gnu.org>
Date: Mon, 20 Jan 2025 10:01:10 +0100
Subject: [PATCH] s390: Vector shift: Add 128-bit integer support

Add 128-bit vector shift support.  Deprecate vector shift by byte
builtins where the shift amount is not of type unsigned character.

gcc/ChangeLog:

	* config/s390/s390-builtins.def: Add 128-bit variants.
	* config/s390/s390-builtin-types.def: Update accordingly.
	* config/s390/vector.md (<vec_shifts_name><mode>3): Add 128-bit
	variants.
	* config/s390/vx-builtins.md: Ditto.

gcc/testsuite/ChangeLog:

	* gcc.target/s390/vector/vec-shift-10.c: New test.
	* gcc.target/s390/vector/vec-shift-11.c: New test.
	* gcc.target/s390/vector/vec-shift-12.c: New test.
	* gcc.target/s390/vector/vec-shift-3.c: New test.
	* gcc.target/s390/vector/vec-shift-4.c: New test.
	* gcc.target/s390/vector/vec-shift-5.c: New test.
	* gcc.target/s390/vector/vec-shift-6.c: New test.
	* gcc.target/s390/vector/vec-shift-7.c: New test.
	* gcc.target/s390/vector/vec-shift-8.c: New test.
	* gcc.target/s390/vector/vec-shift-9.c: New test.
---
 gcc/config/s390/s390-builtin-types.def        |  12 ++
 gcc/config/s390/s390-builtins.def             | 184 ++++++++++++------
 gcc/config/s390/vector.md                     |  47 ++++-
 gcc/config/s390/vx-builtins.md                |  54 +++--
 .../gcc.target/s390/vector/vec-shift-10.c     |  54 +++++
 .../gcc.target/s390/vector/vec-shift-11.c     |  39 ++++
 .../gcc.target/s390/vector/vec-shift-12.c     |  39 ++++
 .../gcc.target/s390/vector/vec-shift-3.c      |  34 ++++
 .../gcc.target/s390/vector/vec-shift-4.c      |  29 +++
 .../gcc.target/s390/vector/vec-shift-5.c      |  34 ++++
 .../gcc.target/s390/vector/vec-shift-6.c      |  29 +++
 .../gcc.target/s390/vector/vec-shift-7.c      |  34 ++++
 .../gcc.target/s390/vector/vec-shift-8.c      |  29 +++
 .../gcc.target/s390/vector/vec-shift-9.c      |  54 +++++
 14 files changed, 570 insertions(+), 102 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/s390/vector/vec-shift-10.c
 create mode 100644 gcc/testsuite/gcc.target/s390/vector/vec-shift-11.c
 create mode 100644 gcc/testsuite/gcc.target/s390/vector/vec-shift-12.c
 create mode 100644 gcc/testsuite/gcc.target/s390/vector/vec-shift-3.c
 create mode 100644 gcc/testsuite/gcc.target/s390/vector/vec-shift-4.c
 create mode 100644 gcc/testsuite/gcc.target/s390/vector/vec-shift-5.c
 create mode 100644 gcc/testsuite/gcc.target/s390/vector/vec-shift-6.c
 create mode 100644 gcc/testsuite/gcc.target/s390/vector/vec-shift-7.c
 create mode 100644 gcc/testsuite/gcc.target/s390/vector/vec-shift-8.c
 create mode 100644 gcc/testsuite/gcc.target/s390/vector/vec-shift-9.c

diff --git a/gcc/config/s390/s390-builtin-types.def b/gcc/config/s390/s390-builtin-types.def
index dc61c04848ea..37783734453f 100644
--- a/gcc/config/s390/s390-builtin-types.def
+++ b/gcc/config/s390/s390-builtin-types.def
@@ -607,12 +607,17 @@ DEF_OV_TYPE (BT_OV_UV1TI_LONG_UINT128CONSTPTR, BT_UV1TI, BT_LONG, BT_UINT128CONS
 DEF_OV_TYPE (BT_OV_UV1TI_UINT128, BT_UV1TI, BT_UINT128)
 DEF_OV_TYPE (BT_OV_UV1TI_UINT128CONSTPTR_USHORT, BT_UV1TI, BT_UINT128CONSTPTR, BT_USHORT)
 DEF_OV_TYPE (BT_OV_UV1TI_UV1TI, BT_UV1TI, BT_UV1TI)
+DEF_OV_TYPE (BT_OV_UV1TI_UV1TI_UV16QI, BT_UV1TI, BT_UV1TI, BT_UV16QI)
 DEF_OV_TYPE (BT_OV_UV1TI_UV1TI_UV1TI, BT_UV1TI, BT_UV1TI, BT_UV1TI)
 DEF_OV_TYPE (BT_OV_UV1TI_UV1TI_UV1TI_BV1TI, BT_UV1TI, BT_UV1TI, BT_UV1TI, BT_BV1TI)
+DEF_OV_TYPE (BT_OV_UV1TI_UV1TI_UV1TI_INT, BT_UV1TI, BT_UV1TI, BT_UV1TI, BT_INT)
+DEF_OV_TYPE (BT_OV_UV1TI_UV1TI_UV1TI_UINT, BT_UV1TI, BT_UV1TI, BT_UV1TI, BT_UINT)
+DEF_OV_TYPE (BT_OV_UV1TI_UV1TI_UV1TI_ULONGLONG, BT_UV1TI, BT_UV1TI, BT_UV1TI, BT_ULONGLONG)
 DEF_OV_TYPE (BT_OV_UV1TI_UV1TI_UV1TI_UV16QI, BT_UV1TI, BT_UV1TI, BT_UV1TI, BT_UV16QI)
 DEF_OV_TYPE (BT_OV_UV1TI_UV1TI_UV1TI_UV1TI, BT_UV1TI, BT_UV1TI, BT_UV1TI, BT_UV1TI)
 DEF_OV_TYPE (BT_OV_UV1TI_UV1TI_UV1TI_UV1TI_INT, BT_UV1TI, BT_UV1TI, BT_UV1TI, BT_UV1TI, BT_INT)
 DEF_OV_TYPE (BT_OV_UV1TI_UV1TI_UV1TI_V1TI, BT_UV1TI, BT_UV1TI, BT_UV1TI, BT_V1TI)
+DEF_OV_TYPE (BT_OV_UV1TI_UV1TI_V1TI, BT_UV1TI, BT_UV1TI, BT_V1TI)
 DEF_OV_TYPE (BT_OV_UV1TI_UV2DI, BT_UV1TI, BT_UV2DI)
 DEF_OV_TYPE (BT_OV_UV1TI_UV2DI_UV2DI, BT_UV1TI, BT_UV2DI, BT_UV2DI)
 DEF_OV_TYPE (BT_OV_UV1TI_UV2DI_UV2DI_UV1TI, BT_UV1TI, BT_UV2DI, BT_UV2DI, BT_UV1TI)
@@ -768,9 +773,14 @@ DEF_OV_TYPE (BT_OV_V1TI_INT128CONSTPTR_USHORT, BT_V1TI, BT_INT128CONSTPTR, BT_US
 DEF_OV_TYPE (BT_OV_V1TI_LONG_INT128CONSTPTR, BT_V1TI, BT_LONG, BT_INT128CONSTPTR)
 DEF_OV_TYPE (BT_OV_V1TI_UV1TI_V1TI_V1TI, BT_V1TI, BT_UV1TI, BT_V1TI, BT_V1TI)
 DEF_OV_TYPE (BT_OV_V1TI_V1TI, BT_V1TI, BT_V1TI)
+DEF_OV_TYPE (BT_OV_V1TI_V1TI_UV16QI, BT_V1TI, BT_V1TI, BT_UV16QI)
+DEF_OV_TYPE (BT_OV_V1TI_V1TI_UV1TI, BT_V1TI, BT_V1TI, BT_UV1TI)
 DEF_OV_TYPE (BT_OV_V1TI_V1TI_UV1TI_UV1TI, BT_V1TI, BT_V1TI, BT_UV1TI, BT_UV1TI)
 DEF_OV_TYPE (BT_OV_V1TI_V1TI_V1TI, BT_V1TI, BT_V1TI, BT_V1TI)
 DEF_OV_TYPE (BT_OV_V1TI_V1TI_V1TI_BV1TI, BT_V1TI, BT_V1TI, BT_V1TI, BT_BV1TI)
+DEF_OV_TYPE (BT_OV_V1TI_V1TI_V1TI_INT, BT_V1TI, BT_V1TI, BT_V1TI, BT_INT)
+DEF_OV_TYPE (BT_OV_V1TI_V1TI_V1TI_UINT, BT_V1TI, BT_V1TI, BT_V1TI, BT_UINT)
+DEF_OV_TYPE (BT_OV_V1TI_V1TI_V1TI_ULONGLONG, BT_V1TI, BT_V1TI, BT_V1TI, BT_ULONGLONG)
 DEF_OV_TYPE (BT_OV_V1TI_V1TI_V1TI_UV16QI, BT_V1TI, BT_V1TI, BT_V1TI, BT_UV16QI)
 DEF_OV_TYPE (BT_OV_V1TI_V1TI_V1TI_UV1TI, BT_V1TI, BT_V1TI, BT_V1TI, BT_UV1TI)
 DEF_OV_TYPE (BT_OV_V1TI_V1TI_V1TI_V1TI, BT_V1TI, BT_V1TI, BT_V1TI, BT_V1TI)
@@ -792,6 +802,7 @@ DEF_OV_TYPE (BT_OV_V2DF_V2DF, BT_V2DF, BT_V2DF)
 DEF_OV_TYPE (BT_OV_V2DF_V2DF_BV2DI, BT_V2DF, BT_V2DF, BT_BV2DI)
 DEF_OV_TYPE (BT_OV_V2DF_V2DF_UCHAR, BT_V2DF, BT_V2DF, BT_UCHAR)
 DEF_OV_TYPE (BT_OV_V2DF_V2DF_UCHAR_UCHAR, BT_V2DF, BT_V2DF, BT_UCHAR, BT_UCHAR)
+DEF_OV_TYPE (BT_OV_V2DF_V2DF_UV16QI, BT_V2DF, BT_V2DF, BT_UV16QI)
 DEF_OV_TYPE (BT_OV_V2DF_V2DF_UV2DI, BT_V2DF, BT_V2DF, BT_UV2DI)
 DEF_OV_TYPE (BT_OV_V2DF_V2DF_UV2DI_DBLCONSTPTR_UCHAR, BT_V2DF, BT_V2DF, BT_UV2DI, BT_DBLCONSTPTR, BT_UCHAR)
 DEF_OV_TYPE (BT_OV_V2DF_V2DF_V2DF, BT_V2DF, BT_V2DF, BT_V2DF)
@@ -856,6 +867,7 @@ DEF_OV_TYPE (BT_OV_V4SF_V4SF, BT_V4SF, BT_V4SF)
 DEF_OV_TYPE (BT_OV_V4SF_V4SF_BV4SI, BT_V4SF, BT_V4SF, BT_BV4SI)
 DEF_OV_TYPE (BT_OV_V4SF_V4SF_UCHAR, BT_V4SF, BT_V4SF, BT_UCHAR)
 DEF_OV_TYPE (BT_OV_V4SF_V4SF_UCHAR_UCHAR, BT_V4SF, BT_V4SF, BT_UCHAR, BT_UCHAR)
+DEF_OV_TYPE (BT_OV_V4SF_V4SF_UV16QI, BT_V4SF, BT_V4SF, BT_UV16QI)
 DEF_OV_TYPE (BT_OV_V4SF_V4SF_UV4SI, BT_V4SF, BT_V4SF, BT_UV4SI)
 DEF_OV_TYPE (BT_OV_V4SF_V4SF_UV4SI_FLTCONSTPTR_UCHAR, BT_V4SF, BT_V4SF, BT_UV4SI, BT_FLTCONSTPTR, BT_UCHAR)
 DEF_OV_TYPE (BT_OV_V4SF_V4SF_V4SF, BT_V4SF, BT_V4SF, BT_V4SF)
diff --git a/gcc/config/s390/s390-builtins.def b/gcc/config/s390/s390-builtins.def
index b1c3938abe5c..24941ed03515 100644
--- a/gcc/config/s390/s390-builtins.def
+++ b/gcc/config/s390/s390-builtins.def
@@ -2214,7 +2214,7 @@ B_DEF      (s390_verimh,                verimv8hi,          0,
 B_DEF      (s390_verimf,                verimv4si,          0,                  B_VX,               O4_U8,              BT_FN_UV4SI_UV4SI_UV4SI_UV4SI_INT)
 B_DEF      (s390_verimg,                verimv2di,          0,                  B_VX,               O4_U8,              BT_FN_UV2DI_UV2DI_UV2DI_UV2DI_INT)
 
-OB_DEF     (s390_vec_sll,               s390_vec_sll_u8q,   s390_vec_sll_b64s,  B_VX,               BT_FN_OV4SI_OV4SI_OV4SI)
+OB_DEF     (s390_vec_sll,               s390_vec_sll_u8q,   s390_vec_sll_s128,  B_VX,               BT_FN_OV4SI_OV4SI_OV4SI)
 OB_DEF_VAR (s390_vec_sll_u8q,           s390_vsl,           0,                  0,                  BT_OV_UV16QI_UV16QI_UV16QI)
 OB_DEF_VAR (s390_vec_sll_u8h,           s390_vsl,           B_DEP,              0,                  BT_OV_UV16QI_UV16QI_UV8HI)
 OB_DEF_VAR (s390_vec_sll_u8s,           s390_vsl,           B_DEP,              0,                  BT_OV_UV16QI_UV16QI_UV4SI)
@@ -2251,46 +2251,64 @@ OB_DEF_VAR (s390_vec_sll_s64s,          s390_vsl,           B_DEP,
 OB_DEF_VAR (s390_vec_sll_b64q,          s390_vsl,           B_DEP,              0,                  BT_OV_BV2DI_BV2DI_UV16QI)
 OB_DEF_VAR (s390_vec_sll_b64h,          s390_vsl,           B_DEP,              0,                  BT_OV_BV2DI_BV2DI_UV8HI)
 OB_DEF_VAR (s390_vec_sll_b64s,          s390_vsl,           B_DEP,              0,                  BT_OV_BV2DI_BV2DI_UV4SI)
+OB_DEF_VAR (s390_vec_sll_u128,          s390_vsl,           0,                  0,                  BT_OV_UV1TI_UV1TI_UV16QI)
+OB_DEF_VAR (s390_vec_sll_s128,          s390_vsl,           0,                  0,                  BT_OV_V1TI_V1TI_UV16QI)
 
 B_DEF      (s390_vsl,                   vec_sllv16qiv16qi,  0,                  B_VX,               0,                  BT_FN_UV16QI_UV16QI_UV16QI)
 
-OB_DEF     (s390_vec_slb,               s390_vec_slb_u8_u8, s390_vec_slb_dbl_s64,B_VX,              BT_FN_OV4SI_OV4SI_OV4SI)
+OB_DEF     (s390_vec_slb,               s390_vec_slb_u8_s8, s390_vec_slb_dbl_u8,B_VX,               BT_FN_OV4SI_OV4SI_OV4SI)
+OB_DEF_VAR (s390_vec_slb_u8_s8,         s390_vslb,          B_DEP,              0,                  BT_OV_UV16QI_UV16QI_V16QI)
+OB_DEF_VAR (s390_vec_slb_s8_s8,         s390_vslb,          B_DEP,              0,                  BT_OV_V16QI_V16QI_V16QI)
+OB_DEF_VAR (s390_vec_slb_u16_u16,       s390_vslb,          B_DEP,              0,                  BT_OV_UV8HI_UV8HI_UV8HI)
+OB_DEF_VAR (s390_vec_slb_u16_s16,       s390_vslb,          B_DEP,              0,                  BT_OV_UV8HI_UV8HI_V8HI)
+OB_DEF_VAR (s390_vec_slb_s16_u16,       s390_vslb,          B_DEP,              0,                  BT_OV_V8HI_V8HI_UV8HI)
+OB_DEF_VAR (s390_vec_slb_s16_s16,       s390_vslb,          B_DEP,              0,                  BT_OV_V8HI_V8HI_V8HI)
+OB_DEF_VAR (s390_vec_slb_u32_u32,       s390_vslb,          B_DEP,              0,                  BT_OV_UV4SI_UV4SI_UV4SI)
+OB_DEF_VAR (s390_vec_slb_u32_s32,       s390_vslb,          B_DEP,              0,                  BT_OV_UV4SI_UV4SI_V4SI)
+OB_DEF_VAR (s390_vec_slb_s32_u32,       s390_vslb,          B_DEP,              0,                  BT_OV_V4SI_V4SI_UV4SI)
+OB_DEF_VAR (s390_vec_slb_s32_s32,       s390_vslb,          B_DEP,              0,                  BT_OV_V4SI_V4SI_V4SI)
+OB_DEF_VAR (s390_vec_slb_u64_u64,       s390_vslb,          B_DEP,              0,                  BT_OV_UV2DI_UV2DI_UV2DI)
+OB_DEF_VAR (s390_vec_slb_u64_s64,       s390_vslb,          B_DEP,              0,                  BT_OV_UV2DI_UV2DI_V2DI)
+OB_DEF_VAR (s390_vec_slb_s64_u64,       s390_vslb,          B_DEP,              0,                  BT_OV_V2DI_V2DI_UV2DI)
+OB_DEF_VAR (s390_vec_slb_s64_s64,       s390_vslb,          B_DEP,              0,                  BT_OV_V2DI_V2DI_V2DI)
+OB_DEF_VAR (s390_vec_slb_u128_u128,     s390_vslb,          B_DEP,              0,                  BT_OV_UV1TI_UV1TI_UV1TI)
+OB_DEF_VAR (s390_vec_slb_u128_s128,     s390_vslb,          B_DEP,              0,                  BT_OV_UV1TI_UV1TI_V1TI)
+OB_DEF_VAR (s390_vec_slb_s128_u128,     s390_vslb,          B_DEP,              0,                  BT_OV_V1TI_V1TI_UV1TI)
+OB_DEF_VAR (s390_vec_slb_s128_s128,     s390_vslb,          B_DEP,              0,                  BT_OV_V1TI_V1TI_V1TI)
+OB_DEF_VAR (s390_vec_slb_flt_u64,       s390_vslb,          B_DEP | B_VXE,      0,                  BT_OV_V4SF_V4SF_UV4SI)
+OB_DEF_VAR (s390_vec_slb_dbl_u64,       s390_vslb,          B_DEP,              0,                  BT_OV_V2DF_V2DF_UV2DI)
+OB_DEF_VAR (s390_vec_slb_flt_s64,       s390_vslb,          B_DEP | B_VXE,      0,                  BT_OV_V4SF_V4SF_V4SI)
+OB_DEF_VAR (s390_vec_slb_dbl_s64,       s390_vslb,          B_DEP,              0,                  BT_OV_V2DF_V2DF_V2DI)
 OB_DEF_VAR (s390_vec_slb_u8_u8,         s390_vslb,          0,                  0,                  BT_OV_UV16QI_UV16QI_UV16QI)
-OB_DEF_VAR (s390_vec_slb_u8_s8,         s390_vslb,          0,                  0,                  BT_OV_UV16QI_UV16QI_V16QI)
 OB_DEF_VAR (s390_vec_slb_s8_u8,         s390_vslb,          0,                  0,                  BT_OV_V16QI_V16QI_UV16QI)
-OB_DEF_VAR (s390_vec_slb_s8_s8,         s390_vslb,          0,                  0,                  BT_OV_V16QI_V16QI_V16QI)
-OB_DEF_VAR (s390_vec_slb_u16_u16,       s390_vslb,          0,                  0,                  BT_OV_UV8HI_UV8HI_UV8HI)
-OB_DEF_VAR (s390_vec_slb_u16_s16,       s390_vslb,          0,                  0,                  BT_OV_UV8HI_UV8HI_V8HI)
-OB_DEF_VAR (s390_vec_slb_s16_u16,       s390_vslb,          0,                  0,                  BT_OV_V8HI_V8HI_UV8HI)
-OB_DEF_VAR (s390_vec_slb_s16_s16,       s390_vslb,          0,                  0,                  BT_OV_V8HI_V8HI_V8HI)
-OB_DEF_VAR (s390_vec_slb_u32_u32,       s390_vslb,          0,                  0,                  BT_OV_UV4SI_UV4SI_UV4SI)
-OB_DEF_VAR (s390_vec_slb_u32_s32,       s390_vslb,          0,                  0,                  BT_OV_UV4SI_UV4SI_V4SI)
-OB_DEF_VAR (s390_vec_slb_s32_u32,       s390_vslb,          0,                  0,                  BT_OV_V4SI_V4SI_UV4SI)
-OB_DEF_VAR (s390_vec_slb_s32_s32,       s390_vslb,          0,                  0,                  BT_OV_V4SI_V4SI_V4SI)
-OB_DEF_VAR (s390_vec_slb_u64_u64,       s390_vslb,          0,                  0,                  BT_OV_UV2DI_UV2DI_UV2DI)
-OB_DEF_VAR (s390_vec_slb_u64_s64,       s390_vslb,          0,                  0,                  BT_OV_UV2DI_UV2DI_V2DI)
-OB_DEF_VAR (s390_vec_slb_s64_u64,       s390_vslb,          0,                  0,                  BT_OV_V2DI_V2DI_UV2DI)
-OB_DEF_VAR (s390_vec_slb_s64_s64,       s390_vslb,          0,                  0,                  BT_OV_V2DI_V2DI_V2DI)
-OB_DEF_VAR (s390_vec_slb_flt_u64,       s390_vslb,          B_VXE,              0,                  BT_OV_V4SF_V4SF_UV4SI)
-OB_DEF_VAR (s390_vec_slb_dbl_u64,       s390_vslb,          0,                  0,                  BT_OV_V2DF_V2DF_UV2DI)
-OB_DEF_VAR (s390_vec_slb_flt_s64,       s390_vslb,          B_VXE,              0,                  BT_OV_V4SF_V4SF_V4SI)
-OB_DEF_VAR (s390_vec_slb_dbl_s64,       s390_vslb,          0,                  0,                  BT_OV_V2DF_V2DF_V2DI)
+OB_DEF_VAR (s390_vec_slb_u16_u8,        s390_vslb,          0,                  0,                  BT_OV_UV8HI_UV8HI_UV16QI)
+OB_DEF_VAR (s390_vec_slb_s16_u8,        s390_vslb,          0,                  0,                  BT_OV_V8HI_V8HI_UV16QI)
+OB_DEF_VAR (s390_vec_slb_u32_u8,        s390_vslb,          0,                  0,                  BT_OV_UV4SI_UV4SI_UV16QI)
+OB_DEF_VAR (s390_vec_slb_s32_u8,        s390_vslb,          0,                  0,                  BT_OV_V4SI_V4SI_UV16QI)
+OB_DEF_VAR (s390_vec_slb_u64_u8,        s390_vslb,          0,                  0,                  BT_OV_UV2DI_UV2DI_UV16QI)
+OB_DEF_VAR (s390_vec_slb_s64_u8,        s390_vslb,          0,                  0,                  BT_OV_V2DI_V2DI_UV16QI)
+OB_DEF_VAR (s390_vec_slb_u128_u8,       s390_vslb,          0,                  0,                  BT_OV_UV1TI_UV1TI_UV16QI)
+OB_DEF_VAR (s390_vec_slb_s128_u8,       s390_vslb,          0,                  0,                  BT_OV_V1TI_V1TI_UV16QI)
+OB_DEF_VAR (s390_vec_slb_flt_u8,        s390_vslb,          B_VXE,              0,                  BT_OV_V4SF_V4SF_UV16QI)
+OB_DEF_VAR (s390_vec_slb_dbl_u8,        s390_vslb,          0,                  0,                  BT_OV_V2DF_V2DF_UV16QI)
 
 B_DEF      (s390_vslb,                  vec_slbv16qi,       0,                  B_VX,               0,                  BT_FN_UV16QI_UV16QI_UV16QI)
 
 OB_DEF     (s390_vec_sld,               s390_vec_sld_b8,    s390_vec_sld_dbl,   B_VX,               BT_FN_OV4SI_OV4SI_OV4SI_ULONGLONG)
-OB_DEF_VAR (s390_vec_sld_b8,            s390_vsldb,         0,                  O3_U4,              BT_OV_BV16QI_BV16QI_BV16QI_ULONGLONG)
+OB_DEF_VAR (s390_vec_sld_b8,            s390_vsldb,         B_DEP,              O3_U4,              BT_OV_BV16QI_BV16QI_BV16QI_ULONGLONG)
 OB_DEF_VAR (s390_vec_sld_s8,            s390_vsldb,         0,                  O3_U4,              BT_OV_V16QI_V16QI_V16QI_ULONGLONG)
 OB_DEF_VAR (s390_vec_sld_u8,            s390_vsldb,         0,                  O3_U4,              BT_OV_UV16QI_UV16QI_UV16QI_ULONGLONG)
-OB_DEF_VAR (s390_vec_sld_b16,           s390_vsldb,         0,                  O3_U4,              BT_OV_BV8HI_BV8HI_BV8HI_ULONGLONG)
+OB_DEF_VAR (s390_vec_sld_b16,           s390_vsldb,         B_DEP,              O3_U4,              BT_OV_BV8HI_BV8HI_BV8HI_ULONGLONG)
 OB_DEF_VAR (s390_vec_sld_s16,           s390_vsldb,         0,                  O3_U4,              BT_OV_V8HI_V8HI_V8HI_ULONGLONG)
 OB_DEF_VAR (s390_vec_sld_u16,           s390_vsldb,         0,                  O3_U4,              BT_OV_UV8HI_UV8HI_UV8HI_ULONGLONG)
-OB_DEF_VAR (s390_vec_sld_b32,           s390_vsldb,         0,                  O3_U4,              BT_OV_BV4SI_BV4SI_BV4SI_ULONGLONG)
+OB_DEF_VAR (s390_vec_sld_b32,           s390_vsldb,         B_DEP,              O3_U4,              BT_OV_BV4SI_BV4SI_BV4SI_ULONGLONG)
 OB_DEF_VAR (s390_vec_sld_s32,           s390_vsldb,         0,                  O3_U4,              BT_OV_V4SI_V4SI_V4SI_ULONGLONG)
 OB_DEF_VAR (s390_vec_sld_u32,           s390_vsldb,         0,                  O3_U4,              BT_OV_UV4SI_UV4SI_UV4SI_ULONGLONG)
-OB_DEF_VAR (s390_vec_sld_b64,           s390_vsldb,         0,                  O3_U4,              BT_OV_BV2DI_BV2DI_BV2DI_ULONGLONG)
+OB_DEF_VAR (s390_vec_sld_b64,           s390_vsldb,         B_DEP,              O3_U4,              BT_OV_BV2DI_BV2DI_BV2DI_ULONGLONG)
 OB_DEF_VAR (s390_vec_sld_s64,           s390_vsldb,         0,                  O3_U4,              BT_OV_V2DI_V2DI_V2DI_ULONGLONG)
 OB_DEF_VAR (s390_vec_sld_u64,           s390_vsldb,         0,                  O3_U4,              BT_OV_UV2DI_UV2DI_UV2DI_ULONGLONG)
+OB_DEF_VAR (s390_vec_sld_s128,          s390_vsldb,         0,                  O3_U4,              BT_OV_V1TI_V1TI_V1TI_ULONGLONG)
+OB_DEF_VAR (s390_vec_sld_u128,          s390_vsldb,         0,                  O3_U4,              BT_OV_UV1TI_UV1TI_UV1TI_ULONGLONG)
 OB_DEF_VAR (s390_vec_sld_flt,           s390_vsldb,         B_VXE,              O3_U4,              BT_OV_V4SF_V4SF_V4SF_ULONGLONG)
 OB_DEF_VAR (s390_vec_sld_dbl,           s390_vsldb,         0,                  O3_U4,              BT_OV_V2DF_V2DF_V2DF_ULONGLONG)
 
@@ -2305,11 +2323,13 @@ OB_DEF_VAR (s390_vec_sldw_s32,          s390_vsldw,         0,
 OB_DEF_VAR (s390_vec_sldw_u32,          s390_vsldw,         0,                  O3_U4,              BT_OV_UV4SI_UV4SI_UV4SI_INT)
 OB_DEF_VAR (s390_vec_sldw_s64,          s390_vsldw,         0,                  O3_U4,              BT_OV_V2DI_V2DI_V2DI_INT)
 OB_DEF_VAR (s390_vec_sldw_u64,          s390_vsldw,         0,                  O3_U4,              BT_OV_UV2DI_UV2DI_UV2DI_INT)
+OB_DEF_VAR (s390_vec_sldw_s128,         s390_vsldw,         0,                  O3_U4,              BT_OV_V1TI_V1TI_V1TI_INT)
+OB_DEF_VAR (s390_vec_sldw_u128,         s390_vsldw,         0,                  O3_U4,              BT_OV_UV1TI_UV1TI_UV1TI_INT)
 OB_DEF_VAR (s390_vec_sldw_dbl,          s390_vsldw,         B_DEP,              O3_U4,              BT_OV_V2DF_V2DF_V2DF_INT)
 
 B_DEF      (s390_vsldw,                 vec_sldwv16qi,      0,                  B_VX,               O3_U4,              BT_FN_UV16QI_UV16QI_UV16QI_INT)
 
-OB_DEF     (s390_vec_sral,              s390_vec_sral_u8q,  s390_vec_sral_b64s, B_VX,               BT_FN_OV4SI_OV4SI_OV4SI)
+OB_DEF     (s390_vec_sral,              s390_vec_sral_u8q,  s390_vec_sral_s128, B_VX,               BT_FN_OV4SI_OV4SI_OV4SI)
 OB_DEF_VAR (s390_vec_sral_u8q,          s390_vsra,          0,                  0,                  BT_OV_UV16QI_UV16QI_UV16QI)
 OB_DEF_VAR (s390_vec_sral_u8h,          s390_vsra,          B_DEP,              0,                  BT_OV_UV16QI_UV16QI_UV8HI)
 OB_DEF_VAR (s390_vec_sral_u8s,          s390_vsra,          B_DEP,              0,                  BT_OV_UV16QI_UV16QI_UV4SI)
@@ -2346,34 +2366,50 @@ OB_DEF_VAR (s390_vec_sral_s64s,         s390_vsra,          B_DEP,
 OB_DEF_VAR (s390_vec_sral_b64q,         s390_vsra,          B_DEP,              0,                  BT_OV_BV2DI_BV2DI_UV16QI)
 OB_DEF_VAR (s390_vec_sral_b64h,         s390_vsra,          B_DEP,              0,                  BT_OV_BV2DI_BV2DI_UV8HI)
 OB_DEF_VAR (s390_vec_sral_b64s,         s390_vsra,          B_DEP,              0,                  BT_OV_BV2DI_BV2DI_UV4SI)
+OB_DEF_VAR (s390_vec_sral_u128,         s390_vsra,          0,                  0,                  BT_OV_UV1TI_UV1TI_UV16QI)
+OB_DEF_VAR (s390_vec_sral_s128,         s390_vsra,          0,                  0,                  BT_OV_V1TI_V1TI_UV16QI)
 
 B_DEF      (s390_vsra,                  vec_sralv16qiv16qi, 0,                  B_VX,               0,                  BT_FN_UV16QI_UV16QI_UV16QI)
 
-OB_DEF     (s390_vec_srab,              s390_vec_srab_u8_u8,s390_vec_srab_dbl_s64,B_VX,             BT_FN_OV4SI_OV4SI_OV4SI)
+OB_DEF     (s390_vec_srab,              s390_vec_srab_u8_s8,s390_vec_srab_dbl_u8,B_VX,              BT_FN_OV4SI_OV4SI_OV4SI)
+OB_DEF_VAR (s390_vec_srab_u8_s8,        s390_vsrab,         B_DEP,              0,                  BT_OV_UV16QI_UV16QI_V16QI)
+OB_DEF_VAR (s390_vec_srab_s8_s8,        s390_vsrab,         B_DEP,              0,                  BT_OV_V16QI_V16QI_V16QI)
+OB_DEF_VAR (s390_vec_srab_u16_u16,      s390_vsrab,         B_DEP,              0,                  BT_OV_UV8HI_UV8HI_UV8HI)
+OB_DEF_VAR (s390_vec_srab_u16_s16,      s390_vsrab,         B_DEP,              0,                  BT_OV_UV8HI_UV8HI_V8HI)
+OB_DEF_VAR (s390_vec_srab_s16_u16,      s390_vsrab,         B_DEP,              0,                  BT_OV_V8HI_V8HI_UV8HI)
+OB_DEF_VAR (s390_vec_srab_s16_s16,      s390_vsrab,         B_DEP,              0,                  BT_OV_V8HI_V8HI_V8HI)
+OB_DEF_VAR (s390_vec_srab_u32_u32,      s390_vsrab,         B_DEP,              0,                  BT_OV_UV4SI_UV4SI_UV4SI)
+OB_DEF_VAR (s390_vec_srab_u32_s32,      s390_vsrab,         B_DEP,              0,                  BT_OV_UV4SI_UV4SI_V4SI)
+OB_DEF_VAR (s390_vec_srab_s32_u32,      s390_vsrab,         B_DEP,              0,                  BT_OV_V4SI_V4SI_UV4SI)
+OB_DEF_VAR (s390_vec_srab_s32_s32,      s390_vsrab,         B_DEP,              0,                  BT_OV_V4SI_V4SI_V4SI)
+OB_DEF_VAR (s390_vec_srab_u64_u64,      s390_vsrab,         B_DEP,              0,                  BT_OV_UV2DI_UV2DI_UV2DI)
+OB_DEF_VAR (s390_vec_srab_u64_s64,      s390_vsrab,         B_DEP,              0,                  BT_OV_UV2DI_UV2DI_V2DI)
+OB_DEF_VAR (s390_vec_srab_s64_u64,      s390_vsrab,         B_DEP,              0,                  BT_OV_V2DI_V2DI_UV2DI)
+OB_DEF_VAR (s390_vec_srab_s64_s64,      s390_vsrab,         B_DEP,              0,                  BT_OV_V2DI_V2DI_V2DI)
+OB_DEF_VAR (s390_vec_srab_u128_u128,    s390_vsrab,         B_DEP,              0,                  BT_OV_UV1TI_UV1TI_UV1TI)
+OB_DEF_VAR (s390_vec_srab_u128_s128,    s390_vsrab,         B_DEP,              0,                  BT_OV_UV1TI_UV1TI_V1TI)
+OB_DEF_VAR (s390_vec_srab_s128_u128,    s390_vsrab,         B_DEP,              0,                  BT_OV_V1TI_V1TI_UV1TI)
+OB_DEF_VAR (s390_vec_srab_s128_s128,    s390_vsrab,         B_DEP,              0,                  BT_OV_V1TI_V1TI_V1TI)
+OB_DEF_VAR (s390_vec_srab_flt_u64,      s390_vsrab,         B_DEP | B_VXE,      0,                  BT_OV_V4SF_V4SF_UV4SI)
+OB_DEF_VAR (s390_vec_srab_dbl_u64,      s390_vsrab,         B_DEP,              0,                  BT_OV_V2DF_V2DF_UV2DI)
+OB_DEF_VAR (s390_vec_srab_flt_s64,      s390_vsrab,         B_DEP | B_VXE,      0,                  BT_OV_V4SF_V4SF_V4SI)
+OB_DEF_VAR (s390_vec_srab_dbl_s64,      s390_vsrab,         B_DEP,              0,                  BT_OV_V2DF_V2DF_V2DI)
 OB_DEF_VAR (s390_vec_srab_u8_u8,        s390_vsrab,         0,                  0,                  BT_OV_UV16QI_UV16QI_UV16QI)
-OB_DEF_VAR (s390_vec_srab_u8_s8,        s390_vsrab,         0,                  0,                  BT_OV_UV16QI_UV16QI_V16QI)
 OB_DEF_VAR (s390_vec_srab_s8_u8,        s390_vsrab,         0,                  0,                  BT_OV_V16QI_V16QI_UV16QI)
-OB_DEF_VAR (s390_vec_srab_s8_s8,        s390_vsrab,         0,                  0,                  BT_OV_V16QI_V16QI_V16QI)
-OB_DEF_VAR (s390_vec_srab_u16_u16,      s390_vsrab,         0,                  0,                  BT_OV_UV8HI_UV8HI_UV8HI)
-OB_DEF_VAR (s390_vec_srab_u16_s16,      s390_vsrab,         0,                  0,                  BT_OV_UV8HI_UV8HI_V8HI)
-OB_DEF_VAR (s390_vec_srab_s16_u16,      s390_vsrab,         0,                  0,                  BT_OV_V8HI_V8HI_UV8HI)
-OB_DEF_VAR (s390_vec_srab_s16_s16,      s390_vsrab,         0,                  0,                  BT_OV_V8HI_V8HI_V8HI)
-OB_DEF_VAR (s390_vec_srab_u32_u32,      s390_vsrab,         0,                  0,                  BT_OV_UV4SI_UV4SI_UV4SI)
-OB_DEF_VAR (s390_vec_srab_u32_s32,      s390_vsrab,         0,                  0,                  BT_OV_UV4SI_UV4SI_V4SI)
-OB_DEF_VAR (s390_vec_srab_s32_u32,      s390_vsrab,         0,                  0,                  BT_OV_V4SI_V4SI_UV4SI)
-OB_DEF_VAR (s390_vec_srab_s32_s32,      s390_vsrab,         0,                  0,                  BT_OV_V4SI_V4SI_V4SI)
-OB_DEF_VAR (s390_vec_srab_u64_u64,      s390_vsrab,         0,                  0,                  BT_OV_UV2DI_UV2DI_UV2DI)
-OB_DEF_VAR (s390_vec_srab_u64_s64,      s390_vsrab,         0,                  0,                  BT_OV_UV2DI_UV2DI_V2DI)
-OB_DEF_VAR (s390_vec_srab_s64_u64,      s390_vsrab,         0,                  0,                  BT_OV_V2DI_V2DI_UV2DI)
-OB_DEF_VAR (s390_vec_srab_s64_s64,      s390_vsrab,         0,                  0,                  BT_OV_V2DI_V2DI_V2DI)
-OB_DEF_VAR (s390_vec_srab_flt_u64,      s390_vsrab,         B_VXE,              0,                  BT_OV_V4SF_V4SF_UV4SI)
-OB_DEF_VAR (s390_vec_srab_dbl_u64,      s390_vsrab,         0,                  0,                  BT_OV_V2DF_V2DF_UV2DI)
-OB_DEF_VAR (s390_vec_srab_flt_s64,      s390_vsrab,         B_VXE,              0,                  BT_OV_V4SF_V4SF_V4SI)
-OB_DEF_VAR (s390_vec_srab_dbl_s64,      s390_vsrab,         0,                  0,                  BT_OV_V2DF_V2DF_V2DI)
+OB_DEF_VAR (s390_vec_srab_u16_u8,       s390_vsrab,         0,                  0,                  BT_OV_UV8HI_UV8HI_UV16QI)
+OB_DEF_VAR (s390_vec_srab_s16_u8,       s390_vsrab,         0,                  0,                  BT_OV_V8HI_V8HI_UV16QI)
+OB_DEF_VAR (s390_vec_srab_u32_u8,       s390_vsrab,         0,                  0,                  BT_OV_UV4SI_UV4SI_UV16QI)
+OB_DEF_VAR (s390_vec_srab_s32_u8,       s390_vsrab,         0,                  0,                  BT_OV_V4SI_V4SI_UV16QI)
+OB_DEF_VAR (s390_vec_srab_u64_u8,       s390_vsrab,         0,                  0,                  BT_OV_UV2DI_UV2DI_UV16QI)
+OB_DEF_VAR (s390_vec_srab_s64_u8,       s390_vsrab,         0,                  0,                  BT_OV_V2DI_V2DI_UV16QI)
+OB_DEF_VAR (s390_vec_srab_u128_u8,      s390_vsrab,         0,                  0,                  BT_OV_UV1TI_UV1TI_UV16QI)
+OB_DEF_VAR (s390_vec_srab_s128_u8,      s390_vsrab,         0,                  0,                  BT_OV_V1TI_V1TI_UV16QI)
+OB_DEF_VAR (s390_vec_srab_flt_u8,       s390_vsrab,         B_VXE,              0,                  BT_OV_V4SF_V4SF_UV16QI)
+OB_DEF_VAR (s390_vec_srab_dbl_u8,       s390_vsrab,         0,                  0,                  BT_OV_V2DF_V2DF_UV16QI)
 
 B_DEF      (s390_vsrab,                 vec_srabv16qi,      0,                  B_VX,               0,                  BT_FN_UV16QI_UV16QI_UV16QI)
 
-OB_DEF     (s390_vec_srl,               s390_vec_srl_u8q,   s390_vec_srl_b64s,  B_VX,               BT_FN_OV4SI_OV4SI_OV4SI)
+OB_DEF     (s390_vec_srl,               s390_vec_srl_u8q,   s390_vec_srl_s128,  B_VX,               BT_FN_OV4SI_OV4SI_OV4SI)
 OB_DEF_VAR (s390_vec_srl_u8q,           s390_vsrl,          0,                  0,                  BT_OV_UV16QI_UV16QI_UV16QI)
 OB_DEF_VAR (s390_vec_srl_u8h,           s390_vsrl,          B_DEP,              0,                  BT_OV_UV16QI_UV16QI_UV8HI)
 OB_DEF_VAR (s390_vec_srl_u8s,           s390_vsrl,          B_DEP,              0,                  BT_OV_UV16QI_UV16QI_UV4SI)
@@ -2410,30 +2446,46 @@ OB_DEF_VAR (s390_vec_srl_s64s,          s390_vsrl,          B_DEP,
 OB_DEF_VAR (s390_vec_srl_b64q,          s390_vsrl,          B_DEP,              0,                  BT_OV_BV2DI_BV2DI_UV16QI)
 OB_DEF_VAR (s390_vec_srl_b64h,          s390_vsrl,          B_DEP,              0,                  BT_OV_BV2DI_BV2DI_UV8HI)
 OB_DEF_VAR (s390_vec_srl_b64s,          s390_vsrl,          B_DEP,              0,                  BT_OV_BV2DI_BV2DI_UV4SI)
+OB_DEF_VAR (s390_vec_srl_u128,          s390_vsrl,          0,                  0,                  BT_OV_UV1TI_UV1TI_UV16QI)
+OB_DEF_VAR (s390_vec_srl_s128,          s390_vsrl,          0,                  0,                  BT_OV_V1TI_V1TI_UV16QI)
 
 B_DEF      (s390_vsrl,                  vec_srlv16qiv16qi,  0,                  B_VX,               0,                  BT_FN_UV16QI_UV16QI_UV16QI)
 
-OB_DEF     (s390_vec_srb,               s390_vec_srb_u8_u8, s390_vec_srb_dbl_s64,B_VX,              BT_FN_OV4SI_OV4SI_OV4SI)
+OB_DEF     (s390_vec_srb,               s390_vec_srb_u8_s8, s390_vec_srb_dbl_u8,B_VX,               BT_FN_OV4SI_OV4SI_OV4SI)
+OB_DEF_VAR (s390_vec_srb_u8_s8,         s390_vsrlb,         B_DEP,              0,                  BT_OV_UV16QI_UV16QI_V16QI)
+OB_DEF_VAR (s390_vec_srb_s8_s8,         s390_vsrlb,         B_DEP,              0,                  BT_OV_V16QI_V16QI_V16QI)
+OB_DEF_VAR (s390_vec_srb_u16_u16,       s390_vsrlb,         B_DEP,              0,                  BT_OV_UV8HI_UV8HI_UV8HI)
+OB_DEF_VAR (s390_vec_srb_u16_s16,       s390_vsrlb,         B_DEP,              0,                  BT_OV_UV8HI_UV8HI_V8HI)
+OB_DEF_VAR (s390_vec_srb_s16_u16,       s390_vsrlb,         B_DEP,              0,                  BT_OV_V8HI_V8HI_UV8HI)
+OB_DEF_VAR (s390_vec_srb_s16_s16,       s390_vsrlb,         B_DEP,              0,                  BT_OV_V8HI_V8HI_V8HI)
+OB_DEF_VAR (s390_vec_srb_u32_u32,       s390_vsrlb,         B_DEP,              0,                  BT_OV_UV4SI_UV4SI_UV4SI)
+OB_DEF_VAR (s390_vec_srb_u32_s32,       s390_vsrlb,         B_DEP,              0,                  BT_OV_UV4SI_UV4SI_V4SI)
+OB_DEF_VAR (s390_vec_srb_s32_u32,       s390_vsrlb,         B_DEP,              0,                  BT_OV_V4SI_V4SI_UV4SI)
+OB_DEF_VAR (s390_vec_srb_s32_s32,       s390_vsrlb,         B_DEP,              0,                  BT_OV_V4SI_V4SI_V4SI)
+OB_DEF_VAR (s390_vec_srb_u64_u64,       s390_vsrlb,         B_DEP,              0,                  BT_OV_UV2DI_UV2DI_UV2DI)
+OB_DEF_VAR (s390_vec_srb_u64_s64,       s390_vsrlb,         B_DEP,              0,                  BT_OV_UV2DI_UV2DI_V2DI)
+OB_DEF_VAR (s390_vec_srb_s64_u64,       s390_vsrlb,         B_DEP,              0,                  BT_OV_V2DI_V2DI_UV2DI)
+OB_DEF_VAR (s390_vec_srb_s64_s64,       s390_vsrlb,         B_DEP,              0,                  BT_OV_V2DI_V2DI_V2DI)
+OB_DEF_VAR (s390_vec_srb_u128_u128,     s390_vsrlb,         B_DEP,              0,                  BT_OV_UV1TI_UV1TI_UV1TI)
+OB_DEF_VAR (s390_vec_srb_u128_s128,     s390_vsrlb,         B_DEP,              0,                  BT_OV_UV1TI_UV1TI_V1TI)
+OB_DEF_VAR (s390_vec_srb_s128_u128,     s390_vsrlb,         B_DEP,              0,                  BT_OV_V1TI_V1TI_UV1TI)
+OB_DEF_VAR (s390_vec_srb_s128_s128,     s390_vsrlb,         B_DEP,              0,                  BT_OV_V1TI_V1TI_V1TI)
+OB_DEF_VAR (s390_vec_srb_flt_u64,       s390_vsrlb,         B_DEP | B_VXE,      0,                  BT_OV_V4SF_V4SF_UV4SI)
+OB_DEF_VAR (s390_vec_srb_dbl_u64,       s390_vsrlb,         B_DEP,              0,                  BT_OV_V2DF_V2DF_UV2DI)
+OB_DEF_VAR (s390_vec_srb_flt_s64,       s390_vsrlb,         B_DEP | B_VXE,      0,                  BT_OV_V4SF_V4SF_V4SI)
+OB_DEF_VAR (s390_vec_srb_dbl_s64,       s390_vsrlb,         B_DEP,              0,                  BT_OV_V2DF_V2DF_V2DI)
 OB_DEF_VAR (s390_vec_srb_u8_u8,         s390_vsrlb,         0,                  0,                  BT_OV_UV16QI_UV16QI_UV16QI)
-OB_DEF_VAR (s390_vec_srb_u8_s8,         s390_vsrlb,         0,                  0,                  BT_OV_UV16QI_UV16QI_V16QI)
 OB_DEF_VAR (s390_vec_srb_s8_u8,         s390_vsrlb,         0,                  0,                  BT_OV_V16QI_V16QI_UV16QI)
-OB_DEF_VAR (s390_vec_srb_s8_s8,         s390_vsrlb,         0,                  0,                  BT_OV_V16QI_V16QI_V16QI)
-OB_DEF_VAR (s390_vec_srb_u16_u16,       s390_vsrlb,         0,                  0,                  BT_OV_UV8HI_UV8HI_UV8HI)
-OB_DEF_VAR (s390_vec_srb_u16_s16,       s390_vsrlb,         0,                  0,                  BT_OV_UV8HI_UV8HI_V8HI)
-OB_DEF_VAR (s390_vec_srb_s16_u16,       s390_vsrlb,         0,                  0,                  BT_OV_V8HI_V8HI_UV8HI)
-OB_DEF_VAR (s390_vec_srb_s16_s16,       s390_vsrlb,         0,                  0,                  BT_OV_V8HI_V8HI_V8HI)
-OB_DEF_VAR (s390_vec_srb_u32_u32,       s390_vsrlb,         0,                  0,                  BT_OV_UV4SI_UV4SI_UV4SI)
-OB_DEF_VAR (s390_vec_srb_u32_s32,       s390_vsrlb,         0,                  0,                  BT_OV_UV4SI_UV4SI_V4SI)
-OB_DEF_VAR (s390_vec_srb_s32_u32,       s390_vsrlb,         0,                  0,                  BT_OV_V4SI_V4SI_UV4SI)
-OB_DEF_VAR (s390_vec_srb_s32_s32,       s390_vsrlb,         0,                  0,                  BT_OV_V4SI_V4SI_V4SI)
-OB_DEF_VAR (s390_vec_srb_u64_u64,       s390_vsrlb,         0,                  0,                  BT_OV_UV2DI_UV2DI_UV2DI)
-OB_DEF_VAR (s390_vec_srb_u64_s64,       s390_vsrlb,         0,                  0,                  BT_OV_UV2DI_UV2DI_V2DI)
-OB_DEF_VAR (s390_vec_srb_s64_u64,       s390_vsrlb,         0,                  0,                  BT_OV_V2DI_V2DI_UV2DI)
-OB_DEF_VAR (s390_vec_srb_s64_s64,       s390_vsrlb,         0,                  0,                  BT_OV_V2DI_V2DI_V2DI)
-OB_DEF_VAR (s390_vec_srb_flt_u64,       s390_vsrlb,         B_VXE,              0,                  BT_OV_V4SF_V4SF_UV4SI)
-OB_DEF_VAR (s390_vec_srb_dbl_u64,       s390_vsrlb,         0,                  0,                  BT_OV_V2DF_V2DF_UV2DI)
-OB_DEF_VAR (s390_vec_srb_flt_s64,       s390_vsrlb,         B_VXE,              0,                  BT_OV_V4SF_V4SF_V4SI)
-OB_DEF_VAR (s390_vec_srb_dbl_s64,       s390_vsrlb,         0,                  0,                  BT_OV_V2DF_V2DF_V2DI)
+OB_DEF_VAR (s390_vec_srb_u16_u8,        s390_vsrlb,         0,                  0,                  BT_OV_UV8HI_UV8HI_UV16QI)
+OB_DEF_VAR (s390_vec_srb_s16_u8,        s390_vsrlb,         0,                  0,                  BT_OV_V8HI_V8HI_UV16QI)
+OB_DEF_VAR (s390_vec_srb_u32_u8,        s390_vsrlb,         0,                  0,                  BT_OV_UV4SI_UV4SI_UV16QI)
+OB_DEF_VAR (s390_vec_srb_s32_u8,        s390_vsrlb,         0,                  0,                  BT_OV_V4SI_V4SI_UV16QI)
+OB_DEF_VAR (s390_vec_srb_u64_u8,        s390_vsrlb,         0,                  0,                  BT_OV_UV2DI_UV2DI_UV16QI)
+OB_DEF_VAR (s390_vec_srb_s64_u8,        s390_vsrlb,         0,                  0,                  BT_OV_V2DI_V2DI_UV16QI)
+OB_DEF_VAR (s390_vec_srb_u128_u8,       s390_vsrlb,         0,                  0,                  BT_OV_UV1TI_UV1TI_UV16QI)
+OB_DEF_VAR (s390_vec_srb_s128_u8,       s390_vsrlb,         0,                  0,                  BT_OV_V1TI_V1TI_UV16QI)
+OB_DEF_VAR (s390_vec_srb_flt_u8,        s390_vsrlb,         B_VXE,              0,                  BT_OV_V4SF_V4SF_UV16QI)
+OB_DEF_VAR (s390_vec_srb_dbl_u8,        s390_vsrlb,         0,                  0,                  BT_OV_V2DF_V2DF_UV16QI)
 
 B_DEF      (s390_vsrlb,                 vec_srbv16qi,       0,                  B_VX,               0,                  BT_FN_UV16QI_UV16QI_UV16QI)
 
@@ -3193,6 +3245,8 @@ OB_DEF_VAR (s390_vec_sldb_s32,          s390_vsld,          0,
 OB_DEF_VAR (s390_vec_sldb_u32,          s390_vsld,          0,                  O3_U3,              BT_OV_UV4SI_UV4SI_UV4SI_UINT)
 OB_DEF_VAR (s390_vec_sldb_s64,          s390_vsld,          0,                  O3_U3,              BT_OV_V2DI_V2DI_V2DI_UINT)
 OB_DEF_VAR (s390_vec_sldb_u64,          s390_vsld,          0,                  O3_U3,              BT_OV_UV2DI_UV2DI_UV2DI_UINT)
+OB_DEF_VAR (s390_vec_sldb_s128,         s390_vsld,          0,                  O3_U3,              BT_OV_V1TI_V1TI_V1TI_UINT)
+OB_DEF_VAR (s390_vec_sldb_u128,         s390_vsld,          0,                  O3_U3,              BT_OV_UV1TI_UV1TI_UV1TI_UINT)
 OB_DEF_VAR (s390_vec_sldb_flt,          s390_vsld,          0,                  O3_U3,              BT_OV_V4SF_V4SF_V4SF_UINT)
 OB_DEF_VAR (s390_vec_sldb_dbl,          s390_vsld,          0,                  O3_U3,              BT_OV_V2DF_V2DF_V2DF_UINT)
 
@@ -3207,6 +3261,8 @@ OB_DEF_VAR (s390_vec_srdb_s32,          s390_vsrd,          0,
 OB_DEF_VAR (s390_vec_srdb_u32,          s390_vsrd,          0,                  O3_U3,              BT_OV_UV4SI_UV4SI_UV4SI_UINT)
 OB_DEF_VAR (s390_vec_srdb_s64,          s390_vsrd,          0,                  O3_U3,              BT_OV_V2DI_V2DI_V2DI_UINT)
 OB_DEF_VAR (s390_vec_srdb_u64,          s390_vsrd,          0,                  O3_U3,              BT_OV_UV2DI_UV2DI_UV2DI_UINT)
+OB_DEF_VAR (s390_vec_srdb_s128,         s390_vsrd,          0,                  O3_U3,              BT_OV_V1TI_V1TI_V1TI_UINT)
+OB_DEF_VAR (s390_vec_srdb_u128,         s390_vsrd,          0,                  O3_U3,              BT_OV_UV1TI_UV1TI_UV1TI_UINT)
 OB_DEF_VAR (s390_vec_srdb_flt,          s390_vsrd,          0,                  O3_U3,              BT_OV_V4SF_V4SF_V4SF_UINT)
 OB_DEF_VAR (s390_vec_srdb_dbl,          s390_vsrd,          0,                  O3_U3,              BT_OV_V2DF_V2DF_V2DF_UINT)
 
diff --git a/gcc/config/s390/vector.md b/gcc/config/s390/vector.md
index 952c3afdec01..7247e89807c0 100644
--- a/gcc/config/s390/vector.md
+++ b/gcc/config/s390/vector.md
@@ -1469,10 +1469,41 @@
 
 ; Each vector element rotated by a scalar
 (define_expand "<vec_shifts_name><mode>3"
-  [(set (match_operand:VI 0 "register_operand" "")
-	(VEC_SHIFTS:VI (match_operand:VI 1 "register_operand" "")
-		       (match_operand:QI 2 "shift_count_operand" "")))]
-  "TARGET_VX")
+  [(set (match_operand:VIT 0 "register_operand" "")
+	(VEC_SHIFTS:VIT (match_operand:VIT 1 "register_operand" "")
+			(match_operand:QI  2 "shift_count_operand" "")))]
+  "TARGET_VX && ((<MODE>mode != V1TImode && <MODE>mode != TImode) || <CODE> != ROTATE)"
+{
+  if (<MODE>mode == V1TImode || <MODE>mode == TImode)
+    {
+      rtx shift_count = gen_reg_rtx (V16QImode);
+      emit_insn (gen_vec_splatsv16qi (shift_count, operands[2]));
+
+      if (!CONST_INT_P (operands[2]) || UINTVAL (operands[2]) > 7)
+	switch (<CODE>)
+	  {
+	  case ASHIFT: emit_insn (gen_vec_slb (<MODE>mode, operands[0], operands[1], shift_count)); break;
+	  case ASHIFTRT: emit_insn (gen_vec_srab (<MODE>mode, operands[0], operands[1], shift_count)); break;
+	  case LSHIFTRT: emit_insn (gen_vec_srb (<MODE>mode, operands[0], operands[1], shift_count)); break;
+	  default: gcc_unreachable ();
+	  }
+      else
+	emit_move_insn (operands[0], operands[1]);
+
+      if (!CONST_INT_P (operands[2]) || (UINTVAL (operands[2]) & 7) != 0)
+	{
+	  switch (<CODE>)
+	    {
+	    case ASHIFT: emit_insn (gen_vec_sll (<MODE>mode, V16QImode, operands[0], operands[0], shift_count)); break;
+	    case ASHIFTRT: emit_insn (gen_vec_sral (<MODE>mode, V16QImode, operands[0], operands[0], shift_count)); break;
+	    case LSHIFTRT: emit_insn (gen_vec_srl (<MODE>mode, V16QImode, operands[0], operands[0], shift_count)); break;
+	    default: gcc_unreachable ();
+	    }
+	}
+
+      DONE;
+    }
+})
 
 ; verllb, verllh, verllf, verllg
 ; veslb,  veslh,  veslf,  veslg
@@ -1540,8 +1571,8 @@
 
 ; Pattern used by e.g. popcount
 (define_insn "*vec_srb<mode>"
-  [(set (match_operand:V_128                0 "register_operand" "=v")
-	(unspec:V_128 [(match_operand:V_128 1 "register_operand"  "v")
+  [(set (match_operand:V_HW3                0 "register_operand" "=v")
+	(unspec:V_HW3 [(match_operand:V_HW3 1 "register_operand"  "v")
 		       (match_operand:V16QI 2 "register_operand"  "v")]
 		   UNSPEC_VEC_SRLB))]
   "TARGET_VX"
@@ -1552,8 +1583,8 @@
 ; Vector shift left by byte
 
 (define_insn "*vec_slb<mode>"
-  [(set (match_operand:V_128                0 "register_operand" "=v")
-	(unspec:V_128 [(match_operand:V_128 1 "register_operand"  "v")
+  [(set (match_operand:V_HW3                0 "register_operand" "=v")
+	(unspec:V_HW3 [(match_operand:V_HW3 1 "register_operand"  "v")
 		    (match_operand:V16QI    2 "register_operand"  "v")]
 		   UNSPEC_VEC_SLB))]
   "TARGET_VX"
diff --git a/gcc/config/s390/vx-builtins.md b/gcc/config/s390/vx-builtins.md
index a25122db3b28..a7bb7ff92f5e 100644
--- a/gcc/config/s390/vx-builtins.md
+++ b/gcc/config/s390/vx-builtins.md
@@ -1041,9 +1041,9 @@
 
 ; Vector shift left
 
-(define_insn "vec_sll<VI_HW:mode><VI_HW_QHS:mode>"
-  [(set (match_operand:VI_HW                    0 "register_operand" "=v")
-	(unspec:VI_HW [(match_operand:VI_HW     1 "register_operand"  "v")
+(define_insn "@vec_sll<V_HW3:mode><VI_HW_QHS:mode>"
+  [(set (match_operand:V_HW3                    0 "register_operand" "=v")
+	(unspec:V_HW3 [(match_operand:V_HW3     1 "register_operand"  "v")
 		       (match_operand:VI_HW_QHS 2 "register_operand"  "v")]
 		      UNSPEC_VEC_SLL))]
   "TARGET_VX"
@@ -1054,15 +1054,12 @@
 ; Vector shift left by byte
 
 ; Pattern definition in vector.md, see vec_vslb
-(define_expand "vec_slb<mode>"
-  [(set (match_operand:V_HW 0 "register_operand"                     "")
-	(unspec:V_HW [(match_operand:V_HW 1 "register_operand"       "")
-		      (match_operand:<TOINTVEC> 2 "register_operand" "")]
+(define_expand "@vec_slb<mode>"
+  [(set (match_operand:V_HW3 0 "register_operand"                     "")
+	(unspec:V_HW3 [(match_operand:V_HW3 1 "register_operand"       "")
+		      (match_operand:V16QI 2 "register_operand" "")]
 		     UNSPEC_VEC_SLB))]
-  "TARGET_VX"
-{
-  PUT_MODE (operands[2], V16QImode);
-})
+  "TARGET_VX")
 
 ; Vector shift left double by byte
 
@@ -1113,9 +1110,9 @@
 
 ; Vector shift right arithmetic
 
-(define_insn "vec_sral<VI_HW:mode><VI_HW_QHS:mode>"
-  [(set (match_operand:VI_HW                    0 "register_operand" "=v")
-	(unspec:VI_HW [(match_operand:VI_HW     1 "register_operand"  "v")
+(define_insn "@vec_sral<V_HW3:mode><VI_HW_QHS:mode>"
+  [(set (match_operand:V_HW3                    0 "register_operand" "=v")
+	(unspec:V_HW3 [(match_operand:V_HW3     1 "register_operand"  "v")
 		       (match_operand:VI_HW_QHS 2 "register_operand"  "v")]
 		      UNSPEC_VEC_SRAL))]
   "TARGET_VX"
@@ -1125,10 +1122,10 @@
 
 ; Vector shift right arithmetic by byte
 
-(define_insn "vec_srab<mode>"
-  [(set (match_operand:V_HW 0 "register_operand"                    "=v")
-	(unspec:V_HW [(match_operand:V_HW 1 "register_operand"       "v")
-		      (match_operand:<TOINTVEC> 2 "register_operand" "v")]
+(define_insn "@vec_srab<mode>"
+  [(set (match_operand:V_HW3 0 "register_operand"               "=v")
+	(unspec:V_HW3 [(match_operand:V_HW3 1 "register_operand" "v")
+		       (match_operand:V16QI 2 "register_operand" "v")]
 		     UNSPEC_VEC_SRAB))]
   "TARGET_VX"
   "vsrab\t%v0,%v1,%v2"
@@ -1137,9 +1134,9 @@
 
 ; Vector shift right logical
 
-(define_insn "vec_srl<VI_HW:mode><VI_HW_QHS:mode>"
-  [(set (match_operand:VI_HW                    0 "register_operand" "=v")
-	(unspec:VI_HW [(match_operand:VI_HW     1 "register_operand"  "v")
+(define_insn "@vec_srl<V_HW3:mode><VI_HW_QHS:mode>"
+  [(set (match_operand:V_HW3                    0 "register_operand" "=v")
+	(unspec:V_HW3 [(match_operand:V_HW3     1 "register_operand"  "v")
 		       (match_operand:VI_HW_QHS 2 "register_operand"  "v")]
 		      UNSPEC_VEC_SRL))]
   "TARGET_VX"
@@ -1150,15 +1147,12 @@
 ; Vector shift right logical by byte
 
 ; Pattern definition in vector.md, see vec_vsrb
-(define_expand "vec_srb<mode>"
-  [(set (match_operand:V_HW 0 "register_operand"                     "")
-	(unspec:V_HW [(match_operand:V_HW 1 "register_operand"       "")
-		      (match_operand:<TOINTVEC> 2 "register_operand" "")]
-		     UNSPEC_VEC_SRLB))]
-  "TARGET_VX"
-{
-  PUT_MODE (operands[2], V16QImode);
-})
+(define_expand "@vec_srb<mode>"
+  [(set (match_operand:V_HW3 0 "register_operand"                     "")
+	(unspec:V_HW3 [(match_operand:V_HW3 1 "register_operand"      "")
+		       (match_operand:V16QI 2 "register_operand" "")]
+		      UNSPEC_VEC_SRLB))]
+  "TARGET_VX")
 
 ; Vector subtract
 
diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-shift-10.c b/gcc/testsuite/gcc.target/s390/vector/vec-shift-10.c
new file mode 100644
index 000000000000..7e4fcaa0417e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vector/vec-shift-10.c
@@ -0,0 +1,54 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -mzarch -march=z13 -save-temps" } */
+/* { dg-require-effective-target int128 } */
+/* { dg-final { scan-assembler "\tvsra\t" } } */
+/* { dg-final { scan-assembler "\tvsrab\t" } } */
+
+#include <assert.h>
+
+typedef __attribute__ ((vector_size (16))) signed long long v2di;
+typedef __attribute__ ((vector_size (16))) signed __int128 v1ti;
+
+__attribute__ ((noipa)) v1ti
+dyn_shift (v1ti x, v1ti n)
+{
+  return x >> n;
+}
+
+int
+main (void)
+{
+  v2di x, y;
+
+  x = (v2di){ 0xcafed00ddeadbeef, 0xcafed00ddeadbeef };
+  y = (v2di){ 0xe57f6806ef56df77, 0xe57f6806ef56df77 };
+  x = (v2di) dyn_shift ((v1ti) x, (v1ti){1});
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  x = (v2di){ 0x4afed00dbeadbeee, 0xcafed00ddeadbeef };
+  y = (v2di){ 0x257f6806df56df77, 0x657f6806ef56df77 };
+  x = (v2di) dyn_shift ((v1ti) x, (v1ti){1});
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  x = (v2di){ 0xcafed00ddeadbeef, 0xcafed00ddeadbeef };
+  y = (v2di){ 0xffffcafed00ddead, 0xbeefcafed00ddead };
+  x = (v2di) dyn_shift ((v1ti) x, (v1ti){16});
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  x = (v2di){ 0x4afed00ddead3eef, 0xcafed00ddeadbeef };
+  y = (v2di){ 0x00004afed00ddead, 0x3eefcafed00ddead };
+  x = (v2di) dyn_shift ((v1ti) x, (v1ti){16});
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  x = (v2di){ 0xcafed00ddeadbeef, 0xcafed00ddeadbeef };
+  y = (v2di){ 0xfffffffffff2bfb4, 0x377ab6fbbf2bfb4 };
+  x = (v2di) dyn_shift ((v1ti) x, (v1ti){42});
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  x = (v2di){ 0x4afed00ddeadbeee, 0xcafed00ddeadbeef };
+  y = (v2di){ 0x000000000012bfb4, 0x0377ab6fbbb2bfb4 };
+  x = (v2di) dyn_shift ((v1ti) x, (v1ti){42});
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-shift-11.c b/gcc/testsuite/gcc.target/s390/vector/vec-shift-11.c
new file mode 100644
index 000000000000..e34a0e4b64d4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vector/vec-shift-11.c
@@ -0,0 +1,39 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -mzarch -march=z13 -save-temps" } */
+/* { dg-require-effective-target int128 } */
+/* { dg-final { scan-assembler "\tvsrl\t" } } */
+/* { dg-final { scan-assembler "\tvsrlb\t" } } */
+
+#include <assert.h>
+
+typedef __attribute__ ((vector_size (16))) unsigned long long uv2di;
+typedef __attribute__ ((vector_size (16))) unsigned __int128 uv1ti;
+
+__attribute__ ((noipa)) uv1ti
+dyn_shift (uv1ti x, unsigned int n)
+{
+  return x >> n;
+}
+
+int
+main (void)
+{
+  uv2di x, y;
+
+  x = (uv2di){ 0xcafed00ddeadbeef, 0xcafed00ddeadbeef };
+  y = (uv2di){ 0x657f6806ef56df77, 0xe57f6806ef56df77 };
+  x = (uv2di) dyn_shift ((uv1ti) x, 1);
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  x = (uv2di){ 0xcafed00ddeadbeef, 0xcafed00ddeadbeef };
+  y = (uv2di){ 0x0000cafed00ddead, 0xbeefcafed00ddead };
+  x = (uv2di) dyn_shift ((uv1ti) x, 16);
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  x = (uv2di){ 0xcafed00ddeadbeef, 0xcafed00ddeadbeef };
+  y = (uv2di){ 0x000000000032bfb4, 0x0377ab6fbbf2bfb4 };
+  x = (uv2di) dyn_shift ((uv1ti) x, 42);
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-shift-12.c b/gcc/testsuite/gcc.target/s390/vector/vec-shift-12.c
new file mode 100644
index 000000000000..d01c29bebaef
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vector/vec-shift-12.c
@@ -0,0 +1,39 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -mzarch -march=z13 -save-temps" } */
+/* { dg-require-effective-target int128 } */
+/* { dg-final { scan-assembler "\tvsrl\t" } } */
+/* { dg-final { scan-assembler "\tvsrlb\t" } } */
+
+#include <assert.h>
+
+typedef __attribute__ ((vector_size (16))) unsigned long long uv2di;
+typedef __attribute__ ((vector_size (16))) unsigned __int128 uv1ti;
+
+__attribute__ ((noipa)) uv1ti
+dyn_shift (uv1ti x, uv1ti n)
+{
+  return x >> n;
+}
+
+int
+main (void)
+{
+  uv2di x, y;
+
+  x = (uv2di){ 0xcafed00ddeadbeef, 0xcafed00ddeadbeef };
+  y = (uv2di){ 0x657f6806ef56df77, 0xe57f6806ef56df77 };
+  x = (uv2di) dyn_shift ((uv1ti) x, (uv1ti){1});
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  x = (uv2di){ 0xcafed00ddeadbeef, 0xcafed00ddeadbeef };
+  y = (uv2di){ 0x0000cafed00ddead, 0xbeefcafed00ddead };
+  x = (uv2di) dyn_shift ((uv1ti) x, (uv1ti){16});
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  x = (uv2di){ 0xcafed00ddeadbeef, 0xcafed00ddeadbeef };
+  y = (uv2di){ 0x000000000032bfb4, 0x0377ab6fbbf2bfb4 };
+  x = (uv2di) dyn_shift ((uv1ti) x, (uv1ti){42});
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-shift-3.c b/gcc/testsuite/gcc.target/s390/vector/vec-shift-3.c
new file mode 100644
index 000000000000..c5b92fa49c71
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vector/vec-shift-3.c
@@ -0,0 +1,34 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -mzarch -march=z13 -save-temps" } */
+/* { dg-require-effective-target int128 } */
+/* { dg-final { scan-assembler "\tvsra\t" } } */
+/* { dg-final { scan-assembler-not "\tvsrab\t" } } */
+
+#include <assert.h>
+
+typedef __attribute__ ((vector_size (16))) signed long long v2di;
+typedef __attribute__ ((vector_size (16))) signed __int128 v1ti;
+
+__attribute__ ((noipa)) v1ti
+const_shift (v1ti x)
+{
+  return x >> 1;
+}
+
+int
+main (void)
+{
+  v2di x, y;
+
+  x = (v2di){ 0xcafed00ddeadbeef, 0xcafed00ddeadbeef };
+  y = (v2di){ 0xe57f6806ef56df77, 0xe57f6806ef56df77 };
+  x = (v2di) const_shift ((v1ti) x);
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  x = (v2di){ 0x4afed00dbeadbeee, 0xcafed00ddeadbeef };
+  y = (v2di){ 0x257f6806df56df77, 0x657f6806ef56df77 };
+  x = (v2di) const_shift ((v1ti) x);
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-shift-4.c b/gcc/testsuite/gcc.target/s390/vector/vec-shift-4.c
new file mode 100644
index 000000000000..0759c01193d9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vector/vec-shift-4.c
@@ -0,0 +1,29 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -mzarch -march=z13 -save-temps" } */
+/* { dg-require-effective-target int128 } */
+/* { dg-final { scan-assembler "\tvsrl\t" } } */
+/* { dg-final { scan-assembler-not "\tvsrlb\t" } } */
+
+#include <assert.h>
+
+typedef __attribute__ ((vector_size (16))) unsigned long long uv2di;
+typedef __attribute__ ((vector_size (16))) unsigned __int128 uv1ti;
+
+__attribute__ ((noipa)) uv1ti
+const_shift (uv1ti x)
+{
+  return x >> 1;
+}
+
+int
+main (void)
+{
+  uv2di x, y;
+
+  x = (uv2di){ 0xcafed00ddeadbeef, 0xcafed00ddeadbeef };
+  y = (uv2di){ 0x657f6806ef56df77, 0xe57f6806ef56df77 };
+  x = (uv2di) const_shift ((uv1ti) x);
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-shift-5.c b/gcc/testsuite/gcc.target/s390/vector/vec-shift-5.c
new file mode 100644
index 000000000000..66cfb12fe66d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vector/vec-shift-5.c
@@ -0,0 +1,34 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -mzarch -march=z13 -save-temps" } */
+/* { dg-require-effective-target int128 } */
+/* { dg-final { scan-assembler "\tvsrab\t" } } */
+/* { dg-final { scan-assembler-not "\tvsra\t" } } */
+
+#include <assert.h>
+
+typedef __attribute__ ((vector_size (16))) signed long long v2di;
+typedef __attribute__ ((vector_size (16))) signed __int128 v1ti;
+
+__attribute__ ((noipa)) v1ti
+const_shift (v1ti x)
+{
+  return x >> 16;
+}
+
+int
+main (void)
+{
+  v2di x, y;
+
+  x = (v2di){ 0xcafed00ddeadbeef, 0xcafed00ddeadbeef };
+  y = (v2di){ 0xffffcafed00ddead, 0xbeefcafed00ddead };
+  x = (v2di) const_shift ((v1ti) x);
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  x = (v2di){ 0x4afed00ddead3eef, 0xcafed00ddeadbeef };
+  y = (v2di){ 0x00004afed00ddead, 0x3eefcafed00ddead };
+  x = (v2di) const_shift ((v1ti) x);
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-shift-6.c b/gcc/testsuite/gcc.target/s390/vector/vec-shift-6.c
new file mode 100644
index 000000000000..b92141e62323
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vector/vec-shift-6.c
@@ -0,0 +1,29 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -mzarch -march=z13 -save-temps" } */
+/* { dg-require-effective-target int128 } */
+/* { dg-final { scan-assembler "\tvsrlb\t" } } */
+/* { dg-final { scan-assembler-not "\tvsrl\t" } } */
+
+#include <assert.h>
+
+typedef __attribute__ ((vector_size (16))) unsigned long long uv2di;
+typedef __attribute__ ((vector_size (16))) unsigned __int128 uv1ti;
+
+__attribute__ ((noipa)) uv1ti
+const_shift (uv1ti x)
+{
+  return x >> 16;
+}
+
+int
+main (void)
+{
+  uv2di x, y;
+
+  x = (uv2di){ 0xcafed00ddeadbeef, 0xcafed00ddeadbeef };
+  y = (uv2di){ 0x0000cafed00ddead, 0xbeefcafed00ddead };
+  x = (uv2di) const_shift ((uv1ti) x);
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-shift-7.c b/gcc/testsuite/gcc.target/s390/vector/vec-shift-7.c
new file mode 100644
index 000000000000..c0277ede160f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vector/vec-shift-7.c
@@ -0,0 +1,34 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -mzarch -march=z13 -save-temps" } */
+/* { dg-require-effective-target int128 } */
+/* { dg-final { scan-assembler "\tvsra\t" } } */
+/* { dg-final { scan-assembler "\tvsrab\t" } } */
+
+#include <assert.h>
+
+typedef __attribute__ ((vector_size (16))) signed long long v2di;
+typedef __attribute__ ((vector_size (16))) signed __int128 v1ti;
+
+__attribute__ ((noipa)) v1ti
+const_shift (v1ti x)
+{
+  return x >> 42;
+}
+
+int
+main (void)
+{
+  v2di x, y;
+
+  x = (v2di){ 0xcafed00ddeadbeef, 0xcafed00ddeadbeef };
+  y = (v2di){ 0xfffffffffff2bfb4, 0x377ab6fbbf2bfb4 };
+  x = (v2di) const_shift ((v1ti) x);
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  x = (v2di){ 0x4afed00ddeadbeee, 0xcafed00ddeadbeef };
+  y = (v2di){ 0x000000000012bfb4, 0x0377ab6fbbb2bfb4 };
+  x = (v2di) const_shift ((v1ti) x);
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-shift-8.c b/gcc/testsuite/gcc.target/s390/vector/vec-shift-8.c
new file mode 100644
index 000000000000..308aadd764dc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vector/vec-shift-8.c
@@ -0,0 +1,29 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -mzarch -march=z13 -save-temps" } */
+/* { dg-require-effective-target int128 } */
+/* { dg-final { scan-assembler "\tvsrl\t" } } */
+/* { dg-final { scan-assembler "\tvsrlb\t" } } */
+
+#include <assert.h>
+
+typedef __attribute__ ((vector_size (16))) unsigned long long uv2di;
+typedef __attribute__ ((vector_size (16))) unsigned __int128 uv1ti;
+
+__attribute__ ((noipa)) uv1ti
+const_shift (uv1ti x)
+{
+  return x >> 42;
+}
+
+int
+main (void)
+{
+  uv2di x, y;
+
+  x = (uv2di){ 0xcafed00ddeadbeef, 0xcafed00ddeadbeef };
+  y = (uv2di){ 0x000000000032bfb4, 0x0377ab6fbbf2bfb4 };
+  x = (uv2di) const_shift ((uv1ti) x);
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-shift-9.c b/gcc/testsuite/gcc.target/s390/vector/vec-shift-9.c
new file mode 100644
index 000000000000..929fa0d642c8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vector/vec-shift-9.c
@@ -0,0 +1,54 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -mzarch -march=z13 -save-temps" } */
+/* { dg-require-effective-target int128 } */
+/* { dg-final { scan-assembler "\tvsra\t" } } */
+/* { dg-final { scan-assembler "\tvsrab\t" } } */
+
+#include <assert.h>
+
+typedef __attribute__ ((vector_size (16))) signed long long v2di;
+typedef __attribute__ ((vector_size (16))) signed __int128 v1ti;
+
+__attribute__ ((noipa)) v1ti
+dyn_shift (v1ti x, unsigned int n)
+{
+  return x >> n;
+}
+
+int
+main (void)
+{
+  v2di x, y;
+
+  x = (v2di){ 0xcafed00ddeadbeef, 0xcafed00ddeadbeef };
+  y = (v2di){ 0xe57f6806ef56df77, 0xe57f6806ef56df77 };
+  x = (v2di) dyn_shift ((v1ti) x, 1);
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  x = (v2di){ 0x4afed00dbeadbeee, 0xcafed00ddeadbeef };
+  y = (v2di){ 0x257f6806df56df77, 0x657f6806ef56df77 };
+  x = (v2di) dyn_shift ((v1ti) x, 1);
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  x = (v2di){ 0xcafed00ddeadbeef, 0xcafed00ddeadbeef };
+  y = (v2di){ 0xffffcafed00ddead, 0xbeefcafed00ddead };
+  x = (v2di) dyn_shift ((v1ti) x, 16);
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  x = (v2di){ 0x4afed00ddead3eef, 0xcafed00ddeadbeef };
+  y = (v2di){ 0x00004afed00ddead, 0x3eefcafed00ddead };
+  x = (v2di) dyn_shift ((v1ti) x, 16);
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  x = (v2di){ 0xcafed00ddeadbeef, 0xcafed00ddeadbeef };
+  y = (v2di){ 0xfffffffffff2bfb4, 0x377ab6fbbf2bfb4 };
+  x = (v2di) dyn_shift ((v1ti) x, 42);
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  x = (v2di){ 0x4afed00ddeadbeee, 0xcafed00ddeadbeef };
+  y = (v2di){ 0x000000000012bfb4, 0x0377ab6fbbb2bfb4 };
+  x = (v2di) dyn_shift ((v1ti) x, 42);
+  assert (x[0] == y[0] && x[1] == y[1]);
+
+  return 0;
+}
-- 
GitLab