mach_dep.c
上传用户:nthfjj
上传日期:2007-01-07
资源大小:37k
文件大小:7k
源码类别:

系统编程

开发平台:

Unix_Linux

  1. # include "runtime.h"
  2. /* Call allocobj or allocaobj after first saving at least those registers */
  3. /* not preserved by the C compiler. The register used for return values   */
  4. /* is not saved, since it will be clobbered anyway.                       */
  5. # ifdef RT
  6.     /* This is done in rt_allocobj.s */
  7. # else
  8. asm("    .text");
  9. asm(" .globl  __allocobj");
  10. asm(" .globl  __allocaobj");
  11. asm(" .globl  _allocobj");
  12. asm(" .globl  _allocaobj");
  13. # ifdef M68K
  14.     asm("_allocobj:");
  15.     asm("   link    a6,#0");
  16.     asm(" movl    d1,sp@-");
  17.     asm(" movl    a0,sp@-");
  18.     asm(" movl    a1,sp@-");
  19.     asm(" movl    sp@(20),sp@-");
  20.     asm(" jbsr    __allocobj");
  21.     asm(" addl    #4,sp");
  22.     asm(" movl    sp@+,a1");
  23.     asm(" movl    sp@+,a0");
  24.     asm(" movl    sp@+,d1");
  25.     asm(" unlk    a6");
  26.     asm(" rts");
  27.     
  28.     asm("_allocaobj:");
  29.     asm(" link    a6,#0");
  30.     asm(" movl    d1,sp@-");
  31.     asm(" movl    a0,sp@-");
  32.     asm(" movl    a1,sp@-");
  33.     asm(" movl    sp@(20),sp@-");
  34.     asm(" jbsr    __allocaobj");
  35.     asm(" addl    #4,sp");
  36.     asm(" movl    sp@+,a1");
  37.     asm(" movl    sp@+,a0");
  38.     asm(" movl    sp@+,d1");
  39.     asm(" unlk    a6");
  40.     asm(" rts");
  41. # endif
  42. # ifdef I386
  43.     asm(".data");
  44.     asm("gc_ret_value: .word 0");
  45.     asm(".word 0");
  46.     asm(".text");
  47.     asm("_allocaobj:");
  48.     asm("pushl %ebp");
  49.     asm("movl %esp,%ebp");
  50.     asm("pushal");
  51.     asm("pushl 8(%ebp)");          /* Push orignal argument */
  52.     asm("call __allocaobj");
  53.     asm("popl %ecx");
  54.     asm("movl %eax,gc_ret_value");  /* Save return value */
  55.     asm("popal");
  56.     asm("movl gc_ret_value,%eax");
  57.     asm("leave");
  58.     asm("ret");
  59.     asm("_allocobj:");
  60.     asm("pushl %ebp");
  61.     asm("movl %esp,%ebp");
  62.     asm("pushal");
  63.     asm("pushl 8(%ebp)");          /* Push orignal argument */
  64.     asm("call __allocobj");
  65.     asm("popl %ecx");
  66.     asm("movl %eax,gc_ret_value");  /* Save return value */
  67.     asm("popal");
  68.     asm("movl gc_ret_value,%eax");
  69.     asm("leave");
  70.     asm("ret");
  71. # endif
  72. # ifdef SPARC
  73.     asm("_allocaobj:");
  74.     asm(" ba __allocaobj");
  75.     asm(" nop");
  76.     asm("_allocobj:");
  77.     asm(" ba __allocobj");
  78.     asm(" nop");
  79.     
  80. #   include <sun4/trap.h>
  81.     asm(" .globl _save_regs_in_stack");
  82.     asm("_save_regs_in_stack:");
  83.     asm(" t 0x3   ! ST_FLUSH_WINDOWS");
  84.     asm(" mov %sp,%o0");
  85.     asm(" retl");
  86.     asm(" nop");
  87. # endif
  88. # ifdef VAX
  89.     asm("_allocobj:");
  90.     asm(".word    0x3e");
  91.     asm("pushl   4(ap)");
  92.     asm("calls   $1,__allocobj");
  93.     asm("ret");
  94.     asm("_allocaobj:");
  95.     asm(".word   0x3e");
  96.     asm("pushl   4(ap)");
  97.     asm("calls   $1,__allocaobj");
  98.     asm("ret");
  99. # endif
  100. # ifdef NS32K
  101.     asm("_allocobj:");
  102.     asm("enter [],$0");
  103.     asm("movd r1,tos");
  104.     asm("movd r2,tos");
  105.     asm("movd 8(fp),tos");
  106.     asm("bsr ?__allocobj");
  107.     asm("adjspb $-4");
  108.     asm("movd tos,r2");
  109.     asm("movd tos,r1");
  110.     asm("exit []");
  111.     asm("ret $0");
  112.     asm("_allocaobj:");
  113.     asm("enter [],$0");
  114.     asm("movd r1,tos");
  115.     asm("movd r2,tos");
  116.     asm("movd 8(fp),tos");
  117.     asm("bsr ?__allocaobj");
  118.     asm("adjspb $-4");
  119.     asm("movd tos,r2");
  120.     asm("movd tos,r1");
  121.     asm("exit []");
  122.     asm("ret $0");
  123. # endif
  124. # if !defined(VAX) && !defined(M68K) && !defined(SPARC) && !defined(I386) && !defined(NS32K)
  125.     --> fix it
  126. # endif
  127. # endif
  128. /* Routine to mark from registers that are preserved by the C compiler */
  129. mark_regs()
  130. {
  131. #       ifdef RT
  132.   register long TMP_SP; /* must be bound to r11 */
  133. #       endif
  134. #       ifdef VAX
  135.   /* r1 through r5 are preserved by allocobj, and therefore     */
  136.   /* on the stack.                                              */
  137.   asm("pushl r11");     asm("calls $1,_tl_mark");
  138.   asm("pushl r10");  asm("calls $1,_tl_mark");
  139.   asm("pushl r9"); asm("calls $1,_tl_mark");
  140.   asm("pushl r8"); asm("calls $1,_tl_mark");
  141.   asm("pushl r7"); asm("calls $1,_tl_mark");
  142.   asm("pushl r6"); asm("calls $1,_tl_mark");
  143.   asm("movl sp,r11"); /* TMP_SP = stack pointer sp */
  144. #       endif
  145. #       ifdef M68K
  146.   /* a0, a1 and d1 are preserved by allocobj */
  147.   /*  and therefore are on stack             */
  148.   asm("subqw #0x4,sp"); /* allocate word on top of stack */
  149.   asm("movl a0,sp@"); asm("jbsr _tl_mark");
  150.   asm("movl a1,sp@"); asm("jbsr _tl_mark");
  151.   asm("movl a2,sp@"); asm("jbsr _tl_mark");
  152.   asm("movl a3,sp@"); asm("jbsr _tl_mark");
  153.   asm("movl a4,sp@"); asm("jbsr _tl_mark");
  154.   asm("movl a5,sp@"); asm("jbsr _tl_mark");
  155.   /* Skip frame pointer and stack pointer */
  156.   asm("movl d0,sp@"); asm("jbsr _tl_mark");
  157.   asm("movl d1,sp@"); asm("jbsr _tl_mark");
  158.   asm("movl d2,sp@"); asm("jbsr _tl_mark");
  159.   asm("movl d3,sp@"); asm("jbsr _tl_mark");
  160.   asm("movl d4,sp@"); asm("jbsr _tl_mark");
  161.   asm("movl d5,sp@"); asm("jbsr _tl_mark");
  162.   asm("movl d6,sp@"); asm("jbsr _tl_mark");
  163.   asm("movl d7,sp@"); asm("jbsr _tl_mark");
  164.   asm("addqw #0x4,sp"); /* put stack back where it was */
  165.   asm("movl a7,d7"); /* TMP_SP = stack pointer a7 */
  166. #       endif
  167. #       ifdef I386
  168.   asm("pushl %eax");  asm("call _tl_mark"); asm("addl $4,%esp");
  169.   asm("pushl %ecx");  asm("call _tl_mark"); asm("addl $4,%esp");
  170.   asm("pushl %edx");  asm("call _tl_mark"); asm("addl $4,%esp");
  171.   asm("pushl %esi");  asm("call _tl_mark"); asm("addl $4,%esp");
  172.   asm("pushl %edi");  asm("call _tl_mark"); asm("addl $4,%esp");
  173.   asm("pushl %ebx");  asm("call _tl_mark"); asm("addl $4,%esp");
  174. #       endif
  175. #       ifdef NS32K
  176.   asm ("movd r3, tos"); asm ("bsr ?_tl_mark"); asm ("adjspb $-4");
  177.   asm ("movd r4, tos"); asm ("bsr ?_tl_mark"); asm ("adjspb $-4");
  178.   asm ("movd r5, tos"); asm ("bsr ?_tl_mark"); asm ("adjspb $-4");
  179.   asm ("movd r6, tos"); asm ("bsr ?_tl_mark"); asm ("adjspb $-4");
  180.   asm ("movd r7, tos"); asm ("bsr ?_tl_mark"); asm ("adjspb $-4");
  181. #       endif
  182. #       ifdef SPARC
  183.   save_regs_in_stack();
  184. #       endif
  185. # ifdef RT
  186.   /* we used to think this wasn't necessary, but gcollect */
  187.   /* can be called from many places ...                   */
  188.     tl_mark(TMP_SP); /* tl_mark from r11 */
  189.     asm("cas r11, r6, r0"); tl_mark(TMP_SP); /* r6 */
  190.     asm("cas r11, r7, r0"); tl_mark(TMP_SP); /* through */
  191.     asm("cas r11, r8, r0"); tl_mark(TMP_SP); /* r10 */
  192.     asm("cas r11, r9, r0"); tl_mark(TMP_SP);
  193.     asm("cas r11, r10, r0"); tl_mark(TMP_SP);
  194.     asm("cas r11, r12, r0"); tl_mark(TMP_SP); /* r12 */
  195.     asm("cas r11, r13, r0"); tl_mark(TMP_SP); /* through */
  196.     asm("cas r11, r14, r0"); tl_mark(TMP_SP); /* r15 */
  197.     asm("cas r11, r15, r0"); tl_mark(TMP_SP);
  198. # endif
  199.       /* other machines... */
  200. #       if !(defined M68K) && !(defined VAX) && !(defined RT) && !(defined SPARC) && !(defined I386) &&!(defined NS32K)
  201.     --> bad news <--
  202. #       endif
  203. }