* device/lib/libsdcc.lib: added module rand
[fw/sdcc] / device / lib / _mulint.c
index 44a363dadf685f0016ec17a55c23aa14d4ac2920..387585c02b16b67075decfc889f76c969ac268f4 100644 (file)
@@ -1,5 +1,5 @@
 /*-------------------------------------------------------------------------
 /*-------------------------------------------------------------------------
-  _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)
 
 
              Written By -  Sandeep Dutta . sandeep.dutta@usa.net (1999)
 
@@ -7,28 +7,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: _muluint and _mulsint should be replaced by _mulint.
-
-   bernhard@bernhardheld.de
-
    Assembler-functions are provided for:
      ds390
      mcs51 small
    Assembler-functions are provided for:
      ds390
      mcs51 small
@@ -43,7 +39,7 @@
 #    endif
 #  elif defined(SDCC_mcs51)
 #    if defined(SDCC_MODEL_SMALL)
 #    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
 #        define _MULINT_ASM_SMALL_AUTO
 #      else
 #        define _MULINT_ASM_SMALL
 #  endif
 #endif
 
 #  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
 
 {
   a*b; // hush the compiler
 
@@ -69,26 +67,38 @@ _muluint (unsigned int a, unsigned int b)   // in future: _mulint
       (char)(lsb_a*msb_b)<<8
   */
 
       (char)(lsb_a*msb_b)<<8
   */
 
-  _asm 
+  _asm
     mov r2,dph ; msb_a
     mov r3,dpl ; lsb_a
 
     mov b,r3 ; lsb_a
     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
     movx a,@dptr ; lsb_b
+#endif
     mul ab ; lsb_a*lsb_b
     mov r0,a
     mov r1,b
 
     mov b,r2 ; msb_a
     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
     movx a,@dptr ; lsb_b
+#endif
     mul ab ; msb_a*lsb_b
     add a,r1
     mov r1,a
 
     mov b,r3 ; lsb_a
     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
     inc dptr
     movx a,@dptr ; msb_b
+#endif
     mul ab ; lsb_a*msb_b
     add a,r1
 
     mul ab ; lsb_a*msb_b
     add a,r1
 
@@ -97,63 +107,58 @@ _muluint (unsigned int a, unsigned int b)  // in future: _mulint
     ret
   _endasm;
 }
     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:
 _mulint_dummy (void) _naked
 {
        _asm
 
        __mulint:
-       __muluint:                              ; obsolete
-       __mulsint:                              ; obsolete
 
                .globl __mulint
 
                .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
                .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:
        __mulint_PARM_2:
-       __muluint_PARM_2:                       ; obsolete
-       __mulsint_PARM_2:                       ; obsolete
 
                .globl __mulint_PARM_2
 
                .globl __mulint_PARM_2
-               .globl __muluint_PARM_2         ; obsolete
-               .globl __mulsint_PARM_2         ; obsolete
 
                .ds     2
 
                .ds     2
+#endif
 
                .area CSEG    (CODE)
 
                ; globbered registers none
 
                mov     a,dpl                   ;  1  al
 
                .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
 
                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
 
                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
                mul     ab                      ;  4  ah * bl
                add     a,dph                   ;  1
                mov     dph,a                   ;  1
@@ -190,11 +195,12 @@ _mulint_dummy (void) _naked
                mov     dph,a                   ;  1
 
                ret
                mov     dph,a                   ;  1
 
                ret
-       
+
 #endif // SDCC_STACK_AUTO
 
        _endasm ;
 }
 #endif // SDCC_STACK_AUTO
 
        _endasm ;
 }
+#pragma restore
 
 #else
 
 
 #else
 
@@ -203,18 +209,18 @@ union uu {
         unsigned int t;
 } ;
 
         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;
        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;
 #else
        register union uu *x;
-       register union uu *y; 
+       register union uu *y;
        union uu t;
         x = (union uu *)&a;
         y = (union uu *)&b;
        union uu t;
         x = (union uu *)&a;
         y = (union uu *)&b;
@@ -224,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;
         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
 }
 
 #endif