+2005-05-18 Jie Zhang <jie.zhang@analog.com>
+ Bernd Schmidt <bernd.schmidt@analog.com>
+
+ * config/bfin/bfin.c (branch_dest): Add comment why it's
+ necessary.
+ * config/bfin/bfin.md (attr "length" default): Change the offset of
+ forward conditional branch of length 4 from 4096 to 4092.
+
2005-05-19 Jan Beulich <jbeulich@novell.com>
* unwind-compat.c: Include tconfig.h and tsystem.h.
flag_schedule_insns = 0;
}
-/* Return the destination address of BRANCH. */
+/* Return the destination address of BRANCH.
+ We need to use this instead of get_attr_length, because the
+ cbranch_with_nops pattern conservatively sets its length to 6, and
+ we still prefer to use shorter sequences. */
static int
branch_dest (rtx branch)
;;; if cc jmp; jump.[sl] offset
;;; offset of jump.[sl] is from the jump instruction but
;;; gcc calculates length from the if cc jmp instruction
-;;; hence our range is (-4094, 4096) instead of (-4096, 4094) for a br
+;;; furthermore gcc takes the end address of the branch instruction
+;;; as (pc) for a forward branch
+;;; hence our range is (-4094, 4092) instead of (-4096, 4094) for a br
;;;
;;; The way the (pc) rtx works in these calculations is somewhat odd;
;;; for backward branches it's the address of the current instruction,
(ge (minus (match_dup 3) (pc)) (const_int -1024)))
(const_int 2)
(and
- (le (minus (match_dup 3) (pc)) (const_int 4096))
+ (le (minus (match_dup 3) (pc)) (const_int 4092))
(ge (minus (match_dup 3) (pc)) (const_int -4094)))
(const_int 4)]
(const_int 6))