Changeset 13694


Ignore:
Timestamp:
May 11, 2010, 9:33:29 AM (9 years ago)
Author:
gb
Message:

A little more low-hanging fruit.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/arm/lisp-kernel/arm-spentry.s

    r13687 r13694  
    21692169        __(extract_lowbyte(imm1,imm1))
    21702170        __(b C(misc_set_common))
    2171 dnl         
    2172 dnl /* "spread" the lexpr in arg_z.  */
    2173 dnl /* ppc2-invoke-fn assumes that temp1 is preserved here.  */
    2174 dnl _spentry(spread_lexprz)
    2175 dnl  __(ldr imm0,[arg_z,#0])
    2176 dnl  __(cmpri(cr3,imm0,3<<fixnumshift))
    2177 dnl  __(cmpri(cr4,imm0,2<<fixnumshift))
    2178 dnl  __(add imm1,arg_z,imm0)
    2179 dnl  __(cmpri(imm0,0))
    2180 dnl  __(add nargs,nargs,imm0)
    2181 dnl  __(cmpri(cr1,nargs,0))
    2182 dnl  __(cmpri(cr2,nargs,2<<fixnumshift))
    2183 dnl  __(la imm1,node_size(imm1))
    2184 dnl  __(bge cr3,9f)
    2185 dnl  __(beq cr4,2f)
    2186 dnl  __(bne 1f)
    2187 dnl  /* lexpr count was 0; vpop the arg regs that  */
    2188 dnl  /* were vpushed by the caller  */
    2189 dnl  __(beqlr cr1)
    2190 dnl  __(vpop(arg_z))
    2191 dnl  __(bltlr cr2)
    2192 dnl  __(vpop(arg_y))
    2193 dnl  __(beqlr cr2)
    2194 dnl  __(vpop(arg_x))
    2195 dnl  __(bx lr)
    2196 dnl
    2197 dnl  /* vpush args from the lexpr until we have only  */
    2198 dnl  /* three left, then assign them to arg_x, arg_y,  */
    2199 dnl  /* and arg_z.  */
    2200 dnl 8:
    2201 dnl  __(cmpri(cr3,imm0,4<<fixnumshift))
    2202 dnl  __(subi imm0,imm0,#fixnumone)
    2203 dnl  __(ldru(arg_z,-node_size(imm1)))
    2204 dnl  __(vpush1(arg_z))
    2205 dnl 9:
    2206 dnl  __(bne cr3,8b)
    2207 dnl  __(ldr arg_x,[imm1,#-node_size*1])
    2208 dnl  __(ldr arg_y,[imm1,#-node_size*2])
    2209 dnl  __(ldr arg_z,[imm1,#-node_size*3])
    2210 dnl  __(bx lr)
    2211 dnl
    2212 dnl  /* lexpr count is two: set arg_y, arg_z from the  */
    2213 dnl  /* lexpr, maybe vpop arg_x  */
    2214 dnl 2:
    2215 dnl  __(ldr arg_y,[imm1,#-node_size*1])
    2216 dnl  __(ldr arg_z,[imm1,#-node_size*2])
    2217 dnl  __(beqlr cr2)  /* return if (new) nargs = 2  */
    2218 dnl  __(vpop(arg_x))
    2219 dnl  __(bx lr)
    2220 dnl
    2221 dnl  /* lexpr count is one: set arg_z from the lexpr,  */
    2222 dnl  /* maybe vpop arg_y, arg_x  */
    2223 dnl 1:
    2224 dnl  __(ldr arg_z,[imm1,#-node_size])
    2225 dnl  __(bltlr cr2)  /* return if (new) nargs < 2  */
    2226 dnl  __(vpop(arg_y))
    2227 dnl  __(beqlr cr2)  /* return if (new) nargs = 2  */
    2228 dnl  __(vpop(arg_x))
    2229 dnl  __(bx lr)
    2230 dnl         
    2231 dnl   
    2232 dnl _spentry(reset)
    2233 dnl  .globl _SPthrow
    2234 dnl  __(nop)
    2235 dnl  __(ref_nrs_value(temp0,toplcatch))
    2236 dnl  __(mov temp1,#XSTKOVER)
    2237 dnl  __(vpush1(temp0))
    2238 dnl  __(vpush1(temp1))
    2239 dnl  __(set_nargs(1))
    2240 dnl  __(b _SPthrow)
    2241 dnl
    2242 dnl 
    2243 dnl /* "slide" nargs worth of values up the vstack.  IMM0 contains  */
    2244 dnl /* the difference between the current VSP and the target.  */
    2245 dnl _spentry(mvslide)
    2246 dnl  __(cmpri(nargs,0))
    2247 dnl  __(mov imm3,nargs)
    2248 dnl  __(add imm2,vsp,nargs)
    2249 dnl  __(add imm2,imm2,imm0)
    2250 dnl  __(add imm0,vsp,nargs)
    2251 dnl  __(beq 2f)
    2252 dnl 1:
    2253 dnl  __(cmpri(imm3,1<<fixnumshift))
    2254 dnl  __(subi imm3,imm3,1<<fixnumshift)
    2255 dnl  __(ldru(temp0,-node_size(imm0)))
    2256 dnl  __(stru(temp0,-node_size(imm2)))
    2257 dnl  __(bne 1b)
    2258 dnl 2:
    2259 dnl  __(mov vsp,imm2)
    2260 dnl  __(bx lr)
    2261 dnl
     2171
     2172/* "spread" the lexpr in arg_z.  */
     2173/* ppc2-invoke-fn assumes that temp1 is preserved here.  */
     2174_spentry(spread_lexprz)
     2175        __(ldr imm0,[arg_z,#0])
     2176        __(add imm1,arg_z,imm0)
     2177        __(add nargs,nargs,imm0)
     2178        __(add imm1,imm1,#node_size)
     2179        __(cmp imm0,#3<<fixnumshift)
     2180        __(bge 9f)
     2181        __(cmp imm0,#2<<fixnumshift)
     2182        __(beq 2f)
     2183        __(cmp imm0,#0)
     2184        __(bne 1f)
     2185/* lexpr count was 0; vpop the arg regs that  */
     2186/* were vpushed by the caller  */
     2187        __(cmp nargs,#0)
     2188        __(bxeq lr)
     2189        __(vpop_argregs_nz)
     2190        __(bx lr)
     2191
     2192/* vpush args from the lexpr until we have only  */
     2193/* three left, then assign them to arg_x, arg_y,  */
     2194/* and arg_z.  */
     21958:
     2196        __(cmp imm0,#4<<fixnumshift)
     2197        __(sub imm0,imm0,#fixnumone)
     2198        __(ldr arg_z,[imm1,#-node_size]!)
     2199        __(vpush1(arg_z))
     22009:
     2201        __(bne 8b)
     2202        __(ldr arg_x,[imm1,#-node_size*1])
     2203        __(ldr arg_y,[imm1,#-node_size*2])
     2204        __(ldr arg_z,[imm1,#-node_size*3])
     2205        __(bx lr)
     2206
     2207/* lexpr count is two: set arg_y, arg_z from the  */
     2208/* lexpr, maybe vpop arg_x  */
     22092:
     2210        __(cmp nargs,#2<<fixnumshift)
     2211        __(ldr arg_y,[imm1,#-node_size*1])
     2212        __(ldr arg_z,[imm1,#-node_size*2])
     2213        __(bxeq lr)  /* return if (new) nargs = 2  */
     2214        __(vpop1(arg_x))
     2215        __(bx lr)
     2216
     2217/* lexpr count is one: set arg_z from the lexpr,  */
     2218/* maybe vpop arg_y, arg_x  */
     22191:
     2220        __(cmp nargs,#2<<fixnumshift)
     2221        __(ldr arg_z,[imm1,#-node_size])
     2222        __(bxlt lr)  /* return if (new) nargs < 2  */
     2223        __(vpop1(arg_y))
     2224        __(bxeq lr)  /* return if (new) nargs = 2  */
     2225        __(vpop1(arg_x))
     2226        __(bx lr)
     2227
     2228
     2229_spentry(reset)
     2230        __(nop)
     2231        __(ref_nrs_value(temp0,toplcatch))
     2232        __(mov temp1,#XSTKOVER)
     2233        __(vpush1(temp0))
     2234        __(vpush1(temp1))
     2235        __(set_nargs(1))
     2236        __(b _SPthrow)
     2237
     2238
     2239/* "slide" nargs worth of values up the vstack.  IMM0 contains  */
     2240/* the difference between the current VSP and the target.  */
     2241_spentry(mvslide)
     2242        __(cmp nargs,#0)
     2243        __(mov temp1,nargs)
     2244        __(add imm1,vsp,nargs)
     2245        __(add imm1,imm1,imm0)
     2246        __(add imm0,vsp,nargs)
     2247        __(beq 2f)
     22481:
     2249        __(subs temp1,temp1,#1<<fixnumshift)
     2250        __(ldr temp0,[imm0,#-node_size]!)
     2251        __(str temp0,[imm1,#-node_size]!)
     2252        __(bne 1b)
     2253        2:
     2254        __(mov vsp,imm1)
     2255        __(bx lr)
     2256
    22622257dnl /* Build a new TSP area to hold nargs worth of multiple-values.  */
    22632258dnl /* Pop the multiple values off of the vstack.  */
     
    24162411
    24172412
    2418 
    2419 
    2420  
    2421                  
    2422 
    2423 
    2424 
    24252413/* Enter the debugger  */
    24262414_spentry(breakpoint)
     
    25292517        __(b _SPgvset)
    25302518
    2531 dnl /* Restore current thread's interrupt level to arg_z, */
    2532 dnl /* noting whether the tcr's interrupt_pending flag was set.  */
    2533 dnl _spentry(restoreintlevel)
    2534 dnl  __(cmpri(cr1,arg_z,0))
    2535 dnl  __(ldr imm0,[rcontext,#tcr.interrupt_pending])
    2536 dnl  __(cmpri(imm0,0))
    2537 dnl  __(bne cr1,1f)
    2538 dnl  __(beq 1f)
    2539 dnl  __(str(rzero,tcr.interrupt_pending(rcontext)))
    2540 dnl  __(mov nargs,#fixnum_one)
    2541 dnl  __(trgti(nargs,0))
    2542 dnl  __(bx lr)
    2543 dnl 1:
    2544 dnl         __(ldr nargs,[rcontext,#tcr.tlb_pointer])
    2545 dnl  __(str(arg_z,INTERRUPT_LEVEL_BINDING_INDEX(nargs)))
    2546 dnl  __(bx lr)
    25472519
    25482520       
Note: See TracChangeset for help on using the changeset viewer.