aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/moxie
diff options
context:
space:
mode:
authorAnthony Green <green@moxielogic.com>2009-06-11 12:07:19 +0000
committerAnthony Green <green@gcc.gnu.org>2009-06-11 12:07:19 +0000
commit6be6462e0081b3eef6628546fc4f7648db62c6c4 (patch)
treedd8f088f88a4d02435a24e46bb44a2cb3b1904f9 /gcc/config/moxie
parent4ec80803fba73fe898bfc42c57b236c1ca98aaf1 (diff)
downloadgcc-6be6462e0081b3eef6628546fc4f7648db62c6c4.zip
gcc-6be6462e0081b3eef6628546fc4f7648db62c6c4.tar.gz
gcc-6be6462e0081b3eef6628546fc4f7648db62c6c4.tar.bz2
Add PC-relative branch support to Moxie port.
From-SVN: r148390
Diffstat (limited to 'gcc/config/moxie')
-rw-r--r--gcc/config/moxie/moxie.h2
-rw-r--r--gcc/config/moxie/moxie.md48
2 files changed, 36 insertions, 14 deletions
diff --git a/gcc/config/moxie/moxie.h b/gcc/config/moxie/moxie.h
index 6685b09..e631909 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 f0d159d..7f3729f 100644
--- a/gcc/config/moxie/moxie.md
+++ b/gcc/config/moxie/moxie.md
@@ -19,12 +19,15 @@
;; <http://www.gnu.org/licenses/>.
;; -------------------------------------------------------------------------
-;; 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<cond:code>"
[(set (pc)
@@ -337,7 +346,15 @@ if (GET_CODE (operands[2]) != REG)
(label_ref (match_operand 0 "" ""))
(pc)))]
""
- "b<CC> %l0")
+{
+ if (get_attr_length (insn) == 2)
+ return "b<CC> %l0";
+ else
+ return "b<rCC> .+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")])
;; -------------------------------------------------------------------------