[BACK]Return to mach_dep.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / gc

Diff for /OpenXM_contrib2/asir2000/gc/mach_dep.c between version 1.3 and 1.4

version 1.3, 2000/12/01 09:26:11 version 1.4, 2001/04/20 07:39:19
Line 12 
Line 12 
  * modified is included with the above copyright notice.   * modified is included with the above copyright notice.
  */   */
 /* Boehm, November 17, 1995 12:13 pm PST */  /* Boehm, November 17, 1995 12:13 pm PST */
 # include "gc_priv.h"  # include "private/gc_priv.h"
 # include <stdio.h>  # include <stdio.h>
 # include <setjmp.h>  # include <setjmp.h>
 # if defined(OS2) || defined(CX_UX)  # if defined(OS2) || defined(CX_UX)
Line 21 
Line 21 
 # endif  # endif
 # ifdef AMIGA  # ifdef AMIGA
 #   ifndef __GNUC__  #   ifndef __GNUC__
 #     include <dos/dos.h>  #     include <dos.h>
 #   else  #   else
 #     include <machine/reg.h>  #     include <machine/reg.h>
 #   endif  #   endif
Line 178  void GC_push_regs()
Line 178  void GC_push_regs()
 #        else /* !__GNUC__ */  #        else /* !__GNUC__ */
           GC_push_one(getreg(REG_A2));            GC_push_one(getreg(REG_A2));
           GC_push_one(getreg(REG_A3));            GC_push_one(getreg(REG_A3));
           GC_push_one(getreg(REG_A4));  #         ifndef __SASC
                 /* Can probably be changed to #if 0 -Kjetil M. (a4=globals)*/
               GC_push_one(getreg(REG_A4));
   #         endif
           GC_push_one(getreg(REG_A5));            GC_push_one(getreg(REG_A5));
           GC_push_one(getreg(REG_A6));            GC_push_one(getreg(REG_A6));
           /* Skip stack pointer */            /* Skip stack pointer */
Line 220  void GC_push_regs()
Line 223  void GC_push_regs()
 #       if defined(I386) &&!defined(OS2) &&!defined(SVR4) \  #       if defined(I386) &&!defined(OS2) &&!defined(SVR4) \
         && (defined(__MINGW32__) || !defined(MSWIN32)) \          && (defined(__MINGW32__) || !defined(MSWIN32)) \
         && !defined(SCO) && !defined(SCO_ELF) \          && !defined(SCO) && !defined(SCO_ELF) \
         && !(defined(LINUX)       && defined(__ELF__)) \          && !(defined(LINUX) && defined(__ELF__)) \
         && !(defined(FREEBSD) && defined(__ELF__)) \          && !(defined(FREEBSD) && defined(__ELF__)) \
           && !(defined(NETBSD) && defined(__ELF__)) \
           && !(defined(OPENBSD) && defined(__ELF__)) \
           && !(defined(BEOS) && defined(__ELF__)) \
         && !defined(DOS4GW)          && !defined(DOS4GW)
         /* I386 code, generic code does not appear to work */          /* I386 code, generic code does not appear to work */
         /* It does appear to work under OS2, and asms dont */          /* It does appear to work under OS2, and asms dont */
Line 236  void GC_push_regs()
Line 242  void GC_push_regs()
 #       endif  #       endif
   
 #       if ( defined(I386) && defined(LINUX) && defined(__ELF__) ) \  #       if ( defined(I386) && defined(LINUX) && defined(__ELF__) ) \
         || ( defined(I386) && defined(FREEBSD) && defined(__ELF__) )          || ( defined(I386) && defined(FREEBSD) && defined(__ELF__) ) \
           || ( defined(I386) && defined(NETBSD) && defined(__ELF__) ) \
           || ( defined(I386) && defined(OPENBSD) && defined(__ELF__) )
   
         /* This is modified for Linux with ELF (Note: _ELF_ only) */          /* This is modified for Linux with ELF (Note: _ELF_ only) */
         /* This section handles FreeBSD with ELF. */          /* This section handles FreeBSD with ELF. */
Line 253  void GC_push_regs()
Line 261  void GC_push_regs()
           asm("pushl %ebx; call GC_push_one; addl $4,%esp");            asm("pushl %ebx; call GC_push_one; addl $4,%esp");
 #       endif  #       endif
   
   #       if ( defined(I386) && defined(BEOS) && defined(__ELF__) )
           /* As far as I can understand from                              */
           /* http://www.beunited.org/articles/jbq/nasm.shtml,             */
           /* only ebp, esi, edi and ebx are not scratch. How MMX          */
           /* etc. registers should be treated, I have no idea.            */
             asm("pushl %ebp; call GC_push_one; addl $4,%esp");
             asm("pushl %esi; call GC_push_one; addl $4,%esp");
             asm("pushl %edi; call GC_push_one; addl $4,%esp");
             asm("pushl %ebx; call GC_push_one; addl $4,%esp");
   #       endif
   
 #       if defined(I386) && defined(MSWIN32) && !defined(__MINGW32__) \  #       if defined(I386) && defined(MSWIN32) && !defined(__MINGW32__) \
            && !defined(USE_GENERIC)             && !defined(USE_GENERIC)
         /* I386 code, Microsoft variant         */          /* I386 code, Microsoft variant         */
