Changeset 8899


Ignore:
Timestamp:
Mar 27, 2008, 12:21:12 AM (11 years ago)
Author:
rme
Message:

.SPsyscall/.SPsyscall2: when restoring the lisp %temp0, use pop (not push)

.SPstack_cons_rest_arg, .SPtcallsymgen: implement

.SPmvslide: save %nargs in %mm0 (%nargs and %temp1 are the same register now)

File:
1 edited

Legend:

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

    r8856 r8899  
    10551055        __(pop %temp1)
    10561056        __(check_pending_interrupt(%temp0))
    1057         __(push %temp0)
     1057        __(pop %temp0)
    10581058        __(leave)
    10591059        __(ret)
     
    11021102        __(pop %temp1)
    11031103        __(check_pending_interrupt(%temp0))
    1104         __(push %temp0)
     1104        __(pop %temp0)
    11051105        __(leave)
    11061106        __(ret)
     
    19711971
    19721972_spentry(stack_cons_rest_arg)
     1973        __(movd %nargs,%mm2)
     1974        __(movl %temp0,%rcontext:tcr.save0)
     1975        __(subl %imm0,%temp1)
     1976        __(movl $nil_value,%arg_z)
     1977        __(je 2f)       /* empty list; make an empty TSP frame */
     1978        __(addl %temp1,%temp1)
     1979        __(cmpl $(tstack_alloc_limit-dnode_size),%temp1)
     1980        __(je 3f)       /* make empty frame, then heap-cons */
     1981        __(dnode_align(%temp1,tsp_frame.fixed_overhead,%imm0))
     1982        __(TSP_Alloc_Var(%imm0,%temp0))
     1983        __(addl $fulltag_cons,%temp0)
     19841:      __(pop %arg_y)
     1985        __(_rplacd(%temp0,%arg_z))
     1986        __(_rplaca(%temp0,%arg_y))
     1987        __(movl %temp0,%arg_z)
     1988        __(addl $cons.size,%temp0)
     1989        __(subl $dnode_size,%temp1)
     1990        __(jne 1b)
     1991        __(push %arg_z)
     1992        __(movd %mm2,%nargs)
     1993        __(movl %rcontext:tcr.save0,%temp0)
     1994        __(movss %fpzero,%rcontext:tcr.save0)
     1995        __(jmp *%temp0)
     1996/* Length 0, make empty frame */
     19972:
     1998        __(TSP_Alloc_Fixed(0,%temp0))
     1999        __(push %arg_z)
     2000        __(movd %mm2,%nargs)
     2001        __(movl %rcontext:tcr.save0,%temp0)
     2002        __(movss %fpzero,%rcontext:tcr.save0)
     2003        __(jmp *%temp0)
     2004/* Too big to stack-cons, but make an empty frame before heap-consing */
     2005        __(TSP_Alloc_Fixed(0,%temp0))
     2006        __(movd %mm2,%nargs)
     2007        __(movl %rcontext:tcr.save0,%temp0)
     2008        __(movss %fpzero,%rcontext:tcr.save0)
     2009        __(jmp _SPheap_cons_rest_arg)
    19732010_endsubp(stack_cons_rest_arg)
    19742011
     
    19842021/* everything's been spread, we discard the reserved frame (regardless of
    19852022/* who pushed it) if all args fit in registers.   */
     2023
     2024/* xxx preserve temp1 somehow? cf. comment in x862-invoke-fn */
    19862025_spentry(spreadargz)
    19872026        __(test %nargs,%nargs)
     
    20722111
    20732112_spentry(tcallsymgen)
    2074         __(int $3)
     2113        __(cmpl $nargregs*node_size,%nargs)
     2114        __(jbe 9f)
     2115        __(lea -nargregs*node_size(%esp,%nargs),%imm0)
     2116        __(movd %nargs,%mm0)
     2117        __(movl %temp0,%rcontext:tcr.save0)
     2118        __(xorl %temp1,%temp1)  /* aka nargs */
     21190:      __(movl -node_size(%imm0),%temp0)
     2120        __(movl %temp0,-node_size(%ebp,%temp1))
     2121        __(subl $node_size,%imm0)
     2122        __(subl $node_size,%temp1)
     2123        __(cmpl %imm0,%esp)
     2124        __(jne 0b)
     2125        __(lea (%ebp,%temp1),%esp)
     2126        __(movl 4(%ebp),%temp0)
     2127        __(movl (%ebp),%ebp)
     2128        __(push %temp0)
     2129        __(movl %rcontext:tcr.save0,%temp0)
     2130        __(movss %fpzero,%rcontext:tcr.save0)
     2131        __(movd %mm0,%nargs)
     2132        __(jump_fname())
     2133/* All args in regs; exactly the same as the tcallsymvsp case. */
     21349:
     2135        __(leave)
     2136        __(jump_fname())
    20752137_endsubp(tcallsymgen)
    20762138
     
    22682330/* the difference between the current stack pointer and the target. */
    22692331_spentry(mvslide)
    2270         __(movl %nargs,%temp1)
     2332        __(movd %nargs,%mm0)
    22712333        __(lea (%esp,%nargs),%arg_y)
    22722334        __(lea (%arg_y,%imm0),%imm0)
    2273         __(test %temp1,%temp1)
     2335        __(test %nargs,%nargs)
    22742336        __(je 2f)
    227523371:
     
    22782340        __(subl $node_size,%imm0)
    22792341        __(movl %arg_z,(%imm0))
    2280         __(subl $node_size,%temp1)
     2342        __(subl $node_size,%nargs)
    22812343        __(jne 1b)
    228223442:      __(movl %imm0,%esp)
     2345        __(movd %mm0,%nargs)
    22832346        __(jmp *%ra0)
    22842347_endsubp(mvslide)
Note: See TracChangeset for help on using the changeset viewer.