aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2017-03-24 15:09:33 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2017-03-24 15:09:33 +0100
commitc4d5ab5d0979227a780fb74a2961205e0458d91e (patch)
tree2ee2b3e273825de6e1030d08aadb82ca35ae9c1a /gcc
parent76794c52216326ff16601d53a0f36d7b046c6f55 (diff)
downloadgcc-c4d5ab5d0979227a780fb74a2961205e0458d91e.zip
gcc-c4d5ab5d0979227a780fb74a2961205e0458d91e.tar.gz
gcc-c4d5ab5d0979227a780fb74a2961205e0458d91e.tar.bz2
genrecog.c (validate_pattern): Add VEC_SELECT validation.
* genrecog.c (validate_pattern): Add VEC_SELECT validation. * genmodes.c (emit_min_insn_modes_c): Call emit_mode_nunits and emit_mode_inner. From-SVN: r246460
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/genmodes.c2
-rw-r--r--gcc/genrecog.c26
3 files changed, 34 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c133ecc..f82afbe 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2017-03-24 Jakub Jelinek <jakub@redhat.com>
+
+ * genrecog.c (validate_pattern): Add VEC_SELECT validation.
+ * genmodes.c (emit_min_insn_modes_c): Call emit_mode_nunits
+ and emit_mode_inner.
+
2017-03-24 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
* config/s390/s390-builtins.def: Add VXE builtins. Add a flags
diff --git a/gcc/genmodes.c b/gcc/genmodes.c
index 92079faf..e56c08b 100644
--- a/gcc/genmodes.c
+++ b/gcc/genmodes.c
@@ -1789,7 +1789,9 @@ emit_min_insn_modes_c (void)
emit_min_insn_modes_c_header ();
emit_mode_name ();
emit_mode_class ();
+ emit_mode_nunits ();
emit_mode_wider ();
+ emit_mode_inner ();
emit_class_narrowest_mode ();
}
diff --git a/gcc/genrecog.c b/gcc/genrecog.c
index f414d5f..6a9e610 100644
--- a/gcc/genrecog.c
+++ b/gcc/genrecog.c
@@ -737,6 +737,32 @@ validate_pattern (rtx pattern, md_rtx_info *info, rtx set, int set_code)
GET_MODE_NAME (GET_MODE (XEXP (pattern, 0))));
break;
+ case VEC_SELECT:
+ if (GET_MODE (pattern) != VOIDmode)
+ {
+ enum machine_mode mode = GET_MODE (pattern);
+ enum machine_mode imode = GET_MODE (XEXP (pattern, 0));
+ enum machine_mode emode
+ = VECTOR_MODE_P (mode) ? GET_MODE_INNER (mode) : mode;
+ if (GET_CODE (XEXP (pattern, 1)) == PARALLEL)
+ {
+ int expected = VECTOR_MODE_P (mode) ? GET_MODE_NUNITS (mode) : 1;
+ if (XVECLEN (XEXP (pattern, 1), 0) != expected)
+ error_at (info->loc,
+ "vec_select parallel with %d elements, expected %d",
+ XVECLEN (XEXP (pattern, 1), 0), expected);
+ }
+ if (imode != VOIDmode && !VECTOR_MODE_P (imode))
+ error_at (info->loc, "%smode of first vec_select operand is not a "
+ "vector mode", GET_MODE_NAME (imode));
+ else if (imode != VOIDmode && GET_MODE_INNER (imode) != emode)
+ error_at (info->loc, "element mode mismatch between vec_select "
+ "%smode and its operand %smode",
+ GET_MODE_NAME (emode),
+ GET_MODE_NAME (GET_MODE_INNER (imode)));
+ }
+ break;
+
default:
break;
}