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

Diff for /OpenXM_contrib/gc/Attic/mach_dep.c between version 1.1.1.1 and 1.1.1.2

version 1.1.1.1, 1999/11/27 10:58:32 version 1.1.1.2, 2000/04/14 11:07:57
Line 20 
Line 20 
 #   define _longjmp(b,v) longjmp(b,v)  #   define _longjmp(b,v) longjmp(b,v)
 # endif  # endif
 # ifdef AMIGA  # ifdef AMIGA
 #   include <dos.h>  #   ifndef __GNUC__
   #     include <dos/dos.h>
   #   else
   #     include <machine/reg.h>
   #   endif
 # endif  # endif
   
 #if defined(__MWERKS__) && !defined(POWERPC)  #if defined(__MWERKS__) && !defined(POWERPC)
Line 58  asm static void PushMacRegisters()
Line 62  asm static void PushMacRegisters()
   
 #endif /* __MWERKS__ */  #endif /* __MWERKS__ */
   
   # if defined(SPARC) || defined(IA64)
       /* Value returned from register flushing routine; either sp (SPARC) */
       /* or ar.bsp (IA64)                                                 */
       word GC_save_regs_ret_val;
   # endif
   
 /* Routine to mark from registers that are preserved by the C compiler. */  /* Routine to mark from registers that are preserved by the C compiler. */
 /* This must be ported to every new architecture.  There is a generic   */  /* This must be ported to every new architecture.  There is a generic   */
 /* version at the end, that is likely, but not guaranteed to work       */  /* version at the end, that is likely, but not guaranteed to work       */
Line 126  void GC_push_regs()
Line 136  void GC_push_regs()
           asm("addq.w &0x4,%sp");       /* put stack back where it was  */            asm("addq.w &0x4,%sp");       /* put stack back where it was  */
 #       endif /* M68K HP */  #       endif /* M68K HP */
   
 #       ifdef AMIGA  #       if defined(M68K) && defined(AMIGA)
         /*  AMIGA - could be replaced by generic code                   */           /*  AMIGA - could be replaced by generic code                  */
           /* a0, a1, d0 and d1 are caller save */           /* a0, a1, d0 and d1 are caller save */
   
   #        ifdef __GNUC__
             asm("subq.w &0x4,%sp");       /* allocate word on top of stack */
   
             asm("mov.l %a2,(%sp)"); asm("jsr _GC_push_one");
             asm("mov.l %a3,(%sp)"); asm("jsr _GC_push_one");
             asm("mov.l %a4,(%sp)"); asm("jsr _GC_push_one");
             asm("mov.l %a5,(%sp)"); asm("jsr _GC_push_one");
             asm("mov.l %a6,(%sp)"); asm("jsr _GC_push_one");
             /* Skip frame pointer and stack pointer */
             asm("mov.l %d2,(%sp)"); asm("jsr _GC_push_one");
             asm("mov.l %d3,(%sp)"); asm("jsr _GC_push_one");
             asm("mov.l %d4,(%sp)"); asm("jsr _GC_push_one");
             asm("mov.l %d5,(%sp)"); asm("jsr _GC_push_one");
             asm("mov.l %d6,(%sp)"); asm("jsr _GC_push_one");
             asm("mov.l %d7,(%sp)"); asm("jsr _GC_push_one");
   
             asm("addq.w &0x4,%sp");       /* put stack back where it was  */
   #        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));            GC_push_one(getreg(REG_A4));
Line 141  void GC_push_regs()
Line 170  void GC_push_regs()
           GC_push_one(getreg(REG_D5));            GC_push_one(getreg(REG_D5));
           GC_push_one(getreg(REG_D6));            GC_push_one(getreg(REG_D6));
           GC_push_one(getreg(REG_D7));            GC_push_one(getreg(REG_D7));
 #       endif  #        endif /* !__GNUC__ */
   #       endif /* AMIGA */
   
 #       if defined(M68K) && defined(MACOS)  #       if defined(M68K) && defined(MACOS)
 #       if defined(THINK_C)  #       if defined(THINK_C)
Line 244  void GC_push_regs()
Line 274  void GC_push_regs()
           asm ("movd r7, tos"); asm ("bsr ?_GC_push_one"); asm ("adjspb $-4");            asm ("movd r7, tos"); asm ("bsr ?_GC_push_one"); asm ("adjspb $-4");
 #       endif  #       endif
   
 #       ifdef SPARC  #       if defined(SPARC) || defined(IA64)
           {            {
               word GC_save_regs_in_stack();                word GC_save_regs_in_stack();
   
               /* generic code will not work */                /* generic code will not work */
               (void)GC_save_regs_in_stack();                GC_save_regs_ret_val = GC_save_regs_in_stack();
           }            }
 #       endif  #       endif
   
Line 309  void GC_push_regs()
Line 339  void GC_push_regs()
 #        endif /* !__GNUC__ */  #        endif /* !__GNUC__ */
 #       endif /* M68K/SYSV */  #       endif /* M68K/SYSV */
   
   #     if defined(PJ)
           {
               register int * sp asm ("optop");
               extern int *__libc_stack_end;
   
               GC_push_all_stack (sp, __libc_stack_end);
           }
   #     endif
   
       /* other machines... */        /* other machines... */
 #       if !(defined M68K) && !(defined VAX) && !(defined RT)  #       if !(defined M68K) && !(defined VAX) && !(defined RT)
 #       if !(defined SPARC) && !(defined I386) && !(defined NS32K)  #       if !(defined SPARC) && !(defined I386) && !(defined NS32K)
 #       if !defined(POWERPC) && !defined(UTS4)  #       if !defined(POWERPC) && !defined(UTS4) && !defined(IA64)
   #       if !defined(PJ)
             --> bad news <--              --> bad news <--
   #       endif
 #       endif  #       endif
 #       endif  #       endif
 #       endif  #       endif
Line 374  ptr_t cold_gc_frame;
Line 414  ptr_t cold_gc_frame;
 #   endif  #   endif
 # endif  # endif
   
   /* On IA64, we also need to flush register windows.  But they end       */
   /* up on the other side of the stack segment.                           */
   /* Returns the backing store pointer for the register stack.            */
   # ifdef IA64
           asm("        .text");
           asm("        .psr abi64");
           asm("        .psr lsb");
           asm("        .lsb");
           asm("");
           asm("        .text");
           asm("        .align 16");
           asm("        .global GC_save_regs_in_stack");
           asm("        .proc GC_save_regs_in_stack");
           asm("GC_save_regs_in_stack:");
           asm("        .body");
           asm("        flushrs");
           asm("        ;;");
           asm("        mov r8=ar.bsp");
           asm("        br.ret.sptk.few rp");
           asm("        .endp GC_save_regs_in_stack");
   # 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   */
 /* returns arg.  Stack clearing is crucial on SPARC, so we supply       */  /* returns arg.  Stack clearing is crucial on SPARC, so we supply       */

Legend:
Removed from v.1.1.1.1  
changed lines
  Added in v.1.1.1.2

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