Add PC-relative branch support to Moxie port.
From-SVN: r148390
This commit is contained in:
parent
4ec80803fb
commit
6be6462e00
|
@ -1,3 +1,12 @@
|
||||||
|
2009-06-11 Anthony Green <green@moxielogic.com>
|
||||||
|
|
||||||
|
* config/moxie/moxie.md: Define length attribute for all
|
||||||
|
instructions.
|
||||||
|
(rCC): Define.
|
||||||
|
(*b<cond:code>): Support limited branch ranges for new PC-relative
|
||||||
|
branch instructions.
|
||||||
|
* config/moxie/moxie.h (HAS_LONG_UNCOND_BRANCH): Define.
|
||||||
|
|
||||||
2009-06-11 Jakub Jelinek <jakub@redhat.com>
|
2009-06-11 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
* config/i386/i386.c (min_insn_size): Use get_attr_length
|
* config/i386/i386.c (min_insn_size): Use get_attr_length
|
||||||
|
|
|
@ -571,4 +571,6 @@ do \
|
||||||
builtin_define_std ("MOXIE"); \
|
builtin_define_std ("MOXIE"); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define HAS_LONG_UNCOND_BRANCH true
|
||||||
|
|
||||||
#endif /* GCC_MOXIE_H */
|
#endif /* GCC_MOXIE_H */
|
||||||
|
|
|
@ -19,12 +19,15 @@
|
||||||
;; <http://www.gnu.org/licenses/>.
|
;; <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
;; -------------------------------------------------------------------------
|
;; -------------------------------------------------------------------------
|
||||||
;; Moxie specific constraints
|
;; Moxie specific constraints, predicates and attributes
|
||||||
;; -------------------------------------------------------------------------
|
;; -------------------------------------------------------------------------
|
||||||
|
|
||||||
(include "constraints.md")
|
(include "constraints.md")
|
||||||
(include "predicates.md")
|
(include "predicates.md")
|
||||||
|
|
||||||
|
; Most instructions are two bytes long.
|
||||||
|
(define_attr "length" "" (const_int 2))
|
||||||
|
|
||||||
;; -------------------------------------------------------------------------
|
;; -------------------------------------------------------------------------
|
||||||
;; nop instruction
|
;; nop instruction
|
||||||
;; -------------------------------------------------------------------------
|
;; -------------------------------------------------------------------------
|
||||||
|
@ -232,7 +235,8 @@
|
||||||
ld.l %0, %1
|
ld.l %0, %1
|
||||||
lda.l %0, %1
|
lda.l %0, %1
|
||||||
sto.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"
|
(define_expand "movqi"
|
||||||
[(set (match_operand:QI 0 "general_operand" "")
|
[(set (match_operand:QI 0 "general_operand" "")
|
||||||
|
@ -258,7 +262,8 @@
|
||||||
ld.b %0, %1
|
ld.b %0, %1
|
||||||
lda.b %0, %1
|
lda.b %0, %1
|
||||||
sto.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"
|
(define_expand "movhi"
|
||||||
[(set (match_operand:HI 0 "general_operand" "")
|
[(set (match_operand:HI 0 "general_operand" "")
|
||||||
|
@ -284,7 +289,8 @@
|
||||||
ld.s %0, %1
|
ld.s %0, %1
|
||||||
lda.s %0, %1
|
lda.s %0, %1
|
||||||
sto.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
|
;; Compare instructions
|
||||||
|
@ -305,12 +311,12 @@
|
||||||
(pc)))]
|
(pc)))]
|
||||||
""
|
""
|
||||||
"
|
"
|
||||||
/* Force the compare operands into registers. */
|
/* Force the compare operands into registers. */
|
||||||
if (GET_CODE (operands[1]) != REG)
|
if (GET_CODE (operands[1]) != REG)
|
||||||
operands[1] = force_reg (SImode, operands[1]);
|
operands[1] = force_reg (SImode, operands[1]);
|
||||||
if (GET_CODE (operands[2]) != REG)
|
if (GET_CODE (operands[2]) != REG)
|
||||||
operands[2] = force_reg (SImode, operands[2]);
|
operands[2] = force_reg (SImode, operands[2]);
|
||||||
")
|
")
|
||||||
|
|
||||||
(define_insn "*cmpsi"
|
(define_insn "*cmpsi"
|
||||||
[(set (reg:CC CC_REG)
|
[(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")
|
(define_code_attr CC [(ne "ne") (eq "eq") (lt "lt") (ltu "ltu")
|
||||||
(gt "gt") (gtu "gtu") (ge "ge") (le "le")
|
(gt "gt") (gtu "gtu") (ge "ge") (le "le")
|
||||||
(geu "geu") (leu "leu") ])
|
(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>"
|
(define_insn "*b<cond:code>"
|
||||||
[(set (pc)
|
[(set (pc)
|
||||||
|
@ -337,7 +346,15 @@ if (GET_CODE (operands[2]) != REG)
|
||||||
(label_ref (match_operand 0 "" ""))
|
(label_ref (match_operand 0 "" ""))
|
||||||
(pc)))]
|
(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
|
;; Call and Jump instructions
|
||||||
|
@ -358,7 +375,8 @@ if (GET_CODE (operands[2]) != REG)
|
||||||
""
|
""
|
||||||
"@
|
"@
|
||||||
jsra %0
|
jsra %0
|
||||||
jsr %0")
|
jsr %0"
|
||||||
|
[(set_attr "length" "6,2")])
|
||||||
|
|
||||||
(define_expand "call_value"
|
(define_expand "call_value"
|
||||||
[(set (match_operand 0 "" "")
|
[(set (match_operand 0 "" "")
|
||||||
|
@ -375,7 +393,8 @@ if (GET_CODE (operands[2]) != REG)
|
||||||
1 "immediate_operand" "i"))
|
1 "immediate_operand" "i"))
|
||||||
(match_operand 2 "" "")))]
|
(match_operand 2 "" "")))]
|
||||||
""
|
""
|
||||||
"jsra %1")
|
"jsra %1"
|
||||||
|
[(set_attr "length" "6")])
|
||||||
|
|
||||||
(define_insn "*call_value_indirect"
|
(define_insn "*call_value_indirect"
|
||||||
[(set (match_operand 0 "register_operand" "=r")
|
[(set (match_operand 0 "register_operand" "=r")
|
||||||
|
@ -394,7 +413,8 @@ if (GET_CODE (operands[2]) != REG)
|
||||||
[(set (pc)
|
[(set (pc)
|
||||||
(label_ref (match_operand 0 "" "")))]
|
(label_ref (match_operand 0 "" "")))]
|
||||||
""
|
""
|
||||||
"jmpa %l0")
|
"jmpa %l0"
|
||||||
|
[(set_attr "length" "6")])
|
||||||
|
|
||||||
|
|
||||||
;; -------------------------------------------------------------------------
|
;; -------------------------------------------------------------------------
|
||||||
|
|
Loading…
Reference in New Issue