Line 402  ptr_t cold_gc_frame;
Line 421  ptr_t cold_gc_frame;
                 for (; (char *)i < lim; i++) {                  for (; (char *)i < lim; i++) {
                     *i = 0;                      *i = 0;
                 }                  }
 #           if defined(POWERPC) || defined(MSWIN32) || defined(UTS4) || defined(LINUX)  #           if defined(POWERPC) || defined(MSWIN32) || defined(MSWINCE) \
                  || defined(UTS4) || defined(LINUX)
                 (void) setjmp(regs);                  (void) setjmp(regs);
 #           else  #           else
                 (void) _setjmp(regs);                  (void) _setjmp(regs);
Line 437  ptr_t cold_gc_frame;
Line 457  ptr_t cold_gc_frame;
       asm("     .globl  _GC_save_regs_in_stack");        asm("     .globl  _GC_save_regs_in_stack");
       asm("_GC_save_regs_in_stack:");        asm("_GC_save_regs_in_stack:");
 #   endif  #   endif
     asm("       ta      0x3   ! ST_FLUSH_WINDOWS");  #   if defined(__arch64__) || defined(__sparcv9)
     asm("       mov     %sp,%o0");        asm("     save    %sp,-128,%sp");
     asm("       retl");        asm("     flushw");
     asm("       nop");        asm("     ret");
         asm("     restore %sp,2047+128,%o0");
   #   else
         asm("     ta      0x3   ! ST_FLUSH_WINDOWS");
         asm("     retl");
         asm("     mov     %sp,%o0");
   #   endif
 #   ifdef SVR4  #   ifdef SVR4
       asm("     .GC_save_regs_in_stack_end:");        asm("     .GC_save_regs_in_stack_end:");
       asm("     .size GC_save_regs_in_stack,.GC_save_regs_in_stack_end-GC_save_regs_in_stack");        asm("     .size GC_save_regs_in_stack,.GC_save_regs_in_stack_end-GC_save_regs_in_stack");
Line 454  ptr_t cold_gc_frame;
Line 480  ptr_t cold_gc_frame;
 /* up on the other side of the stack segment.                           */  /* up on the other side of the stack segment.                           */
 /* Returns the backing store pointer for the register stack.            */  /* Returns the backing store pointer for the register stack.            */
 # ifdef IA64  # ifdef IA64
   #   ifdef __GNUC__
         asm("        .text");          asm("        .text");
         asm("        .psr abi64");          asm("        .psr abi64");
         asm("        .psr lsb");          asm("        .psr lsb");
Line 470  ptr_t cold_gc_frame;
Line 497  ptr_t cold_gc_frame;
         asm("        mov r8=ar.bsp");          asm("        mov r8=ar.bsp");
         asm("        br.ret.sptk.few rp");          asm("        br.ret.sptk.few rp");
         asm("        .endp GC_save_regs_in_stack");          asm("        .endp GC_save_regs_in_stack");
   #   else
           void GC_save_regs_in_stack() {
             asm("        flushrs");
             asm("        ;;");
             asm("        mov r8=ar.bsp");
             asm("        br.ret.sptk.few rp");
           }
   #   endif
 # endif  # endif
   
 /* GC_clear_stack_inner(arg, limit) clears stack area up to limit and   */  /* GC_clear_stack_inner(arg, limit) clears stack area up to limit and   */
Line 488  ptr_t cold_gc_frame;
Line 523  ptr_t cold_gc_frame;
     asm("GC_clear_stack_inner:");      asm("GC_clear_stack_inner:");
     asm(".type GC_save_regs_in_stack,#function");      asm(".type GC_save_regs_in_stack,#function");
 # endif  # endif
   #if defined(__arch64__) || defined(__sparcv9)
     asm("mov %sp,%o2");           /* Save sp                      */
     asm("add %sp,2047-8,%o3");    /* p = sp+bias-8                */
     asm("add %o1,-2047-192,%sp"); /* Move sp out of the way,      */
                                   /* so that traps still work.    */
                                   /* Includes some extra words    */
                                   /* so we can be sloppy below.   */
     asm("loop:");
     asm("stx %g0,[%o3]");         /* *(long *)p = 0               */
     asm("cmp %o3,%o1");
     asm("bgu,pt %xcc, loop");     /* if (p > limit) goto loop     */
       asm("add %o3,-8,%o3");      /* p -= 8 (delay slot) */
     asm("retl");
       asm("mov %o2,%sp");         /* Restore sp., delay slot      */
   #else
   asm("mov %sp,%o2");           /* Save sp      */    asm("mov %sp,%o2");           /* Save sp      */
   asm("add %sp,-8,%o3");        /* p = sp-8     */    asm("add %sp,-8,%o3");        /* p = sp-8     */
   asm("clr %g1");               /* [g0,g1] = 0  */    asm("clr %g1");               /* [g0,g1] = 0  */
Line 502  ptr_t cold_gc_frame;
Line 552  ptr_t cold_gc_frame;
     asm("add %o3,-8,%o3");      /* p -= 8 (delay slot) */      asm("add %o3,-8,%o3");      /* p -= 8 (delay slot) */
   asm("retl");    asm("retl");
     asm("mov %o2,%sp");         /* Restore sp., delay slot      */      asm("mov %o2,%sp");         /* Restore sp., delay slot      */
   #endif /* old SPARC */
   /* First argument = %o0 = return value */    /* First argument = %o0 = return value */
 #   ifdef SVR4  #   ifdef SVR4
       asm("     .GC_clear_stack_inner_end:");        asm("     .GC_clear_stack_inner_end:");

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.4

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>