Changeset 3866


Ignore:
Timestamp:
Jun 26, 2014, 11:52:22 PM (11 years ago)
Author:
bird
Message:

Make libc/conv build with watcom (taking a little shortcut wrt assembly).

Location:
trunk/libc
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/libc/include/386/builtin.h

    r3861 r3866  
    874874
    875875
    876 #ifndef __WATCOMC__ /** @todo port me later. */
    877876
    878877/* Quick routines similar to div() and friends, but inline */
    879878
     879#ifdef __WATCOMC__
     880long __ldivmod (long num, long den, long *rem);
     881# pragma aux __ldivmod = \
     882    "cdq" \
     883    "idiv ecx" \
     884    "mov [ebx], edx" \
     885    parm [eax] [ecx] [ebx] value [eax]
     886#else
    880887static __inline__ long __ldivmod (long num, long den, long *rem)
    881888{
     889# ifdef _MSC_VER /* No intrisic idiv, but this will be /O2'ed into the gcc code. */
     890  *rem = num % den;
     891  return num / den;
     892# else
    882893  long q, r;
    883894  __asm__ ("cltd; idivl %2"
     
    886897  *rem = r;
    887898  return q;
    888 }
    889 
     899# endif
     900}
     901#endif
     902
     903#ifdef __WATCOMC__
     904unsigned __uldivmod (unsigned long num, unsigned long den, unsigned long *rem);
     905# pragma aux __uldivmod = \
     906    "xor  edx, edx" \
     907    "div  ecx" \
     908    "mov [ebx], edx" \
     909    parm [eax] [ecx] [ebx] value [eax]
     910#else
    890911static __inline__ unsigned long __uldivmod (unsigned long num,
    891912  unsigned long den, unsigned long *rem)
    892913{
     914# ifdef _MSC_VER /* No intrisic div, but this will be /O2'ed into the gcc code. */
     915  *rem = num % den;
     916  return num / den;
     917# else
    893918  unsigned long q, r;
    894919  __asm__ ("xorl %%edx,%%edx; divl %2"
     
    897922  *rem = r;
    898923  return q;
    899 }
     924#endif
     925}
     926#endif
    900927
    901928/*
     
    908935static __inline__ long long __lldivmod (long long num, long den, long *rem)
    909936{
     937#if !defined(__GNUC__)
     938  /* Not bothering with doing this as inline for now. */
     939  *rem = num % den;
     940  return num / den;
     941#else
    910942  long long q;
    911943  long r;
     
    9811013  *rem = r;
    9821014  return q;
     1015#endif
    9831016}
    9841017
     
    9871020    instead of two because the result is always a 32-bit integer.
    9881021*/
     1022#ifdef __WATCOMC__
     1023unsigned long long __ulldivmod (unsigned long long num, unsigned long den, unsigned long *rem);
     1024# pragma aux __ulldivmod = \
     1025    "xor  edx, edx" \
     1026    "div  ebx" \
     1027    "xchg esi, eax" \
     1028    "div  ebx" \
     1029    "mov  [ecx], edx" \
     1030    "mov  edx, esi" \
     1031    parm [esi eax] [ebx] [ecx] value [eax edx] modify exact [esi eax edx]
     1032#else
    9891033static __inline__ unsigned long long __ulldivmod (unsigned long long num,
    9901034  unsigned long den, unsigned long *rem)
    9911035{
     1036# ifdef _MSC_VER
     1037    unsigned long long q;
     1038    __asm {
     1039        mov     ecx, [den]
     1040        mov     eax, dword ptr [num + 4]
     1041        xor     edx, edx
     1042        DIV     ecx     ; capitalized DIV because of _STD(div).
     1043        mov     dword ptr [q + 4], eax
     1044        mov     eax, dword ptr [num]
     1045        DIV     ecx
     1046        mov     dword ptr [q], eax
     1047        mov     ecx, [rem]
     1048        mov     [ecx], edx
     1049    };
     1050    return q;
     1051# else
    9921052  unsigned long long q;
    9931053  unsigned long r;
     
    10031063  *rem = r;
    10041064  return q;
    1005 }
    1006 
    1007 #endif /* ! __WATCOM__ */
     1065# endif
     1066}
     1067#endif
    10081068
    10091069__END_DECLS
  • trunk/libc/src/libc/conv/Makefile.kmk

    r3845 r3866  
    6565    $(PATH_LIBC_SRC)/libc/conv/ulltoa.c \
    6666    $(PATH_LIBC_SRC)/libc/conv/ultoa.c \
    67     $(PATH_LIBC_SRC)/libc/conv/__digits.c \
     67    $(PATH_LIBC_SRC)/libc/conv/__digits.c
    6868
    69 libc_libc_conv_SOURCES.x86 = \
     69if defined(CFG_LIBC_USE_WATCOM) || "$(KBUILD_TARGET)" != "os2"
     70 libc_libc_conv_SOURCES += \
     71    $(PATH_LIBC_SRC)/libc/conv/c/biaddbb.c \
     72    $(PATH_LIBC_SRC)/libc/conv/c/bidivbw.c \
     73    $(PATH_LIBC_SRC)/libc/conv/c/bidivhlp.c \
     74    $(PATH_LIBC_SRC)/libc/conv/c/bimulbb.c \
     75    $(PATH_LIBC_SRC)/libc/conv/c/bimulbw.c \
     76    $(PATH_LIBC_SRC)/libc/conv/c/bisubmbw.c
     77else
     78## @todo convert to nasm.
     79 libc_libc_conv_SOURCES.x86 = \
    7080    $(PATH_LIBC_SRC)/libc/conv/386/biaddbb.s \
    7181    $(PATH_LIBC_SRC)/libc/conv/386/bidivbw.s \
     
    7383    $(PATH_LIBC_SRC)/libc/conv/386/bimulbb.s \
    7484    $(PATH_LIBC_SRC)/libc/conv/386/bimulbw.s \
    75     $(PATH_LIBC_SRC)/libc/conv/386/bisubmbw.s \
     85    $(PATH_LIBC_SRC)/libc/conv/386/bisubmbw.s
     86endif
    7687
    7788$(PATH_LIBC_SRC)/libc/conv/bipow5.c_DEPS = $(PATH_TARGET)/bipow5.tab
  • trunk/libc/src/libc/conv/lltoa.c

    r494 r3866  
    1919  char digits[64];
    2020  unsigned long long x;
     21  unsigned long rem;
    2122  int i;
    22   long rem;
    2323
    2424  dst = string;
Note: See TracChangeset for help on using the changeset viewer.