mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-31 02:34:44 +08:00
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
This commit is contained in:
parent
a0ccf503a8
commit
1d2d9def82
@ -1,3 +1,10 @@
|
||||
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
|
||||
|
@ -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
|
||||
#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
|
||||
#endif
|
||||
rts
|
||||
#else
|
||||
#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
|
||||
#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
|
||||
bcc Ret
|
||||
iny
|
||||
Ret:
|
||||
pshy
|
||||
adda 2,x
|
||||
pulx ; Drop temp location
|
||||
pshy ; Put high part in X
|
||||
pulx
|
||||
#endif
|
||||
bcc Ret
|
||||
inx
|
||||
Ret:
|
||||
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:
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user