m68hc11.c (m68hc11_shift_operator): New function.
* config/m68hc11/m68hc11.c (m68hc11_shift_operator): New function. * config/m68hc11/m68hc11-protos.h (m68hc11_shift_operator): Declare. * config/m68hc11/m68hc11.h (PREDICATE_CODES): Register. * config/m68hc11/m68hc11.md ("rotrhi3", "rotlhi3"): New patterns for rotatert and rotate. ("rotrhi3_const", "rotlhi3_const"): Rename of old 'rotrhi3' insns. ("*rotrhi3", "*rotlhi3"): New insn pattern for non-const rotatert. ("*rotrhi3_addr"): New split for shift insns on address register. ("*lshrhi3", "*ashrhi3", "*ashlhi3_2"): Use new split. * config/m68hc11/larith.asm (___rotlhi3): New asm function. (___rotrhi3): Likewise. * config/m68hc11/t-m68hc11-gas (LIB1ASMFUNCS): Build them. From-SVN: r63677
This commit is contained in:
parent
b1cbe78c09
commit
b45e9837a7
@ -1,3 +1,18 @@
|
||||
2003-03-02 Stephane Carrez <stcarrez@nerim.fr>
|
||||
|
||||
* config/m68hc11/m68hc11.c (m68hc11_shift_operator): New function.
|
||||
* config/m68hc11/m68hc11-protos.h (m68hc11_shift_operator): Declare.
|
||||
* config/m68hc11/m68hc11.h (PREDICATE_CODES): Register.
|
||||
* config/m68hc11/m68hc11.md ("rotrhi3", "rotlhi3"): New patterns for
|
||||
rotatert and rotate.
|
||||
("rotrhi3_const", "rotlhi3_const"): Rename of old 'rotrhi3' insns.
|
||||
("*rotrhi3", "*rotlhi3"): New insn pattern for non-const rotatert.
|
||||
("*rotrhi3_addr"): New split for shift insns on address register.
|
||||
("*lshrhi3", "*ashrhi3", "*ashlhi3_2"): Use new split.
|
||||
* config/m68hc11/larith.asm (___rotlhi3): New asm function.
|
||||
(___rotrhi3): Likewise.
|
||||
* config/m68hc11/t-m68hc11-gas (LIB1ASMFUNCS): Build them.
|
||||
|
||||
2003-03-02 Neil Booth <neil@daikokuya.co.uk>
|
||||
|
||||
* toplev.c (aux_base_name): Moved from toplev.h.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* libgcc routines for M68HC11 & M68HC12.
|
||||
Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU CC.
|
||||
|
||||
@ -578,6 +578,47 @@ Return_zero:
|
||||
rts
|
||||
#endif
|
||||
|
||||
#ifdef L_rotrhi3
|
||||
.sect .text
|
||||
.globl ___rotrhi3
|
||||
|
||||
___rotrhi3:
|
||||
xgdx
|
||||
clra
|
||||
andb #0x0f
|
||||
xgdx
|
||||
beq Return
|
||||
Loop:
|
||||
tap
|
||||
rorb
|
||||
rora
|
||||
dex
|
||||
bne Loop
|
||||
Return:
|
||||
rts
|
||||
#endif
|
||||
|
||||
#ifdef L_rotlhi3
|
||||
.sect .text
|
||||
.globl ___rotlhi3
|
||||
|
||||
___rotlhi3:
|
||||
xgdx
|
||||
clra
|
||||
andb #0x0f
|
||||
xgdx
|
||||
beq Return
|
||||
Loop:
|
||||
asrb
|
||||
rolb
|
||||
rola
|
||||
rolb
|
||||
dex
|
||||
bne Loop
|
||||
Return:
|
||||
rts
|
||||
#endif
|
||||
|
||||
#ifdef L_ashrhi3
|
||||
.sect .text
|
||||
.globl ___ashrhi3
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Prototypes for exported functions defined in m68hc11.c
|
||||
Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
Contributed by Stephane Carrez (stcarrez@nerim.fr)
|
||||
|
||||
This file is part of GNU CC.
|
||||
@ -117,6 +117,7 @@ extern int arith_src_operand PARAMS((rtx, enum machine_mode));
|
||||
extern int m68hc11_logical_operator PARAMS((rtx, enum machine_mode));
|
||||
extern int m68hc11_arith_operator PARAMS((rtx, enum machine_mode));
|
||||
extern int m68hc11_non_shift_operator PARAMS((rtx, enum machine_mode));
|
||||
extern int m68hc11_shift_operator PARAMS((rtx, enum machine_mode));
|
||||
extern int m68hc11_unary_operator PARAMS((rtx, enum machine_mode));
|
||||
extern int non_push_operand PARAMS((rtx, enum machine_mode));
|
||||
extern int hard_reg_operand PARAMS((rtx, enum machine_mode));
|
||||
|
@ -1140,6 +1140,16 @@ m68hc11_non_shift_operator (op, mode)
|
||||
|| GET_CODE (op) == PLUS || GET_CODE (op) == MINUS;
|
||||
}
|
||||
|
||||
/* Return true if op is a shift operator. */
|
||||
int
|
||||
m68hc11_shift_operator (op, mode)
|
||||
register rtx op;
|
||||
enum machine_mode mode ATTRIBUTE_UNUSED;
|
||||
{
|
||||
return GET_CODE (op) == ROTATE || GET_CODE (op) == ROTATERT
|
||||
|| GET_CODE (op) == LSHIFTRT || GET_CODE (op) == ASHIFT
|
||||
|| GET_CODE (op) == ASHIFTRT;
|
||||
}
|
||||
|
||||
int
|
||||
m68hc11_unary_operator (op, mode)
|
||||
|
@ -1643,6 +1643,7 @@ do { \
|
||||
ROTATE, ROTATERT }}, \
|
||||
{"m68hc11_non_shift_operator", {AND, IOR, XOR, PLUS, MINUS}}, \
|
||||
{"m68hc11_unary_operator", {NEG, NOT, SIGN_EXTEND, ZERO_EXTEND}}, \
|
||||
{"m68hc11_shift_operator", {ASHIFT, ASHIFTRT, LSHIFTRT, ROTATE, ROTATERT}},\
|
||||
{"non_push_operand", {SUBREG, REG, MEM}}, \
|
||||
{"reg_or_some_mem_operand", {SUBREG, REG, MEM}}, \
|
||||
{"tst_operand", {SUBREG, REG, MEM}}, \
|
||||
|
@ -4757,13 +4757,16 @@
|
||||
|
||||
|
||||
(define_insn "*ashlhi3_2"
|
||||
[(set (match_operand:HI 0 "register_operand" "=d")
|
||||
(ashift:HI (match_operand:HI 1 "register_operand" "0")
|
||||
(match_operand:HI 2 "register_operand" "+x")))
|
||||
[(set (match_operand:HI 0 "register_operand" "=d,*x")
|
||||
(ashift:HI (match_operand:HI 1 "register_operand" "0,0")
|
||||
(match_operand:HI 2 "register_operand" "+x,+d")))
|
||||
(clobber (match_dup 2))]
|
||||
""
|
||||
"*
|
||||
{
|
||||
if (A_REG_P (operands[0]))
|
||||
return \"#\";
|
||||
|
||||
CC_STATUS_INIT;
|
||||
return \"bsr\\t___lshlhi3\";
|
||||
}")
|
||||
@ -5046,21 +5049,17 @@
|
||||
}")
|
||||
|
||||
(define_insn "*ashrhi3"
|
||||
[(set (match_operand:HI 0 "register_operand" "=d,x")
|
||||
[(set (match_operand:HI 0 "register_operand" "=d,*x")
|
||||
(ashiftrt:HI (match_operand:HI 1 "register_operand" "0,0")
|
||||
(match_operand:HI 2 "register_operand" "+x,+d")))
|
||||
(clobber (match_dup 2))]
|
||||
""
|
||||
"*
|
||||
{
|
||||
CC_STATUS_INIT;
|
||||
if (D_REG_P (operands[2]))
|
||||
output_asm_insn (\"xgd%0\", operands);
|
||||
if (A_REG_P (operands[0]))
|
||||
return \"#\";
|
||||
|
||||
output_asm_insn (\"bsr\\t___ashrhi3\", operands);
|
||||
if (D_REG_P (operands[2]))
|
||||
output_asm_insn (\"xgd%0\", operands);
|
||||
|
||||
return \"\";
|
||||
}")
|
||||
|
||||
@ -5594,22 +5593,17 @@
|
||||
}")
|
||||
|
||||
(define_insn "*lshrhi3"
|
||||
[(set (match_operand:HI 0 "register_operand" "=d,x")
|
||||
[(set (match_operand:HI 0 "register_operand" "=d,*x")
|
||||
(lshiftrt:HI (match_operand:HI 1 "register_operand" "0,0")
|
||||
(match_operand:HI 2 "register_operand" "+x,+d")))
|
||||
(clobber (match_dup 2))]
|
||||
""
|
||||
"*
|
||||
{
|
||||
CC_STATUS_INIT;
|
||||
if (D_REG_P (operands[2]))
|
||||
output_asm_insn (\"xgd%0\", operands);
|
||||
if (A_REG_P (operands[0]))
|
||||
return \"#\";
|
||||
|
||||
output_asm_insn (\"bsr\\t___lshrhi3\", operands);
|
||||
if (D_REG_P (operands[2]))
|
||||
output_asm_insn (\"xgd%0\", operands);
|
||||
|
||||
return \"\";
|
||||
return \"bsr\\t___lshrhi3\";
|
||||
}")
|
||||
|
||||
(define_expand "lshrqi3"
|
||||
@ -5780,17 +5774,6 @@
|
||||
return \"\";
|
||||
}")
|
||||
|
||||
(define_insn "rotlhi3"
|
||||
[(set (match_operand:HI 0 "register_operand" "=d")
|
||||
(rotate:HI (match_operand:HI 1 "register_operand" "0")
|
||||
(match_operand:HI 2 "const_int_operand" "i")))]
|
||||
""
|
||||
"*
|
||||
{
|
||||
m68hc11_gen_rotate (ROTATE, insn, operands);
|
||||
return \"\";
|
||||
}")
|
||||
|
||||
(define_insn "rotrqi3"
|
||||
[(set (match_operand:QI 0 "register_operand" "=d,!q")
|
||||
(rotatert:QI (match_operand:QI 1 "register_operand" "0,0")
|
||||
@ -5802,7 +5785,78 @@
|
||||
return \"\";
|
||||
}")
|
||||
|
||||
(define_insn "rotrhi3"
|
||||
(define_expand "rotlhi3"
|
||||
[(set (match_operand:HI 0 "register_operand" "")
|
||||
(rotate:HI (match_operand:HI 1 "general_operand" "")
|
||||
(match_operand:HI 2 "general_operand" "")))]
|
||||
""
|
||||
"
|
||||
{
|
||||
if (GET_CODE (operands[2]) != CONST_INT)
|
||||
{
|
||||
rtx scratch = gen_reg_rtx (HImode);
|
||||
operand1 = force_reg (HImode, operand1);
|
||||
|
||||
emit_move_insn (scratch, operands[2]);
|
||||
emit_insn (gen_rtx (PARALLEL, VOIDmode,
|
||||
gen_rtvec (2, gen_rtx (SET, VOIDmode,
|
||||
operand0,
|
||||
gen_rtx_ROTATE (HImode,
|
||||
operand1, scratch)),
|
||||
gen_rtx (CLOBBER, VOIDmode, scratch))));
|
||||
DONE;
|
||||
}
|
||||
}")
|
||||
|
||||
(define_insn "rotlhi3_const"
|
||||
[(set (match_operand:HI 0 "register_operand" "=d")
|
||||
(rotate:HI (match_operand:HI 1 "register_operand" "0")
|
||||
(match_operand:HI 2 "const_int_operand" "i")))]
|
||||
""
|
||||
"*
|
||||
{
|
||||
m68hc11_gen_rotate (ROTATE, insn, operands);
|
||||
return \"\";
|
||||
}")
|
||||
|
||||
(define_insn "*rotlhi3"
|
||||
[(set (match_operand:HI 0 "register_operand" "=d,*x")
|
||||
(rotate:HI (match_operand:HI 1 "register_operand" "0,0")
|
||||
(match_operand:HI 2 "general_operand" "+x,+d")))
|
||||
(clobber (match_dup 2))]
|
||||
""
|
||||
"*
|
||||
{
|
||||
if (A_REG_P (operands[0]))
|
||||
return \"#\";
|
||||
|
||||
return \"bsr\\t___rotlhi3\";
|
||||
}")
|
||||
|
||||
(define_expand "rotrhi3"
|
||||
[(set (match_operand:HI 0 "register_operand" "")
|
||||
(rotatert:HI (match_operand:HI 1 "general_operand" "")
|
||||
(match_operand:HI 2 "general_operand" "")))]
|
||||
""
|
||||
"
|
||||
{
|
||||
if (GET_CODE (operands[2]) != CONST_INT)
|
||||
{
|
||||
rtx scratch = gen_reg_rtx (HImode);
|
||||
operand1 = force_reg (HImode, operand1);
|
||||
|
||||
emit_move_insn (scratch, operands[2]);
|
||||
emit_insn (gen_rtx (PARALLEL, VOIDmode,
|
||||
gen_rtvec (2, gen_rtx (SET, VOIDmode,
|
||||
operand0,
|
||||
gen_rtx_ROTATERT (HImode,
|
||||
operand1, scratch)),
|
||||
gen_rtx (CLOBBER, VOIDmode, scratch))));
|
||||
DONE;
|
||||
}
|
||||
}")
|
||||
|
||||
(define_insn "rotrhi3_const"
|
||||
[(set (match_operand:HI 0 "register_operand" "=d")
|
||||
(rotatert:HI (match_operand:HI 1 "register_operand" "0")
|
||||
(match_operand:HI 2 "const_int_operand" "i")))]
|
||||
@ -5813,6 +5867,38 @@
|
||||
return \"\";
|
||||
}")
|
||||
|
||||
(define_insn "*rotrhi3"
|
||||
[(set (match_operand:HI 0 "register_operand" "=d,*x")
|
||||
(rotatert:HI (match_operand:HI 1 "register_operand" "0,0")
|
||||
(match_operand:HI 2 "general_operand" "+x,+d")))
|
||||
(clobber (match_dup 2))]
|
||||
""
|
||||
"*
|
||||
{
|
||||
if (A_REG_P (operands[0]))
|
||||
return \"#\";
|
||||
|
||||
return \"bsr\\t___rotrhi3\";
|
||||
}")
|
||||
|
||||
;; Split a shift operation on an address register in a shift
|
||||
;; on D_REGNUM.
|
||||
(define_split /* "*rotrhi3_addr" */
|
||||
[(set (match_operand:HI 0 "hard_addr_reg_operand" "")
|
||||
(match_operator:HI 3 "m68hc11_shift_operator"
|
||||
[(match_operand:HI 1 "register_operand" "")
|
||||
(match_operand:HI 2 "register_operand" "")]))
|
||||
(clobber (match_dup 2))]
|
||||
"z_replacement_completed == 2"
|
||||
[(parallel [(set (reg:HI D_REGNUM) (match_dup 0))
|
||||
(set (match_dup 0) (reg:HI D_REGNUM))])
|
||||
(parallel [(set (reg:HI D_REGNUM)
|
||||
(match_op_dup 3 [(reg:HI D_REGNUM) (match_dup 0)]))
|
||||
(clobber (match_dup 0))])
|
||||
(parallel [(set (reg:HI D_REGNUM) (match_dup 0))
|
||||
(set (match_dup 0) (reg:HI D_REGNUM))])]
|
||||
"")
|
||||
|
||||
;;--------------------------------------------------------------------
|
||||
;;- Jumps and transfers
|
||||
;;--------------------------------------------------------------------
|
||||
|
@ -23,7 +23,7 @@ LIB1ASMFUNCS = _mulsi3 \
|
||||
_regs_min _regs_frame _regs_d1_2 \
|
||||
_regs_d3_4 _regs_d5_6 _regs_d7_8 _regs_d9_16 _regs_d17_32 \
|
||||
_premain __exit _abort _cleanup \
|
||||
_adddi3 _subdi3 _notdi2 \
|
||||
_adddi3 _subdi3 _notdi2 _rotlhi3 _rotrhi3 \
|
||||
_ashrhi3 _lshrhi3 _lshlhi3 _ashrqi3 _lshlqi3 _map_data _init_bss \
|
||||
_ctor _dtor __far_trampoline
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user