aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephane Carrez <Stephane.Carrez@worldnet.fr>2002-03-15 22:36:27 +0100
committerStephane Carrez <ciceron@gcc.gnu.org>2002-03-15 22:36:27 +0100
commit1d2d9def8281db63e5ea232ce2d29fccd0268ecb (patch)
tree930ca2ac00efc48116c9a1ab199d8edd084f9e5e
parenta0ccf503a84269f8e6813d8b2daf57dc214d8ba3 (diff)
downloadgcc-1d2d9def8281db63e5ea232ce2d29fccd0268ecb.zip
gcc-1d2d9def8281db63e5ea232ce2d29fccd0268ecb.tar.gz
gcc-1d2d9def8281db63e5ea232ce2d29fccd0268ecb.tar.bz2
larith.asm (___adddi3): Optimize saving of result.
* config/m68hc11/larith.asm (___adddi3): Optimize saving of result. (___subdi3): Likewise. (__mulsi3, __mulhi32): Avoid using _.tmp scratch location. (__map_data_section): Optimize 68hc11 case. From-SVN: r50835
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/m68hc11/larith.asm188
2 files changed, 116 insertions, 79 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c816757..6d76055 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2002-03-15 Stephane Carrez <Stephane.Carrez@worldnet.fr>
+ * config/m68hc11/larith.asm (___adddi3): Optimize saving of result.
+ (___subdi3): Likewise.
+ (__mulsi3, __mulhi32): Avoid using _.tmp scratch location.
+ (__map_data_section): Optimize 68hc11 case.
+
+2002-03-15 Stephane Carrez <Stephane.Carrez@worldnet.fr>
+
* config/m68hc11/m68hc11.c (m6812_cost): Make cost of add higher
than a shift to avoid adding a register with itself.
(m68hc11_memory_move_cost): Take into account NO_REGS.
diff --git a/gcc/config/m68hc11/larith.asm b/gcc/config/m68hc11/larith.asm
index 4c24dcc..b39d81a 100644
--- a/gcc/config/m68hc11/larith.asm
+++ b/gcc/config/m68hc11/larith.asm
@@ -1,5 +1,5 @@
/* libgcc routines for M68HC11 & M68HC12.
- Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of GNU CC.
@@ -352,39 +352,27 @@ End:
___adddi3:
tsx
- pshb
- psha
- ldd 8,x
+ xgdy
+ ldd 8,x ; Add LSB
addd 16,x
- pshb
- psha
+ std 6,y ; Save (carry preserved)
ldd 6,x
adcb 15,x
adca 14,x
- pshb
- psha
+ std 4,y
ldd 4,x
adcb 13,x
adca 12,x
- pshb
- psha
+ std 2,y
ldd 2,x
- adcb 11,x
+ adcb 11,x ; Add MSB
adca 10,x
- tsx
- ldy 6,x
-
std 0,y
- pulx
- stx 2,y
- pulx
- stx 4,y
- pulx
- stx 6,y
- pulx
+
+ xgdy
rts
#endif
@@ -394,40 +382,27 @@ ___adddi3:
___subdi3:
tsx
- pshb
- psha
- ldd 8,x
+ xgdy
+ ldd 8,x ; Subtract LSB
subd 16,x
- pshb
- psha
+ std 6,y ; Save, borrow preserved
ldd 6,x
sbcb 15,x
sbca 14,x
- pshb
- psha
+ std 4,y
ldd 4,x
sbcb 13,x
sbca 12,x
- pshb
- psha
+ std 2,y
- ldd 2,x
+ ldd 2,x ; Subtract MSB
sbcb 11,x
sbca 10,x
-
- tsx
- ldy 6,x
-
std 0,y
- pulx
- stx 2,y
- pulx
- stx 4,y
- pulx
- stx 6,y
- pulx
+
+ xgdy ;
rts
#endif
@@ -457,6 +432,7 @@ ___notdi2:
coma
comb
std 0,x
+ xgdx
rts
#endif
@@ -798,24 +774,73 @@ ___mulhi3:
emul
exg x,y
pulx
+ rts
#else
- stx *_.tmp
- pshb
- ldab *_.tmp+1
- mul ; A.high * B.low
- ldaa *_.tmp
- stab *_.tmp
- pulb
- pshb
- mul ; A.low * B.high
- addb *_.tmp
- stab *_.tmp
- ldaa *_.tmp+1
- pulb
- mul ; A.low * B.low
- adda *_.tmp
+#ifdef NO_TMP
+ ;
+ ; 16 bit multiplication without temp memory location.
+ ; (smaller but slower)
+ ;
+ pshx ; (4)
+ ins ; (3)
+ pshb ; (3)
+ psha ; (3)
+ pshx ; (4)
+ pula ; (4)
+ pulx ; (5)
+ mul ; (10) B.high * A.low
+ xgdx ; (3)
+ mul ; (10) B.low * A.high
+ abx ; (3)
+ pula ; (4)
+ pulb ; (4)
+ mul ; (10) B.low * A.low
+ pshx ; (4)
+ tsx ; (3)
+ adda 1,x ; (4)
+ pulx ; (5)
+ rts ; (5) 20 bytes
+ ; ---
+ ; 91 cycles
+#else
+ stx _.tmp ; (4/5)
+ pshb ; (3)
+ ldab _.tmp+1 ; (3/4)
+ mul ; (10) B.high * A.low
+ xgdx ; (3)
+ pulb ; (4)
+ stab _.tmp ; (3/4)
+ mul ; (10) B.low * A.high
+ abx ; (3)
+ ldd _.tmp ; (4/5)
+ mul ; (10) B.low * A.low
+ stx _.tmp ; (4)
+ adda _.tmp+1 ; (4/5)
+ rts ; (5) 20/26 bytes
+ ; ---
+ ; 70/76 cycles
+
+#ifdef OLD_MUL
+ stx *_.tmp ; (4)
+ pshb ; (3)
+ ldab *_.tmp+1 ; (3)
+ mul ; (10) A.high * B.low
+ ldaa *_.tmp ; (3)
+ stab *_.tmp ; (3)
+ pulb ; (4)
+ pshb ; (4)
+ mul ; (10) A.low * B.high
+ addb *_.tmp ; (4)
+ stab *_.tmp ; (3)
+ ldaa *_.tmp+1 ; (3)
+ pulb ; (4)
+ mul ; (10) A.low * B.low
+ adda *_.tmp ; (4)
+ rts ; (5) 24/32 bytes
+ ; 77/85 cycles
+#endif
+#endif
#endif
- rts
#endif
#ifdef L_mulhi32
@@ -830,14 +855,18 @@ ___mulhi3:
; b = value on stack
;
; +---------------+
-; | B low | <- 5,x
+; | B low | <- 7,x
; +---------------+
-; | B high | <- 4,x
+; | B high | <- 6,x
; +---------------+
; | PC low |
; +---------------+
; | PC high |
; +---------------+
+; | Tmp low |
+; +---------------+
+; | Tmp high |
+; +---------------+
; | A low |
; +---------------+
; | A high |
@@ -855,22 +884,24 @@ __mulhi32:
ldy 2,sp
emul
exg x,y
+ rts
#else
+ pshx ; Room for temp value
pshb
psha
tsx
- ldab 4,x
+ ldab 6,x
mul
xgdy ; A.high * B.high
- ldab 5,x
+ ldab 7,x
pula
mul ; A.high * B.low
- std *_.tmp
+ std 2,x
ldaa 1,x
- ldab 4,x
+ ldab 6,x
mul ; A.low * B.high
- addd *_.tmp
- stab *_.tmp
+ addd 2,x
+ stab 2,x
tab
aby
bcc N
@@ -878,18 +909,18 @@ __mulhi32:
aby
iny
N:
- ldab 5,x
+ ldab 7,x
pula
mul ; A.low * B.low
- adda *_.tmp
+ adda 2,x
+ pulx ; Drop temp location
+ pshy ; Put high part in X
+ pulx
bcc Ret
- iny
+ inx
Ret:
- pshy
- pulx
-#endif
rts
-
+#endif
#endif
#ifdef L_mulsi3
@@ -946,7 +977,7 @@ A_high = 2
;
; If A.high is 0, optimize into: (A.low * B.high) << 16 + (A.low * B.low)
;
- stx *_.tmp
+ cpx #0
beq A_high_zero
bsr ___mulhi3 ; A.high * B.low
;
@@ -1050,7 +1081,8 @@ A_low_B_low:
.sect .install2,"ax",@progbits
.globl __map_data_section
-
+ .globl __data_image
+ .globl __data_section_size
__map_data_section:
ldd #__data_section_size
beq Done
@@ -1061,14 +1093,12 @@ Loop:
movb 1,x+,1,y+
dbne d,Loop
#else
- psha
ldaa 0,x
staa 0,y
- pula
inx
iny
- subd #1
- bne Loop
+ cpx #__data_image_end
+ blt Loop
#endif
Done: