diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-03-24 14:09:33 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2017-03-24 14:09:33 +0000 |
commit | bb1f126f662828146932b1b5f79649b20ae14b19 (patch) | |
tree | 2ee2b3e273825de6e1030d08aadb82ca35ae9c1a | |
parent | 0745ad26dfd7e4780de5b7190063870d84ced774 (diff) |
* genrecog.c (validate_pattern): Add VEC_SELECT validation.
* genmodes.c (emit_min_insn_modes_c): Call emit_mode_nunits
and emit_mode_inner.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@246460 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/genmodes.c | 2 | ||||
-rw-r--r-- | gcc/genrecog.c | 26 |
3 files changed, 34 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c133ecc6840..f82afbe9ab4 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 92079fafc0e..e56c08b4d30 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 f414d5f4f27..6a9e610e7a0 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; } |