Logo Search packages:      
Sourcecode: linux86 version File versions  Download package

bcc_long.c

/************************************************************************/
/* This file contains the BCC compiler helper functions */
/* (C) Copyright Bruce Evans */
/* Support for long arithmetic on little-endian (normal) longs 
 * __laddl.o __landl.o __lcmpl.o __lcoml.o __ldecl.o __ldivl.o __ldivul.o
 * __leorl.o __lincl.o __lmodl.o __lmodul.o __lmull.o __lnegl.o __lorl.o
 * __lsll.o __lsrl.o __lsrul.o __lsubl.o __ltstl.o
 */

#ifdef __AS386_16__
#asm
      .text ! This is common to all.
      .even
#endasm

/************************************************************************/
/* Function laddl */

#ifdef L___laddl
#asm

! laddl.s

      .globl      laddl
      .globl      laddul

laddl:
laddul:
      add   ax,[di]
      adc   bx,2[di]
      ret
#endasm
#endif

/************************************************************************/
/* Function landl */

#ifdef L___landl
#asm

! landl.s

      .globl      landl
      .globl      landul

landl:
landul:
      and   ax,[di]
      and   bx,2[di]
      ret
#endasm
#endif

/************************************************************************/
/* Function lcmpl */

#ifdef L___lcmpl
#asm

! lcmpl.s
! lcmpl, lcmpul don`t preserve bx

      .globl      lcmpl
      .globl      lcmpul

lcmpl:
lcmpul:
      sub   bx,2[di]    
      je    LCMP_NOT_SURE
      ret

      .even

LCMP_NOT_SURE:
      cmp   ax,[di]
      jb    LCMP_B_AND_LT
      jge   LCMP_EXIT
                  
      inc   bx
LCMP_EXIT:
      ret

      .even

LCMP_B_AND_LT:
      dec   bx
      ret
#endasm
#endif

/************************************************************************/
/* Function lcoml */

#ifdef L___lcoml
#asm

! lcoml.s

      .globl      lcoml
      .globl      lcomul

lcoml:
lcomul:
      not   ax
      not   bx
      ret
#endasm
#endif

/************************************************************************/
/* Function ldecl */

#ifdef L___ldecl
#asm

! ldecl.s

      .globl      ldecl
      .globl      ldecul

ldecl:
ldecul:
      cmp   word ptr [bx],*0
      je    LDEC_BOTH
      dec   word ptr [bx]
      ret

      .even

LDEC_BOTH:
      dec   word ptr [bx]
      dec   word ptr 2[bx]
      ret
#endasm
#endif

/************************************************************************/
/* Function ldivl */

#ifdef L___ldivl
#asm

! ldivl.s
! bx:ax / 2(di):(di), quotient bx:ax, remainder di:cx, dx not preserved

      .globl      ldivl
      .extern     ldivmod

ldivl:
      mov   cx,[di]
      mov   di,2[di]
      call  ldivmod           
      xchg  ax,cx
      xchg  bx,di
      ret

#endasm
#endif

/************************************************************************/
/* Function ldivul */

#ifdef L___ldivul
#asm

! ldivul.s
! unsigned bx:ax / 2(di):(di), quotient bx:ax,remainder di:cx, dx not preserved

      .globl      ldivul
      .extern     ludivmod

ldivul:
      mov   cx,[di]
      mov   di,2[di]
      call  ludivmod    
      xchg  ax,cx
      xchg  bx,di
      ret
#endasm
#endif

/************************************************************************/
/* Function leorl */

#ifdef L___leorl
#asm

! leorl.s

      .globl      leorl
      .globl      leorul

leorl:
leorul:
      xor   ax,[di]
      xor   bx,2[di]
      ret
#endasm
#endif

/************************************************************************/
/* Function lincl */

#ifdef L___lincl
#asm

! lincl.s

      .globl      lincl
      .globl      lincul

lincl:
lincul:
      inc   word ptr [bx]
      je    LINC_HIGH_WORD
      ret

      .even

LINC_HIGH_WORD:
      inc   word ptr 2[bx]
      ret
#endasm
#endif

/************************************************************************/
/* Function lmodl */

#ifdef L___lmodl
#asm

! lmodl.s
! bx:ax % 2(di):(di), remainder bx:ax, quotient di:cx, dx not preserved

      .globl      lmodl
      .extern     ldivmod

lmodl:
      mov   cx,[di]
      mov   di,2[di]
      call  ldivmod
      ret   
#endasm
#endif

/************************************************************************/
/* Function lmodul */

#ifdef L___lmodul
#asm

! lmodul.s
! unsigned bx:ax / 2(di):(di), remainder bx:ax,quotient di:cx, dx not preserved

      .globl      lmodul
      .extern     ludivmod

lmodul:
      mov   cx,[di]
      mov   di,2[di]
      call  ludivmod
      ret
#endasm
#endif

/************************************************************************/
/* Function lmull */

#ifdef L___lmull
#asm

! lmull.s
! lmull, lmulul don`t preserve cx, dx

      .globl      lmull
      .globl      lmulul

