Add new constraints to match whether a memory is not prefixed (em constraint) or prefixed (ep constraint). This is one of 4 parts aimed at reworking the vector extract code in patch V7 #6.
This patch just adds the new constraints, but these constraints will not be used until the next patch. Originally I had just one constraint (em) that matched non-prefixed memory operands. But in order to use it, I needed to make sure the combiner did not combine vector extracts with a variable offset with a PC-relative memory location. I.e.: #include <altivec.h> static vector double vd; double get (unsigned int n) { return vec_extract (vd, n); } In addition, as I contemplate the bigger issue about the insn length attribute, I suspect we may need to have an ep attribute as well as em. Patch V7 #6: https://gcc.gnu.org/ml/gcc-patches/2019-11/msg01306.html I have bootstrapped the compiler on a little endian power8 system and ran make check and there were no regressions. Can I check this patch in? 2019-12-10 Michael Meissner <meiss...@linux.ibm.com> * config/rs6000/constraints.md (em constraint): New constraint for non-prefixed memory operands. (ep constraint): New constraint for prefixed memory operands. * config/rs6000/predicates.md (non_prefixed_memory): New predicate for non-prefixed memory operands. * doc/md.texi (PowerPC constraints): Document em and ep constraints. Index: gcc/config/rs6000/constraints.md =================================================================== --- gcc/config/rs6000/constraints.md (revision 279182) +++ gcc/config/rs6000/constraints.md (working copy) @@ -202,6 +202,16 @@ (define_constraint "H" ;; Memory constraints +(define_memory_constraint "em" + "A memory operand that does not contain a prefixed address." + (and (match_code "mem") + (match_operand 0 "non_prefixed_memory"))) + +(define_memory_constraint "ep" + "A memory operand that does contains a prefixed address." + (and (match_code "mem") + (match_operand 0 "prefixed_memory"))) + (define_memory_constraint "es" "A ``stable'' memory operand; that is, one which does not include any automodification of the base register. Unlike @samp{m}, this constraint Index: gcc/config/rs6000/predicates.md =================================================================== --- gcc/config/rs6000/predicates.md (revision 279151) +++ gcc/config/rs6000/predicates.md (working copy) @@ -1846,3 +1846,17 @@ (define_predicate "prefixed_memory" { return address_is_prefixed (XEXP (op, 0), mode, NON_PREFIXED_DEFAULT); }) + +;; Return true if the operand is a valid memory address that does not use a +;; prefixed address. +(define_predicate "non_prefixed_memory" + (match_code "mem") +{ + enum insn_form iform + = address_to_insn_form (XEXP (op, 0), mode, NON_PREFIXED_DEFAULT); + + return (iform != INSN_FORM_BAD + && iform != INSN_FORM_PREFIXED_NUMERIC + && iform != INSN_FORM_PCREL_LOCAL + && iform != INSN_FORM_PCREL_EXTERNAL); +}) Index: gcc/doc/md.texi =================================================================== --- gcc/doc/md.texi (revision 279182) +++ gcc/doc/md.texi (working copy) @@ -3373,6 +3373,12 @@ asm ("st %1,%0" : "=m<>" (mem) : "r" (va is not. +@item em +A memory operand that does not contain a prefixed address. + +@item ep +A memory operand that does contains a prefixed address. + @item es A ``stable'' memory operand; that is, one which does not include any automodification of the base register. This used to be useful when -- Michael Meissner, IBM IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA email: meiss...@linux.ibm.com, phone: +1 (978) 899-4797