Commit 292099cc by Jim Wilson

(subsi3+1): Handle case where first operand is constant

but second operand is not.

From-SVN: r12589
parent cd25d00b
...@@ -1509,6 +1509,9 @@ ...@@ -1509,6 +1509,9 @@
;; add instruction. ;; add instruction.
;; Some assemblers apparently won't accept two addresses added together. ;; Some assemblers apparently won't accept two addresses added together.
;; ??? The condition should be improved to reject the case of two
;; symbolic constants.
(define_insn "" (define_insn ""
[(set (match_operand:SI 0 "register_operand" "=d,d,d") [(set (match_operand:SI 0 "register_operand" "=d,d,d")
(plus:SI (match_operand:SI 1 "arith32_operand" "%dn,i,dn") (plus:SI (match_operand:SI 1 "arith32_operand" "%dn,i,dn")
...@@ -1531,8 +1534,16 @@ ...@@ -1531,8 +1534,16 @@
else if (INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) < 32) else if (INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) < 32)
return \"addo %1,%2,%0\"; return \"addo %1,%2,%0\";
} }
/* Non-canonical results (op1 == const, op2 != const) have been seen
in reload output when both operands were symbols before reload, so
we deal with it here. This may be a fault of the constraints above. */
if (CONSTANT_P (operands[1])) if (CONSTANT_P (operands[1]))
return \"lda %1+%2,%0\"; {
if (CONSTANT_P (operands[2]))
return \"lda %1+%2,%0\";
else
return \"lda %1(%2),%0\";
}
return \"lda %2(%1),%0\"; return \"lda %2(%1),%0\";
}") }")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment