00001 # include "gc_private.h"
00002 # include <stdio.h>
00003 # include <setjmp.h>
00004 # ifdef OS2
00005 # define _setjmp(b) setjmp(b)
00006 # define _longjmp(b,v) longjmp(b,v)
00007 # endif
00008
00009
00010
00011
00012
00013
00014 GC_mark_regs()
00015 {
00016 # ifdef RT
00017 register long TMP_SP;
00018 # endif
00019 # ifdef VAX
00020
00021
00022
00023 asm("pushl r11"); asm("calls $1,_GC_tl_mark");
00024 asm("pushl r10"); asm("calls $1,_GC_tl_mark");
00025 asm("pushl r9"); asm("calls $1,_GC_tl_mark");
00026 asm("pushl r8"); asm("calls $1,_GC_tl_mark");
00027 asm("pushl r7"); asm("calls $1,_GC_tl_mark");
00028 asm("pushl r6"); asm("calls $1,_GC_tl_mark");
00029 # endif
00030 # if defined(M68K) && defined(SUNOS)
00031
00032
00033
00034
00035 asm("subqw #0x4,sp");
00036
00037 asm("movl a2,sp@"); asm("jbsr _GC_tl_mark");
00038 asm("movl a3,sp@"); asm("jbsr _GC_tl_mark");
00039 asm("movl a4,sp@"); asm("jbsr _GC_tl_mark");
00040 asm("movl a5,sp@"); asm("jbsr _GC_tl_mark");
00041
00042 asm("movl d1,sp@"); asm("jbsr _GC_tl_mark");
00043 asm("movl d2,sp@"); asm("jbsr _GC_tl_mark");
00044 asm("movl d3,sp@"); asm("jbsr _GC_tl_mark");
00045 asm("movl d4,sp@"); asm("jbsr _GC_tl_mark");
00046 asm("movl d5,sp@"); asm("jbsr _GC_tl_mark");
00047 asm("movl d6,sp@"); asm("jbsr _GC_tl_mark");
00048 asm("movl d7,sp@"); asm("jbsr _GC_tl_mark");
00049
00050 asm("addqw #0x4,sp");
00051 # endif
00052
00053 # if defined(M68K) && defined(HP)
00054
00055
00056
00057 asm("subq.w &0x4,%sp");
00058
00059 asm("mov.l %a2,(%sp)"); asm("jsr _GC_tl_mark");
00060 asm("mov.l %a3,(%sp)"); asm("jsr _GC_tl_mark");
00061 asm("mov.l %a4,(%sp)"); asm("jsr _GC_tl_mark");
00062 asm("mov.l %a5,(%sp)"); asm("jsr _GC_tl_mark");
00063
00064 asm("mov.l %d1,(%sp)"); asm("jsr _GC_tl_mark");
00065 asm("mov.l %d2,(%sp)"); asm("jsr _GC_tl_mark");
00066 asm("mov.l %d3,(%sp)"); asm("jsr _GC_tl_mark");
00067 asm("mov.l %d4,(%sp)"); asm("jsr _GC_tl_mark");
00068 asm("mov.l %d5,(%sp)"); asm("jsr _GC_tl_mark");
00069 asm("mov.l %d6,(%sp)"); asm("jsr _GC_tl_mark");
00070 asm("mov.l %d7,(%sp)"); asm("jsr _GC_tl_mark");
00071
00072 asm("addq.w &0x4,%sp");
00073 # endif
00074
00075 # if defined(I386) && !defined(OS2) && !defined(SUNOS5)
00076
00077
00078 asm("pushl %eax"); asm("call _GC_tl_mark"); asm("addl $4,%esp");
00079 asm("pushl %ecx"); asm("call _GC_tl_mark"); asm("addl $4,%esp");
00080 asm("pushl %edx"); asm("call _GC_tl_mark"); asm("addl $4,%esp");
00081 asm("pushl %esi"); asm("call _GC_tl_mark"); asm("addl $4,%esp");
00082 asm("pushl %edi"); asm("call _GC_tl_mark"); asm("addl $4,%esp");
00083 asm("pushl %ebx"); asm("call _GC_tl_mark"); asm("addl $4,%esp");
00084 # endif
00085
00086 # if defined(I386) && defined(SUNOS5)
00087
00088
00089 asm("pushl %eax"); asm("call GC_tl_mark"); asm("addl $4,%esp");
00090 asm("pushl %ecx"); asm("call GC_tl_mark"); asm("addl $4,%esp");
00091 asm("pushl %edx"); asm("call GC_tl_mark"); asm("addl $4,%esp");
00092 asm("pushl %esi"); asm("call GC_tl_mark"); asm("addl $4,%esp");
00093 asm("pushl %edi"); asm("call GC_tl_mark"); asm("addl $4,%esp");
00094 asm("pushl %ebx"); asm("call GC_tl_mark"); asm("addl $4,%esp");
00095 # endif
00096
00097 # ifdef NS32K
00098 asm ("movd r3, tos"); asm ("bsr ?_GC_tl_mark"); asm ("adjspb $-4");
00099 asm ("movd r4, tos"); asm ("bsr ?_GC_tl_mark"); asm ("adjspb $-4");
00100 asm ("movd r5, tos"); asm ("bsr ?_GC_tl_mark"); asm ("adjspb $-4");
00101 asm ("movd r6, tos"); asm ("bsr ?_GC_tl_mark"); asm ("adjspb $-4");
00102 asm ("movd r7, tos"); asm ("bsr ?_GC_tl_mark"); asm ("adjspb $-4");
00103 # endif
00104
00105 # ifdef SPARC
00106
00107 GC_save_regs_in_stack();
00108 # endif
00109
00110 # ifdef RT
00111 GC_tl_mark(TMP_SP);
00112
00113 asm("cas r11, r6, r0"); GC_tl_mark(TMP_SP);
00114 asm("cas r11, r7, r0"); GC_tl_mark(TMP_SP);
00115 asm("cas r11, r8, r0"); GC_tl_mark(TMP_SP);
00116 asm("cas r11, r9, r0"); GC_tl_mark(TMP_SP);
00117 asm("cas r11, r10, r0"); GC_tl_mark(TMP_SP);
00118
00119 asm("cas r11, r12, r0"); GC_tl_mark(TMP_SP);
00120 asm("cas r11, r13, r0"); GC_tl_mark(TMP_SP);
00121 asm("cas r11, r14, r0"); GC_tl_mark(TMP_SP);
00122 asm("cas r11, r15, r0"); GC_tl_mark(TMP_SP);
00123 # endif
00124
00125 # if defined(M68K) && defined(SYSV)
00126
00127
00128
00129 # ifdef __GNUC__
00130 asm("subqw #0x4,%sp");
00131
00132 asm("movl %a2,%sp@"); asm("jbsr GC_tl_mark");
00133 asm("movl %a3,%sp@"); asm("jbsr GC_tl_mark");
00134 asm("movl %a4,%sp@"); asm("jbsr GC_tl_mark");
00135 asm("movl %a5,%sp@"); asm("jbsr GC_tl_mark");
00136
00137 asm("movl %d1,%sp@"); asm("jbsr GC_tl_mark");
00138 asm("movl %d2,%sp@"); asm("jbsr GC_tl_mark");
00139 asm("movl %d3,%sp@"); asm("jbsr GC_tl_mark");
00140 asm("movl %d4,%sp@"); asm("jbsr GC_tl_mark");
00141 asm("movl %d5,%sp@"); asm("jbsr GC_tl_mark");
00142 asm("movl %d6,%sp@"); asm("jbsr GC_tl_mark");
00143 asm("movl %d7,%sp@"); asm("jbsr GC_tl_mark");
00144
00145 asm("addqw #0x4,%sp");
00146 # else
00147 asm("subq.w &0x4,%sp");
00148
00149 asm("mov.l %a2,(%sp)"); asm("jsr GC_tl_mark");
00150 asm("mov.l %a3,(%sp)"); asm("jsr GC_tl_mark");
00151 asm("mov.l %a4,(%sp)"); asm("jsr GC_tl_mark");
00152 asm("mov.l %a5,(%sp)"); asm("jsr GC_tl_mark");
00153
00154 asm("mov.l %d1,(%sp)"); asm("jsr GC_tl_mark");
00155 asm("mov.l %d2,(%sp)"); asm("jsr GC_tl_mark");
00156 asm("mov.l %d3,(%sp)"); asm("jsr GC_tl_mark");
00157 asm("mov.l %d4,(%sp)"); asm("jsr GC_tl_mark");
00158 asm("mov.l %d5,(%sp)"); asm("jsr GC_tl_mark");
00159 asm("mov.l %d6,(%sp)"); asm("jsr GC_tl_mark");
00160 asm("mov.l %d7,(%sp)"); asm("jsr GC_tl_mark");
00161
00162 asm("addq.w &0x4,%sp");
00163 # endif
00164 # endif
00165
00166
00167 # if defined(HP_PA) || (defined(I386) && defined(OS2))
00168
00169
00170
00171
00172 {
00173 jmp_buf regs;
00174 register word * i = (word *) regs;
00175 register ptr_t lim = (ptr_t)(regs) + (sizeof regs);
00176
00177
00178
00179 for (; (char *)i < lim; i++) {
00180 *i = 0;
00181 }
00182 (void) _setjmp(regs);
00183 GC_mark_all_stack((ptr_t)regs, lim);
00184 }
00185 # endif
00186
00187
00188 # if !(defined M68K) && !(defined VAX) && !(defined RT)
00189 # if !(defined SPARC) && !(defined I386) &&!(defined NS32K)
00190 # if !defined(HP_PA)
00191 --> bad news <--
00192 # endif
00193 # endif
00194 # endif
00195 }
00196
00197
00198
00199 # ifdef SPARC
00200 # ifdef SUNOS5
00201 asm(" .globl GC_save_regs_in_stack");
00202 asm("GC_save_regs_in_stack:");
00203 # else
00204 asm(" .globl _GC_save_regs_in_stack");
00205 asm("_GC_save_regs_in_stack:");
00206 # endif
00207 asm(" ta 0x3 ! ST_FLUSH_WINDOWS");
00208 asm(" mov %sp,%o0");
00209 asm(" retl");
00210 asm(" nop");
00211 # endif
00212