aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/s390
diff options
context:
space:
mode:
authorMarius Hillenbrand <mhillen@linux.ibm.com>2021-05-04 13:30:05 +0200
committerMarius Hillenbrand <mhillen@linux.ibm.com>2021-05-06 10:49:18 +0200
commit3c33c00f43bfe585d9414dfb620f0f518e55a457 (patch)
tree5ac7fc2f15a9cc93cebf4d580e8e581963da30d5 /gcc/config/s390
parentad96c867e173c1ebcfc201b201adac5095683a08 (diff)
downloadgcc-3c33c00f43bfe585d9414dfb620f0f518e55a457.zip
gcc-3c33c00f43bfe585d9414dfb620f0f518e55a457.tar.gz
gcc-3c33c00f43bfe585d9414dfb620f0f518e55a457.tar.bz2
IBM Z: Fix error checking for builtin vec_permi
The builtin vec_permi is peculiar in that its immediate operand is encoded differently than the immediate operand that is backing the builtin. This fixes the check for the immediate operand, adding a regression test in the process. This partially reverts commit 3191c1f4488d1f7563b563d7ae2a102a26f16d82 2021-05-06 Marius Hillenbrand <mhillen@linux.ibm.com> gcc/ChangeLog: * config/s390/s390-builtins.def (O_M5, O1_M5, ...): Remove unused macros. (s390_vec_permi_s64, s390_vec_permi_b64, s390_vec_permi_u64) (s390_vec_permi_dbl, s390_vpdi): Use the O3_U2 type for the immediate operand. * config/s390/s390.c (s390_const_operand_ok): Remove unused values. gcc/testsuite/ChangeLog: * gcc.target/s390/zvector/imm-range-error-1.c: Fix test for __builtin_s390_vpdi. * gcc.target/s390/zvector/vec-permi.c: New test for builtin vec_permi.
Diffstat (limited to 'gcc/config/s390')
-rw-r--r--gcc/config/s390/s390-builtins.def44
-rw-r--r--gcc/config/s390/s390.c7
2 files changed, 21 insertions, 30 deletions
diff --git a/gcc/config/s390/s390-builtins.def b/gcc/config/s390/s390-builtins.def
index f77ab75..8ca002d 100644
--- a/gcc/config/s390/s390-builtins.def
+++ b/gcc/config/s390/s390-builtins.def
@@ -29,7 +29,6 @@
#undef O_U16
#undef O_U32
-#undef O_M5
#undef O_M12
#undef O_S2
@@ -89,11 +88,6 @@
#undef O3_U32
#undef O4_U32
-#undef O1_M5
-#undef O2_M5
-#undef O3_M5
-#undef O4_M5
-
#undef O1_M12
#undef O2_M12
#undef O3_M12
@@ -164,20 +158,19 @@
#define O_U16 8 /* unsigned 16 bit literal */
#define O_U32 9 /* unsigned 32 bit literal */
-#define O_M5 10 /* matches bitmask of 5 */
-#define O_M12 11 /* matches bitmask of 12 */
+#define O_M12 10 /* matches bitmask of 12 */
-#define O_S2 12 /* signed 2 bit literal */
-#define O_S3 13 /* signed 3 bit literal */
-#define O_S4 14 /* signed 4 bit literal */
-#define O_S5 15 /* signed 5 bit literal */
-#define O_S8 16 /* signed 8 bit literal */
-#define O_S12 17 /* signed 12 bit literal */
-#define O_S16 18 /* signed 16 bit literal */
-#define O_S32 19 /* signed 32 bit literal */
+#define O_S2 11 /* signed 2 bit literal */
+#define O_S3 12 /* signed 3 bit literal */
+#define O_S4 13 /* signed 4 bit literal */
+#define O_S5 14 /* signed 5 bit literal */
+#define O_S8 15 /* signed 8 bit literal */
+#define O_S12 16 /* signed 12 bit literal */
+#define O_S16 17 /* signed 16 bit literal */
+#define O_S32 18 /* signed 32 bit literal */
-#define O_ELEM 20 /* Element selector requiring modulo arithmetic. */
-#define O_LIT 21 /* Operand must be a literal fitting the target type. */
+#define O_ELEM 19 /* Element selector requiring modulo arithmetic. */
+#define O_LIT 20 /* Operand must be a literal fitting the target type. */
#define O_SHIFT 5
@@ -230,11 +223,6 @@
#define O3_U32 (O_U32 << (2 * O_SHIFT))
#define O4_U32 (O_U32 << (3 * O_SHIFT))
-#define O1_M5 O_M5
-#define O2_M5 (O_M5 << O_SHIFT)
-#define O3_M5 (O_M5 << (2 * O_SHIFT))
-#define O4_M5 (O_M5 << (3 * O_SHIFT))
-
#define O1_M12 O_M12
#define O2_M12 (O_M12 << O_SHIFT)
#define O3_M12 (O_M12 << (2 * O_SHIFT))
@@ -671,12 +659,12 @@ OB_DEF_VAR (s390_vec_perm_dbl, s390_vperm, 0,
B_DEF (s390_vperm, vec_permv16qi, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI_UV16QI)
OB_DEF (s390_vec_permi, s390_vec_permi_s64, s390_vec_permi_dbl, B_VX, BT_FN_OV4SI_OV4SI_OV4SI_INT)
-OB_DEF_VAR (s390_vec_permi_s64, s390_vpdi, 0, O3_M5, BT_OV_V2DI_V2DI_V2DI_INT)
-OB_DEF_VAR (s390_vec_permi_b64, s390_vpdi, 0, O3_M5, BT_OV_BV2DI_BV2DI_BV2DI_INT)
-OB_DEF_VAR (s390_vec_permi_u64, s390_vpdi, 0, O3_M5, BT_OV_UV2DI_UV2DI_UV2DI_INT)
-OB_DEF_VAR (s390_vec_permi_dbl, s390_vpdi, 0, O3_M5, BT_OV_V2DF_V2DF_V2DF_INT)
+OB_DEF_VAR (s390_vec_permi_s64, s390_vpdi, 0, O3_U2, BT_OV_V2DI_V2DI_V2DI_INT)
+OB_DEF_VAR (s390_vec_permi_b64, s390_vpdi, 0, O3_U2, BT_OV_BV2DI_BV2DI_BV2DI_INT)
+OB_DEF_VAR (s390_vec_permi_u64, s390_vpdi, 0, O3_U2, BT_OV_UV2DI_UV2DI_UV2DI_INT)
+OB_DEF_VAR (s390_vec_permi_dbl, s390_vpdi, 0, O3_U2, BT_OV_V2DF_V2DF_V2DF_INT)
-B_DEF (s390_vpdi, vec_permiv2di, 0, B_VX, O3_M5, BT_FN_UV2DI_UV2DI_UV2DI_INT)
+B_DEF (s390_vpdi, vec_permiv2di, 0, B_VX, O3_U2, BT_FN_UV2DI_UV2DI_UV2DI_INT)
OB_DEF (s390_vec_splat, s390_vec_splat2_s8, s390_vec_splat2_dbl,B_VX, BT_FN_OV4SI_OV4SI_UCHAR)
OB_DEF_VAR (s390_vec_splat2_s8, s390_vrepb, 0, O2_U4, BT_OV_V16QI_V16QI_UCHAR)
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index 88361f9..6bbeb64 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -734,11 +734,14 @@ s390_const_operand_ok (tree arg, int argnum, int op_flags, tree decl)
{
if (O_UIMM_P (op_flags))
{
- unsigned HOST_WIDE_INT bitwidths[] = { 1, 2, 3, 4, 5, 8, 12, 16, 32, 4, 4 };
- unsigned HOST_WIDE_INT bitmasks[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 12 };
+ unsigned HOST_WIDE_INT bitwidths[] = { 1, 2, 3, 4, 5, 8, 12, 16, 32, 4 };
+ unsigned HOST_WIDE_INT bitmasks[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 12 };
unsigned HOST_WIDE_INT bitwidth = bitwidths[op_flags - O_U1];
unsigned HOST_WIDE_INT bitmask = bitmasks[op_flags - O_U1];
+ gcc_assert(ARRAY_SIZE(bitwidths) == (O_M12 - O_U1 + 1));
+ gcc_assert(ARRAY_SIZE(bitmasks) == (O_M12 - O_U1 + 1));
+
if (!tree_fits_uhwi_p (arg)
|| tree_to_uhwi (arg) > (HOST_WIDE_INT_1U << bitwidth) - 1
|| (bitmask && tree_to_uhwi (arg) & ~bitmask))