version 0.5.2
[fw/sdcc] / device / lib / _mullong.c
index 7afdc5afefe572dbd3f7505d76d84652cd15eaff..58ee9915ca51207c2c9d58097281e0744632b3bc 100644 (file)
@@ -8,28 +8,24 @@
    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.
    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 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 Library General Public License for more details.
    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 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.
    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
    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.
 
 -------------------------------------------------------------------------*/
 
 /* Signed and unsigned multiplication are the same - as long as the output
    has the same precision as the input.
 
-   To do: _mululong and _mulslong should be replaced by _mullong.
-
-   bernhard@bernhardheld.de
-
    Assembler-functions are provided for:
      mcs51 small
      mcs51 small stack-auto
    Assembler-functions are provided for:
      mcs51 small
      mcs51 small stack-auto
@@ -51,7 +47,7 @@
 #  endif
 #endif
 
 #  endif
 #endif
 
-#if defined _MULLONG_ASM_SMALL || defined _MULLONG_ASM_SMALL_AUTO
+#if defined(_MULLONG_ASM_SMALL) || defined(_MULLONG_ASM_SMALL_AUTO)
 
 void
 _mullong_dummy (void) _naked
 
 void
 _mullong_dummy (void) _naked
@@ -59,12 +55,8 @@ _mullong_dummy (void) _naked
        _asm
 
        __mullong:
        _asm
 
        __mullong:
-       __mululong:                     ; obsolete
-       __mulslong:                     ; obsolete
 
                .globl __mullong
 
                .globl __mullong
-               .globl __mululong       ; obsolete
-               .globl __mulslong       ; obsolete
 
                                        ; the result c will be stored in r4...r7
                #define c0 r4
 
                                        ; the result c will be stored in r4...r7
                #define c0 r4
@@ -96,12 +88,8 @@ _mullong_dummy (void) _naked
 #endif
 
        __mullong_PARM_2:
 #endif
 
        __mullong_PARM_2:
-       __mululong_PARM_2:                      ; obsolete
-       __mulslong_PARM_2:                      ; obsolete
 
                .globl __mullong_PARM_2
 
                .globl __mullong_PARM_2
-               .globl __mululong_PARM_2        ; obsolete
-               .globl __mulslong_PARM_2        ; obsolete
 
                .ds     4
 
 
                .ds     4
 
@@ -133,7 +121,7 @@ _mullong_dummy (void) _naked
                clr     a
                addc    a,b
                mov     c2,a
                clr     a
                addc    a,b
                mov     c2,a
-               
+
 
                mov     a,a0
                mov     b,b1
 
                mov     a,a0
                mov     b,b1
@@ -239,7 +227,7 @@ _mullong_dummy (void) _naked
                clr     a
                addc    a,b
                mov     c2,a
                clr     a
                addc    a,b
                mov     c2,a
-               
+
 
                mov     a,a0
                mov     b,@r0           ; b1
 
                mov     a,a0
                mov     b,@r0           ; b1
@@ -321,7 +309,7 @@ _mullong_dummy (void) _naked
 }
 
 
 }
 
 
-#elif defined _MULLONG_ASM_LARGE
+#elif defined(_MULLONG_ASM_LARGE)
 
 void
 _mullong_dummy (void) _naked
 
 void
 _mullong_dummy (void) _naked
@@ -329,12 +317,8 @@ _mullong_dummy (void) _naked
        _asm
 
        __mullong:
        _asm
 
        __mullong:
-       __mululong:                     ; obsolete
-       __mulslong:                     ; obsolete
 
                .globl __mullong
 
                .globl __mullong
-               .globl __mululong       ; obsolete
-               .globl __mulslong       ; obsolete
 
                                        ; the result c will be stored in r4...r7
                #define c0 r4
 
                                        ; the result c will be stored in r4...r7
                #define c0 r4
@@ -351,12 +335,8 @@ _mullong_dummy (void) _naked
                .area XSEG    (XDATA)
 
        __mullong_PARM_2:
                .area XSEG    (XDATA)
 
        __mullong_PARM_2:
-       __mululong_PARM_2:                      ; obsolete
-       __mulslong_PARM_2:                      ; obsolete
 
                .globl __mullong_PARM_2
 
                .globl __mullong_PARM_2
-               .globl __mululong_PARM_2        ; obsolete
-               .globl __mulslong_PARM_2        ; obsolete
 
                .ds     4
 #endif
 
                .ds     4
 #endif
@@ -376,7 +356,7 @@ _mullong_dummy (void) _naked
                                        ;       Byte 0
                mov     b,a0
 #if defined(SDCC_PARMS_IN_BANK1)
                                        ;       Byte 0
                mov     b,a0
 #if defined(SDCC_PARMS_IN_BANK1)
-               mov     a,b1_0          ; b0                                               
+               mov     a,b1_0          ; b0
 #else
                mov     dptr,#__mullong_PARM_2
                movx    a,@dptr         ; b0
 #else
                mov     dptr,#__mullong_PARM_2
                movx    a,@dptr         ; b0
@@ -388,7 +368,7 @@ _mullong_dummy (void) _naked
                                        ;       Byte 1
                mov     b,a1
 #if defined(SDCC_PARMS_IN_BANK1)
                                        ;       Byte 1
                mov     b,a1
 #if defined(SDCC_PARMS_IN_BANK1)
-               mov     a,b1_0          ; b0                                               
+               mov     a,b1_0          ; b0
 #else
                movx    a,@dptr         ; b0
 #endif
 #else
                movx    a,@dptr         ; b0
 #endif
@@ -398,7 +378,7 @@ _mullong_dummy (void) _naked
                clr     a
                addc    a,b
                mov     c2,a
                clr     a
                addc    a,b
                mov     c2,a
-               
+
 
                mov     b,a0
 #if defined(SDCC_PARMS_IN_BANK1)
 
                mov     b,a0
 #if defined(SDCC_PARMS_IN_BANK1)
@@ -513,31 +493,33 @@ _mullong_dummy (void) _naked
 #else // _MULLONG_ASM
 
 struct some_struct {
 #else // _MULLONG_ASM
 
 struct some_struct {
-       int a ;
+       short a ;
        char b;
        long c ;};
 union bil {
         struct {unsigned char b0,b1,b2,b3 ;} b;
        char b;
        long c ;};
 union bil {
         struct {unsigned char b0,b1,b2,b3 ;} b;
-        struct {unsigned int lo,hi ;} i;
+        struct {unsigned short lo,hi ;} i;
         unsigned long l;
         unsigned long l;
-        struct { unsigned char b0; unsigned int i12; unsigned char b3;} bi;
+        struct { unsigned char b0; unsigned short i12; unsigned char b3;} bi;
 } ;
 } ;
-#if defined(SDCC_MODEL_LARGE) || defined (SDCC_ds390)
-#define bcast(x) ((union bil xdata *)&(x))
+#if defined(SDCC_USE_XSTACK)
+#  define bcast(x) ((union bil pdata *)&(x))
+#elif (defined(SDCC_MODEL_LARGE) || defined (SDCC_ds390) || defined (SDCC_ds400)) && !defined(SDCC_STACK_AUTO)
+#  define bcast(x) ((union bil xdata *)&(x))
 #elif defined(__z80) || defined(__gbz80)
 #elif defined(__z80) || defined(__gbz80)
-#define bcast(x) ((union bil *)&(x))
+#  define bcast(x) ((union bil *)&(x))
 #else
 #else
-#define bcast(x) ((union bil near  *)&(x))
+#  define bcast(x) ((union bil near  *)&(x))
 #endif
 
 /*
                      3   2   1   0
        X             3   2   1   0
        ----------------------------
 #endif
 
 /*
                      3   2   1   0
        X             3   2   1   0
        ----------------------------
-                   0.3 0.2 0.1 0.0 
-               1.3 1.2 1.1 1.0 
-           2.3 2.2 2.1 2.0 
-       3.3 3.2 3.1 3.0 
+                   0.3 0.2 0.1 0.0
+               1.3 1.2 1.1 1.0
+           2.3 2.2 2.1 2.0
+       3.3 3.2 3.1 3.0
        ----------------------------
                   |3.3|1.3|0.2|0.0|   A
                     |2.3|0.3|0.1|     B
        ----------------------------
                   |3.3|1.3|0.2|0.0|   A
                     |2.3|0.3|0.1|     B
@@ -548,14 +530,13 @@ union bil {
                         |3.0|         G
                           |-------> only this side 32 x 32 -> 32
 */
                         |3.0|         G
                           |-------> only this side 32 x 32 -> 32
 */
