Changeset 3454


Ignore:
Timestamp:
Feb 13, 2006, 4:42:38 AM (14 years ago)
Author:
gb
Message:

Every day, more stuff.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ccl/lisp-kernel/x86-spentry64.s

    r3446 r3454  
    149149_endfn
    150150
     151_spentry(misc_ref)
     152        __(movb $tagmask,%imm0_b)
     153        __(andb %arg_y_b,%imm0_b)
     154        __(cmpb $tag_misc,%imm0_b)
     155        __(je,pt 0f)
     156        __(uuo_error_reg_not_tag(Rarg_y,tag_misc))
     1570:      __(testb $fixnummask,%arg_z_b)
     158        __(je,pt 1f)
     159        __(uuo_error_reg_not_fixnum(Rarg_z))
     1601:      __(movq %arg_z,%imm0)
     161        __(shlq $num_subtag_bits-fixnumshift,%imm0)
     162        __(movb $-1,%imm0_b)
     163        __(cmpq misc_header_offset(%arg_y),%imm0)
     164        __(jb 2f)
     165        /* This is a vector bounds trap, which is hard to encode */
     166        .byte 0xcd,0xc8,0xf7
     1672:      __(movb misc_subtag_offset(%arg_y),%imm1_b)
     168_endsubp(misc_ref)
     169       
    151170/* %imm1.b = subtag, %arg_y = uvector, %arg_z = index.
    152171   Bounds/type-checking done in caller */       
     
    257276        __(jmp *%ra0)                   
    258277_endfn(C(misc_ref_common))
    259                                
     278
     279/* like misc_ref, only the boxed subtag is in arg_x.
     280*/                                     
     281_spentry(subtag_misc_ref)
     282        __(movb $tagmask,%imm0_b)
     283        __(andb %arg_y_b,%imm0_b)
     284        __(cmpb $tag_misc,%imm0_b)
     285        __(je,pt 0f)
     286        __(uuo_error_reg_not_tag(Rarg_y,tag_misc))
     2870:      __(testb $fixnummask,%arg_z_b)
     288        __(je,pt 1f)
     289        __(uuo_error_reg_not_fixnum(Rarg_z))
     2901:      __(movq %arg_z,%imm0)
     291        __(shlq $num_subtag_bits-fixnumshift,%imm0)
     292        __(subb $1,%imm0_b)
     293        __(cmpq misc_header_offset(%arg_y),%imm0)
     294        __(jb 2f)
     295        /* This is a vector bounds trap, which is hard to encode */
     296        .byte 0xcd,0xc8,0xf7
     2972:      __(unbox_fixnum(%arg_x,%imm1))
     298        __(jmp C(misc_ref_common))
     299_endsubp(subtag_misc_ref)
    260300
    261301/* ret1valn returns "1 multiple value" when a called function does not */
     
    307347       
    308348_spentry(jmpsym)
     349        __(jump_fname())
    309350_endsubp(jmpsym)
    310351
    311352_spentry(jmpnfn)
     353        __(movq %temp0,%fn)
     354        __(jmp *%fn)
    312355_endsubp(jmpnfn)
    313356
     
    781824_endsubp(mkstackv)
    782825
    783 _spentry(subtag_misc_ref)
    784 _endsubp(subtag_misc_ref)
    785826       
    786827        .globl C(egc_write_barrier_start)
     
    855896                               
    856897_spentry(setqsym)
     898        __(btq $sym_vbit_const,symbol.flags(%arg_y))
     899        __(je _SPspecset)
     900        __(movq %arg_y,%arg_z)
     901        __(movq $XCONST,%arg_y)
     902        __(set_nargs(2))
     903        __(jmp _SPksignalerr)
    857904_endsubp(setqsym)
    858905
    859906_spentry(progvsave)
     907        __(int $3)
    860908_endsubp(progvsave)
    861909
     
    863911_endsubp(stack_misc_alloc)
    864912
     913/* subtype (boxed, of course) is pushed, followed by nargs bytes worth of
     914   initial-contents.  Note that this can be used to cons any type of initialized
     915   node-header'ed misc object (symbols, closures, ...) as well as vector-like
     916   objects.
     917   Note that we're guaranteed to win (or force GC, or run out of memory)
     918   because nargs < 32K. */     
    865919_spentry(gvector)
     920        __(movzwl %nargs,%nargs_l)
     921        __(movq (%rsp,%nargs_q),%imm0)  /* boxed subtype */
     922        __(sarq $fixnumshift,%imm0)
     923        __(movq %nargs_q,%imm1)
     924        __(shlq $num_subtag_bits-word_shift,%imm1)
     925        __(orq %imm1,%imm0)
     926        __(dnode_align(%nargs_q,node_size,%imm1))
     927        __(Misc_Alloc(%arg_z))
     928        __(movq %nargs_q,%imm1)
     929        __(jmp 2f)
     9301:      __(movq %temp0,misc_data_offset(%arg_z,%imm1))
     9312:      __(subq $node_size,%imm1)
     932        __(pop %temp0)  /* Note the intentional fencepost:
     933                           discard the subtype as well.*/
     934        __(jge 1b)
     935        __(jmp *%ra0)
    866936_endsubp(gvector)
    867937
    868938_spentry(mvpass)
     939        __(int $3)
    869940_endsubp(mvpass)
    870941
    871942_spentry(fitvals)
     943        __(int $3)
    872944_endsubp(fitvals)
    873945
     946/* N pushed %nargs values. */
    874947_spentry(nthvalue)
     948        __(movzwl %nargs,%nargs_l)
     949        __(leaq (%rsp,%nargs_q),%imm0)
     950        __(movq (%imm0),%imm1) 
     951        __(movl $nil_value,%arg_z_l)
     952        __(cmpq %imm1,%nargs_q)
     953        __(jb 1f)
     954        __(neg %imm1)
     955        __(movq -node_size(%imm0,%imm1),%arg_z)
     9561:      __(leaq node_size(%imm0),%rsp)
     957        __(jmp *%ra0)   
    875958_endsubp(nthvalue)
    876959
     
    885968
    886969_spentry(heap_rest_arg)
     970        __(push_argregs())
     971        __(movzwl %nargs,%nargs_l)
     972        __(movl %nargs_l,%imm1_l)
     973        __(testl %imm1_l,%imm1_l)
     974        __(movl $nil_value,%arg_z_l)
     975        __(jmp 2f)
     976        .p2align 4
     9771:      __(pop %temp1)
     978        __(Cons(%temp1,%arg_z,%arg_z))
     979        __(subl $node_size,%imm1_l)
     9802:      __(jg 1b)
     981        __(push %arg_z)
     982        __(jmp *%ra0)           
    887983_endsubp(heap_rest_arg)
    888984
     985/* %imm0 contains the number of fixed args ; make an &rest arg out of the others */
    889986_spentry(req_heap_rest_arg)
     987        __(push_argregs())
     988        __(movzwl %nargs,%nargs_l)
     989        __(movl %nargs_l,%imm1_l)
     990        __(subl %imm0_l,%imm1_l)
     991        __(movl $nil_value,%arg_z_l)
     992        __(jmp 2f)
     993        .p2align 4
     9941:      __(pop %temp1)
     995        __(Cons(%temp1,%arg_z,%arg_z))
     996        __(subl $node_size,%imm1_l)
     9972:      __(jg 1b)
     998        __(push %arg_z)
     999        __(jmp *%ra0)           
    8901000_endsubp(req_heap_rest_arg)
    8911001
     1002/* %imm0 bytes of stuff has already been pushed ; make an &rest out of any others */
    8921003_spentry(heap_cons_rest_arg)
     1004        __(movzwl %nargs,%nargs_l)
     1005        __(movl %nargs_l,%imm1_l)
     1006        __(subl %imm0_l,%imm1_l)
     1007        __(movl $nil_value,%arg_z_l)
     1008        __(jmp 2f)
     1009        .p2align 4
     10101:      __(pop %temp1)
     1011        __(Cons(%temp1,%arg_z,%arg_z))
     1012        __(subl $node_size,%imm1_l)
     10132:      __(jg 1b)
     1014        __(push %arg_z)
     1015        __(jmp *%ra0)           
    8931016_endsubp(heap_cons_rest_arg)
    8941017
     
    9091032
    9101033_spentry(ksignalerr)
     1034        __(movq $nrs.errdisp,%fname)
     1035        __(jump_fname) 
    9111036_endsubp(ksignalerr)
    9121037
    9131038_spentry(stack_rest_arg)
     1039        __(xorl %imm0_l,%imm0_l)
     1040        __(push_argregs())
     1041        __(jmp _SPstack_cons_rest_arg)
    9141042_endsubp(stack_rest_arg)
    9151043
    9161044_spentry(req_stack_rest_arg)
     1045        __(push_argregs())
     1046        __(jmp _SPstack_cons_rest_arg)
    9171047_endsubp(req_stack_rest_arg)
    9181048
    9191049_spentry(stack_cons_rest_arg)
     1050        __(movzwl %nargs,%nargs_l)
     1051        __(movl %nargs_l,%imm1_l)
     1052        __(subl %imm0_l,%imm1_l)
     1053        __(movl $nil_value,%arg_z_l)
     1054        __(je 2f)       /* empty list ; make an empty TSP frame */
     1055        __(cmpq $(tstack_alloc_limit-dnode_size)/2,%imm1)
     1056        __(ja 3f)       /* make empty frame, then heap-cons */
     1057        __(addq %imm1,%imm1)
     1058        __(dnode_align(%imm1,tsp_frame.fixed_overhead,%imm0))
     1059        __(TSP_Alloc_Var(%imm0,%temp0))
     1060        __(addq $tsp_frame.fixed_overhead+fulltag_cons,%temp0)
     10611:      __(pop %arg_x)
     1062        __(_rplacd(%temp0,%arg_z))
     1063        __(_rplaca(%temp0,%arg_x))
     1064        __(movq %temp0,%arg_z)
     1065        __(addq $cons.size,%temp0)
     1066        __(subq $dnode_size,%imm1)
     1067        __(jne 1b)
     1068        __(push %arg_z)
     1069        __(jmp *%ra0)
     1070/* Length 0, make empty frame */       
     10712:
     1072        __(TSP_Alloc_Fixed(0,%temp0))
     1073        __(push %arg_z)
     1074        __(jmp *%ra0)
     1075/* Too big to stack-cons, but make an empty frame before heap-consing */
     10763:             
     1077        __(TSP_Alloc_Fixed(0,%temp0))
     1078        __(jmp _SPheap_cons_rest_arg)
    9201079_endsubp(stack_cons_rest_arg)
    9211080
     
    10671226_endsubp(tcallnfnvsp)
    10681227
    1069 _spentry(misc_ref)
    1070 _endsubp(misc_ref)
    10711228
    10721229_spentry(misc_set)
     
    10771234
    10781235_spentry(stkvcell0)
     1236        __(int $3)
    10791237_endsubp(stkvcell0)
    10801238
    10811239_spentry(stkvcellvsp)
     1240        __(int $3)
    10821241_endsubp(stkvcellvsp)
    10831242
     1243/* Make a "raw" area on the foreign stack, stack-cons a macptr to point to it,
     1244   and return the macptr.  Size (in bytes, boxed) is in arg_z on entry; macptr
     1245   in arg_z on exit. */
    10841246_spentry(makestackblock)
     1247        __(unbox_fixnum(%arg_z,%imm0))
     1248        __(dnode_align(%imm0,tsp_frame.fixed_overhead+macptr.size,%imm0))
     1249        __(cmpq $tstack_alloc_limit,%imm0)
     1250        __(jae 1f)
     1251        __(movd %foreign_sp,%arg_z)
     1252        __(subq %imm0,%arg_z)
     1253        __(movq %foreign_sp,(%arg_z))
     1254        __(movd %arg_z,%foreign_sp)
     1255        __(lea macptr.size+tsp_frame.fixed_overhead(%arg_z),%imm0)
     1256        __(movq $macptr_header,tsp_frame.fixed_overhead(%arg_z))
     1257        __(addq fulltag_misc+tsp_frame.fixed_overhead,%arg_z)
     1258        __(movq %imm0,macptr.address(%arg_z))
     1259        __(movss %fp0,macptr.domain(%arg_z))
     1260        __(movss %fp0,macptr.type(%arg_z))
     1261        __(jmp *%ra0)
     12621:      __(movd %foreign_sp,%imm0)
     1263        __(subq $dnode_size,%imm0)
     1264        __(movq %foreign_sp,(%imm0))
     1265        __(movd %imm0,%foreign_sp)
     1266        __(set_nargs(1))
     1267        __(movq $nrs.new_gcable_ptr,%fname)
     1268        __(jump_fname())
    10851269_endsubp(makestackblock)
    10861270
    10871271_spentry(makestackblock0)
     1272        __(unbox_fixnum(%arg_z,%imm0))
     1273        __(dnode_align(%imm0,tsp_frame.fixed_overhead+macptr.size,%imm0))
     1274        __(cmpq $tstack_alloc_limit,%imm0)
     1275        __(jae 9f)
     1276        __(movd %foreign_sp,%arg_z)
     1277        __(movq %arg_z,%imm1)
     1278        __(subq %imm0,%arg_z)
     1279        __(movq %foreign_sp,(%arg_z))
     1280        __(movd %arg_z,%foreign_sp)
     1281        __(lea macptr.size+tsp_frame.fixed_overhead(%arg_z),%imm0)
     1282        __(movq $macptr_header,tsp_frame.fixed_overhead(%arg_z))
     1283        __(addq fulltag_misc+tsp_frame.fixed_overhead,%arg_z)
     1284        __(movq %imm0,macptr.address(%arg_z))
     1285        __(movss %fp0,macptr.domain(%arg_z))
     1286        __(movss %fp0,macptr.type(%arg_z))
     1287        __(jmp 2f)
     12881:      __(movapd %fp0,(%imm0))
     1289        __(addq $dnode_size,%imm0)
     12902:      __(cmpq %imm0,%imm1)
     1291        __(jne 1b)             
     1292        __(jmp *%ra0)
     12939:      __(movd %foreign_sp,%imm0)
     1294        __(subq $dnode_size,%imm0)
     1295        __(movq %foreign_sp,(%imm0))
     1296        __(movd %imm0,%foreign_sp)
     1297        __(set_nargs(1))
     1298        __(movq $nrs.new_gcable_ptr,%fname)
     1299        __(jump_fname())
    10881300_endsubp(makestackblock0)
    10891301
     
    11161328_endsubp(vpopargregs)
    11171329
     1330/* If arg_z is an integer, return in imm0 something whose sign
     1331   is the same as arg_z's.  If not an integer, error. */
    11181332_spentry(integer_sign)
     1333        __(testb $tagmask,%arg_z_b)
     1334        __(movq %arg_z,%imm0)
     1335        __(je 8f)
     1336        __(extract_typecode(%arg_z,%imm0))
     1337        __(cmpb $subtag_bignum,%imm0_b)
     1338        __(jne 9f)
     1339        __(getvheader(%arg_z,%imm0))
     1340        __(shr $num_subtag_bits,%imm0)
     1341        __(movl misc_data_offset-4(%arg_z,%imm0),%imm0_l)
     1342        __(setae %imm0_b)
     1343        __(andl $1,%imm0_l)
     13448:      __(jmp *%ra0)
     13459:      __(uuo_error_reg_not_type(Rarg_z,error_object_not_integer))
    11191346_endsubp(integer_sign)
    11201347
Note: See TracChangeset for help on using the changeset viewer.