aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/bfin/predicates.md
diff options
context:
space:
mode:
authorJie Zhang <jie.zhang@analog.com>2006-05-31 16:46:15 +0000
committerJie Zhang <jiez@gcc.gnu.org>2006-05-31 16:46:15 +0000
commitb03149e1369b687b5ff9fc7d1fa831137f898018 (patch)
tree230b13d3e5a5908bbca6a831dabea1b17eca476b /gcc/config/bfin/predicates.md
parent5dd59f65cae29a0f1607598002405d488d2602a4 (diff)
downloadgcc-b03149e1369b687b5ff9fc7d1fa831137f898018.zip
gcc-b03149e1369b687b5ff9fc7d1fa831137f898018.tar.gz
gcc-b03149e1369b687b5ff9fc7d1fa831137f898018.tar.bz2
bfin-protos.h (bfin_hardware_loop): Declare.
* config/bfin/bfin-protos.h (bfin_hardware_loop): Declare. * config/bfin/bfin.c (basic-block.h): Include. (struct machine_function): New. (bfin_init_machine_status): New. (override_options): Initialize init_machine_status. (bfin_hardware_loop): New. (MAX_LOOP_DEPTH, MAX_LOOP_LENGTH): Define. (DEF_VEC_P (loop_info)): New. (DEF_VEC_ALLOC_P (loop_info,heap)): New. (struct loop_info): New. (loop_info): New typedef. (struct loop_work): New. (loop_work): New typedef. (DEF_VEC_O (loop_work)): New. (DEF_VEC_ALLOC_O (loop_work,heap)): New. (bfin_dump_loops): New. (bfin_bb_in_loop): New. (bfin_scan_loop): New. (bfin_optimize_loop): New. (bfin_reorg_loops): New. (bfin_reorg): Use bfin_reorg_loops. * config/bfin/bfin.h (FIRST_PSEUDO_REGISTER): Adjust for adding loop registers. (I_REGNO_P): Simplify. (DP_REGNO_P, DPREG_P): New macros. (REGISTER_NAMES, FIXED_REGISTERS, CALL_USED_REGISTERS, REG_ALLOC_ORDER): Add LT0, LT1, LC0, LC1, LB0, LB1. (enum reg_class, REG_CLASS_NAMES, REG_CLASS_CONTENTS): Add LT_REGS, LC_REGS, LB_REGS. (REG_CLASS_FROM_LETTER): Add 't' for LT_REGS, 'k' for LC_REGS, 'l' for LB_REGS. (REGNO_REG_CLASS): Deal with loop registers. * config/bfin/bfin.md: Add comment for 't', 'k', 'l' constraint letters. (REG_LT0, REG_LT1, REG_LC0, REG_LC1, REG_LB0, REG_LB1): New constants for loop registers. (UNSPEC_LSETUP_END): New. (seq_insns): New define_attr. Set it for appropriate insns. (movsi_insn): Add alternatives for move from/to loop count registers. (doloop_end): New define_expand. (loop_end): New define_insn. (define_split for bad doloop_end): New. (lsetup_with_autoinit): New define_insn. (lsetup_without_autoinit): New define_insn. (rep_movsi, rep_movhi): Clobber LT1, LC1, LB1. * config/bfin/predicates.md (lc_register_operand): New. (lt_register_operand): New. (lb_register_operand): New. (nondp_register_operand): New. (nondp_reg_or_memory_operand): New. * doc/md.texi: Document Blackfin new 't', 'k', 'l' constraint letters. From-SVN: r114274
Diffstat (limited to 'gcc/config/bfin/predicates.md')
-rw-r--r--gcc/config/bfin/predicates.md32
1 files changed, 32 insertions, 0 deletions
diff --git a/gcc/config/bfin/predicates.md b/gcc/config/bfin/predicates.md
index eccee2b..1415ea0 100644
--- a/gcc/config/bfin/predicates.md
+++ b/gcc/config/bfin/predicates.md
@@ -76,12 +76,44 @@
return 1;
})
+;; Return nonzero if OP is a LC register.
+(define_predicate "lc_register_operand"
+ (and (match_code "reg")
+ (match_test "REGNO (op) == REG_LC0 || REGNO (op) == REG_LC1")))
+
+;; Return nonzero if OP is a LT register.
+(define_predicate "lt_register_operand"
+ (and (match_code "reg")
+ (match_test "REGNO (op) == REG_LT0 || REGNO (op) == REG_LT1")))
+
+;; Return nonzero if OP is a LB register.
+(define_predicate "lb_register_operand"
+ (and (match_code "reg")
+ (match_test "REGNO (op) == REG_LB0 || REGNO (op) == REG_LB1")))
+
;; Return nonzero if OP is a register or a 7 bit signed constant.
(define_predicate "reg_or_7bit_operand"
(ior (match_operand 0 "register_operand")
(and (match_code "const_int")
(match_test "CONST_7BIT_IMM_P (INTVAL (op))"))))
+;; Return nonzero if OP is a register other than DREG and PREG.
+(define_predicate "nondp_register_operand"
+ (match_operand 0 "register_operand")
+{
+ unsigned int regno;
+ if (GET_CODE (op) == SUBREG)
+ op = SUBREG_REG (op);
+
+ regno = REGNO (op);
+ return (regno >= FIRST_PSEUDO_REGISTER || !DP_REGNO_P (regno));
+})
+
+;; Return nonzero if OP is a register other than DREG and PREG, or MEM.
+(define_predicate "nondp_reg_or_memory_operand"
+ (ior (match_operand 0 "nondp_register_operand")
+ (match_operand 0 "memory_operand")))
+
;; Used for secondary reloads, this function returns 1 if OP is of the
;; form (plus (fp) (const_int)).
(define_predicate "fp_plus_const_operand"