-unsigned long
-_mululong (unsigned long a, unsigned long b)   // in future: _mullong
+long
+_mullong (long a, long b)
 {
         union bil t;
 
         t.i.hi = bcast(a)->b.b0 * bcast(b)->b.b2;       // A
         t.i.lo = bcast(a)->b.b0 * bcast(b)->b.b0;       // A
 {
         union bil t;
 
         t.i.hi = bcast(a)->b.b0 * bcast(b)->b.b2;       // A
         t.i.lo = bcast(a)->b.b0 * bcast(b)->b.b0;       // A
-       _asm ;johan _endasm;
         t.b.b3 += bcast(a)->b.b3 *
                                   bcast(b)->b.b0;       // G
         t.b.b3 += bcast(a)->b.b2 *
         t.b.b3 += bcast(a)->b.b3 *
                                   bcast(b)->b.b0;       // G
         t.b.b3 += bcast(a)->b.b2 *
@@ -580,10 +561,4 @@ _mululong (unsigned long a, unsigned long b)       // in future: _mullong
         return t.l + b;
 }
 
         return t.l + b;
 }
 
-long
-_mulslong (long a, long b)     // obsolete
-{
-  return _mululong (a, b);
-}
-
 #endif // _MULLONG_ASM
 #endif // _MULLONG_ASM