From: kazu Date: Thu, 13 Nov 2003 17:10:23 +0000 (+0000) Subject: * config/h8300/lib1funcs.asm (DenHighNonZero): Optimize using X-Git-Tag: upstream/4.9.2~75356 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4158f73b3bf75146c089f8083ff314cd48028ee8;p=platform%2Fupstream%2Flinaro-gcc.git * config/h8300/lib1funcs.asm (DenHighNonZero): Optimize using the approximate quotient method. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@73550 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0199852..4bf3f91 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2003-11-13 Pavel Pisa + Kazu Hirata + + * config/h8300/lib1funcs.asm (DenHighNonZero): Optimize using + the approximate quotient method. + 2003-11-13 Richard Earnshaw * combine.c (distribute_notes): When re-distributing the notes from diff --git a/gcc/config/h8300/lib1funcs.asm b/gcc/config/h8300/lib1funcs.asm index 7ef956f..d71a11e 100644 --- a/gcc/config/h8300/lib1funcs.asm +++ b/gcc/config/h8300/lib1funcs.asm @@ -603,32 +603,57 @@ divmodsi4: extu.l S0P rts + ; er0 = er0 / er1 + ; er4 = er0 % er1 + ; trashes er1 er2 + ; expects er1 >= 2^16 DenHighNonZero: - sub.l S0P,S0P ; zero play area - mov.w A0E,A2 - mov.b A2H,S0L - mov.b A2L,A2H - mov.b A0H,A2L - mov.w A2,A0E - mov.b A0L,A0H - mov.b #0,A0L - mov.b #24,S2H ; only do 24 iterations - -nextbit: - shll.l A0P ; double the answer guess - rotxl.l S0P ; double remainder - sub.l A1P,S0P ; does it all fit? - bhs setone - - add.l A1P,S0P ; no, restore mistake - dec S2H - bne nextbit - rts - -setone: - inc A0L - dec S2H - bne nextbit + mov.l er0,er4 + mov.l er1,er2 +#ifdef __H8300H__ +divmod_L21: + shlr.l er0 + shlr.l er2 ; make divisor < 2^16 + mov.w e2,e2 + bne divmod_L21 +#else + bra divmod_L22 +divmod_L21: + shlr.l #2,er0 +divmod_L22: + shlr.l #2,er2 ; make divisor < 2^16 + mov.w e2,e2 + bne divmod_L21 + rotxl.w r2 + bcs divmod_L23 + shlr.l er0 + bra divmod_L24 +divmod_L23: + rotxr.w r2 + shlr.l #2,er0 +divmod_L24: +#endif + ;; At this point, + ;; er0 contains shifted dividend + ;; er1 contains divisor + ;; er2 contains shifted divisor + ;; er4 contains dividend, later remainder + divxu.w r2,er0 ; e0 now contains the approximate quotient (AQ) + extu.l er0 + beq divmod_L25 + subs #1,er0 ; er0 = AQ - 1 + mov.w e1,r2 + mulxu.w r0,er2 ; er2 = upper (AQ - 1) * divisor + sub.w r2,e4 ; dividend - 65536 * er2 + mov.w r1,r2 + mulxu.w r0,er2 ; compute er4 = remainder (tentative) + sub.l er2,er4 ; er4 = dividend - (AQ - 1) * divisor +divmod_L25: + cmp.l er1,er4 ; is divisor < remainder? + blo divmod_L26 + adds #1,er0 + sub.l er1,er4 ; correct the remainder +divmod_L26: rts #endif