From 6be6462e0081b3eef6628546fc4f7648db62c6c4 Mon Sep 17 00:00:00 2001 From: Anthony Green Date: Thu, 11 Jun 2009 12:07:19 +0000 Subject: [PATCH] Add PC-relative branch support to Moxie port. From-SVN: r148390 --- gcc/ChangeLog | 9 ++++++++ gcc/config/moxie/moxie.h | 2 ++ gcc/config/moxie/moxie.md | 48 +++++++++++++++++++++++++++------------ 3 files changed, 45 insertions(+), 14 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 42c245ca385..3e39a7408ec 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2009-06-11 Anthony Green + + * config/moxie/moxie.md: Define length attribute for all + instructions. + (rCC): Define. + (*b): Support limited branch ranges for new PC-relative + branch instructions. + * config/moxie/moxie.h (HAS_LONG_UNCOND_BRANCH): Define. + 2009-06-11 Jakub Jelinek * config/i386/i386.c (min_insn_size): Use get_attr_length diff --git a/gcc/config/moxie/moxie.h b/gcc/config/moxie/moxie.h index 6685b0941ea..e63190978f0 100644 --- a/gcc/config/moxie/moxie.h +++ b/gcc/config/moxie/moxie.h @@ -571,4 +571,6 @@ do \ builtin_define_std ("MOXIE"); \ } +#define HAS_LONG_UNCOND_BRANCH true + #endif /* GCC_MOXIE_H */ diff --git a/gcc/config/moxie/moxie.md b/gcc/config/moxie/moxie.md index f0d159d102d..7f3729fdad5 100644 --- a/gcc/config/moxie/moxie.md +++ b/gcc/config/moxie/moxie.md @@ -19,12 +19,15 @@ ;; . ;; ------------------------------------------------------------------------- -;; Moxie specific constraints +;; Moxie specific constraints, predicates and attributes ;; ------------------------------------------------------------------------- (include "constraints.md") (include "predicates.md") +; Most instructions are two bytes long. +(define_attr "length" "" (const_int 2)) + ;; ------------------------------------------------------------------------- ;; nop instruction ;; ------------------------------------------------------------------------- @@ -232,7 +235,8 @@ ld.l %0, %1 lda.l %0, %1 sto.l %0, %1 - ldo.l %0, %1") + ldo.l %0, %1" + [(set_attr "length" "2,6,2,6,2,6,6,6")]) (define_expand "movqi" [(set (match_operand:QI 0 "general_operand" "") @@ -258,7 +262,8 @@ ld.b %0, %1 lda.b %0, %1 sto.b %0, %1 - ldo.b %0, %1") + ldo.b %0, %1" + [(set_attr "length" "2,6,2,6,2,6,6,6")]) (define_expand "movhi" [(set (match_operand:HI 0 "general_operand" "") @@ -284,7 +289,8 @@ ld.s %0, %1 lda.s %0, %1 sto.s %0, %1 - ldo.s %0, %1") + ldo.s %0, %1" + [(set_attr "length" "2,6,2,6,2,6,6,6")]) ;; ------------------------------------------------------------------------- ;; Compare instructions @@ -305,12 +311,12 @@ (pc)))] "" " -/* Force the compare operands into registers. */ -if (GET_CODE (operands[1]) != REG) - operands[1] = force_reg (SImode, operands[1]); -if (GET_CODE (operands[2]) != REG) - operands[2] = force_reg (SImode, operands[2]); -") + /* Force the compare operands into registers. */ + if (GET_CODE (operands[1]) != REG) + operands[1] = force_reg (SImode, operands[1]); + if (GET_CODE (operands[2]) != REG) + operands[2] = force_reg (SImode, operands[2]); + ") (define_insn "*cmpsi" [(set (reg:CC CC_REG) @@ -329,6 +335,9 @@ if (GET_CODE (operands[2]) != REG) (define_code_attr CC [(ne "ne") (eq "eq") (lt "lt") (ltu "ltu") (gt "gt") (gtu "gtu") (ge "ge") (le "le") (geu "geu") (leu "leu") ]) +(define_code_attr rCC [(ne "eq") (eq "ne") (lt "ge") (ltu "geu") + (gt "le") (gtu "leu") (ge "lt") (le "gt") + (geu "ltu") (leu "gtu") ]) (define_insn "*b" [(set (pc) @@ -337,7 +346,15 @@ if (GET_CODE (operands[2]) != REG) (label_ref (match_operand 0 "" "")) (pc)))] "" - "b %l0") +{ + if (get_attr_length (insn) == 2) + return "b %l0"; + else + return "b .+6\n\tjmpa %l0"; +} + [(set (attr "length") + (if_then_else (lt (abs (minus (pc) (match_dup 0))) (const_int 1022)) + (const_int 2) (const_int 8)))]) ;; ------------------------------------------------------------------------- ;; Call and Jump instructions @@ -358,7 +375,8 @@ if (GET_CODE (operands[2]) != REG) "" "@ jsra %0 - jsr %0") + jsr %0" + [(set_attr "length" "6,2")]) (define_expand "call_value" [(set (match_operand 0 "" "") @@ -375,7 +393,8 @@ if (GET_CODE (operands[2]) != REG) 1 "immediate_operand" "i")) (match_operand 2 "" "")))] "" - "jsra %1") + "jsra %1" + [(set_attr "length" "6")]) (define_insn "*call_value_indirect" [(set (match_operand 0 "register_operand" "=r") @@ -394,7 +413,8 @@ if (GET_CODE (operands[2]) != REG) [(set (pc) (label_ref (match_operand 0 "" "")))] "" - "jmpa %l0") + "jmpa %l0" + [(set_attr "length" "6")]) ;; ------------------------------------------------------------------------- -- 2.30.2