Changeset 9301


Ignore:
Timestamp:
Apr 27, 2008, 2:14:29 AM (11 years ago)
Author:
rme
Message:

SPmkwunwind, SPthrow, SPprogvsave, SPmakestackblock0, SPprovrestore: implement.

SPunbind_to, SPunbind_n: preserve registers

File:
1 edited

Legend:

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

    r9267 r9301  
    11141114
    11151115_spentry(mkunwind)
    1116         __(int $3)
     1116        __(movl $undefined,%arg_z)
     1117        __(Make_Catch(fixnumone))
     1118        __(jmp *%ra0)
    11171119_endsubp(mkunwind)
    11181120
     
    11401142
    11411143_spentry(throw)
    1142         __(int $3)
     1144        __(movl %rcontext:tcr.catch_top,%imm0)
     1145        __(movl (%esp,%nargs),%arg_y)   /* arg_y = tag   */
     1146        __(movd %nargs,%mm0)
     1147        __(xorl %temp1,%temp1)
     1148        __(jmp local_label(_throw_test))
     1149local_label(_throw_loop):
     1150        __(cmpl %arg_y,catch_frame.catch_tag(%imm0))
     1151        __(je local_label(_throw_found))
     1152        __(movl catch_frame.link(%imm0),%imm0)
     1153        __(addl $fixnum_one,%temp1)
     1154local_label(_throw_test):
     1155        __(test %imm0,%imm0)
     1156        __(jne local_label(_throw_loop))
     1157        __(push %ra0)
     1158        __(uuo_error_reg_not_tag(Rtemp0,subtag_catch_frame))
     1159        __(pop %ra0)
     1160        __(jmp _SPthrow)
     1161local_label(_throw_found):
     1162        __(testb $fulltagmask,catch_frame.mvflag(%imm0))
     1163        __(movl %temp1,%imm0)
     1164        __(movd %mm0,%nargs)
     1165        __(jne local_label(_throw_multiple))
     1166        __(test %nargs,%nargs)
     1167        __(je local_label(_throw_one_value))
     1168        __(movl -node_size(%esp,%nargs),%arg_z)
     1169        __(add %nargs,%esp)
     1170local_label(_throw_one_value):
     1171        __(movl $nil_value,%arg_z)
     1172        __(movl $local_label(_threw_one_value),%ra0)
     1173        __(jmp _SPnthrow1value)
     1174__(tra(local_label(_threw_one_value)))
     1175        __(movl %rcontext:tcr.catch_top,%arg_y)
     1176        __(movl catch_frame.db_link(%arg_y),%imm0)
     1177        __(cmpl %imm0,%rcontext:tcr.db_link)
     1178        __(jz local_label(_threw_one_value_dont_unbind))
     1179        __(push $local_label(_threw_one_value_dont_unbind))
     1180        __(jmp _SPunbind_to)    /* preserves registers */
     1181__(tra(local_label(_threw_one_value_dont_unbind)))
     1182        __(movl catch_frame.ebp(%arg_y),%ebp)
     1183        __(movl catch_frame.foreign_sp(%arg_y),%imm0)
     1184        __(movl %imm0,%rcontext:tcr.foreign_sp)
     1185        __(movl catch_frame.xframe(%arg_y),%imm0)
     1186        __(movl %imm0,%rcontext:tcr.xframe)
     1187        __(movl catch_frame.esp(%arg_y),%esp)
     1188        __(movl catch_frame.link(%arg_y),%imm0)
     1189        __(movl %imm0,%rcontext:tcr.catch_top)
     1190        __(lea -(tsp_frame.fixed_overhead+fulltag_misc)(%arg_y),%imm0)
     1191        __(movl (%imm0),%imm0)
     1192        __(movl %imm0,%rcontext:tcr.save_tsp)
     1193        __(movl %imm0,%rcontext:tcr.next_tsp)
     1194        __(movl catch_frame.pc(%arg_y),%ra0)
     1195        __(jmp *%ra0)
     1196local_label(_throw_multiple):
     1197        __(movl $local_label(_threw_multiple),%ra0)
     1198        __(jmp _SPnthrowvalues)
     1199__(tra(local_label(_threw_multiple)))
     1200        __(movl %rcontext:tcr.catch_top,%arg_y)
     1201        __(movl catch_frame.db_link(%arg_y),%imm0)
     1202        __(cmpl %imm0,%rcontext:tcr.db_link)
     1203        __(je local_label(_threw_multiple_dont_unbind))
     1204        __(push $local_label(_threw_multiple_dont_unbind))
     1205        __(jmp _SPunbind_to)    /* preserves registers */
     1206__(tra(local_label(_threw_multiple_dont_unbind)))
     1207        /* Copy multiple values from the current %esp to the target %esp   */
     1208        __(lea (%esp,%nargs),%imm0)
     1209        __(movd %nargs,%mm0)    /* nargs is aka temp1 */
     1210        __(movl catch_frame.esp(%arg_y),%temp1)
     1211        __(jmp local_label(_threw_multiple_push_test))
     1212local_label(_threw_multiple_push_loop):
     1213        __(subl $node_size,%imm0)
     1214        __(subl $node_size,%temp1)
     1215        __(movl (%imm0),%arg_z)
     1216        __(movl %arg_z,(%temp1))
     1217local_label(_threw_multiple_push_test):
     1218        __(cmpl %imm0,%esp)
     1219        __(jne local_label(_threw_multiple_push_loop))
     1220        /* target %esp is now in %temp1   */
     1221        __(movl catch_frame.ebp(%arg_y),%ebp)
     1222        __(movl catch_frame.foreign_sp(%arg_y),%imm0)
     1223        __(movl %imm0,%rcontext:tcr.foreign_sp)       
     1224        __(movl catch_frame.xframe(%arg_y),%imm0)
     1225        __(movl %imm0,%rcontext:tcr.xframe)
     1226        __(movl %temp1,%esp)
     1227        __(movl catch_frame.link(%arg_y),%temp1)
     1228        __(movl %temp1,%rcontext:tcr.catch_top)
     1229        __(movd %mm0,%nargs)
     1230        __(lea -(tsp_frame.fixed_overhead+fulltag_misc)(%arg_y),%imm0)
     1231        __(movl catch_frame.pc(%arg_y),%ra0)
     1232        __(movl (%imm0),%imm0)
     1233        __(movl %imm0,%rcontext:tcr.save_tsp)
     1234        __(movl %imm0,%rcontext:tcr.next_tsp)
     1235        __(jmp *%ra0)
    11431236_endsubp(throw)
    11441237
     
    17321825
    17331826_spentry(progvsave)
    1734         __(int $3)
     1827        __(push %arg_y)
     1828       
     1829        /* Error if arg_z isn't a proper list.  That's unlikely,  */
     1830        /* but it's better to check now than to crash later.  */
     1831       
     1832        __(compare_reg_to_nil(%arg_z))
     1833        __(movl %arg_z,%temp0)  /* fast   */
     1834        __(movl %arg_z,%temp1)  /* slow   */
     1835        __(je 9f)               /* Null list is proper   */
     18360:
     1837        __(extract_lisptag(%temp0,%imm0))
     1838        __(cmpb $tag_list,%imm0_b)
     1839        __(jne 8f)
     1840        __(compare_reg_to_nil(%temp0))
     1841        __(je 9f)
     1842        __(_cdr(%temp0,%arg_y)) /* (null (cdr fast)) ?   */
     1843        __(compare_reg_to_nil(%arg_y))
     1844        __(je 9f)
     1845        __(extract_lisptag(%arg_y,%imm0))
     1846        __(cmpb $tag_list,%imm0_b)
     1847        __(jne 8f)
     1848        __(_cdr(%arg_y,%temp0))
     1849        __(_cdr(%temp1,%temp1))
     1850        __(cmpl %temp1,%temp0)
     1851        __(jne 0b)
     1852
     18538:      __(add $node_size,%esp) /* discard pushed arg_y */
     1854        __(movl $XIMPROPERLIST,%arg_y)
     1855        __(set_nargs(2))
     1856        __(jmp _SPksignalerr)
     18579:      /* Whew           */
     1858
     1859        /* Next, determine the length of arg_y.  We   */
     1860        /* know that it's a proper list.   */
     1861        __(pop %arg_y)
     1862       
     1863        __(movl $-fixnumone,%imm0)
     1864        __(movl %arg_y,%temp0)
     18651:      __(compare_reg_to_nil(%temp0))
     1866        __(_cdr(%temp0,%temp0))
     1867        __(leal fixnumone(%imm0),%imm0)
     1868        __(jne 1b)
     1869       
     1870        /* imm0 is now (boxed) triplet count.  */
     1871        /* Determine word count, add 1 (to align), and make room.  */
     1872        /*  if count is 0, make an empty tsp frame and exit   */
     1873        __(testl %imm0,%imm0)
     1874        __(jne 2f)
     1875        __(TSP_Alloc_Fixed(2*node_size,%imm0))
     1876        __(ret)
     18772:      __(movl %imm0,%temp1)
     1878        __(add %imm0,%imm0)
     1879        __(add %temp1,%imm0)
     1880        __(dnode_align(%imm0,tsp_frame.fixed_overhead+node_size,%imm0))
     1881        __(TSP_Alloc_Var(%imm0,%temp0))
     1882        __(movl %imm0,(%temp0))
     1883        __(movd %rcontext:tcr.db_link,%mm0)
     18843:      __(movl $unbound_marker,%temp0)
     1885        __(compare_reg_to_nil(%arg_z))
     1886        __(cmovnel cons.car(%arg_z),%temp0)
     1887        __(cmovnel cons.cdr(%arg_z),%arg_z)
     1888        __(_car(%arg_y,%temp1))
     1889        __(_cdr(%arg_y,%arg_y))
     1890        __(movl symbol.binding_index(%temp1),%temp1)
     1891        __(cmp %rcontext:tcr.tlb_limit,%temp1)
     1892        __(jb,pt 4f)
     1893        __(push %temp1)
     1894        __(tlb_too_small())
     18954:      __(push %arg_z)
     1896        __(movl %rcontext:tcr.tlb_pointer,%arg_z)
     1897        __(subl $binding.size,%imm0)
     1898        __(movl %temp1,binding.sym(%imm0))
     1899        __(push (%arg_z,%temp1))
     1900        __(pop binding.val(%imm0))
     1901        __(movl %temp0,(%arg_z,%temp1))
     1902        __(pop %arg_z)
     1903        __(movd %mm0,binding.link(%imm0))
     1904        __(movd %imm0,%mm0)
     1905        __(compare_reg_to_nil(%arg_y))
     1906        __(jne 3b)
     1907        __(movd %mm0,%rcontext:tcr.db_link)
     1908        __(ret)
    17351909_endsubp(progvsave)
    17361910
     
    24722646
    24732647_spentry(makestackblock0)
    2474         __(int $3)
     2648        __(unbox_fixnum(%arg_z,%imm0))
     2649        __(dnode_align(%imm0,tsp_frame.fixed_overhead+macptr.size,%imm0))
     2650        __(cmpl $tstack_alloc_limit,%imm0)
     2651        __(jae 9f)
     2652        __(movl %rcontext:tcr.foreign_sp,%temp0)
     2653        __(subl %imm0,%rcontext:tcr.foreign_sp)
     2654        __(movl %rcontext:tcr.foreign_sp,%arg_z)
     2655        __(movl %temp0,(%arg_z))
     2656        __(lea macptr.size+tsp_frame.fixed_overhead(%arg_z),%imm0)
     2657        __(movl $macptr_header,tsp_frame.fixed_overhead(%arg_z))
     2658        __(addl $fulltag_misc+tsp_frame.fixed_overhead,%arg_z)
     2659        __(movl %imm0,macptr.address(%arg_z))
     2660        __(movss %fpzero,macptr.domain(%arg_z))
     2661        __(movss %fpzero,macptr.type(%arg_z))
     2662        __(jmp 2f)
     26631:      __(movsd %fpzero,(%imm0))
     2664        __(addl $dnode_size,%imm0)
     26652:      __(cmpl %imm0,%temp0)
     2666        __(jne 1b)
     2667        __(repret)
     26689:      __(movd %rcontext:tcr.foreign_sp,%mm0)
     2669        __(subl $dnode_size,%rcontext:tcr.foreign_sp)
     2670        __(movl %rcontext:tcr.foreign_sp,%imm0)
     2671        __(movd %mm0,(%imm0))
     2672        __(set_nargs(1))
     2673        __(movl $nrs.new_gcable_ptr,%fname)
     2674        __(jump_fname())
    24752675_endsubp(makestackblock0)
    24762676
     
    29643164
    29653165_spentry(unbind_n)
     3166        __(push %temp1)         /* preserve temp1/nargs */
     3167        __(push %arg_z)
    29663168        __(xorl %arg_z,%arg_z)
    29673169        __(movl %rcontext:tcr.db_link,%temp1)
     
    29753177        __(jne 1b)
    29763178        __(movl %temp1,%rcontext:tcr.db_link)
     3179        __(pop %arg_z)
     3180        __(pop %temp1)
    29773181        __(ret)
    29783182_endsubp(unbind_n)
    29793183
    29803184_spentry(unbind_to)
     3185        __(push %arg_y)
     3186        __(push %arg_z)
     3187        __(push %temp0)
     3188        __(push %temp1)
     3189       
    29813190        __(movl %rcontext:tcr.db_link,%temp0)
    29823191        __(movl %rcontext:tcr.tlb_pointer,%arg_z)
     
    29893198        __(jne 1b)
    29903199        __(movl %temp0,%rcontext:tcr.db_link)
     3200
     3201        __(pop %temp1)
     3202        __(pop %temp0)
     3203        __(pop %arg_z)
     3204        __(pop %arg_y)
    29913205        __(ret)
    29923206_endsubp(unbind_to)
     
    30533267
    30543268_spentry(progvrestore)
    3055         __(int $3)
     3269        __(movl %rcontext:tcr.save_tsp,%imm0)
     3270        __(movl tsp_frame.backlink(%imm0),%imm0) /* ignore .SPnthrowXXX values frame   */
     3271        __(movl tsp_frame.data_offset(%imm0),%imm0)
     3272        __(shrl $fixnumshift,%imm0)
     3273        __(jne _SPunbind_n)
     3274        __(repret)
    30563275_endsubp(progvrestore)
    30573276
Note: See TracChangeset for help on using the changeset viewer.