summaryrefslogtreecommitdiffstats
path: root/gcc
diff options
context:
space:
mode:
authornickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4>2000-04-24 18:48:41 +0000
committernickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4>2000-04-24 18:48:41 +0000
commit179b3afd94fbaa20585f89e9df0a8659de978524 (patch)
tree8c849a2cf2bd81d59ed1f52d97891a9f2075cdc1 /gcc
parentdf110950c06dc7cfca642cbe6bdeff9f7ea91b5f (diff)
downloadppe42-gcc-179b3afd94fbaa20585f89e9df0a8659de978524.tar.gz
ppe42-gcc-179b3afd94fbaa20585f89e9df0a8659de978524.zip
Fix bug building libgcc:
Do not generate small add insn if the source register is eliminable. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@33387 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/fr30/fr30.md11
2 files changed, 16 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7dd344a3e95..a8443a85be1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2000-04-24 Nick Clifton <nickc@cygnus.com>
+
+ * config/fr30/fr30.md (addsi3): Do not use small add instruction if
+ the source register is the frame pointer or arg pointer.
+ (addsi3_small_int): Disallow if source register is the frame
+ pointer or arg pointer.
+
2000-04-24 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* configure.in (ENUM_BITFIELDS_ARE_UNSIGNED): Delete redundant
diff --git a/gcc/config/fr30/fr30.md b/gcc/config/fr30/fr30.md
index afa2e2f2927..1b8d310d838 100644
--- a/gcc/config/fr30/fr30.md
+++ b/gcc/config/fr30/fr30.md
@@ -621,7 +621,10 @@
emit_insn (gen_addsi_regs (operands[0], operands[1], operands[2]));
else if (GET_CODE (operands[2]) != CONST_INT)
emit_insn (gen_addsi_big_int (operands[0], operands[1], operands[2]));
- else if ((INTVAL (operands[2]) >= -16) && (INTVAL (operands[2]) <= 15))
+ else if ( (REGNO (operands[1]) != FRAME_POINTER_REGNUM)
+ && (REGNO (operands[1]) != ARG_POINTER_REGNUM)
+ && (INTVAL (operands[2]) >= -16)
+ && (INTVAL (operands[2]) <= 15))
emit_insn (gen_addsi_small_int (operands[0], operands[1], operands[2]));
else
emit_insn (gen_addsi_big_int (operands[0], operands[1], operands[2]));
@@ -637,11 +640,15 @@
"addn %2, %0"
)
+;; Do not allow an eliminable register in the source register. It
+;; might be eliminated in favour of the stack pointer, probably
+;; increasing the offset, and so rendering the instruction illegal.
(define_insn "addsi_small_int"
[(set (match_operand:SI 0 "register_operand" "=r,r")
(plus:SI (match_operand:SI 1 "register_operand" "0,0")
(match_operand:SI 2 "add_immediate_operand" "I,J")))]
- ""
+ " (REGNO (operands[1]) != FRAME_POINTER_REGNUM)
+ && (REGNO (operands[1]) != ARG_POINTER_REGNUM)"
"@
addn %2, %0
addn2 %2, %0"
OpenPOWER on IntegriCloud