X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=device%2Flib%2F_mulint.c;h=16ad56f088a64667ecfa9767d16ca7f944ec66e0;hb=eae1bd2f705a2c61e143c539f8c4d1e9c2b4efe6;hp=8c2c5121d9a8fb8a0afabd6e7026a00976bc0432;hpb=ebeaaf8342884c19d2b49a1c239e9bbf0c26c940;p=fw%2Fsdcc diff --git a/device/lib/_mulint.c b/device/lib/_mulint.c index 8c2c5121..16ad56f0 100644 --- a/device/lib/_mulint.c +++ b/device/lib/_mulint.c @@ -25,10 +25,6 @@ /* 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 @@ -56,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 @@ -69,7 +67,7 @@ _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 @@ -77,7 +75,7 @@ _muluint (unsigned int a, unsigned int b) // in future: _mulint #if defined(SDCC_PARMS_IN_BANK1) mov a,b1_0 #else - mov dptr,#__muluint_PARM_2 + mov dptr,#__mulint_PARM_2 movx a,@dptr ; lsb_b #endif mul ab ; lsb_a*lsb_b @@ -107,112 +105,102 @@ _muluint (unsigned int a, unsigned int b) // in future: _mulint mov dph,a mov dpl,r0 ret - _endasm; + __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 -_mulint_dummy (void) _naked +#pragma save +#pragma less_pedantic +int +_mulint_dummy (void) __naked { - _asm + __asm - __mulint: - __muluint: ; obsolete - __mulsint: ; obsolete +__mulint: - .globl __mulint - .globl __muluint ; obsolete - .globl __mulsint ; obsolete + .globl __mulint #if !defined(SDCC_STACK_AUTO) || defined(SDCC_PARMS_IN_BANK1) #if defined(SDCC_NOOVERLAY) - .area DSEG (DATA) + .area DSEG (DATA) #else - .area OSEG (OVR,DATA) + .area OSEG (OVR,DATA) #endif #if defined(SDCC_PARMS_IN_BANK1) - #define bl (b1_0) - #define bh (b1_1) + #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,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,bh ; 2 bh - mul ab ; 4 al * bh - pop b ; 2 - add a,b ; 1 - xch a,dph ; 1 ah -> acc - - mov b,bl ; 2 bl - mul ab ; 4 ah * bl - add a,dph ; 1 - mov dph,a ; 1 - ret ; 2 - ; 30 + #define bl (__mulint_PARM_2) + #define bh (__mulint_PARM_2 + 1) +__mulint_PARM_2: + + .globl __mulint_PARM_2 + + .ds 2 +#endif + + .area CSEG (CODE) + + ; globbered registers none + + mov a,dpl ; 1 al + 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,bh ; 2 bh + mul ab ; 4 al * bh + pop b ; 2 + add a,b ; 1 + xch a,dph ; 1 ah -> acc + + mov b,bl ; 2 bl + mul ab ; 4 ah * bl + add a,dph ; 1 + mov dph,a ; 1 + ret ; 2 + ; 30 #else // SDCC_STACK_AUTO - ; globbered registers r0 + ; globbered registers r0 - mov a,#-2 ; 1 return address 2 bytes - add a,sp ; 1 - mov r0,a ; 1 r0 points to bh + mov a,#-2 ; 1 return address 2 bytes + add a,sp ; 1 + mov r0,a ; 1 r0 points to bh - mov a,@r0 ; 1 bh - mov b,dpl ; 2 al - mul ab ; 4 al * bh - push acc ; 2 + mov a,@r0 ; 1 bh + mov b,dpl ; 2 al + mul ab ; 4 al * bh + push acc ; 2 - mov b,dpl ; 2 al - dec r0 ; 1 - mov a,@r0 ; 1 bl - mul ab ; 4 al * bl + mov b,dpl ; 2 al + dec r0 ; 1 + mov a,@r0 ; 1 bl + mul ab ; 4 al * bl - mov dpl,a ; 1 low-byte of return-value + mov dpl,a ; 1 low-byte of return-value - pop acc ; 2 - add a,b ; 1 - xch a,dph ; 1 ah -> acc + pop acc ; 2 + add a,b ; 1 + xch a,dph ; 1 ah -> acc - mov b,@r0 ; 2 bl - mul ab ; 4 ah * bl - add a,dph ; 1 - mov dph,a ; 1 + mov b,@r0 ; 2 bl + mul ab ; 4 ah * bl + add a,dph ; 1 + mov dph,a ; 1 - ret + ret #endif // SDCC_STACK_AUTO - _endasm ; + __endasm; } +#pragma restore #else @@ -221,15 +209,15 @@ union uu { unsigned int t; } ; -unsigned int -_muluint (unsigned int a, unsigned int b) // in future: _mulint +int +_mulint (int a, int b) { #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 __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; @@ -244,12 +232,6 @@ _muluint (unsigned int a, unsigned int b) // in future: _mulint return t.t; } -int -_mulsint (int a, int b) // obsolete -{ - return _muluint (a, b); -} - #endif #undef _MULINT_ASM