X-Git-Url: https://git.gag.com/?a=blobdiff_plain;ds=sidebyside;f=device%2Flib%2F_mulint.c;h=387585c02b16b67075decfc889f76c969ac268f4;hb=f983558a0e07566cf65dca67cddd3f4bf81328e0;hp=69a7cd41ab0a6e24d1182d26f25b33480c42db28;hpb=048d76a318a2ff472182d85bfbe02369251bb08a;p=fw%2Fsdcc diff --git a/device/lib/_mulint.c b/device/lib/_mulint.c index 69a7cd41..387585c0 100644 --- a/device/lib/_mulint.c +++ b/device/lib/_mulint.c @@ -1,35 +1,30 @@ /*------------------------------------------------------------------------- - - _mulint.c :- routine for (unsigned) int (16 bit) multiplication + _mulint.c :- routine for (unsigned) int (16 bit) multiplication Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999) - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, + + This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License + GNU Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - + In other words, you are welcome to use, share and improve this program. You are forbidden to forbid anyone else to use, share and improve - what you give them. Help stamp out software-hoarding! + what you give them. Help stamp out software-hoarding! -------------------------------------------------------------------------*/ /* Signed and unsigned multiplication are the same - as long as the output has the same precision as the input. - To do: _muluint and _mulsint should be replaced by _mulint. - - bernhard@bernhardheld.de - Assembler-functions are provided for: ds390 mcs51 small @@ -37,14 +32,14 @@ mcs51 large */ -#if !defined(SDCC_USE_XSTACK) || defined(_SDCC_NO_ASM_LIB_FUNCS) +#if !defined(SDCC_USE_XSTACK) && !defined(_SDCC_NO_ASM_LIB_FUNCS) # if defined(SDCC_ds390) # if !defined(SDCC_STACK_AUTO) # define _MULINT_ASM_LARGE # endif # elif defined(SDCC_mcs51) # if defined(SDCC_MODEL_SMALL) -# if defined(SDCC_STACK_AUTO) +# if defined(SDCC_STACK_AUTO) && !defined(SDCC_PARMS_IN_BANK1) # define _MULINT_ASM_SMALL_AUTO # else # define _MULINT_ASM_SMALL @@ -57,10 +52,12 @@ # endif #endif -#ifdef _MULINT_ASM_LARGE +#if defined(_MULINT_ASM_LARGE) -unsigned int -_muluint (unsigned int a, unsigned int b) // in future: _mulint +#pragma save +#pragma less_pedantic +int +_mulint (int a, int b) { a*b; // hush the compiler @@ -70,26 +67,38 @@ _muluint (unsigned int a, unsigned int b) // in future: _mulint (char)(lsb_a*msb_b)<<8 */ - _asm + _asm mov r2,dph ; msb_a mov r3,dpl ; lsb_a mov b,r3 ; lsb_a - mov dptr,#__muluint_PARM_2 +#if defined(SDCC_PARMS_IN_BANK1) + mov a,b1_0 +#else + mov dptr,#__mulint_PARM_2 movx a,@dptr ; lsb_b +#endif mul ab ; lsb_a*lsb_b mov r0,a mov r1,b mov b,r2 ; msb_a +#if defined(SDCC_PARMS_IN_BANK1) + mov a,b1_0 +#else movx a,@dptr ; lsb_b +#endif mul ab ; msb_a*lsb_b add a,r1 mov r1,a mov b,r3 ; lsb_a +#if defined(SDCC_PARMS_IN_BANK1) + mov a,b1_1 +#else inc dptr movx a,@dptr ; msb_b +#endif mul ab ; lsb_a*msb_b add a,r1 @@ -98,63 +107,58 @@ _muluint (unsigned int a, unsigned int b) // in future: _mulint ret _endasm; } +#pragma restore -int -_mulsint (int a, int b) // obsolete -{ - return _muluint (a, b); -} - -#elif defined _MULINT_ASM_SMALL || defined _MULINT_ASM_SMALL_AUTO +#elif defined(_MULINT_ASM_SMALL) || defined(_MULINT_ASM_SMALL_AUTO) -void +#pragma save +#pragma less_pedantic +int _mulint_dummy (void) _naked { _asm __mulint: - __muluint: ; obsolete - __mulsint: ; obsolete .globl __mulint - .globl __muluint ; obsolete - .globl __mulsint ; obsolete -#if !defined(SDCC_STACK_AUTO) +#if !defined(SDCC_STACK_AUTO) || defined(SDCC_PARMS_IN_BANK1) -#if defined(SDCC_NOOVERLAY) // BUG SDCC_NOOVERLAY is not set by -no-overlay +#if defined(SDCC_NOOVERLAY) .area DSEG (DATA) #else .area OSEG (OVR,DATA) #endif - +#if defined(SDCC_PARMS_IN_BANK1) + #define bl (b1_0) + #define bh (b1_1) +#else + #define bl (__mulint_PARM_2) + #define bh (__mulint_PARM_2 + 1) __mulint_PARM_2: - __muluint_PARM_2: ; obsolete - __mulsint_PARM_2: ; obsolete .globl __mulint_PARM_2 - .globl __muluint_PARM_2 ; obsolete - .globl __mulsint_PARM_2 ; obsolete .ds 2 +#endif .area CSEG (CODE) ; globbered registers none mov a,dpl ; 1 al - mov b,__mulint_PARM_2 ; 2 bl + mov b,bl ; 2 bl mul ab ; 4 al * bl xch a,dpl ; 1 store low-byte of return value, fetch al push b ; 2 - mov b,__mulint_PARM_2 + 1 ; 2 bh + mov b,bh ; 2 bh mul ab ; 4 al * bh pop b ; 2 add a,b ; 1 xch a,dph ; 1 ah -> acc - mov b,__mulint_PARM_2 ; 2 bl + mov b,bl ; 2 bl mul ab ; 4 ah * bl add a,dph ; 1 mov dph,a ; 1 @@ -191,11 +195,12 @@ _mulint_dummy (void) _naked mov dph,a ; 1 ret - + #endif // SDCC_STACK_AUTO _endasm ; } +#pragma restore #else @@ -204,18 +209,18 @@ union uu { unsigned int t; } ; -unsigned int -_muluint (unsigned int a, unsigned int b) // in future: _mulint +int +_mulint (int a, int b) { -#ifdef SDCC_MODEL_LARGE // still needed for large + stack-auto - union uu _xdata *x; - union uu _xdata *y; +#if !defined(SDCC_STACK_AUTO) && (defined(SDCC_MODEL_LARGE) || defined(SDCC_ds390)) // still needed for large + union uu xdata *x; + union uu xdata *y; union uu t; - x = (union uu _xdata *)&a; - y = (union uu _xdata *)&b; + x = (union uu xdata *)&a; + y = (union uu xdata *)&b; #else register union uu *x; - register union uu *y; + register union uu *y; union uu t; x = (union uu *)&a; y = (union uu *)&b; @@ -225,12 +230,6 @@ _muluint (unsigned int a, unsigned int b) // in future: _mulint t.s.hi += (x->s.lo * y->s.hi) + (x->s.hi * y->s.lo); return t.t; -} - -int -_mulsint (int a, int b) // obsolete -{ - return _muluint (a, b); } #endif