Hi,

The current implementation of “speculation_barrier” and “group_end_nop” insns 
emit hard-wired register names which causes tests using them to fail on Darwin, 
at least, which uses “rNN” instead of “NN”.

The patch makes the register names for these insns use the operand output 
mechanism to substitute the appropriate variant when needed.

tested on powerpc-darwin9 and powerpc64-linux.

OK for trunk?
Iain

gcc/

        * config/rs6000/rs6000.md (group_end_nop): Emit
        insn register names using operand format, rather than
        hard-wired.  (speculation_barrier): Likewise.


diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index 56364e0..86badc2 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -12494,15 +12494,18 @@
   [(unspec [(const_int 0)] UNSPEC_GRP_END_NOP)]
   ""
 {
-  if (rs6000_tune == PROCESSOR_POWER6)
-    return "ori 1,1,0";
-  return "ori 2,2,0";
+  operands[0] = gen_rtx_REG (Pmode,
+                            rs6000_tune == PROCESSOR_POWER6 ? 1 : 2);
+  return "ori %0,%0,0";
 })
 
 (define_insn "speculation_barrier"
   [(unspec_volatile:BLK [(const_int 0)] UNSPECV_SPEC_BARRIER)]
   ""
-  "ori 31,31,0")
+{
+  operands[0] = gen_rtx_REG (Pmode, 31);
+  return "ori %0,%0,0";
+})
 
 ;; Define the subtract-one-and-jump insns, starting with the template
 ;; so loop.c knows what to generate.

Reply via email to