Changeset 9040


Ignore:
Timestamp:
Apr 7, 2008, 9:14:54 PM (11 years ago)
Author:
rme
Message:

Implement .SPbind, .SPreq_heap_rest_arg, and .SPbuiltin_seqtype. Fix to
.SPbuiltin_assq. Implement rest of .SPcall_closure.

File:
1 edited

Legend:

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

    r9001 r9040  
    13621362
    13631363_spentry(bind)
    1364         __(int $3)
     1364        __(movl symbol.binding_index(%arg_y),%imm0)
     1365        __(cmpl %rcontext:tcr.tlb_limit,%imm0)
     1366        __(jb,pt 0f)
     1367        __(push %imm0)
     1368        __(tlb_too_small())
     13690:      __(test %imm0,%imm0)
     1370        __(jz 9f)
     1371        __(movl %rcontext:tcr.tlb_pointer,%temp1)
     1372        __(push (%temp1,%imm0))
     1373        __(push %imm0)
     1374        __(push %rcontext:tcr.db_link)
     1375        __(movl %esp,%rcontext:tcr.db_link)
     1376        __(movl %arg_z,(%temp1,%imm0))
     1377        __(jmp *%ra0)
     13789:     
     1379        __(movl %arg_y,%arg_z)
     1380        __(movl $XSYMNOBIND,%arg_y)
     1381        __(set_nargs(2))
     1382        __(push %ra0)
     1383        __(jmp _SPksignalerr)
    13651384_endsubp(bind)
    13661385
     
    17571776_endsubp(heap_rest_arg)
    17581777
    1759 /* %imm0 contains the number of fixed args ; make an &rest arg out of the others   */
     1778/* %imm0 contains the number of fixed args; make an &rest arg out of */
     1779/* the others. */
    17601780_spentry(req_heap_rest_arg)
    1761         __(int $3)
     1781        __(push_argregs())
     1782        __(movd %nargs,%mm0)
     1783        __(subl %imm0,%nargs)
     1784        __(movl %nargs,%imm0)
     1785        __(movl %temp0,%temp1)
     1786        __(movl $nil_value,%arg_z)
     1787        __(jmp 2f)
     1788        .p2align 4
     17891:      __(pop %arg_y)
     1790        __(Cons(%arg_y,%arg_z,%arg_z))
     1791        __(subl $node_size,%imm0)
     17922:      __(jg 1b)
     1793        __(push %arg_z)
     1794        __(movl %temp1,%temp0)
     1795        __(movd %mm0,%nargs)
     1796        __(jmp *%ra0)
    17621797_endsubp(req_heap_rest_arg)
    17631798
     
    19862021/* '%err-disp in %imm0.) */
    19872022_spentry(ksignalerr)
     2023        __(int $3)
    19882024        __(mov $nrs.errdisp,%imm0)
    19892025        __(mov symbol.fcell(%imm0),%fn)
     
    29062942
    29072943_spentry(builtin_seqtype)
    2908         __(int $3)
     2944        __(extract_fulltag(%arg_z,%imm0))
     2945        __(cmpb $fulltag_cons,%imm0_b)
     2946        __(jz 1f)
     2947        __(cmpb $tag_misc,%imm0_b)
     2948        __(jne 2f)
     2949        __(movb misc_subtag_offset(%arg_z),%imm0_b)
     2950        __(rcmpb(%imm0_b,$min_vector_subtag))
     2951        __(jb 2f)
     2952        __(movl $nil_value,%arg_z)
     2953        __(ret)
     29541:      __(movl $t_value,%arg_z)
     2955        __(ret)
     29562:
     2957        __(jump_builtin(_builtin_seqtype,1))
    29092958_endsubp(builtin_seqtype)
    29102959
     
    29272976        __(uuo_error_reg_not_list(Rtemp0))
    292829773:      __(_car(%temp0,%temp1))
    2929         __(cmpl %temp0,%arg_y)
     2978        __(cmpl %temp1,%arg_y)
    29302979        __(jne 4f)
    29312980        __(movl %temp0,%arg_z)
     
    31963245        __(jne local_label(push_nil_loop))
    31973246
    3198         __(int $3)
     3247/* Need to use arg regs as temporaries.  Stash them in the spill area. */
     3248        __(movl %arg_y,%rcontext:tcr.save1)
     3249        __(movl %arg_z,%rcontext:tcr.save2)
     3250
     3251        __(leal (%esp,%imm0),%temp0)    /* start of already-pushed args */
     3252        __(leal -nargregs<<fixnumshift(%nargs),%arg_y) /* args pushed */
     3253        __(movd %imm0,%mm0)     /* save inherited arg count */
     3254        __(xorl %imm0,%imm0)
     3255local_label(copy_already_loop):
     3256        __(movl (%temp0,%imm0),%arg_z)
     3257        __(movl %arg_z,(%esp,%imm0))
     3258        __(addl $fixnumone,%imm0)
     3259        __(cmpl %imm0,%arg_y)
     3260        __(jne local_label(copy_already_loop))
     3261
     3262        __(lea -node_size(%temp0,%imm0),%arg_y) /* start of args on stack */
     3263        __(movl $7<<fixnumshift,%temp0) /* skip code, new fn */
     3264        __(movd %mm0,%imm0)
     3265local_label(insert_loop):
     3266        __(movl misc_data_offset(%fn,%temp0),%arg_z)
     3267        __(addl $node_size,%temp0)
     3268        __(addl $fixnumone,%nargs)
     3269        __(movl %arg_z,(%arg_y))
     3270        __(subl $node_size,%arg_y)
     3271        __(subl $fixnumone,%imm0)
     3272        __(jne local_label(insert_loop))
     3273
     3274        /* Recover arg regs, saved earlier */
     3275        __(movl %rcontext:tcr.save1,%arg_y)
     3276        __(movl %rcontext:tcr.save2,%arg_z)
     3277        __(jmp local_label(go))
     3278       
    31993279/* Here if no args were pushed by the caller. */
    32003280/* cases: */
     
    32033283/* two args in arg_y and arg_z, some number of inherited args */
    32043284
    3205 /* Therefore, we're always going to have to push something (the sum of
     3285/* Therefore, we're always going to have to push something (the sum of */
    32063286/* %nargs and %imm0 will always be greater than $nargregs), and */
    32073287/* we will have to reserve space for a stack frame. */
Note: See TracChangeset for help on using the changeset viewer.