Changeset 8068


Ignore:
Timestamp:
Jan 15, 2008, 2:48:59 AM (12 years ago)
Author:
rme
Message:

Skeletal subprims and other low-level x8632 stuff.

Location:
branches/ia32/lisp-kernel
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/ia32/lisp-kernel/x86-constants32.s

    r7286 r8068  
     1define([eax_l],[eax])
     2define([ecx_l],[ecx])
     3define([edx_l],[edx])
     4define([ebx_l],[ebx])
     5define([esi_l],[esi])
     6define([edi_l],[edi])
     7
     8define([eax_b],[al])
     9define([ecx_b],[cl])
     10define([edx_b],[dl])
     11define([ebx_b],[bl])
     12
    113define([imm0],[eax])
     14        define([imm0_l],[eax])
     15        define([imm0_w],[ax])
     16        define([imm0_b],[al])
     17        define([Rimm0],[0])
     18
    219define([temp0],[ecx])
     20        define([temp0_l],[ecx])
     21        define([temp0_w],[cx])
     22        define([temp0_b],[cl])
     23        define([Rtemp0],[1])
     24
    325define([temp1],[edx])
     26        define([temp1_l],[edx])
     27        define([temp1_w],[dx])
     28        define([temp1_b],[dl])
     29        define([Rtemp1],[2])
     30
    431define([arg_z],[ebx])
     32        define([arg_z_l],[ebx])
     33        define([arg_z_w],[bx])
     34        define([arg_z_b],[bl])
     35        define([Rarg_z],[3])
     36
    537define([arg_y],[esi])
     38        define([Rarg_y],[6])
     39
    640define([fn],[edi])
     41        define([Rfn],[7])
    742
    843define([rcontext],[fs])
    9 
    1044define([fname],[temp0])
    1145define([allocptr],[temp0])
     46
     47define([nargs_b],[imm0_b])
     48define([nargs],[imm0_w])
     49define([nargs_l],[imm0])
     50
     51define([ra0],[temp0])
     52define([xfn],[temp1])
     53
     54define([allocptr],[temp0])
     55define([stack_temp],[mm7])
    1256
    1357define([fp0],[xmm0])           
     
    2771nfixnumtagbits = 2
    2872num_subtag_bits = 8
     73subtag_shift = num_subtag_bits
    2974fixnumshift = 2
    3075fixnum_shift = 2
     
    185230         _node(foreign_sp) /* necessary? */
    186231         _node(db_link)    /* head of special-binding chain */
    187          _node(_save3)     /* saved nvrs (probably won't have any on IA-32 */
    188          _node(_save2)
    189          _node(_save1)
    190          _node(_save0)
    191232         _node(xframe)     /* exception frame chain */
    192233         _node(pc)         /* TRA of catch exit or cleanup form */
     
    431472
    432473        _struct(tcr,TCR_BIAS)
     474         _node(next)            /* in doubly-linked list */
    433475         _node(prev)            /* in doubly-linked list */
    434          _node(next)            /* in doubly-linked list */
    435476         _word(node_regs_mask)
    436477         _node(linear)          /* our linear (non-segment-based) address. */
     478         _node(save0)           /* spill area for node registers (16-byte aligned ) */
     479         _node(save1)
     480         _node(save2)
     481         _node(save3)
    437482         _node(save_ebp)        /* lisp EBP when in foreign code */
    438483         _word(lisp_mxcsr)
     
    447492         _node(ts_area)         /* tstack area pointer */
    448493         _node(cs_limit)        /* cstack overflow limit */
    449          _word(bytes_consed_low)
     494         _word(bytes_allocated)
    450495         _word(bytes_consed_high)
    451496         _node(log2_allocation_quantum)
     
    478523         _node(next_tsp)
    479524         _node(safe_ref_address)
    480          _word(ldt_index)
    481525         _word(ldt_selector)
    482526        _ends
     
    496540       
    497541INTERRUPT_LEVEL_BINDING_INDEX = fixnumone
     542
  • branches/ia32/lisp-kernel/x86-spentry32.s

    r7358 r8068  
    11        include(lisp.s)
    2         _beginfile
    32
    43        .align 2
     
    65        .p2align 3
    76        _exportfn(_SP$1)
    8         .line  __line__
    97])
    108
    119define([_endsubp],[
    1210        _endfn(_SP$1)
    13 #  __line__
    1411])
    1512
     
    3936        __(ret)
    4037_endsubp(fix_overflow)
     38
     39_spentry(misc_ref)
     40        __(int $3)
     41_endsubp(misc_ref)
     42
     43_startfn(C(misc_ref_common))
     44        __(int $3)
     45_endfn(C(misc_ref_common))
     46
     47_spentry(subtag_misc_ref)
     48        __(int $3)
     49_endsubp(subtag_misc_ref)
     50
     51_spentry(subtag_misc_set)
     52        __(int $3)
     53_endsubp(subtag_misc_set)
     54
     55_spentry(misc_set)
     56        __(int $3)
     57_endsubp(misc_set)
     58
     59_startfn(C(misc_set_common))
     60        __(ret)
     61_endfn(C(misc_set_common))
     62
     63_spentry(Fret1valn)
     64        .globl C(ret1valn)
     65__(tra(C(ret1valn)))
     66        __(mov (%esp),%ra0)
     67        __(mov %arg_z,(%esp))
     68        __(set_nargs(1))
     69        __(jmp *%ra0)
     70_endsubp(Fret1valn)
     71
     72_spentry(nvalret)
     73        .globl C(nvalret)                       
     74C(nvalret):
     75        __(leave)
     76        __(ret)
     77_endsubp(nvalret)
     78
     79_spentry(jmpsym)
     80        __(jump_fname())
     81_endsubp(jmpsym)
     82
     83_spentry(jmpnfn)
     84        __(mov %temp0,%fn)
     85        __(jmp *%fn)
     86_endsubp(jmpnfn)
     87
     88_spentry(funcall)
     89        __(do_funcall())
     90_endsubp(funcall)
    4191
    4292/* Make a lisp integer (fixnum or one-digit bignum) from the value in %imm0 */
     
    591090:      __(repret)
    60110_endsubp(makes32)
    61        
     111
     112_spentry(makes64)
     113        __(int $3)
     114_endsubp(makes64)       
     115
     116/* xxx make lisp integer out of mm0 */
    62117/* Make a lisp integer (probably a bignum) out of the %edx:%eax pair. */
    63118/* We assume that the node_regs_mask in the TCR has been set to mark */
     
    77132_endfn
    78133
    79 /* %arg_y = uvector, %arg_z = index */
    80 /* subtag in %imm0.b */
    81 _startfn(C(misc_ref_common))
    82         .p2align 2
    83 local_label(misc_ref_jmp):           
    84         /* 00-0f  */
    85          .long local_label(misc_ref_invalid) /* 00 even_fixnum  */
    86          .long local_label(misc_ref_invalid) /* 01 cons  */
    87          .long local_label(misc_ref_invalid) /* 02 nodeheader  */
    88          .long local_label(misc_ref_invalid) /* 03 imm  */
    89          .long local_label(misc_ref_invalid) /* 04 odd_fixnum  */
    90          .long local_label(misc_ref_invalid) /* 05 tra  */
    91          .long local_label(misc_ref_invalid) /* 06 misc  */
    92          .long local_label(misc_ref_u32)     /* 07 bignum  */
    93          .long local_label(misc_ref_invalid) /* 08 even_fixnum  */
    94          .long local_label(misc_ref_invalid) /* 09 cons  */
    95          .long local_label(misc_ref_node)    /* 0a ratio  */
    96          .long local_label(misc_ref_invalid) /* 0b imm  */
    97          .long local_label(misc_ref_invalid) /* 0c odd_fixnum  */
    98          .long local_label(misc_ref_invalid) /* 0d nil  */
    99          .long local_label(misc_ref_invalid) /* 0e misc  */
    100          .long local_label(misc_ref_u32)     /* 0f single_float  */
    101         /* 10-1f  */
    102          .long local_label(misc_ref_invalid) /* 10 even_fixnum  */
    103          .long local_label(misc_ref_invalid) /* 11 cons  */
    104          .long local_label(misc_ref_invalid) /* 12 nodeheader  */
    105          .long local_label(misc_ref_invalid) /* 13 imm  */
    106          .long local_label(misc_ref_invalid) /* 14 odd_fixnum  */
    107          .long local_label(misc_ref_invalid) /* 15 tra  */
    108          .long local_label(misc_ref_invalid) /* 16 misc  */
    109          .long local_label(misc_ref_u32)     /* 17 double_float  */
    110          .long local_label(misc_ref_invalid) /* 18 even_fixnum  */
    111          .long local_label(misc_ref_invalid) /* 19 cons  */
    112          .long local_label(misc_ref_node)    /* 1a complex  */
    113          .long local_label(misc_ref_invalid) /* 1b imm  */
    114          .long local_label(misc_ref_invalid) /* 1c odd_fixnum  */
    115          .long local_label(misc_ref_invalid) /* 1d nil  */
    116          .long local_label(misc_ref_invalid) /* 1e misc  */
    117          .long local_label(misc_ref_u32)     /* 1f macptr  */
    118         /* 20-2f  */
    119          .long local_label(misc_ref_invalid) /* 20 even_fixnum  */
    120          .long local_label(misc_ref_invalid) /* 21 cons  */
    121          .long local_label(misc_ref_node)    /* 22 catch_frame  */
    122          .long local_label(misc_ref_invalid) /* 23 imm  */
    123          .long local_label(misc_ref_invalid) /* 24 odd_fixnum  */
    124          .long local_label(misc_ref_invalid) /* 25 tra  */
    125          .long local_label(misc_ref_invalid) /* 26 misc  */
    126          .long local_label(misc_ref_u32)     /* 27 dead_macptr  */
    127          .long local_label(misc_ref_invalid) /* 28 even_fixnum  */
    128          .long local_label(misc_ref_invalid) /* 29 cons  */
    129          .long local_label(misc_ref_node)    /* 2a function  */
    130          .long local_label(misc_ref_invalid) /* 2b imm  */
    131          .long local_label(misc_ref_invalid) /* 2c odd_fixnum  */
    132          .long local_label(misc_ref_invalid) /* 2d nil  */
    133          .long local_label(misc_ref_invalid) /* 2e misc  */
    134          .long local_label(misc_ref_u32)     /* 2f code_vector  */
    135         /* 30-3f  */
    136          .long local_label(misc_ref_invalid) /* 30 even_fixnum  */
    137          .long local_label(misc_ref_invalid) /* 31 cons  */
    138          .long local_label(misc_ref_node)    /* 32 lisp_thread  */
    139          .long local_label(misc_ref_invalid) /* 33 imm  */
    140          .long local_label(misc_ref_invalid) /* 34 odd_fixnum  */
    141          .long local_label(misc_ref_invalid) /* 35 tra  */
    142          .long local_label(misc_ref_invalid) /* 36 misc  */
    143          .long local_label(misc_ref_u32)     /* 37 creole  */
    144          .long local_label(misc_ref_invalid) /* 38 even_fixnum  */
    145          .long local_label(misc_ref_invalid) /* 39 cons  */
    146          .long local_label(misc_ref_node)    /* 3a symbol  */
    147          .long local_label(misc_ref_invalid) /* 3b imm  */
    148          .long local_label(misc_ref_invalid) /* 3c odd_fixnum  */
    149          .long local_label(misc_ref_invalid) /* 3d nil  */
    150          .long local_label(misc_ref_invalid) /* 3e misc  */
    151          .long local_label(misc_ref_u32)     /* 3f xcode_vector  */
    152         /* 40-4f  */
    153          .long local_label(misc_ref_invalid) /* 40 even_fixnum  */
    154          .long local_label(misc_ref_invalid) /* 41 cons  */
    155          .long local_label(misc_ref_node)    /* 42 lock  */
    156          .long local_label(misc_ref_invalid) /* 43 imm  */
    157          .long local_label(misc_ref_invalid) /* 44 odd_fixnum  */
    158          .long local_label(misc_ref_invalid) /* 45 tra  */
    159          .long local_label(misc_ref_invalid) /* 46 misc  */
    160          .long local_label(misc_ref_invalid) /* 47 immheader  */
    161          .long local_label(misc_ref_invalid) /* 48 even_fixnum  */
    162          .long local_label(misc_ref_invalid) /* 49 cons  */
    163          .long local_label(misc_ref_node)    /* 4a hash_vector  */
    164          .long local_label(misc_ref_invalid) /* 4b imm  */
    165          .long local_label(misc_ref_invalid) /* 4c odd_fixnum  */
    166          .long local_label(misc_ref_invalid) /* 4d tra  */
    167          .long local_label(misc_ref_invalid) /* 4e misc  */
    168          .long local_label(misc_ref_invalid) /* 4f immheader  */
    169         /* 50-5f  */
    170          .long local_label(misc_ref_invalid) /* 50 even_fixnum  */
    171          .long local_label(misc_ref_invalid) /* 51 cons  */
    172          .long local_label(misc_ref_node)    /* 52 pool  */
    173          .long local_label(misc_ref_invalid) /* 53 imm  */
    174          .long local_label(misc_ref_invalid) /* 54 odd_fixnum  */
    175          .long local_label(misc_ref_invalid) /* 55 tra  */
    176          .long local_label(misc_ref_invalid) /* 56 misc  */
    177          .long local_label(misc_ref_invalid) /* 57 immheader  */
    178          .long local_label(misc_ref_invalid) /* 58 even_fixnum  */
    179          .long local_label(misc_ref_invalid) /* 59 cons  */
    180          .long local_label(misc_ref_node)    /* 5a weak  */
    181          .long local_label(misc_ref_invalid) /* 5b imm  */
    182          .long local_label(misc_ref_invalid) /* 5c odd_fixnum  */
    183          .long local_label(misc_ref_invalid) /* 5d nil  */
    184          .long local_label(misc_ref_invalid) /* 5e misc  */
    185          .long local_label(misc_ref_invalid) /* 5f immheader  */
    186         /* 60-6f  */
    187          .long local_label(misc_ref_invalid) /* 60 even_fixnum  */
    188          .long local_label(misc_ref_invalid) /* 61 cons  */
    189          .long local_label(misc_ref_node)    /* 62 package  */
    190          .long local_label(misc_ref_invalid) /* 63 imm  */
    191          .long local_label(misc_ref_invalid) /* 64 odd_fixnum  */
    192          .long local_label(misc_ref_invalid) /* 65 tra  */
    193          .long local_label(misc_ref_invalid) /* 66 misc  */
    194          .long local_label(misc_ref_invalid) /* 67 immheader  */
    195          .long local_label(misc_ref_invalid) /* 68 even_fixnum  */
    196          .long local_label(misc_ref_invalid) /* 69 cons  */
    197          .long local_label(misc_ref_node)    /* 6a slot_vector  */
    198          .long local_label(misc_ref_invalid) /* 6b imm  */
    199          .long local_label(misc_ref_invalid) /* 6c odd_fixnum  */
    200          .long local_label(misc_ref_invalid) /* 6d tra  */
    201          .long local_label(misc_ref_invalid) /* 6e misc  */
    202          .long local_label(misc_ref_invalid) /* 6f immheader  */
    203         /* 70-7f  */
    204          .long local_label(misc_ref_invalid) /* 70 even_fixnum  */
    205          .long local_label(misc_ref_invalid) /* 71 cons  */
    206          .long local_label(misc_ref_node)    /* 72 instance  */
    207          .long local_label(misc_ref_invalid) /* 73 imm  */
    208          .long local_label(misc_ref_invalid) /* 74 odd_fixnum  */
    209          .long local_label(misc_ref_invalid) /* 75 tra  */
    210          .long local_label(misc_ref_invalid) /* 76 misc  */
    211          .long local_label(misc_ref_invalid) /* 77 immheader  */
    212          .long local_label(misc_ref_invalid) /* 78 even_fixnum  */
    213          .long local_label(misc_ref_invalid) /* 79 cons  */
    214          .long local_label(misc_ref_node)    /* 7a struct  */
    215          .long local_label(misc_ref_invalid) /* 7b imm  */
    216          .long local_label(misc_ref_invalid) /* 7c odd_fixnum  */
    217          .long local_label(misc_ref_invalid) /* 7d tra  */
    218          .long local_label(misc_ref_invalid) /* 7e misc  */
    219          .long local_label(misc_ref_invalid) /* 7f immheader  */
    220         /* 80-8f  */
    221          .long local_label(misc_ref_invalid) /* 80 even_fixnum  */
    222          .long local_label(misc_ref_invalid) /* 81 cons  */
    223          .long local_label(misc_ref_node)    /* 82 istruct  */
    224          .long local_label(misc_ref_invalid) /* 83 imm  */
    225          .long local_label(misc_ref_invalid) /* 84 odd_fixnum  */
    226          .long local_label(misc_ref_invalid) /* 85 tra  */
    227          .long local_label(misc_ref_invalid) /* 86 misc  */
    228          .long local_label(misc_ref_invalid) /* 87 immheader  */
    229          .long local_label(misc_ref_invalid) /* 88 even_fixnum  */
    230          .long local_label(misc_ref_invalid) /* 89 cons  */
    231          .long local_label(misc_ref_node)    /* 8a value_cell  */
    232          .long local_label(misc_ref_invalid) /* 8b imm  */
    233          .long local_label(misc_ref_invalid) /* 8c odd_fixnum  */
    234          .long local_label(misc_ref_invalid) /* 8d tra  */
    235          .long local_label(misc_ref_invalid) /* 8e misc  */
    236          .long local_label(misc_ref_invalid) /* 8f immheader  */
    237         /* 90-9f  */
    238          .long local_label(misc_ref_invalid) /* 90 even_fixnum  */
    239          .long local_label(misc_ref_invalid) /* 91 cons  */
    240          .long local_label(misc_ref_node)    /* 92 xfunction  */
    241          .long local_label(misc_ref_invalid) /* 93 imm  */
    242          .long local_label(misc_ref_invalid) /* 94 odd_fixnum  */
    243          .long local_label(misc_ref_invalid) /* 95 tra  */
    244          .long local_label(misc_ref_invalid) /* 96 misc  */
    245          .long local_label(misc_ref_invalid) /* 97 immheader  */
    246          .long local_label(misc_ref_invalid) /* 98 even_fixnum  */
    247          .long local_label(misc_ref_invalid) /* 99 cons  */
    248          .long local_label(misc_ref_node)    /* 9a arrayN  */
    249          .long local_label(misc_ref_invalid) /* 9b imm  */
    250          .long local_label(misc_ref_invalid) /* 9c odd_fixnum  */
    251          .long local_label(misc_ref_invalid) /* 9d tra  */
    252          .long local_label(misc_ref_invalid) /* 9e misc  */
    253          .long local_label(misc_ref_invalid) /* 9f immheader  */
    254         /* a0-af  */
    255          .long local_label(misc_ref_invalid) /* a0 even_fixnum  */
    256          .long local_label(misc_ref_invalid) /* a1 cons  */
    257          .long local_label(misc_ref_node)    /* a2 vectorH  */
    258          .long local_label(misc_ref_invalid) /* a3 imm  */
    259          .long local_label(misc_ref_invalid) /* a4 odd_fixnum  */
    260          .long local_label(misc_ref_invalid) /* a5 tra  */
    261          .long local_label(misc_ref_invalid) /* a6 misc  */
    262          .long local_label(misc_ref_single_float_vector) /* a7 sf_vector  */
    263          .long local_label(misc_ref_invalid) /* a8 even_fixnum  */
    264          .long local_label(misc_ref_invalid) /* a9 cons  */
    265          .long local_label(misc_ref_node)    /* aa simple_vector  */
    266          .long local_label(misc_ref_invalid) /* ab imm  */
    267          .long local_label(misc_ref_invalid) /* ac odd_fixnum  */
    268          .long local_label(misc_ref_invalid) /* ad tra  */
    269          .long local_label(misc_ref_invalid) /* ae misc  */
    270          .long local_label(misc_ref_u32)     /* af u32  */
    271         /* b0-bf  */
    272          .long local_label(misc_ref_invalid) /* b0 even_fixnum  */
    273          .long local_label(misc_ref_invalid) /* b1 cons  */
    274          .long local_label(misc_ref_invalid) /* b2 nodeheader  */
    275          .long local_label(misc_ref_invalid) /* b3 imm  */
    276          .long local_label(misc_ref_invalid) /* b4 odd_fixnum  */
    277          .long local_label(misc_ref_invalid) /* b5 tra  */
    278          .long local_label(misc_ref_invalid) /* b6 misc  */
    279          .long local_label(misc_ref_s32)     /* b7 s32  */
    280          .long local_label(misc_ref_invalid) /* b8 even_fixnum  */
    281          .long local_label(misc_ref_invalid) /* b9 cons  */
    282          .long local_label(misc_ref_invalid) /* ba nodeheader  */
    283          .long local_label(misc_ref_invalid) /* bb imm  */
    284          .long local_label(misc_ref_invalid) /* bc odd_fixnum  */
    285          .long local_label(misc_ref_invalid) /* bd tra  */
    286          .long local_label(misc_ref_invalid) /* be misc  */
    287          .long local_label(misc_ref_fixnum_vector) /* bf fixnum_vector  */
    288         /* c0-cf  */
    289          .long local_label(misc_ref_invalid) /* c0 even_fixnum  */
    290          .long local_label(misc_ref_invalid) /* c1 cons  */
    291          .long local_label(misc_ref_invalid) /* c2 nodeheader  */
    292          .long local_label(misc_ref_invalid) /* c3 imm  */
    293          .long local_label(misc_ref_invalid) /* c4 odd_fixnum  */
    294          .long local_label(misc_ref_invalid) /* c5 tra  */
    295          .long local_label(misc_ref_invalid) /* c6 misc  */
    296          .long local_label(misc_ref_new_string) /* c7 new_string  */
    297          .long local_label(misc_ref_invalid) /* c8 even_fixnum  */
    298          .long local_label(misc_ref_invalid) /* c9 cons  */
    299          .long local_label(misc_ref_invalid) /* ca nodeheader  */
    300          .long local_label(misc_ref_invalid) /* cb imm  */
    301          .long local_label(misc_ref_invalid) /* cc odd_fixnum  */
    302          .long local_label(misc_ref_invalid) /* cd tra  */
    303          .long local_label(misc_ref_invalid) /* ce misc  */
    304          .long local_label(misc_ref_u8)      /* cf u8  */
    305         /* d0-df  */
    306          .long local_label(misc_ref_invalid) /* d0 even_fixnum  */
    307          .long local_label(misc_ref_invalid) /* d1 cons  */
    308          .long local_label(misc_ref_invalid) /* d2 nodeheader  */
    309          .long local_label(misc_ref_invalid) /* d3 imm  */
    310          .long local_label(misc_ref_invalid) /* d4 odd_fixnum  */
    311          .long local_label(misc_ref_invalid) /* d5 tra  */
    312          .long local_label(misc_ref_invalid) /* d6 misc  */
    313          .long local_label(misc_ref_s8)      /* d7 s8  */
    314          .long local_label(misc_ref_invalid) /* d8 even_fixnum  */
    315          .long local_label(misc_ref_invalid) /* d9 cons  */
    316          .long local_label(misc_ref_invalid) /* da nodeheader  */
    317          .long local_label(misc_ref_invalid) /* db imm  */
    318          .long local_label(misc_ref_invalid) /* dc odd_fixnum  */
    319          .long local_label(misc_ref_invalid) /* dd tra  */
    320          .long local_label(misc_ref_invalid) /* de misc  */
    321          .long local_label(misc_ref_old_string) /* df (old)subtag_simple_base_string  */
    322         /* e0-ef  */
    323          .long local_label(misc_ref_invalid) /* e0 even_fixnum  */
    324          .long local_label(misc_ref_invalid) /* e1 cons  */
    325          .long local_label(misc_ref_invalid) /* e2 nodeheader  */
    326          .long local_label(misc_ref_invalid) /* e3 imm  */
    327          .long local_label(misc_ref_invalid) /* e4 odd_fixnum  */
    328          .long local_label(misc_ref_invalid) /* e5 tra  */
    329          .long local_label(misc_ref_invalid) /* e6 misc  */
    330          .long local_label(misc_ref_u16)     /* e7 u16  */
    331          .long local_label(misc_ref_invalid) /* e8 even_fixnum  */
    332          .long local_label(misc_ref_invalid) /* e9 cons  */
    333          .long local_label(misc_ref_invalid) /* ea nodeheader  */
    334          .long local_label(misc_ref_invalid) /* eb imm  */
    335          .long local_label(misc_ref_invalid) /* ec odd_fixnum  */
    336          .long local_label(misc_ref_invalid) /* ed tra  */
    337          .long local_label(misc_ref_invalid) /* ee misc  */
    338          .long local_label(misc_ref_s16)     /* ef s16  */
    339         /* f0-ff  */
    340          .long local_label(misc_ref_invalid) /* f0 even_fixnum  */
    341          .long local_label(misc_ref_invalid) /* f1 cons  */
    342          .long local_label(misc_ref_invalid) /* f2 nodeheader  */
    343          .long local_label(misc_ref_invalid) /* f3 imm  */
    344          .long local_label(misc_ref_invalid) /* f4 odd_fixnum  */
    345          .long local_label(misc_ref_invalid) /* f5 tra  */
    346          .long local_label(misc_ref_invalid) /* f6 misc  */
    347          .long local_label(misc_ref_double_float_vector) /* f7 df vector  */
    348          .long local_label(misc_ref_invalid) /* f8 even_fixnum  */
    349          .long local_label(misc_ref_invalid) /* f9 cons  */
    350          .long local_label(misc_ref_invalid) /* fa nodeheader  */
    351          .long local_label(misc_ref_invalid) /* fb imm  */
    352          .long local_label(misc_ref_invalid) /* fc odd_fixnum  */
    353          .long local_label(misc_ref_invalid) /* fd tra  */
    354          .long local_label(misc_ref_invalid) /* fe misc  */
    355          .long local_label(misc_ref_bit_vector) /* ff bit_vector  */
    356 local_label(misc_ref_invalid):
     134
     135_spentry(syscall)
     136        /* Save lisp registers */
     137        __(push %ebp)
     138        __(movl %esp,%ebp)
     139        __(push %temp0)
     140        __(push %temp1)
     141        __(push %arg_y)
     142        __(push %arg_z)
     143        __(push %fn)
     144        __(movl %esp,%rcontext:tcr.save_vsp)
     145        __(movl %ebp,%rcontext:tcr.save_ebp)
     146        __(movl $TCR_STATE_FOREIGN,%rcontext:tcr.valence)
     147        __(movl %rcontext:tcr.foreign_sp,%esp)
     148        __(emms)
     149        __(movl (%esp),%ebp)
     150        __(addl $2*node_size,%esp)
     151        __(unbox_fixnum(%arg_z,%eax))
     152        /* push syscall args on stack */
     153        __(int $0x80)
     154        __(movl %ebp,%esp)
     155        __(movl %esp,%rcontext:tcr.foreign_sp)
     156        __(zero_node_regs)
     157        __(pxor %fpzero,%fpzero)
     158        __(movl %rcontext:tcr.save_vsp,%esp)
     159        __(movl %rcontext:tcr.save_ebp,%ebp)
     160        __(movl $TCR_STATE_LISP,%rcontext:tcr.valence)
     161        __(pop %fn)
     162        __(pop %arg_z)
     163        __(pop %arg_y)
     164        __(pop %temp1)
     165        __(check_pending_interrupt(%temp0))
     166        __(push %temp0)
     167        __(leave)
     168        __(ret)
     169_endsubp(syscall)
     170
     171_spentry(mkcatch1v)
     172        __(nMake_Catch(0))
     173        __(ret)
     174_endsubp(mkcatch1v)
     175
     176_spentry(mkunwind)
     177        __(int $3)
     178_endsubp(mkunwind)
     179       
     180/* this takes a return address in %ra0; it's "new" in that it does the */
     181/*   double binding of *interrupt-level* out-of-line */
     182_spentry(nmkunwind)
     183        __(int $3)
     184_endsubp(nmkunwind)
     185
     186_spentry(mkcatchmv)
     187        __(int $3)
     188_endsubp(mkcatchmv)
     189
     190_spentry(throw)
     191        __(int $3)
     192_endsubp(throw)
     193
     194/* This takes N multiple values atop the vstack.   */
     195_spentry(nthrowvalues)
     196        __(int $3)
     197_endsubp(nthrowvalues)
     198
     199/* This is a (slight) optimization.  When running an unwind-protect,  */
     200/* save the single value and the throw count in the tstack frame.  */
     201/* Note that this takes a single value in arg_z.  */
     202       
     203_spentry(nthrow1value)
     204        __(int $3)
     205_endsubp(nthrow1value)
     206
     207/* This never affects the symbol's vcell   */
     208/* Non-null symbol in arg_y, new value in arg_z           */
     209       
     210_spentry(bind)
     211        __(int $3)
     212_endsubp(bind)
     213
     214/* arg_z = symbol: bind it to its current value  */
     215       
     216_spentry(bind_self)
     217        __(int $3)
     218_endsubp(bind_self)
     219
     220_spentry(bind_nil)
     221        __(int $3)
     222_endsubp(bind_nil)
     223
     224_spentry(bind_self_boundp_check)
     225        __(int $3)
     226_endsubp(bind_self_boundp_check)
     227
     228_spentry(conslist)
     229        __(int $3)
     230_endsubp(conslist)
     231
     232/* do list*: last arg in arg_z, all others pushed, nargs set to #args pushed.  */
     233/* Cons, one cons cell at at time.  Maybe optimize this later.  */
     234       
     235_spentry(conslist_star)
     236        __(int $3)
     237_endsubp(conslist_star)
     238
     239/* We always have to create a tsp frame (even if nargs is 0), so the compiler   */
     240/* doesn't get confused.   */
     241_spentry(stkconslist)
     242        __(int $3)
     243_endsubp(stkconslist)
     244
     245/* do list*: last arg in arg_z, all others vpushed,   */
     246/*      nargs set to #args vpushed.  */
     247       
     248_spentry(stkconslist_star)
     249        __(int $3)
     250_endsubp(stkconslist_star)
     251
     252
     253/* Make a stack-consed simple-vector out of the NARGS objects   */
     254/*      on top of the vstack; return it in arg_z.  */
     255       
     256_spentry(mkstackv)
     257        __(int $3)
     258_endsubp(mkstackv)
     259
     260        .globl C(egc_write_barrier_start)
     261C(egc_write_barrier_start):
     262/*  */
     263/* The function pc_luser_xp() - which is used to ensure that suspended threads  */
     264/* are suspended in a GC-safe way - has to treat these subprims (which implement  */
     265/* the EGC write-barrier) specially.  Specifically, a store that might introduce  */
     266/* an intergenerational reference (a young pointer stored in an old object) has  */
     267/* to "memoize" that reference by setting a bit in the global "refbits" bitmap.  */
     268/* This has to happen atomically, and has to happen atomically wrt GC.  */
     269
     270/* Note that updating a word in a bitmap is itself not atomic, unless we use  */
     271/* interlocked loads and stores.  */
     272
     273/* For RPLACA and RPLACD, things are fairly simple: regardless of where we are  */
     274/* in the function, we can do the store (even if it's already been done) and  */
     275/* calculate whether or not we need to set the bit out-of-line.  (Actually  */
     276/* setting the bit needs to be done atomically, unless we're sure that other  */
     277/* threads are suspended.)  */
     278/* We can unconditionally set the suspended thread's RIP to the return address.  */
     279
     280_spentry(rplaca)
     281        .globl C(egc_rplaca)
     282C(egc_rplaca):
     283        __(int $3)
     284_endsubp(rplaca)
     285
     286_spentry(rplacd)
     287        .globl C(egc_rplacd)
     288C(egc_rplacd):
     289        __(int $3)
     290_endsubp(rplacd)
     291
     292_spentry(gvset)
     293        .globl C(egc_gvset)
     294C(egc_gvset):
     295        __(int $3)
     296_endsubp(gvset)
     297
     298_spentry(set_hash_key)
     299        .globl C(egc_set_hash_key)
     300C(egc_set_hash_key): 
     301        __(int $3)
     302_endsubp(set_hash_key)
     303
     304/* This is a little trickier: if this is interrupted, we need to know  */
     305/* whether or not the STORE-CONDITIONAL (cmpxchgq) has won or not.    */
     306/* If we're interrupted   before the PC has reached the "success_test" label,   */
     307/* repeat (luser the PC back to .SPstore_node_conditional.)  If we're at that  */
     308/* label with the Z flag set, we won and (may) need to memoize.  */
     309
     310_spentry(store_node_conditional)
     311        .globl C(egc_store_node_conditional)
     312C(egc_store_node_conditional):
     313        .globl C(egc_store_node_conditional_success_test)
     314C(egc_store_node_conditional_success_test):
     315        .globl C(egc_write_barrier_end)
     316C(egc_write_barrier_end):
     317        __(int $3)
     318_endsubp(store_node_conditional)
     319
     320_spentry(setqsym)
     321        __(bt $sym_vbit_const,symbol.flags(%arg_y))
     322        __(jae _SPspecset)
     323        __(mov %arg_y,%arg_z)
     324        __(mov $XCONST,%arg_y)
     325        __(set_nargs(2))
    357326        __(jmp _SPksignalerr)
    358 local_label(misc_ref_u32):
    359         __(movl misc_data_offset(%arg_y,%arg_z),%imm0)
    360         __(jmp _SPmakeu32)
    361         __(ret)
    362 local_label(misc_ref_node):         
    363         __(movl misc_data_offset(%arg_y,%arg_z),%arg_z)
    364         __(ret)
    365 local_label(misc_ref_single_float_vector):
    366 local_label(misc_ref_s32):
    367 local_label(misc_ref_fixnum_vector):
    368 local_label(misc_ref_new_string):
    369 local_label(misc_ref_u8):
    370 local_label(misc_ref_s8):
     327_endsubp(setqsym)
     328
     329_spentry(progvsave)
     330        __(int $3)
     331_endsubp(progvsave)
     332
     333/* Allocate node objects on the temp stack, immediate objects on the foreign  */
     334/* stack. (The caller has to know which stack to discard a frame from.)  */
     335/* %arg_y = boxed element-count, %arg_z = boxed subtype  */
     336       
     337_spentry(stack_misc_alloc)
     338        __(int $3)
     339_endsubp(stack_misc_alloc)
     340
     341/* subtype (boxed, of course) is pushed, followed by nargs bytes worth of   */
     342/* initial-contents.  Note that this can be used to cons any type of initialized   */
     343/* node-header'ed misc object (symbols, closures, ...) as well as vector-like   */
     344/* objects.   */
     345_spentry(gvector)
     346        __(int $3)
     347_endsubp(gvector)
     348
     349_spentry(mvpass)
     350        __(int $3)
     351_endsubp(mvpass)
     352
     353_spentry(nthvalue)
     354        __(int $3)
     355_endsubp(nthvalue)
     356
     357_spentry(values)
     358        __(int $3)
     359_endsubp(values)
     360       
     361_spentry(default_optional_args)
     362        __(int $3)
     363_endsubp(default_optional_args)
     364
     365_spentry(opt_supplied_p)
     366        __(int $3)
     367_endsubp(opt_supplied_p)
     368
     369_spentry(lexpr_entry)
     370        __(int $3)
     371_endsubp(lexpr_entry)
     372       
     373_spentry(heap_rest_arg)
     374        __(int $3)
     375_endsubp(heap_rest_arg)
     376       
     377/* %imm0 contains the number of fixed args ; make an &rest arg out of the others   */
     378_spentry(req_heap_rest_arg)
     379        __(int $3)
     380_endsubp(req_heap_rest_arg)
     381
     382/* %imm0 bytes of stuff has already been pushed   */
     383/* make an &rest arg out of any others   */
     384_spentry(heap_cons_rest_arg)
     385        __(int $3)
     386_endsubp(heap_cons_rest_arg)
     387
     388_spentry(simple_keywords)
     389        __(xor %imm0,%imm0)
     390        __(push_argregs())
     391        __(jmp _SPkeyword_bind)
     392_endsubp(simple_keywords)
     393
     394_spentry(keyword_args)
     395        __(push_argregs())
     396        __(jmp _SPkeyword_bind)
     397_endsubp(keyword_args)
     398       
     399/* There are %nargs words of arguments on the stack; %imm0 contains the number  */
     400/* of non-keyword args pushed.  It's possible that we never actually got  */
     401/* any keyword args, which would make things much simpler.   */
     402
     403/* On entry, temp1 contains a fixnum with bits indicating whether   */
     404/* &allow-other-keys and/or &rest was present in the lambda list.  */
     405/* Once we get here, we can use the arg registers.  */
     406
     407define([keyword_flags_aok_bit],[fixnumshift])
     408define([keyword_flags_unknown_keys_bit],[fixnumshift+1])
     409define([keyword_flags_rest_bit],[fixnumshift+2])
     410define([keyword_flags_seen_aok_bit],[fixnumshift+3])       
     411       
     412_spentry(keyword_bind)
     413        __(int $3)
     414_endsubp(keyword_bind)
     415
     416_spentry(ksignalerr)
     417        __(mov $nrs.errdisp,%fname)
     418        __(jump_fname) 
     419_endsubp(ksignalerr)
     420
     421_spentry(stack_rest_arg)
     422        __(xorl %imm0,%imm0)
     423        __(push_argregs())
     424        __(jmp _SPstack_cons_rest_arg)
     425_endsubp(stack_rest_arg)
     426
     427_spentry(req_stack_rest_arg)
     428        __(push_argregs())
     429        __(jmp _SPstack_cons_rest_arg)
     430_endsubp(req_stack_rest_arg)
     431
     432_spentry(stack_cons_rest_arg)
     433_endsubp(stack_cons_rest_arg)
     434
     435_spentry(getxlong)
     436        __(int $3)
     437_endsubp(getxlong)
     438
     439/* Have to be a little careful here: the caller may or may not have pushed  */
     440/*   an empty frame, and we may or may not have needed one.  We can't easily  */
     441/*   tell whether or not a frame will be needed (if the caller didn't reserve  */
     442/*   a frame, whether or not we need one depends on the length of the list  */
     443/*   in arg_z.  So, if the caller didn't push a frame, we do so ; once everything's  */
     444/*   been spread, we discard the reserved frame (regardless of who pushed it)  */
     445/*   if all args fit in registers.   */
     446_spentry(spreadargz)
     447        __(int $3)
     448_endsubp(spreadargz)
     449
     450       
     451/* Caller built it's own frame when it was entered.  If all outgoing args  */
     452/* are in registers, we can discard that frame; otherwise, we copy outgoing  */
     453/* relative to it and restore %rbp/%ra0   */
     454_spentry(tfuncallgen)
     455        __(int $3)
     456_endsubp(tfuncallgen)
     457
     458/* Some args were pushed; move them down in the frame   */
     459_spentry(tfuncallslide)
     460        __(int $3)
     461_endsubp(tfuncallslide)
     462
     463/* No args were pushed; recover saved context & do funcall        */
     464_spentry(tfuncallvsp)
     465        __(leave)
     466        __(do_funcall())
     467_endsubp(tfuncallvsp)
     468
     469_spentry(tcallsymgen)
     470        __(int $3)
     471_endsubp(tcallsymgen)
     472
     473_spentry(tcallsymslide)
     474        __(int $3)
     475_endsubp(tcallsymslide)
     476
     477_spentry(tcallsymvsp)
     478        __(leave)
     479        __(jump_fname())
     480_endsubp(tcallsymvsp)
     481
     482_spentry(tcallnfngen)
     483        __(int $3)
     484_endsubp(tcallnfngen)
     485       
     486_spentry(tcallnfnslide)
     487        __(int $3)
     488_endsubp(tcallnfnslide)
     489
     490_spentry(tcallnfnvsp)
     491        __(mov %temp0,%fn)
     492        __(leave)
     493        __(jmp *%fn)
     494_endsubp(tcallnfnvsp)
     495
     496_spentry(makestackblock)
     497        __(int $3)
     498_endsubp(makestackblock)
     499       
     500_spentry(makestackblock0)
     501        __(int $3)
     502_endsubp(makestackblock0)
     503       
     504_spentry(makestacklist)
     505        __(int $3)
     506_endsubp(makestacklist)
     507       
     508_spentry(stkgvector)
     509        __(int $3)
     510_endsubp(stkgvector)
     511
     512_spentry(misc_alloc)
     513        __(int $3)
     514_endsubp(misc_alloc)
     515
     516_startfn(C(destbind1))
     517        __(jmp *%ra0)
     518_endfn(C(destbind1))   
     519
     520_spentry(macro_bind)
     521        __(int $3)
     522_endsubp(macro_bind)
     523
     524_spentry(destructuring_bind)
     525        __(mov %arg_reg,%whole_reg)
     526        __(jmp C(destbind1))
     527_endsubp(destructuring_bind)
     528
     529_spentry(destructuring_bind_inner)
     530        __(mov %arg_z,%whole_reg)
     531        __(jmp C(destbind1))
     532_endsubp(destructuring_bind_inner)
     533
     534_spentry(vpopargregs)
     535        __(int $3)
     536_endsubp(vpopargregs)
     537
     538/* If arg_z is an integer, return in imm0 something whose sign  */
     539/* is the same as arg_z's.  If not an integer, error.   */
     540_spentry(integer_sign)
     541        __(testb $tagmask,%arg_z_b)
     542        __(mov %arg_z,%imm0)
     543        __(je 8f)
     544        __(extract_typecode(%arg_z,%imm0))
     545        __(cmpb $subtag_bignum,%imm0_b)
     546        __(jne 9f)
     547        __(getvheader(%arg_z,%imm0))
     548        __(shr $num_subtag_bits,%imm0)
     549        __(movl misc_data_offset-4(%arg_z,%imm0,4),%imm0)
     5508:      __(repret)
     5519:      __(uuo_error_reg_not_type(Rarg_z,error_object_not_integer))
     552_endsubp(integer_sign)
     553
     554_spentry(mvslide)
     555        __(int $3)
     556_endsubp(mvslide)
     557
     558_spentry(save_values)
     559        __(int $3)
     560_endsubp(save_values)
     561
     562_spentry(add_values)
     563        __(int $3)
     564_endsubp(add_values)
     565                                       
     566_spentry(recover_values)
     567        __(int $3)
     568_endsubp(recover_values)
     569                                       
     570_spentry(recover_values_for_mvcall)
     571        __(int $3)
     572_endsubp(recover_values_for_mvcall)
     573                                       
     574_spentry(reset)
     575        __(int $3)
     576_endsubp(reset)
     577
     578_spentry(misc_alloc_init)
     579        __(int $3)
     580_endsubp(misc_alloc_init)
     581       
     582_spentry(stack_misc_alloc_init)
     583        __(int $3)
     584_endsubp(stack_misc_alloc_init)
     585
     586        .globl C(popj)
     587_spentry(popj)
     588C(popj):
     589        __(leave)
     590        __(ret)
     591_endsubp(popj)
     592
     593
     594_spentry(gets64)
     595        __(int $3)
     596_endsubp(gets64)
     597       
     598       
     599/* arg_z should be of type (unsigned-byte 64) */
     600/* return unboxed value in mm0 */
     601_spentry(getu64)
     602        __(movl $~(target_most_positive_fixnum << fixnumshift),%imm0)
     603        __(testl %arg_z,%imm0)
     604        __(movl %arg_z,%imm0)
     605        __(jne 1f)
     606        __(sarl $fixnumshift,%imm0)
     607        __(movd %imm0,%mm0)
     608        __(ret)
     6091:      __(andb $tagmask,%imm0_b)
     610        __(cmpb $tag_misc,%imm0_b)
     611        __(jne 9f)
     612        __(movb misc_subtag_offset(%arg_z),%imm0_b)
     613        __(cmpb $subtag_bignum,%imm0_b)
     614        __(jne 9f)
     615        __(movl misc_header_offset(%arg_z),%imm0)
     616        __(cmpl $three_digit_bignum_header,%imm0)
     617        __(je 3f)
     618        __(cmpl $two_digit_bignum_header,%imm0)
     619        __(jne 9f)
     620        __(movl misc_data_offset(%arg_z),%imm0)
     621        __(testl %imm0,%imm0)
     622        __(js 9f)
     623        __(repret)
     6243:      __(movl misc_data_offset(%arg_z),%imm0)
     625        __(cmpl $0,misc_data_offset+8(%arg_z))
     626        __(jne 9f)
     627        __(repret)
     6289:      __(uuo_error_reg_not_type(Rarg_z,error_object_not_u64))
     629_endsubp(getu64)
     630
     631_spentry(makeu64)
     632        __(int $3)
     633_endsubp(makeu64)
     634       
     635_spentry(specref)
     636        __(int $3)
     637_endsubp(specref)
     638       
     639_spentry(specset)
     640        __(int $3)
     641_endsubp(specset)
     642       
     643_spentry(specrefcheck)
     644        __(int $3)
     645_endsubp(specrefcheck)
     646
     647_spentry(restoreintlevel)
     648        __(int $3)
     649_endsubp(restoreintlevel)
     650
     651_spentry(makeu32)
     652        __(int $3)
     653_endsubp(makeu32)
     654
     655_spentry(gets32)
     656        __(int $3)
     657_endsubp(gets32)
     658
     659_spentry(getu32)
     660        __(int $3)
     661_endsubp(getu32)
     662
     663_spentry(mvpasssym)
     664        __(int $3)
     665_endsubp(mvpasssym)
     666
     667_spentry(unbind)
     668        __(int $3)
     669_endsubp(unbind)
     670
     671_spentry(unbind_n)
     672        __(int $3)
     673_endsubp(unbind_n)
     674
     675_spentry(unbind_to)
     676        __(int $3)
     677_endsubp(unbind_to)
     678
     679_spentry(bind_interrupt_level_0)
     680        __(int $3)
     681_endsubp(bind_interrupt_level_0)
     682
     683_spentry(bind_interrupt_level_m1)
     684        __(int $3)
     685_endsubp(bind_interrupt_level_m1)
     686
     687_spentry(bind_interrupt_level)
     688        __(int $3)
     689_endsubp(bind_interrupt_level)
     690
     691_spentry(unbind_interrupt_level)
     692        __(int $3)
     693_endsubp(unbind_interrupt_level)
     694
     695_spentry(progvrestore)
     696        __(int $3)
     697_endsubp(progvrestore)
     698
     699_spentry(builtin_plus)
     700        __(int $3)
     701_endsubp(builtin_plus)
     702
     703_spentry(builtin_minus)
     704        __(int $3)
     705_endsubp(builtin_minus)
     706
     707_spentry(builtin_times)
     708        __(int $3)
     709_endsubp(builtin_times)
     710
     711_spentry(builtin_div)
     712        __(jump_builtin(_builtin_div,2))
    371713
    372714/* %arg_z <- (= %arg_y %arg_z).   */
     
    420762/* %arg_z <- (< %arg_y %arg_z).   */
    421763_spentry(builtin_lt)
    422         __(movl %arg_y,%imm0_b)
     764        __(movl %arg_y,%imm0)
    423765        __(orb %arg_z_b,%imm0_b)
    424766        __(testb $fixnummask,%imm0_b)
     
    442784_endsubp(builtin_le)
    443785
     786_spentry(builtin_eql)
     787        __(int $3)
     788_endsubp(builtin_eql)
     789
     790_spentry(builtin_length)
     791        __(int $3)
     792_endsubp(builtin_length)
     793
     794_spentry(builtin_seqtype)
     795        __(int $3)
     796_endsubp(builtin_seqtype)
     797
     798_spentry(builtin_assq)
     799        __(int $3)
     800_endsubp(builtin_assq)
     801
     802_spentry(builtin_memq)
     803        __(int $3)
     804_endsubp(builtin_memq)
     805
     806logbitp_max_bit = 30
     807
     808_spentry(builtin_logbitp)
     809        __(int $3)
     810_endsubp(builtin_logbitp)
     811
    444812_spentry(builtin_logior)
    445813        __(movl %arg_y,%imm0)
     
    4518191:     
    452820        __(jump_builtin(_builtin_logior,2))
    453                
    454821_endsubp(builtin_logior)
    455822
     
    485852        __(jump_builtin(_builtin_logxor,2))
    486853_endsubp(builtin_logxor)
     854       
     855_spentry(builtin_aset1)
     856        __(int $3)
     857_endsubp(builtin_aset1)
     858
     859_spentry(builtin_ash)
     860        __(int $3)
     861_endsubp(builtin_ash)
     862
     863_spentry(builtin_aref1)
     864        __(extract_typecode(%arg_y,%imm0))
     865        __(cmpb $min_vector_subtag,%imm0_b)
     866        __(box_fixnum_no_flags(%imm0,%arg_y))
     867        __(ja _SPsubtag_misc_ref)
     868        __(jump_builtin(_builtin_aref1,2))
     869_endsubp(builtin_aref1)
     870
     871_spentry(ffcall)
     872        __(int $3)
     873_endsubp(ffcall)
     874       
     875_spentry(ffcall_return_registers)
     876        __(int $3)
     877_endsubp(ffcall_return_registers)
     878
     879_spentry(spread_lexprz)
     880        __(int $3)
     881_endsubp(spread_lexprz)
     882
     883_spentry(callback)
     884        __(int $3)
     885_endsubp(callback)
     886
     887_spentry(aref2)
     888        __(int $3)
     889_endsubp(aref2)
     890
     891_spentry(aref3)
     892        __(int $3)
     893_endsubp(aref3)
     894
     895_spentry(aset2)
     896        __(int $3)
     897_endsubp(aset2)
     898
     899_spentry(aset3)
     900        __(int $3)
     901_endsubp(aset3)
     902
     903_spentry(call_closure)
     904        __(int $3)
     905_endsubp(call_closure)
     906
     907_spentry(poweropen_callbackX)
     908        __(int $3)
     909_endsubp(poweropen_callbackX)
     910       
     911_spentry(poweropen_ffcallX)
     912        __(int $3)
     913_endsubp(poweropen_ffcallX)
     914               
     915_spentry(poweropen_syscall)
     916        __(int $3)
     917_endsubp(poweropen_syscall)
     918
     919_spentry(eabi_ff_call)
     920        __(int $3)
     921_endsubp(eabi_ff_call)
     922
     923_spentry(eabi_callback)
     924        __(int $3)
     925_endsubp(eabi_callback)
     926
     927
     928/* Unused, and often not used on PPC either  */
     929_spentry(callbuiltin)
     930        __(int $3)
     931_endsubp(callbuiltin)
     932
     933_spentry(callbuiltin0)
     934        __(int $3)
     935_endsubp(callbuiltin0)
     936
     937_spentry(callbuiltin1)
     938        __(int $3)
     939_endsubp(callbuiltin1)
     940
     941_spentry(callbuiltin2)
     942        __(int $3)
     943_endsubp(callbuiltin2)
     944
     945_spentry(callbuiltin3)
     946        __(int $3)
     947_endsubp(callbuiltin3)
     948       
     949_spentry(restorefullcontext)
     950        __(int $3)
     951_endsubp(restorefullcontext)
     952
     953_spentry(savecontextvsp)
     954        __(int $3)
     955_endsubp(savecontextvsp)
     956
     957_spentry(savecontext0)
     958        __(int $3)
     959_endsubp(savecontext0)
     960
     961_spentry(restorecontext)
     962        __(int $3)
     963_endsubp(restorecontext)
     964
     965_spentry(stkconsyz)
     966        __(int $3)
     967_endsubp(stkconsyz)
     968
     969_spentry(stkvcell0)
     970        __(int $3)
     971_endsubp(stkvcell0)
     972
     973_spentry(stkvcellvsp)
     974        __(int $3)
     975_endsubp(stkvcellvsp)
     976
     977_spentry(breakpoint)
     978        __(int $3)
     979_endsubp(breakpoint)
     980
     981_spentry(unused_5)
     982        __(int $3)
     983_endsubp(unused_5)
     984
     985_spentry(unused_6)
     986        __(int $3)
     987_endsubp(unused_6)
  • branches/ia32/lisp-kernel/x86-subprims32.s

    r7286 r8068  
    11        include(lisp.s)
    2         _beginfile
     2
     3        .globl _SPmkcatch1v
     4        .globl _SPnthrow1value
     5       
     6/* This is called from a c-style context and calls a lisp function.*/
     7/* This does the moral equivalent of*/
     8/*   (loop */
     9/*      (let* ((fn (%function_on_top_of_lisp_stack)))*/
     10/*        (if fn*/
     11/*            (catch %toplevel-catch%*/
     12/*             (funcall fn))*/
     13/*            (return nil))))*/
     14
     15
     16_exportfn(toplevel_loop)
     17        __(push %ebp)
     18        __(movl %esp,%ebp)
     19        /* Switch to the lisp stack */
     20        __(movl %esp,%rcontext:tcr.foreign_sp)
     21        __(movl %rcontext:tcr.save_vsp,%esp)
     22        __(push $0)
     23        __(mov %esp,%ebp)
     24        __(jmp local_label(test))
     25local_label(loop):
     26        __(ref_nrs_value(toplcatch,%arg_z))
     27        __(movl [$]local_label(back_from_catch),%ra0)
     28        __(movl [$]local_label(test),%xfn)
     29        __(push %ra0)
     30        __(jmp _SPmkcatch1v)
     31__(tra(local_label(back_from_catch)))
     32        __(movl %arg_y,%temp0)
     33        __(pushl [$]local_label(back_from_funcall))
     34        __(set_nargs(0))
     35        __(jmp _SPfuncall)
     36__(tra(local_label(back_from_funcall)))
     37        __(movl $fixnumone,%imm0)
     38        __(movl [$]local_label(test),%ra0)
     39        __(jmp _SPnthrow1value)
     40__(tra(local_label(test)))
     41        __(movl 4(%ebp),%arg_y)
     42        __(cmpl $nil_value,%arg_y)
     43        __(jnz local_label(loop))
     44local_label(back_to_c):
     45        __(movl %rcontext:tcr.foreign_sp,%esp)
     46        __(movl %esp,%ebp)
     47        __(leave)
     48        __(ret)
    349
    450/* This is called from C code when a thread (including the initial thread) */
     
    4389        __(ret)
    4490_endfn
     91
     92       
Note: See TracChangeset for help on using the changeset viewer.