This is a reworking of the patches that I posted as V3 at the end of August.
Unlike the last set of patches, I do not use the address mask bits in reg_addr, but instead, I have a separate function that takes an address and decodes it into the various different flavors (single register address, D-form 16-bit address, X-form indexed address, numeric 34-bit offset, local pc-relative address, etc.). The caller then decides whether the address matches what they are looking for. I have two enumerations that I added to this series: 1) insn_form: This is the address format (D, DS, DQ, X, etc.); 2) non_prefixed: This is a limited enum that just describes the format of the non-prefixed instruction to decide if an address needs to be prefixed or not. Originally, I was trying to re-use the same insn_form enumeration for both the output and the input to say what the traditional instruction uses, but I ultimately separated them to make it clearer. As I said to you at the Caulron, when I replaced some of the predicates, I put them in a different location in predicates.md, so that it would be clear that the old version was completely eliminated, and replaced with a new version. I also removed the two boolean arguments for the pc-relative matching, and instead the address to insn_form just returns different values (34-bit numeric offset, 34-bit bit pc-relative reference to a local symbol, 34-bit pc-relative reference to an external symbol, etc.). I did collapse the fix for vector extracts into the patches that enable general prefixed addressing, so we don't have a possibility of bad code being generated. Right now, I'm not going to add the PCREL_OPT patches to this set, but I will do it later, if these patches get applied. I will rework it to meet the comments you raised. -- 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