Changeset 9128


Ignore:
Timestamp:
Apr 10, 2008, 5:51:33 AM (11 years ago)
Author:
rme
Message:

Implement .SPmkcatchmv, .SPbind_nil, .SPbind_self_boundp_check,
.SPtcallnfnslide, .SPmakestacklist, .SPunbind

Fixes to .SPkeyword_bind.

File:
1 edited

Legend:

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

    r9040 r9128  
    11351135
    11361136_spentry(mkcatchmv)
    1137         __(int $3)
     1137        __(nMake_Catch(fixnumone))
     1138        __(ret)
    11381139_endsubp(mkcatchmv)
    11391140
     
    13911392
    13921393_spentry(bind_nil)
    1393         __(int $3)
     1394        __(movl symbol.binding_index(%arg_z),%imm0)
     1395        __(cmpl %rcontext:tcr.tlb_limit,%imm0)
     1396        __(jb,pt 0f)
     1397        __(push %imm0)
     1398        __(tlb_too_small())
     13990:      __(test %imm0,%imm0)
     1400        __(jz 9f)
     1401        __(movl %rcontext:tcr.tlb_pointer,%temp1)
     1402        __(push (%temp1,%imm0))
     1403        __(push %imm0)
     1404        __(push %rcontext:tcr.db_link)
     1405        __(movl %esp,%rcontext:tcr.db_link)
     1406        __(movl $nil_value,(%temp1,%imm0))
     1407        __(jmp *%ra0)
     14089:      __(movl $XSYMNOBIND,%arg_y)
     1409        __(set_nargs(2))
     1410        __(push %ra0)
     1411        __(jmp _SPksignalerr)
    13941412_endsubp(bind_nil)
    13951413
     
    18001818/* make an &rest arg out of any others   */
    18011819_spentry(heap_cons_rest_arg)
    1802         __(int $3)
     1820        __(movd %nargs,%mm0)
     1821        __(subl %imm0,%nargs)
     1822        __(movl %nargs,%imm0)
     1823        __(movl $nil_value,%arg_z)
     1824        __(movl %ra0,%arg_y)    /* temp0 can't be live while consing */
     1825        __(jmp 2f)              /* (did I mention that already?) */
     1826        .p2align 4
     18271:      __(pop %temp1)
     1828        __(Cons(%temp1,%arg_z,%arg_z))
     1829        __(subl $node_size,%imm0)
     18302:      __(jg 1b)
     1831        __(push %arg_z)
     1832        __(movd %mm0,%nargs)
     1833        __(jmp *%arg_y)
    18031834_endsubp(heap_cons_rest_arg)
    18041835
     
    18201851/* On entry, the upper half of %temp1 (aka %nargs) contains some bits */
    18211852/* indicating whether &allow-other-keys and/or &rest was present in the */
    1822 /* lambda list.  We therefore need to access %nargs as a 16-bit register. */
     1853/* lambda list. */
    18231854
    18241855/* Once we get here, we can use the arg registers. */
     
    18321863
    18331864_spentry(keyword_bind)
    1834         __(movzwl %nargs_w,%arg_z)
     1865        __(movl %temp1,%rcontext:tcr.unboxed0)  /* save keyword flags */
     1866        __(movzwl %nargs_w,%nargs)
     1867        __(movl %nargs,%arg_z)
    18351868        __(subl %imm0,%arg_z)
    18361869        __(jbe local_label(no_keyword_values))
     
    18381871        __(jnc local_label(even))
    18391872        __(movl $nil_value,%arg_y)
    1840         __(movw %arg_z_w,%nargs_w)
    1841         __(testw %nargs_w,%nargs_w)
     1873        __(movl %arg_z,%nargs)
     1874        __(test %nargs,%nargs)
     1875        __(movl %ra0,%rcontext:tcr.save0)       /* save temp0 while consing */
    18421876        __(jmp 1f)
    184318770:      __(pop %arg_z)
    1844         __(push %ra0) /* aka temp0; temp0 can't be live while consing. */
    18451878        __(Cons(%arg_z,%arg_y,%arg_y))
    1846         __(pop %ra0)  /* the push/pop in a loop is disgusting. */
    1847         __(subw $node_size,%nargs_w)
     1879        __(subl $node_size,%nargs)
    184818801:      __(jnz 0b)
     1881        __(movl %rcontext:tcr.save0,%ra0)
     1882        __(movapd %fpzero,%rcontext:tcr.save0)
    18491883        __(movl %arg_y,%arg_z)
    18501884        __(movl $XBADKEYS,%arg_y)
     
    19121946        __(cmpl $nrs.kallowotherkeys,%arg_z)
    19131947        __(jne local_label(next_keyvect_entry))
    1914         __(btsl $keyword_flags_seen_aok_bit,12(%esp))
     1948        __(btsl $keyword_flags_seen_aok_bit,%rcontext:tcr.unboxed0)
    19151949        __(jc local_label(next_keyvect_entry))
    19161950        __(cmpl $nil_value,node_size(%temp0,%imm0,2))
    19171951        __(je local_label(next_keyvect_entry))
    1918         __(btsl $keyword_flags_aok_bit,12(%esp))
     1952        __(btsl $keyword_flags_aok_bit,%rcontext:tcr.unboxed0)
    19191953        __(jmp local_label(next_keyvect_entry))
    19201954        /* loop through keyword vector */
     
    19391973        __(cmpl $nrs.kallowotherkeys,%arg_z)
    19401974        __(je 9f)       /* :allow-other-keys is never "unknown" */
    1941 8:      __(btsl $keyword_flags_unknown_keys_bit,12(%esp))
     19758:      __(btsl $keyword_flags_unknown_keys_bit,%rcontext:tcr.unboxed0)
    194219769:      __(pop %imm0)
    19431977        __(addl $fixnumone,%imm0)
     
    19551989        /* keyword and don't allow that, copy the incoming k/v pairs from */
    19561990        /* the temp stack back to the value stack. */
    1957         __(btl $keyword_flags_rest_bit,%temp1)
     1991        __(btl $keyword_flags_rest_bit,%rcontext:tcr.unboxed0)
    19581992        __(jc 1f)
    1959         __(btl $keyword_flags_unknown_keys_bit,%temp1)
     1993        __(btl $keyword_flags_unknown_keys_bit,%rcontext:tcr.unboxed0)
    19601994        __(jnc 0f)
    1961         __(btl $keyword_flags_aok_bit,%temp1)
     1995        __(btl $keyword_flags_aok_bit,%rcontext:tcr.unboxed0)
    19621996        __(jnc 1f)
    19631997        /* pop the tstack frame */
     
    19772011        __(jne 2b)
    19782012        __(discard_temp_frame(%arg_z))
    1979         __(btl $keyword_flags_unknown_keys_bit,%temp1)
     2013        __(btl $keyword_flags_unknown_keys_bit,%rcontext:tcr.unboxed0)
    19802014        __(jnc 9f)
    1981         __(btl $keyword_flags_aok_bit,%temp1)
     2015        __(btl $keyword_flags_aok_bit,%rcontext:tcr.unboxed0)
    19822016        __(jc 9f)
    19832017        /* Signal an "unknown keywords" error */
     
    22422276
    22432277_spentry(tcallnfnslide)
    2244         __(int $3)
     2278        __(lea -nargregs*node_size(%esp,%nargs),%imm0)
     2279        __(movd %nargs,%mm0)    /* save nargs aka temp1 */
     2280        __(xorl %temp1,%temp1)
     2281        __(movl %temp0,%rcontext:tcr.save0)
     2282        /* We can use %ra0 as a temporary here, since the real return address */
     2283        /* is on the stack   */
     22840:      __(movl -node_size(%imm0),%ra0)
     2285        __(movl %ra0,-node_size(%ebp,%temp1))
     2286        __(subl $node_size,%imm0)
     2287        __(subl $node_size,%temp1)
     2288        __(cmpl %imm0,%esp)
     2289        __(jne 0b)
     2290        __(movl %rcontext:tcr.save0,%fn)
     2291        __(lea (%ebp,%temp1),%esp)
     2292        __(movl lisp_frame.savera0(%ebp),%ra0)
     2293        __(movl lisp_frame.backlink(%ebp),%ebp)
     2294        __(push %ra0)
     2295        __(movapd %fpzero,%rcontext:tcr.save0)
     2296        __(movd %mm0,%nargs)
     2297        __(jmp *%fn)
    22452298_endsubp(tcallnfnslide)
    22462299
     
    22842337
    22852338_spentry(makestacklist)
    2286         __(int $3)
     2339        __(test %arg_y,%arg_y)
     2340        __(js 9f)
     2341        __(movl %arg_y,%imm0)
     2342        __(testb $fixnummask,%imm0_b)
     2343        __(jne 9f)
     2344        __(addl %imm0,%imm0)
     2345        __(rcmpl(%imm0,$tstack_alloc_limit))
     2346        __(movl $nil_value,%temp1)
     2347        __(jae 2f)
     2348        __(addl $tsp_frame.fixed_overhead,%imm0)
     2349        __(TSP_Alloc_Var(%imm0,%temp0))
     2350        __(addl $fulltag_cons,%temp0)
     2351        __(jmp 1f)
     23520:      __(_rplaca(%temp0,%arg_z))
     2353        __(_rplacd(%temp0,%temp1))
     2354        __(movl %temp0,%temp1)
     2355        __(addl $cons.size,%temp0)
     23561:      __(subl $fixnumone,%arg_y)
     2357        __(jge 0b)
     2358        __(movl %temp1,%arg_z)
     2359        __(ret)
     23602:      __(TSP_Alloc_Fixed(0,%imm0))
     2361        __(jmp 4f)
     23623:      __(Cons(%arg_z,%temp1,%temp1))
     23634:      __(subl $fixnumone,%arg_y)                             
     2364        __(jge 3b)
     2365        __(movl %temp1,%arg_z)
     2366        __(ret)
     23679:      __(uuo_error_reg_not_type(Rarg_y,error_object_not_unsigned_byte))
    22872368_endsubp(makestacklist)
    22882369
     
    26572738_endsubp(mvpasssym)
    26582739
    2659 /* */
    26602740_spentry(unbind)
    2661         __(int $3)
     2741        __(movl %rcontext:tcr.db_link,%imm0)
     2742        __(movl %rcontext:tcr.tlb_pointer,%arg_z)
     2743        __(movl binding.sym(%imm0),%temp0)
     2744        __(movl binding.val(%imm0),%arg_y)
     2745        __(movl binding.link(%imm0),%imm0)
     2746        __(movl %arg_y,(%arg_z,%temp0))
     2747        __(movl %imm0,%rcontext:tcr.db_link)
     2748        __(ret)
    26622749_endsubp(unbind)
    26632750
Note: See TracChangeset for help on using the changeset viewer.