* fixed GCC 4.4.0 mingw compilation:
[fw/sdcc] / device / lib / _mulint.c
index 8b4d0255bc339e359052d533e96c9aa6baae24f3..16ad56f088a64667ecfa9767d16ca7f944ec66e0 100644 (file)
 /* 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
 #  endif
 #endif
 
-#ifdef _MULINT_ASM_LARGE
+#if defined(_MULINT_ASM_LARGE)
 
-#pragma SAVE
-#pragma LESS_PEDANTIC
-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
 
@@ -71,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
 
@@ -79,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
@@ -109,115 +105,102 @@ _muluint (unsigned int a, unsigned int b)       // in future: _mulint
     mov dph,a
     mov dpl,r0
     ret
-  _endasm;
+  __endasm;
 }
-#pragma RESTORE
+#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
-
-/* the return value is (unsigned) int, but to hush the compiler
- * we choose void here: */
-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
 
@@ -226,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;
@@ -249,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