_mullong.c - routine for multiplication of 32 bit (unsigned) long
Written By - Jean Louis VERN jlvern@writeme.com (1999)
+ 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
mcs51 small stack-auto
*/
-#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_mcs51)
# if defined(SDCC_MODEL_SMALL)
-# if defined(SDCC_STACK_AUTO)
+# if defined(SDCC_STACK_AUTO) && !defined(SDCC_PARMS_IN_BANK1)
# define _MULLONG_ASM_SMALL_AUTO
# else
# define _MULLONG_ASM_SMALL
# endif
+# elif defined(SDCC_MODEL_LARGE)
+# if !defined(SDCC_STACK_AUTO)
+# define _MULLONG_ASM_LARGE
+# endif
# endif
# endif
#endif
#define c2 r6
#define c3 r7
+ #define a0 dpl
+ #define a1 dph
+ #define a2 r2
+ #define a3 r3
+
; c0 a0 * b0
; c1 a1 * b0 + a0 * b1
; c2 a2 * b0 + a1 * b1 + a0 * b2
; c3 a3 * b0 + a2 * b1 + a1 * b2 + a0 * b3
-#if !defined SDCC_STACK_AUTO
-
-#if defined(SDCC_NOOVERLAY) // BUG SDCC_NOOVERLAY is not set by -no-overlay
+#if !defined(SDCC_STACK_AUTO) || defined(SDCC_PARMS_IN_BANK1)
+#if defined(SDCC_PARMS_IN_BANK1)
+ #define b0 (b1_0)
+ #define b1 (b1_1)
+ #define b2 (b1_2)
+ #define b3 (b1_3)
+#else
+#if defined(SDCC_NOOVERLAY)
.area DSEG (DATA)
#else
.area OSEG (OVR,DATA)
.ds 4
+ b0 = __mullong_PARM_2
+ b1 = (__mullong_PARM_2+1)
+ b2 = (__mullong_PARM_2+2)
+ b3 = (__mullong_PARM_2+3)
+
+#endif
.area CSEG (CODE)
; parameter a comes in a, b, dph, dpl
mov r2,b ; save parameter a
mov r3,a
- #define a0 dpl
- #define a1 dph
- #define a2 r2
- #define a3 r3
-
- b0 = __mullong_PARM_2
- b1 = (__mullong_PARM_2+1)
- b2 = (__mullong_PARM_2+2)
- b3 = (__mullong_PARM_2+3)
-
; Byte 0
mov a,a0
mov b,b0
_endasm ;
}
-#else // _MULLONG_ASM_SMALL || _MULLONG_ASM_SMALL_AUTO
+
+#elif defined _MULLONG_ASM_LARGE
+
+void
+_mullong_dummy (void) _naked
+{
+ _asm
+
+ __mullong:
+ __mululong: ; obsolete
+ __mulslong: ; obsolete
+
+ .globl __mullong
+ .globl __mululong ; obsolete
+ .globl __mulslong ; obsolete
+
+ ; the result c will be stored in r4...r7
+ #define c0 r4
+ #define c1 r5
+ #define c2 r6
+ #define c3 r7
+
+ ; c0 a0 * b0
+ ; c1 a1 * b0 + a0 * b1
+ ; c2 a2 * b0 + a1 * b1 + a0 * b2
+ ; c3 a3 * b0 + a2 * b1 + a1 * b2 + a0 * b3
+
+#if !defined(SDCC_PARMS_IN_BANK1)
+ .area XSEG (XDATA)
+
+ __mullong_PARM_2:
+ __mululong_PARM_2: ; obsolete
+ __mulslong_PARM_2: ; obsolete
+
+ .globl __mullong_PARM_2
+ .globl __mululong_PARM_2 ; obsolete
+ .globl __mulslong_PARM_2 ; obsolete
+
+ .ds 4
+#endif
+ .area CSEG (CODE)
+
+ ; parameter a comes in a, b, dph, dpl
+ mov r0,dpl ; save parameter a
+ mov r1,dph
+ mov r2,b
+ mov r3,a
+
+ #define a0 r0
+ #define a1 r1
+ #define a2 r2
+ #define a3 r3
+
+ ; Byte 0
+ mov b,a0
+#if defined(SDCC_PARMS_IN_BANK1)
+ mov a,b1_0 ; b0
+#else
+ mov dptr,#__mullong_PARM_2
+ movx a,@dptr ; b0
+#endif
+ mul ab ; a0 * b0
+ mov c0,a
+ mov c1,b
+
+ ; Byte 1
+ mov b,a1
+#if defined(SDCC_PARMS_IN_BANK1)
+ mov a,b1_0 ; b0
+#else
+ movx a,@dptr ; b0
+#endif
+ mul ab ; a1 * b0
+ add a,c1
+ mov c1,a
+ clr a
+ addc a,b
+ mov c2,a
+
+
+ mov b,a0
+#if defined(SDCC_PARMS_IN_BANK1)
+ mov a,b1_1 ; b1
+#else
+ inc dptr ; b1
+ movx a,@dptr
+#endif
+ mul ab ; a0 * b1
+ add a,c1
+ mov c1,a
+ mov a,b
+ addc a,c2
+ mov c2,a
+ clr a
+ rlc a
+ mov c3,a
+
+ ; Byte 2
+ mov b,a1
+#if defined(SDCC_PARMS_IN_BANK1)
+ mov a,b1_1 ; b1
+#else
+ movx a,@dptr ; b1
+#endif
+ mul ab ; a1 * b1
+ add a,c2
+ mov c2,a
+ mov a,b
+ addc a,c3
+ mov c3,a
+
+ mov b,a0
+#if defined(SDCC_PARMS_IN_BANK1)
+ mov a,b1_2 ; b2
+#else
+ inc dptr ; b2
+ movx a,@dptr
+#endif
+ mul ab ; a0 * b2
+ add a,c2
+ mov c2,a
+ mov a,b
+ addc a,c3
+ mov c3,a
+
+ mov b,a2
+#if defined(SDCC_PARMS_IN_BANK1)
+ mov a,b1_0 ; b0
+#else
+ mov dptr,#__mullong_PARM_2
+ movx a,@dptr ; b0
+#endif
+ mul ab ; a2 * b0
+ add a,c2
+ mov c2,a
+ mov a,b
+ addc a,c3
+ mov c3,a
+
+ ; Byte 3
+ mov b,a3
+#if defined(SDCC_PARMS_IN_BANK1)
+ mov a,b1_0 ; b0
+#else
+ movx a,@dptr ; b0
+#endif
+ mul ab ; a3 * b0
+ add a,c3
+ mov c3,a
+
+ mov b,a2
+#if defined(SDCC_PARMS_IN_BANK1)
+ mov a,b1_1 ; b1
+#else
+ inc dptr ; b1
+ movx a,@dptr
+#endif
+ mul ab ; a2 * b1
+ add a,c3
+ mov c3,a
+
+ mov b,a1
+#if defined(SDCC_PARMS_IN_BANK1)
+ mov a,b1_2 ; b2
+#else
+ inc dptr ; b2
+ movx a,@dptr
+#endif
+ mul ab ; a1 * b2
+ add a,c3
+ mov c3,a
+
+ mov b,a0
+#if defined(SDCC_PARMS_IN_BANK1)
+ mov a,b1_3 ; b3
+#else
+ inc dptr ; b3
+ movx a,@dptr
+#endif
+ mul ab ; a0 * b3
+ add a,c3
+
+ mov b,c2
+ mov dph,c1
+ mov dpl,c0
+ ret
+
+ _endasm ;
+}
+
+#else // _MULLONG_ASM
struct some_struct {
int a ;
struct { unsigned char b0; unsigned int i12; unsigned char b3;} bi;
} ;
#if defined(SDCC_MODEL_LARGE) || defined (SDCC_ds390)
-#define bcast(x) ((union bil _xdata *)&(x))
+#define bcast(x) ((union bil xdata *)&(x))
#elif defined(__z80) || defined(__gbz80)
#define bcast(x) ((union bil *)&(x))
#else
-#define bcast(x) ((union bil _near *)&(x))
+#define bcast(x) ((union bil near *)&(x))
#endif
/*
long
_mulslong (long a, long b) // obsolete
{
- _mululong (a, b);
+ return _mululong (a, b);
}
-#endif // _MULLONG_ASM_SMALL || _MULLONG_ASM_SMALL_AUTO
+#endif // _MULLONG_ASM