home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / intrvews / xgrab.lha / xgrab / ui / GC / rt_allocobj.s < prev    next >
Encoding:
Text File  |  1990-04-25  |  2.9 KB  |  107 lines

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