Changeset 9267


Ignore:
Timestamp:
Apr 24, 2008, 7:41:49 PM (11 years ago)
Author:
rme
Message:

.SPbind_self, .SPbind_self_boundp_check, .SPmvstackv, .SPtfuncallgen,
.SPunbind_n, .SPunbind_to: implement

Nasty kludge in .SPffcall to dump the x87 state to memory to see if there
is a value on the x87 stack, popping the x87 stack and putting the result
in xmm0 if so. The compiler should take care of popping the x87 stack if
needed, since it will know whether an ffcall returns an fp result. This
won't be hard to do, but a few x87 instructions need to be added to the
assembler first.

File:
1 edited

Legend:

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

    r9189 r9267  
    13881388
    13891389_spentry(bind_self)
    1390         __(int $3)
     1390        __(movl symbol.binding_index(%arg_z),%imm0)
     1391        __(cmpl %rcontext:tcr.tlb_limit,%imm0)
     1392        __(jb,pt 0f)
     1393        __(push %imm0)
     1394        __(tlb_too_small())
     13950:      __(test %imm0,%imm0)
     1396        __(jz 9f)
     1397        __(movl %rcontext:tcr.tlb_pointer,%temp1)
     1398        __(cmpb $no_thread_local_binding_marker,(%temp1,%imm0))
     1399        __(jz 2f)
     1400        __(push (%temp1,%imm0))
     1401        __(push %imm0)
     1402        __(push %rcontext:tcr.db_link)
     1403        __(movl %esp,%rcontext:tcr.db_link)
     1404        __(jmp *%ra0)
     14052:      __(movl symbol.vcell(%arg_z),%arg_y)
     1406        __(push (%temp1,%imm0))
     1407        __(push %imm0)
     1408        __(push %rcontext:tcr.db_link)
     1409        __(movl %arg_y,(%temp1,%imm0))
     1410        __(movl %esp,%rcontext:tcr.db_link)
     1411        __(jmp *%ra0)
     14129:      __(movl $XSYMNOBIND,%arg_y)
     1413        __(set_nargs(2))
     1414        __(push %ra0)
     1415        __(jmp _SPksignalerr)
    13911416_endsubp(bind_self)
    13921417
     
    14131438
    14141439_spentry(bind_self_boundp_check)
    1415         __(int $3)
     1440        __(movl symbol.binding_index(%arg_z),%imm0)
     1441        __(cmpl %rcontext:tcr.tlb_limit,%imm0)
     1442        __(jb,pt 0f)
     1443        __(push %imm0)
     1444        __(tlb_too_small())
     14450:      __(test %imm0,%imm0)
     1446        __(jz 9f)
     1447        __(movl %rcontext:tcr.tlb_pointer,%temp1)
     1448        __(cmpb $no_thread_local_binding_marker,(%temp1,%imm0))
     1449        __(je 2f)
     1450        __(cmpb $unbound_marker,(%temp1,%imm0))
     1451        __(je 8f)
     1452        __(push (%temp1,%imm0))
     1453        __(push %imm0)
     1454        __(push %rcontext:tcr.db_link)
     1455        __(movl %esp,%rcontext:tcr.db_link)
     1456        __(jmp *%ra0)
     14572:      __(movl symbol.vcell(%arg_z),%arg_y)
     1458        __(cmpl $unbound_marker,%arg_y)
     1459        __(jz 8f)
     1460        __(push (%temp1,%imm0))
     1461        __(push %imm0)
     1462        __(push %rcontext:tcr.db_link)
     1463        __(movl %esp,%rcontext:tcr.db_link)
     1464        __(movl %arg_y,(%temp1,%imm0))
     1465        __(jmp *%ra0)
     14668:      __(push %ra0)
     1467        __(uuo_error_reg_unbound(Rarg_z))
     1468       
     14699:      __(movl $XSYMNOBIND,%arg_y)
     1470        __(set_nargs(2))
     1471        __(push %ra0)
     1472        __(jmp _SPksignalerr)
    14161473_endsubp(bind_self_boundp_check)
    14171474
     
    14741531_spentry(stkconslist_star)
    14751532        __(int $3)
     1533        __(nop)
    14761534_endsubp(stkconslist_star)
    14771535
     
    14811539
    14821540_spentry(mkstackv)
    1483         __(int $3)
     1541        __(dnode_align(%nargs,tsp_frame.fixed_overhead+node_size,%imm0))
     1542        __(TSP_Alloc_Var(%imm0,%arg_y))
     1543        __(movl %nargs,%imm0)
     1544        __(shll $(num_subtag_bits-fixnumshift),%imm0)
     1545        __(movb $subtag_simple_vector,%imm0_b)
     1546        __(movl %imm0,(%arg_y))
     1547        __(leal fulltag_misc(%arg_y),%arg_z)
     1548        __(test %nargs,%nargs)
     1549        __(leal misc_data_offset(%arg_z,%nargs),%imm0)
     1550        __(jmp 2f)
     15511:      __(pop -node_size(%imm0))
     1552        __(subl $node_size,%nargs)
     1553        __(leal -node_size(%imm0),%imm0)
     15542:      __(jne 1b)
     1555        __(jmp *%ra0)   
    14841556_endsubp(mkstackv)
    14851557
     
    22232295/* relative to it and restore %rbp/%ra0   */
    22242296_spentry(tfuncallgen)
    2225         __(int $3)
     2297        __(cmpl $nargregs*node_size,%nargs)
     2298        __(jbe 9f)
     2299        __(lea -nargregs*node_size(%esp,%nargs),%imm0)
     2300        __(movl %temp0,%rcontext:tcr.save0)
     2301        __(movd %nargs,%mm0)
     2302        __(xorl %temp1,%temp1)
     2303        /* We can use %ra0 as a temporary here, since the real return address */
     2304        /* is on the stack   */
     23050:      __(movl -node_size(%imm0),%ra0)
     2306        __(movl %ra0,-node_size(%ebp,%temp1))
     2307        __(subl $node_size,%imm0)
     2308        __(subl $node_size,%temp1)
     2309        __(cmpl %imm0,%esp)
     2310        __(jne 0b)
     2311        __(lea (%ebp,%temp1),%esp)
     2312        __(movl 4(%ebp),%ra0)
     2313        __(movl (%ebp),%ebp)
     2314        __(pushl %ra0)
     2315        __(movd %mm0,%nargs)
     2316        __(movl %rcontext:tcr.save0,%temp0)
     2317        __(movss %fpzero,%rcontext:tcr.save0)
     2318        __(do_funcall())
     2319        /* All args in regs; exactly the same as the tfuncallvsp case   */
     23209:             
     2321        __(leave)
     2322        __(do_funcall())
     2323
    22262324_endsubp(tfuncallgen)
    22272325
     
    28662964
    28672965_spentry(unbind_n)
    2868         __(int $3)
     2966        __(xorl %arg_z,%arg_z)
     2967        __(movl %rcontext:tcr.db_link,%temp1)
     2968        __(movl %rcontext:tcr.tlb_pointer,%arg_z)
     29691:             
     2970        __(movl binding.sym(%temp1),%temp0)
     2971        __(movl binding.val(%temp1),%arg_y)
     2972        __(movl binding.link(%temp1),%temp1)
     2973        __(movl %arg_y,(%arg_z,%temp0))
     2974        __(decl %imm0)
     2975        __(jne 1b)
     2976        __(movl %temp1,%rcontext:tcr.db_link)
     2977        __(ret)
    28692978_endsubp(unbind_n)
    28702979
     
    33653474LocalLabelPrefix[]ffcall_call:
    33663475        __(call *%eax)
     3476        /* This kludge pops st(0) and puts it into xmm0. */
     3477        /* It will probably be better to do this in the ffcall */
     3478        /* operator in the compiler, since it will know what the */
     3479        /* result type should be. */
     3480        __(subl $28,%esp)
     3481        __(fnstenv (%esp))
     3482        __(movzwl 8(%esp),%ebx)
     3483        __(addl $28,%esp)
     3484        __(testb $3,%bl)
     3485        __(jne 1f)
     3486        __(subl $8,%esp)
     3487        __(fstpl (%esp))
     3488        __(movsd (%esp),%xmm0)
     3489        __(addl $8,%esp)
     34901:             
    33673491LocalLabelPrefix[]ffcall_call_end:
    33683492        __(movl %ebp,%esp)
     
    34023526/* and (b) we push something (e.g., more than 2 args in the lexpr) */
    34033527_spentry(spread_lexprz)
    3404         __(int $3)
    34053528        new_local_labels()
    34063529        __(movl (%arg_z),%imm0) /* lexpr count */
Note: See TracChangeset for help on using the changeset viewer.