Changeset 13694
- Timestamp:
- May 11, 2010, 2:33:29 AM (15 years ago)
- File:
-
- 1 edited
-
branches/arm/lisp-kernel/arm-spentry.s (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/arm/lisp-kernel/arm-spentry.s
r13687 r13694 2169 2169 __(extract_lowbyte(imm1,imm1)) 2170 2170 __(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. */ 2195 8: 2196 __(cmp imm0,#4<<fixnumshift) 2197 __(sub imm0,imm0,#fixnumone) 2198 __(ldr arg_z,[imm1,#-node_size]!) 2199 __(vpush1(arg_z)) 2200 9: 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 */ 2209 2: 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 */ 2219 1: 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) 2248 1: 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 2262 2257 dnl /* Build a new TSP area to hold nargs worth of multiple-values. */ 2263 2258 dnl /* Pop the multiple values off of the vstack. */ … … 2416 2411 2417 2412 2418 2419 2420 2421 2422 2423 2424 2425 2413 /* Enter the debugger */ 2426 2414 _spentry(breakpoint) … … 2529 2517 __(b _SPgvset) 2530 2518 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)2547 2519 2548 2520
Note:
See TracChangeset
for help on using the changeset viewer.
