Changeset 8686


Ignore:
Timestamp:
Mar 8, 2008, 7:16:32 AM (12 years ago)
Author:
rme
Message:

Implement several subprims.

.SPnthrowvalues, .SPrplaca, .SPset_hash_key, .SPspreadargz,
.SPstkgvector, .SPmvslide, .SPbind_interrupt_level_m1, .SPbuiltin_assq,
.SPbuiltin_memq.

File:
1 edited

Legend:

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

    r8660 r8686  
    10921092_endsubp(throw)
    10931093
    1094 /* This takes N multiple values atop the vstack.   */
     1094        /* This takes N multiple values atop the vstack.   */
    10951095_spentry(nthrowvalues)
    1096         __(int $3)
     1096        __(movb $1,%rcontext:tcr.unwinding)
     1097        __(movl %ra0,%rcontext:tcr.save0) /* %ra0 (aka %temp0) to spill area */
     1098local_label(_nthrowv_nextframe):
     1099        __(subl $fixnumone,%imm0)
     1100        __(js local_label(_nthrowv_done))
     1101        __(movd %imm0,%mm1)
     1102        __(movl %rcontext:tcr.catch_top,%temp0)
     1103        __(movl catch_frame.link(%temp0),%imm0)
     1104        __(movl %imm0,%rcontext:tcr.catch_top)
     1105        __(movl catch_frame.db_link(%temp0),%imm0)
     1106        __(cmpl %imm0,%rcontext:tcr.db_link)
     1107        __(jz local_label(_nthrowv_dont_unbind))
     1108        __(push %temp1)
     1109        __(push %temp0)
     1110        __(push $local_label(_nthrowv_back_from_unbind))
     1111        __(jmp _SPunbind_to)
     1112__(tra(local_label(_nthrowv_back_from_unbind)))
     1113        __(pop %temp0)
     1114        __(pop %temp1)
     1115local_label(_nthrowv_dont_unbind):
     1116        __(cmpb $unbound_marker,catch_frame.catch_tag(%temp0))
     1117        __(je local_label(_nthrowv_do_unwind))
     1118/* A catch frame.  If the last one, restore context from there.   */
     1119        __(movd %mm1,%imm0)
     1120        __(test %imm0,%imm0)    /* last catch frame ?   */
     1121        __(jne local_label(_nthrowv_skip))
     1122        __(movl catch_frame.xframe(%temp0),%arg_y)
     1123        __(movl %arg_y,%rcontext:tcr.xframe)
     1124        __(lea (%esp,%nargs),%arg_y)
     1125        __(movl catch_frame.esp(%temp0),%arg_z)
     1126        __(movd %nargs,%mm2)
     1127        __(jmp local_label(_nthrowv_push_test))
     1128local_label(_nthrowv_push_loop):
     1129        __(subl $node_size,%arg_y)
     1130        __(subl $node_size,%arg_z)
     1131        __(movd (%arg_y),%mm0)
     1132        __(movd %mm0,(%arg_z))
     1133local_label(_nthrowv_push_test):
     1134        __(subl $node_size,%nargs)
     1135        __(jns local_label(_nthrowv_push_loop))
     1136        __(movd %mm2,%nargs)
     1137        __(movl catch_frame.xframe(%temp0),%arg_y)
     1138        __(movl %arg_y,%rcontext:tcr.xframe)
     1139        __(movl %arg_z,%esp)
     1140        __(movl catch_frame.ebp(%temp0),%ebp)
     1141        __(movd catch_frame.foreign_sp(%temp0),%stack_temp)
     1142        __(movd %stack_temp,%rcontext:tcr.foreign_sp)       
     1143local_label(_nthrowv_skip):     
     1144        __(movl -(tsp_frame.fixed_overhead+fulltag_misc)(%temp0),%imm0)
     1145        __(movl %imm0,%rcontext:tcr.save_tsp)
     1146        __(movl %imm0,%rcontext:tcr.next_tsp)
     1147        __(movd %mm1,%imm0)
     1148        __(jmp local_label(_nthrowv_nextframe))
     1149local_label(_nthrowv_do_unwind):       
     1150/* This is harder.  Call the cleanup code with the multiple values and   */
     1151/* nargs, the throw count, and the caller's return address in a temp  */
     1152/* stack frame.   */
     1153        __(leal (%esp,%nargs),%arg_y)
     1154        __(push catch_frame.pc(%temp0))
     1155        __(movl catch_frame.ebp(%temp0),%ebp)
     1156        __(movd catch_frame.xframe(%temp0),%stack_temp)
     1157        __(movd %stack_temp,%rcontext:tcr.xframe)
     1158        __(movl catch_frame.esp(%temp0),%arg_z)
     1159        __(movd catch_frame.foreign_sp(%temp0),%stack_temp)
     1160        __(movd %stack_temp,%rcontext:tcr.foreign_sp)       
     1161        /* Discard the catch frame, so we can build a temp frame   */
     1162        __(movl -(tsp_frame.fixed_overhead+fulltag_misc)(%temp0),%imm0)
     1163        __(movl %imm0,%rcontext:tcr.save_tsp)
     1164        __(movl %imm0,%rcontext:tcr.next_tsp)
     1165        /* tsp overhead, nargs, throw count, ra0   */
     1166        __(dnode_align(%nargs,(tsp_frame.fixed_overhead+(3*node_size)),%imm0))
     1167        __(movl %imm0,%temp1)
     1168        __(TSP_Alloc_Var(%temp1,%imm0))
     1169        __(movd %mm2,%temp1) /* aka %nargs */
     1170
     1171        __(movl %nargs,(%imm0))
     1172        __(movl %rcontext:tcr.save0,%ra0)
     1173        __(movl %ra0,node_size(%imm0))
     1174        __(movd %mm1,node_size*2(%imm0))
     1175        __(leal node_size*3(%imm0),%imm0)
     1176        __(jmp local_label(_nthrowv_tpushtest))
     1177local_label(_nthrowv_tpushloop):
     1178        __(movl -node_size(%arg_y),%temp0)
     1179        __(subl $node_size,%arg_y)
     1180        __(movl %temp0,(%imm0))
     1181        __(addl $node_size,%imm0)
     1182local_label(_nthrowv_tpushtest):
     1183        __(subl $node_size,%nargs)
     1184        __(jns local_label(_nthrowv_tpushloop))
     1185        __(pop %xfn)    /* aka %temp1/%nargs */
     1186        __(movl %arg_z,%esp)
     1187/* Ready to call cleanup code. set up tra, jmp to %xfn   */
     1188        __(push $local_label(_nthrowv_called_cleanup))
     1189        __(movb $0,%rcontext:tcr.unwinding)
     1190        __(jmp *%xfn)
     1191__(tra(local_label(_nthrowv_called_cleanup)))
     1192
     1193        __(movb $1,%rcontext:tcr.unwinding)
     1194        __(movl %rcontext:tcr.save_tsp,%imm0)
     1195        __(movl tsp_frame.data_offset+(0*node_size)(%imm0),%nargs)
     1196        __(movl tsp_frame.data_offset+(1*node_size)(%imm0),%ra0)
     1197        __(movl %ra0,%rcontext:tcr.save0)
     1198        __(movd tsp_frame.data_offset+(2*node_size)(%imm0),%mm1)
     1199        __(movd %nargs,%mm2)
     1200        __(addl $tsp_frame.fixed_overhead+(node_size*3),%imm0)
     1201        __(jmp local_label(_nthrowv_tpoptest))
     1202local_label(_nthrowv_tpoploop):
     1203        __(push (%imm0))
     1204        __(addl $node_size,%imm0)
     1205local_label(_nthrowv_tpoptest):
     1206        __(subl $node_size,%nargs)
     1207        __(jns local_label(_nthrowv_tpoploop))
     1208        __(movd %mm2,%nargs)
     1209        __(movl %rcontext:tcr.save_tsp,%imm0)
     1210        __(movl (%imm0),%imm0)
     1211        __(movl %imm0,%rcontext:tcr.save_tsp)
     1212        __(movl %imm0,%rcontext:tcr.next_tsp)
     1213        __(movd %mm1,%imm0)
     1214        __(jmp local_label(_nthrowv_nextframe))
     1215local_label(_nthrowv_done):
     1216        __(movb $0,%rcontext:tcr.unwinding)
     1217        __(check_pending_interrupt(%imm0))
     1218local_label(_nthrowv_return):
     1219        __(movl %rcontext:tcr.save0,%ra0)
     1220        __(movss %fpzero,%rcontext:tcr.save0)
     1221        __(jmp *%ra0)   
    10971222_endsubp(nthrowvalues)
    10981223
     
    12581383        .globl C(egc_rplaca)
    12591384C(egc_rplaca):
    1260         __(int $3)
     1385        __(rcmpl(%arg_z,%arg_y))
     1386        __(_rplaca(%arg_y,%arg_z))
     1387        __(ja 1f)
     13880:      __(repret)
     13891:      __(movl %arg_y,%imm0)
     1390        __(subl lisp_global(heap_start),%imm0)
     1391        __(shrl $dnode_shift,%imm0)
     1392        __(cmpl lisp_global(oldspace_dnode_count),%imm0)
     1393        __(jae 0b)
     1394        __(andl $~(1<<bitmap_shift-1),%temp0)
     1395        __(shrl $bitmap_shift-fixnumshift,%temp0)
     1396        __(andl $31,%imm0)
     1397        __(addl lisp_global(refbits),%temp0)
     1398        __(xorb $31,%imm0_b)
     1399        __(lock)
     1400        __(btsl %imm0,(%temp0))
     1401        __(ret)
    12611402_endsubp(rplaca)
    12621403
     
    13071448_endsubp(gvset)
    13081449
     1450/* This is a special case of storing into a gvector: if we need to  */
     1451/* memoize the store, record the address of the hash-table vector  */
     1452/* in the refmap, as well.  */
     1453
    13091454_spentry(set_hash_key)
    13101455        .globl C(egc_set_hash_key)
    13111456C(egc_set_hash_key):
    1312         __(int $3)
     1457        __(movl %arg_z,misc_data_offset(%temp0,%arg_y))
     1458        __(rcmpl(%arg_z,%temp0))
     1459        __(ja 1f)
     14600:      __(repret)
     14611:      __(lea misc_data_offset(%temp0,%arg_y),%imm0)
     1462        __(subl lisp_global(heap_start),%imm0)
     1463        __(shrl $dnode_shift,%imm0)
     1464        __(cmpl lisp_global(oldspace_dnode_count),%imm0)
     1465        __(jae 0b)
     1466        __(push %temp0)
     1467        __(andl $~(1<<bitmap_shift-1),%temp0)
     1468        __(shrl $bitmap_shift-fixnumshift,%temp0)
     1469        __(andl $31,%imm0)
     1470        __(addl lisp_global(refbits),%temp0)
     1471        __(xorb $31,%imm0_b)
     1472        __(lock)
     1473        __(btsl %imm0,(%temp0))
     1474        /* Now memoize the address of the hash vector */
     1475        __(pop %imm0)
     1476        __(subl lisp_global(heap_start),%imm0)
     1477        __(shrl $dnode_shift,%imm0)
     1478        __(andl $~(1<<bitmap_shift-1),%temp0)
     1479        __(shrl $bitmap_shift-fixnumshift,%temp0)
     1480        __(andl $31,%imm0)
     1481        __(addl lisp_global(refbits),%temp0)
     1482        __(xorb $31,%imm0_b)
     1483        __(lock)
     1484        __(btsl %imm0,(%temp0))
     1485        __(ret)
    13131486_endsubp(set_hash_key)
    13141487
     
    17611934/* who pushed it) if all args fit in registers.   */
    17621935_spentry(spreadargz)
    1763         __(int $3)
     1936        __(test %nargs,%nargs)
     1937        __(jne 0f)
     1938        __(push $reserved_frame_marker)
     1939        __(push $reserved_frame_marker)
     19400:      __(movl %arg_z,%rcontext:tcr.save0)     /* save in case of error */
     1941        __(movd %nargs,%mm0)    /* now we can use %temp1 */
     1942        __(xorl %nargs,%nargs)
     1943        __(cmpl $nil_value,%arg_z)
     1944        __(je 2f)
     19451:      __(extract_fulltag(%arg_z,%imm0))
     1946        __(cmpb $fulltag_cons,%imm0_b)
     1947        __(jne 9f)
     1948        __(_car(%arg_z,%arg_y))
     1949        __(_cdr(%arg_z,%arg_z))
     1950        __(add $node_size,%nargs)
     1951        __(cmpl $call_arguments_limit<<fixnumshift,%nargs)
     1952        __(jge 8f)
     1953        __(push %arg_y)
     1954        __(cmpl $nil_value,%arg_z)
     1955        __(jne 1b)
     19562:      __(movd %mm0,%imm0)
     1957        __(addl %imm0,%nargs)
     1958        __(jne 4f)
     19593:      __(addl $2*node_size,%esp)
     1960        __(movl $0,%rcontext:tcr.save0)
     1961        __(jmp *%ra0)
     19624:      __(pop %arg_z)
     1963        __(cmp $1*node_size,%nargs)
     1964        __(je 3b)
     1965        __(pop %arg_y)
     1966        __(cmp $2*node_size,%nargs)
     1967        __(je 3b)
     1968        __(movl $0,%rcontext:tcr.save0)
     1969        __(jmp *%ra0)
     1970/* Discard everything that's been pushed already, complain */
     19718:      __(lea (%esp,%nargs),%esp)
     1972        __(movl %rcontext:tcr.save0,%arg_z) /* recover original */
     1973        __(movl $0,%rcontext:tcr.save0)
     1974        __(movl $XTMINPS,%arg_y)
     1975        __(set_nargs(2))
     1976        __(push %ra0)
     1977        __(jmp _SPksignalerr)
     19789:      __(lea (%esp,%nargs),%esp)
     1979        __(movl %rcontext:tcr.save0,%arg_z) /* recover original */
     1980        __(movl $0,%rcontext:tcr.save0)
     1981        __(movl $XNOSPREAD,%arg_y)
     1982        __(set_nargs(2))
     1983        __(push %ra0)
     1984        __(jmp _SPksignalerr)
    17641985_endsubp(spreadargz)
    17651986
    17661987
    1767 /* Caller built it's own frame when it was entered.  If all outgoing args  */
     1988/* Caller built its own frame when it was entered.  If all outgoing args  */
    17681989/* are in registers, we can discard that frame; otherwise, we copy outgoing  */
    17691990/* relative to it and restore %rbp/%ra0   */
     
    18692090_endsubp(makestacklist)
    18702091
     2092/* subtype (boxed) vpushed before initial values. (Had better be a */
     2093/* node header subtag.)  Nargs set to count of things vpushed. */
    18712094_spentry(stkgvector)
    1872         __(int $3)
     2095        __(movl -fixnumone(%esp,%nargs),%imm0)  /* boxed subtag */
     2096        __(shrl $fixnumshift,%imm0)
     2097        __(leal -fixnumone(%nargs),%arg_z)
     2098        __(movl %arg_z,%arg_y)
     2099        __(shll $num_subtag_bits-fixnumshift,%arg_z)
     2100        __(orl %arg_z,%imm0)    /* imm0 = header, %arg_y = unaligned size */
     2101        __(movd %imm0,%mm0)
     2102        __(dnode_align(%arg_y,(tsp_frame.fixed_overhead+node_size),%imm0))
     2103        __(TSP_Alloc_Var(%imm0,%arg_z))
     2104        __(movd %mm0,(%arg_z))
     2105        __(addl $fulltag_misc,%arg_z)
     2106        __(lea -node_size(%nargs),%imm0)
     2107        __(jmp 2f)
     21081:      __(pop misc_data_offset(%arg_z,%imm0))
     21092:      __(subl $node_size,%imm0)
     2110        __(jge 1b)
     2111        __(addl $node_size,%esp)
     2112        __(jmp *%ra0)
    18732113_endsubp(stkgvector)
    18742114
     
    19582198_endsubp(integer_sign)
    19592199
     2200/* "slide" nargs worth of values up the stack.  imm0 contains */
     2201/* the difference between the current stack pointer and the target. */
    19602202_spentry(mvslide)
    1961         __(int $3)
     2203        __(movl %nargs,%temp1)
     2204        __(lea (%esp,%nargs),%arg_y)
     2205        __(lea (%arg_y,%imm0),%imm0)
     2206        __(test %temp1,%temp1)
     2207        __(je 2f)
     22081:
     2209        __(subl $node_size,%arg_y)
     2210        __(movl (%arg_y),%arg_z)
     2211        __(subl $node_size,%imm0)
     2212        __(movl %arg_z,(%imm0))
     2213        __(subl $node_size,%temp1)
     2214        __(jne 1b)
     22152:      __(movl %imm0,%esp)
     2216        __(jmp *%ra0)
    19622217_endsubp(mvslide)
    19632218
     
    21652420_endsubp(bind_interrupt_level_0)
    21662421
     2422/* Bind CCL::*INTERRUPT-LEVEL* to the fixnum -1.  (This has the effect  */
     2423/* of disabling interrupts.)   */
    21672424_spentry(bind_interrupt_level_m1)
    2168         __(int $3)
     2425        __(movl %rcontext:tcr.tlb_pointer,%arg_y)
     2426        __(push INTERRUPT_LEVEL_BINDING_INDEX(%arg_y))
     2427        __(push $INTERRUPT_LEVEL_BINDING_INDEX)
     2428        __(push %rcontext:tcr.db_link)
     2429        __(movl %esp,%rcontext:tcr.db_link)
     2430        __(movl $-1<<fixnumshift,INTERRUPT_LEVEL_BINDING_INDEX(%arg_y))
     2431        __(jmp *%ra0)
    21692432_endsubp(bind_interrupt_level_m1)
    21702433
     
    24062669
    24072670_spentry(builtin_assq)
    2408         __(int $3)
     2671        __(cmpl $nil_value,%arg_z)
     2672        __(je 5f)
     26731:      __(movl %arg_z,%imm0)
     2674        __(andb $fulltagmask,%imm0_b)
     2675        __(cmpb $fulltag_cons,%imm0_b)
     2676        __(je,pt 2f)
     2677        __(uuo_error_reg_not_list(Rarg_z))
     26782:      __(_car(%arg_z,%temp0))
     2679        __(_cdr(%arg_z,%arg_z))
     2680        __(cmpl $nil_value,%temp0)
     2681        __(je 4f)
     2682        __(movl %temp0,%imm0)
     2683        __(andb $fulltagmask,%imm0_b)
     2684        __(cmpb $fulltag_cons,%imm0_b)
     2685        __(je,pt 3f)
     2686        __(uuo_error_reg_not_list(Rtemp0))
     26873:      __(_car(%temp0,%temp1))
     2688        __(cmpl %temp0,%arg_y)
     2689        __(jne 4f)
     2690        __(movl %temp0,%arg_z)
     2691        __(ret)
     26924:      __(cmpl $nil_value,%arg_z)
     26935:      __(jnz 1b)
     2694        __(repret)
    24092695_endsubp(builtin_assq)
    24102696
     
    24162702
    24172703_spentry(builtin_logbitp)
    2418         __(int $3)
     2704        /* Call out unless: both args fixnums, arg_y in [0, logbitp_max_bit) */
     2705        __(movl %arg_z,%imm0)
     2706        __(orl %arg_y,%imm0)
     2707        __(testb $fixnummask,%imm0_b)
     2708        __(jnz 1f)
     2709        __(unbox_fixnum(%arg_y,%imm0))
     2710        __(cmpb $logbitp_max_bit,%imm0_b)
     2711        __(jae 1f)
     2712        __(addb $fixnumshift,%imm0_b)
     2713        __(bt %imm0,%arg_z)
     2714        __(condition_to_boolean(b,%imm0,%arg_z))
     2715        __(ret)
     27161:      __(jump_builtin(_builtin_logbitp,2))
    24192717_endsubp(builtin_logbitp)
    24202718
Note: See TracChangeset for help on using the changeset viewer.