Hi Mike, Some comments on this patch:
On Wed, Aug 14, 2019 at 05:59:13PM -0400, Michael Meissner wrote: > Due to some of the existing load and store insns not using the traditional > operands[0] and operands[1], the functions that test whether an insn is > prefixed only use the insn and not the operands directly. Both the "update" and the "indexed" attributes have no problem with this: the insns that have the problem set the attribute value directly. This is mainly all the various update insns, but there are a bunch more, and they all need different settings for their attributes. > * config/rs6000/rs6000.c (rs6000_emit_move): Add support for > loading up pc-relatve addresses. (typo btw) > +void > +rs6000_final_prescan_insn (rtx_insn *insn) > +{ > + next_insn_prefixed_p = (get_attr_prefixed (insn) != PREFIXED_NO); > + return; > +} Don't say "return;" at the end of a function please. > +void > +rs6000_asm_output_opcode (FILE *stream, const char *) > +{ > + if (next_insn_prefixed_p) > + { > + next_insn_prefixed_p = false; > + fprintf (stream, "p"); > + } You don't need to clear the flag here; the next call to rs6000_final_prescan_insn will. > +#define FINAL_PRESCAN_INSN(INSN, OPERANDS, NOPERANDS) > \ > +do \ > + { \ > + if (TARGET_PREFIXED_ADDR) > \ > + rs6000_final_prescan_insn (INSN); > \ > + } \ > +while (0) Either have the function only do what it needs to for prefixed, and call it something with prefixed in the name, or put the TARGET_PREFIXED_ADDR test in the function itself. > +;; Load up a pc-relative address. ASM_OUTPUT_OPCODE will emit the initial > "p". > +(define_insn "*pcrel_addr" > + [(set (match_operand:DI 0 "gpc_reg_operand" "=b*r") > + (match_operand:DI 1 "pcrel_address"))] > + "TARGET_PCREL" > + "la %0,%a1" > + [(set_attr "prefixed" "yes")]) (use P for addresses please) > +;; Load up a pc-relative address to an external symbol. If the symbol and > the > +;; program are both defined in the main program, the linker will optimize > this > +;; to a PADDI. Otherwise, it will create a GOT address that is relocated by > +;; the dynamic linker and loaded up. > +(define_insn "*pcrel_ext_addr" > + [(set (match_operand:DI 0 "gpc_reg_operand" "=b*r") > + (match_operand:DI 1 "pcrel_external_address"))] > + "TARGET_PCREL" > + "ld %0,%a1" > + [(set_attr "prefixed" "yes")]) pld does an indirection more than pla does, but this is not clear at all from the RTL, from the predicate names. All this is *before* the linker has done its thing, so pcrel_external_address is really some GOT memory, so it should have that in its name. Segher