lmull:
lmulul:
      mov   cx,ax
      mul   word ptr 2[di]
      xchg  ax,bx
      mul   word ptr [di]
      add   bx,ax
      mov   ax,ptr [di]
      mul   cx
      add   bx,dx
      ret
#endasm
#endif

/************************************************************************/
/* Function lnegl */

#ifdef L___lnegl
#asm

! lnegl.s

      .globl      lnegl
      .globl      lnegul

lnegl:
lnegul:
      neg   bx
      neg   ax
      sbb   bx,*0
      ret
#endasm
#endif

/************************************************************************/
/* Function lorl */

#ifdef L___lorl
#asm

! lorl.s

      .globl      lorl
      .globl      lorul

lorl:
lorul:
      or    ax,[di]
      or    bx,2[di]
      ret
#endasm
#endif

/************************************************************************/
/* Function lsll */

#ifdef L___lsll
#asm

! lsll.s
! lsll, lslul don`t preserve cx

      .globl      lsll
      .globl      lslul

lsll:
lslul:
      mov   cx,di
      jcxz  LSL_EXIT
      cmp   cx,*32
      jae   LSL_ZERO
LSL_LOOP:
      shl   ax,*1
      rcl   bx,*1
      loop  LSL_LOOP
LSL_EXIT:
      ret

      .even

LSL_ZERO:
      xor   ax,ax
      mov   bx,ax
      ret
#endasm
#endif

/************************************************************************/
/* Function lsrl */

#ifdef L___lsrl
#asm

! lsrl.s
! lsrl doesn`t preserve cx

      .globl      lsrl

lsrl:
      mov   cx,di
      jcxz  LSR_EXIT
      cmp   cx,*32
      jae   LSR_SIGNBIT
LSR_LOOP:
      sar   bx,*1
      rcr   ax,*1
      loop  LSR_LOOP
LSR_EXIT:
      ret

      .even

LSR_SIGNBIT:
      mov   cx,*32      
      j     LSR_LOOP
#endasm
#endif

/************************************************************************/
/* Function lsrul */

#ifdef L___lsrul
#asm

! lsrul.s
! lsrul doesn`t preserve cx

      .globl      lsrul

lsrul:
      mov   cx,di
      jcxz  LSRU_EXIT
      cmp   cx,*32
      jae   LSRU_ZERO
LSRU_LOOP:
      shr   bx,*1
      rcr   ax,*1
      loop  LSRU_LOOP
LSRU_EXIT:
      ret

      .even

LSRU_ZERO:
      xor   ax,ax
      mov   bx,ax
      ret
#endasm
#endif

/************************************************************************/
/* Function lsubl */

#ifdef L___lsubl
#asm

! lsubl.s

      .globl      lsubl
      .globl      lsubul

lsubl:
lsubul:
      sub   ax,[di]
      sbb   bx,2[di]
      ret
#endasm
#endif

/************************************************************************/
/* Function ltstl */

#ifdef L___ltstl
#asm

! ltstl.s
! ltstl, ltstul don`t preserve bx

      .globl      ltstl
      .globl      ltstul

ltstl:
ltstul:
      test  bx,bx
      je    LTST_NOT_SURE
      ret

      .even

LTST_NOT_SURE:
      test  ax,ax
      js    LTST_FIX_SIGN
      ret

      .even

LTST_FIX_SIGN:
      inc   bx
      ret
#endasm
#endif

#endif

Generated by  Doxygen 1.6.0   Back to index