This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Register constraints + and =


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"))]
  "&& 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]);

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)?



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]