Register constraints + and =

Paulo J. Matos paulo@matos-sorge.com
Fri May 4 09:41:00 GMT 2012


Hi,

I was just trying to understand exactly what constraint modifiers + and 
= mean. I have read the manual but I am uncertain about their meaning in 
the context of the following rule (without any modifiers):

Expand generates:

(define_insn_and_split "movmem_long"
   [(set (match_operand:QI 2 "register_operand" "d,c") (const_int 0))
    (set (mem:BLK (match_operand:QI 0 "register_operand" "d,c"))
         (mem:BLK (match_operand:QI 1 "register_operand" "x,c")))
    (set (match_dup 0) (plus:QI (match_dup 0) (match_dup 2)))
    (set (match_dup 1) (plus:QI (match_dup 1) (match_dup 2)))
    (clobber (match_scratch:QI 3 "w,w"))]
   "!TARGET_NO_BLOCK_COPY"
   "#"
   "&& reload_completed"
   [(const_int 0)]
{
   if((which_alternative == 0 && REGNO(operands[2]) == RAH))
      || which_alternative == 1)
   {
     emit_move_insn(operands[3], operands[0]);
     emit_move_insn(operands[0], operands[2]);
     emit_move_insn(operands[2], operands[3]);
   }
   emit_insn(gen_bc2());
   DONE;
})

 From what I understand + is for input/output operands, = for output 
only operands. Since in the above rule (a parallel) all operands are 
written to and read to, does this mean all their constraints should 
start with +? Or this only applies per set within each parallel (which 
doesn't seem to make much sense)?

Cheers,

-- 
PMatos



More information about the Gcc mailing list