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

系统编程

开发平台:

Unix_Linux

  1. /*
  2.  * This (assembly) file contains the functions:
  3.  * struct obj * allocobj(sz)
  4.  * struct obj * allocaobj(sz)
  5.  */
  6. /*
  7.  * allocobj(i) insures that the free list entry for objects of size
  8.  * i is not empty.
  9.  *
  10.  * Call _allocobj after first saving the registers which
  11.  * are not guaranteed to be preserved (r0-r5 and r15).
  12.  *
  13.  * Note: the reason we have to use this interface between the caller
  14.  * and the garbage collector is in order to preserve the caller's registers
  15.  * which the C compiler would normally trash.  We just stick 'em on the stack
  16.  * so that the mark_all procedure (which marks everything on the stack) will
  17.  * see them.
  18.  *
  19.  * this is the RT version. The 68k version is in 68Kallocobj.s
  20.  */
  21. /* this prolog was copied from a cc-produced .s file */
  22. .text
  23. .align 2
  24. .data
  25. .align 2
  26. .ltorg
  27. .text
  28. .ascii "<allocobj>"
  29. .align 2
  30. .globl _.allocobj
  31. _.allocobj:
  32. .data
  33. .globl _allocobj
  34. _allocobj: .long _.allocobj /* text area contains instr ptr */
  35. .text
  36.     /*
  37.      * save registers which will be trashed on the stack in the place
  38.      * the RT linkage convention uses for saving registers
  39.      */
  40. .using _allocobj,r14 /* tell assembler r14 is reliable base */
  41. stm r3, -100+(3*4)(r1) /* we don't save r1 cause it's sp */
  42. ai r1,r1,-(36+13*4)
  43. mr r14, r0 /* initialize data area pointer */
  44. balix r15, _._allocobj /* call _allocobj() */
  45. get r0,$.long(__allocobj) /* get data area pointer */
  46. lm r3, -100+(36+13*4)+(3*4)(r1) /* restore regs */
  47. brx r15 /* return to caller (no restore req'd) */
  48. ai r1, $(36+13*4) /* restore r1 to where it belongs */
  49. /* trace table for allocobj */
  50. .align 2
  51. .byte 0xdf /* magic1 */
  52. .byte 0x07 /* code */
  53. .byte 0xdf /* magic2 */
  54. .byte 0x08 /* first_gpr << 4 | opt stuff */
  55. .byte 0x01 /* no. args and stack reg num */
  56. .byte 0x3c /* 0011 1100 ==> stack frame sz = 60 */
  57. .data
  58. .ltorg
  59. .text
  60. .ascii "<allocaobj>"
  61. .align 2
  62. .globl _.allocaobj
  63. _.allocaobj:
  64. .data
  65. .globl _allocaobj
  66. _allocaobj: .long _.allocaobj /* text area contains instr ptr */
  67. .text
  68.     /*
  69.      * save registers which will be trashed on the stack in the place
  70.      * the RT linkage convention uses for saving registers
  71.      */
  72. .using _allocaobj,r14 /* tell assembler r14 is reliable base */
  73. stm r3, -100+(3*4)(r1) /* we don't save r1 cause it's sp */
  74. ai r1,r1,-(36+13*4)
  75. mr r14, r0 /* initialize data area pointer */
  76. balix r15, _._allocaobj /* call _allocaobj() */
  77. get r0,$.long(__allocaobj) /* get data area pointer */
  78. lm r3, -100+(36+13*4)+(3*4)(r1) /* restore regs */
  79. brx r15 /* return to caller (no restore req'd) */
  80. ai r1, $(36+13*4) /* restore r1 to where it belongs */
  81. /* trace table for allocaobj */
  82. .align 2
  83. .byte 0xdf /* magic1 */
  84. .byte 0x07 /* code */
  85. .byte 0xdf /* magic2 */
  86. .byte 0x08 /* first_gpr << 4 | opt stuff */
  87. .byte 0x01 /* no. args and stack reg num */
  88. .byte 0x3c /* 0011 1100 ==> stack frame sz = 60 */
  89. .data
  90. .ltorg
  91. .globl .oVpcc
  92. .globl .oVncs
  93. .set .oVpcc, 0
  94. .set .oVncs, 0