Changeset 13679
- Timestamp:
- Apr 28, 2010, 3:31:40 AM (15 years ago)
- Location:
- branches/arm/lisp-kernel
- Files:
-
- 5 edited
-
arm-constants.s (modified) (1 diff)
-
arm-macros.s (modified) (10 diffs)
-
arm-spentry.s (modified) (67 diffs)
-
arm-uuo.s (modified) (3 diffs)
-
ppc-macros.s (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
branches/arm/lisp-kernel/arm-constants.s
r13671 r13679 733 733 _node(get_tcr) /* address of get_tcr() */ 734 734 _ends 735 736 735 736 /* extended type codes, for UUOs. Shouldn't conflict with defined subtags */ 737 738 xtype_unsigned_byte_24 = 252 739 xtype_array2d = 248 740 xtype_array3d = 244 741 xtype_integer = 4 742 xtype_s64 = 8 743 xtype_u64 = 12 744 xtype_s32 = 16 745 xtype_u32 = 20 746 xtype_s16 = 24 747 xtype_u16 = 28 748 xtype_s8 = 32 749 xtype_u8 = 36 750 xtype_bit = 40 751 752 753 737 754 INTERRUPT_LEVEL_BINDING_INDEX = fixnumone -
branches/arm/lisp-kernel/arm-macros.s
r13671 r13679 20 20 /* dnode_align(dest,src,delta) */ 21 21 define(`dnode_align',` 22 __(add $1, [$2,#(dnode_size-1)])22 __(add $1,$2,#$3+(dnode_size-1)) 23 23 __(bic $1,$1,#((1<<dnode_align_bits)-1)) 24 24 ') … … 80 80 ') 81 81 82 define(`unbox_character',` 83 __(mov $1,$2, lsr #charcode_shift) 84 ') 85 82 86 define(`loaddf',` 83 87 __(lfd $1,dfloat.value($2))') … … 135 139 136 140 define(`getvheader',` 137 __(ldr ($1,vector.header($2)))141 __(ldr $1,[$2,#vector.header]) 138 142 ') 139 143 … … 154 158 155 159 define(`ref_global',` 156 __(mov $1,#nil_value)157 __(ldr $1,[ $1,#lisp_globals.$2])160 __(mov ifelse($3,$3,$1),#nil_value) 161 __(ldr $1,[ifelse($3,$3,$1),#lisp_globals.$2]) 158 162 ') 159 163 … … 163 167 __(ldr $1,[$1,#((nrs.$2)+(symbol.vcell))]) 164 168 ') 169 170 /* This approach may not work if the symbol is too far from nil */ 171 define(`ref_nrs_symbol',` 172 __(mov $1,#nil_value) 173 __(add $1,$1,#nrs.$2) 174 ') 165 175 166 176 define(`set_nrs_value',` … … 253 263 ') 254 264 265 define(`trap_unless_fixnum',` 266 __(test_fixnum($1)) 267 __(uuo_error_reg_not_lisptag(ne,$1,tag_fixnum)) 268 ') 269 255 270 define(`trap_unless_fulltag_equal',` 256 271 __(extract_fulltag($3,$1)) 257 __(trnei($3,$2)) 272 __(cmp $3,#$2) 273 __(uuo_error_reg_not_fulltag(ne,$1,$2)) 258 274 ') 259 275 260 276 define(`trap_unless_typecode_equal',` 261 277 __(extract_typecode($3,$1)) 262 __(trnei($3,$2)) 278 __(cmp $3,#$2) 279 __(uuo_error_reg_not_xtype(ne,$2)) 263 280 ') 264 281 … … 366 383 367 384 /* $1 = dest reg */ 368 /* $2 = header. (For now, assume that this always encodes length ; */ 369 /* that may change with "large vector" support.) */ 385 /* $2 = header. 370 386 /* $3 = register containing size in bytes. (We're going to subtract */ 371 387 /* fulltag_misc from this; do it in the macro body, rather than force the … … 374 390 375 391 define(`Misc_Alloc',` 376 __( la $3,-fulltag_misc($3))392 __(sub $3,$3,#fulltag_misc) 377 393 __(sub allocptr,allocptr,$3) 378 __(alloc_trap()) 379 __(str($2,misc_header_offset(allocptr))) 380 __(mr $1,allocptr) 394 __(ldr allocbase,[rcontext,#tcr.save_allocbase]) 395 __(cmp allocptr,allocbase) 396 __(uuo_alloc_trap(lo)) 397 __(str $2,[allocptr,#misc_header_offset]) 398 __(mov $1,allocptr) 381 399 __(clear_alloc_tag()) 382 400 ') … … 501 519 ') 502 520 521 define(`check_enabled_pending_interrupt',` 522 __(ldr $1,[rcontext,#tcr.interrupt_pending]) 523 __(cmp $1,0) 524 __(uuo_interrupt_now(gt)) 525 ') 526 503 527 define(`check_pending_interrupt',` 504 528 new_macro_labels() 505 __(ldr(nargs,tcr.tlb_pointer(rcontext))) 506 __(ldr(nargs,INTERRUPT_LEVEL_BINDING_INDEX(nargs))) 507 __(cmpri(ifelse($1,`',`cr0',$1),nargs,0)) 508 __(blt ifelse($1,`',`cr0',$1),macro_label(done)) 509 __(bgt ifelse($1,`',`cr0',$1),macro_label(trap)) 510 __(ldr(nargs,tcr.interrupt_pending(rcontext))) 511 macro_label(trap): 512 __(trgti(nargs,0)) 529 __(ldr $1,tcr.tlb_pointer(rcontext)) 530 __(ldr $1,[$1,$INTERRUPT_LEVEL_BINDING_INDEX]) 531 __(cmp $1,#0) 532 __(bge macro_label(done)) 533 __(check_enabled_pending_interrupt($1)) 513 534 macro_label(done): 514 535 ') … … 520 541 __(uuo_suspend_now(al)) 521 542 ') 543 544 /* $3 points to a uvector header. Set $1 to the first dnode-aligned address */ 545 /* beyond the uvector, using imm regs $1 and $2 as temporaries. */ 546 define(`skip_stack_vector',` 547 new_macro_labels() 548 __(ldr $1,[$3]) 549 __(extract_fulltag($2,$1)) 550 __(cmp $2,#fulltag_immheader) 551 __(extract_lowbyte($2,$1)) 552 __(mov $1,$1 lsr #num_subtag_bits) 553 __(moveq $1,$1 lsl #2) 554 __(beq macro_label(bytes)) 555 __(cmp $2,#max_32_bit_ivector_subtag) 556 __(movle $1,$1 lsl #2) 557 __(ble macro_label(bytes)) 558 __(cmp $2,#max_8_bit_ivector_subtag) 559 __(ble macro_label(bytes)) 560 __(cmp $2,#max_16_bit_ivector_subtag) 561 __(movle $1,$1,lsl #1) 562 __(ble macro_label(bytes)) 563 __(cmp $2,subtag_double_float_vector) 564 __(moveq $1,$1,lsl #3) 565 __(addeq $1,$1,#4) 566 __(beq macro_label(bytes)) 567 __(add $1,$1,#7) 568 __(mov $1,$1,lsr #3) 569 macro_label(bytes): 570 __(add $1,$1,#node_size+(dnode_size-1)) 571 __(add $1,$1,$3) 572 ') -
branches/arm/lisp-kernel/arm-spentry.s
r13672 r13679 14 14 15 15 16 16 17 17 include(lisp.s) 18 18 _beginfile 19 .align 220 .arm21 .syntax unified22 19 .align 2 20 .arm 21 .syntax unified 22 23 23 local_label(start): 24 .set sporg,024 .set sporg,0 25 25 define(`_spentry',`ifdef(`__func_name',`_endfn',`') 26 .org sporg26 .org sporg 27 27 _exportfn(_SP$1) 28 .set sporg,sporg+25628 .set sporg,sporg+256 29 29 .line __line__ 30 30 ') 31 31 32 32 33 33 define(`_endsubp',` 34 34 _endfn(_SP$1) … … 37 37 38 38 39 40 39 40 41 41 define(`jump_builtin',` 42 42 ref_nrs_value(fname,builtin_functions) … … 45 45 jump_fname() 46 46 ') 47 47 48 48 _spentry(jmpsym) 49 49 __(jump_fname()) 50 50 51 51 _spentry(jmpnfn) 52 52 __(jump_nfn()) 53 53 54 54 /* Call nfn if it's either a symbol or function */ 55 55 _spentry(funcall) 56 56 __(funcall_nfn()) 57 57 58 58 /* Subprims for catch, throw, unwind_protect. */ 59 59 … … 62 62 __(mov imm2,#0) 63 63 __(mkcatch()) 64 __(bx lr)65 64 __(bx lr) 65 66 66 _spentry(mkunwind) 67 67 __(mov arg_z,#unbound_marker) … … 69 69 __(mkcatch()) 70 70 __(bx lr) 71 71 72 72 _spentry(mkcatchmv) 73 73 __(mov imm2,#fixnum_one) 74 74 __(mkcatch()) 75 __(bx lr)75 __(bx lr) 76 76 77 77 /* This never affects the symbol's vcell */ 78 78 /* Non-null symbol in arg_y, new value in arg_z */ 79 79 _spentry(bind) 80 __(ldr imm1,[arg_y,#symbol.binding_index])81 __(ldr imm0,[rcontext,#tcr.tlb_limit])82 __(cmp imm0,imm1)83 __(uuo_tlb_too_small(hs))84 __(cmp imm1,#0)85 __(ldr imm2,[rcontext,#tcr.tlb_pointer])86 __(ldr imm0,[rcontext,#tcr.db_link])87 __(ldr temp1,[imm2,imm0])88 __(beq 9f)89 __(vpush1(temp1))90 __(vpush1(imm1))91 __(vpush1(imm0))92 __(str arg_z,[imm2,imm1])93 __(str vsp,[rcontext,#tcr.db_link])94 __(bx lr)80 __(ldr imm1,[arg_y,#symbol.binding_index]) 81 __(ldr imm0,[rcontext,#tcr.tlb_limit]) 82 __(cmp imm0,imm1) 83 __(uuo_tlb_too_small(ls,imm1)) 84 __(cmp imm1,#0) 85 __(ldr imm2,[rcontext,#tcr.tlb_pointer]) 86 __(ldr imm0,[rcontext,#tcr.db_link]) 87 __(ldr temp1,[imm2,imm0]) 88 __(beq 9f) 89 __(vpush1(temp1)) 90 __(vpush1(imm1)) 91 __(vpush1(imm0)) 92 __(str arg_z,[imm2,imm1]) 93 __(str vsp,[rcontext,#tcr.db_link]) 94 __(bx lr) 95 95 9: 96 __(mov arg_z,arg_y)97 __(mov arg_y,#XSYMNOBIND)98 __(set_nargs(2))99 __(b _SPksignalerr)96 __(mov arg_z,arg_y) 97 __(mov arg_y,#XSYMNOBIND) 98 __(set_nargs(2)) 99 __(b _SPksignalerr) 100 100 101 101 _spentry(conslist) 102 102 __(mov arg_z,#nil_value) 103 __(cmp nargs,#0)104 __(b 2f) 103 __(cmp nargs,#0) 104 __(b 2f) 105 105 1: 106 __(vpop1(arg_y))106 __(vpop1(arg_y)) 107 107 __(Cons(arg_z,arg_z,arg_z)) 108 108 __(subs nargs,nargs,#fixnum_one) … … 110 110 __(bne 1b) 111 111 __(bx lr) 112 112 113 113 /* do list*: last arg in arg_z, all others vpushed, nargs set to #args vpushed. */ 114 114 /* Cons, one cons cell at at time. Maybe optimize this later. */ 115 115 116 116 _spentry(conslist_star) 117 __(cmp nargs,#0)118 __(b 2f) 117 __(cmp nargs,#0) 118 __(b 2f) 119 119 1: 120 120 __(vpop1(arg_y)) … … 124 124 __(bne 1b) 125 125 __(bx lr) 126 126 127 127 _spentry(makes32) 128 __(adds imm1,imm0,imm0)128 __(adds imm1,imm0,imm0) 129 129 __(addsvc arg_z,imm1,imm1) 130 130 __(bxvc lr) … … 136 136 /* Construct a lisp integer out of the 32-bit unsigned value in imm0 */ 137 137 138 138 139 139 _spentry(makeu32) 140 __(tst imm0,#0xe0000000)141 __(box_fixnum(arg_z,imm0))142 __(bxeq lr)143 __(tst imm0,#0x80000000)144 __(bne 2f)145 __(movc16(imm1,one_digit_bignum_header))146 __(Misc_Alloc_Fixed(arg_z,imm1,aligned_bignum_size(1)))140 __(tst imm0,#0xe0000000) 141 __(box_fixnum(arg_z,imm0)) 142 __(bxeq lr) 143 __(tst imm0,#0x80000000) 144 __(bne 2f) 145 __(movc16(imm1,one_digit_bignum_header)) 146 __(Misc_Alloc_Fixed(arg_z,imm1,aligned_bignum_size(1))) 147 147 __(str imm0,[arg_z,#misc_data_offset]) 148 148 __(bx lr) … … 153 153 __(bx lr) 154 154 155 156 /* arg_z has overflowed (by one bit) as the result of an addition or subtraction. */ 155 156 /* arg_z has overflowed (by one bit) as the result of an addition or 157 subtraction. */ 157 158 /* Make a bignum out of it. */ 158 159 159 160 _spentry(fix_overflow) 160 __(unbox_fixnum(imm0,arg_z))161 __(eor imm0,imm0,#0xc0000000)162 __(b _SPmakes32)161 __(unbox_fixnum(imm0,arg_z)) 162 __(eor imm0,imm0,#0xc0000000) 163 __(b _SPmakes32) 163 164 164 165 _spentry(builtin_plus) 165 __(test_two_fixnums(arg_y,arg_z,imm0))166 __(bne 1f)167 __(adds arg_z,arg_y,arg_z)168 __(bxvc lr)169 __(b _SPfix_overflow)166 __(test_two_fixnums(arg_y,arg_z,imm0)) 167 __(bne 1f) 168 __(adds arg_z,arg_y,arg_z) 169 __(bxvc lr) 170 __(b _SPfix_overflow) 170 171 1: 171 172 __(jump_builtin(_builtin_plus,2)) 172 173 173 174 _spentry(builtin_minus) 174 __(test_two_fixnums(arg_y,arg_z,imm0))175 __(bne 1f)176 __(subs arg_z,arg_y,arg_z)177 __(bxvc lr)178 __(b _SPfix_overflow)175 __(test_two_fixnums(arg_y,arg_z,imm0)) 176 __(bne 1f) 177 __(subs arg_z,arg_y,arg_z) 178 __(bxvc lr) 179 __(b _SPfix_overflow) 179 180 1: 180 181 __(jump_builtin(_builtin_minus,2)) … … 182 183 /* Construct a lisp integer out of the 64-bit unsigned value in */ 183 184 /* imm0 (low 32 bits) and imm1 (high 32 bits) */ 184 185 185 186 _spentry(makeu64) 186 __(cmp imm1,0)187 __(beq _SPmakeu32)188 __(blt 3f)189 __(movc16(imm2,two_digit_bignum_header))187 __(cmp imm1,0) 188 __(beq _SPmakeu32) 189 __(blt 3f) 190 __(movc16(imm2,two_digit_bignum_header)) 190 191 __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(2))) 191 192 __(str imm0,[arg_z,#misc_data_offset]) … … 193 194 __(bx lr) 194 195 3: 195 __(movc16(imm2,three_digit_bignum_header))196 __(movc16(imm2,three_digit_bignum_header)) 196 197 __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(3))) 197 198 __(str imm0,[arg_z,#misc_data_offset]) … … 202 203 /* imm0 (low 32 bits) and imm1 (high 32 bits). */ 203 204 _spentry(makes64) 204 __(cmp imm1,imm0,asr #31) /* is imm1 sign extension of imm0 ? */205 __(beq _SPmakes32) /* forget imm1 if so */205 __(cmp imm1,imm0,asr #31) /* is imm1 sign extension of imm0 ? */ 206 __(beq _SPmakes32) /* forget imm1 if so */ 206 207 __(movc16(imm2,two_digit_bignum_header)) 207 208 __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(2))) … … 209 210 __(str imm1,[arg_z,#misc_data_offset+4]) 210 211 __(bx lr) 211 212 212 213 _spentry(builtin_times) 213 __(test_two_fixnums(arg_y,arg_z,imm0))214 __(bne 1f)215 __(unbox_fixnum(imm2,arg_z))216 __(smull arg_z,imm1,imm2,arg_y)217 /* Now have a "64-bit fixnum" in imm1(high) and arg_z(low). If */218 /* imm1 is just a sign extension of arg_z, return arg_z */219 __(cmp imm1,arg_z,asr #(nbits_in_word-1))220 __(bxeq lr)221 /* Need to ashift the pair imm1:imm0 right fixnumshift bits */222 __(mov imm0,imm0,lsr #fixnumshift)223 __(and imm2,imm1,#fixnummask)224 __(orr imm0,imm0,imm2,lsl #(nbits_in_word-fixnumshift))225 __(unbox_fixnum(imm1,imm1))226 __(b _SPmakes64)227 228 1: __(jump_builtin(_builtin_times,2))214 __(test_two_fixnums(arg_y,arg_z,imm0)) 215 __(bne 1f) 216 __(unbox_fixnum(imm2,arg_z)) 217 __(smull arg_z,imm1,imm2,arg_y) 218 /* Now have a "64-bit fixnum" in imm1(high) and arg_z(low). If */ 219 /* imm1 is just a sign extension of arg_z, return arg_z */ 220 __(cmp imm1,arg_z,asr #(nbits_in_word-1)) 221 __(bxeq lr) 222 /* Need to ashift the pair imm1:imm0 right fixnumshift bits */ 223 __(mov imm0,imm0,lsr #fixnumshift) 224 __(and imm2,imm1,#fixnummask) 225 __(orr imm0,imm0,imm2,lsl #(nbits_in_word-fixnumshift)) 226 __(unbox_fixnum(imm1,imm1)) 227 __(b _SPmakes64) 228 229 1: __(jump_builtin(_builtin_times,2)) 229 230 230 231 _spentry(builtin_eq) 231 __(test_two_fixnums(arg_y,arg_z,imm0))232 __(bne 1f)233 __(cmp arg_y,arg_z)234 __(mov arg_z,#nil_value)235 __(addeq arg_z,arg_z,#t_offset)236 __(bx lr)232 __(test_two_fixnums(arg_y,arg_z,imm0)) 233 __(bne 1f) 234 __(cmp arg_y,arg_z) 235 __(mov arg_z,#nil_value) 236 __(addeq arg_z,arg_z,#t_offset) 237 __(bx lr) 237 238 1: 238 239 __(jump_builtin(_builtin_eq,2)) 239 240 240 241 _spentry(builtin_ne) 241 __(test_two_fixnums(arg_y,arg_z,imm0))242 __(bne 1f)243 __(cmp arg_y,arg_z)244 __(mov arg_z,#nil_value)245 __(addne arg_z,arg_z,#t_offset)242 __(test_two_fixnums(arg_y,arg_z,imm0)) 243 __(bne 1f) 244 __(cmp arg_y,arg_z) 245 __(mov arg_z,#nil_value) 246 __(addne arg_z,arg_z,#t_offset) 246 247 __(bx lr) 247 248 1: … … 249 250 250 251 _spentry(builtin_gt) 251 __(test_two_fixnums(arg_y,arg_z,imm0))252 __(bne 1f)253 __(cmp arg_y,arg_z)254 __(mov arg_z,#nil_value)255 __(addgt arg_z,arg_z,#t_offset)252 __(test_two_fixnums(arg_y,arg_z,imm0)) 253 __(bne 1f) 254 __(cmp arg_y,arg_z) 255 __(mov arg_z,#nil_value) 256 __(addgt arg_z,arg_z,#t_offset) 256 257 __(bx lr) 257 258 1: … … 259 260 260 261 _spentry(builtin_ge) 261 __(test_two_fixnums(arg_y,arg_z,imm0))262 __(bne 1f)263 __(cmp arg_y,arg_z)264 __(mov arg_z,#nil_value)265 __(addge arg_z,arg_z,#t_offset)262 __(test_two_fixnums(arg_y,arg_z,imm0)) 263 __(bne 1f) 264 __(cmp arg_y,arg_z) 265 __(mov arg_z,#nil_value) 266 __(addge arg_z,arg_z,#t_offset) 266 267 __(bx lr) 267 268 1: … … 269 270 270 271 _spentry(builtin_lt) 271 __(test_two_fixnums(arg_y,arg_z,imm0))272 __(bne 1f)273 __(cmp arg_y,arg_z)274 __(mov arg_z,#nil_value)275 __(addgt arg_z,arg_z,#t_offset)272 __(test_two_fixnums(arg_y,arg_z,imm0)) 273 __(bne 1f) 274 __(cmp arg_y,arg_z) 275 __(mov arg_z,#nil_value) 276 __(addgt arg_z,arg_z,#t_offset) 276 277 __(bx lr) 277 278 1: … … 279 280 280 281 _spentry(builtin_le) 281 __(test_two_fixnums(arg_y,arg_z,imm0))282 __(bne 1f)283 __(cmp arg_y,arg_z)284 __(mov arg_z,#nil_value)285 __(addle arg_z,arg_z,#t_offset)282 __(test_two_fixnums(arg_y,arg_z,imm0)) 283 __(bne 1f) 284 __(cmp arg_y,arg_z) 285 __(mov arg_z,#nil_value) 286 __(addle arg_z,arg_z,#t_offset) 286 287 __(bx lr) 287 288 1: … … 290 291 /* funcall nfn, returning multiple values if it does. */ 291 292 _spentry(mvpass) 292 __(subs imm0,nargs,#node_size*nargregs)293 __(movge imm0,#0)294 __(add imm0,vsp,imm0)293 __(subs imm0,nargs,#node_size*nargregs) 294 __(movge imm0,#0) 295 __(add imm0,vsp,imm0) 295 296 __(build_lisp_frame(temp1,imm0)) 296 __(adr lr,C(ret1valn))297 __(adr lr,C(ret1valn)) 297 298 __(mov fn,#0) 298 299 __(funcall_nfn()) … … 303 304 304 305 _exportfn(C(ret1valn)) 305 __(restore_lisp_frame(imm0))306 __(restore_lisp_frame(imm0)) 306 307 __(vpush1(arg_z)) 307 308 __(set_nargs(1)) … … 336 337 __(cmp nargs,#fixnum_one) /* sadly, a very common case */ 337 338 __(bne 4f) 338 __(ldr arg_z,[vsp,#0])339 __(mov vsp,imm0)340 __(vpush1(arg_z))341 __(bx lr)339 __(ldr arg_z,[vsp,#0]) 340 __(mov vsp,imm0) 341 __(vpush1(arg_z)) 342 __(bx lr) 342 343 4: 343 344 __(blt 6f) … … 353 354 __(bx lr) 354 355 355 356 356 357 /* Come here with saved context on top of stack. */ 357 358 _spentry(nvalret) 358 359 .globl C(nvalret) 359 C(nvalret): 360 C(nvalret): 360 361 __(ldr lr,[sp,#lisp_frame.savelr]) 361 362 __(ldr temp0,[sp,#lisp_frame.savevsp]) 362 363 __(ldr fn,[sp,#lisp_frame.savefn]) 363 364 __(discard_lisp_frame()) 364 __(b local_label(return_values)) 365 366 365 __(b local_label(return_values)) 366 367 367 dnl /* Caller has pushed tag and 0 or more values; nargs = nvalues. */ 368 368 dnl /* Otherwise, process unwind-protects and throw to indicated catch frame. */ 369 369 dnl 370 370 dnl _spentry(throw) 371 dnl __(ldr imm1,[rcontext, #tcr.catch_top])372 dnl __(mov imm0,#0) /* count intervening catch/unwind-protect frames. */373 dnl __(cmpri(cr0,imm1,0))374 dnl __(ldr temp0,[vsp,nargs])375 dnl __(beq- cr0,local_label(_throw_tag_not_found))371 dnl __(ldr imm1,[rcontext, #tcr.catch_top]) 372 dnl __(mov imm0,#0) /* count intervening catch/unwind-protect frames. */ 373 dnl __(cmpri(cr0,imm1,0)) 374 dnl __(ldr temp0,[vsp,nargs]) 375 dnl __(beq- cr0,local_label(_throw_tag_not_found)) 376 376 dnl local_label(_throw_loop): 377 dnl __(ldr temp1,[imm1,#catch_frame.catch_tag])378 dnl __(cmpr(cr0,temp0,temp1))379 dnl __(mov imm2,imm1)380 dnl __(ldr imm1,[imm1,#catch_frame.link])381 dnl __(cmpri(cr1,imm1,0))382 dnl __(beq cr0,local_label(_throw_found))383 dnl __(addi imm0,imm0,fixnum_one)384 dnl __(beq- cr1,local_label(_throw_tag_not_found))385 dnl __(b local_label(_throw_loop))377 dnl __(ldr temp1,[imm1,#catch_frame.catch_tag]) 378 dnl __(cmpr(cr0,temp0,temp1)) 379 dnl __(mov imm2,imm1) 380 dnl __(ldr imm1,[imm1,#catch_frame.link]) 381 dnl __(cmpri(cr1,imm1,0)) 382 dnl __(beq cr0,local_label(_throw_found)) 383 dnl __(addi imm0,imm0,fixnum_one) 384 dnl __(beq- cr1,local_label(_throw_tag_not_found)) 385 dnl __(b local_label(_throw_loop)) 386 386 dnl /* imm2: (tstack-consed) target catch frame, imm0: count of intervening */ 387 387 dnl /* frames. If target isn't a multiple-value receiver, discard extra values */ 388 388 dnl /* (less hair, maybe.) */ 389 389 dnl local_label(_throw_found): 390 dnl __(ldr imm1,[imm2,#catch_frame.mvflag])391 dnl __(cmpri(cr0,imm1,0))392 dnl __(cmpri(cr1,nargs,0))393 dnl __(mov fn,#0)394 dnl __(add imm1,vsp,nargs)395 dnl __(add imm1,[imm1,#-node_size])396 dnl __(bne cr0,local_label(_throw_all_values))397 dnl __(set_nargs(1))398 dnl __(beq cr1,local_label(_throw_default_1_val))399 dnl __(mov vsp,imm1)400 dnl __(b local_label(_throw_all_values))390 dnl __(ldr imm1,[imm2,#catch_frame.mvflag]) 391 dnl __(cmpri(cr0,imm1,0)) 392 dnl __(cmpri(cr1,nargs,0)) 393 dnl __(mov fn,#0) 394 dnl __(add imm1,vsp,nargs) 395 dnl __(add imm1,[imm1,#-node_size]) 396 dnl __(bne cr0,local_label(_throw_all_values)) 397 dnl __(set_nargs(1)) 398 dnl __(beq cr1,local_label(_throw_default_1_val)) 399 dnl __(mov vsp,imm1) 400 dnl __(b local_label(_throw_all_values)) 401 401 dnl local_label(_throw_default_1_val): 402 dnl __(mov imm4,#nil_value)403 dnl __(vpush1(imm4))402 dnl __(mov imm4,#nil_value) 403 dnl __(vpush1(imm4)) 404 404 dnl local_label(_throw_all_values): 405 dnl __(bl _SPnthrowvalues)406 dnl __(ldr imm3,[rcontext,#tcr.catch_top])407 dnl __(ldr imm1,[rcontext,#tcr.db_link])408 dnl __(ldr imm0,[imm3,#catch_frame.db_link])409 dnl __(ldr imm4,[imm3,#catch_frame.mvflag])410 dnl __(cmpr(cr0,imm0,imm1))411 dnl __(cmpri(cr1,imm4,0))412 dnl __(add tsp,[imm3,#-((tsp_frame.fixed_overhead+fulltag_misc))])413 dnl __(beq cr0,local_label(_throw_dont_unbind))405 dnl __(bl _SPnthrowvalues) 406 dnl __(ldr imm3,[rcontext,#tcr.catch_top]) 407 dnl __(ldr imm1,[rcontext,#tcr.db_link]) 408 dnl __(ldr imm0,[imm3,#catch_frame.db_link]) 409 dnl __(ldr imm4,[imm3,#catch_frame.mvflag]) 410 dnl __(cmpr(cr0,imm0,imm1)) 411 dnl __(cmpri(cr1,imm4,0)) 412 dnl __(add tsp,[imm3,#-((tsp_frame.fixed_overhead+fulltag_misc))]) 413 dnl __(beq cr0,local_label(_throw_dont_unbind)) 414 414 dnl __(bl _SPunbind_to) 415 415 dnl local_label(_throw_dont_unbind): 416 dnl __(add imm0,vsp,nargs)417 dnl __(cmpri(cr0,nargs,0))418 dnl __(ldr imm1,[imm3,#catch_frame.csp])419 dnl __(ldr imm1,[imm1,#lisp_frame.savevsp])420 dnl __(bne cr1,local_label(_throw_multiple))416 dnl __(add imm0,vsp,nargs) 417 dnl __(cmpri(cr0,nargs,0)) 418 dnl __(ldr imm1,[imm3,#catch_frame.csp]) 419 dnl __(ldr imm1,[imm1,#lisp_frame.savevsp]) 420 dnl __(bne cr1,local_label(_throw_multiple)) 421 421 dnl /* Catcher expects single value in arg_z */ 422 dnl __(ldr arg_z,[imm0,#-node_size])423 dnl __(b local_label(_throw_pushed_values))422 dnl __(ldr arg_z,[imm0,#-node_size]) 423 dnl __(b local_label(_throw_pushed_values)) 424 424 dnl local_label(_throw_multiple): 425 dnl __(beq cr0,local_label(_throw_pushed_values))426 dnl __(mov imm2,nargs)425 dnl __(beq cr0,local_label(_throw_pushed_values)) 426 dnl __(mov imm2,nargs) 427 427 dnl local_label(_throw_mvloop): 428 dnl __(subi imm2,imm2,fixnum_one)429 dnl __(cmpri(imm2,0))430 dnl __(ldru(temp0,-node_size(imm0)))431 dnl __(push(temp0,imm1))432 dnl __(bgt local_label(_throw_mvloop))428 dnl __(subi imm2,imm2,fixnum_one) 429 dnl __(cmpri(imm2,0)) 430 dnl __(ldru(temp0,-node_size(imm0))) 431 dnl __(push(temp0,imm1)) 432 dnl __(bgt local_label(_throw_mvloop)) 433 433 dnl local_label(_throw_pushed_values): 434 dnl __(mov vsp,imm1)435 dnl __(ldr imm1,[imm3,#catch_frame.xframe])436 dnl __(str(imm1,tcr.xframe(rcontext)))437 dnl __(ldr sp,[imm3,#catch_frame.csp])438 dnl __(ldr fn,[sp,#lisp_frame.savefn])439 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr])440 dnl __(discard_lisp_frame())441 dnl __(mtlr loc_pc)434 dnl __(mov vsp,imm1) 435 dnl __(ldr imm1,[imm3,#catch_frame.xframe]) 436 dnl __(str(imm1,tcr.xframe(rcontext))) 437 dnl __(ldr sp,[imm3,#catch_frame.csp]) 438 dnl __(ldr fn,[sp,#lisp_frame.savefn]) 439 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 440 dnl __(discard_lisp_frame()) 441 dnl __(mtlr loc_pc) 442 442 dnl __(restore_catch_nvrs(imm3)) 443 dnl __(ldr imm3,[imm3,#catch_frame.link])444 dnl __(str(imm3,tcr.catch_top(rcontext)))445 dnl __(unlink(tsp))446 dnl __(bx lr)443 dnl __(ldr imm3,[imm3,#catch_frame.link]) 444 dnl __(str(imm3,tcr.catch_top(rcontext))) 445 dnl __(unlink(tsp)) 446 dnl __(bx lr) 447 447 dnl local_label(_throw_tag_not_found): 448 dnl __(uuo_interr(error_throw_tag_missing,temp0))449 dnl __(strux(temp0,vsp,nargs))450 dnl __(b _SPthrow)448 dnl __(uuo_interr(error_throw_tag_missing,temp0)) 449 dnl __(strux(temp0,vsp,nargs)) 450 dnl __(b _SPthrow) 451 451 dnl 452 452 dnl … … 454 454 dnl _spentry(nthrowvalues) 455 455 dnl __(mov imm1,#1) 456 dnl __(mov imm4,imm0)456 dnl __(mov imm4,imm0) 457 457 dnl __(str(imm1,tcr.unwinding(rcontext))) 458 458 dnl local_label(_nthrowv_nextframe): 459 dnl __(subi imm4,imm4,fixnum_one)460 dnl __(cmpri(cr1,imm4,0))461 dnl __(ldr temp0,[rcontext,#tcr.catch_top])462 dnl __(ldr imm1,[rcontext,#tcr.db_link])463 dnl __(blt cr1,local_label(_nthrowv_done))464 dnl __(ldr imm0,[temp0,#catch_frame.db_link])465 dnl __(ldr imm3,[temp0,#catch_frame.link])466 dnl __(cmpr(cr0,imm0,imm1))467 dnl __(str(imm3,tcr.catch_top(rcontext)))468 dnl __(ldr temp1,[temp0,#catch_frame.catch_tag])469 dnl __(cmpri(cr7,temp1,unbound_marker))/* unwind-protect ? */470 dnl __(ldr first_nvr,[temp0,#catch_frame.xframe])471 dnl __(str(first_nvr,tcr.xframe(rcontext)))472 dnl __(ldr sp,[temp0,#catch_frame.csp])473 dnl __(beq cr0,local_label(_nthrowv_dont_unbind))474 dnl __(mflr loc_pc)459 dnl __(subi imm4,imm4,fixnum_one) 460 dnl __(cmpri(cr1,imm4,0)) 461 dnl __(ldr temp0,[rcontext,#tcr.catch_top]) 462 dnl __(ldr imm1,[rcontext,#tcr.db_link]) 463 dnl __(blt cr1,local_label(_nthrowv_done)) 464 dnl __(ldr imm0,[temp0,#catch_frame.db_link]) 465 dnl __(ldr imm3,[temp0,#catch_frame.link]) 466 dnl __(cmpr(cr0,imm0,imm1)) 467 dnl __(str(imm3,tcr.catch_top(rcontext))) 468 dnl __(ldr temp1,[temp0,#catch_frame.catch_tag]) 469 dnl __(cmpri(cr7,temp1,unbound_marker)) /* unwind-protect ? */ 470 dnl __(ldr first_nvr,[temp0,#catch_frame.xframe]) 471 dnl __(str(first_nvr,tcr.xframe(rcontext))) 472 dnl __(ldr sp,[temp0,#catch_frame.csp]) 473 dnl __(beq cr0,local_label(_nthrowv_dont_unbind)) 474 dnl __(mflr loc_pc) 475 475 dnl __(bl _SPunbind_to) 476 dnl __(mtlr loc_pc)476 dnl __(mtlr loc_pc) 477 477 dnl local_label(_nthrowv_dont_unbind): 478 dnl __(beq cr7,local_label(_nthrowv_do_unwind))478 dnl __(beq cr7,local_label(_nthrowv_do_unwind)) 479 479 dnl /* A catch frame. If the last one, restore context from there. */ 480 dnl __(bne cr1,local_label(_nthrowv_skip))481 dnl __(ldr imm0,[sp,#lisp_frame.savevsp])482 dnl __(str(rzero,lisp_frame.savevsp(sp)))/* marker for stack overflow code */483 dnl __(add imm1,vsp,nargs)484 dnl __(mov imm2,nargs)485 dnl __(b local_label(_nthrowv_push_test))480 dnl __(bne cr1,local_label(_nthrowv_skip)) 481 dnl __(ldr imm0,[sp,#lisp_frame.savevsp]) 482 dnl __(str(rzero,lisp_frame.savevsp(sp))) /* marker for stack overflow code */ 483 dnl __(add imm1,vsp,nargs) 484 dnl __(mov imm2,nargs) 485 dnl __(b local_label(_nthrowv_push_test)) 486 486 dnl local_label(_nthrowv_push_loop): 487 dnl __(ldru(temp1,-node_size(imm1)))488 dnl __(push(temp1,imm0))487 dnl __(ldru(temp1,-node_size(imm1))) 488 dnl __(push(temp1,imm0)) 489 489 dnl local_label(_nthrowv_push_test): 490 dnl __(cmpri(imm2,0))491 dnl __(subi imm2,imm2,fixnum_one)492 dnl __(bne local_label(_nthrowv_push_loop))493 dnl __(mov vsp,imm0)490 dnl __(cmpri(imm2,0)) 491 dnl __(subi imm2,imm2,fixnum_one) 492 dnl __(bne local_label(_nthrowv_push_loop)) 493 dnl __(mov vsp,imm0) 494 494 dnl __(restore_catch_nvrs(temp0)) 495 495 dnl 496 496 dnl local_label(_nthrowv_skip): 497 dnl __(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0))498 dnl __(unlink(tsp))499 dnl __(discard_lisp_frame())500 dnl __(b local_label(_nthrowv_nextframe))497 dnl __(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0)) 498 dnl __(unlink(tsp)) 499 dnl __(discard_lisp_frame()) 500 dnl __(b local_label(_nthrowv_nextframe)) 501 501 dnl local_label(_nthrowv_do_unwind): 502 502 dnl /* This is harder. Call the cleanup code with the multiple */ 503 dnl /* values (and nargs, which is a fixnum.) Remember the throw count */503 dnl /* values (and nargs, which is a fixnum.) Remember the throw count */ 504 504 dnl /* (also a fixnum) as well. */ 505 505 dnl /* Save our caller's LR and FN in the csp frame created by the unwind- */ 506 506 dnl /* protect. (Clever, eh ?) */ 507 dnl __(ldr first_nvr,[temp0,#catch_frame.xframe])508 dnl __(str(first_nvr,tcr.xframe(rcontext)))507 dnl __(ldr first_nvr,[temp0,#catch_frame.xframe]) 508 dnl __(str(first_nvr,tcr.xframe(rcontext))) 509 509 dnl __(restore_catch_nvrs(temp0)) 510 dnl __(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0))511 dnl __(unlink(tsp))512 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr])513 dnl __(ldr nfn,[sp,#lisp_frame.savefn])514 dnl __(mtctr loc_pc)/* cleanup code address. */515 dnl __(str(fn,lisp_frame.savefn(sp)))516 dnl __(mflr loc_pc)517 dnl __(mov fn,nfn)518 dnl __(str(loc_pc,lisp_frame.savelr(sp)))519 dnl __(dnode_align(imm0,nargs,tsp_frame.fixed_overhead+(2*node_size))) /* tsp overhead, nargs, throw count */520 dnl __(TSP_Alloc_Var_Boxed_nz(imm0,imm1))521 dnl __(mov imm2,nargs)522 dnl __(add imm1,nargs,vsp)523 dnl __(la imm0,tsp_frame.data_offset(tsp))524 dnl __(str(nargs,0(imm0)))525 dnl __(b local_label(_nthrowv_tpushtest))510 dnl __(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0)) 511 dnl __(unlink(tsp)) 512 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 513 dnl __(ldr nfn,[sp,#lisp_frame.savefn]) 514 dnl __(mtctr loc_pc) /* cleanup code address. */ 515 dnl __(str(fn,lisp_frame.savefn(sp))) 516 dnl __(mflr loc_pc) 517 dnl __(mov fn,nfn) 518 dnl __(str(loc_pc,lisp_frame.savelr(sp))) 519 dnl __(dnode_align(imm0,nargs,tsp_frame.fixed_overhead+(2*node_size))) /* tsp overhead, nargs, throw count */ 520 dnl __(TSP_Alloc_Var_Boxed_nz(imm0,imm1)) 521 dnl __(mov imm2,nargs) 522 dnl __(add imm1,nargs,vsp) 523 dnl __(la imm0,tsp_frame.data_offset(tsp)) 524 dnl __(str(nargs,0(imm0))) 525 dnl __(b local_label(_nthrowv_tpushtest)) 526 526 dnl local_label(_nthrowv_tpushloop): 527 dnl __(ldru(temp0,-node_size(imm1)))528 dnl __(stru(temp0,node_size(imm0)))529 dnl __(subi imm2,imm2,fixnum_one)527 dnl __(ldru(temp0,-node_size(imm1))) 528 dnl __(stru(temp0,node_size(imm0))) 529 dnl __(subi imm2,imm2,fixnum_one) 530 530 dnl local_label(_nthrowv_tpushtest): 531 dnl __(cmpri(imm2,0))532 dnl __(bne local_label(_nthrowv_tpushloop))533 dnl __(stru(imm4,node_size(imm0)))534 dnl __(ldr vsp,[sp,#lisp_frame.savevsp])531 dnl __(cmpri(imm2,0)) 532 dnl __(bne local_label(_nthrowv_tpushloop)) 533 dnl __(stru(imm4,node_size(imm0))) 534 dnl __(ldr vsp,[sp,#lisp_frame.savevsp]) 535 535 dnl /* Interrupts should be disabled here (we're calling and returning */ 536 536 dnl /* from the cleanup form. Clear the tcr.unwinding flag, so that */ 537 537 dnl /* interrupts can be taken if they're enabled in the cleanup form. */ 538 538 dnl __(str(rzero,tcr.unwinding(rcontext))) 539 dnl __(bctrl)539 dnl __(bctrl) 540 540 dnl __(mov imm1,#1) 541 dnl __(la imm0,tsp_frame.data_offset(tsp))541 dnl __(la imm0,tsp_frame.data_offset(tsp)) 542 542 dnl __(str(imm1,tcr.unwinding(rcontext))) 543 dnl __(ldr fn,[sp,#lisp_frame.savefn])544 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr])545 dnl __(discard_lisp_frame())546 dnl __(mtlr loc_pc)547 dnl __(ldr nargs,[imm0,#0])548 dnl __(mov imm2,nargs)549 dnl __(b local_label(_nthrowv_tpoptest))543 dnl __(ldr fn,[sp,#lisp_frame.savefn]) 544 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 545 dnl __(discard_lisp_frame()) 546 dnl __(mtlr loc_pc) 547 dnl __(ldr nargs,[imm0,#0]) 548 dnl __(mov imm2,nargs) 549 dnl __(b local_label(_nthrowv_tpoptest)) 550 550 dnl local_label(_nthrowv_tpoploop): 551 dnl __(ldru(temp0,node_size(imm0)))552 dnl __(vpush1(temp0))553 dnl __(subi imm2,imm2,fixnum_one)551 dnl __(ldru(temp0,node_size(imm0))) 552 dnl __(vpush1(temp0)) 553 dnl __(subi imm2,imm2,fixnum_one) 554 554 dnl local_label(_nthrowv_tpoptest): 555 dnl __(cmpri(imm2,0))556 dnl __(bne local_label(_nthrowv_tpoploop))557 dnl __(ldr imm4,[imm0,#node_size])558 dnl __(unlink(tsp))559 dnl __(b local_label(_nthrowv_nextframe))555 dnl __(cmpri(imm2,0)) 556 dnl __(bne local_label(_nthrowv_tpoploop)) 557 dnl __(ldr imm4,[imm0,#node_size]) 558 dnl __(unlink(tsp)) 559 dnl __(b local_label(_nthrowv_nextframe)) 560 560 dnl local_label(_nthrowv_done): 561 561 dnl __(str(rzero,tcr.unwinding(rcontext))) … … 573 573 dnl _spentry(nthrow1value) 574 574 dnl __(mov imm1,#1) 575 dnl __(mov imm4,imm0)575 dnl __(mov imm4,imm0) 576 576 dnl __(str(imm1,tcr.unwinding(rcontext))) 577 577 dnl local_label(_nthrow1v_nextframe): 578 dnl __(subi imm4,imm4,fixnum_one)579 dnl __(cmpri(cr1,imm4,0))580 dnl __(ldr temp0,[rcontext,#tcr.catch_top])581 dnl __(ldr imm1,[rcontext,#tcr.db_link])582 dnl __(set_nargs(1))583 dnl __(blt cr1,local_label(_nthrow1v_done))584 dnl __(ldr imm3,[temp0,#catch_frame.link])585 dnl __(ldr imm0,[temp0,#catch_frame.db_link])586 dnl __(cmpr(cr0,imm0,imm1))587 dnl __(str(imm3,tcr.catch_top(rcontext)))578 dnl __(subi imm4,imm4,fixnum_one) 579 dnl __(cmpri(cr1,imm4,0)) 580 dnl __(ldr temp0,[rcontext,#tcr.catch_top]) 581 dnl __(ldr imm1,[rcontext,#tcr.db_link]) 582 dnl __(set_nargs(1)) 583 dnl __(blt cr1,local_label(_nthrow1v_done)) 584 dnl __(ldr imm3,[temp0,#catch_frame.link]) 585 dnl __(ldr imm0,[temp0,#catch_frame.db_link]) 586 dnl __(cmpr(cr0,imm0,imm1)) 587 dnl __(str(imm3,tcr.catch_top(rcontext))) 588 588 dnl __(ldr imm3,[temp0,#catch_frame.xframe]) 589 dnl __(ldr temp1,[temp0,#catch_frame.catch_tag])590 dnl __(cmpri(cr7,temp1,unbound_marker))/* unwind-protect ? */589 dnl __(ldr temp1,[temp0,#catch_frame.catch_tag]) 590 dnl __(cmpri(cr7,temp1,unbound_marker)) /* unwind-protect ? */ 591 591 dnl __(str(imm3,tcr.xframe(rcontext))) 592 dnl __(ldr sp,[temp0,#catch_frame.csp])593 dnl __(beq cr0,local_label(_nthrow1v_dont_unbind))594 dnl __(mflr loc_pc)592 dnl __(ldr sp,[temp0,#catch_frame.csp]) 593 dnl __(beq cr0,local_label(_nthrow1v_dont_unbind)) 594 dnl __(mflr loc_pc) 595 595 dnl __(bl _SPunbind_to) 596 dnl __(mtlr loc_pc)596 dnl __(mtlr loc_pc) 597 597 dnl local_label(_nthrow1v_dont_unbind): 598 dnl __(beq cr7,local_label(_nthrow1v_do_unwind))598 dnl __(beq cr7,local_label(_nthrow1v_do_unwind)) 599 599 dnl /* A catch frame. If the last one, restore context from there. */ 600 dnl __(bne cr1,local_label(_nthrow1v_skip))601 dnl __(ldr vsp,[sp,#lisp_frame.savevsp])600 dnl __(bne cr1,local_label(_nthrow1v_skip)) 601 dnl __(ldr vsp,[sp,#lisp_frame.savevsp]) 602 602 dnl __(restore_catch_nvrs(temp0)) 603 603 dnl local_label(_nthrow1v_skip): 604 dnl __(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0))605 dnl __(unlink(tsp))606 dnl __(discard_lisp_frame())607 dnl __(b local_label(_nthrow1v_nextframe))604 dnl __(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0)) 605 dnl __(unlink(tsp)) 606 dnl __(discard_lisp_frame()) 607 dnl __(b local_label(_nthrow1v_nextframe)) 608 608 dnl local_label(_nthrow1v_do_unwind): 609 609 dnl /* This is harder, but not as hard (not as much BLTing) as the */ … … 613 613 dnl 614 614 dnl __(restore_catch_nvrs(temp0)) 615 dnl __(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0))616 dnl __(unlink(tsp))617 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr])618 dnl __(ldr nfn,[sp,#lisp_frame.savefn])619 dnl __(mtctr loc_pc)/* cleanup code address. */620 dnl __(str(fn,lisp_frame.savefn(sp)))621 dnl __(mflr loc_pc)622 dnl __(mov fn,nfn)623 dnl __(str(loc_pc,lisp_frame.savelr(sp)))624 dnl __(TSP_Alloc_Fixed_Boxed(2*node_size)) /* tsp overhead, value, throw count */625 dnl __(str(arg_z,tsp_frame.data_offset(tsp)))626 dnl __(str(imm4,tsp_frame.data_offset+node_size(tsp)))627 dnl __(ldr vsp,[sp,#lisp_frame.savevsp])615 dnl __(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0)) 616 dnl __(unlink(tsp)) 617 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 618 dnl __(ldr nfn,[sp,#lisp_frame.savefn]) 619 dnl __(mtctr loc_pc) /* cleanup code address. */ 620 dnl __(str(fn,lisp_frame.savefn(sp))) 621 dnl __(mflr loc_pc) 622 dnl __(mov fn,nfn) 623 dnl __(str(loc_pc,lisp_frame.savelr(sp))) 624 dnl __(TSP_Alloc_Fixed_Boxed(2*node_size)) /* tsp overhead, value, throw count */ 625 dnl __(str(arg_z,tsp_frame.data_offset(tsp))) 626 dnl __(str(imm4,tsp_frame.data_offset+node_size(tsp))) 627 dnl __(ldr vsp,[sp,#lisp_frame.savevsp]) 628 628 dnl __(str(rzero,tcr.unwinding(rcontext))) 629 dnl __(bctrl)629 dnl __(bctrl) 630 630 dnl __(mov imm1,#1) 631 dnl __(ldr arg_z,[tsp,#tsp_frame.data_offset])631 dnl __(ldr arg_z,[tsp,#tsp_frame.data_offset]) 632 632 dnl __(str(imm1,tcr.unwinding(rcontext))) 633 dnl __(ldr imm4,[tsp,#tsp_frame.data_offset+node_size])634 dnl __(ldr fn,[sp,#lisp_frame.savefn])635 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr])636 dnl __(discard_lisp_frame())637 dnl __(mtlr loc_pc)638 dnl __(unlink(tsp))639 dnl __(b local_label(_nthrow1v_nextframe))633 dnl __(ldr imm4,[tsp,#tsp_frame.data_offset+node_size]) 634 dnl __(ldr fn,[sp,#lisp_frame.savefn]) 635 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 636 dnl __(discard_lisp_frame()) 637 dnl __(mtlr loc_pc) 638 dnl __(unlink(tsp)) 639 dnl __(b local_label(_nthrow1v_nextframe)) 640 640 dnl local_label(_nthrow1v_done): 641 641 dnl __(str(rzero,tcr.unwinding(rcontext))) … … 644 644 dnl __(check_pending_interrupt()) 645 645 dnl __(bx lr) 646 dnl 647 dnl /* arg_z = symbol: bind it to its current value */ 648 dnl _spentry(bind_self) 649 dnl __(ldr imm3,[arg_z,#symbol.binding_index]) 650 dnl __(ldr imm0,[rcontext,#tcr.tlb_limit]) 651 dnl __(cmpri(imm3,0)) 652 dnl __(trlle(imm0,imm3)) /* tlb too small */ 653 dnl __(ldr imm2,[rcontext,#tcr.tlb_pointer]) 654 dnl __(ldr imm1,[rcontext,#tcr.db_link]) 655 dnl __(ldr temp1,[imm2,imm3]) 656 dnl __(cmpri(cr1,temp1,no_thread_local_binding_marker)) 657 dnl __(beq 9f) 658 dnl __(mov temp0,temp1) 659 dnl __(bne cr1,1f) 660 dnl __(ldr temp0,[arg_z,#symbol.vcell]) 661 dnl 1: 662 dnl __(vpush1(temp1)) 663 dnl __(vpush1(imm3)) 664 dnl __(vpush1(imm1)) 665 dnl __(str temp0,imm2,imm3) 666 dnl __(str(vsp,tcr.db_link(rcontext))) 667 dnl __(bx lr) 668 dnl 9: __(mov arg_y,#XSYMNOBIND) 669 dnl __(set_nargs(2)) 670 dnl __(b _SPksignalerr) 671 dnl 672 dnl /* Bind symbol in arg_z to NIL */ 673 dnl _spentry(bind_nil) 674 dnl __(ldr imm3,[arg_z,#symbol.binding_index]) 675 dnl __(ldr imm0,[rcontext,#tcr.tlb_limit]) 676 dnl __(cmpri(imm3,0)) 677 dnl __(beq- 9f) 678 dnl __(trlle(imm0,imm3)) /* tlb too small */ 679 dnl __(ldr imm2,[rcontext,#tcr.tlb_pointer]) 680 dnl __(ldr temp1,[imm2,imm3]) 681 dnl __(ldr imm1,[rcontext,#tcr.db_link]) 682 dnl __(mov imm0,#nil_value) 683 dnl __(vpush1(temp1)) 684 dnl __(vpush1(imm3)) 685 dnl __(vpush1(imm1)) 686 dnl __(str imm0,imm2,imm3) 687 dnl __(str(vsp,tcr.db_link(rcontext))) 688 dnl __(bx lr) 689 dnl 9: __(mov arg_y,#XSYMNOBIND) 690 dnl __(set_nargs(2)) 691 dnl __(b _SPksignalerr) 692 dnl 693 dnl 694 dnl /* Bind symbol in arg_z to its current value; trap if symbol is unbound */ 695 dnl _spentry(bind_self_boundp_check) 696 dnl __(ldr imm3,[arg_z,#symbol.binding_index]) 697 dnl __(ldr imm0,[rcontext,#tcr.tlb_limit]) 698 dnl __(cmpri(imm3,0)) 699 dnl __(trlle(imm0,imm3)) /* tlb too small */ 700 dnl __(ldr imm2,[rcontext,#tcr.tlb_pointer]) 701 dnl __(ldr temp1,[imm2,imm3]) 702 dnl __(ldr imm1,[rcontext,#tcr.db_link]) 703 dnl __(beq 9f) /* no real tlb index */ 704 dnl __(cmpri(temp1,no_thread_local_binding_marker)) 705 dnl __(mov temp0,temp1) 706 dnl __(bne 1f) 707 dnl __(ldr temp0,[arg_z,#symbol.vcell]) 708 dnl 1: __(treqi(temp0,unbound_marker)) 709 dnl __(vpush1(temp1)) 710 dnl __(vpush1(imm3)) 711 dnl __(vpush1(imm1)) 712 dnl __(str temp0,imm2,imm3) 713 dnl __(str(vsp,tcr.db_link(rcontext))) 714 dnl __(bx lr) 715 dnl 9: __(mov arg_y,#XSYMNOBIND) 716 dnl __(set_nargs(2)) 717 dnl __(b _SPksignalerr) 646 647 /* arg_z = symbol: bind it to its current value */ 648 _spentry(bind_self) 649 __(ldr imm1,[arg_z,#symbol.binding_index]) 650 __(ldr imm0,[rcontext,#tcr.tlb_limit]) 651 __(cmp imm1,#0) 652 __(beq 9f) 653 __(cmp imm0,imm1) 654 __(uuo_tlb_too_small(ls,imm1)) 655 __(ldr temp2,[rcontext,#tcr.tlb_pointer]) 656 __(ldr imm0,[rcontext,#tcr.db_link]) 657 __(ldr temp1,[temp2,imm1]) 658 __(cmp temp1,#no_thread_local_binding_marker) 659 __(movne temp0,temp1) 660 __(ldreq temp0,[arg_z,#symbol.vcell]) 661 __(vpush1(temp1)) /* old tlb contents */ 662 __(vpush1(imm1)) /* tlb index */ 663 __(vpush1(imm0)) 664 __(str temp0,[temp2,imm1]) 665 __(str vsp,[rcontext,#tcr.db_link]) 666 __(bx lr) 667 9: __(mov arg_y,#XSYMNOBIND) 668 __(set_nargs(2)) 669 __(b _SPksignalerr) 670 671 /* Bind symbol in arg_z to NIL */ 672 _spentry(bind_nil) 673 __(mov arg_y,arg_z) 674 __(mov arg_z,#nil_value) 675 __(b _SPbind) 676 677 /* Bind symbol in arg_z to its current value; trap if symbol is unbound */ 678 _spentry(bind_self_boundp_check) 679 __(ldr imm1,[arg_z,#symbol.binding_index]) 680 __(ldr imm0,[rcontext,#tcr.tlb_limit]) 681 __(cmp imm1,#0) 682 __(beq 9f) 683 __(cmp imm0,imm1) 684 __(uuo_tlb_too_small(ls,imm1)) 685 __(ldr temp2,[rcontext,#tcr.tlb_pointer]) 686 __(ldr imm0,[rcontext,#tcr.db_link]) 687 __(ldr temp1,[temp2,imm1]) 688 __(cmp temp1,#no_thread_local_binding_marker) 689 __(movne temp0,temp1) 690 __(ldreq temp0,[arg_z,#symbol.vcell]) 691 __(cmp temp0,#unbound_marker) 692 __(uuo_error_unbound(eq,arg_z)) 693 __(vpush1(temp1)) /* old tlb contents */ 694 __(vpush1(imm1)) /* tlb index */ 695 __(vpush1(imm0)) 696 __(str temp0,[temp2,imm1]) 697 __(str vsp,[rcontext,#tcr.db_link]) 698 __(bx lr) 699 9: __(mov arg_y,#XSYMNOBIND) 700 __(set_nargs(2)) 701 __(b _SPksignalerr) 718 702 dnl 719 703 dnl … … 735 719 dnl /* threads are suspended.) */ 736 720 dnl /* We can unconditionally set the suspended thread's PC to its LR. */ 737 dnl 721 dnl 738 722 dnl .globl C(egc_write_barrier_start) 739 723 dnl _spentry(rplaca) … … 768 752 dnl C(egc_rplacd): 769 753 dnl __(cmplr(cr2,arg_z,arg_y)) 770 dnl __(_rplacd(arg_y,arg_z))754 dnl __(_rplacd(arg_y,arg_z)) 771 755 dnl __(blelr cr2) 772 756 dnl __(ref_global(imm2,ref_base)) … … 792 776 dnl __(bx lr) 793 777 dnl 794 dnl/* Storing into a gvector can be handled the same way as storing into a CONS. */795 dnl 796 dnl.globl C(egc_gvset)797 dnl_spentry(gvset)798 dnlC(egc_gvset):778 /* Storing into a gvector can be handled the same way as storing into a CONS. */ 779 780 .globl C(egc_gvset) 781 _spentry(gvset) 782 C(egc_gvset): 799 783 dnl __(cmplr(cr2,arg_z,arg_x)) 800 dnl __(la imm0,misc_data_offset(arg_y)) 801 dnl __(str arg_z,arg_x,imm0) 784 __(add imm0,arg_y,#misc_data_offset) 785 __(str arg_z,[arg_x,imm0]) 786 __(bx lr) 802 787 dnl __(blelr cr2) 803 788 dnl __(add imm0,imm0,arg_x) … … 875 860 dnl 876 861 dnl /* 877 dnl Interrupt handling (in pc_luser_xp()) notes: 862 dnl Interrupt handling (in pc_luser_xp()) notes: 878 863 dnl If we are in this function and before the test which follows the 879 864 dnl conditional (at egc_store_node_conditional), or at that test … … 886 871 dnl body of the next subprim (and at or beyond 'egc_write_barrier_end'). 887 872 dnl 888 dnl N.B: it's not possible to really understand what's going on just873 dnl N.B: it's not possible to really understand what's going on just 889 874 dnl by the state of the cr0`eq' bit. A transient failure in the 890 875 dnl conditional stores that handle memoization might clear cr0`eq' … … 903 888 dnl __(bne cr1,5f) 904 889 dnl __(strcx(arg_z,arg_x,imm4)) 905 dnl .globl C(egc_store_node_conditional_test)906 dnl C(egc_store_node_conditional_test): 890 dnl .globl C(egc_store_node_conditional_test) 891 dnl C(egc_store_node_conditional_test): 907 892 dnl __(bne 1b) 908 893 dnl __(isync) … … 932 917 dnl we have to do more work to actually do the memoization.*/ 933 918 dnl _spentry(set_hash_key_conditional) 934 dnl .globl C(egc_set_hash_key_conditional)919 dnl .globl C(egc_set_hash_key_conditional) 935 920 dnl C(egc_set_hash_key_conditional): 936 dnl __(cmplr(cr2,arg_z,arg_x))937 dnl __(vpop(imm4))938 dnl __(unbox_fixnum(imm4,imm4))939 dnl 1: __(lrarx(temp1,arg_x,imm4))940 dnl __(cmpr(cr1,temp1,arg_y))941 dnl __(bne cr1,5f)942 dnl __(strcx(arg_z,arg_x,imm4))943 dnl .globl C(egc_set_hash_key_conditional_test)944 dnl C(egc_set_hash_key_conditional_test): 945 dnl __(bne 1b)946 dnl __(isync)947 dnl __(add imm0,imm4,arg_x)948 dnl __(ref_global(imm2,ref_base))949 dnl __(ref_global(imm1,oldspace_dnode_count))950 dnl __(sub imm0,imm0,imm2)951 dnl __(load_highbit(imm3))952 dnl __(srri(imm0,imm0,dnode_shift))953 dnl __(cmplr(imm0,imm1))954 dnl __(extract_bit_shift_count(imm2,imm0))955 dnl __(srri(imm0,imm0,bitmap_shift))956 dnl __(srr(imm3,imm3,imm2))957 dnl __(ref_global(imm2,refbits))958 dnl __(bge 4f)959 dnl __(slri(imm0,imm0,word_shift))960 dnl 2: __(lrarx(imm1,imm2,imm0))961 dnl __(or imm1,imm1,imm3)962 dnl __(strcx(imm1,imm2,imm0))963 dnl __(bne- 2b)964 dnl __(isync)965 dnl /* Memoize hash table header */921 dnl __(cmplr(cr2,arg_z,arg_x)) 922 dnl __(vpop(imm4)) 923 dnl __(unbox_fixnum(imm4,imm4)) 924 dnl 1: __(lrarx(temp1,arg_x,imm4)) 925 dnl __(cmpr(cr1,temp1,arg_y)) 926 dnl __(bne cr1,5f) 927 dnl __(strcx(arg_z,arg_x,imm4)) 928 dnl .globl C(egc_set_hash_key_conditional_test) 929 dnl C(egc_set_hash_key_conditional_test): 930 dnl __(bne 1b) 931 dnl __(isync) 932 dnl __(add imm0,imm4,arg_x) 933 dnl __(ref_global(imm2,ref_base)) 934 dnl __(ref_global(imm1,oldspace_dnode_count)) 935 dnl __(sub imm0,imm0,imm2) 936 dnl __(load_highbit(imm3)) 937 dnl __(srri(imm0,imm0,dnode_shift)) 938 dnl __(cmplr(imm0,imm1)) 939 dnl __(extract_bit_shift_count(imm2,imm0)) 940 dnl __(srri(imm0,imm0,bitmap_shift)) 941 dnl __(srr(imm3,imm3,imm2)) 942 dnl __(ref_global(imm2,refbits)) 943 dnl __(bge 4f) 944 dnl __(slri(imm0,imm0,word_shift)) 945 dnl 2: __(lrarx(imm1,imm2,imm0)) 946 dnl __(or imm1,imm1,imm3) 947 dnl __(strcx(imm1,imm2,imm0)) 948 dnl __(bne- 2b) 949 dnl __(isync) 950 dnl /* Memoize hash table header */ 966 951 dnl __(ref_global(imm1,ref_base)) 967 952 dnl __(sub imm0,arg_x,imm1) … … 981 966 dnl __(isync) 982 967 dnl C(egc_write_barrier_end): 983 dnl 4: __(mov arg_z,#t_value)984 dnl __(bx lr)968 dnl 4: __(mov arg_z,#t_value) 969 dnl __(bx lr) 985 970 dnl 5: __(mov imm0,#RESERVATION_DISCHARGE) 986 971 dnl __(strcx(rzero,0,imm0)) 987 dnl __(mov arg_z,#nil_value) 988 dnl __(bx lr) 989 dnl 990 dnl 991 dnl 992 dnl 993 dnl 994 dnl /* We always have to create a tsp frame (even if nargs is 0), so the compiler */ 995 dnl /* doesn't get confused. */ 996 dnl _spentry(stkconslist) 997 dnl __(mov arg_z,#nil_value) 998 dnl __(cmpri(cr1,nargs,0)) 999 dnl __(add imm1,nargs,nargs) 1000 dnl __(addi imm1,imm1,tsp_frame.fixed_overhead) 1001 dnl __(TSP_Alloc_Var_Boxed(imm1,imm2)) 1002 dnl __(la imm1,tsp_frame.data_offset+fulltag_cons(tsp)) 1003 dnl __(b 2f) 1004 dnl 1: __(ldr temp0,[vsp,#0]) 1005 dnl __(cmpri(cr1,nargs,fixnum_one)) 1006 dnl __(la vsp,node_size(vsp)) 1007 dnl __(_rplaca(imm1,temp0)) 1008 dnl __(_rplacd(imm1,arg_z)) 1009 dnl __(mov arg_z,imm1) 1010 dnl __(la imm1,cons.size(imm1)) 1011 dnl __(la nargs,-fixnum_one(nargs)) 1012 dnl 2: 1013 dnl __(bne cr1,1b) 1014 dnl __(bx lr) 1015 dnl 1016 dnl /* do list*: last arg in arg_z, all others vpushed, */ 1017 dnl /* nargs set to #args vpushed. */ 1018 dnl _spentry(stkconslist_star) 1019 dnl __(cmpri(cr1,nargs,0)) 1020 dnl __(add imm1,nargs,nargs) 1021 dnl __(addi imm1,imm1,tsp_frame.fixed_overhead) 1022 dnl __(TSP_Alloc_Var_Boxed(imm1,imm2)) 1023 dnl __(la imm1,tsp_frame.data_offset+fulltag_cons(tsp)) 1024 dnl __(b 2f) 1025 dnl 1: __(ldr temp0,[vsp,#0]) 1026 dnl __(cmpri(cr1,nargs,fixnum_one)) 1027 dnl __(la vsp,node_size(vsp)) 1028 dnl __(_rplaca(imm1,temp0)) 1029 dnl __(_rplacd(imm1,arg_z)) 1030 dnl __(mov arg_z,imm1) 1031 dnl __(la imm1,cons.size(imm1)) 1032 dnl __(la nargs,-fixnum_one(nargs)) 1033 dnl 2: 1034 dnl __(bne cr1,1b) 1035 dnl __(bx lr) 1036 dnl 1037 dnl 1038 dnl /* Make a stack-consed simple-vector out of the NARGS objects */ 1039 dnl /* on top of the vstack; return it in arg_z. */ 1040 dnl _spentry(mkstackv) 1041 dnl __(cmpri(cr1,nargs,0)) 1042 dnl __(dnode_align(imm1,nargs,tsp_frame.fixed_overhead+node_size)) 1043 dnl __(TSP_Alloc_Var_Boxed_nz(imm1,imm2)) 1044 dnl __(slwi imm0,nargs,num_subtag_bits-fixnumshift) 1045 dnl __(ori imm0,imm0,subtag_simple_vector) 1046 dnl __(str(imm0,tsp_frame.data_offset(tsp))) 1047 dnl __(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp)) 1048 dnl __(beq- cr1,2f) 1049 dnl __(la imm0,misc_data_offset(arg_z)) 1050 dnl __(add imm1,imm0,nargs) 1051 dnl 1: 1052 dnl __(la nargs,-node_size(nargs)) 1053 dnl __(cmpri(cr1,nargs,0)) 1054 dnl __(ldr temp1,[vsp,#0]) 1055 dnl __(la vsp,node_size(vsp)) 1056 dnl __(stru(temp1,-node_size(imm1))) 1057 dnl __(bne cr1,1b) 1058 dnl 2: 1059 dnl __(bx lr) 1060 dnl 1061 dnl 972 dnl __(mov arg_z,#nil_value) 973 dnl __(bx lr) 974 dnl 975 dnl 1062 976 dnl 1063 dnl 1064 dnl _spentry(setqsym) 1065 dnl __(ldr imm0,[arg_y,#symbol.flags]) 1066 dnl __(andi. imm0,imm0,sym_vbit_const_mask) 1067 dnl __(beq _SPspecset) 1068 dnl __(mov arg_z,arg_y) 1069 dnl __(mov arg_y,#XCONST) 1070 dnl __(set_nargs(2)) 1071 dnl __(b _SPksignalerr) 1072 dnl 1073 dnl 1074 dnl 977 dnl 978 dnl 979 980 /* We always have to create a stack frame (even if nargs is 0), so the compiler */ 981 /* doesn't get confused. */ 982 _spentry(stkconslist) 983 __(mov arg_z,#nil_value) 984 C(stkconslist_star): 985 __(mov temp2,nargs,lsl 1) 986 __(add temp2,temp2,#node_size) 987 __(mov imm0,temp2,lsl #num_subtag_bits-word_shift) 988 __(orr imm0,imm0,#subtag_u32_vector) 989 __(add temp2,temp2,#node_size) 990 __(mov imm1,#0) 991 __(mov temp1,sp) 992 __(str imm0,[sp,-temp2]!) 993 __(add temp2,sp,#dnode_size) 994 __(str imm1,[sp,#node_size]) 995 __(mov imm0,#subtag_simple_vector) 996 __(b 2f) 997 1: __(str imm1,[temp1,#-node_size]!) 998 __(str imm1,[temp1,#-node_size]!) 999 2: __(cmp temp2,temp1) 1000 __(bne 1b) 1001 __(strb imm0,[sp,#0]) 1002 __(add imm1,sp,#dnode_size+fulltag_cons) 1003 __(cmp nargs,#0) 1004 __(b 4f) 1005 1: __(vpop1(temp0)) 1006 __(_rplaca(imm1,temp0)) 1007 __(_rplacd(imm1,arg_z)) 1008 __(mov arg_z,imm1) 1009 __(add imm1,imm1,#cons.size) 1010 __(subs nargs,nargs,#node_size) 1011 4: 1012 __(bne 1b) 1013 __(bx lr) 1014 1015 /* do list*: last arg in arg_z, all others vpushed, */ 1016 /* nargs set to #args vpushed. */ 1017 _spentry(stkconslist_star) 1018 __(b C(stkconslist_star)) 1019 1020 /* Make a stack-consed simple-vector out of the NARGS objects */ 1021 /* on top of the vstack; return it in arg_z. */ 1022 _spentry(mkstackv) 1023 __(dnode_align(imm1,nargs,node_size)) 1024 __(mov imm0,nargs,lsl #num_subtag_bits-fixnumshift) 1025 __(orr imm0,imm0,#subtag_u32_vector) 1026 __(mov temp1,sp) 1027 __(str imm0,[sp,-imm1]!) 1028 __(mov temp2,#0) 1029 __(str temp0,[sp,#node_size]) 1030 __(add sp,temp0,#dnode_size) 1031 __(mov imm0,#subtag_simple_vector) 1032 __(b 2f) 1033 1: __(str temp2,[temp1,#-node_size]!) 1034 __(str temp2,[temp1,#-node_size]!) 1035 2: __(cmp temp1,temp0) 1036 __(bne 1b) 1037 __(strb imm0,[sp,#0]) 1038 __(add arg_z,sp,#fulltag_misc) 1039 __(add imm0,arg_z,#misc_data_offset) 1040 __(add imm1,imm0,nargs) 1041 __(b 4f) 1042 3: __(vpop1(arg_y)) 1043 __(str arg_y,[imm1,#-node_size]!) 1044 __(sub nargs,nargs,#node_size) 1045 4: __(cmp nargs,#0) 1046 __(bne 3b) 1047 __(bx lr) 1048 1049 _spentry(setqsym) 1050 __(ldr imm0,[arg_y,#symbol.flags]) 1051 __(tst imm0,#sym_vbit_const_mask) 1052 __(beq _SPspecset) 1053 __(mov arg_z,arg_y) 1054 __(mov arg_y,#XCONST) 1055 __(set_nargs(2)) 1056 __(b _SPksignalerr) 1057 1058 1059 1075 1060 dnl _spentry(progvsave) 1076 dnl /* Error if arg_z isn't a proper list. That's unlikely, */1077 dnl /* but it's better to check now than to crash later. */1078 dnl 1079 dnl __(cmpri(arg_z,nil_value))1080 dnl __(mov arg_x,arg_z)/* fast */1081 dnl __(mov temp1,arg_z)/* slow */1082 dnl __(beq 9f)/* Null list is proper */1083 dnl 0: 1084 dnl __(trap_unless_list(arg_x,imm0))1085 dnl __(_cdr(temp2,arg_x))/* (null (cdr fast)) ? */1086 dnl __(cmpri(cr3,temp2,nil_value))1087 dnl __(trap_unless_list(temp2,imm0,cr0))1088 dnl __(_cdr(arg_x,temp2))1089 dnl __(beq cr3,9f)1090 dnl __(_cdr(temp1,temp1))1091 dnl __(cmpr(arg_x,temp1))1092 dnl __(bne 0b)1093 dnl __(mov arg_y,#XIMPROPERLIST)1094 dnl __(set_nargs(2))1095 dnl __(b _SPksignalerr)1096 dnl 9: /* Whew*/1097 dnl 1061 dnl /* Error if arg_z isn't a proper list. That's unlikely, */ 1062 dnl /* but it's better to check now than to crash later. */ 1063 dnl 1064 dnl __(cmpri(arg_z,nil_value)) 1065 dnl __(mov arg_x,arg_z) /* fast */ 1066 dnl __(mov temp1,arg_z) /* slow */ 1067 dnl __(beq 9f) /* Null list is proper */ 1068 dnl 0: 1069 dnl __(trap_unless_list(arg_x,imm0)) 1070 dnl __(_cdr(temp2,arg_x)) /* (null (cdr fast)) ? */ 1071 dnl __(cmpri(cr3,temp2,nil_value)) 1072 dnl __(trap_unless_list(temp2,imm0,cr0)) 1073 dnl __(_cdr(arg_x,temp2)) 1074 dnl __(beq cr3,9f) 1075 dnl __(_cdr(temp1,temp1)) 1076 dnl __(cmpr(arg_x,temp1)) 1077 dnl __(bne 0b) 1078 dnl __(mov arg_y,#XIMPROPERLIST) 1079 dnl __(set_nargs(2)) 1080 dnl __(b _SPksignalerr) 1081 dnl 9: /* Whew */ 1082 dnl 1098 1083 dnl /* Next, determine the length of arg_y. We */ 1099 1084 dnl /* know that it's a proper list. */ 1100 dnl __(mov imm0,#-node_size)1101 dnl __(mov arg_x,arg_y)1085 dnl __(mov imm0,#-node_size) 1086 dnl __(mov arg_x,arg_y) 1102 1087 dnl 1: 1103 dnl __(cmpri(cr0,arg_x,nil_value))1104 dnl __(la imm0,node_size(imm0))1105 dnl __(_cdr(arg_x,arg_x))1106 dnl __(bne 1b)1107 dnl /* imm0 is now (boxed) triplet count. */1108 dnl /* Determine word count, add 1 (to align), and make room. */1109 dnl /* if count is 0, make an empty tsp frame and exit */1110 dnl __(cmpri(cr0,imm0,0))1111 dnl __(add imm1,imm0,imm0)1112 dnl __(add imm1,imm1,imm0)1088 dnl __(cmpri(cr0,arg_x,nil_value)) 1089 dnl __(la imm0,node_size(imm0)) 1090 dnl __(_cdr(arg_x,arg_x)) 1091 dnl __(bne 1b) 1092 dnl /* imm0 is now (boxed) triplet count. */ 1093 dnl /* Determine word count, add 1 (to align), and make room. */ 1094 dnl /* if count is 0, make an empty tsp frame and exit */ 1095 dnl __(cmpri(cr0,imm0,0)) 1096 dnl __(add imm1,imm0,imm0) 1097 dnl __(add imm1,imm1,imm0) 1113 1098 dnl __(dnode_align(imm1,imm1,node_size)) 1114 dnl __(bne+ cr0,2f)1115 dnl __(TSP_Alloc_Fixed_Boxed(2*node_size))1116 dnl __(bx lr)1099 dnl __(bne+ cr0,2f) 1100 dnl __(TSP_Alloc_Fixed_Boxed(2*node_size)) 1101 dnl __(bx lr) 1117 1102 dnl 2: 1118 dnl __(la imm1,tsp_frame.fixed_overhead(imm1))/* tsp header */1119 dnl __(TSP_Alloc_Var_Boxed_nz(imm1,imm2))1120 dnl __(str(imm0,tsp_frame.data_offset(tsp)))1121 dnl __(ldr imm2,[tsp,#tsp_frame.backlink])1122 dnl __(mov arg_x,arg_y)1123 dnl __(ldr imm1,[rcontext,#tcr.db_link])1103 dnl __(la imm1,tsp_frame.fixed_overhead(imm1)) /* tsp header */ 1104 dnl __(TSP_Alloc_Var_Boxed_nz(imm1,imm2)) 1105 dnl __(str(imm0,tsp_frame.data_offset(tsp))) 1106 dnl __(ldr imm2,[tsp,#tsp_frame.backlink]) 1107 dnl __(mov arg_x,arg_y) 1108 dnl __(ldr imm1,[rcontext,#tcr.db_link]) 1124 1109 dnl __(ldr imm3,[rcontext,#tcr.tlb_limit]) 1125 1110 dnl 3: 1126 1111 dnl __(cmpri(cr1,arg_z,nil_value)) 1127 dnl __(_car(temp0,arg_x))1112 dnl __(_car(temp0,arg_x)) 1128 1113 dnl __(ldr imm0,[temp0,#symbol.binding_index]) 1129 dnl __(_cdr(arg_x,arg_x))1114 dnl __(_cdr(arg_x,arg_x)) 1130 1115 dnl __(trlle(imm3,imm0)) 1131 1116 dnl __(ldr imm4,[rcontext,#tcr.tlb_pointer]) /* Need to reload after trap */ 1132 1117 dnl __(ldrx(temp3,imm4,imm0)) 1133 dnl __(cmpri(cr0,arg_x,nil_value))1118 dnl __(cmpri(cr0,arg_x,nil_value)) 1134 1119 dnl __(mov temp2,#unbound_marker) 1135 1120 dnl __(beq cr1,4f) 1136 dnl __(_car(temp2,arg_z))1137 dnl __(_cdr(arg_z,arg_z))1121 dnl __(_car(temp2,arg_z)) 1122 dnl __(_cdr(arg_z,arg_z)) 1138 1123 dnl 4: __(push(temp3,imm2)) 1139 dnl __(push(imm0,imm2))1140 dnl __(push(imm1,imm2))1124 dnl __(push(imm0,imm2)) 1125 dnl __(push(imm1,imm2)) 1141 1126 dnl __(str temp2,imm4,imm0) 1142 dnl __(mov imm1,imm2) 1143 dnl __(bne cr0,3b) 1144 dnl __(str(imm2,tcr.db_link(rcontext))) 1145 dnl __(bx lr) 1146 dnl 1147 dnl 1127 dnl __(mov imm1,imm2) 1128 dnl __(bne cr0,3b) 1129 dnl __(str(imm2,tcr.db_link(rcontext))) 1130 dnl __(bx lr) 1131 dnl 1132 dnl 1133 1148 1134 dnl /* Allocate a miscobj on the temp stack. (Push a frame on the tsp and */ 1149 1135 dnl /* heap-cons the object if there's no room on the tstack.) */ 1150 1136 dnl _spentry(stack_misc_alloc) 1151 dnl __(rlwinm. imm2,arg_y,32-fixnumshift,0,(8+fixnumshift)-1)1152 dnl __(unbox_fixnum(imm0,arg_z))1153 dnl __(extract_fulltag(imm1,imm0))1154 dnl __(bne- cr0,9f)1155 dnl __(cmpri(cr0,imm1,fulltag_nodeheader))1156 dnl __(mov imm3,imm0)1157 dnl __(cmplri(cr1,imm0,max_32_bit_ivector_subtag))1158 dnl __(rlwimi imm0,arg_y,num_subtag_bits-fixnum_shift,0,31-num_subtag_bits) /* imm0 now = header */1159 dnl __(mov imm2,arg_y)1160 dnl __(beq cr0,1f)/* do probe if node object */1161 dnl /* (fixnum element count = byte count). */1162 dnl __(cmplri(cr0,imm3,max_16_bit_ivector_subtag))1163 dnl __(bng cr1,1f) /* do probe if 32-bit imm object */1164 dnl __(cmplri(cr1,imm3,max_8_bit_ivector_subtag))1165 dnl __(srwi imm2,imm2,1)1166 dnl __(bgt cr0,3f)1167 dnl __(bgt cr1,1f)1168 dnl __(srwi imm2,imm2,1)1137 dnl __(rlwinm. imm2,arg_y,32-fixnumshift,0,(8+fixnumshift)-1) 1138 dnl __(unbox_fixnum(imm0,arg_z)) 1139 dnl __(extract_fulltag(imm1,imm0)) 1140 dnl __(bne- cr0,9f) 1141 dnl __(cmpri(cr0,imm1,fulltag_nodeheader)) 1142 dnl __(mov imm3,imm0) 1143 dnl __(cmplri(cr1,imm0,max_32_bit_ivector_subtag)) 1144 dnl __(rlwimi imm0,arg_y,num_subtag_bits-fixnum_shift,0,31-num_subtag_bits) /* imm0 now = header */ 1145 dnl __(mov imm2,arg_y) 1146 dnl __(beq cr0,1f) /* do probe if node object */ 1147 dnl /* (fixnum element count = byte count). */ 1148 dnl __(cmplri(cr0,imm3,max_16_bit_ivector_subtag)) 1149 dnl __(bng cr1,1f) /* do probe if 32-bit imm object */ 1150 dnl __(cmplri(cr1,imm3,max_8_bit_ivector_subtag)) 1151 dnl __(srwi imm2,imm2,1) 1152 dnl __(bgt cr0,3f) 1153 dnl __(bgt cr1,1f) 1154 dnl __(srwi imm2,imm2,1) 1169 1155 dnl /* imm2 now = byte count. Add 4 for header, 7 to align, then */ 1170 dnl /* clear low three bits. */1156 dnl /* clear low three bits. */ 1171 1157 dnl 1: 1172 1158 dnl __(dnode_align(imm3,imm2,tsp_frame.fixed_overhead+node_size)) 1173 dnl __(cmplri(cr0,imm3,tstack_alloc_limit)) /* more than limit ? */1174 dnl __(bgt- cr0,0f)1175 dnl __(TSP_Alloc_Var_Boxed_nz(imm3,imm4))1159 dnl __(cmplri(cr0,imm3,tstack_alloc_limit)) /* more than limit ? */ 1160 dnl __(bgt- cr0,0f) 1161 dnl __(TSP_Alloc_Var_Boxed_nz(imm3,imm4)) 1176 1162 dnl 1177 1163 dnl /* Slap the header on the vector, then return. */ 1178 dnl __(str(imm0,tsp_frame.data_offset(tsp)))1179 dnl __(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp))1180 dnl __(bx lr)1164 dnl __(str(imm0,tsp_frame.data_offset(tsp))) 1165 dnl __(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp)) 1166 dnl __(bx lr) 1181 1167 dnl 9: 1182 1168 dnl … … 1186 1172 dnl /* sure that there's an empty tsp frame to keep the compiler happy. */ 1187 1173 dnl 0: 1188 dnl __(TSP_Alloc_Fixed_Unboxed(0))1189 dnl __(b _SPmisc_alloc)1174 dnl __(TSP_Alloc_Fixed_Unboxed(0)) 1175 dnl __(b _SPmisc_alloc) 1190 1176 dnl 3: 1191 dnl __(cmplri(imm3,subtag_double_float_vector)) 1192 dnl __(slwi imm2,arg_y,1) 1193 dnl __(beq 1b) 1194 dnl __(addi imm2,arg_y,7<<fixnumshift) 1195 dnl __(srwi imm2,imm2,fixnumshift+3) 1196 dnl __(b 1b) 1197 dnl 1198 dnl 1199 dnl /* subtype (boxed, of course) is vpushed, followed by nargs bytes worth of */ 1200 dnl /* initial-contents. Note that this can be used to cons any type of initialized */ 1201 dnl /* node-header'ed misc object (symbols, closures, ...) as well as vector-like */ 1202 dnl /* objects. */ 1203 dnl /* Note that we're guaranteed to win (or force GC, or run out of memory) */ 1204 dnl /* because nargs < 32K. */ 1205 dnl _spentry(gvector) 1206 dnl __(subi nargs,nargs,node_size) 1207 dnl __(ldrx(arg_z,vsp,nargs)) 1208 dnl __(unbox_fixnum(imm0,arg_z)) 1209 dnl __ifdef(`PPC64') 1210 dnl __(sldi imm1,nargs,num_subtag_bits-fixnum_shift) 1211 dnl __(or imm0,imm0,imm1) 1212 dnl __else 1213 dnl __(rlwimi imm0,nargs,num_subtag_bits-fixnum_shift,0,31-num_subtag_bits) 1214 dnl __endif 1215 dnl __(dnode_align(imm1,nargs,node_size)) 1216 dnl __(Misc_Alloc(arg_z,imm0,imm1)) 1217 dnl __(mov imm1,nargs) 1218 dnl __(la imm2,misc_data_offset(imm1)) 1219 dnl __(b 2f) 1220 dnl 1: 1221 dnl __(str temp0,arg_z,imm2) 1222 dnl 2: 1223 dnl __(subi imm1,imm1,node_size) 1224 dnl __(cmpri(cr0,imm1,0)) 1225 dnl __(subi imm2,imm2,node_size) 1226 dnl __(vpop(temp0)) /* Note the intentional fencepost: */ 1227 dnl /* discard the subtype as well. */ 1228 dnl __(bge cr0,1b) 1229 dnl __(bx lr) 1230 dnl 1231 dnl 1232 dnl 1233 dnl 1234 dnl _spentry(fitvals) 1235 dnl __(subf. imm0,nargs,imm0) 1236 dnl __(mov imm1,#nil_value) 1237 dnl __(bge 2f) 1238 dnl __(sub vsp,vsp,imm0) 1239 dnl __(bx lr) 1240 dnl 1: 1241 dnl __(subic. imm0,imm0,node_size) 1242 dnl __(vpush1(imm1)) 1243 dnl __(addi nargs,nargs,node_size) 1244 dnl 2: 1245 dnl __(bne 1b) 1246 dnl __(bx lr) 1247 dnl 1248 dnl 1249 dnl _spentry(nthvalue) 1250 dnl __(add imm0,vsp,nargs) 1251 dnl __(ldr imm1,[imm0,#0]) 1252 dnl __(cmplr(imm1,nargs)) /* do unsigned compare: if (n < 0) => nil. */ 1253 dnl __(mov arg_z,#nil_value) 1254 dnl __(neg imm1,imm1) 1255 dnl __(subi imm1,imm1,node_size) 1256 dnl __(bge 1f) 1257 dnl __(ldrx(arg_z,imm0,imm1)) 1258 dnl 1: 1259 dnl __(la vsp,node_size(imm0)) 1260 dnl __(bx lr) 1261 dnl 1262 dnl 1263 dnl 1264 dnl /* Provide default (NIL) values for &optional arguments; imm0 is */ 1265 dnl /* the (fixnum) upper limit on the total of required and &optional */ 1266 dnl /* arguments. nargs is preserved, all arguments wind up on the */ 1267 dnl /* vstack. */ 1268 dnl _spentry(default_optional_args) 1269 dnl __(cmplr( cr7,nargs,imm0)) 1270 dnl __(mov imm5,#nil_value) 1271 dnl __(vpush_argregs()) 1272 dnl __(mov imm1,nargs) 1273 dnl __(bgelr cr7) 1274 dnl 1: 1275 dnl __(addi imm1,imm1,fixnum_one) 1276 dnl __(cmpr(cr0,imm1,imm0)) 1277 dnl __(vpush1(imm5)) 1278 dnl __(bne cr0,1b) 1279 dnl __(bx lr) 1280 dnl 1177 dnl __(cmplri(imm3,subtag_double_float_vector)) 1178 dnl __(slwi imm2,arg_y,1) 1179 dnl __(beq 1b) 1180 dnl __(addi imm2,arg_y,7<<fixnumshift) 1181 dnl __(srwi imm2,imm2,fixnumshift+3) 1182 dnl __(b 1b) 1183 1184 1185 /* subtype (boxed, of course) is vpushed, followed by nargs bytes worth of */ 1186 /* initial-contents. Note that this can be used to cons any type of initialized */ 1187 /* node-header'ed misc object (symbols, closures, ...) as well as vector-like */ 1188 /* objects. */ 1189 1190 _spentry(gvector) 1191 __(sub nargs,nargs,#node_size) 1192 __(ldr arg_z,[vsp,nargs]) 1193 __(unbox_fixnum(imm0,arg_z)) 1194 __(orr imm0,imm0,nargs,lsl #num_subtag_bits-fixnum_shift) 1195 __(dnode_align(imm1,nargs,node_size)) 1196 __(Misc_Alloc(arg_z,imm0,imm1)) 1197 __(mov imm1,nargs) 1198 __(add imm2,imm1,#misc_data_offset) 1199 __(b 2f) 1200 1: 1201 __(str temp0,[arg_z,imm2]) 1202 2: 1203 __(sub imm1,imm1,#node_size) 1204 __(cmp imm1,#0) 1205 __(sub imm2,imm2,#node_size) 1206 __(vpop1(temp0)) /* Note the intentional fencepost: */ 1207 /* discard the subtype as well. */ 1208 __(bge 1b) 1209 __(bx lr) 1210 1211 _spentry(fitvals) 1212 __(subs imm0,imm0,nargs) 1213 __(mov imm1,#nil_value) 1214 __(sublt vsp,vsp,imm0) 1215 __(bxlt lr) 1216 __(b 2f) 1217 1: 1218 __(subs imm0,imm0,#node_size) 1219 __(vpush1(imm1)) 1220 __(add nargs,nargs,#node_size) 1221 2: 1222 __(bne 1b) 1223 __(bx lr) 1224 1225 1226 _spentry(nthvalue) 1227 __(add imm0,vsp,nargs) 1228 __(ldr imm1,[imm0,#0]) 1229 __(cmp imm1,nargs) /* do unsigned compare: if (n < 0) => nil. */ 1230 __(mov arg_z,#nil_value) 1231 __(rsb imm1,imm1,#0) 1232 __(sub imm1,imm1,#node_size) 1233 __(ldrlo arg_z,[imm0,imm1]) 1234 __(add vsp,imm0,#node_size) 1235 __(bx lr) 1236 1237 /* Provide default (NIL) values for &optional arguments; imm0 is */ 1238 /* the (fixnum) upper limit on the total of required and &optional */ 1239 /* arguments. nargs is preserved, all arguments wind up on the */ 1240 /* vstack. */ 1241 _spentry(default_optional_args) 1242 __(vpush_argregs()) 1243 __(cmp nargs,imm0) 1244 __(mov arg_z,#nil_value) 1245 __(mov imm1,nargs) 1246 __(bxhs lr) 1247 1: 1248 __(add imm1,imm1,#fixnum_one) 1249 __(cmp imm1,imm0) 1250 __(vpush1(arg_z)) 1251 __(bne 1b) 1252 __(bx lr) 1253 1281 1254 dnl /* Indicate whether &optional arguments were actually supplied. nargs */ 1282 1255 dnl /* contains the actual arg count (minus the number of required args); */ … … 1284 1257 dnl /* Note that nargs may be > imm0 if &rest/&key is involved. */ 1285 1258 dnl _spentry(opt_supplied_p) 1286 dnl __(mov imm1,#0)1259 dnl __(mov imm1,#0) 1287 1260 dnl 1: 1288 dnl /* (vpush (< imm1 nargs)) */ 1289 dnl __ifdef(`PPC64') 1290 dnl __(xor imm2,imm1,nargs) 1291 dnl __(sradi imm2,imm2,63) 1292 dnl __(or imm2,imm2,imm1) 1293 dnl __(addi imm1,imm1,fixnumone) 1294 dnl __(cmpr(cr0,imm1,imm0)) 1295 dnl __(subf imm2,nargs,imm2) 1296 dnl __(srdi imm2,imm2,63) 1297 dnl __(mulli imm2,imm2,t_offset) 1298 dnl __(addi imm2,imm2,nil_value) 1299 dnl __(vpush1(imm2)) 1300 dnl __(bne cr0,1b) 1301 dnl __(bx lr) 1302 dnl __else 1303 dnl __(xor imm2,imm1,nargs) 1304 dnl __(srawi imm2,imm2,31) 1305 dnl __(or imm2,imm2,imm1) 1306 dnl __(addi imm1,imm1,fixnumone) 1307 dnl __(cmpr(cr0,imm1,imm0)) 1308 dnl __(subf imm2,nargs,imm2) 1309 dnl __(srwi imm2,imm2,31) 1310 dnl __(insrwi imm2,imm2,1,27) 1311 dnl __(addi imm2,imm2,nil_value) 1312 dnl __(vpush1(imm2)) 1313 dnl __(bne cr0,1b) 1314 dnl __(bx lr) 1315 dnl __endif 1316 dnl 1317 dnl 1318 dnl 1319 dnl /* If nargs is <= imm0, vpush a nil. Otherwise, cons a list of length */ 1320 dnl /* (- nargs imm0) and vpush it. */ 1321 dnl /* Use this entry point to heap-cons a simple &rest arg. */ 1322 dnl _spentry(heap_rest_arg) 1323 dnl __(mov imm0,#0) 1324 dnl __(vpush_argregs()) 1325 dnl __(sub imm1,nargs,imm0) 1326 dnl __(cmpri(imm1,0)) 1327 dnl __(mov arg_z,#nil_value) 1328 dnl __(b 2f) 1329 dnl 1: 1330 dnl __(ldr temp0,[vsp,#0]) 1331 dnl __(cmpri(imm1,fixnum_one)) 1332 dnl __(la vsp,node_size(vsp)) 1333 dnl __(Cons(arg_z,temp0,arg_z)) 1334 dnl __(subi imm1,imm1,fixnum_one) 1335 dnl 2: 1336 dnl __(bgt 1b) 1337 dnl __(vpush1(arg_z)) 1338 dnl __(bx lr) 1339 dnl 1340 dnl 1341 dnl /* And this entry point when the argument registers haven't yet been */ 1342 dnl /* vpushed (as is typically the case when required/&rest but no */ 1343 dnl /* &optional/&key.) */ 1344 dnl _spentry(req_heap_rest_arg) 1345 dnl __(vpush_argregs()) 1346 dnl __(sub imm1,nargs,imm0) 1347 dnl __(cmpri(imm1,0)) 1348 dnl __(mov arg_z,#nil_value) 1349 dnl __(b 2f) 1350 dnl 1: 1351 dnl __(ldr temp0,[vsp,#0]) 1352 dnl __(cmpri(imm1,fixnum_one)) 1353 dnl __(la vsp,node_size(vsp)) 1354 dnl __(Cons(arg_z,temp0,arg_z)) 1355 dnl __(subi imm1,imm1,fixnum_one) 1356 dnl 2: 1357 dnl __(bgt 1b) 1358 dnl __(vpush1(arg_z)) 1359 dnl __(bx lr) 1360 dnl 1361 dnl 1362 dnl _spentry(heap_cons_rest_arg) 1363 dnl __(sub imm1,nargs,imm0) 1364 dnl __(cmpri(imm1,0)) 1365 dnl __(mov arg_z,#nil_value) 1366 dnl __(b 2f) 1367 dnl 1: 1368 dnl __(ldr temp0,[vsp,#0]) 1369 dnl __(cmpri(imm1,fixnum_one)) 1370 dnl __(la vsp,node_size(vsp)) 1371 dnl __(Cons(arg_z,temp0,arg_z)) 1372 dnl __(subi imm1,imm1,fixnum_one) 1373 dnl 2: 1374 dnl __(bgt 1b) 1375 dnl __(vpush1(arg_z)) 1376 dnl __(bx lr) 1377 dnl 1378 dnl 1261 dnl /* (vpush (< imm1 nargs)) */ 1262 dnl __(xor imm2,imm1,nargs) 1263 dnl __(srawi imm2,imm2,31) 1264 dnl __(or imm2,imm2,imm1) 1265 dnl __(addi imm1,imm1,fixnumone) 1266 dnl __(cmpr(cr0,imm1,imm0)) 1267 dnl __(subf imm2,nargs,imm2) 1268 dnl __(srwi imm2,imm2,31) 1269 dnl __(insrwi imm2,imm2,1,27) 1270 dnl __(addi imm2,imm2,nil_value) 1271 dnl __(vpush1(imm2)) 1272 dnl __(bne cr0,1b) 1273 dnl __(bx lr) 1274 dnl 1275 dnl 1276 dnl 1277 /* Cons a list of length nargs and vpush it. */ 1278 /* Use this entry point to heap-cons a simple &rest arg. */ 1279 _spentry(heap_rest_arg) 1280 __(vpush_argregs()) 1281 __(movs imm1,nargs) 1282 __(mov arg_z,#nil_value) 1283 __(b 2f) 1284 1: 1285 __(vpop1(arg_y)) 1286 __(Cons(arg_z,arg_y,arg_z)) 1287 __(subs imm1,imm1,#fixnum_one) 1288 2: 1289 __(bne 1b) 1290 __(vpush1(arg_z)) 1291 __(bx lr) 1292 1293 1294 /* And this entry point when the argument registers haven't yet been */ 1295 /* vpushed (as is typically the case when required/&rest but no */ 1296 /* &optional/&key.) */ 1297 _spentry(req_heap_rest_arg) 1298 __(vpush_argregs()) 1299 __(subs imm1,nargs,imm0) 1300 __(mov arg_z,#nil_value) 1301 __(b 2f) 1302 1: 1303 __(vpop1(arg_y)) 1304 __(Cons(arg_z,arg_y,arg_z)) 1305 __(subs imm1,imm1,#fixnum_one) 1306 2: 1307 __(bgt 1b) 1308 __(vpush1(arg_z)) 1309 __(bx lr) 1310 1311 /* Here where argregs already pushed */ 1312 _spentry(heap_cons_rest_arg) 1313 __(subs imm1,nargs,imm0) 1314 __(mov arg_z,#nil_value) 1315 __(b 2f) 1316 1: 1317 __(vpop1(arg_y)) 1318 __(Cons(arg_z,arg_y,arg_z)) 1319 __(subs imm1,imm1,#fixnum_one) 1320 2: 1321 __(bgt 1b) 1322 __(vpush1(arg_z)) 1323 __(bx lr) 1324 dnl 1325 dnl 1379 1326 dnl _spentry(simple_keywords) 1380 dnl __(mov imm0,#0)1327 dnl __(mov imm0,#0) 1381 1328 dnl __(vpush_argregs()) 1382 1329 dnl __(b _SPkeyword_bind) 1383 1330 dnl 1384 1331 dnl _spentry(keyword_args) 1385 dnl __(vpush_argregs())1332 dnl __(vpush_argregs()) 1386 1333 dnl __(b _SPkeyword_bind) 1387 1334 dnl … … 1413 1360 dnl /* how many args have actually been pushed. Ordinarily, that'd */ 1414 1361 dnl /* be "nargs", but we may have pushed more args than we received */ 1415 dnl /* if we had to default any &optionals. */1416 dnl /* So, the number of args pushed so far is the larger of nargs */1417 dnl /* and the (canonical) total of required/&optional args received. */1418 dnl __(cmpr(cr0,nargs,imm0))1419 dnl __(add arg_z,vsp,nargs)1420 dnl __(bge+ cr0,1f)1421 dnl __(add arg_z,vsp,imm0)1362 dnl /* if we had to default any &optionals. */ 1363 dnl /* So, the number of args pushed so far is the larger of nargs */ 1364 dnl /* and the (canonical) total of required/&optional args received. */ 1365 dnl __(cmpr(cr0,nargs,imm0)) 1366 dnl __(add arg_z,vsp,nargs) 1367 dnl __(bge+ cr0,1f) 1368 dnl __(add arg_z,vsp,imm0) 1422 1369 dnl 1: 1423 dnl __(build_lisp_frame(fn,loc_pc,arg_z))1424 dnl __(mov fn,nfn)1425 dnl /* If there are key/value pairs to consider, we slide them down */1426 dnl /* the vstack to make room for the value/supplied-p pairs. */1427 dnl /* The first step in that operation involves pushing imm3 pairs */1428 dnl /* of NILs. */1429 dnl /* If there aren't any such pairs, the first step is the last */1430 dnl /* step. */1431 dnl __(cmpri(cr0,imm3,0))1432 dnl __(mov arg_z,#0)1433 dnl __(sub imm1,nargs,imm0)1434 dnl __(mov imm4,vsp)/* in case odd keywords error */1435 dnl __(cmpri(cr1,imm1,0))1436 dnl __(b 3f)1370 dnl __(build_lisp_frame(fn,loc_pc,arg_z)) 1371 dnl __(mov fn,nfn) 1372 dnl /* If there are key/value pairs to consider, we slide them down */ 1373 dnl /* the vstack to make room for the value/supplied-p pairs. */ 1374 dnl /* The first step in that operation involves pushing imm3 pairs */ 1375 dnl /* of NILs. */ 1376 dnl /* If there aren't any such pairs, the first step is the last */ 1377 dnl /* step. */ 1378 dnl __(cmpri(cr0,imm3,0)) 1379 dnl __(mov arg_z,#0) 1380 dnl __(sub imm1,nargs,imm0) 1381 dnl __(mov imm4,vsp) /* in case odd keywords error */ 1382 dnl __(cmpri(cr1,imm1,0)) 1383 dnl __(b 3f) 1437 1384 dnl 2: 1438 dnl __(addi arg_z,arg_z,fixnum_one)1439 dnl __(cmplr(cr0,arg_z,imm3))1440 dnl __(mov imm5,#nil_value)1441 dnl __(vpush1(imm5))1442 dnl __(vpush1(imm5))1385 dnl __(addi arg_z,arg_z,fixnum_one) 1386 dnl __(cmplr(cr0,arg_z,imm3)) 1387 dnl __(mov imm5,#nil_value) 1388 dnl __(vpush1(imm5)) 1389 dnl __(vpush1(imm5)) 1443 1390 dnl 3: 1444 dnl __(bne cr0,2b)1445 dnl __(andi. arg_z,imm1,fixnum_one)1446 dnl __(blelr cr1)/* no keyword/value pairs to consider. */1447 dnl __(bne cr0,odd_keywords)1448 dnl /* We have key/value pairs. Move them to the top of the vstack, */1449 dnl /* then set the value/supplied-p vars to NIL. */1450 dnl /* Have to use some save regs to do this. */1451 dnl __(vpush1(limit))1452 dnl __(vpush1(valptr))1453 dnl __(vpush1(varptr))1454 dnl /* recompute ptr to user args in case stack overflowed */1455 dnl __(add imm4,vsp,imm3)1456 dnl __(add imm4,imm4,imm3)1457 dnl __(addi imm4,imm4,3*node_size)1458 dnl /* error if odd number of keyword/value args */1459 dnl __(mov varptr,imm4)1460 dnl __(la limit,3*node_size(vsp))1461 dnl __(mov valptr,limit)1462 dnl __(mov arg_z,imm1)1391 dnl __(bne cr0,2b) 1392 dnl __(andi. arg_z,imm1,fixnum_one) 1393 dnl __(blelr cr1) /* no keyword/value pairs to consider. */ 1394 dnl __(bne cr0,odd_keywords) 1395 dnl /* We have key/value pairs. Move them to the top of the vstack, */ 1396 dnl /* then set the value/supplied-p vars to NIL. */ 1397 dnl /* Have to use some save regs to do this. */ 1398 dnl __(vpush1(limit)) 1399 dnl __(vpush1(valptr)) 1400 dnl __(vpush1(varptr)) 1401 dnl /* recompute ptr to user args in case stack overflowed */ 1402 dnl __(add imm4,vsp,imm3) 1403 dnl __(add imm4,imm4,imm3) 1404 dnl __(addi imm4,imm4,3*node_size) 1405 dnl /* error if odd number of keyword/value args */ 1406 dnl __(mov varptr,imm4) 1407 dnl __(la limit,3*node_size(vsp)) 1408 dnl __(mov valptr,limit) 1409 dnl __(mov arg_z,imm1) 1463 1410 dnl 4: 1464 dnl __(mov imm4,#nil_value)1465 dnl __(subi arg_z,arg_z,2<<fixnumshift)1466 dnl __(cmplri(cr0,arg_z,0))1467 dnl __(ldr arg_x,[varptr,#node_size*0])1468 dnl __(ldr arg_y,[varptr,#node_size*1])1469 dnl __(str(imm4,node_size*0(varptr)))1470 dnl __(str(imm4,node_size*1(varptr)))1471 dnl __(la varptr,node_size*2(varptr))1472 dnl __(str(arg_x,node_size*0(valptr)))1473 dnl __(str(arg_y,node_size*1(valptr)))1474 dnl __(la valptr,node_size*2(valptr))1475 dnl __(bne cr0,4b)1411 dnl __(mov imm4,#nil_value) 1412 dnl __(subi arg_z,arg_z,2<<fixnumshift) 1413 dnl __(cmplri(cr0,arg_z,0)) 1414 dnl __(ldr arg_x,[varptr,#node_size*0]) 1415 dnl __(ldr arg_y,[varptr,#node_size*1]) 1416 dnl __(str(imm4,node_size*0(varptr))) 1417 dnl __(str(imm4,node_size*1(varptr))) 1418 dnl __(la varptr,node_size*2(varptr)) 1419 dnl __(str(arg_x,node_size*0(valptr))) 1420 dnl __(str(arg_y,node_size*1(valptr))) 1421 dnl __(la valptr,node_size*2(valptr)) 1422 dnl __(bne cr0,4b) 1476 1423 dnl 1477 1424 dnl … … 1485 1432 dnl /* When done, complain if any unknown keywords were found and that */ 1486 1433 dnl /* situation was unexpected. */ 1487 dnl __(mov imm4,valptr)1434 dnl __(mov imm4,valptr) 1488 1435 dnl 5: 1489 1436 dnl __(cmpri(cr0,keyword_flags,16<<fixnumshift)) /* seen :a-o-k yet ? */ 1490 dnl __(ldru(arg_z,-node_size(valptr)))1491 dnl __(ldru(arg_y,-node_size(valptr)))1492 dnl __(cmpri(cr1,arg_y,nil_value))1493 dnl __(mov arg_x,#nrs.kallowotherkeys)1437 dnl __(ldru(arg_z,-node_size(valptr))) 1438 dnl __(ldru(arg_y,-node_size(valptr))) 1439 dnl __(cmpri(cr1,arg_y,nil_value)) 1440 dnl __(mov arg_x,#nrs.kallowotherkeys) 1494 1441 dnl /* cr6_eq <- (eq current-keyword :allow-other-keys) */ 1495 dnl __(cmpr(cr6,arg_x,arg_z))1496 dnl __(cmpr(cr7,valptr,limit))1497 dnl __(bne cr6,6f)1442 dnl __(cmpr(cr6,arg_x,arg_z)) 1443 dnl __(cmpr(cr7,valptr,limit)) 1444 dnl __(bne cr6,6f) 1498 1445 dnl __(bge cr0,6f) /* Already seen :allow-other-keys */ 1499 1446 dnl __(ori keyword_flags,keyword_flags,16<<fixnumshift) 1500 dnl __(beq cr1,6f)1501 dnl __(ori keyword_flags,keyword_flags,fixnum_one)1447 dnl __(beq cr1,6f) 1448 dnl __(ori keyword_flags,keyword_flags,fixnum_one) 1502 1449 dnl 6: 1503 dnl __(cmpri(cr1,imm3,0))1504 dnl __(mov imm1,#misc_data_offset)1505 dnl __(mov imm0,#0)1506 dnl __(b 8f)1450 dnl __(cmpri(cr1,imm3,0)) 1451 dnl __(mov imm1,#misc_data_offset) 1452 dnl __(mov imm0,#0) 1453 dnl __(b 8f) 1507 1454 dnl 7: 1508 dnl __(addi imm0,imm0,fixnum_one)1509 dnl __(cmpr(cr1,imm0,imm3))1510 dnl __(ldrx(arg_x,keyword_vector,imm1))1511 dnl __(cmpr(cr0,arg_x,arg_z))1512 dnl __(addi imm1,imm1,fixnum_one)1513 dnl __(bne cr0,8f)1514 dnl __(add imm0,imm0,imm0)1515 dnl __(sub imm0,varptr,imm0)1516 dnl __(ldr arg_x,[imm0,#0])1517 dnl __(cmpri(cr0,arg_x,nil_value))1518 dnl __(mov arg_z,#t_value)1519 dnl __(bne cr0,9f)1520 dnl __(str(arg_y,node_size(imm0)))1521 dnl __(str(arg_z,0(imm0)))1522 dnl __(b 9f)1455 dnl __(addi imm0,imm0,fixnum_one) 1456 dnl __(cmpr(cr1,imm0,imm3)) 1457 dnl __(ldrx(arg_x,keyword_vector,imm1)) 1458 dnl __(cmpr(cr0,arg_x,arg_z)) 1459 dnl __(addi imm1,imm1,fixnum_one) 1460 dnl __(bne cr0,8f) 1461 dnl __(add imm0,imm0,imm0) 1462 dnl __(sub imm0,varptr,imm0) 1463 dnl __(ldr arg_x,[imm0,#0]) 1464 dnl __(cmpri(cr0,arg_x,nil_value)) 1465 dnl __(mov arg_z,#t_value) 1466 dnl __(bne cr0,9f) 1467 dnl __(str(arg_y,node_size(imm0))) 1468 dnl __(str(arg_z,0(imm0))) 1469 dnl __(b 9f) 1523 1470 dnl 8: 1524 dnl __(bne cr1,7b)1525 dnl /* Unknown keyword. If it was :allow-other-keys, cr6_eq will still */1471 dnl __(bne cr1,7b) 1472 dnl /* Unknown keyword. If it was :allow-other-keys, cr6_eq will still */ 1526 1473 dnl /* be set. */ 1527 1474 dnl __(beq cr6,9f) 1528 dnl __(ori keyword_flags,keyword_flags,2<<fixnumshift)1475 dnl __(ori keyword_flags,keyword_flags,2<<fixnumshift) 1529 1476 dnl 9: 1530 dnl __(bne cr7,5b)1531 dnl __(vpop(varptr))1532 dnl __(vpop(valptr))1533 dnl __(vpop(limit))1534 dnl /* All keyword/value pairs have been processed. */1535 dnl /* If we saw an unknown keyword and didn't expect to, error. */1536 dnl /* Unless bit 2 is set in the fixnum in keyword_flags, discard the */1537 dnl /* keyword/value pairs from the vstack. */1538 dnl __(andi. imm0,keyword_flags,(fixnum_one)|(2<<fixnumshift))1539 dnl __(cmpri(cr0,imm0,2<<fixnumshift))1540 dnl __(beq- cr0,badkeys)1541 dnl __(andi. imm2,keyword_flags,4<<fixnumshift)1542 dnl __(bnelr cr0)1543 dnl __(mov vsp,imm4)1544 dnl __(bx lr)1477 dnl __(bne cr7,5b) 1478 dnl __(vpop(varptr)) 1479 dnl __(vpop(valptr)) 1480 dnl __(vpop(limit)) 1481 dnl /* All keyword/value pairs have been processed. */ 1482 dnl /* If we saw an unknown keyword and didn't expect to, error. */ 1483 dnl /* Unless bit 2 is set in the fixnum in keyword_flags, discard the */ 1484 dnl /* keyword/value pairs from the vstack. */ 1485 dnl __(andi. imm0,keyword_flags,(fixnum_one)|(2<<fixnumshift)) 1486 dnl __(cmpri(cr0,imm0,2<<fixnumshift)) 1487 dnl __(beq- cr0,badkeys) 1488 dnl __(andi. imm2,keyword_flags,4<<fixnumshift) 1489 dnl __(bnelr cr0) 1490 dnl __(mov vsp,imm4) 1491 dnl __(bx lr) 1545 1492 dnl 1546 1493 dnl /* Signal an error. We saved context on entry, so this thing doesn't */ … … 1554 1501 dnl /* error with that list as an operand. */ 1555 1502 dnl odd_keywords: 1556 dnl __(mov vsp,imm4)1557 dnl __(mov nargs,imm1)1558 dnl __(b 1f)1503 dnl __(mov vsp,imm4) 1504 dnl __(mov nargs,imm1) 1505 dnl __(b 1f) 1559 1506 dnl badkeys: 1560 dnl __(sub nargs,imm4,vsp)1507 dnl __(sub nargs,imm4,vsp) 1561 1508 dnl 1: 1562 dnl __(bl _SPconslist) 1563 dnl __(mov arg_y,#XBADKEYS) 1564 dnl __(set_nargs(2)) 1565 dnl __(b _SPksignalerr) 1566 dnl 1567 dnl /* A PowerOpen ff-call. arg_z is either a fixnum (word-aligned entrypoint) */ 1568 dnl /* or a macptr (whose address had better be word-aligned as well.) A */ 1569 dnl /* PowerOpen stack frame is on top of the stack; 4 additional words (to */ 1570 dnl /* be used a a lisp frame) sit under the C frame. */ 1571 dnl 1572 dnl /* Since we probably can't deal with FP exceptions in foreign code, we */ 1573 dnl /* disable them in the FPSCR, then check on return to see if any previously */ 1574 dnl /* enabled FP exceptions occurred. */ 1575 dnl 1576 dnl /* As it turns out, we can share a lot of code with the eabi version of */ 1577 dnl /* ff-call. Some things that happen up to the point of call differ between */ 1578 dnl /* the ABIs, but everything that happens after is the same. */ 1579 dnl 1580 dnl 1581 dnl _spentry(poweropen_ffcall) 1582 dnl LocalLabelPrefix`'ffcall: 1583 dnl __(mflr loc_pc) 1584 dnl __(vpush_saveregs()) /* Now we can use save0-save7 to point to stacks */ 1585 dnl __(mov save0,rcontext) /* or address globals. */ 1586 dnl __(extract_typecode(imm0,arg_z)) 1587 dnl __(cmpri(cr7,imm0,subtag_macptr)) 1588 dnl __(ldr save1,[sp,#0]) /* bottom of reserved lisp frame */ 1589 dnl __(la save2,-lisp_frame.size(save1)) /* top of lisp frame */ 1590 dnl __(zero_doublewords save2,0,lisp_frame.size) 1591 dnl __(str(save1,lisp_frame.backlink(save2))) 1592 dnl __(str(save2,c_frame.backlink(sp))) 1593 dnl __(str(fn,lisp_frame.savefn(save2))) 1594 dnl __(str(loc_pc,lisp_frame.savelr(save2))) 1595 dnl __(str(vsp,lisp_frame.savevsp(save2))) 1596 dnl __(mov nargs,arg_z) 1597 dnl __(bne cr7,1f) 1598 dnl __(ldr nargs,[arg_z,#macptr.address]) 1599 dnl 1: 1600 dnl __(ldr save3,[rcontext,#tcr.cs_area]) 1601 dnl __(str(save2,area.active(save3))) 1602 dnl __(str(allocptr,tcr.save_allocptr(rcontext))) 1603 dnl __(str(allocbase,tcr.save_allocbase(rcontext))) 1604 dnl __(str(tsp,tcr.save_tsp(rcontext))) 1605 dnl __(str(vsp,tcr.save_vsp(rcontext))) 1606 dnl __(str(rzero,tcr.ffi_exception(rcontext))) 1607 dnl __(mffs f0) 1608 dnl __(stfd f0,tcr.lisp_fpscr(rcontext)) /* remember lisp's fpscr */ 1609 dnl __(mtfsf 0xff,fp_zero) /* zero foreign fpscr */ 1610 dnl __(mov r4,#TCR_STATE_FOREIGN) 1611 dnl __(str(r4,tcr.valence(rcontext))) 1612 dnl __ifdef(`rTOC') 1613 dnl __(ld rTOC,8(nargs)) 1614 dnl __(ld nargs,0(nargs)) 1615 dnl __else 1616 dnl __(mov rcontext,#0) 1617 dnl __endif 1618 dnl LocalLabelPrefix`'ffcall_setup: 1619 dnl __(mtctr nargs) 1620 dnl __(ldr r3,[sp,#c_frame.param0]) 1621 dnl __(ldr r4,[sp,#c_frame.param1]) 1622 dnl __(ldr r5,[sp,#c_frame.param2]) 1623 dnl __(ldr r6,[sp,#c_frame.param3]) 1624 dnl __(ldr r7,[sp,#c_frame.param4]) 1625 dnl __(ldr r8,[sp,#c_frame.param5]) 1626 dnl __(ldr r9,[sp,#c_frame.param6]) 1627 dnl __(ldr r10,[sp,#c_frame.param7]) 1628 dnl /* Darwin is allegedly very picky about what register points */ 1629 dnl /* to the function on entry. */ 1630 dnl __(mov r12,nargs) 1631 dnl LocalLabelPrefix`'ffcall_setup_end: 1632 dnl LocalLabelPrefix`'ffcall_call: 1633 dnl __(bctrl) 1634 dnl LocalLabelPrefix`'ffcall_call_end: 1635 dnl /* C should have preserved save0 (= rcontext) for us. */ 1636 dnl __(ldr sp,[sp,#0]) 1637 dnl __(mov imm2,save0) 1638 dnl __(ldr vsp,[sp,#lisp_frame.savevsp]) 1639 dnl __(mov rzero,#0) 1640 dnl __(mov loc_pc,rzero) 1641 dnl __(mov arg_x,#nil_value) 1642 dnl __(mov arg_y,#nil_value) 1643 dnl __(mov arg_z,#nil_value) 1644 dnl __(mov temp0,#nil_value) 1645 dnl __(mov temp1,#nil_value) 1646 dnl __(mov temp2,#nil_value) 1647 dnl __(mov temp3,#nil_value) 1648 dnl __(mov fn,#nil_value) 1649 dnl __(mov rcontext,imm2) 1650 dnl __(mov imm2,#TCR_STATE_LISP) 1651 dnl __(ldr tsp,[rcontext,#tcr.save_tsp]) 1652 dnl __(mov save0,#0) 1653 dnl __(mov save1,#0) 1654 dnl __(mov save2,#0) 1655 dnl __(mov save3,#0) 1656 dnl __(mov save4,#0) 1657 dnl __(mov save5,#0) 1658 dnl __(mov save6,#0) 1659 dnl __(mov save7,#0) 1660 dnl __(mov allocptr,#-dnode_size) 1661 dnl __(mov allocbase,#-dnode_size) 1662 dnl __(str(imm2,tcr.valence(rcontext))) 1663 dnl __(vpop_saveregs()) 1664 dnl __(ldr allocptr,[rcontext,#tcr.save_allocptr]) 1665 dnl __(ldr allocbase,[rcontext,#tcr.save_allocbase]) 1666 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 1667 dnl __(mtlr loc_pc) 1668 dnl __(ldr fn,[sp,#lisp_frame.savefn]) 1669 dnl __(mffs f0) 1670 dnl __(stfd f0,8(sp)) 1671 dnl __(lwz imm3,12(sp)) /* imm3 = FPSCR after call */ 1672 dnl __(clrrwi imm2,imm3,8) 1673 dnl __(discard_lisp_frame()) 1674 dnl __(str(imm2,tcr.ffi_exception(rcontext))) 1675 dnl __(lfd f0,tcr.lisp_fpscr(rcontext)) 1676 dnl __(mtfsf 0xff,f0) 1677 dnl __(check_pending_interrupt(`cr1')) 1678 dnl __(mtxer rzero) 1679 dnl __(mtctr rzero) 1680 dnl __ifdef(`PPC64') 1681 dnl __ifdef(`DARWIN') 1682 dnl __(mov imm3,#1<<TCR_FLAG_BIT_FOREIGN_EXCEPTION) 1683 dnl __(ld imm4,tcr.flags(rcontext)) 1684 dnl __(and. imm3,imm3,imm4) 1685 dnl __(bne cr0,0f) 1686 dnl __endif 1687 dnl __endif 1688 dnl __(bx lr) 1689 dnl __ifdef(`PPC64') 1690 dnl __ifdef(`DARWIN') 1691 dnl 0: /* Got here because TCR_FLAG_BIT_FOREIGN_EXCEPTION */ 1692 dnl /* was set in tcr.flags. Clear that bit. */ 1693 dnl __(andc imm4,imm4,imm3) 1694 dnl __(std imm4,tcr.flags(rcontext)) 1695 dnl /* Unboxed foreign exception (likely an NSException) in %imm0. */ 1696 dnl /* Box it, then signal a lisp error. */ 1697 dnl __(mov imm1,#macptr_header) 1698 dnl __(Misc_Alloc_Fixed(arg_z,imm1,macptr.size)) 1699 dnl __(std imm0,macptr.address(arg_z)) 1700 dnl __(mov arg_y,#XFOREIGNEXCEPTION) 1701 dnl __(set_nargs(2)) 1702 dnl __(b _SPksignalerr) 1703 dnl /* Handle exceptions, for ObjC 2.0 */ 1704 dnl LocalLabelPrefix`'ffcallLandingPad: 1705 dnl __(mov save1,r3) 1706 dnl __(cmpdi r4,1) 1707 dnl __(beq 1f) 1708 dnl LocalLabelPrefix`'ffcallUnwindResume: 1709 dnl __(ref_global(r12,unwind_resume)) 1710 dnl __(mtctr r12) 1711 dnl __(bctrl) 1712 dnl LocalLabelPrefix`'ffcallUnwindResume_end: 1713 dnl 1: __(mov r3,save1) 1714 dnl LocalLabelPrefix`'ffcallBeginCatch: 1715 dnl __(ref_global(r12,objc2_begin_catch)) 1716 dnl __(mtctr r12) 1717 dnl __(bctrl) 1718 dnl LocalLabelPrefix`'ffcallBeginCatch_end: 1719 dnl __(ld save1,0(r3)) /* indirection is necessary because we don't provide type info in lsda */ 1720 dnl LocalLabelPrefix`'ffcallEndCatch: 1721 dnl __(ref_global(r12,objc2_end_catch)) 1722 dnl __(mtctr r12) 1723 dnl __(bctrl) 1724 dnl LocalLabelPrefix`'ffcallEndCatch_end: 1725 dnl __(ref_global(r12,get_tcr)) 1726 dnl __(mtctr r12) 1727 dnl __(mov imm0,#1) 1728 dnl __(bctrl) 1729 dnl __(ld imm2,tcr.flags(imm0)) 1730 dnl __(ori imm2,imm2,1<<TCR_FLAG_BIT_FOREIGN_EXCEPTION) 1731 dnl __(std imm2,tcr.flags(imm0)) 1732 dnl __(mov imm0,save1) 1733 dnl __(b LocalLabelPrefix`'ffcall_call_end) 1734 dnl LocalLabelPrefix`'ffcall_end: 1735 dnl 1736 dnl .section __DATA,__gcc_except_tab 1737 dnl .align 3 1738 dnl LLSDA1: 1739 dnl .byte 0xff /* @LPStart format (omit) */ 1740 dnl .byte 0x0 /* @TType format (absolute) */ 1741 dnl .byte 0x4d /* uleb128 0x4d; @TType base offset */ 1742 dnl .byte 0x3 /* call-site format (udata4) */ 1743 dnl .byte 0x41 /* uleb128 0x41; Call-site table length */ 1744 dnl 1745 dnl .long Lffcall_setup-Lffcall /* region 0 start */ 1746 dnl .long Lffcall_setup_end-Lffcall_setup /* length */ 1747 dnl .long 0x0 /* landing pad */ 1748 dnl .byte 0x0 /* uleb128 0x0; action */ 1749 dnl 1750 dnl .long Lffcall_call-Lffcall /* region 1 start */ 1751 dnl .long Lffcall_call_end-Lffcall_call /* length */ 1752 dnl .long LffcallLandingPad-Lffcall /* landing pad */ 1753 dnl .byte 0x1 /* uleb128 0x1; action */ 1754 dnl 1755 dnl .long LffcallUnwindResume-Lffcall /* region 2 start */ 1756 dnl .long LffcallUnwindResume_end-LffcallUnwindResume /* length */ 1757 dnl .long 0x0 /* landing pad */ 1758 dnl .byte 0x0 /* uleb128 0x0; action */ 1759 dnl 1760 dnl .long LffcallBeginCatch-Lffcall /* region 3 start */ 1761 dnl .long LffcallBeginCatch_end-LffcallBeginCatch /* length */ 1762 dnl .long 0 /* landing pad */ 1763 dnl .byte 0x0 /* uleb128 0x0; action */ 1764 dnl 1765 dnl .long LffcallEndCatch-Lffcall 1766 dnl .long LffcallEndCatch_end-LffcallEndCatch /* length */ 1767 dnl .long 0x0 /* landing pad */ 1768 dnl .byte 0x0 /* uleb128 0x0; action */ 1769 dnl 1770 dnl .byte 0x1 /* Action record table */ 1771 dnl .byte 0x0 1772 dnl .align 3 1773 dnl .quad 0 /* _OBJC_EHTYPE_$_NSException */ 1774 dnl .text 1775 dnl __endif 1776 dnl __endif 1777 dnl 1778 dnl /* Just like poweropen_ffcall, only we save all argument(result) 1779 dnl registers in a buffer passed in arg_y on entry before returning 1780 dnl to lisp. (We have to do this in the ffcall glue here, because 1781 dnl r9 and r10 - at least - are overloaded as dedicated lisp registers */ 1782 dnl _spentry(poweropen_ffcall_return_registers) 1783 dnl LocalLabelPrefix`'ffcall_return_registers: 1784 dnl __(mflr loc_pc) 1785 dnl __(vpush_saveregs()) /* Now we can use save0-save7 to point to stacks */ 1786 dnl __(ldr save7,[arg_y,#macptr.address]) 1787 dnl __(mov save0,rcontext) /* or address globals. */ 1788 dnl __(extract_typecode(imm0,arg_z)) 1789 dnl __(cmpri(cr7,imm0,subtag_macptr)) 1790 dnl __(ldr save1,[sp,#0]) /* bottom of reserved lisp frame */ 1791 dnl __(la save2,-lisp_frame.size(save1)) /* top of lisp frame */ 1792 dnl __(zero_doublewords save2,0,lisp_frame.size) 1793 dnl __(str(save1,lisp_frame.backlink(save2))) 1794 dnl __(str(save2,c_frame.backlink(sp))) 1795 dnl __(str(fn,lisp_frame.savefn(save2))) 1796 dnl __(str(loc_pc,lisp_frame.savelr(save2))) 1797 dnl __(str(vsp,lisp_frame.savevsp(save2))) 1798 dnl __(mov nargs,arg_z) 1799 dnl __(bne cr7,1f) 1800 dnl __(ldr nargs,[arg_z,#macptr.address]) 1801 dnl 1: 1802 dnl __(ldr save3,[rcontext,#tcr.cs_area]) 1803 dnl __(str(save2,area.active(save3))) 1804 dnl __(str(allocptr,tcr.save_allocptr(rcontext))) 1805 dnl __(str(allocbase,tcr.save_allocbase(rcontext))) 1806 dnl __(str(tsp,tcr.save_tsp(rcontext))) 1807 dnl __(str(vsp,tcr.save_vsp(rcontext))) 1808 dnl __(str(rzero,tcr.ffi_exception(rcontext))) 1809 dnl __(mffs f0) 1810 dnl __(stfd f0,tcr.lisp_fpscr(rcontext)) /* remember lisp's fpscr */ 1811 dnl __(mtfsf 0xff,fp_zero) /* zero foreign fpscr */ 1812 dnl __(mov r4,#TCR_STATE_FOREIGN) 1813 dnl __(str(r4,tcr.valence(rcontext))) 1814 dnl __ifdef(`rTOC') 1815 dnl __(ld rTOC,8(nargs)) 1816 dnl __(ld nargs,0(nargs)) 1817 dnl __else 1818 dnl __(mov rcontext,#0) 1819 dnl __endif 1820 dnl LocalLabelPrefix`'ffcall_return_registers_setup: 1821 dnl __(mtctr nargs) 1822 dnl __(ldr r3,[sp,#c_frame.param0]) 1823 dnl __(ldr r4,[sp,#c_frame.param1]) 1824 dnl __(ldr r5,[sp,#c_frame.param2]) 1825 dnl __(ldr r6,[sp,#c_frame.param3]) 1826 dnl __(ldr r7,[sp,#c_frame.param4]) 1827 dnl __(ldr r8,[sp,#c_frame.param5]) 1828 dnl __(ldr r9,[sp,#c_frame.param6]) 1829 dnl __(ldr r10,[sp,#c_frame.param7]) 1830 dnl /* Darwin is allegedly very picky about what register points */ 1831 dnl /* to the function on entry. */ 1832 dnl __(mov r12,nargs) 1833 dnl LocalLabelPrefix`'ffcall_return_registers_setup_end: 1834 dnl LocalLabelPrefix`'ffcall_return_registers_call: 1835 dnl __(bctrl) 1836 dnl LocalLabelPrefix`'ffcall_return_registers_call_end: 1837 dnl __(str(r3,0*node_size(save7))) 1838 dnl __(str(r4,1*node_size(save7))) 1839 dnl __(str(r5,2*node_size(save7))) 1840 dnl __(str(r6,3*node_size(save7))) 1841 dnl __(str(r7,4*node_size(save7))) 1842 dnl __(str(r8,5*node_size(save7))) 1843 dnl __(str(r9,6*node_size(save7))) 1844 dnl __(str(r10,7*node_size(save7))) 1845 dnl __(stfd f1,((8*node_size)+(0*8))(save7)) 1846 dnl __(stfd f2,((8*node_size)+(1*8))(save7)) 1847 dnl __(stfd f3,((8*node_size)+(2*8))(save7)) 1848 dnl __(stfd f4,((8*node_size)+(3*8))(save7)) 1849 dnl __(stfd f5,((8*node_size)+(4*8))(save7)) 1850 dnl __(stfd f6,((8*node_size)+(5*8))(save7)) 1851 dnl __(stfd f7,((8*node_size)+(6*8))(save7)) 1852 dnl __(stfd f8,((8*node_size)+(7*8))(save7)) 1853 dnl __(stfd f9,((8*node_size)+(8*8))(save7)) 1854 dnl __(stfd f10,((8*node_size)+(9*8))(save7)) 1855 dnl __(stfd f11,((8*node_size)+(10*8))(save7)) 1856 dnl __(stfd f12,((8*node_size)+(11*8))(save7)) 1857 dnl __(stfd f13,((8*node_size)+(12*8))(save7)) 1858 dnl /* C should have preserved save0 (= rcontext) for us. */ 1859 dnl __(ldr sp,[sp,#0]) 1860 dnl __(mov imm2,save0) 1861 dnl __(ldr vsp,[sp,#lisp_frame.savevsp]) 1862 dnl __(mov rzero,#0) 1863 dnl __(mov loc_pc,rzero) 1864 dnl __(mov arg_x,#nil_value) 1865 dnl __(mov arg_y,#nil_value) 1866 dnl __(mov arg_z,#nil_value) 1867 dnl __(mov temp0,#nil_value) 1868 dnl __(mov temp1,#nil_value) 1869 dnl __(mov temp2,#nil_value) 1870 dnl __(mov temp3,#nil_value) 1871 dnl __(mov fn,#nil_value) 1872 dnl __(mov rcontext,imm2) 1873 dnl __(mov imm2,#TCR_STATE_LISP) 1874 dnl __(ldr tsp,[rcontext,#tcr.save_tsp]) 1875 dnl __(mov save0,#0) 1876 dnl __(mov save1,#0) 1877 dnl __(mov save2,#0) 1878 dnl __(mov save3,#0) 1879 dnl __(mov save4,#0) 1880 dnl __(mov save5,#0) 1881 dnl __(mov save6,#0) 1882 dnl __(mov save7,#0) 1883 dnl __(mov allocptr,#-dnode_size) 1884 dnl __(mov allocbase,#-dnode_size) 1885 dnl __(str(imm2,tcr.valence(rcontext))) 1886 dnl __(vpop_saveregs()) 1887 dnl __(ldr allocptr,[rcontext,#tcr.save_allocptr]) 1888 dnl __(ldr allocbase,[rcontext,#tcr.save_allocbase]) 1889 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 1890 dnl __(mtlr loc_pc) 1891 dnl __(ldr fn,[sp,#lisp_frame.savefn]) 1892 dnl __(mffs f0) 1893 dnl __(stfd f0,8(sp)) 1894 dnl __(lwz imm3,12(sp)) /* imm3 = FPSCR after call */ 1895 dnl __(clrrwi imm2,imm3,8) 1896 dnl __(discard_lisp_frame()) 1897 dnl __(str(imm2,tcr.ffi_exception(rcontext))) 1898 dnl __(lfd f0,tcr.lisp_fpscr(rcontext)) 1899 dnl __(mtfsf 0xff,f0) 1900 dnl __(check_pending_interrupt(`cr1')) 1901 dnl __(mtxer rzero) 1902 dnl __(mtctr rzero) 1903 dnl __ifdef(`DARWIN') 1904 dnl __ifdef(`PPC64') 1905 dnl __(mov imm3,#1<<TCR_FLAG_BIT_FOREIGN_EXCEPTION) 1906 dnl __(ld imm4,tcr.flags(rcontext)) 1907 dnl __(and. imm3,imm3,imm4) 1908 dnl __(bne 0f) 1909 dnl __endif 1910 dnl __endif 1911 dnl __(bx lr) 1912 dnl 1913 dnl __ifdef(`DARWIN') 1914 dnl __ifdef(`PPC64') 1915 dnl 0: /* Got here because TCR_FLAG_BIT_FOREIGN_EXCEPTION */ 1916 dnl /* was set in tcr.flags. Clear that bit. */ 1917 dnl __(andc imm4,imm4,imm3) 1918 dnl __(std imm4,tcr.flags(rcontext)) 1919 dnl /* Unboxed foreign exception (likely an NSException) in %imm0. */ 1920 dnl /* Box it, then signal a lisp error. */ 1921 dnl __(mov imm1,#macptr_header) 1922 dnl __(Misc_Alloc_Fixed(arg_z,imm1,macptr.size)) 1923 dnl __(std imm0,macptr.address(arg_z)) 1924 dnl __(mov arg_y,#XFOREIGNEXCEPTION) 1925 dnl __(set_nargs(2)) 1926 dnl __(b _SPksignalerr) 1927 dnl /* Handle exceptions, for ObjC 2.0 */ 1928 dnl LocalLabelPrefix`'ffcall_return_registersLandingPad: 1929 dnl __(mov save1,r3) 1930 dnl __(cmpdi r4,1) 1931 dnl __(beq 1f) 1932 dnl LocalLabelPrefix`'ffcall_return_registersUnwindResume: 1933 dnl __(ref_global(r12,unwind_resume)) 1934 dnl __(mtctr r12) 1935 dnl __(bctrl) 1936 dnl LocalLabelPrefix`'ffcall_return_registersUnwindResume_end: 1937 dnl 1: __(mov r3,save1) 1938 dnl LocalLabelPrefix`'ffcall_return_registersBeginCatch: 1939 dnl __(ref_global(r12,objc2_begin_catch)) 1940 dnl __(mtctr r12) 1941 dnl __(bctrl) 1942 dnl LocalLabelPrefix`'ffcall_return_registersBeginCatch_end: 1943 dnl __(ld save1,0(r3)) /* indirection is necessary because we don't provide type info in lsda */ 1944 dnl LocalLabelPrefix`'ffcall_return_registersEndCatch: 1945 dnl __(ref_global(r12,objc2_end_catch)) 1946 dnl __(mtctr r12) 1947 dnl __(bctrl) 1948 dnl LocalLabelPrefix`'ffcall_return_registersEndCatch_end: 1949 dnl __(ref_global(r12,get_tcr)) 1950 dnl __(mtctr r12) 1951 dnl __(mov imm0,#1) 1952 dnl __(bctrl) 1953 dnl __(ld imm2,tcr.flags(imm0)) 1954 dnl __(ori imm2,imm2,1<<TCR_FLAG_BIT_FOREIGN_EXCEPTION) 1955 dnl __(std imm2,tcr.flags(imm0)) 1956 dnl __(mov imm0,save1) 1957 dnl __(b LocalLabelPrefix`'ffcall_return_registers_call_end) 1958 dnl LocalLabelPrefix`'ffcall_return_registers_end: 1959 dnl .section __DATA,__gcc_except_tab 1960 dnl .align 3 1961 dnl LLSDA2: 1962 dnl .byte 0xff /* @LPStart format (omit) */ 1963 dnl .byte 0x0 /* @TType format (absolute) */ 1964 dnl .byte 0x4d /* uleb128 0x4d; @TType base offset */ 1965 dnl .byte 0x3 /* call-site format (udata4) */ 1966 dnl .byte 0x41 /* uleb128 0x41; Call-site table length */ 1967 dnl 1968 dnl .long Lffcall_return_registers_setup-Lffcall_return_registers /* region 0 start */ 1969 dnl .long Lffcall_return_registers_setup_end-Lffcall_return_registers_setup /* length */ 1970 dnl .long 0x0 /* landing pad */ 1971 dnl .byte 0x0 /* uleb128 0x0; action */ 1972 dnl 1973 dnl .long Lffcall_return_registers_call-Lffcall_return_registers /* region 1 start */ 1974 dnl .long Lffcall_return_registers_call_end-Lffcall_return_registers_call /* length */ 1975 dnl .long Lffcall_return_registersLandingPad-Lffcall_return_registers /* landing pad */ 1976 dnl .byte 0x1 /* uleb128 0x1; action */ 1977 dnl 1978 dnl .long Lffcall_return_registersUnwindResume-Lffcall_return_registers /* region 2 start */ 1979 dnl .long Lffcall_return_registersUnwindResume_end-Lffcall_return_registersUnwindResume /* length */ 1980 dnl .long 0x0 /* landing pad */ 1981 dnl .byte 0x0 /* uleb128 0x0; action */ 1982 dnl 1983 dnl .long Lffcall_return_registersBeginCatch-Lffcall_return_registers /* region 3 start */ 1984 dnl .long Lffcall_return_registersBeginCatch_end-Lffcall_return_registersBeginCatch /* length */ 1985 dnl .long 0 /* landing pad */ 1986 dnl .byte 0x0 /* uleb128 0x0; action */ 1987 dnl 1988 dnl .long Lffcall_return_registersEndCatch-Lffcall_return_registers 1989 dnl .long Lffcall_return_registersEndCatch_end-Lffcall_return_registersEndCatch /* length */ 1990 dnl .long 0x0 /* landing pad */ 1991 dnl .byte 0x0 /* uleb128 0x0; action */ 1992 dnl .byte 0x1 /* Action record table */ 1993 dnl .byte 0x0 1994 dnl .align 3 1995 dnl .quad 0 /* _OBJC_EHTYPE_$_NSException */ 1996 dnl .text 1997 dnl __endif 1998 dnl __endif 1999 dnl 2000 dnl 2001 dnl 2002 dnl /* Signal an error synchronously, via %ERR-DISP. */ 2003 dnl /* If %ERR-DISP isn't fbound, it'd be nice to print a message */ 2004 dnl /* on the C runtime stderr. */ 2005 dnl 2006 dnl _spentry(ksignalerr) 2007 dnl __(mov fname,#nrs.errdisp) 2008 dnl __(jump_fname) 2009 dnl 1509 dnl __(bl _SPconslist) 1510 dnl __(mov arg_y,#XBADKEYS) 1511 dnl __(set_nargs(2)) 1512 dnl __(b _SPksignalerr) 1513 dnl 1514 /* Signal an error synchronously, via %ERR-DISP. */ 1515 /* If %ERR-DISP isn't fbound, it'd be nice to print a message */ 1516 /* on the C runtime stderr. */ 1517 1518 _spentry(ksignalerr) 1519 __(ref_nrs_symbol(fname,errdisp)) 1520 __(jump_fname) 1521 2010 1522 dnl /* As in the heap-consed cases, only stack-cons the &rest arg */ 2011 1523 dnl _spentry(stack_rest_arg) 2012 dnl __(mov imm0,#0)2013 dnl __(vpush_argregs())1524 dnl __(mov imm0,#0) 1525 dnl __(vpush_argregs()) 2014 1526 dnl __(b _SPstack_cons_rest_arg) 2015 1527 dnl 2016 dnl 1528 dnl 2017 1529 dnl _spentry(req_stack_rest_arg) 2018 dnl __(vpush_argregs())1530 dnl __(vpush_argregs()) 2019 1531 dnl __(b _SPstack_cons_rest_arg) 2020 dnl 1532 dnl 2021 1533 dnl _spentry(stack_cons_rest_arg) 2022 dnl __(sub imm1,nargs,imm0)2023 dnl __(cmpri(cr0,imm1,0))2024 dnl __(cmpri(cr1,imm1,(4096-dnode_size)/2))2025 dnl __(mov arg_z,#nil_value)2026 dnl __(ble cr0,2f)/* always temp-push something. */2027 dnl __(bge cr1,3f)2028 dnl __(add imm1,imm1,imm1)2029 dnl __(dnode_align(imm2,imm1,tsp_frame.fixed_overhead))2030 dnl __(TSP_Alloc_Var_Boxed(imm2,imm3))2031 dnl __(la imm0,tsp_frame.data_offset+fulltag_cons(tsp))1534 dnl __(sub imm1,nargs,imm0) 1535 dnl __(cmpri(cr0,imm1,0)) 1536 dnl __(cmpri(cr1,imm1,(4096-dnode_size)/2)) 1537 dnl __(mov arg_z,#nil_value) 1538 dnl __(ble cr0,2f) /* always temp-push something. */ 1539 dnl __(bge cr1,3f) 1540 dnl __(add imm1,imm1,imm1) 1541 dnl __(dnode_align(imm2,imm1,tsp_frame.fixed_overhead)) 1542 dnl __(TSP_Alloc_Var_Boxed(imm2,imm3)) 1543 dnl __(la imm0,tsp_frame.data_offset+fulltag_cons(tsp)) 2032 1544 dnl 1: 2033 dnl __(cmpri(cr0,imm1,cons.size))/* last time through ? */2034 dnl __(subi imm1,imm1,cons.size)2035 dnl __(vpop(arg_x))2036 dnl __(_rplacd(imm0,arg_z))2037 dnl __(_rplaca(imm0,arg_x))2038 dnl __(mov arg_z,imm0)2039 dnl __(la imm0,cons.size(imm0))2040 dnl __(bne cr0,1b)2041 dnl __(vpush1(arg_z))2042 dnl __(bx lr)1545 dnl __(cmpri(cr0,imm1,cons.size)) /* last time through ? */ 1546 dnl __(subi imm1,imm1,cons.size) 1547 dnl __(vpop(arg_x)) 1548 dnl __(_rplacd(imm0,arg_z)) 1549 dnl __(_rplaca(imm0,arg_x)) 1550 dnl __(mov arg_z,imm0) 1551 dnl __(la imm0,cons.size(imm0)) 1552 dnl __(bne cr0,1b) 1553 dnl __(vpush1(arg_z)) 1554 dnl __(bx lr) 2043 1555 dnl 2: 2044 dnl __(TSP_Alloc_Fixed_Unboxed(0))2045 dnl __(vpush1(arg_z))2046 dnl __(bx lr)1556 dnl __(TSP_Alloc_Fixed_Unboxed(0)) 1557 dnl __(vpush1(arg_z)) 1558 dnl __(bx lr) 2047 1559 dnl 3: 2048 dnl __(TSP_Alloc_Fixed_Unboxed(0)) 2049 dnl __(b _SPheap_cons_rest_arg) 2050 dnl 2051 dnl /* This was trying to swap exception ports to work around Darwin JNI lossage. 2052 dnl It's tended to bitrot, and we have another way to do that now. 2053 dnl */ 2054 dnl _spentry(poweropen_callbackX) 2055 dnl .long 0x7c800008 /* debug trap */ 2056 dnl 1560 dnl __(TSP_Alloc_Fixed_Unboxed(0)) 1561 dnl __(b _SPheap_cons_rest_arg) 1562 dnl 1563 2057 1564 dnl /* Prepend all but the first two (closure code, fn) and last two */ 2058 1565 dnl /* (function name, lfbits) elements of nfn to the "arglist". */ … … 2061 1568 dnl /* even in cases where no closure object is created. */ 2062 1569 dnl _spentry(call_closure) 2063 dnl __(cmpri(cr0,nargs,nargregs<<fixnumshift))2064 dnl __(cmpri(cr1,nargs,fixnum_one))2065 dnl __(vector_length(imm0,nfn,imm0))2066 dnl __(subi imm0,imm0,4<<fixnumshift) /* imm0 = inherited arg count */2067 dnl __(mov imm1,#misc_data_offset+(2<<fixnumshift)) /* point to 1st arg */2068 dnl __(mov imm4,#nil_value)2069 dnl __(ble+ cr0,local_label(no_insert))2070 dnl /* Some arguments have already been vpushed. Vpush imm0's worth */2071 dnl /* of NILs, copy those arguments that have already been vpushed from */2072 dnl /* the old TOS to the new, then insert all of the inerited args */2073 dnl /* and go to the function. */2074 dnl __(mov imm2,#0)1570 dnl __(cmpri(cr0,nargs,nargregs<<fixnumshift)) 1571 dnl __(cmpri(cr1,nargs,fixnum_one)) 1572 dnl __(vector_length(imm0,nfn,imm0)) 1573 dnl __(subi imm0,imm0,4<<fixnumshift) /* imm0 = inherited arg count */ 1574 dnl __(mov imm1,#misc_data_offset+(2<<fixnumshift)) /* point to 1st arg */ 1575 dnl __(mov imm4,#nil_value) 1576 dnl __(ble+ cr0,local_label(no_insert)) 1577 dnl /* Some arguments have already been vpushed. Vpush imm0's worth */ 1578 dnl /* of NILs, copy those arguments that have already been vpushed from */ 1579 dnl /* the old TOS to the new, then insert all of the inerited args */ 1580 dnl /* and go to the function. */ 1581 dnl __(mov imm2,#0) 2075 1582 dnl local_label(push_nil_loop): 2076 dnl __(addi imm2,imm2,fixnum_one)2077 dnl __(cmpr(cr2,imm2,imm0))2078 dnl __(vpush1(imm4))2079 dnl __(bne cr2,local_label(push_nil_loop))2080 dnl 2081 dnl __(mov imm3,vsp)2082 dnl __(add imm4,vsp,imm0)2083 dnl __(subi imm2,nargs,nargregs<<fixnumshift)1583 dnl __(addi imm2,imm2,fixnum_one) 1584 dnl __(cmpr(cr2,imm2,imm0)) 1585 dnl __(vpush1(imm4)) 1586 dnl __(bne cr2,local_label(push_nil_loop)) 1587 dnl 1588 dnl __(mov imm3,vsp) 1589 dnl __(add imm4,vsp,imm0) 1590 dnl __(subi imm2,nargs,nargregs<<fixnumshift) 2084 1591 dnl local_label(copy_already_loop): 2085 dnl __(cmpri(cr2,imm2,fixnum_one))2086 dnl __(subi imm2,imm2,fixnum_one)2087 dnl __(ldr fname,[imm4,#0])2088 dnl __(addi imm4,imm4,fixnum_one)2089 dnl __(str(fname,0(imm3)))2090 dnl __(addi imm3,imm3,fixnum_one)2091 dnl __(bne cr2,local_label(copy_already_loop))1592 dnl __(cmpri(cr2,imm2,fixnum_one)) 1593 dnl __(subi imm2,imm2,fixnum_one) 1594 dnl __(ldr fname,[imm4,#0]) 1595 dnl __(addi imm4,imm4,fixnum_one) 1596 dnl __(str(fname,0(imm3))) 1597 dnl __(addi imm3,imm3,fixnum_one) 1598 dnl __(bne cr2,local_label(copy_already_loop)) 2092 1599 dnl 2093 1600 dnl local_label(insert_loop): 2094 dnl __(cmpri(cr2,imm0,fixnum_one))2095 dnl __(ldrx(fname,nfn,imm1))2096 dnl __(addi imm1,imm1,fixnum_one)2097 dnl __(addi nargs,nargs,fixnum_one)2098 dnl __(subi imm0,imm0,fixnum_one)2099 dnl __(push(fname,imm4))2100 dnl __(bne cr2,local_label(insert_loop))2101 dnl __(b local_label(go))1601 dnl __(cmpri(cr2,imm0,fixnum_one)) 1602 dnl __(ldrx(fname,nfn,imm1)) 1603 dnl __(addi imm1,imm1,fixnum_one) 1604 dnl __(addi nargs,nargs,fixnum_one) 1605 dnl __(subi imm0,imm0,fixnum_one) 1606 dnl __(push(fname,imm4)) 1607 dnl __(bne cr2,local_label(insert_loop)) 1608 dnl __(b local_label(go)) 2102 1609 dnl local_label(no_insert): 2103 dnl /* nargregs or fewer args were already vpushed. */2104 dnl /* if exactly nargregs, vpush remaining inherited vars. */2105 dnl __(add imm2,imm1,imm0)2106 dnl __(bne cr0,local_label(set_regs))1610 dnl /* nargregs or fewer args were already vpushed. */ 1611 dnl /* if exactly nargregs, vpush remaining inherited vars. */ 1612 dnl __(add imm2,imm1,imm0) 1613 dnl __(bne cr0,local_label(set_regs)) 2107 1614 dnl local_label(vpush_remaining): 2108 dnl __(cmpri(cr2,imm0,fixnum_one))2109 dnl __(ldrx(fname,nfn,imm1))2110 dnl __(addi imm1,imm1,fixnum_one)2111 dnl __(vpush1(fname))2112 dnl __(subi imm0,imm0,fixnum_one)2113 dnl __(addi nargs,nargs,fixnum_one)2114 dnl __(bne cr2,local_label(vpush_remaining))2115 dnl __(b local_label(go))1615 dnl __(cmpri(cr2,imm0,fixnum_one)) 1616 dnl __(ldrx(fname,nfn,imm1)) 1617 dnl __(addi imm1,imm1,fixnum_one) 1618 dnl __(vpush1(fname)) 1619 dnl __(subi imm0,imm0,fixnum_one) 1620 dnl __(addi nargs,nargs,fixnum_one) 1621 dnl __(bne cr2,local_label(vpush_remaining)) 1622 dnl __(b local_label(go)) 2116 1623 dnl local_label(set_regs): 2117 dnl /* if nargs was > 1 (and we know that it was < 3), it must have */2118 dnl /* been 2. Set arg_x, then vpush the remaining args. */2119 dnl __(ble cr1,local_label(set_y_z))1624 dnl /* if nargs was > 1 (and we know that it was < 3), it must have */ 1625 dnl /* been 2. Set arg_x, then vpush the remaining args. */ 1626 dnl __(ble cr1,local_label(set_y_z)) 2120 1627 dnl local_label(set_arg_x): 2121 dnl __(subi imm0,imm0,fixnum_one)2122 dnl __(cmpri(cr0,imm0,0))2123 dnl __(subi imm2,imm2,fixnum_one)2124 dnl __(ldrx(arg_x,nfn,imm2))2125 dnl __(addi nargs,nargs,fixnum_one)2126 dnl __(bne cr0,local_label(vpush_remaining))2127 dnl __(b local_label(go))2128 dnl /* Maybe set arg_y or arg_z, preceding args */1628 dnl __(subi imm0,imm0,fixnum_one) 1629 dnl __(cmpri(cr0,imm0,0)) 1630 dnl __(subi imm2,imm2,fixnum_one) 1631 dnl __(ldrx(arg_x,nfn,imm2)) 1632 dnl __(addi nargs,nargs,fixnum_one) 1633 dnl __(bne cr0,local_label(vpush_remaining)) 1634 dnl __(b local_label(go)) 1635 dnl /* Maybe set arg_y or arg_z, preceding args */ 2129 1636 dnl local_label(set_y_z): 2130 dnl __(bne cr1,local_label(set_arg_z))2131 dnl /* Set arg_y, maybe arg_x, preceding args */1637 dnl __(bne cr1,local_label(set_arg_z)) 1638 dnl /* Set arg_y, maybe arg_x, preceding args */ 2132 1639 dnl local_label(set_arg_y): 2133 dnl __(subi imm0,imm0,fixnum_one)2134 dnl __(cmpri(cr0,imm0,0))2135 dnl __(subi imm2,imm2,fixnum_one)2136 dnl __(ldrx(arg_y,nfn,imm2))2137 dnl __(addi nargs,nargs,fixnum_one)2138 dnl __(bne cr0,local_label(set_arg_x))2139 dnl __(b local_label(go))1640 dnl __(subi imm0,imm0,fixnum_one) 1641 dnl __(cmpri(cr0,imm0,0)) 1642 dnl __(subi imm2,imm2,fixnum_one) 1643 dnl __(ldrx(arg_y,nfn,imm2)) 1644 dnl __(addi nargs,nargs,fixnum_one) 1645 dnl __(bne cr0,local_label(set_arg_x)) 1646 dnl __(b local_label(go)) 2140 1647 dnl local_label(set_arg_z): 2141 dnl __(subi imm0,imm0,fixnum_one)2142 dnl __(cmpri(cr0,imm0,0))2143 dnl __(subi imm2,imm2,fixnum_one)2144 dnl __(ldrx(arg_z,nfn,imm2))2145 dnl __(addi nargs,nargs,fixnum_one)2146 dnl __(bne cr0,local_label(set_arg_y))1648 dnl __(subi imm0,imm0,fixnum_one) 1649 dnl __(cmpri(cr0,imm0,0)) 1650 dnl __(subi imm2,imm2,fixnum_one) 1651 dnl __(ldrx(arg_z,nfn,imm2)) 1652 dnl __(addi nargs,nargs,fixnum_one) 1653 dnl __(bne cr0,local_label(set_arg_y)) 2147 1654 dnl 2148 1655 dnl local_label(go): 2149 dnl __(vrefr(nfn,nfn,1))2150 dnl __(ldr loc_pc,[nfn,#_function.codevector])2151 dnl __(mtctr loc_pc)2152 dnl __(bctr)1656 dnl __(vrefr(nfn,nfn,1)) 1657 dnl __(ldr loc_pc,[nfn,#_function.codevector]) 1658 dnl __(mtctr loc_pc) 1659 dnl __(bctr) 2153 1660 dnl 2154 dnl /* This treats anything that's either */2155 dnl /* #+ppc32 (signed-byte 32), (unsigned-byte 32) */2156 dnl /* #+ppc64 (signed-byte 64), (unsigned-byte 64) */2157 dnl /* as if it denoted a "natural-sized" value. */2158 dnl /* Argument in arg_z, result in imm0. May use temp0. */2159 dnl _spentry(getxlong)2160 dnl __ifdef(`PPC64')2161 dnl __else2162 dnl __(extract_typecode(imm0,arg_z))2163 dnl __(cmpri(cr0,imm0,tag_fixnum))2164 dnl __(cmpri(cr1,imm0,subtag_bignum))2165 dnl __(unbox_fixnum(imm0,arg_z))2166 dnl __(beqlr cr0)2167 dnl __(mov temp0,arg_z)2168 dnl __(bne- cr1,local_label(error))2169 dnl __(getvheader(imm0,temp0))2170 dnl __(cmpri(cr1,imm0,one_digit_bignum_header))2171 dnl __(cmpri(cr7,imm0,two_digit_bignum_header))2172 dnl __(beq cr1,local_label(big1))2173 dnl __(beq cr7,local_label(big2))2174 dnl local_label(error):2175 dnl __(uuo_interr(error_object_not_integer,arg_z)) /* not quite right but what 68K MCL said */2176 dnl2177 dnl2178 dnl2179 dnl local_label(big2):2180 dnl __(vrefr(imm0,temp0,1)) /* sign digit must be 0 */2181 dnl __(cmpri(imm0,0))2182 dnl __(bne local_label(error))2183 dnl local_label(big1):2184 dnl __(vrefr(imm0,temp0,0))2185 dnl __(bx lr)2186 dnl2187 dnl2188 dnl __endif2189 1661 dnl 2190 1662 dnl /* Everything up to the last arg has been vpushed, nargs is set to */ … … 2194 1666 dnl /* ppc2-invoke-fn assumes that temp1 is preserved here. */ 2195 1667 dnl _spentry(spreadargz) 2196 dnl __ifdef(`PPC64') 2197 dnl __(extract_fulltag(imm1,arg_z)) 2198 dnl __(cmpri(cr1,imm1,fulltag_cons)) 2199 dnl __else 2200 dnl __(extract_lisptag(imm1,arg_z)) 2201 dnl __(cmpri(cr1,imm1,tag_list)) 2202 dnl __endif 2203 dnl __(cmpri(cr0,arg_z,nil_value)) 2204 dnl __(mov imm0,#0) 2205 dnl __(mov arg_y,arg_z) /* save in case of error */ 2206 dnl __(beq cr0,2f) 1668 dnl __(extract_lisptag(imm1,arg_z)) 1669 dnl __(cmpri(cr1,imm1,tag_list)) 1670 dnl __(cmpri(cr0,arg_z,nil_value)) 1671 dnl __(mov imm0,#0) 1672 dnl __(mov arg_y,arg_z) /* save in case of error */ 1673 dnl __(beq cr0,2f) 2207 1674 dnl 1: 2208 dnl __(bne- cr1,3f) 2209 dnl __(_car(arg_x,arg_z)) 2210 dnl __(_cdr(arg_z,arg_z)) 2211 dnl __(cmpri(cr0,arg_z,nil_value)) 2212 dnl __ifdef(`PPC64') 2213 dnl __(extract_fulltag(imm1,arg_z)) 2214 dnl __(cmpri(cr1,imm1,fulltag_cons)) 2215 dnl __else 2216 dnl __(extract_lisptag(imm1,arg_z)) 2217 dnl __(cmpri(cr1,imm1,tag_list)) 2218 dnl __endif 2219 dnl __(vpush1(arg_x)) 2220 dnl __(addi imm0,imm0,fixnum_one) 2221 dnl __(bne cr0,1b) 1675 dnl __(bne- cr1,3f) 1676 dnl __(_car(arg_x,arg_z)) 1677 dnl __(_cdr(arg_z,arg_z)) 1678 dnl __(cmpri(cr0,arg_z,nil_value)) 1679 dnl __(extract_lisptag(imm1,arg_z)) 1680 dnl __(cmpri(cr1,imm1,tag_list)) 1681 dnl __(vpush1(arg_x)) 1682 dnl __(addi imm0,imm0,fixnum_one) 1683 dnl __(bne cr0,1b) 2222 1684 dnl 2: 2223 dnl __(add. nargs,nargs,imm0)2224 dnl __(cmpri(cr2,nargs,2<<fixnumshift))2225 dnl __(beqlr- cr0)2226 dnl __(vpop(arg_z))2227 dnl __(bltlr cr2)2228 dnl __(vpop(arg_y))2229 dnl __(beqlr cr2)2230 dnl __(vpop(arg_x))2231 dnl __(bx lr)1685 dnl __(add. nargs,nargs,imm0) 1686 dnl __(cmpri(cr2,nargs,2<<fixnumshift)) 1687 dnl __(beqlr- cr0) 1688 dnl __(vpop(arg_z)) 1689 dnl __(bltlr cr2) 1690 dnl __(vpop(arg_y)) 1691 dnl __(beqlr cr2) 1692 dnl __(vpop(arg_x)) 1693 dnl __(bx lr) 2232 1694 dnl /* Discard whatever's been vpushed already, complain. */ 2233 dnl 3: 2234 dnl __(add vsp,vsp,imm0)2235 dnl __(mov arg_z,arg_y)/* recover original arg_z */2236 dnl __(mov arg_y,#XNOSPREAD)2237 dnl __(set_nargs(2))2238 dnl __(b _SPksignalerr)1695 dnl 3: 1696 dnl __(add vsp,vsp,imm0) 1697 dnl __(mov arg_z,arg_y) /* recover original arg_z */ 1698 dnl __(mov arg_y,#XNOSPREAD) 1699 dnl __(set_nargs(2)) 1700 dnl __(b _SPksignalerr) 2239 1701 dnl 2240 1702 dnl /* Tail-recursively funcall temp0. */ 2241 1703 dnl /* Pretty much the same as the tcallsym* cases above. */ 2242 1704 dnl _spentry(tfuncallgen) 2243 dnl __(cmpri(cr0,nargs,nargregs<<fixnumshift))2244 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr])2245 dnl __(ldr fn,[sp,#lisp_frame.savefn])2246 dnl __(mtlr loc_pc)2247 dnl __(ble cr0,2f)2248 dnl __(ldr imm0,[sp,#lisp_frame.savevsp])2249 dnl __(discard_lisp_frame())2250 dnl /* can use nfn (= temp2) as a temporary */2251 dnl __(subi imm1,nargs,nargregs<<fixnumshift)2252 dnl __(add imm1,imm1,vsp)1705 dnl __(cmpri(cr0,nargs,nargregs<<fixnumshift)) 1706 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 1707 dnl __(ldr fn,[sp,#lisp_frame.savefn]) 1708 dnl __(mtlr loc_pc) 1709 dnl __(ble cr0,2f) 1710 dnl __(ldr imm0,[sp,#lisp_frame.savevsp]) 1711 dnl __(discard_lisp_frame()) 1712 dnl /* can use nfn (= temp2) as a temporary */ 1713 dnl __(subi imm1,nargs,nargregs<<fixnumshift) 1714 dnl __(add imm1,imm1,vsp) 2253 1715 dnl 1: 2254 dnl __(ldru(temp2,-node_size(imm1)))2255 dnl __(cmpr(cr0,imm1,vsp))2256 dnl __(push(temp2,imm0))2257 dnl __(bne cr0,1b)2258 dnl __(mov vsp,imm0)2259 dnl __(do_funcall())1716 dnl __(ldru(temp2,-node_size(imm1))) 1717 dnl __(cmpr(cr0,imm1,vsp)) 1718 dnl __(push(temp2,imm0)) 1719 dnl __(bne cr0,1b) 1720 dnl __(mov vsp,imm0) 1721 dnl __(do_funcall()) 2260 1722 dnl 2: 2261 dnl __(ldr vsp,[sp,#lisp_frame.savevsp])2262 dnl __(discard_lisp_frame())2263 dnl __(do_funcall())1723 dnl __(ldr vsp,[sp,#lisp_frame.savevsp]) 1724 dnl __(discard_lisp_frame()) 1725 dnl __(do_funcall()) 2264 1726 dnl 2265 1727 dnl … … 2267 1729 dnl /* the current frame, then do funcall. */ 2268 1730 dnl _spentry(tfuncallslide) 2269 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr])2270 dnl __(ldr fn,[sp,#lisp_frame.savefn])2271 dnl __(ldr imm0,[sp,#lisp_frame.savevsp])2272 dnl __(discard_lisp_frame())2273 dnl /* can use nfn (= temp2) as a temporary */2274 dnl __(subi imm1,nargs,nargregs<<fixnumshift)2275 dnl __(add imm1,imm1,vsp)2276 dnl __(mtlr loc_pc)1731 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 1732 dnl __(ldr fn,[sp,#lisp_frame.savefn]) 1733 dnl __(ldr imm0,[sp,#lisp_frame.savevsp]) 1734 dnl __(discard_lisp_frame()) 1735 dnl /* can use nfn (= temp2) as a temporary */ 1736 dnl __(subi imm1,nargs,nargregs<<fixnumshift) 1737 dnl __(add imm1,imm1,vsp) 1738 dnl __(mtlr loc_pc) 2277 1739 dnl 1: 2278 dnl __(ldru(temp2,-node_size(imm1)))2279 dnl __(cmpr(cr0,imm1,vsp))2280 dnl __(push(temp2,imm0))2281 dnl __(bne cr0,1b)2282 dnl __(mov vsp,imm0)2283 dnl __(do_funcall())1740 dnl __(ldru(temp2,-node_size(imm1))) 1741 dnl __(cmpr(cr0,imm1,vsp)) 1742 dnl __(push(temp2,imm0)) 1743 dnl __(bne cr0,1b) 1744 dnl __(mov vsp,imm0) 1745 dnl __(do_funcall()) 2284 1746 dnl 2285 1747 dnl /* No args were vpushed; recover saved context & do funcall */ 2286 1748 dnl _spentry(tfuncallvsp) 2287 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr])2288 dnl __(ldr fn,[sp,#lisp_frame.savefn])2289 dnl __(ldr vsp,[sp,#lisp_frame.savevsp])2290 dnl __(mtlr loc_pc)2291 dnl __(discard_lisp_frame())2292 dnl __(do_funcall())1749 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 1750 dnl __(ldr fn,[sp,#lisp_frame.savefn]) 1751 dnl __(ldr vsp,[sp,#lisp_frame.savevsp]) 1752 dnl __(mtlr loc_pc) 1753 dnl __(discard_lisp_frame()) 1754 dnl __(do_funcall()) 2293 1755 dnl 2294 1756 dnl /* Tail-recursively call the (known symbol) in fname. */ … … 2298 1760 dnl /* vsp, lr, fn from the saved lisp frame on the control stack. */ 2299 1761 dnl _spentry(tcallsymgen) 2300 dnl __(cmpri(cr0,nargs,nargregs<<fixnumshift))2301 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr])2302 dnl __(ldr fn,[sp,#lisp_frame.savefn])2303 dnl __(mtlr loc_pc)2304 dnl __(ble cr0,2f)2305 dnl 2306 dnl __(ldr imm0,[sp,#lisp_frame.savevsp])2307 dnl __(discard_lisp_frame())2308 dnl /* can use nfn (= temp2) as a temporary */2309 dnl __(subi imm1,nargs,nargregs<<fixnumshift)2310 dnl __(add imm1,imm1,vsp)1762 dnl __(cmpri(cr0,nargs,nargregs<<fixnumshift)) 1763 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 1764 dnl __(ldr fn,[sp,#lisp_frame.savefn]) 1765 dnl __(mtlr loc_pc) 1766 dnl __(ble cr0,2f) 1767 dnl 1768 dnl __(ldr imm0,[sp,#lisp_frame.savevsp]) 1769 dnl __(discard_lisp_frame()) 1770 dnl /* can use nfn (= temp2) as a temporary */ 1771 dnl __(subi imm1,nargs,nargregs<<fixnumshift) 1772 dnl __(add imm1,imm1,vsp) 2311 1773 dnl 1: 2312 dnl __(ldru(temp2,-node_size(imm1)))2313 dnl __(cmpr(cr0,imm1,vsp))2314 dnl __(push(temp2,imm0))2315 dnl __(bne cr0,1b)2316 dnl __(mov vsp,imm0)2317 dnl __(jump_fname)2318 dnl 2319 dnl 2: 2320 dnl __(ldr vsp,[sp,#lisp_frame.savevsp])2321 dnl __(discard_lisp_frame())2322 dnl __(jump_fname)2323 dnl 2324 dnl 1774 dnl __(ldru(temp2,-node_size(imm1))) 1775 dnl __(cmpr(cr0,imm1,vsp)) 1776 dnl __(push(temp2,imm0)) 1777 dnl __(bne cr0,1b) 1778 dnl __(mov vsp,imm0) 1779 dnl __(jump_fname) 1780 dnl 1781 dnl 2: 1782 dnl __(ldr vsp,[sp,#lisp_frame.savevsp]) 1783 dnl __(discard_lisp_frame()) 1784 dnl __(jump_fname) 1785 dnl 1786 dnl 2325 1787 dnl /* Some args were vpushed. Slide them down to the base of */ 2326 1788 dnl /* the current frame, then do funcall. */ 2327 1789 dnl _spentry(tcallsymslide) 2328 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr])2329 dnl __(ldr fn,[sp,#lisp_frame.savefn])2330 dnl __(ldr imm0,[sp,#lisp_frame.savevsp])2331 dnl __(discard_lisp_frame())2332 dnl __(mtlr loc_pc)2333 dnl /* can use nfn (= temp2) as a temporary */2334 dnl __(subi imm1,nargs,nargregs<<fixnumshift)2335 dnl __(add imm1,imm1,vsp)1790 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 1791 dnl __(ldr fn,[sp,#lisp_frame.savefn]) 1792 dnl __(ldr imm0,[sp,#lisp_frame.savevsp]) 1793 dnl __(discard_lisp_frame()) 1794 dnl __(mtlr loc_pc) 1795 dnl /* can use nfn (= temp2) as a temporary */ 1796 dnl __(subi imm1,nargs,nargregs<<fixnumshift) 1797 dnl __(add imm1,imm1,vsp) 2336 1798 dnl 1: 2337 dnl __(ldru(temp2,-node_size(imm1)))2338 dnl __(cmpr(cr0,imm1,vsp))2339 dnl __(push(temp2,imm0))2340 dnl __(bne cr0,1b)2341 dnl __(mov vsp,imm0)2342 dnl __(jump_fname)1799 dnl __(ldru(temp2,-node_size(imm1))) 1800 dnl __(cmpr(cr0,imm1,vsp)) 1801 dnl __(push(temp2,imm0)) 1802 dnl __(bne cr0,1b) 1803 dnl __(mov vsp,imm0) 1804 dnl __(jump_fname) 2343 1805 dnl 2344 1806 dnl /* No args were vpushed; recover saved context & call symbol */ 2345 1807 dnl _spentry(tcallsymvsp) 2346 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr])2347 dnl __(ldr fn,[sp,#lisp_frame.savefn])2348 dnl __(ldr vsp,[sp,#lisp_frame.savevsp])2349 dnl __(discard_lisp_frame())2350 dnl __(mtlr loc_pc)2351 dnl __(jump_fname)2352 dnl 1808 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 1809 dnl __(ldr fn,[sp,#lisp_frame.savefn]) 1810 dnl __(ldr vsp,[sp,#lisp_frame.savevsp]) 1811 dnl __(discard_lisp_frame()) 1812 dnl __(mtlr loc_pc) 1813 dnl __(jump_fname) 1814 dnl 2353 1815 dnl /* Tail-recursively call the function in nfn. */ 2354 1816 dnl /* Pretty much the same as the tcallsym* cases above. */ 2355 1817 dnl _spentry(tcallnfngen) 2356 dnl __(cmpri(cr0,nargs,nargregs<<fixnumshift))2357 dnl __(ble cr0,_SPtcallnfnvsp)1818 dnl __(cmpri(cr0,nargs,nargregs<<fixnumshift)) 1819 dnl __(ble cr0,_SPtcallnfnvsp) 2358 1820 dnl __(b _SPtcallnfnslide) 2359 1821 dnl … … 2361 1823 dnl /* the current frame, then do funcall. */ 2362 1824 dnl _spentry(tcallnfnslide) 2363 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr])2364 dnl __(ldr fn,[sp,#lisp_frame.savefn])2365 dnl __(ldr imm0,[sp,#lisp_frame.savevsp])2366 dnl __(discard_lisp_frame())2367 dnl __(mtlr loc_pc)2368 dnl /* Since we have a known function, can use fname as a temporary. */2369 dnl __(subi imm1,nargs,nargregs<<fixnumshift)2370 dnl __(add imm1,imm1,vsp)1825 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 1826 dnl __(ldr fn,[sp,#lisp_frame.savefn]) 1827 dnl __(ldr imm0,[sp,#lisp_frame.savevsp]) 1828 dnl __(discard_lisp_frame()) 1829 dnl __(mtlr loc_pc) 1830 dnl /* Since we have a known function, can use fname as a temporary. */ 1831 dnl __(subi imm1,nargs,nargregs<<fixnumshift) 1832 dnl __(add imm1,imm1,vsp) 2371 1833 dnl 1: 2372 dnl __(ldru(fname,-node_size(imm1)))2373 dnl __(cmpr(cr0,imm1,vsp))2374 dnl __(push(fname,imm0))2375 dnl __(bne cr0,1b)2376 dnl __(mov vsp,imm0)2377 dnl __(jump_nfn())1834 dnl __(ldru(fname,-node_size(imm1))) 1835 dnl __(cmpr(cr0,imm1,vsp)) 1836 dnl __(push(fname,imm0)) 1837 dnl __(bne cr0,1b) 1838 dnl __(mov vsp,imm0) 1839 dnl __(jump_nfn()) 2378 1840 dnl 2379 1841 dnl _spentry(tcallnfnvsp) 2380 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr])2381 dnl __(ldr fn,[sp,#lisp_frame.savefn])2382 dnl __(ldr vsp,[sp,#lisp_frame.savevsp])2383 dnl __(discard_lisp_frame())2384 dnl __(mtlr loc_pc)2385 dnl __(jump_nfn())2386 dnl 2387 dnl/* Reference index arg_z of a misc-tagged object (arg_y). */2388 dnl/* Note that this conses in some cases. Return a properly-tagged */2389 dnl/* lisp object in arg_z. Do type and bounds-checking. */2390 dnl 2391 dnl_spentry(misc_ref)2392 dnl__(trap_unless_fulltag_equal(arg_y,fulltag_misc,imm0))2393 dnl __(trap_unless_lisptag_equal(arg_z,tag_fixnum,imm0))2394 dnl__(vector_length(imm0,arg_y,imm1))2395 dnl __(trlge(arg_z,imm0))2396 dnl __(extract_lowbyte(imm1,imm1)) /* imm1 = subtag */ 2397 dnl __(b local_label(misc_ref_common)) 2398 dnl 2399 dnl 2400 dnl 2401 dnl /* like misc_ref, only the boxed subtag is in arg_x. */ 2402 dnl 2403 dnl _spentry(subtag_misc_ref)2404 dnl __(trap_unless_fulltag_equal(arg_y,fulltag_misc,imm0))2405 dnl __(trap_unless_lisptag_equal(arg_z,tag_fixnum,imm0))2406 dnl __(vector_length(imm0,arg_y,imm1))2407 dnl __(trlge(arg_z,imm0))2408 dnl__(unbox_fixnum(imm1,arg_x))2409 dnl __(b local_label(misc_ref_common))2410 dnl 2411 dnl_spentry(builtin_aref1)2412 dnl__(extract_typecode(imm0,arg_y))2413 dnl __(cmpri(cr0,imm0,min_vector_subtag))2414 dnl__(box_fixnum(arg_x,imm0))2415 dnl __(bgt cr0,_SPsubtag_misc_ref)2416 dnl__(jump_builtin(_builtin_aref1,2))2417 dnl 2418 dnl 1842 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 1843 dnl __(ldr fn,[sp,#lisp_frame.savefn]) 1844 dnl __(ldr vsp,[sp,#lisp_frame.savevsp]) 1845 dnl __(discard_lisp_frame()) 1846 dnl __(mtlr loc_pc) 1847 dnl __(jump_nfn()) 1848 1849 /* Reference index arg_z of a misc-tagged object (arg_y). */ 1850 /* Note that this conses in some cases. Return a properly-tagged */ 1851 /* lisp object in arg_z. Do type and bounds-checking. */ 1852 1853 _spentry(misc_ref) 1854 __(trap_unless_fulltag_equal(arg_y,fulltag_misc,imm0)) 1855 __(trap_unless_fixnum(arg_z)) 1856 __(vector_length(imm0,arg_y,imm1)) 1857 __(cmp arg_z,imm0) 1858 __(uuo_error_vector_bounds(hs,arg_z,arg_y)) 1859 __(extract_lowbyte(imm1,imm1)) /* imm1 = subtag */ 1860 __(b C(misc_ref_common)) 1861 1862 /* like misc_ref, only the boxed subtag is in arg_x. */ 1863 1864 _spentry(subtag_misc_ref) 1865 __(trap_unless_fulltag_equal(arg_y,fulltag_misc,imm0)) 1866 __(trap_unless_fixnum(arg_z)) 1867 __(vector_length(imm0,arg_y,imm1)) 1868 __(cmp arg_z,imm0) 1869 __(uuo_error_vector_bounds(hs,arg_z,arg_y)) 1870 __(unbox_fixnum(imm1,arg_x)) 1871 __(b C(misc_ref_common)) 1872 1873 _spentry(builtin_aref1) 1874 __(extract_typecode(imm0,arg_y)) 1875 __(cmp imm0,#min_vector_subtag) 1876 __(box_fixnum(arg_x,imm0)) 1877 __(bgt _SPsubtag_misc_ref) 1878 __(jump_builtin(_builtin_aref1,2)) 1879 dnl 1880 dnl 2419 1881 dnl /* Make a cons cell on the vstack. Always push 3 words, 'cause we're */ 2420 1882 dnl /* not sure how the vstack will be aligned. */ 2421 1883 dnl _spentry(stkconsyz) 2422 dnl __(mov imm0,#nil_value)2423 dnl __(vpush1(imm0))2424 dnl __(vpush1(imm0))2425 dnl __(vpush1(imm0))2426 dnl __(andi. imm0,vsp,1<<word_shift) /* (oddp vsp ?) */2427 dnl __(beq cr0,1f)2428 dnl __(str(arg_y,node_size*2(vsp))) /* car */2429 dnl __(str(arg_z,node_size(vsp))) /* cdr */2430 dnl __(la arg_z,fulltag_cons+node_size(vsp))2431 dnl __(bx lr)1884 dnl __(mov imm0,#nil_value) 1885 dnl __(vpush1(imm0)) 1886 dnl __(vpush1(imm0)) 1887 dnl __(vpush1(imm0)) 1888 dnl __(andi. imm0,vsp,1<<word_shift) /* (oddp vsp ?) */ 1889 dnl __(beq cr0,1f) 1890 dnl __(str(arg_y,node_size*2(vsp))) /* car */ 1891 dnl __(str(arg_z,node_size(vsp))) /* cdr */ 1892 dnl __(la arg_z,fulltag_cons+node_size(vsp)) 1893 dnl __(bx lr) 2432 1894 dnl 1: 2433 dnl __(str(arg_y,node_size(vsp))) /* car, again */2434 dnl __(str(arg_z,0(vsp)))2435 dnl __(la arg_z,fulltag_cons(vsp))2436 dnl __(bx lr)1895 dnl __(str(arg_y,node_size(vsp))) /* car, again */ 1896 dnl __(str(arg_z,0(vsp))) 1897 dnl __(la arg_z,fulltag_cons(vsp)) 1898 dnl __(bx lr) 2437 1899 dnl 2438 1900 dnl /* Make a stack-consed value cell. Much like the case of */ … … 2440 1902 dnl /* (already vpushed). Replace that locative with the vcell. */ 2441 1903 dnl _spentry(stkvcell0) 2442 dnl __(sub imm1,imm0,vsp) /* imm1 = delta from vsp to value cell loc */2443 dnl __(mov arg_z,#nil_value)2444 dnl __(vpush1(arg_z))2445 dnl __(vpush1(arg_z))2446 dnl __(vpush1(arg_z))2447 dnl __(addi imm1,imm1,node_size*3)2448 dnl __(add imm0,vsp,imm1) /* in case stack overflowed */2449 dnl __(andi. imm1,vsp,1<<word_shift) /* (oddp vsp) ? */2450 dnl __(mov imm1,#value_cell_header)2451 dnl __(ldr arg_z,[imm0,#0])2452 dnl __(beq cr0,1f)2453 dnl __(str(arg_z,node_size*2(vsp)))2454 dnl __(str(imm1,node_size(vsp)))2455 dnl __(la arg_z,fulltag_misc+node_size(vsp))2456 dnl __(str(arg_z,0(imm0)))2457 dnl __(bx lr)1904 dnl __(sub imm1,imm0,vsp) /* imm1 = delta from vsp to value cell loc */ 1905 dnl __(mov arg_z,#nil_value) 1906 dnl __(vpush1(arg_z)) 1907 dnl __(vpush1(arg_z)) 1908 dnl __(vpush1(arg_z)) 1909 dnl __(addi imm1,imm1,node_size*3) 1910 dnl __(add imm0,vsp,imm1) /* in case stack overflowed */ 1911 dnl __(andi. imm1,vsp,1<<word_shift) /* (oddp vsp) ? */ 1912 dnl __(mov imm1,#value_cell_header) 1913 dnl __(ldr arg_z,[imm0,#0]) 1914 dnl __(beq cr0,1f) 1915 dnl __(str(arg_z,node_size*2(vsp))) 1916 dnl __(str(imm1,node_size(vsp))) 1917 dnl __(la arg_z,fulltag_misc+node_size(vsp)) 1918 dnl __(str(arg_z,0(imm0))) 1919 dnl __(bx lr) 2458 1920 dnl 1: 2459 dnl __(str(arg_z,node_size(vsp)))2460 dnl __(str(imm1,0(vsp)))2461 dnl __(la arg_z,fulltag_misc(vsp))2462 dnl __(str(arg_z,0(imm0)))2463 dnl __(bx lr)1921 dnl __(str(arg_z,node_size(vsp))) 1922 dnl __(str(imm1,0(vsp))) 1923 dnl __(la arg_z,fulltag_misc(vsp)) 1924 dnl __(str(arg_z,0(imm0))) 1925 dnl __(bx lr) 2464 1926 dnl 2465 1927 dnl 2466 1928 dnl _spentry(stkvcellvsp) 2467 dnl __(mov arg_z,#nil_value)2468 dnl __(vpush1(arg_z))2469 dnl __(vpush1(arg_z))2470 dnl __(vpush1(arg_z))2471 dnl __(mov imm1,#node_size*3)2472 dnl __(add imm0,vsp,imm1) /* in case stack overflowed */2473 dnl __(andi. imm1,vsp,1<<word_shift) /* (oddp vsp) ? */2474 dnl __(mov imm1,#value_cell_header)2475 dnl __(ldr arg_z,[imm0,#0])2476 dnl __(beq cr0,1f)2477 dnl __(str(arg_z,node_size*2(vsp)))2478 dnl __(str(imm1,node_size(vsp)))2479 dnl __(la arg_z,fulltag_misc+node_size(vsp))2480 dnl __(str(arg_z,0(imm0)))2481 dnl __(bx lr)1929 dnl __(mov arg_z,#nil_value) 1930 dnl __(vpush1(arg_z)) 1931 dnl __(vpush1(arg_z)) 1932 dnl __(vpush1(arg_z)) 1933 dnl __(mov imm1,#node_size*3) 1934 dnl __(add imm0,vsp,imm1) /* in case stack overflowed */ 1935 dnl __(andi. imm1,vsp,1<<word_shift) /* (oddp vsp) ? */ 1936 dnl __(mov imm1,#value_cell_header) 1937 dnl __(ldr arg_z,[imm0,#0]) 1938 dnl __(beq cr0,1f) 1939 dnl __(str(arg_z,node_size*2(vsp))) 1940 dnl __(str(imm1,node_size(vsp))) 1941 dnl __(la arg_z,fulltag_misc+node_size(vsp)) 1942 dnl __(str(arg_z,0(imm0))) 1943 dnl __(bx lr) 2482 1944 dnl 1: 2483 dnl __(str(arg_z,node_size(vsp)))2484 dnl __(str(imm1,0(vsp)))2485 dnl __(la arg_z,fulltag_misc(vsp))2486 dnl __(str(arg_z,0(imm0)))2487 dnl __(bx lr)1945 dnl __(str(arg_z,node_size(vsp))) 1946 dnl __(str(imm1,0(vsp))) 1947 dnl __(la arg_z,fulltag_misc(vsp)) 1948 dnl __(str(arg_z,0(imm0))) 1949 dnl __(bx lr) 2488 1950 dnl 2489 1951 dnl /* Make a "raw" area on the temp stack, stack-cons a macptr to point to it, */ … … 2491 1953 dnl /* in arg_z on exit. */ 2492 1954 dnl _spentry(makestackblock) 2493 dnl __(unbox_fixnum(imm0,arg_z))1955 dnl __(unbox_fixnum(imm0,arg_z)) 2494 1956 dnl __(dnode_align(imm0,imm0,tsp_frame.fixed_overhead+macptr.size)) 2495 dnl __(cmplri(cr0,imm0,tstack_alloc_limit)) 2496 dnl __(bge cr0,1f) 2497 dnl __(TSP_Alloc_Var_Unboxed(imm0)) 2498 dnl __(mov imm0,#macptr_header) 2499 dnl __(la imm1,tsp_frame.data_offset+macptr.size(tsp)) 2500 dnl __(str(imm0,tsp_frame.data_offset(tsp))) 2501 dnl __(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp)) 2502 dnl __(str(imm1,macptr.address(arg_z))) 2503 dnl __ifdef(`PPC64') 2504 dnl __(std rzero,macptr.domain(arg_z)) 2505 dnl __(std rzero,macptr.type(arg_z)) 2506 dnl __else 2507 dnl __(stfd fp_zero,macptr.domain(arg_z)) 2508 dnl __endif 2509 dnl __(bx lr) 1957 dnl __(cmplri(cr0,imm0,tstack_alloc_limit)) 1958 dnl __(bge cr0,1f) 1959 dnl __(TSP_Alloc_Var_Unboxed(imm0)) 1960 dnl __(mov imm0,#macptr_header) 1961 dnl __(la imm1,tsp_frame.data_offset+macptr.size(tsp)) 1962 dnl __(str(imm0,tsp_frame.data_offset(tsp))) 1963 dnl __(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp)) 1964 dnl __(str(imm1,macptr.address(arg_z))) 1965 dnl __(stfd fp_zero,macptr.domain(arg_z)) 1966 dnl __(bx lr) 2510 1967 dnl 2511 1968 dnl /* Too big. Heap cons a gcable macptr */ 2512 1969 dnl 1: 2513 dnl __(TSP_Alloc_Fixed_Unboxed(0))2514 dnl __(set_nargs(1))2515 dnl __(mov fname,#nrs.new_gcable_ptr)2516 dnl __(jump_fname())1970 dnl __(TSP_Alloc_Fixed_Unboxed(0)) 1971 dnl __(set_nargs(1)) 1972 dnl __(mov fname,#nrs.new_gcable_ptr) 1973 dnl __(jump_fname()) 2517 1974 dnl 2518 1975 dnl /* As above, only set the block's contents to 0. */ 2519 1976 dnl _spentry(makestackblock0) 2520 dnl __(unbox_fixnum(imm0,arg_z))1977 dnl __(unbox_fixnum(imm0,arg_z)) 2521 1978 dnl __(dnode_align(imm0,imm0,tsp_frame.fixed_overhead+macptr.size)) 2522 dnl __(cmplri(cr0,imm0,tstack_alloc_limit))2523 dnl __(bge cr0,3f)2524 dnl __(TSP_Alloc_Var_Unboxed(imm0))2525 dnl __(Zero_TSP_Frame(imm0,imm1))2526 dnl __(mov imm0,#macptr_header)2527 dnl __(la imm1,tsp_frame.data_offset+macptr.size(tsp))2528 dnl __(str(imm0,tsp_frame.data_offset(tsp)))2529 dnl __(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp))2530 dnl __(str(imm1,macptr.address(arg_z))) /* makestackblock0 expects the address to be in imm1 */2531 dnl __(stfd fp_zero,macptr.domain(arg_z))2532 dnl __(bx lr)1979 dnl __(cmplri(cr0,imm0,tstack_alloc_limit)) 1980 dnl __(bge cr0,3f) 1981 dnl __(TSP_Alloc_Var_Unboxed(imm0)) 1982 dnl __(Zero_TSP_Frame(imm0,imm1)) 1983 dnl __(mov imm0,#macptr_header) 1984 dnl __(la imm1,tsp_frame.data_offset+macptr.size(tsp)) 1985 dnl __(str(imm0,tsp_frame.data_offset(tsp))) 1986 dnl __(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp)) 1987 dnl __(str(imm1,macptr.address(arg_z))) /* makestackblock0 expects the address to be in imm1 */ 1988 dnl __(stfd fp_zero,macptr.domain(arg_z)) 1989 dnl __(bx lr) 2533 1990 dnl 2534 1991 dnl /* Too big. Heap cons a gcable macptr */ 2535 1992 dnl 3: 2536 dnl __(TSP_Alloc_Fixed_Unboxed(0)) /* "raw" block to make the compiler happy */2537 dnl 2538 dnl __(mov arg_y,arg_z) /* save block size */2539 dnl __(mov arg_z,#t_value) /* clear-p arg to %new-gcable-ptr */2540 dnl __(set_nargs(2))2541 dnl __(mov fname,#nrs.new_gcable_ptr)2542 dnl __(jump_fname())1993 dnl __(TSP_Alloc_Fixed_Unboxed(0)) /* "raw" block to make the compiler happy */ 1994 dnl 1995 dnl __(mov arg_y,arg_z) /* save block size */ 1996 dnl __(mov arg_z,#t_value) /* clear-p arg to %new-gcable-ptr */ 1997 dnl __(set_nargs(2)) 1998 dnl __(mov fname,#nrs.new_gcable_ptr) 1999 dnl __(jump_fname()) 2543 2000 dnl 2544 2001 dnl /* Make a list of length arg_y (boxed), initial-element arg_z (boxed) on */ 2545 2002 dnl /* the tstack. Return the list in arg_z. */ 2546 2003 dnl _spentry(makestacklist) 2547 dnl __(add imm0,arg_y,arg_y)2548 dnl __(cmplri(cr1,imm0,((tstack_alloc_limit+1)-cons.size)))2549 dnl __(addi imm0,imm0,tsp_frame.fixed_overhead)2550 dnl __(bge cr1,3f)2551 dnl __(TSP_Alloc_Var_Boxed(imm0,imm1))2552 dnl __(mov imm1,arg_y)2553 dnl __(cmpri(cr1,imm1,0))2554 dnl __(mov arg_y,arg_z)2555 dnl __(mov arg_z,#nil_value)2556 dnl __(ldr imm2,[tsp,#tsp_frame.backlink])2557 dnl __(la imm2,-tsp_frame.fixed_overhead+fulltag_cons(imm2))2558 dnl __(b 2f)2004 dnl __(add imm0,arg_y,arg_y) 2005 dnl __(cmplri(cr1,imm0,((tstack_alloc_limit+1)-cons.size))) 2006 dnl __(addi imm0,imm0,tsp_frame.fixed_overhead) 2007 dnl __(bge cr1,3f) 2008 dnl __(TSP_Alloc_Var_Boxed(imm0,imm1)) 2009 dnl __(mov imm1,arg_y) 2010 dnl __(cmpri(cr1,imm1,0)) 2011 dnl __(mov arg_y,arg_z) 2012 dnl __(mov arg_z,#nil_value) 2013 dnl __(ldr imm2,[tsp,#tsp_frame.backlink]) 2014 dnl __(la imm2,-tsp_frame.fixed_overhead+fulltag_cons(imm2)) 2015 dnl __(b 2f) 2559 2016 dnl 1: 2560 dnl __(subi imm1,imm1,fixnum1)2561 dnl __(cmpri(cr1,imm1,0))2562 dnl __(_rplacd(imm2,arg_z))2563 dnl __(_rplaca(imm2,arg_y))2564 dnl __(mov arg_z,imm2)2565 dnl __(subi imm2,imm2,cons.size)2017 dnl __(subi imm1,imm1,fixnum1) 2018 dnl __(cmpri(cr1,imm1,0)) 2019 dnl __(_rplacd(imm2,arg_z)) 2020 dnl __(_rplaca(imm2,arg_y)) 2021 dnl __(mov arg_z,imm2) 2022 dnl __(subi imm2,imm2,cons.size) 2566 2023 dnl 2: 2567 dnl __(bne cr1,1b)2568 dnl __(bx lr)2024 dnl __(bne cr1,1b) 2025 dnl __(bx lr) 2569 2026 dnl 2570 2027 dnl 3: 2571 dnl __(cmpri(cr1,arg_y,0))2572 dnl __(TSP_Alloc_Fixed_Boxed(0)) /* make the compiler happy */2573 dnl __(mov imm1,arg_y) /* count */2574 dnl __(mov arg_y,arg_z) /* initial value */2575 dnl __(mov arg_z,#nil_value) /* result */2576 dnl __(b 5f)2028 dnl __(cmpri(cr1,arg_y,0)) 2029 dnl __(TSP_Alloc_Fixed_Boxed(0)) /* make the compiler happy */ 2030 dnl __(mov imm1,arg_y) /* count */ 2031 dnl __(mov arg_y,arg_z) /* initial value */ 2032 dnl __(mov arg_z,#nil_value) /* result */ 2033 dnl __(b 5f) 2577 2034 dnl 4: 2578 dnl __(subi imm1,imm1,fixnum1)2579 dnl __(cmpri(cr1,imm1,0))2580 dnl __(Cons(arg_z,arg_y,arg_z))2035 dnl __(subi imm1,imm1,fixnum1) 2036 dnl __(cmpri(cr1,imm1,0)) 2037 dnl __(Cons(arg_z,arg_y,arg_z)) 2581 2038 dnl 5: 2582 dnl __(bne cr1,4b)2583 dnl __(bx lr)2039 dnl __(bne cr1,4b) 2040 dnl __(bx lr) 2584 2041 dnl 2585 2042 dnl /* subtype (boxed) vpushed before initial values. (Had better be a */ … … 2587 2044 dnl 2588 2045 dnl _spentry(stkgvector) 2589 dnl __(la imm0,-fixnum_one(nargs)) 2590 dnl __(cmpri(cr1,imm0,0)) 2591 dnl __(add imm1,vsp,nargs) 2592 dnl __(ldru(temp0,-node_size(imm1))) 2593 dnl __(slri(imm2,imm0,num_subtag_bits-fixnumshift)) 2594 dnl __ifdef(`PPC64') 2595 dnl __(unbox_fixnum(imm3,temp0)) 2596 dnl __(or imm2,imm3,imm2) 2597 dnl __else 2598 dnl __(rlwimi imm2,temp0,32-fixnumshift,32-num_subtag_bits,31) 2599 dnl __endif 2046 dnl __(la imm0,-fixnum_one(nargs)) 2047 dnl __(cmpri(cr1,imm0,0)) 2048 dnl __(add imm1,vsp,nargs) 2049 dnl __(ldru(temp0,-node_size(imm1))) 2050 dnl __(slri(imm2,imm0,num_subtag_bits-fixnumshift)) 2051 dnl __(rlwimi imm2,temp0,32-fixnumshift,32-num_subtag_bits,31) 2600 2052 dnl __(dnode_align(imm0,imm0,node_size+tsp_frame.fixed_overhead)) 2601 dnl __(TSP_Alloc_Var_Boxed_nz(imm0,imm3))2602 dnl __(str(imm2,tsp_frame.data_offset(tsp)))2603 dnl __(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp))2604 dnl __(la imm3,misc_header_offset(arg_z))2605 dnl __(mov imm0,#fixnum1)2606 dnl __(b 2f)2053 dnl __(TSP_Alloc_Var_Boxed_nz(imm0,imm3)) 2054 dnl __(str(imm2,tsp_frame.data_offset(tsp))) 2055 dnl __(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp)) 2056 dnl __(la imm3,misc_header_offset(arg_z)) 2057 dnl __(mov imm0,#fixnum1) 2058 dnl __(b 2f) 2607 2059 dnl 1: 2608 dnl __(addi imm0,imm0,fixnum1)2609 dnl __(cmpr(cr1,imm0,nargs))2610 dnl __(ldru(temp0,-node_size(imm1)))2611 dnl __(stru(temp0,node_size(imm3)))2060 dnl __(addi imm0,imm0,fixnum1) 2061 dnl __(cmpr(cr1,imm0,nargs)) 2062 dnl __(ldru(temp0,-node_size(imm1))) 2063 dnl __(stru(temp0,node_size(imm3))) 2612 2064 dnl 2: 2613 dnl __(bne cr1,1b) 2614 dnl __(add vsp,vsp,nargs) 2615 dnl __(bx lr) 2616 dnl 2617 dnl /* Allocate a "fulltag_misc" object. On entry, arg_y contains the element */ 2618 dnl /* count (boxed) and arg_z contains the subtag (boxed). Both of these */ 2619 dnl /* parameters must be "reasonable" (the subtag must be valid, the element */ 2620 dnl /* count must be of type (unsigned-byte 24)/(unsigned-byte 56). */ 2621 dnl /* On exit, arg_z contains the (properly tagged) misc object; it'll have a */ 2622 dnl /* proper header on it and its contents will be 0. imm0 contains */ 2623 dnl /* the object's header (fulltag = fulltag_immheader or fulltag_nodeheader.) */ 2624 dnl /* This is intended for things like "make-array" and "%make-bignum" and the */ 2625 dnl /* like. Things that involve creating small objects of known size can usually */ 2626 dnl /* do so inline with less hair. */ 2627 dnl 2628 dnl /* If this has to go out-of-line (to GC or whatever), it should do so via a */ 2629 dnl /* trap (or should otherwise ensure that both the LR and CTR are preserved */ 2630 dnl /* where the GC can find them.) */ 2631 dnl 2632 dnl 2633 dnl _spentry(misc_alloc) 2634 dnl __ifdef(`PPC64') 2635 dnl __(extract_unsigned_byte_bits_(imm2,arg_y,56)) 2636 dnl __(unbox_fixnum(imm0,arg_z)) 2637 dnl __(sldi imm2,arg_y,num_subtag_bits-fixnumshift) 2638 dnl __(clrldi imm1,imm0,64-nlowtagbits) 2639 dnl __(or imm0,imm2,imm0) 2640 dnl __(extract_fulltag(imm2,imm0)) 2641 dnl __(cmpdi cr1,imm1,lowtag_nodeheader) 2642 dnl __(cmpdi cr2,imm2,ivector_class_64_bit) 2643 dnl __(bne- cr0,9f) 2644 dnl __(cmpdi cr3,imm2,ivector_class_32_bit) 2645 dnl __(cmpdi cr4,imm2,ivector_class_8_bit) 2646 dnl __(mov imm2,arg_y) 2647 dnl __(cmpdi cr5,imm1,subtag_bit_vector) 2648 dnl __(beq cr1,1f) 2649 dnl __(beq cr2,1f) 2650 dnl __(srdi imm2,imm2,1) 2651 dnl __(beq cr3,1f) 2652 dnl __(beq cr5,2f) 2653 dnl __(srdi imm2,imm2,1) 2654 dnl __(bne cr4,1f) 2655 dnl __(srdi imm2,imm2,1) 2656 dnl /* imm2 now = byte count. Add 8 for header, 15 to align, then clear */ 2657 dnl /* low four bits. */ 2658 dnl 1: 2659 dnl __(dnode_align(imm2,imm2,node_size)) 2660 dnl 2661 dnl __(Misc_Alloc(arg_z,imm0,imm2)) 2662 dnl __(bx lr) 2663 dnl 2: /* bit-vector case */ 2664 dnl __(addi imm2,arg_y,7<<fixnumshift) 2665 dnl __(srdi imm2,imm2,3+fixnumshift) 2666 dnl __(b 1b) 2667 dnl 9: 2668 dnl __(uuo_interr(error_object_not_unsigned_byte_56,arg_y)) 2669 dnl __else 2670 dnl __(extract_unsigned_byte_bits_(imm2,arg_y,24)) 2671 dnl __(unbox_fixnum(imm0,arg_z)) 2672 dnl __(extract_fulltag(imm1,imm0)) 2673 dnl __(bne- cr0,9f) 2674 dnl __(cmpri(cr0,imm1,fulltag_nodeheader)) 2675 dnl __(mov imm3,imm0) 2676 dnl __(cmplri(cr1,imm0,max_32_bit_ivector_subtag)) 2677 dnl __(rlwimi imm0,arg_y,num_subtag_bits-fixnum_shift,0,31-num_subtag_bits )/* imm0 now = header */ 2678 dnl __(mov imm2,arg_y) 2679 dnl __(beq cr0,1f) /* do probe if node object (fixnum element count = byte count). */ 2680 dnl __(cmplri(cr0,imm3,max_16_bit_ivector_subtag)) 2681 dnl __(bng cr1,1f) /* do probe if 32-bit imm object */ 2682 dnl __(cmplri(cr1,imm3,max_8_bit_ivector_subtag)) 2683 dnl __(srwi imm2,imm2,1) 2684 dnl __(bgt cr0,2f) 2685 dnl __(bgt cr1,1f) 2686 dnl __(srwi imm2,imm2,1) 2687 dnl /* imm2 now = byte count. Add 4 for header, 7 to align, then clear */ 2688 dnl /* low three bits. */ 2689 dnl 1: 2690 dnl __(dnode_align(imm2,imm2,node_size)) 2691 dnl 2692 dnl __(Misc_Alloc(arg_z,imm0,imm2)) 2693 dnl __(bx lr) 2694 dnl 2: 2695 dnl __(cmplri(imm3,subtag_double_float_vector)) 2696 dnl __(slwi imm2,arg_y,1) 2697 dnl __(beq 1b) 2698 dnl __(addi imm2,arg_y,7<<fixnumshift) 2699 dnl __(srwi imm2,imm2,fixnumshift+3) 2700 dnl __(b 1b) 2701 dnl 9: 2702 dnl __(uuo_interr(error_object_not_unsigned_byte_24,arg_y)) 2703 dnl __endif 2065 dnl __(bne cr1,1b) 2066 dnl __(add vsp,vsp,nargs) 2067 dnl __(bx lr) 2068 2069 /* Allocate a "fulltag_misc" object. On entry, arg_y contains the element */ 2070 /* count (boxed) and arg_z contains the subtag (boxed). Both of these */ 2071 /* parameters must be "reasonable" (the subtag must be valid, the element */ 2072 /* count must be of type (unsigned-byte 24)/(unsigned-byte 56). */ 2073 /* On exit, arg_z contains the (properly tagged) misc object; it'll have a */ 2074 /* proper header on it and its contents will be 0. imm0 contains */ 2075 /* the object's header (fulltag = fulltag_immheader or fulltag_nodeheader.) */ 2076 2077 unsigned_byte_24_mask = 0xe0000003 /* bits that should be clear in a boxed */ 2078 /* (UNSIGNED-BYTE 24) */ 2079 _spentry(misc_alloc) 2080 __(tst arg_y,#unsigned_byte_24_mask) 2081 __(bne 9f) 2082 __(unbox_fixnum(imm0,arg_z)) 2083 __(orr imm0,imm0,arg_y,lsl #num_subtag_bits-fixnumshift) 2084 __(extract_fulltag(imm1,imm0)) 2085 __(cmp imm1,#fulltag_nodeheader) 2086 __(mov imm2,arg_y) /* imm2 = logical size in bytes */ 2087 __(beq 1f) 2088 __(unbox_fixnum(imm1,arg_z)) 2089 __(cmp imm1,#max_32_bit_ivector_subtag) 2090 __(ble 1f) 2091 __(mov imm2,arg_y,lsr #2) 2092 __(cmp imm1,#max_8_bit_ivector_subtag) 2093 __(ble 1f) 2094 __(mov imm2,arg_y,lsr #1) 2095 __(cmp imm1,#max_16_bit_ivector_subtag) 2096 __(ble 1f) 2097 __(mov imm2,arg_y,lsl #1) 2098 __(add imm2,imm2,#node_size) 2099 __(cmp imm1,#subtag_double_float_vector) 2100 __(beq 1f) 2101 __(add imm2,arg_y,#7<<fixnumshift) 2102 __(mov imm2,imm2,lsr #3+fixnumshift) 2103 /* imm2 now = byte count. Add 4 for header, 7 to align, then clear */ 2104 /* low three bits. */ 2105 1: 2106 __(dnode_align(imm2,imm2,node_size)) 2107 __(Misc_Alloc(arg_z,imm0,imm2)) 2108 __(bx lr) 2109 9: 2110 __(uuo_error_reg_not_xtype(al,arg_y,xtype_unsigned_byte_24)) 2111 2704 2112 dnl 2705 dnl /* almost exactly as above, but "swap exception handling info" */2706 dnl /* on exit and return */2707 dnl /* Deprecated */2708 dnl _spentry(poweropen_ffcallX)2709 dnl .long 0x7c800008 /* debug trap */2710 dnl2711 2113 dnl 2712 2114 dnl /* Destructuring-bind, macro-bind. */ … … 2726 2128 dnl 2727 2129 dnl _spentry(macro_bind) 2728 dnl __ifdef(`PPC64') 2729 dnl __(mov whole_reg,arg_reg) 2730 dnl __(extract_fulltag(imm0,arg_reg)) 2731 dnl __(cmpri(cr1,arg_reg,nil_value)) 2732 dnl __(cmpri(cr0,imm0,fulltag_cons)) 2733 dnl __(beq cr1,0f) 2734 dnl __(bne- cr0,1f) 2735 dnl 0: 2736 dnl __(_cdr(arg_reg,arg_reg)) 2737 dnl __(b local_label(destbind1)) 2738 dnl __else 2739 dnl __(mov whole_reg,arg_reg) 2740 dnl __(extract_lisptag(imm0,arg_reg)) 2741 dnl __(cmpri(cr0,imm0,tag_list)) 2742 dnl __(bne- cr0,1f) 2743 dnl __(_cdr(arg_reg,arg_reg)) 2744 dnl __(b (local_label(destbind1))) 2745 dnl __endif 2130 dnl __(mov whole_reg,arg_reg) 2131 dnl __(extract_lisptag(imm0,arg_reg)) 2132 dnl __(cmpri(cr0,imm0,tag_list)) 2133 dnl __(bne- cr0,1f) 2134 dnl __(_cdr(arg_reg,arg_reg)) 2135 dnl __(b (local_label(destbind1))) 2746 2136 dnl 1: 2747 dnl __(mov arg_y,#XCALLNOMATCH)2748 dnl __(mov arg_z,whole_reg)2749 dnl __(set_nargs(2))2750 dnl __(b _SPksignalerr)2137 dnl __(mov arg_y,#XCALLNOMATCH) 2138 dnl __(mov arg_z,whole_reg) 2139 dnl __(set_nargs(2)) 2140 dnl __(b _SPksignalerr) 2751 2141 dnl 2752 2142 dnl 2753 2143 dnl _spentry(destructuring_bind) 2754 dnl __(mov whole_reg,arg_reg)2144 dnl __(Mov whole_reg,arg_reg) 2755 2145 dnl __(b local_label(destbind1)) 2756 dnl 2146 dnl 2757 2147 dnl _spentry(destructuring_bind_inner) 2758 dnl __(mov whole_reg,arg_z)2148 dnl __(mov whole_reg,arg_z) 2759 2149 dnl local_label(destbind1): 2760 dnl /* Extract required arg count. */2761 dnl /* A bug in gas: can't handle shift count of "32" (= 0 */2762 dnl ifelse(eval(mask_req_width+mask_req_start),eval(32),`2763 dnl __(clrlwi. imm0,nargs,mask_req_start)2764 dnl ',`2765 dnl __(extrwi. imm0,nargs,mask_req_width,mask_req_start)2766 dnl ')2767 dnl __(extrwi imm1,nargs,mask_opt_width,mask_opt_start)2768 dnl __(rlwinm imm2,nargs,0,mask_initopt,mask_initopt)2769 dnl __(rlwinm imm4,nargs,0,mask_keyp,mask_keyp)2770 dnl __(cmpri(cr4,imm4,0))2771 dnl __(rlwinm imm4,nargs,0,mask_restp,mask_restp)2772 dnl __(cmpri(cr5,imm4,0))2773 dnl __(cmpri(cr1,imm1,0))2774 dnl __(cmpri(cr2,imm2,0))2775 dnl /* Save entry vsp in case of error. */2776 dnl __(mov imm4,vsp)2777 dnl __(beq cr0,2f)2150 dnl /* Extract required arg count. */ 2151 dnl /* A bug in gas: can't handle shift count of "32" (= 0 */ 2152 dnl ifelse(eval(mask_req_width+mask_req_start),eval(32),` 2153 dnl __(clrlwi. imm0,nargs,mask_req_start) 2154 dnl ',` 2155 dnl __(extrwi. imm0,nargs,mask_req_width,mask_req_start) 2156 dnl ') 2157 dnl __(extrwi imm1,nargs,mask_opt_width,mask_opt_start) 2158 dnl __(rlwinm imm2,nargs,0,mask_initopt,mask_initopt) 2159 dnl __(rlwinm imm4,nargs,0,mask_keyp,mask_keyp) 2160 dnl __(cmpri(cr4,imm4,0)) 2161 dnl __(rlwinm imm4,nargs,0,mask_restp,mask_restp) 2162 dnl __(cmpri(cr5,imm4,0)) 2163 dnl __(cmpri(cr1,imm1,0)) 2164 dnl __(cmpri(cr2,imm2,0)) 2165 dnl /* Save entry vsp in case of error. */ 2166 dnl __(mov imm4,vsp) 2167 dnl __(beq cr0,2f) 2778 2168 dnl 1: 2779 dnl __(cmpri(cr7,arg_reg,nil_value)) 2780 dnl __ifdef(`PPC64') 2781 dnl __(extract_fulltag(imm3,arg_reg)) 2782 dnl __(cmpri(cr3,imm3,fulltag_cons)) 2783 dnl __else 2784 dnl __(extract_lisptag(imm3,arg_reg)) 2785 dnl __(cmpri(cr3,imm3,tag_list)) 2786 dnl __endif 2787 dnl __(subi imm0,imm0,1) 2788 dnl __(cmpri(cr0,imm0,0)) 2789 dnl __(beq cr7,toofew) 2790 dnl __(bne cr3,badlist) 2791 dnl __(ldr arg_x,[arg_reg,#cons.car]) 2792 dnl __(ldr arg_reg,[arg_reg,#cons.cdr]) 2793 dnl __(vpush1(arg_x)) 2794 dnl __(bne cr0,1b) 2169 dnl __(cmpri(cr7,arg_reg,nil_value)) 2170 dnl __(extract_lisptag(imm3,arg_reg)) 2171 dnl __(cmpri(cr3,imm3,tag_list)) 2172 dnl __(subi imm0,imm0,1) 2173 dnl __(cmpri(cr0,imm0,0)) 2174 dnl __(beq cr7,toofew) 2175 dnl __(bne cr3,badlist) 2176 dnl __(ldr arg_x,[arg_reg,#cons.car]) 2177 dnl __(ldr arg_reg,[arg_reg,#cons.cdr]) 2178 dnl __(vpush1(arg_x)) 2179 dnl __(bne cr0,1b) 2795 2180 dnl 2: 2796 dnl __(beq cr1,rest_keys)2797 dnl __(bne cr2,opt_supp)2798 dnl /* 'simple' &optionals:no supplied-p, default to nil. */2181 dnl __(beq cr1,rest_keys) 2182 dnl __(bne cr2,opt_supp) 2183 dnl /* 'simple' &optionals: no supplied-p, default to nil. */ 2799 2184 dnl simple_opt_loop: 2800 dnl __(cmpri(cr0,arg_reg,nil_value)) 2801 dnl __ifdef(`PPC64') 2802 dnl __(extract_fulltag(imm3,arg_reg)) 2803 dnl __(cmpri(cr3,imm3,fulltag_cons)) 2804 dnl __else 2805 dnl __(extract_lisptag(imm3,arg_reg)) 2806 dnl __(cmpri(cr3,imm3,tag_list)) 2807 dnl __endif 2808 dnl __(subi imm1,imm1,1) 2809 dnl __(cmpri(cr1,imm1,0)) 2810 dnl __(mov imm5,#nil_value) 2811 dnl __(beq cr0,default_simple_opt) 2812 dnl __(bne cr3,badlist) 2813 dnl __(ldr arg_x,[arg_reg,#cons.car]) 2814 dnl __(ldr arg_reg,[arg_reg,#cons.cdr]) 2815 dnl __(vpush1(arg_x)) 2816 dnl __(bne cr1,simple_opt_loop) 2817 dnl __(b rest_keys) 2185 dnl __(cmpri(cr0,arg_reg,nil_value)) 2186 dnl __(extract_lisptag(imm3,arg_reg)) 2187 dnl __(cmpri(cr3,imm3,tag_list)) 2188 dnl __(subi imm1,imm1,1) 2189 dnl __(cmpri(cr1,imm1,0)) 2190 dnl __(mov imm5,#nil_value) 2191 dnl __(beq cr0,default_simple_opt) 2192 dnl __(bne cr3,badlist) 2193 dnl __(ldr arg_x,[arg_reg,#cons.car]) 2194 dnl __(ldr arg_reg,[arg_reg,#cons.cdr]) 2195 dnl __(vpush1(arg_x)) 2196 dnl __(bne cr1,simple_opt_loop) 2197 dnl __(b rest_keys) 2818 2198 dnl default_simple_opt_loop: 2819 dnl __(subi imm1,imm1,1)2820 dnl __(cmpri(cr1,imm1,0))2199 dnl __(subi imm1,imm1,1) 2200 dnl __(cmpri(cr1,imm1,0)) 2821 2201 dnl default_simple_opt: 2822 dnl __(vpush1(imm5))2823 dnl __(bne cr1,default_simple_opt_loop)2824 dnl __(b rest_keys)2825 dnl /* Provide supplied-p vars for the &optionals. */2202 dnl __(vpush1(imm5)) 2203 dnl __(bne cr1,default_simple_opt_loop) 2204 dnl __(b rest_keys) 2205 dnl /* Provide supplied-p vars for the &optionals. */ 2826 2206 dnl opt_supp: 2827 dnl __(mov arg_y,#t_value)2207 dnl __(mov arg_y,#t_value) 2828 2208 dnl opt_supp_loop: 2829 dnl __(cmpri(cr0,arg_reg,nil_value)) 2830 dnl __ifdef(`PPC64') 2831 dnl __(extract_fulltag(imm3,arg_reg)) 2832 dnl __(cmpri(cr3,imm3,fulltag_cons)) 2833 dnl __else 2834 dnl __(extract_lisptag(imm3,arg_reg)) 2835 dnl __(cmpri(cr3,imm3,tag_list)) 2836 dnl __endif 2837 dnl __(subi imm1,imm1,1) 2838 dnl __(cmpri(cr1,imm1,0)) 2839 dnl __(beq cr0,default_hard_opt) 2840 dnl __(bne cr3,badlist) 2841 dnl __(ldr arg_x,[arg_reg,#cons.car]) 2842 dnl __(ldr arg_reg,[arg_reg,#cons.cdr]) 2843 dnl __(vpush1(arg_x)) 2844 dnl __(vpush1(arg_y)) 2845 dnl __(bne cr1,opt_supp_loop) 2846 dnl __(b rest_keys) 2209 dnl __(cmpri(cr0,arg_reg,nil_value)) 2210 dnl __(extract_lisptag(imm3,arg_reg)) 2211 dnl __(cmpri(cr3,imm3,tag_list)) 2212 dnl __(subi imm1,imm1,1) 2213 dnl __(cmpri(cr1,imm1,0)) 2214 dnl __(beq cr0,default_hard_opt) 2215 dnl __(bne cr3,badlist) 2216 dnl __(ldr arg_x,[arg_reg,#cons.car]) 2217 dnl __(ldr arg_reg,[arg_reg,#cons.cdr]) 2218 dnl __(vpush1(arg_x)) 2219 dnl __(vpush1(arg_y)) 2220 dnl __(bne cr1,opt_supp_loop) 2221 dnl __(b rest_keys) 2847 2222 dnl default_hard_opt_loop: 2848 dnl __(subi imm1,imm1,1)2849 dnl __(cmpri(cr1,imm1,0))2223 dnl __(subi imm1,imm1,1) 2224 dnl __(cmpri(cr1,imm1,0)) 2850 2225 dnl default_hard_opt: 2851 dnl __(vpush1(imm5))2852 dnl __(vpush1(imm5))2853 dnl __(bne cr1,default_hard_opt_loop)2226 dnl __(vpush1(imm5)) 2227 dnl __(vpush1(imm5)) 2228 dnl __(bne cr1,default_hard_opt_loop) 2854 2229 dnl rest_keys: 2855 dnl __(cmpri(cr0,arg_reg,nil_value))2856 dnl __(bne cr5,have_rest)2857 dnl __(bne cr4,have_keys)2858 dnl __(bne cr0,toomany)2859 dnl __(bx lr)2230 dnl __(cmpri(cr0,arg_reg,nil_value)) 2231 dnl __(bne cr5,have_rest) 2232 dnl __(bne cr4,have_keys) 2233 dnl __(bne cr0,toomany) 2234 dnl __(bx lr) 2860 2235 dnl have_rest: 2861 dnl __(vpush1(arg_reg))2862 dnl __(beqlr cr4)2236 dnl __(vpush1(arg_reg)) 2237 dnl __(beqlr cr4) 2863 2238 dnl have_keys: 2864 dnl /* Ensure that arg_reg contains a proper,even-length list. */2865 dnl /* Insist that its length is <= 512 (as a cheap circularity check.) */2866 dnl __(mov imm0,#256)2867 dnl __(mov arg_x,arg_reg)2239 dnl /* Ensure that arg_reg contains a proper,even-length list. */ 2240 dnl /* Insist that its length is <= 512 (as a cheap circularity check.) */ 2241 dnl __(mov imm0,#256) 2242 dnl __(mov arg_x,arg_reg) 2868 2243 dnl count_keys_loop: 2869 dnl __ifdef(`PPC64') 2870 dnl __(extract_fulltag(imm3,arg_x)) 2871 dnl __(cmpri(cr3,imm3,fulltag_cons)) 2872 dnl __else 2873 dnl __(extract_lisptag(imm3,arg_x)) 2874 dnl __(cmpri(cr3,imm3,tag_list)) 2875 dnl __endif 2876 dnl __(cmpri(cr0,arg_x,nil_value)) 2877 dnl __(subi imm0,imm0,1) 2878 dnl __(cmpri(cr4,imm0,0)) 2879 dnl __(beq cr0,counted_keys) 2880 dnl __(bne cr3,badlist) 2881 dnl __(ldr arg_x,[arg_x,#cons.cdr]) 2882 dnl __ifdef(`PPC64') 2883 dnl __(extract_fulltag(imm3,arg_x)) 2884 dnl __(cmpri(cr3,imm3,fulltag_cons)) 2885 dnl __else 2886 dnl __(extract_lisptag(imm3,arg_x)) 2887 dnl __(cmpri(cr3,imm3,tag_list)) 2888 dnl __endif 2889 dnl __(blt cr4,toomany) 2890 dnl __(cmpri(cr0,arg_x,nil_value)) 2891 dnl __(beq cr0,db_badkeys) 2892 dnl __(bne cr3,badlist) 2893 dnl __(ldr arg_x,[arg_x,#cons.cdr]) 2894 dnl __(b count_keys_loop) 2244 dnl __(extract_lisptag(imm3,arg_x)) 2245 dnl __(cmpri(cr3,imm3,tag_list)) 2246 dnl __(cmpri(cr0,arg_x,nil_value)) 2247 dnl __(subi imm0,imm0,1) 2248 dnl __(cmpri(cr4,imm0,0)) 2249 dnl __(beq cr0,counted_keys) 2250 dnl __(bne cr3,badlist) 2251 dnl __(ldr arg_x,[arg_x,#cons.cdr]) 2252 dnl __(extract_lisptag(imm3,arg_x)) 2253 dnl __(cmpri(cr3,imm3,tag_list)) 2254 dnl __(blt cr4,toomany) 2255 dnl __(cmpri(cr0,arg_x,nil_value)) 2256 dnl __(beq cr0,db_badkeys) 2257 dnl __(bne cr3,badlist) 2258 dnl __(ldr arg_x,[arg_x,#cons.cdr]) 2259 dnl __(b count_keys_loop) 2895 2260 dnl counted_keys: 2896 dnl /* We've got a proper, even-length list of key/value pairs in */2897 dnl /* arg_reg. For each keyword var in the lambda-list, push a pair */2898 dnl /* of NILs on the vstack. */2899 dnl __(extrwi. imm0,nargs,mask_key_width,mask_key_start )2900 dnl __(mov imm2,imm0)/* save number of keys */2901 dnl __(mov imm5,#nil_value)2902 dnl __(b push_pair_test)2261 dnl /* We've got a proper, even-length list of key/value pairs in */ 2262 dnl /* arg_reg. For each keyword var in the lambda-list, push a pair */ 2263 dnl /* of NILs on the vstack. */ 2264 dnl __(extrwi. imm0,nargs,mask_key_width,mask_key_start ) 2265 dnl __(mov imm2,imm0) /* save number of keys */ 2266 dnl __(mov imm5,#nil_value) 2267 dnl __(b push_pair_test) 2903 2268 dnl push_pair_loop: 2904 dnl __(cmpri(cr0,imm0,1))2905 dnl __(subi imm0,imm0,1)2906 dnl __(vpush1(imm5))2907 dnl __(vpush1(imm5))2269 dnl __(cmpri(cr0,imm0,1)) 2270 dnl __(subi imm0,imm0,1) 2271 dnl __(vpush1(imm5)) 2272 dnl __(vpush1(imm5)) 2908 2273 dnl push_pair_test: 2909 dnl __(bne cr0,push_pair_loop)2910 dnl __(slwi imm2,imm2,dnode_shift) /* pairs -> bytes */2911 dnl __(add imm2,vsp,imm2)/* imm2 points below pairs */2912 dnl __(mov imm0,#0)/* count unknown keywords so far */2913 dnl __(extrwi imm1,nargs,1,mask_aok) /* unknown keywords allowed */2914 dnl __(extrwi nargs,nargs,mask_key_width,mask_key_start)2915 dnl /* Now, for each keyword/value pair in the list */2916 dnl /* a) if the keyword is found in the keyword vector, set the */2917 dnl /* corresponding entry on the vstack to the value and the */2918 dnl /* associated supplied-p var to T. */2919 dnl /* b) Regardless of whether or not the keyword is found, */2274 dnl __(bne cr0,push_pair_loop) 2275 dnl __(slwi imm2,imm2,dnode_shift) /* pairs -> bytes */ 2276 dnl __(add imm2,vsp,imm2) /* imm2 points below pairs */ 2277 dnl __(mov imm0,#0) /* count unknown keywords so far */ 2278 dnl __(extrwi imm1,nargs,1,mask_aok) /* unknown keywords allowed */ 2279 dnl __(extrwi nargs,nargs,mask_key_width,mask_key_start) 2280 dnl /* Now, for each keyword/value pair in the list */ 2281 dnl /* a) if the keyword is found in the keyword vector, set the */ 2282 dnl /* corresponding entry on the vstack to the value and the */ 2283 dnl /* associated supplied-p var to T. */ 2284 dnl /* b) Regardless of whether or not the keyword is found, */ 2920 2285 dnl /* if :ALLOW-OTHER-KEYS is provided with a non-nil value, */ 2921 dnl /* set the low bit of imm1 to indicate that unknown keywords */2922 dnl /* are acceptable. (This bit is pre-set above to the value */2286 dnl /* set the low bit of imm1 to indicate that unknown keywords */ 2287 dnl /* are acceptable. (This bit is pre-set above to the value */ 2923 2288 dnl /* the encoded value of &allow_other_keys.) */ 2924 dnl /* c) If the keyword is not found (and isn't :ALLOW-OTHER-KEYS), increment */2925 dnl /* the count of unknown keywords in the high bits of imm1*/2926 dnl /* At the end of the list, signal an error if any unknown keywords were seen */2927 dnl /* but not allowed. Otherwise, return. */2289 dnl /* c) If the keyword is not found (and isn't :ALLOW-OTHER-KEYS), increment */ 2290 dnl /* the count of unknown keywords in the high bits of imm1*/ 2291 dnl /* At the end of the list, signal an error if any unknown keywords were seen */ 2292 dnl /* but not allowed. Otherwise, return. */ 2928 2293 dnl 2929 2294 dnl match_keys_loop: 2930 dnl __(cmpri(cr0,arg_reg,nil_value))2931 dnl __(mov imm0,#0)2932 dnl __(mov imm3,#misc_data_offset)2933 dnl __(beq cr0,matched_keys)2934 dnl __(ldr arg_x,[arg_reg,#cons.car])2935 dnl __(mov arg_y,#nrs.kallowotherkeys)2936 dnl __(cmpr(cr3,arg_x,arg_y))/* :ALLOW-OTHER-KEYS ? */2937 dnl __(ldr arg_reg,[arg_reg,#cons.cdr])2938 dnl __(ldr arg_y,[arg_reg,#cons.car])2939 dnl __(cmpr(cr4,imm0,nargs))2940 dnl __(ldr arg_reg,[arg_reg,#cons.cdr])2941 dnl __(b match_test)2295 dnl __(cmpri(cr0,arg_reg,nil_value)) 2296 dnl __(mov imm0,#0) 2297 dnl __(mov imm3,#misc_data_offset) 2298 dnl __(beq cr0,matched_keys) 2299 dnl __(ldr arg_x,[arg_reg,#cons.car]) 2300 dnl __(mov arg_y,#nrs.kallowotherkeys) 2301 dnl __(cmpr(cr3,arg_x,arg_y)) /* :ALLOW-OTHER-KEYS ? */ 2302 dnl __(ldr arg_reg,[arg_reg,#cons.cdr]) 2303 dnl __(ldr arg_y,[arg_reg,#cons.car]) 2304 dnl __(cmpr(cr4,imm0,nargs)) 2305 dnl __(ldr arg_reg,[arg_reg,#cons.cdr]) 2306 dnl __(b match_test) 2942 2307 dnl match_loop: 2943 dnl __(ldrx(temp0,keyvect_reg,imm3))2944 dnl __(cmpr(cr0,arg_x,temp0))2945 dnl __(addi imm0,imm0,1)2946 dnl __(cmpr(cr4,imm0,nargs))2947 dnl __(addi imm3,imm3,node_size)2948 dnl __(bne cr0,match_test)2949 dnl /* Got a hit. Unless this keyword's been seen already, set it. */2950 dnl __(slwi imm0,imm0,dnode_shift)2951 dnl __(subf imm0,imm0,imm2)2952 dnl __(ldr temp0,[imm0,#0])2953 dnl __(cmpri(cr0,temp0,nil_value))2954 dnl __(mov temp0,#t_value)2955 dnl __(bne cr0,match_keys_loop)/* already saw this */2956 dnl __(str(arg_y,node_size*1(imm0)))2957 dnl __(str(temp0,node_size*0(imm0)))2308 dnl __(ldrx(temp0,keyvect_reg,imm3)) 2309 dnl __(cmpr(cr0,arg_x,temp0)) 2310 dnl __(addi imm0,imm0,1) 2311 dnl __(cmpr(cr4,imm0,nargs)) 2312 dnl __(addi imm3,imm3,node_size) 2313 dnl __(bne cr0,match_test) 2314 dnl /* Got a hit. Unless this keyword's been seen already, set it. */ 2315 dnl __(slwi imm0,imm0,dnode_shift) 2316 dnl __(subf imm0,imm0,imm2) 2317 dnl __(ldr temp0,[imm0,#0]) 2318 dnl __(cmpri(cr0,temp0,nil_value)) 2319 dnl __(mov temp0,#t_value) 2320 dnl __(bne cr0,match_keys_loop) /* already saw this */ 2321 dnl __(str(arg_y,node_size*1(imm0))) 2322 dnl __(str(temp0,node_size*0(imm0))) 2958 2323 dnl __(bne cr3,match_keys_loop) 2959 dnl __(b match_keys_check_aok)2324 dnl __(b match_keys_check_aok) 2960 2325 dnl match_test: 2961 dnl __(bne cr4,match_loop)2326 dnl __(bne cr4,match_loop) 2962 2327 dnl __(beq cr3,match_keys_check_aok) 2963 2328 dnl __(addi imm1,imm1,node_size) … … 2970 2335 dnl __(beq cr1,match_keys_loop) 2971 2336 dnl __(ori imm1,imm1,1) 2972 dnl __(b match_keys_loop)2337 dnl __(b match_keys_loop) 2973 2338 dnl matched_keys: 2974 2339 dnl __(clrrwi. imm0,imm1,2) … … 2976 2341 dnl __(andi. imm1,imm1,1) 2977 2342 dnl __(bnelr) 2978 dnl /* Some unrecognized keywords. Complain generically about */2979 dnl /* invalid keywords. */2343 dnl /* Some unrecognized keywords. Complain generically about */ 2344 dnl /* invalid keywords. */ 2980 2345 dnl db_badkeys: 2981 dnl __(mov arg_y,#XBADKEYS)2982 dnl __(b destructure_error)2346 dnl __(mov arg_y,#XBADKEYS) 2347 dnl __(b destructure_error) 2983 2348 dnl toomany: 2984 dnl __(mov arg_y,#XCALLTOOMANY)2985 dnl __(b destructure_error)2349 dnl __(mov arg_y,#XCALLTOOMANY) 2350 dnl __(b destructure_error) 2986 2351 dnl toofew: 2987 dnl __(mov arg_y,#XCALLTOOFEW)2988 dnl __(b destructure_error)2352 dnl __(mov arg_y,#XCALLTOOFEW) 2353 dnl __(b destructure_error) 2989 2354 dnl badlist: 2990 dnl __(mov arg_y,#XCALLNOMATCH)2991 dnl /* b destructure_error */2355 dnl __(mov arg_y,#XCALLNOMATCH) 2356 dnl /* b destructure_error */ 2992 2357 dnl destructure_error: 2993 dnl __(mov vsp,imm4)/* undo everything done to the stack */2994 dnl __(mov arg_z,whole_reg)2995 dnl __(set_nargs(2))2996 dnl __(b _SPksignalerr)2358 dnl __(mov vsp,imm4) /* undo everything done to the stack */ 2359 dnl __(mov arg_z,whole_reg) 2360 dnl __(set_nargs(2)) 2361 dnl __(b _SPksignalerr) 2997 2362 dnl 2998 2363 dnl /* vpush the values in the value set atop the vsp, incrementing nargs. */ … … 3003 2368 dnl /* First, walk the segments reversing the pointer to previous segment pointers */ 3004 2369 dnl /* Can tell the end because that previous segment pointer is the prev tsp pointer */ 3005 dnl __(ldr imm0,[tsp,#tsp_frame.backlink]) /* previous tsp */3006 dnl __(mov imm1,tsp) /* current segment */3007 dnl __(mov imm2,tsp) /* last segment */2370 dnl __(ldr imm0,[tsp,#tsp_frame.backlink]) /* previous tsp */ 2371 dnl __(mov imm1,tsp) /* current segment */ 2372 dnl __(mov imm2,tsp) /* last segment */ 3008 2373 dnl local_label(walkloop): 3009 dnl __(ldr imm3,[imm1,#tsp_frame.fixed_overhead+node_size]) /* next segment */3010 dnl __(cmpr(cr0,imm0,imm3)) /* last segment? */3011 dnl __(str(imm2,tsp_frame.fixed_overhead+node_size(imm1))) /* reverse pointer */3012 dnl __(mov imm2,imm1) /* last segment <- current segment */3013 dnl __(mov imm1,imm3) /* current segment <- next segment */3014 dnl __(bne cr0,local_label(walkloop))2374 dnl __(ldr imm3,[imm1,#tsp_frame.fixed_overhead+node_size]) /* next segment */ 2375 dnl __(cmpr(cr0,imm0,imm3)) /* last segment? */ 2376 dnl __(str(imm2,tsp_frame.fixed_overhead+node_size(imm1))) /* reverse pointer */ 2377 dnl __(mov imm2,imm1) /* last segment <- current segment */ 2378 dnl __(mov imm1,imm3) /* current segment <- next segment */ 2379 dnl __(bne cr0,local_label(walkloop)) 3015 2380 dnl 3016 2381 dnl /* the final segment ptr is now in imm2 */ 3017 2382 dnl /* walk backwards, pushing values on VSP and incrementing NARGS */ 3018 2383 dnl local_label(pushloop): 3019 dnl __(ldr imm0,[imm2,#tsp_frame.data_offset]) /* nargs in segment */3020 dnl __(cmpri(cr0,imm0,0))3021 dnl __(cmpr(cr1,imm2,tsp))3022 dnl __(la imm3,tsp_frame.data_offset+(2*node_size)(imm2))3023 dnl __(add imm3,imm3,imm0)3024 dnl __(add nargs,nargs,imm0)3025 dnl __(b 2f)2384 dnl __(ldr imm0,[imm2,#tsp_frame.data_offset]) /* nargs in segment */ 2385 dnl __(cmpri(cr0,imm0,0)) 2386 dnl __(cmpr(cr1,imm2,tsp)) 2387 dnl __(la imm3,tsp_frame.data_offset+(2*node_size)(imm2)) 2388 dnl __(add imm3,imm3,imm0) 2389 dnl __(add nargs,nargs,imm0) 2390 dnl __(b 2f) 3026 2391 dnl 1: 3027 dnl __(ldru(arg_z,-node_size(imm3)))3028 dnl __(cmpri(cr0,imm0,fixnum_one))3029 dnl __(subi imm0,imm0,fixnum_one)3030 dnl __(vpush1(arg_z))2392 dnl __(ldru(arg_z,-node_size(imm3))) 2393 dnl __(cmpri(cr0,imm0,fixnum_one)) 2394 dnl __(subi imm0,imm0,fixnum_one) 2395 dnl __(vpush1(arg_z)) 3031 2396 dnl 2: 3032 dnl __(bne cr0,1b) 3033 dnl __(ldr imm2,[imm2,#tsp_frame.data_offset+node_size]) /* previous segment */ 3034 dnl __(bne cr1,local_label(pushloop)) 3035 dnl __(unlink(tsp)) 3036 dnl __(bx lr) 3037 dnl 3038 dnl 3039 dnl /* Go out of line to do this. Sheesh. */ 3040 dnl 3041 dnl _spentry(vpopargregs) 3042 dnl __(cmpri(cr0,nargs,0)) 3043 dnl __(cmpri(cr1,nargs,2<<fixnumshift)) 3044 dnl __(beqlr cr0) 3045 dnl __(beq cr1,local_label(yz)) 3046 dnl __(blt cr1,local_label(z)) 3047 dnl __(ldr arg_z,[vsp,#node_size*0]) 3048 dnl __(ldr arg_y,[vsp,#node_size*1]) 3049 dnl __(ldr arg_x,[vsp,#node_size*2]) 3050 dnl __(la vsp,node_size*3(vsp)) 3051 dnl __(bx lr) 3052 dnl local_label(yz): 3053 dnl __(ldr arg_z,[vsp,#node_size*0]) 3054 dnl __(ldr arg_y,[vsp,#node_size*1]) 3055 dnl __(la vsp,node_size*2(vsp)) 3056 dnl __(bx lr) 3057 dnl local_label(z): 3058 dnl __(ldr arg_z,[vsp,#node_size*0]) 3059 dnl __(la vsp,node_size*1(vsp)) 3060 dnl __(bx lr) 3061 dnl 3062 dnl /* If arg_z is an integer, return in imm0 something whose sign */ 3063 dnl /* is the same as arg_z's. If not an integer, error. */ 3064 dnl _spentry(integer_sign) 3065 dnl __(extract_typecode(imm0,arg_z)) 3066 dnl __(cmpri(cr1,imm0,tag_fixnum)) 3067 dnl __(cmpri(cr0,imm0,subtag_bignum)) 3068 dnl __(mov imm0,arg_z) 3069 dnl __(beqlr+ cr1) 3070 dnl __(bne- cr0,1f) 3071 dnl __(getvheader(imm0,arg_z)) 3072 dnl __ifdef(`PPC64') 3073 dnl __(header_size(imm0,imm0)) 3074 dnl __(sldi imm0,imm0,2) 3075 dnl __else 3076 dnl __(header_length(imm0,imm0)) /* boxed length = scaled size */ 3077 dnl __endif 3078 dnl __(addi imm0,imm0,misc_data_offset-4) /* bias, less 1 element */ 3079 dnl __(lwzx imm0,arg_z,imm0) 3080 dnl __(cmpwi cr0,imm0,0) 3081 dnl __(mov imm0,#1) 3082 dnl __(bgelr cr0) 3083 dnl __(mov imm0,#-1) 3084 dnl __(bx lr) 3085 dnl 1: 3086 dnl __(uuo_interr(error_object_not_integer,arg_z)) 3087 dnl 2397 dnl __(bne cr0,1b) 2398 dnl __(ldr imm2,[imm2,#tsp_frame.data_offset+node_size]) /* previous segment */ 2399 dnl __(bne cr1,local_label(pushloop)) 2400 dnl __(unlink(tsp)) 2401 dnl __(bx lr) 2402 2403 2404 /* Go out of line to do this. Sheesh. */ 2405 _spentry(vpopargregs) 2406 __(cmp nargs,#0) 2407 __(bxeq lr) 2408 __(vpop_argregs_nz) 2409 __(bx lr) 2410 2411 /* If arg_z is an integer, return in imm0 something whose sign */ 2412 /* is the same as arg_z's. If not an integer, error. */ 2413 _spentry(integer_sign) 2414 __(test_fixnum(arg_z)) 2415 __(moveq imm0,arg_z) 2416 __(bxeq lr) 2417 __(extract_typecode(imm0,arg_z)) 2418 __(cmp imm0,#subtag_bignum) 2419 __(uuo_error_reg_not_xtype(ne,arg_z,xtype_integer)) 2420 __(getvheader(imm0,arg_z)) 2421 __(header_length(imm0,imm0)) /* boxed length = scaled size */ 2422 __(add imm0,imm0,#misc_data_offset-4) /* bias, less 1 element */ 2423 __(ldr imm0,[arg_z,imm0]) 2424 __(cmp imm0,0) 2425 __(movge imm0,#1) 2426 __(movlt imm0,#-1) 2427 __(bx lr) 2428 2429 3088 2430 dnl /* like misc_set, only pass the (boxed) subtag in temp0 */ 3089 2431 dnl _spentry(subtag_misc_set) 3090 dnl __(trap_unless_fulltag_equal(arg_x,fulltag_misc,imm0)) 3091 dnl __(trap_unless_lisptag_equal(arg_y,tag_fixnum,imm0)) 3092 dnl __(vector_length(imm0,arg_x,imm1)) 3093 dnl __(trlge(arg_y,imm0)) 3094 dnl __(unbox_fixnum(imm1,temp0)) 3095 dnl local_label(misc_set_common): 3096 dnl __ifdef(`PPC64') 3097 dnl __(slwi imm1,imm1,3) 3098 dnl __(mov imm0,#LO(local_label(misc_set_jmp))) 3099 dnl __(addis imm0,imm0,HA(local_label(misc_set_jmp))) 3100 dnl __(ldx imm0,imm0,imm1) 3101 dnl __(mtctr imm0) 3102 dnl __(bctr) 3103 dnl local_label(misc_set_jmp): 3104 dnl /* 00-0f */ 3105 dnl .quad local_label(misc_set_invalid) /* 00 even_fixnum */ 3106 dnl .quad local_label(misc_set_invalid) /* 01 imm_0 */ 3107 dnl .quad local_label(misc_set_invalid) /* 02 immheader_0 */ 3108 dnl .quad _SPgvset /* 03 function */ 3109 dnl .quad local_label(misc_set_invalid) /* 04 cons */ 3110 dnl .quad local_label(misc_set_invalid) /* 05 imm_1 */ 3111 dnl .quad local_label(misc_set_invalid) /* 06 immheader_1 */ 3112 dnl .quad _SPgvset /* 07 catch_frame */ 3113 dnl .quad local_label(misc_set_invalid) /* 08 odd_fixnum */ 3114 dnl .quad local_label(misc_set_invalid) /* 09 imm_2 */ 3115 dnl .quad local_label(misc_set_u32) /* 0a code_vector */ 3116 dnl .quad _SPgvset /* 0b slot_vector */ 3117 dnl .quad local_label(misc_set_invalid) /* 0c misc */ 3118 dnl .quad local_label(misc_set_invalid) /* 0d imm3 */ 3119 dnl .quad local_label(misc_set_invalid) /* 0e immheader_3 */ 3120 dnl .quad _SPgvset /* 0f ratio */ 3121 dnl /* 10-1f */ 3122 dnl .quad local_label(misc_set_invalid) /* 10 even_fixnum */ 3123 dnl .quad local_label(misc_set_invalid) /* 11 imm_0 */ 3124 dnl .quad local_label(misc_set_invalid) /* 12 immheader_0 */ 3125 dnl .quad _SPgvset /* 13 symbol_0 */ 3126 dnl .quad local_label(misc_set_invalid) /* 14 cons */ 3127 dnl .quad local_label(misc_set_invalid) /* 15 imm_1 */ 3128 dnl .quad local_label(misc_set_invalid) /* 16 immheader_1 */ 3129 dnl .quad _SPgvset /* 17 lisp_tread */ 3130 dnl .quad local_label(misc_set_invalid) /* 18 odd_fixnum */ 3131 dnl .quad local_label(misc_set_invalid) /* 19 imm_2 */ 3132 dnl .quad local_label(misc_set_u32) /* 1a xcode_vector */ 3133 dnl .quad _SPgvset /* 1b instance */ 3134 dnl .quad local_label(misc_set_invalid) /* 1c misc */ 3135 dnl .quad local_label(misc_set_invalid) /* 1d imm3 */ 3136 dnl .quad local_label(misc_set_u64) /* 1e macptr */ 3137 dnl .quad _SPgvset /* 1f complex */ 3138 dnl /* 20-2f */ 3139 dnl .quad local_label(misc_set_invalid) /* 20 even_fixnum */ 3140 dnl .quad local_label(misc_set_invalid) /* 21 imm_0 */ 3141 dnl .quad local_label(misc_set_invalid) /* 22 immheader_0 */ 3142 dnl .quad local_label(misc_set_invalid) /* 23 nodeheader_0 */ 3143 dnl .quad local_label(misc_set_invalid) /* 24 cons */ 3144 dnl .quad local_label(misc_set_invalid) /* 25 imm_1 */ 3145 dnl .quad local_label(misc_set_invalid) /* 26 immheader_1 */ 3146 dnl .quad _SPgvset /* 27 lock */ 3147 dnl .quad local_label(misc_set_invalid) /* 28 odd_fixnum */ 3148 dnl .quad local_label(misc_set_invalid) /* 29 imm_2 */ 3149 dnl .quad local_label(misc_set_u32) /* 2a bignum */ 3150 dnl .quad _SPgvset /* 2b struct */ 3151 dnl .quad local_label(misc_set_invalid) /* 2c misc */ 3152 dnl .quad local_label(misc_set_invalid) /* 2d imm3 */ 3153 dnl .quad local_label(misc_set_u64) /* 2e dead_macptr */ 3154 dnl .quad local_label(misc_set_invalid) /* 2f nodeheader_3 */ 3155 dnl /* 30-3f */ 3156 dnl .quad local_label(misc_set_invalid) /* 30 even_fixnum */ 3157 dnl .quad local_label(misc_set_invalid) /* 31 imm_0 */ 3158 dnl .quad local_label(misc_set_invalid) /* 32 immheader_0 */ 3159 dnl .quad local_label(misc_set_invalid) /* 33 nodeheader_0 */ 3160 dnl .quad local_label(misc_set_invalid) /* 34 cons */ 3161 dnl .quad local_label(misc_set_invalid) /* 35 imm_1 */ 3162 dnl .quad local_label(misc_set_invalid) /* 36 immheader_1 */ 3163 dnl .quad _SPgvset /* 37 hash_vector */ 3164 dnl .quad local_label(misc_set_invalid) /* 38 odd_fixnum */ 3165 dnl .quad local_label(misc_set_invalid) /* 39 imm_2 */ 3166 dnl .quad local_label(misc_set_u32) /* 3a double_float */ 3167 dnl .quad _SPgvset /* 3b istruct */ 3168 dnl .quad local_label(misc_set_invalid) /* 3c misc */ 3169 dnl .quad local_label(misc_set_invalid) /* 3d imm3 */ 3170 dnl .quad local_label(misc_set_invalid) /* 3e immheader_3 */ 3171 dnl .quad local_label(misc_set_invalid) /* 3f nodeheader_3 */ 3172 dnl /* 40-4f */ 3173 dnl .quad local_label(misc_set_invalid) /* 40 even_fixnum */ 3174 dnl .quad local_label(misc_set_invalid) /* 41 imm_0 */ 3175 dnl .quad local_label(misc_set_invalid) /* 42 immheader_0 */ 3176 dnl .quad local_label(misc_set_invalid) /* 43 nodeheader_0 */ 3177 dnl .quad local_label(misc_set_invalid) /* 44 cons */ 3178 dnl .quad local_label(misc_set_invalid) /* 45 imm_1 */ 3179 dnl .quad local_label(misc_set_invalid) /* 46 immheader_1 */ 3180 dnl .quad _SPgvset /* 47 pool */ 3181 dnl .quad local_label(misc_set_invalid) /* 48 odd_fixnum */ 3182 dnl .quad local_label(misc_set_invalid) /* 49 imm_2 */ 3183 dnl .quad local_label(misc_set_invalid) /* 4a immheader_2 */ 3184 dnl .quad _SPgvset /* 4b value_cell_2 */ 3185 dnl .quad local_label(misc_set_invalid) /* 4c misc */ 3186 dnl .quad local_label(misc_set_invalid) /* 4d imm3 */ 3187 dnl .quad local_label(misc_set_invalid) /* 4e immheader_3 */ 3188 dnl .quad local_label(misc_set_invalid) /* 4f nodeheader_3 */ 3189 dnl /* 50-5f */ 3190 dnl .quad local_label(misc_set_invalid) /* 50 even_fixnum */ 3191 dnl .quad local_label(misc_set_invalid) /* 51 imm_0 */ 3192 dnl .quad local_label(misc_set_invalid) /* 52 immheader_0 */ 3193 dnl .quad local_label(misc_set_invalid) /* 53 nodeheader_0 */ 3194 dnl .quad local_label(misc_set_invalid) /* 54 cons */ 3195 dnl .quad local_label(misc_set_invalid) /* 55 imm_1 */ 3196 dnl .quad local_label(misc_set_invalid) /* 56 immheader_1 */ 3197 dnl .quad _SPgvset /* 57 weak */ 3198 dnl .quad local_label(misc_set_invalid) /* 58 odd_fixnum */ 3199 dnl .quad local_label(misc_set_invalid) /* 59 imm_2 */ 3200 dnl .quad local_label(misc_set_invalid) /* 5a immheader_2 */ 3201 dnl .quad _SPgvset /* 5b xfunction */ 3202 dnl .quad local_label(misc_set_invalid) /* 5c misc */ 3203 dnl .quad local_label(misc_set_invalid) /* 5d imm3 */ 3204 dnl .quad local_label(misc_set_invalid) /* 5e immheader_3 */ 3205 dnl .quad local_label(misc_set_invalid) /* 5f nodeheader_3 */ 3206 dnl /* 60-6f */ 3207 dnl .quad local_label(misc_set_invalid) /* 60 even_fixnum */ 3208 dnl .quad local_label(misc_set_invalid) /* 61 imm_0 */ 3209 dnl .quad local_label(misc_set_invalid) /* 62 immheader_0 */ 3210 dnl .quad local_label(misc_set_invalid) /* 63 nodeheader_0 */ 3211 dnl .quad local_label(misc_set_invalid) /* 64 cons */ 3212 dnl .quad local_label(misc_set_invalid) /* 65 imm_1 */ 3213 dnl .quad local_label(misc_set_invalid) /* 66 immheader_1 */ 3214 dnl .quad _SPgvset /* 67 package */ 3215 dnl .quad local_label(misc_set_invalid) /* 68 odd_fixnum */ 3216 dnl .quad local_label(misc_set_invalid) /* 69 imm_2 */ 3217 dnl .quad local_label(misc_set_invalid) /* 6a immheader_2 */ 3218 dnl .quad local_label(misc_set_invalid) /* 6b nodeheader_2 */ 3219 dnl .quad local_label(misc_set_invalid) /* 6c misc */ 3220 dnl .quad local_label(misc_set_invalid) /* 6d imm3 */ 3221 dnl .quad local_label(misc_set_invalid) /* 6e immheader_3 */ 3222 dnl .quad local_label(misc_set_invalid) /* 6f nodeheader_3 */ 3223 dnl /* 70-7f */ 3224 dnl .quad local_label(misc_set_invalid) /* 70 even_fixnum */ 3225 dnl .quad local_label(misc_set_invalid) /* 71 imm_0 */ 3226 dnl .quad local_label(misc_set_invalid) /* 72 immheader_0 */ 3227 dnl .quad local_label(misc_set_invalid) /* 73 nodeheader_0 */ 3228 dnl .quad local_label(misc_set_invalid) /* 74 cons */ 3229 dnl .quad local_label(misc_set_invalid) /* 75 imm_1 */ 3230 dnl .quad local_label(misc_set_invalid) /* 76 immheader_1 */ 3231 dnl .quad local_label(misc_set_invalid) /* 77 nodeheader_1 */ 3232 dnl .quad local_label(misc_set_invalid) /* 78 odd_fixnum */ 3233 dnl .quad local_label(misc_set_invalid) /* 79 imm_2 */ 3234 dnl .quad local_label(misc_set_invalid) /* 7a immheader_2 */ 3235 dnl .quad local_label(misc_set_invalid) /* 7b nodeheader_2 */ 3236 dnl .quad local_label(misc_set_invalid) /* 7c misc */ 3237 dnl .quad local_label(misc_set_invalid) /* 7d imm3 */ 3238 dnl .quad local_label(misc_set_invalid) /* 7e immheader_3 */ 3239 dnl .quad local_label(misc_set_invalid) /* 7f nodeheader_3 */ 3240 dnl /* 80-8f */ 3241 dnl .quad local_label(misc_set_invalid) /* 80 even_fixnum */ 3242 dnl .quad local_label(misc_set_invalid) /* 81 imm_0 */ 3243 dnl .quad local_label(misc_set_invalid) /* 82 immheader_0 */ 3244 dnl .quad local_label(misc_set_invalid) /* 83 nodeheader_0 */ 3245 dnl .quad local_label(misc_set_invalid) /* 84 cons */ 3246 dnl .quad local_label(misc_set_invalid) /* 85 imm_1 */ 3247 dnl .quad local_label(misc_set_invalid) /* 86 immheader_1 */ 3248 dnl .quad _SPgvset /* 87 arrayH */ 3249 dnl .quad local_label(misc_set_invalid) /* 88 odd_fixnum */ 3250 dnl .quad local_label(misc_set_invalid) /* 89 imm_2 */ 3251 dnl .quad local_label(misc_set_invalid) /* 8a immheader_2 */ 3252 dnl .quad _SPgvset /* 8b vectorH */ 3253 dnl .quad local_label(misc_set_invalid) /* 8c misc */ 3254 dnl .quad local_label(misc_set_invalid) /* 8d imm3 */ 3255 dnl .quad local_label(misc_set_invalid) /* 8e immheader_3 */ 3256 dnl .quad _SPgvset /* 8f simple_vector */ 3257 dnl /* 90-9f */ 3258 dnl .quad local_label(misc_set_invalid) /* 90 even_fixnum */ 3259 dnl .quad local_label(misc_set_invalid) /* 91 imm_0 */ 3260 dnl .quad local_label(misc_set_s8) /* 92 s8 */ 3261 dnl .quad local_label(misc_set_invalid) /* 93 nodeheader_0 */ 3262 dnl .quad local_label(misc_set_invalid) /* 94 cons */ 3263 dnl .quad local_label(misc_set_invalid) /* 95 imm_1 */ 3264 dnl .quad local_label(misc_set_s16) /* 96 immheader_1 */ 3265 dnl .quad local_label(misc_set_invalid) /* 97 nodeheader_1 */ 3266 dnl .quad local_label(misc_set_invalid) /* 98 odd_fixnum */ 3267 dnl .quad local_label(misc_set_invalid) /* 99 imm_2 */ 3268 dnl .quad local_label(misc_set_s32) /* 9a s32 */ 3269 dnl .quad local_label(misc_set_invalid) /* 9b nodeheader_2 */ 3270 dnl .quad local_label(misc_set_invalid) /* 9c misc */ 3271 dnl .quad local_label(misc_set_invalid) /* 9d imm3 */ 3272 dnl .quad local_label(misc_set_s64) /* 9e s64 */ 3273 dnl .quad local_label(misc_set_invalid) /* 9f nodeheader_3 */ 3274 dnl /* a0-af */ 3275 dnl .quad local_label(misc_set_invalid) /* a0 even_fixnum */ 3276 dnl .quad local_label(misc_set_invalid) /* a1 imm_0 */ 3277 dnl .quad local_label(misc_set_u8) /* a2 u8 */ 3278 dnl .quad local_label(misc_set_invalid) /* a3 nodeheader_0 */ 3279 dnl .quad local_label(misc_set_invalid) /* a4 cons */ 3280 dnl .quad local_label(misc_set_invalid) /* a5 imm_1 */ 3281 dnl .quad local_label(misc_set_u16) /* a6 u16 */ 3282 dnl .quad local_label(misc_set_invalid) /* a7 nodeheader_1 */ 3283 dnl .quad local_label(misc_set_invalid) /* a8 odd_fixnum */ 3284 dnl .quad local_label(misc_set_invalid) /* a9 imm_2 */ 3285 dnl .quad local_label(misc_set_u32) /* aa u32 */ 3286 dnl .quad local_label(misc_set_invalid) /* ab nodeheader_2 */ 3287 dnl .quad local_label(misc_set_invalid) /* ac misc */ 3288 dnl .quad local_label(misc_set_invalid) /* ad imm3 */ 3289 dnl .quad local_label(misc_set_u64) /* ae u64 */ 3290 dnl .quad local_label(misc_set_invalid) /* af nodeheader_3 */ 3291 dnl /* b0-bf */ 3292 dnl .quad local_label(misc_set_invalid) /* b0 even_fixnum */ 3293 dnl .quad local_label(misc_set_invalid) /* b1 imm_0 */ 3294 dnl .quad local_label(misc_set_invalid) /* b2 immheader_0 */ 3295 dnl .quad local_label(misc_set_invalid) /* b3 nodeheader_0 */ 3296 dnl .quad local_label(misc_set_invalid) /* b4 cons */ 3297 dnl .quad local_label(misc_set_invalid) /* b5 imm_1 */ 3298 dnl .quad local_label(misc_set_invalid) /* b6 immheader_1 */ 3299 dnl .quad local_label(misc_set_invalid) /* b7 nodeheader_1 */ 3300 dnl .quad local_label(misc_set_invalid) /* b8 odd_fixnum */ 3301 dnl .quad local_label(misc_set_invalid) /* b9 imm_2 */ 3302 dnl .quad local_label(misc_set_single_float_vector) /* ba sf vector */ 3303 dnl .quad local_label(misc_set_invalid) /* bb nodeheader_2 */ 3304 dnl .quad local_label(misc_set_invalid) /* bc misc */ 3305 dnl .quad local_label(misc_set_invalid) /* bd imm3 */ 3306 dnl .quad local_label(misc_set_fixnum_vector) /* be fixnum_vector */ 3307 dnl .quad local_label(misc_set_invalid) /* bf nodeheader_3 */ 3308 dnl /* c0-cf */ 3309 dnl .quad local_label(misc_set_invalid) /* c0 even_fixnum */ 3310 dnl .quad local_label(misc_set_invalid) /* c1 imm_0 */ 3311 dnl .quad local_label(misc_set_invalid) /* c2 immheader_0 */ 3312 dnl .quad local_label(misc_set_invalid) /* c3 nodeheader_0 */ 3313 dnl .quad local_label(misc_set_invalid) /* c4 cons */ 3314 dnl .quad local_label(misc_set_invalid) /* c5 imm_1 */ 3315 dnl .quad local_label(misc_set_invalid) /* c6 immheader_1 */ 3316 dnl .quad local_label(misc_set_invalid) /* c7 nodeheader_1 */ 3317 dnl .quad local_label(misc_set_invalid) /* c8 odd_fixnum */ 3318 dnl .quad local_label(misc_set_invalid) /* c9 imm_2 */ 3319 dnl .quad local_label(misc_set_invalid) /* ca immheader_2 */ 3320 dnl .quad local_label(misc_set_invalid) /* cb nodeheader_2 */ 3321 dnl .quad local_label(misc_set_invalid) /* cc misc */ 3322 dnl .quad local_label(misc_set_invalid) /* cd imm3 */ 3323 dnl .quad local_label(misc_set_double_float_vector) /* ce double-float vector */ 3324 dnl .quad local_label(misc_set_invalid) /* cf nodeheader_3 */ 3325 dnl /* d0-df */ 3326 dnl .quad local_label(misc_set_invalid) /* d0 even_fixnum */ 3327 dnl .quad local_label(misc_set_invalid) /* d1 imm_0 */ 3328 dnl .quad local_label(misc_set_string) /* d2 string */ 3329 dnl .quad local_label(misc_set_invalid) /* d3 nodeheader_0 */ 3330 dnl .quad local_label(misc_set_invalid) /* d4 cons */ 3331 dnl .quad local_label(misc_set_invalid) /* d5 imm_1 */ 3332 dnl .quad local_label(misc_set_invalid) /* d6 immheader_1 */ 3333 dnl .quad local_label(misc_set_invalid) /* d7 nodeheader_1 */ 3334 dnl .quad local_label(misc_set_invalid) /* d8 odd_fixnum */ 3335 dnl .quad local_label(misc_set_invalid) /* d9 imm_2 */ 3336 dnl .quad local_label(misc_set_new_string) /* da new_string */ 3337 dnl .quad local_label(misc_set_invalid) /* db nodeheader_2 */ 3338 dnl .quad local_label(misc_set_invalid) /* dc misc */ 3339 dnl .quad local_label(misc_set_invalid) /* dd imm3 */ 3340 dnl .quad local_label(misc_set_invalid) /* de immheader_3 */ 3341 dnl .quad local_label(misc_set_invalid) /* df nodeheader_3 */ 3342 dnl /* e0-ef */ 3343 dnl .quad local_label(misc_set_invalid) /* e0 even_fixnum */ 3344 dnl .quad local_label(misc_set_invalid) /* e1 imm_0 */ 3345 dnl .quad local_label(misc_set_invalid) /* e2 immheader_0 */ 3346 dnl .quad local_label(misc_set_invalid) /* e3 nodeheader_0 */ 3347 dnl .quad local_label(misc_set_invalid) /* e4 cons */ 3348 dnl .quad local_label(misc_set_invalid) /* e5 imm_1 */ 3349 dnl .quad local_label(misc_set_invalid) /* e6 immheader_1 */ 3350 dnl .quad local_label(misc_set_invalid) /* e7 nodeheader_1 */ 3351 dnl .quad local_label(misc_set_invalid) /* e8 odd_fixnum */ 3352 dnl .quad local_label(misc_set_invalid) /* e9 imm_2 */ 3353 dnl .quad local_label(misc_set_invalid) /* ea immheader_2 */ 3354 dnl .quad local_label(misc_set_invalid) /* eb nodeheader_2 */ 3355 dnl .quad local_label(misc_set_invalid) /* ec misc */ 3356 dnl .quad local_label(misc_set_invalid) /* ed imm3 */ 3357 dnl .quad local_label(misc_set_invalid) /* ee immheader_3 */ 3358 dnl .quad local_label(misc_set_invalid) /* ef nodeheader_3 */ 3359 dnl /* f0-ff */ 3360 dnl .quad local_label(misc_set_invalid) /* f0 even_fixnum */ 3361 dnl .quad local_label(misc_set_invalid) /* f1 imm_0 */ 3362 dnl .quad local_label(misc_set_invalid) /* f2 immheader_0 */ 3363 dnl .quad local_label(misc_set_invalid) /* f3 nodeheader_0 */ 3364 dnl .quad local_label(misc_set_invalid) /* f4 cons */ 3365 dnl .quad local_label(misc_set_invalid) /* f5 imm_1 */ 3366 dnl .quad local_label(misc_set_bit_vector) /* f6 bit_vector */ 3367 dnl .quad local_label(misc_set_invalid) /* f7 nodeheader_1 */ 3368 dnl .quad local_label(misc_set_invalid) /* f8 odd_fixnum */ 3369 dnl .quad local_label(misc_set_invalid) /* f9 imm_2 */ 3370 dnl .quad local_label(misc_set_invalid) /* fa immheader_2 */ 3371 dnl .quad local_label(misc_set_invalid) /* fb nodeheader_2 */ 3372 dnl .quad local_label(misc_set_invalid) /* fc misc */ 3373 dnl .quad local_label(misc_set_invalid) /* fd imm3 */ 3374 dnl .quad local_label(misc_set_invalid) /* fe immheader_3 */ 3375 dnl .quad local_label(misc_set_invalid) /* ff nodeheader_3 */ 3376 dnl 3377 dnl local_label(misc_set_bit_vector): 3378 dnl __(lis imm3,0x8000) 3379 dnl __(extract_unsigned_byte_bits_(imm0,arg_z,1)) 3380 dnl __(extrwi imm1,arg_y,5,32-(fixnumshift+5)) /* imm1 = bitnum */ 3381 dnl __(srdi imm0,arg_y,5+fixnumshift) 3382 dnl __(srw imm3,imm3,imm1) 3383 dnl __(bne local_label(misc_set_bad)) 3384 dnl __(cmpdi cr0,arg_z,0) 3385 dnl __(sldi imm0,imm0,2) 3386 dnl __(la imm0,misc_data_offset(imm0)) 3387 dnl __(lwzx imm2,arg_x,imm0) 3388 dnl __(beq 1f) 3389 dnl __(or imm2,imm3,imm2) 3390 dnl __(stwx imm2,arg_x,imm0) 3391 dnl __(bx lr) 3392 dnl 1: __(andc imm2,imm2,imm3) 3393 dnl __(stwx imm2,arg_x,imm0) 3394 dnl __(bx lr) 3395 dnl local_label(misc_set_s16): 3396 dnl __(extract_lisptag(imm2,arg_z)) 3397 dnl __(sldi imm0,arg_z,64-(16+fixnumshift)) 3398 dnl __(srdi imm1,arg_y,2) 3399 dnl __(cmpdi cr7,imm2,tag_fixnum) 3400 dnl __(sradi imm0,imm0,64-(16+fixnumshift)) 3401 dnl __(cmpd imm0,arg_z) 3402 dnl __(la imm1,misc_data_offset(imm1)) 3403 dnl __(unbox_fixnum(imm0,arg_z)) 3404 dnl __(bne local_label(misc_set_bad)) 3405 dnl __(bne cr7,local_label(misc_set_bad)) 3406 dnl __(sthx imm0,arg_x,imm1) 3407 dnl __(bx lr) 3408 dnl local_label(misc_set_u16): 3409 dnl __(extract_unsigned_byte_bits_(imm0,arg_z,16)) 3410 dnl __(srdi imm1,arg_y,2) 3411 dnl __(unbox_fixnum(imm0,arg_z)) 3412 dnl __(la imm1,misc_data_offset(imm1)) 3413 dnl __(bne local_label(misc_set_bad)) 3414 dnl __(sthx imm0,arg_x,imm1) 3415 dnl __(bx lr) 3416 dnl local_label(misc_set_single_float_vector): 3417 dnl __(extract_fulltag(imm3,arg_z)) 3418 dnl __(srdi imm4,arg_y,1) 3419 dnl __(cmpdi cr3,imm3,subtag_single_float) 3420 dnl __(la imm4,misc_data_offset(imm4)) 3421 dnl __(bne cr3,local_label(misc_set_bad)) 3422 dnl __(srdi imm0,arg_z,32) 3423 dnl __(stwx imm0,arg_x,imm4) 3424 dnl __(bx lr) 3425 dnl local_label(misc_set_s32): 3426 dnl __(extract_lisptag(imm2,arg_z)) 3427 dnl __(srdi imm4,arg_y,1) 3428 dnl __(unbox_fixnum(imm0,arg_z)) 3429 dnl __(cmpdi imm2,tag_fixnum) 3430 dnl __(sldi imm1,imm0,32) 3431 dnl __(sradi imm1,imm1,32) 3432 dnl __(la imm4,misc_data_offset(imm4)) 3433 dnl __(bne local_label(misc_set_bad)) 3434 dnl __(cmpd imm1,imm0) 3435 dnl __(bne local_label(misc_set_bad)) 3436 dnl __(stwx imm0,arg_x,imm4) 3437 dnl __(bx lr) 3438 dnl local_label(misc_set_u32): 3439 dnl __(extract_unsigned_byte_bits_(imm0,arg_z,32)) 3440 dnl __(srdi imm4,arg_y,1) 3441 dnl __(la imm4,misc_data_offset(imm4)) 3442 dnl __(unbox_fixnum(imm0,arg_z)) 3443 dnl __(bne local_label(misc_set_bad)) 3444 dnl __(stwx imm0,arg_x,imm4) 3445 dnl __(bx lr) 3446 dnl local_label(misc_set_new_string): 3447 dnl __(extract_lowbyte(imm0,arg_z)) 3448 dnl __(srdi imm4,arg_y,1) 3449 dnl __(cmpdi imm0,subtag_character) 3450 dnl __(la imm4,misc_data_offset(imm4)) 3451 dnl __(srwi imm0,arg_z,charcode_shift) 3452 dnl __(bne local_label(misc_set_bad)) 3453 dnl __(stwx imm0,arg_x,imm4) 3454 dnl __(bx lr) 3455 dnl local_label(misc_set_string): 3456 dnl __(extract_lowbyte(imm0,arg_z)) 3457 dnl __(srdi imm4,arg_y,3) 3458 dnl __(cmpdi imm0,subtag_character) 3459 dnl __(la imm4,misc_data_offset(imm4)) 3460 dnl __(bne cr0,local_label(misc_set_bad)) 3461 dnl __(srwi imm0,arg_z,charcode_shift) 3462 dnl __(stbx imm0,arg_x,imm4) 3463 dnl __(bx lr) 3464 dnl local_label(misc_set_s8): 3465 dnl __(extract_lisptag(imm2,arg_z)) 3466 dnl __(unbox_fixnum(imm0,arg_z)) 3467 dnl __(cmpdi cr2,imm2,tag_fixnum) 3468 dnl __(srdi imm4,arg_y,3) 3469 dnl __(sldi imm1,imm0,56) 3470 dnl __(sradi imm1,imm1,56) 3471 dnl __(cmpd imm1,imm0) 3472 dnl __(bne cr2,local_label(misc_set_bad)) 3473 dnl __(la imm4,misc_data_offset(imm4)) 3474 dnl __(bne local_label(misc_set_bad)) 3475 dnl __(stbx imm0,arg_x,imm4) 3476 dnl __(bx lr) 3477 dnl local_label(misc_set_u8): 3478 dnl __(extract_unsigned_byte_bits_(imm0,arg_z,8)) 3479 dnl __(srdi imm4,arg_y,3) 3480 dnl __(unbox_fixnum(imm0,arg_z)) 3481 dnl __(la imm4,misc_data_offset(imm4)) 3482 dnl __(bne local_label(misc_set_bad)) 3483 dnl __(stbx imm0,arg_x,imm4) 3484 dnl __(bx lr) 3485 dnl local_label(misc_set_u64): 3486 dnl __(extract_lisptag(imm0,arg_z)) 3487 dnl __(extract_fulltag(imm2,arg_z)) 3488 dnl __(cmpdi cr0,arg_z,0) 3489 dnl __(cmpdi cr7,imm0,0) 3490 dnl __(cmpdi cr6,imm2,fulltag_misc) 3491 dnl __(la imm4,misc_data_offset(arg_y)) 3492 dnl __(bne cr7,local_label(setu64_maybe_bignum)) 3493 dnl __(unbox_fixnum(imm0,arg_z)) 3494 dnl __(blt cr0,local_label(misc_set_bad)) 3495 dnl __(stdx imm0,arg_x,imm4) 3496 dnl __(bx lr) 3497 dnl local_label(setu64_maybe_bignum): 3498 dnl __(bne cr6,local_label(misc_set_bad)) 3499 dnl __(getvheader(imm1,arg_z)) 3500 dnl __(ld imm0,misc_data_offset(arg_z)) 3501 dnl __(rotldi imm0,imm0,32) 3502 dnl __(cmpdi cr2,imm1,two_digit_bignum_header) 3503 dnl __(cmpdi cr3,imm1,three_digit_bignum_header) 3504 dnl __(cmpdi cr0,imm0,0) 3505 dnl __(beq cr2,1f) 3506 dnl __(bne cr3,local_label(misc_set_bad)) 3507 dnl __(lwz imm3,misc_data_offset+8(arg_z)) 3508 dnl __(cmpwi cr0,imm3,0) 3509 dnl __(bne cr0,local_label(misc_set_bad)) 3510 dnl __(stdx imm0,arg_x,imm4) 3511 dnl __(bx lr) 3512 dnl 1: __(blt cr0,local_label(misc_set_bad)) 3513 dnl __(stdx imm0,arg_x,imm4) 3514 dnl __(bx lr) 3515 dnl local_label(misc_set_double_float_vector): 3516 dnl __(extract_typecode(imm0,arg_z)) 3517 dnl __(la imm4,misc_data_offset(arg_y)) 3518 dnl __(cmpdi imm0,subtag_double_float) 3519 dnl __(bne local_label(misc_set_bad)) 3520 dnl __(ld imm0,misc_dfloat_offset(arg_z)) 3521 dnl __(stdx imm0,arg_x,imm4) 3522 dnl __(bx lr) 3523 dnl local_label(misc_set_fixnum_vector): 3524 dnl __(extract_lisptag(imm2,arg_z)) 3525 dnl __(unbox_fixnum(imm0,arg_z)) 3526 dnl __(cmpdi cr2,imm2,tag_fixnum) 3527 dnl __(la imm4,misc_data_offset(arg_y)) 3528 dnl __(bne cr2,local_label(misc_set_bad)) 3529 dnl __(stdx imm0,arg_x,imm4) 3530 dnl __(bx lr) 3531 dnl local_label(misc_set_s64): 3532 dnl __(extract_lisptag(imm2,arg_z)) 3533 dnl __(extract_fulltag(imm3,arg_z)) 3534 dnl __(unbox_fixnum(imm0,arg_z)) 3535 dnl __(cmpdi cr2,imm2,tag_fixnum) 3536 dnl __(cmpdi cr6,imm3,fulltag_misc) 3537 dnl __(la imm4,misc_data_offset(arg_y)) 3538 dnl __(bne cr2,local_label(sets64_maybe_bignum)) 3539 dnl __(stdx imm0,arg_x,imm4) 3540 dnl __(bx lr) 3541 dnl local_label(sets64_maybe_bignum): 3542 dnl __(bne cr6,local_label(misc_set_bad)) 3543 dnl __(getvheader(imm1,arg_z)) 3544 dnl __(ld imm0,misc_data_offset(arg_z)) 3545 dnl __(cmpdi cr1,imm1,two_digit_bignum_header) 3546 dnl __(rotldi imm0,imm0,32) 3547 dnl __(bne cr1,local_label(misc_set_bad)) 3548 dnl __(stdx imm0,arg_x,imm4) 3549 dnl __(bx lr) 3550 dnl local_label(misc_set_bad): 3551 dnl __(mov arg_y,arg_z) 3552 dnl __(mov arg_z,arg_x) 3553 dnl __(mov arg_x,#XNOTELT) 3554 dnl __(set_nargs(3)) 3555 dnl __(b _SPksignalerr) 3556 dnl local_label(misc_set_invalid): 3557 dnl __(mov temp0,#XSETBADVEC) 3558 dnl __(set_nargs(4)) 3559 dnl __(vpush1(temp0)) 3560 dnl __(b _SPksignalerr) 3561 dnl __else 3562 dnl __(slwi imm1,imm1,2) 3563 dnl __(mov imm0,#LO(local_label(misc_set_jmp))) 3564 dnl __(addis imm0,imm0,HA(local_label(misc_set_jmp))) 3565 dnl __(lwzx imm0,imm0,imm1) 3566 dnl __(mtctr imm0) 3567 dnl __(bctr) 3568 dnl local_label(misc_set_jmp): 3569 dnl /* 00-0f */ 3570 dnl .long local_label(misc_set_invalid) /* 00 even_fixnum */ 3571 dnl .long local_label(misc_set_invalid) /* 01 cons */ 3572 dnl .long local_label(misc_set_invalid) /* 02 nodeheader */ 3573 dnl .long local_label(misc_set_invalid) /* 03 imm */ 3574 dnl .long local_label(misc_set_invalid) /* 04 odd_fixnum */ 3575 dnl .long local_label(misc_set_invalid) /* 05 nil */ 3576 dnl .long local_label(misc_set_invalid) /* 06 misc */ 3577 dnl .long local_label(misc_set_u32) /* 07 bignum */ 3578 dnl .long local_label(misc_set_invalid) /* 08 even_fixnum */ 3579 dnl .long local_label(misc_set_invalid) /* 09 cons */ 3580 dnl .long _SPgvset /* 0a ratio */ 3581 dnl .long local_label(misc_set_invalid) /* 0b imm */ 3582 dnl .long local_label(misc_set_invalid) /* 0c odd_fixnum */ 3583 dnl .long local_label(misc_set_invalid) /* 0d nil */ 3584 dnl .long local_label(misc_set_invalid) /* 0e misc */ 3585 dnl .long local_label(misc_set_u32) /* 0f single_float */ 3586 dnl /* 10-1f */ 3587 dnl .long local_label(misc_set_invalid) /* 10 even_fixnum */ 3588 dnl .long local_label(misc_set_invalid) /* 11 cons */ 3589 dnl .long local_label(misc_set_invalid) /* 12 nodeheader */ 3590 dnl .long local_label(misc_set_invalid) /* 13 imm */ 3591 dnl .long local_label(misc_set_invalid) /* 14 odd_fixnum */ 3592 dnl .long local_label(misc_set_invalid) /* 15 nil */ 3593 dnl .long local_label(misc_set_invalid) /* 16 misc */ 3594 dnl .long local_label(misc_set_u32) /* 17 double_float */ 3595 dnl .long local_label(misc_set_invalid) /* 18 even_fixnum */ 3596 dnl .long local_label(misc_set_invalid) /* 19 cons */ 3597 dnl .long _SPgvset /* 1a complex */ 3598 dnl .long local_label(misc_set_invalid) /* 1b imm */ 3599 dnl .long local_label(misc_set_invalid) /* 1c odd_fixnum */ 3600 dnl .long local_label(misc_set_invalid) /* 1d nil */ 3601 dnl .long local_label(misc_set_invalid) /* 1e misc */ 3602 dnl .long local_label(misc_set_u32) /* 1f macptr */ 3603 dnl /* 20-2f */ 3604 dnl .long local_label(misc_set_invalid) /* 20 even_fixnum */ 3605 dnl .long local_label(misc_set_invalid) /* 21 cons */ 3606 dnl .long _SPgvset /* 22 catch_frame */ 3607 dnl .long local_label(misc_set_invalid) /* 23 imm */ 3608 dnl .long local_label(misc_set_invalid) /* 24 odd_fixnum */ 3609 dnl .long local_label(misc_set_invalid) /* 25 nil */ 3610 dnl .long local_label(misc_set_invalid) /* 26 misc */ 3611 dnl .long local_label(misc_set_u32) /* 27 dead_macptr */ 3612 dnl .long local_label(misc_set_invalid) /* 28 even_fixnum */ 3613 dnl .long local_label(misc_set_invalid) /* 29 cons */ 3614 dnl .long _SPgvset /* 2a function */ 3615 dnl .long local_label(misc_set_invalid) /* 2b imm */ 3616 dnl .long local_label(misc_set_invalid) /* 2c odd_fixnum */ 3617 dnl .long local_label(misc_set_invalid) /* 2d nil */ 3618 dnl .long local_label(misc_set_invalid) /* 2e misc */ 3619 dnl .long local_label(misc_set_u32) /* 2f code_vector */ 3620 dnl /* 30-3f */ 3621 dnl .long local_label(misc_set_invalid) /* 30 even_fixnum */ 3622 dnl .long local_label(misc_set_invalid) /* 31 cons */ 3623 dnl .long _SPgvset /* 32 lisp_thread */ 3624 dnl .long local_label(misc_set_invalid) /* 33 imm */ 3625 dnl .long local_label(misc_set_invalid) /* 34 odd_fixnum */ 3626 dnl .long local_label(misc_set_invalid) /* 35 nil */ 3627 dnl .long local_label(misc_set_invalid) /* 36 misc */ 3628 dnl .long local_label(misc_set_u32) /* 37 creole */ 3629 dnl .long local_label(misc_set_invalid) /* 38 even_fixnum */ 3630 dnl .long local_label(misc_set_invalid) /* 39 cons */ 3631 dnl .long _SPgvset /* 3a symbol */ 3632 dnl .long local_label(misc_set_invalid) /* 3b imm */ 3633 dnl .long local_label(misc_set_invalid) /* 3c odd_fixnum */ 3634 dnl .long local_label(misc_set_invalid) /* 3d nil */ 3635 dnl .long local_label(misc_set_invalid) /* 3e misc */ 3636 dnl .long local_label(misc_set_u32) /* 3f xcode_vector */ 3637 dnl /* 40-4f */ 3638 dnl .long local_label(misc_set_invalid) /* 40 even_fixnum */ 3639 dnl .long local_label(misc_set_invalid) /* 41 cons */ 3640 dnl .long _SPgvset /* 42 lock */ 3641 dnl .long local_label(misc_set_invalid) /* 43 imm */ 3642 dnl .long local_label(misc_set_invalid) /* 44 odd_fixnum */ 3643 dnl .long local_label(misc_set_invalid) /* 45 nil */ 3644 dnl .long local_label(misc_set_invalid) /* 46 misc */ 3645 dnl .long local_label(misc_set_invalid) /* 47 immheader */ 3646 dnl .long local_label(misc_set_invalid) /* 48 even_fixnum */ 3647 dnl .long local_label(misc_set_invalid) /* 49 cons */ 3648 dnl .long _SPgvset /* 4a hash_vector */ 3649 dnl .long local_label(misc_set_invalid) /* 4b imm */ 3650 dnl .long local_label(misc_set_invalid) /* 4c odd_fixnum */ 3651 dnl .long local_label(misc_set_invalid) /* 4d nil */ 3652 dnl .long local_label(misc_set_invalid) /* 4e misc */ 3653 dnl .long local_label(misc_set_invalid) /* 4f immheader */ 3654 dnl /* 50-5f */ 3655 dnl .long local_label(misc_set_invalid) /* 50 even_fixnum */ 3656 dnl .long local_label(misc_set_invalid) /* 51 cons */ 3657 dnl .long _SPgvset /* 52 pool */ 3658 dnl .long local_label(misc_set_invalid) /* 53 imm */ 3659 dnl .long local_label(misc_set_invalid) /* 54 odd_fixnum */ 3660 dnl .long local_label(misc_set_invalid) /* 55 nil */ 3661 dnl .long local_label(misc_set_invalid) /* 56 misc */ 3662 dnl .long local_label(misc_set_invalid) /* 57 immheader */ 3663 dnl .long local_label(misc_set_invalid) /* 58 even_fixnum */ 3664 dnl .long local_label(misc_set_invalid) /* 59 cons */ 3665 dnl .long _SPgvset /* 5a weak */ 3666 dnl .long local_label(misc_set_invalid) /* 5b imm */ 3667 dnl .long local_label(misc_set_invalid) /* 5c odd_fixnum */ 3668 dnl .long local_label(misc_set_invalid) /* 5d nil */ 3669 dnl .long local_label(misc_set_invalid) /* 5e misc */ 3670 dnl .long local_label(misc_set_invalid) /* 5f immheader */ 3671 dnl /* 60-6f */ 3672 dnl .long local_label(misc_set_invalid) /* 60 even_fixnum */ 3673 dnl .long local_label(misc_set_invalid) /* 61 cons */ 3674 dnl .long _SPgvset /* 62 package */ 3675 dnl .long local_label(misc_set_invalid) /* 63 imm */ 3676 dnl .long local_label(misc_set_invalid) /* 64 odd_fixnum */ 3677 dnl .long local_label(misc_set_invalid) /* 65 nil */ 3678 dnl .long local_label(misc_set_invalid) /* 66 misc */ 3679 dnl .long local_label(misc_set_invalid) /* 67 immheader */ 3680 dnl .long local_label(misc_set_invalid) /* 68 even_fixnum */ 3681 dnl .long local_label(misc_set_invalid) /* 69 cons */ 3682 dnl .long _SPgvset /* 6a slot_vector */ 3683 dnl .long local_label(misc_set_invalid) /* 6b imm */ 3684 dnl .long local_label(misc_set_invalid) /* 6c odd_fixnum */ 3685 dnl .long local_label(misc_set_invalid) /* 6d nil */ 3686 dnl .long local_label(misc_set_invalid) /* 6e misc */ 3687 dnl .long local_label(misc_set_invalid) /* 6f immheader */ 3688 dnl /* 70-7f */ 3689 dnl .long local_label(misc_set_invalid) /* 70 even_fixnum */ 3690 dnl .long local_label(misc_set_invalid) /* 71 cons */ 3691 dnl .long _SPgvset /* 72 instance */ 3692 dnl .long local_label(misc_set_invalid) /* 73 imm */ 3693 dnl .long local_label(misc_set_invalid) /* 74 odd_fixnum */ 3694 dnl .long local_label(misc_set_invalid) /* 75 nil */ 3695 dnl .long local_label(misc_set_invalid) /* 76 misc */ 3696 dnl .long local_label(misc_set_invalid) /* 77 immheader */ 3697 dnl .long local_label(misc_set_invalid) /* 78 even_fixnum */ 3698 dnl .long local_label(misc_set_invalid) /* 79 cons */ 3699 dnl .long _SPgvset /* 7a struct */ 3700 dnl .long local_label(misc_set_invalid) /* 7b imm */ 3701 dnl .long local_label(misc_set_invalid) /* 7c odd_fixnum */ 3702 dnl .long local_label(misc_set_invalid) /* 7d nil */ 3703 dnl .long local_label(misc_set_invalid) /* 7e misc */ 3704 dnl .long local_label(misc_set_invalid) /* 7f immheader */ 3705 dnl /* 80-8f */ 3706 dnl .long local_label(misc_set_invalid) /* 80 even_fixnum */ 3707 dnl .long local_label(misc_set_invalid) /* 81 cons */ 3708 dnl .long _SPgvset /* 82 istruct */ 3709 dnl .long local_label(misc_set_invalid) /* 83 imm */ 3710 dnl .long local_label(misc_set_invalid) /* 84 odd_fixnum */ 3711 dnl .long local_label(misc_set_invalid) /* 85 nil */ 3712 dnl .long local_label(misc_set_invalid) /* 86 misc */ 3713 dnl .long local_label(misc_set_invalid) /* 87 immheader */ 3714 dnl .long local_label(misc_set_invalid) /* 88 even_fixnum */ 3715 dnl .long local_label(misc_set_invalid) /* 89 cons */ 3716 dnl .long _SPgvset /* 8a value_cell */ 3717 dnl .long local_label(misc_set_invalid) /* 8b imm */ 3718 dnl .long local_label(misc_set_invalid) /* 8c odd_fixnum */ 3719 dnl .long local_label(misc_set_invalid) /* 8d nil */ 3720 dnl .long local_label(misc_set_invalid) /* 8e misc */ 3721 dnl .long local_label(misc_set_invalid) /* 8f immheader */ 3722 dnl /* 90-9f */ 3723 dnl .long local_label(misc_set_invalid) /* 90 even_fixnum */ 3724 dnl .long local_label(misc_set_invalid) /* 91 cons */ 3725 dnl .long _SPgvset /* 92 xfunction */ 3726 dnl .long local_label(misc_set_invalid) /* 93 imm */ 3727 dnl .long local_label(misc_set_invalid) /* 94 odd_fixnum */ 3728 dnl .long local_label(misc_set_invalid) /* 95 nil */ 3729 dnl .long local_label(misc_set_invalid) /* 96 misc */ 3730 dnl .long local_label(misc_set_invalid) /* 97 immheader */ 3731 dnl .long local_label(misc_set_invalid) /* 98 even_fixnum */ 3732 dnl .long local_label(misc_set_invalid) /* 99 cons */ 3733 dnl .long _SPgvset /* 9a arrayH */ 3734 dnl .long local_label(misc_set_invalid) /* 9b imm */ 3735 dnl .long local_label(misc_set_invalid) /* 9c odd_fixnum */ 3736 dnl .long local_label(misc_set_invalid) /* 9d nil */ 3737 dnl .long local_label(misc_set_invalid) /* 9e misc */ 3738 dnl .long local_label(misc_set_invalid) /* 9f immheader */ 3739 dnl /* a0-af */ 3740 dnl .long local_label(misc_set_invalid) /* a0 even_fixnum */ 3741 dnl .long local_label(misc_set_invalid) /* a1 cons */ 3742 dnl .long _SPgvset /* a2 vectorH */ 3743 dnl .long local_label(misc_set_invalid) /* a3 imm */ 3744 dnl .long local_label(misc_set_invalid) /* a4 odd_fixnum */ 3745 dnl .long local_label(misc_set_invalid) /* a5 nil */ 3746 dnl .long local_label(misc_set_invalid) /* a6 misc */ 3747 dnl .long local_label(misc_set_single_float_vector) /* a7 sf vector */ 3748 dnl .long local_label(misc_set_invalid) /* a8 even_fixnum */ 3749 dnl .long local_label(misc_set_invalid) /* a9 cons */ 3750 dnl .long _SPgvset /* aa vectorH */ 3751 dnl .long local_label(misc_set_invalid) /* ab imm */ 3752 dnl .long local_label(misc_set_invalid) /* ac odd_fixnum */ 3753 dnl .long local_label(misc_set_invalid) /* ad nil */ 3754 dnl .long local_label(misc_set_invalid) /* ae misc */ 3755 dnl .long local_label(misc_set_u32) /* af u32 */ 3756 dnl /* b0-bf */ 3757 dnl .long local_label(misc_set_invalid) /* b0 even_fixnum */ 3758 dnl .long local_label(misc_set_invalid) /* b1 cons */ 3759 dnl .long local_label(misc_set_invalid) /* b2 node */ 3760 dnl .long local_label(misc_set_invalid) /* b3 imm */ 3761 dnl .long local_label(misc_set_invalid) /* b4 odd_fixnum */ 3762 dnl .long local_label(misc_set_invalid) /* b5 nil */ 3763 dnl .long local_label(misc_set_invalid) /* b6 misc */ 3764 dnl .long local_label(misc_set_s32) /* b7 s32 */ 3765 dnl .long local_label(misc_set_invalid) /* b8 even_fixnum */ 3766 dnl .long local_label(misc_set_invalid) /* b9 cons */ 3767 dnl .long local_label(misc_set_invalid) /* ba nodeheader */ 3768 dnl .long local_label(misc_set_invalid) /* bb imm */ 3769 dnl .long local_label(misc_set_invalid) /* bc odd_fixnum */ 3770 dnl .long local_label(misc_set_invalid) /* bd nil */ 3771 dnl .long local_label(misc_set_invalid) /* be misc */ 3772 dnl .long local_label(misc_set_fixnum_vector) /* bf fixnum_vector */ 3773 dnl /* c0-cf */ 3774 dnl .long local_label(misc_set_invalid) /* c0 even_fixnum */ 3775 dnl .long local_label(misc_set_invalid) /* c1 cons */ 3776 dnl .long local_label(misc_set_invalid) /* c2 nodeheader */ 3777 dnl .long local_label(misc_set_invalid) /* c3 imm */ 3778 dnl .long local_label(misc_set_invalid) /* c4 odd_fixnum */ 3779 dnl .long local_label(misc_set_invalid) /* c5 nil */ 3780 dnl .long local_label(misc_set_invalid) /* c6 misc */ 3781 dnl .long local_label(misc_set_new_string) /* c7 new_string */ 3782 dnl .long local_label(misc_set_invalid) /* c8 even_fixnum */ 3783 dnl .long local_label(misc_set_invalid) /* c9 cons */ 3784 dnl .long local_label(misc_set_invalid) /* ca nodeheader */ 3785 dnl .long local_label(misc_set_invalid) /* cb imm */ 3786 dnl .long local_label(misc_set_invalid) /* cc odd_fixnum */ 3787 dnl .long local_label(misc_set_invalid) /* cd nil */ 3788 dnl .long local_label(misc_set_invalid) /* ce misc */ 3789 dnl .long local_label(misc_set_u8) /* cf u8 */ 3790 dnl /* d0-df */ 3791 dnl .long local_label(misc_set_invalid) /* d0 even_fixnum */ 3792 dnl .long local_label(misc_set_invalid) /* d1 cons */ 3793 dnl .long local_label(misc_set_invalid) /* d2 nodeheader */ 3794 dnl .long local_label(misc_set_invalid) /* d3 imm */ 3795 dnl .long local_label(misc_set_invalid) /* d4 odd_fixnum */ 3796 dnl .long local_label(misc_set_invalid) /* d5 nil */ 3797 dnl .long local_label(misc_set_invalid) /* d6 misc */ 3798 dnl .long local_label(misc_set_s8) /* d7 s8 */ 3799 dnl .long local_label(misc_set_invalid) /* d8 even_fixnum */ 3800 dnl .long local_label(misc_set_invalid) /* d9 cons */ 3801 dnl .long local_label(misc_set_invalid) /* da nodeheader */ 3802 dnl .long local_label(misc_set_invalid) /* db imm */ 3803 dnl .long local_label(misc_set_invalid) /* dc odd_fixnum */ 3804 dnl .long local_label(misc_set_invalid) /* dd nil */ 3805 dnl .long local_label(misc_set_invalid) /* de misc */ 3806 dnl .long local_label(misc_set_old_string) /* df (old) simple_base_string */ 3807 dnl /* e0-ef */ 3808 dnl .long local_label(misc_set_invalid) /* e0 even_fixnum */ 3809 dnl .long local_label(misc_set_invalid) /* e1 cons */ 3810 dnl .long local_label(misc_set_invalid) /* e2 nodeheader */ 3811 dnl .long local_label(misc_set_invalid) /* e3 imm */ 3812 dnl .long local_label(misc_set_invalid) /* e4 odd_fixnum */ 3813 dnl .long local_label(misc_set_invalid) /* e5 nil */ 3814 dnl .long local_label(misc_set_invalid) /* e6 misc */ 3815 dnl .long local_label(misc_set_u16) /* e7 u16 */ 3816 dnl .long local_label(misc_set_invalid) /* e8 even_fixnum */ 3817 dnl .long local_label(misc_set_invalid) /* e9 cons */ 3818 dnl .long local_label(misc_set_invalid) /* ea nodeheader */ 3819 dnl .long local_label(misc_set_invalid) /* eb imm */ 3820 dnl .long local_label(misc_set_invalid) /* ec odd_fixnum */ 3821 dnl .long local_label(misc_set_invalid) /* ed nil */ 3822 dnl .long local_label(misc_set_invalid) /* ee misc */ 3823 dnl .long local_label(misc_set_s16) /* ef s16 */ 3824 dnl /* f0-ff */ 3825 dnl .long local_label(misc_set_invalid) /* f0 even_fixnum */ 3826 dnl .long local_label(misc_set_invalid) /* f1 cons */ 3827 dnl .long local_label(misc_set_invalid) /* f2 nodeheader */ 3828 dnl .long local_label(misc_set_invalid) /* f3 imm */ 3829 dnl .long local_label(misc_set_invalid) /* f4 odd_fixnum */ 3830 dnl .long local_label(misc_set_invalid) /* f5 nil */ 3831 dnl .long local_label(misc_set_invalid) /* f6 misc */ 3832 dnl .long local_label(misc_set_double_float_vector) /* f7 df vector */ 3833 dnl .long local_label(misc_set_invalid) /* f8 even_fixnum */ 3834 dnl .long local_label(misc_set_invalid) /* f9 cons */ 3835 dnl .long local_label(misc_set_invalid) /* fa nodeheader */ 3836 dnl .long local_label(misc_set_invalid) /* fb imm */ 3837 dnl .long local_label(misc_set_invalid) /* fc odd_fixnum */ 3838 dnl .long local_label(misc_set_invalid) /* fd nil */ 3839 dnl .long local_label(misc_set_invalid) /* fe misc */ 3840 dnl .long local_label(misc_set_bit_vector) /* ff bit_vector */ 3841 dnl 3842 dnl local_label(misc_set_u32): 3843 dnl /* Either a non-negative fixnum, a positiveone-digit bignum, */ 3844 dnl /* or a two-digit bignum whose sign-digit is 0 is ok. */ 3845 dnl __(extract_lisptag(imm2,arg_z)) 3846 dnl __(srawi. imm1,arg_z,fixnum_shift) 3847 dnl __(cmpwi cr5,imm2,tag_fixnum) 3848 dnl __(la imm0,misc_data_offset(arg_y)) 3849 dnl __(cmpwi cr7,imm2,tag_misc) 3850 dnl __(bne cr5,local_label(set_not_fixnum_u32)) 3851 dnl __(blt- cr0,local_label(set_bad)) 3852 dnl local_label(set_set32): 3853 dnl __(stwx imm1,arg_x,imm0) 3854 dnl __(bx lr) 3855 dnl local_label(set_not_fixnum_u32): 3856 dnl __(bne cr7,local_label(set_bad)) 3857 dnl __(extract_header(imm2,arg_z)) 3858 dnl __(cmpri(cr0,imm2,one_digit_bignum_header)) 3859 dnl __(cmpri(cr1,imm2,two_digit_bignum_header)) 3860 dnl __(vrefr(imm1,arg_z,0)) 3861 dnl __(cmpri(cr2,imm1,0)) 3862 dnl __(bne cr0,local_label(set_not_1_digit_u32)) 3863 dnl __(bge cr2,local_label(set_set32)) 3864 dnl __(b local_label(set_bad)) 3865 dnl local_label(set_not_1_digit_u32): 3866 dnl __(bne- cr1,local_label(set_bad)) 3867 dnl __(vrefr(imm2,arg_z,1)) 3868 dnl __(cmpri(cr0,imm2,0)) 3869 dnl __(bne- cr1,local_label(set_bad)) 3870 dnl __(beq cr0,local_label(set_set32)) 3871 dnl local_label(set_bad): 3872 dnl /* arg_z does not match the array-element-type of arg_x. */ 3873 dnl __(mov arg_y,arg_z) 3874 dnl __(mov arg_z,arg_x) 3875 dnl __(mov arg_x,#XNOTELT) 3876 dnl __(set_nargs(3)) 3877 dnl __(b _SPksignalerr) 3878 dnl local_label(misc_set_fixnum_vector): 3879 dnl __(extract_lisptag(imm2,arg_z)) 3880 dnl __(la imm0,misc_data_offset(arg_y)) 3881 dnl __(cmpwi cr5,imm2,tag_fixnum) 3882 dnl __(unbox_fixnum(imm1,arg_z)) 3883 dnl __(bne cr5,local_label(set_bad)) 3884 dnl __(stwx imm1,arg_x,imm0) 3885 dnl __(bx lr) 3886 dnl local_label(misc_set_new_string): 3887 dnl __(clrlwi imm2,arg_z,ncharcodebits) 3888 dnl __(la imm0,misc_data_offset(arg_y)) 3889 dnl __(cmpwi cr5,imm2,subtag_character) 3890 dnl __(srwi imm1,arg_z,charcode_shift) 3891 dnl __(bne cr5,local_label(set_bad)) 3892 dnl __(stwx imm1,arg_x,imm0) 3893 dnl __(bx lr) 3894 dnl local_label(misc_set_s32): 3895 dnl __(extract_lisptag(imm2,arg_z)) 3896 dnl __(cmpwi cr5,imm2,tag_fixnum) 3897 dnl __(cmpwi cr7,imm2,tag_misc) 3898 dnl __(la imm0,misc_data_offset(arg_y)) 3899 dnl __(unbox_fixnum(imm1,arg_z)) 3900 dnl __(beq cr5,local_label(set_set32)) 3901 dnl __(bne cr7,local_label(set_bad)) 3902 dnl __(extract_header(imm2,arg_z)) 3903 dnl __(cmpri(cr0,imm2,one_digit_bignum_header)) 3904 dnl __(vrefr(imm1,arg_z,0)) 3905 dnl __(bne- cr0,local_label(set_bad)) 3906 dnl __(str imm1,arg_x,imm0) 3907 dnl __(bx lr) 3908 dnl local_label(misc_set_single_float_vector): 3909 dnl __(extract_lisptag(imm2,arg_z)) 3910 dnl __(cmpwi cr7,imm2,tag_misc) 3911 dnl __(la imm0,misc_data_offset(arg_y)) 3912 dnl __(bne- cr7,local_label(set_bad)) 3913 dnl __(extract_header(imm2,arg_z)) 3914 dnl __(cmpri(cr0,imm2,single_float_header)) 3915 dnl __(bne- cr0,local_label(set_bad)) 3916 dnl __(ldr imm1,[arg_z,#single_float.value]) 3917 dnl __(str imm1,arg_x,imm0) 3918 dnl __(bx lr) 3919 dnl local_label(misc_set_u8): 3920 dnl __(extract_lisptag(imm2,arg_z)) 3921 dnl __(srwi imm0,arg_y,2) 3922 dnl __(la imm0,misc_data_offset(imm0)) 3923 dnl __(extract_unsigned_byte_bits_(imm1,arg_z,8)) 3924 dnl __(unbox_fixnum(imm1,arg_z)) 3925 dnl __(bne- cr0,local_label(set_bad)) 3926 dnl __(stbx imm1,arg_x,imm0) 3927 dnl __(bx lr) 3928 dnl local_label(misc_set_old_string): 3929 dnl __(srwi imm0,arg_y,2) 3930 dnl __(extract_lowbyte(imm2,arg_z)) 3931 dnl __(cmpri(cr2,imm2,subtag_character)) 3932 dnl __(la imm0,misc_data_offset(imm0)) 3933 dnl __(srwi imm1,arg_z,charcode_shift) 3934 dnl __(bne- cr2,local_label(set_bad)) 3935 dnl __(stbx imm1,arg_x,imm0) 3936 dnl __(bx lr) 3937 dnl local_label(misc_set_s8): 3938 dnl __(extract_lisptag(imm2,arg_z)) 3939 dnl __(srwi imm0,arg_y,2) 3940 dnl __(unbox_fixnum(imm1,arg_z)) 3941 dnl __(la imm0,misc_data_offset(imm0)) 3942 dnl __(cmpwi cr5,imm2,tag_fixnum) 3943 dnl __(extsb imm2,imm1) 3944 dnl __(cmpw cr0,imm2,imm1) 3945 dnl __(bne- cr5,local_label(set_bad)) 3946 dnl __(bne- cr0,local_label(set_bad)) 3947 dnl __(stbx imm1,arg_x,imm0) 3948 dnl __(bx lr) 3949 dnl local_label(misc_set_u16): 3950 dnl __(srwi imm0,arg_y,1) 3951 dnl __(extract_unsigned_byte_bits_(imm1,arg_z,16)) 3952 dnl __(unbox_fixnum(imm1,arg_z)) 3953 dnl __(la imm0,misc_data_offset(imm0)) 3954 dnl __(bne- cr0,local_label(set_bad)) 3955 dnl __(sthx imm1,arg_x,imm0) 3956 dnl __(bx lr) 3957 dnl local_label(misc_set_s16): 3958 dnl __(extract_lisptag(imm2,arg_z)) 3959 dnl __(srwi imm0,arg_y,1) 3960 dnl __(unbox_fixnum(imm1,arg_z)) 3961 dnl __(cmpwi cr5,imm2,tag_fixnum) 3962 dnl __(la imm0,misc_data_offset(imm0)) 3963 dnl __(extsh imm2,imm1) 3964 dnl __(cmpw cr0,imm2,imm1) 3965 dnl __(bne- cr5,local_label(set_bad)) 3966 dnl __(bne- cr0,local_label(set_bad)) 3967 dnl __(sthx imm1,arg_x,imm0) 3968 dnl __(bx lr) 3969 dnl local_label(misc_set_bit_vector): 3970 dnl __(cmplwi cr2,arg_z,fixnumone) /* nothing not a (boxed) bit */ 3971 dnl __(extrwi imm1,arg_y,5,32-(fixnumshift+5)) /* imm1 = bitnum */ 3972 dnl __(extlwi imm2,arg_z,1,31-fixnumshift) 3973 dnl __(srw imm2,imm2,imm1) 3974 dnl __(lis imm3,0x8000) 3975 dnl __(rlwinm imm0,arg_y,32-5,5,31-fixnumshift) 3976 dnl __(la imm0,misc_data_offset(imm0)) 3977 dnl __(srw imm3,imm3,imm1) 3978 dnl __(bgt- cr2,local_label(set_bad)) 3979 dnl __(lwzx imm1,arg_x,imm0) 3980 dnl __(andc imm1,imm1,imm3) 3981 dnl __(or imm1,imm1,imm2) 3982 dnl __(stwx imm1,arg_x,imm0) 3983 dnl __(bx lr) 3984 dnl 3985 dnl local_label(misc_set_double_float_vector): 3986 dnl __(extract_lisptag(imm2,arg_z)) 3987 dnl __(slwi imm0,arg_y,1) 3988 dnl __(cmpwi cr7,imm2,tag_misc) 3989 dnl __(la imm0,misc_dfloat_offset(imm0)) 3990 dnl __(bne- cr7,local_label(set_bad)) 3991 dnl __(extract_header(imm2,arg_z)) 3992 dnl __(cmpri(cr0,imm2,double_float_header)) 3993 dnl __(bne- cr0,local_label(set_bad)) 3994 dnl __(lwz imm1,double_float.value(arg_z)) 3995 dnl __(lwz imm2,double_float.value+4(arg_z)) 3996 dnl __(stwx imm1,arg_x,imm0) 3997 dnl __(la imm0,4(imm0)) 3998 dnl __(stwx imm2,arg_x,imm0) 3999 dnl __(bx lr) 4000 dnl local_label(misc_set_invalid): 4001 dnl __(mov temp0,#XSETBADVEC) 4002 dnl __(set_nargs(4)) 4003 dnl __(vpush1(temp0)) 4004 dnl __(b _SPksignalerr) 4005 dnl __endif 2432 dnl __(trap_unless_fulltag_equal(arg_x,fulltag_misc,imm0)) 2433 dnl __(trap_unless_lisptag_equal(arg_y,tag_fixnum,imm0)) 2434 dnl __(vector_length(imm0,arg_x,imm1)) 2435 dnl __(trlge(arg_y,imm0)) 2436 dnl __(unbox_fixnum(imm1,temp0)) 2437 dnl __(b C(misc_set_common)) 2438 2439 4006 2440 dnl 4007 2441 dnl /* misc_set (vector index newval). Pretty damned similar to */ … … 4009 2443 dnl 4010 2444 dnl _spentry(misc_set) 4011 dnl __(trap_unless_fulltag_equal(arg_x,fulltag_misc,imm0))4012 dnl __(trap_unless_lisptag_equal(arg_y,tag_fixnum,imm0))4013 dnl __(vector_length(imm0,arg_x,imm1))4014 dnl __(trlge(arg_y,imm0))4015 dnl __(extract_lowbyte(imm1,imm1))4016 dnl __(b local_label(misc_set_common))2445 dnl __(trap_unless_fulltag_equal(arg_x,fulltag_misc,imm0)) 2446 dnl __(trap_unless_lisptag_equal(arg_y,tag_fixnum,imm0)) 2447 dnl __(vector_length(imm0,arg_x,imm1)) 2448 dnl __(trlge(arg_y,imm0)) 2449 dnl __(extract_lowbyte(imm1,imm1)) 2450 dnl __(b C(misc_set_common)) 4017 2451 dnl 4018 2452 dnl /* "spread" the lexpr in arg_z. */ 4019 2453 dnl /* ppc2-invoke-fn assumes that temp1 is preserved here. */ 4020 2454 dnl _spentry(spread_lexprz) 4021 dnl __(ldr imm0,[arg_z,#0])4022 dnl __(cmpri(cr3,imm0,3<<fixnumshift))4023 dnl __(cmpri(cr4,imm0,2<<fixnumshift))4024 dnl __(add imm1,arg_z,imm0)4025 dnl __(cmpri(cr0,imm0,0))4026 dnl __(add nargs,nargs,imm0)4027 dnl __(cmpri(cr1,nargs,0))4028 dnl __(cmpri(cr2,nargs,2<<fixnumshift))4029 dnl __(la imm1,node_size(imm1))4030 dnl __(bge cr3,9f)4031 dnl __(beq cr4,2f)4032 dnl __(bne cr0,1f)4033 dnl /* lexpr count was 0; vpop the arg regs that */4034 dnl /* were vpushed by the caller */4035 dnl __(beqlr cr1)4036 dnl __(vpop(arg_z))4037 dnl __(bltlr cr2)4038 dnl __(vpop(arg_y))4039 dnl __(beqlr cr2)4040 dnl __(vpop(arg_x))4041 dnl __(bx lr)4042 dnl 4043 dnl /* vpush args from the lexpr until we have only */4044 dnl /* three left, then assign them to arg_x, arg_y, */4045 dnl /* and arg_z. */2455 dnl __(ldr imm0,[arg_z,#0]) 2456 dnl __(cmpri(cr3,imm0,3<<fixnumshift)) 2457 dnl __(cmpri(cr4,imm0,2<<fixnumshift)) 2458 dnl __(add imm1,arg_z,imm0) 2459 dnl __(cmpri(cr0,imm0,0)) 2460 dnl __(add nargs,nargs,imm0) 2461 dnl __(cmpri(cr1,nargs,0)) 2462 dnl __(cmpri(cr2,nargs,2<<fixnumshift)) 2463 dnl __(la imm1,node_size(imm1)) 2464 dnl __(bge cr3,9f) 2465 dnl __(beq cr4,2f) 2466 dnl __(bne cr0,1f) 2467 dnl /* lexpr count was 0; vpop the arg regs that */ 2468 dnl /* were vpushed by the caller */ 2469 dnl __(beqlr cr1) 2470 dnl __(vpop(arg_z)) 2471 dnl __(bltlr cr2) 2472 dnl __(vpop(arg_y)) 2473 dnl __(beqlr cr2) 2474 dnl __(vpop(arg_x)) 2475 dnl __(bx lr) 2476 dnl 2477 dnl /* vpush args from the lexpr until we have only */ 2478 dnl /* three left, then assign them to arg_x, arg_y, */ 2479 dnl /* and arg_z. */ 4046 2480 dnl 8: 4047 dnl __(cmpri(cr3,imm0,4<<fixnumshift))4048 dnl __(subi imm0,imm0,fixnumone)4049 dnl __(ldru(arg_z,-node_size(imm1)))4050 dnl __(vpush1(arg_z))2481 dnl __(cmpri(cr3,imm0,4<<fixnumshift)) 2482 dnl __(subi imm0,imm0,fixnumone) 2483 dnl __(ldru(arg_z,-node_size(imm1))) 2484 dnl __(vpush1(arg_z)) 4051 2485 dnl 9: 4052 dnl __(bne cr3,8b)4053 dnl __(ldr arg_x,[imm1,#-node_size*1])4054 dnl __(ldr arg_y,[imm1,#-node_size*2])4055 dnl __(ldr arg_z,[imm1,#-node_size*3])4056 dnl __(bx lr)4057 dnl 4058 dnl /* lexpr count is two: set arg_y, arg_z from the */4059 dnl /* lexpr, maybe vpop arg_x */4060 dnl 2: 4061 dnl __(ldr arg_y,[imm1,#-node_size*1])4062 dnl __(ldr arg_z,[imm1,#-node_size*2])4063 dnl __(beqlr cr2)/* return if (new) nargs = 2 */4064 dnl __(vpop(arg_x))4065 dnl __(bx lr)4066 dnl 4067 dnl /* lexpr count is one: set arg_z from the lexpr, */4068 dnl /* maybe vpop arg_y, arg_x */4069 dnl 1: 4070 dnl __(ldr arg_z,[imm1,#-node_size])4071 dnl __(bltlr cr2)/* return if (new) nargs < 2 */4072 dnl __(vpop(arg_y))4073 dnl __(beqlr cr2)/* return if (new) nargs = 2 */4074 dnl __(vpop(arg_x))4075 dnl __(bx lr)2486 dnl __(bne cr3,8b) 2487 dnl __(ldr arg_x,[imm1,#-node_size*1]) 2488 dnl __(ldr arg_y,[imm1,#-node_size*2]) 2489 dnl __(ldr arg_z,[imm1,#-node_size*3]) 2490 dnl __(bx lr) 2491 dnl 2492 dnl /* lexpr count is two: set arg_y, arg_z from the */ 2493 dnl /* lexpr, maybe vpop arg_x */ 2494 dnl 2: 2495 dnl __(ldr arg_y,[imm1,#-node_size*1]) 2496 dnl __(ldr arg_z,[imm1,#-node_size*2]) 2497 dnl __(beqlr cr2) /* return if (new) nargs = 2 */ 2498 dnl __(vpop(arg_x)) 2499 dnl __(bx lr) 2500 dnl 2501 dnl /* lexpr count is one: set arg_z from the lexpr, */ 2502 dnl /* maybe vpop arg_y, arg_x */ 2503 dnl 1: 2504 dnl __(ldr arg_z,[imm1,#-node_size]) 2505 dnl __(bltlr cr2) /* return if (new) nargs < 2 */ 2506 dnl __(vpop(arg_y)) 2507 dnl __(beqlr cr2) /* return if (new) nargs = 2 */ 2508 dnl __(vpop(arg_x)) 2509 dnl __(bx lr) 4076 2510 dnl 4077 dnl 2511 dnl 4078 2512 dnl _spentry(reset) 4079 dnl .globl _SPthrow4080 dnl __(nop)4081 dnl __(ref_nrs_value(temp0,toplcatch))4082 dnl __(mov temp1,#XSTKOVER)4083 dnl __(vpush1(temp0))4084 dnl __(vpush1(temp1))4085 dnl __(set_nargs(1))4086 dnl __(b _SPthrow)4087 dnl 4088 dnl 2513 dnl .globl _SPthrow 2514 dnl __(nop) 2515 dnl __(ref_nrs_value(temp0,toplcatch)) 2516 dnl __(mov temp1,#XSTKOVER) 2517 dnl __(vpush1(temp0)) 2518 dnl __(vpush1(temp1)) 2519 dnl __(set_nargs(1)) 2520 dnl __(b _SPthrow) 2521 dnl 2522 dnl 4089 2523 dnl /* "slide" nargs worth of values up the vstack. IMM0 contains */ 4090 2524 dnl /* the difference between the current VSP and the target. */ 4091 2525 dnl _spentry(mvslide) 4092 dnl __(cmpri(cr0,nargs,0))4093 dnl __(mov imm3,nargs)4094 dnl __(add imm2,vsp,nargs)4095 dnl __(add imm2,imm2,imm0)4096 dnl __(add imm0,vsp,nargs)4097 dnl __(beq 2f)2526 dnl __(cmpri(cr0,nargs,0)) 2527 dnl __(mov imm3,nargs) 2528 dnl __(add imm2,vsp,nargs) 2529 dnl __(add imm2,imm2,imm0) 2530 dnl __(add imm0,vsp,nargs) 2531 dnl __(beq 2f) 4098 2532 dnl 1: 4099 dnl __(cmpri(cr0,imm3,1<<fixnumshift))4100 dnl __(subi imm3,imm3,1<<fixnumshift)4101 dnl __(ldru(temp0,-node_size(imm0)))4102 dnl __(stru(temp0,-node_size(imm2)))4103 dnl __(bne cr0,1b)2533 dnl __(cmpri(cr0,imm3,1<<fixnumshift)) 2534 dnl __(subi imm3,imm3,1<<fixnumshift) 2535 dnl __(ldru(temp0,-node_size(imm0))) 2536 dnl __(stru(temp0,-node_size(imm2))) 2537 dnl __(bne cr0,1b) 4104 2538 dnl 2: 4105 dnl __(mov vsp,imm2)4106 dnl __(bx lr)2539 dnl __(mov vsp,imm2) 2540 dnl __(bx lr) 4107 2541 dnl 4108 2542 dnl /* Build a new TSP area to hold nargs worth of multiple-values. */ … … 4123 2557 dnl 4124 2558 dnl _spentry(save_values) 4125 dnl __(mov imm1,tsp)2559 dnl __(mov imm1,tsp) 4126 2560 dnl 4127 2561 dnl /* common exit: nargs = values in this set, imm1 = ptr to tsp before */ 4128 2562 dnl /* call to save_values */ 4129 2563 dnl local_label(save_values_to_tsp): 4130 dnl __(mov imm2,tsp)4131 dnl __(dnode_align(imm0,nargs,tsp_frame.fixed_overhead+(2*node_size))) /* count, link */4132 dnl __(TSP_Alloc_Var_Boxed_nz(imm0,imm3))4133 dnl __(str(imm1,tsp_frame.backlink(tsp))) /* keep one tsp "frame" as far as rest of lisp is concerned */4134 dnl __(str(nargs,tsp_frame.data_offset(tsp)))4135 dnl __(str(imm2,tsp_frame.data_offset+node_size(tsp))) /* previous tsp */4136 dnl __(la imm3,tsp_frame.data_offset+node_size*2(tsp))4137 dnl __(add imm3,imm3,nargs)4138 dnl __(add imm0,vsp,nargs)4139 dnl __(cmpr(cr0,imm0,vsp))4140 dnl __(b 2f)2564 dnl __(mov imm2,tsp) 2565 dnl __(dnode_align(imm0,nargs,tsp_frame.fixed_overhead+(2*node_size))) /* count, link */ 2566 dnl __(TSP_Alloc_Var_Boxed_nz(imm0,imm3)) 2567 dnl __(str(imm1,tsp_frame.backlink(tsp))) /* keep one tsp "frame" as far as rest of lisp is concerned */ 2568 dnl __(str(nargs,tsp_frame.data_offset(tsp))) 2569 dnl __(str(imm2,tsp_frame.data_offset+node_size(tsp))) /* previous tsp */ 2570 dnl __(la imm3,tsp_frame.data_offset+node_size*2(tsp)) 2571 dnl __(add imm3,imm3,nargs) 2572 dnl __(add imm0,vsp,nargs) 2573 dnl __(cmpr(cr0,imm0,vsp)) 2574 dnl __(b 2f) 4141 2575 dnl 1: 4142 dnl __(ldru(arg_z,-node_size(imm0)))4143 dnl __(cmpr(cr0,imm0,vsp))4144 dnl __(stru(arg_z,-node_size(imm3)))2576 dnl __(ldru(arg_z,-node_size(imm0))) 2577 dnl __(cmpr(cr0,imm0,vsp)) 2578 dnl __(stru(arg_z,-node_size(imm3))) 4145 2579 dnl 2: 4146 dnl __(bne cr0,1b)4147 dnl __(add vsp,vsp,nargs) /* discard values */4148 dnl __(bx lr)4149 dnl 2580 dnl __(bne cr0,1b) 2581 dnl __(add vsp,vsp,nargs) /* discard values */ 2582 dnl __(bx lr) 2583 dnl 4150 2584 dnl 4151 2585 dnl /* Add the multiple values that are on top of the vstack to the set */ … … 4158 2592 dnl 4159 2593 dnl _spentry(add_values) 4160 dnl __(cmpri(cr0,nargs,0))4161 dnl __(ldr imm1,[tsp,#0])4162 dnl __(bne cr0,local_label(save_values_to_tsp))4163 dnl __(bx lr)2594 dnl __(cmpri(cr0,nargs,0)) 2595 dnl __(ldr imm1,[tsp,#0]) 2596 dnl __(bne cr0,local_label(save_values_to_tsp)) 2597 dnl __(bx lr) 4164 2598 dnl 4165 dnl /* On entry, R11->callback-index */4166 dnl /* Restore lisp context, then funcall #'%pascal-functions% with */4167 dnl /* two args: callback-index, args-ptr (a macptr pointing to the args on the stack) */4168 dnl _spentry(poweropen_callback)4169 dnl __ifdef(`rTOC')4170 dnl __(mov r11,rTOC)4171 dnl __endif4172 dnl /* Save C argument registers */4173 dnl __(str(r3,c_frame.param0(sp)))4174 dnl __(str(r4,c_frame.param1(sp)))4175 dnl __(str(r5,c_frame.param2(sp)))4176 dnl __(str(r6,c_frame.param3(sp)))4177 dnl __(str(r7,c_frame.param4(sp)))4178 dnl __(str(r8,c_frame.param5(sp)))4179 dnl __(str(r9,c_frame.param6(sp)))4180 dnl __(str(r10,c_frame.param7(sp)))4181 dnl __(mflr imm3)4182 dnl __(str(imm3,c_frame.savelr(sp)))4183 dnl __(mfcr imm0)4184 dnl __(str(imm0,c_frame.crsave(sp)))4185 dnl4186 dnl /* Save the non-volatile registers on the sp stack */4187 dnl /* This is a non-standard stack frame, but noone will ever see it, */4188 dnl /* so it doesn't matter. It will look like more of the stack frame pushed below. */4189 dnl __(stru(sp,-(stack_align(c_reg_save.size))(sp)))4190 dnl __(str(r13,c_reg_save.save_gprs+(0*node_size)(sp)))4191 dnl __(str(r14,c_reg_save.save_gprs+(1*node_size)(sp)))4192 dnl __(str(r15,c_reg_save.save_gprs+(2*node_size)(sp)))4193 dnl __(str(r16,c_reg_save.save_gprs+(3*node_size)(sp)))4194 dnl __(str(r17,c_reg_save.save_gprs+(4*node_size)(sp)))4195 dnl __(str(r18,c_reg_save.save_gprs+(5*node_size)(sp)))4196 dnl __(str(r19,c_reg_save.save_gprs+(6*node_size)(sp)))4197 dnl __(str(r20,c_reg_save.save_gprs+(7*node_size)(sp)))4198 dnl __(str(r21,c_reg_save.save_gprs+(8*node_size)(sp)))4199 dnl __(str(r22,c_reg_save.save_gprs+(9*node_size)(sp)))4200 dnl __(str(r23,c_reg_save.save_gprs+(10*node_size)(sp)))4201 dnl __(str(r24,c_reg_save.save_gprs+(11*node_size)(sp)))4202 dnl __(str(r25,c_reg_save.save_gprs+(12*node_size)(sp)))4203 dnl __(str(r26,c_reg_save.save_gprs+(13*node_size)(sp)))4204 dnl __(str(r27,c_reg_save.save_gprs+(14*node_size)(sp)))4205 dnl __(str(r28,c_reg_save.save_gprs+(15*node_size)(sp)))4206 dnl __(str(r29,c_reg_save.save_gprs+(16*node_size)(sp)))4207 dnl __(str(r30,c_reg_save.save_gprs+(17*node_size)(sp)))4208 dnl __(str(r31,c_reg_save.save_gprs+(18*node_size)(sp)))4209 dnl __(stfd f1,c_reg_save.save_fprs+(0*8)(sp))4210 dnl __(stfd f2,c_reg_save.save_fprs+(1*8)(sp))4211 dnl __(stfd f3,c_reg_save.save_fprs+(2*8)(sp))4212 dnl __(stfd f4,c_reg_save.save_fprs+(3*8)(sp))4213 dnl __(stfd f5,c_reg_save.save_fprs+(4*8)(sp))4214 dnl __(stfd f6,c_reg_save.save_fprs+(5*8)(sp))4215 dnl __(stfd f7,c_reg_save.save_fprs+(6*8)(sp))4216 dnl __(stfd f8,c_reg_save.save_fprs+(7*8)(sp))4217 dnl __(stfd f9,c_reg_save.save_fprs+(8*8)(sp))4218 dnl __(stfd f10,c_reg_save.save_fprs+(9*8)(sp))4219 dnl __(stfd f11,c_reg_save.save_fprs+(10*8)(sp))4220 dnl __(stfd f12,c_reg_save.save_fprs+(11*8)(sp))4221 dnl __(stfd f13,c_reg_save.save_fprs+(12*8)(sp))4222 dnl __(check_stack_alignment(r0))4223 dnl __(mffs f0)4224 dnl __(stfd f0,c_reg_save.save_fp_zero(sp))4225 dnl __(lwz r31,c_reg_save.save_fp_zero+4(sp)) /* recover FPSCR image */4226 dnl __(stw r31,c_reg_save.save_fpscr(sp))4227 dnl __(mov r30,#0x43300000)4228 dnl __(mov r31,#0x80000000)4229 dnl __(stw r30,c_reg_save.save_fp_zero(sp))4230 dnl __(stw r31,c_reg_save.save_fp_zero+4(sp))4231 dnl __(stfd fp_s32conv,c_reg_save.save_fps32conv(sp))4232 dnl __(lfd fp_s32conv,c_reg_save.save_fp_zero(sp))4233 dnl __(stfd fp_zero,c_reg_save.save_fp_zero(sp))4234 dnl __(lfs fp_zero,lisp_globals.short_float_zero(0)) /* ensure that fp_zero contains 0.0 */4235 dnl4236 dnl /* Restore rest of Lisp context. */4237 dnl /* Could spread out the memory references here to gain a little speed */4238 dnl4239 dnl __(mov loc_pc,#0)4240 dnl __(mov fn,#0) /* subprim, not a lisp function */4241 dnl __(mov temp3,#0)4242 dnl __(mov temp2,#0)4243 dnl __(mov temp1,#0)4244 dnl __(mov temp0,#0)4245 dnl __(mov arg_x,#0)4246 dnl __(box_fixnum(arg_y,r11)) /* callback-index */4247 dnl __(la arg_z,c_reg_save.save_fprs(sp))4248 dnl __(str(arg_z,stack_align(c_reg_save.size)+c_frame.unused(sp)))4249 dnl __(la arg_z,stack_align(c_reg_save.size)+c_frame.param0(sp)) /* parameters (tagged as a fixnum) */4250 dnl4251 dnl /* Recover lisp thread context. Have to call C code to do so. */4252 dnl __(ref_global(r12,get_tcr))4253 dnl __ifdef(`rTOC')4254 dnl __(ld rTOC,8(r12))4255 dnl __(ld r12,0(r12))4256 dnl __endif4257 dnl __(mtctr r12)4258 dnl __(mov r3,#1)4259 dnl __(stru(sp,-(stack_align(c_frame.minsiz))(sp)))4260 dnl __(bctrl)4261 dnl __(la rcontext,TCR_BIAS(r3))4262 dnl __(la sp,(stack_align(c_frame.minsiz))(sp))4263 dnl4264 dnl __(ldr vsp,[rcontext,#tcr.save_vsp])4265 dnl __(ldr tsp,[rcontext,#tcr.save_tsp])4266 dnl __(mov rzero,#0)4267 dnl __(mov imm0,#TCR_STATE_LISP)4268 dnl __(mtxer rzero) /* lisp wants the overflow bit being clear */4269 dnl __(mtctr rzero)4270 dnl __(mov save0,#0)4271 dnl __(mov save1,#0)4272 dnl __(mov save2,#0)4273 dnl __(mov save3,#0)4274 dnl __(mov save4,#0)4275 dnl __(mov save5,#0)4276 dnl __(mov save6,#0)4277 dnl __(mov save7,#0)4278 dnl __(lfd f0,tcr.lisp_fpscr(rcontext))4279 dnl __(mtfsf 0xff,f0)4280 dnl __(mov allocbase,#0)4281 dnl __(mov allocptr,#0)4282 dnl __(str(imm0,tcr.valence(rcontext)))4283 dnl __(ldr allocptr,[rcontext,#tcr.save_allocptr])4284 dnl __(ldr allocbase,[rcontext,#tcr.save_allocbase])4285 dnl4286 dnl __(restore_saveregs(vsp))4287 dnl4288 dnl /* load nargs and callback to the lisp */4289 dnl __(set_nargs(2))4290 dnl __(ldr imm2,[rcontext,#tcr.cs_area])4291 dnl __(ldr imm4,[imm2,#area.active])4292 dnl __(stru(imm4,-lisp_frame.size(sp)))4293 dnl __(str(imm3,lisp_frame.savelr(sp)))4294 dnl __(mov fname,#nrs.callbacks) /* %pascal-functions% */4295 dnl __(call_fname)4296 dnl __(ldr imm2,[sp,#lisp_frame.backlink])4297 dnl __(ldr imm3,[rcontext,#tcr.cs_area])4298 dnl __(str(imm2,area.active(imm3)))4299 dnl __(discard_lisp_frame())4300 dnl /* save_vsp will be restored from ff_call's stack frame, but */4301 dnl /* I included it here for consistency. */4302 dnl /* save_tsp is set below after we exit Lisp context. */4303 dnl __(str(allocptr,tcr.save_allocptr(rcontext)))4304 dnl __(str(allocbase,tcr.save_allocbase(rcontext)))4305 dnl __(str(vsp,tcr.save_vsp(rcontext)))4306 dnl __(str(tsp,tcr.save_tsp(rcontext)))4307 dnl /* Exit lisp context */4308 dnl __(mov imm1,#TCR_STATE_FOREIGN)4309 dnl __(str(imm1,tcr.valence(rcontext)))4310 dnl /* Restore the non-volatile registers & fpscr */4311 dnl __(lfd fp_zero,c_reg_save.save_fp_zero(sp))4312 dnl __(lwz r31,c_reg_save.save_fpscr(sp))4313 dnl __(stw r31,c_reg_save.save_fp_zero+4(sp))4314 dnl __(lfd f0,c_reg_save.save_fp_zero(sp))4315 dnl __(mtfsf 0xff,f0)4316 dnl __(ldr r13,c_reg_save.save_gprs+(0*node_size)(sp)))4317 dnl __(ldr(r14,c_reg_save.save_gprs+(1*node_size)(sp)))4318 dnl __(ldr(r15,c_reg_save.save_gprs+(2*node_size)(sp)))4319 dnl __(ldr(r16,c_reg_save.save_gprs+(3*node_size)(sp)))4320 dnl __(ldr(r17,c_reg_save.save_gprs+(4*node_size)(sp)))4321 dnl __(ldr(r18,c_reg_save.save_gprs+(5*node_size)(sp)))4322 dnl __(ldr(r19,c_reg_save.save_gprs+(6*node_size)(sp)))4323 dnl __(ldr(r20,c_reg_save.save_gprs+(7*node_size)(sp)))4324 dnl __(ldr(r21,c_reg_save.save_gprs+(8*node_size)(sp)))4325 dnl __(ldr(r22,c_reg_save.save_gprs+(9*node_size)(sp)))4326 dnl __(ldr(r23,c_reg_save.save_gprs+(10*node_size)(sp)))4327 dnl __(ldr(r24,c_reg_save.save_gprs+(11*node_size)(sp)))4328 dnl __(ldr(r25,c_reg_save.save_gprs+(12*node_size)(sp)))4329 dnl __(ldr(r26,c_reg_save.save_gprs+(13*node_size)(sp)))4330 dnl __(ldr(r27,c_reg_save.save_gprs+(14*node_size)(sp)))4331 dnl __(ldr(r28,c_reg_save.save_gprs+(15*node_size)(sp)))4332 dnl __(ldr(r29,c_reg_save.save_gprs+(16*node_size)(sp)))4333 dnl __(ldr(r30,c_reg_save.save_gprs+(17*node_size)(sp)))4334 dnl __(ldr(r31,c_reg_save.save_gprs+(18*node_size)(sp)))4335 dnl __(lfd f1,c_reg_save.save_fprs+(0*8)(sp))4336 dnl __(lfd f2,c_reg_save.save_fprs+(1*8)(sp))4337 dnl __(lfd f3,c_reg_save.save_fprs+(2*8)(sp))4338 dnl __(lfd f4,c_reg_save.save_fprs+(3*8)(sp))4339 dnl __(lfd f5,c_reg_save.save_fprs+(4*8)(sp))4340 dnl __(lfd f6,c_reg_save.save_fprs+(5*8)(sp))4341 dnl __(lfd f7,c_reg_save.save_fprs+(6*8)(sp))4342 dnl __(lfd f8,c_reg_save.save_fprs+(7*8)(sp))4343 dnl __(lfd f9,c_reg_save.save_fprs+(8*8)(sp))4344 dnl __(lfd f10,c_reg_save.save_fprs+(9*8)(sp))4345 dnl __(lfd f11,c_reg_save.save_fprs+(10*8)(sp))4346 dnl __(lfd f12,c_reg_save.save_fprs+(11*8)(sp))4347 dnl __(lfd f13,c_reg_save.save_fprs+(12*8)(sp))4348 dnl __(lfd fp_s32conv,c_reg_save.save_fps32conv(sp))4349 dnl __(ldr(sp,0(sp)))4350 dnl __(ldr r3,[sp,#c_frame.param0])4351 dnl __(ldr r4,[sp,#c_frame.param1])4352 dnl __(ldr r5,[sp,#c_frame.param2])4353 dnl __(ldr r6,[sp,#c_frame.param3])4354 dnl __(ldr r7,[sp,#c_frame.param4])4355 dnl __(ldr r8,[sp,#c_frame.param5])4356 dnl __(ldr r9,[sp,#c_frame.param6])4357 dnl __(ldr r10,[sp,#c_frame.param7])4358 dnl __(ldr r11,[sp,#c_frame.savelr])4359 dnl __(mtlr r11)4360 dnl __(ldr r11,[sp,#c_frame.crsave])4361 dnl __(mtcr r11)4362 dnl __(bx lr)4363 2599 dnl 4364 2600 dnl /* Like misc_alloc (a LOT like it, since it does most of the work), but takes */ … … 4367 2603 dnl 4368 2604 dnl _spentry(misc_alloc_init) 4369 dnl __(mflr loc_pc)4370 dnl __(build_lisp_frame(fn,loc_pc,vsp))4371 dnl __(mov fn,#0)4372 dnl __(mov temp0,arg_z)/* initval */4373 dnl __(mov arg_z,arg_y)/* subtag */4374 dnl __(mov arg_y,arg_x)/* element-count */4375 dnl __(bl _SPmisc_alloc)4376 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr])4377 dnl __(mtlr loc_pc)4378 dnl __(ldr fn,[sp,#lisp_frame.savefn])4379 dnl __(ldr vsp,[sp,#lisp_frame.savevsp])4380 dnl __(discard_lisp_frame())4381 dnl __(mov fname,#nrs.init_misc)4382 dnl __(set_nargs(2))4383 dnl __(mov arg_y,temp0)4384 dnl __(jump_fname())2605 dnl __(mflr loc_pc) 2606 dnl __(build_lisp_frame(fn,loc_pc,vsp)) 2607 dnl __(mov fn,#0) 2608 dnl __(mov temp0,arg_z) /* initval */ 2609 dnl __(mov arg_z,arg_y) /* subtag */ 2610 dnl __(mov arg_y,arg_x) /* element-count */ 2611 dnl __(bl _SPmisc_alloc) 2612 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 2613 dnl __(mtlr loc_pc) 2614 dnl __(ldr fn,[sp,#lisp_frame.savefn]) 2615 dnl __(ldr vsp,[sp,#lisp_frame.savevsp]) 2616 dnl __(discard_lisp_frame()) 2617 dnl __(mov fname,#nrs.init_misc) 2618 dnl __(set_nargs(2)) 2619 dnl __(mov arg_y,temp0) 2620 dnl __(jump_fname()) 4385 2621 dnl 4386 2622 dnl /* As in stack_misc_alloc above, only with a non-default initial-value. */ 4387 2623 dnl 4388 2624 dnl _spentry(stack_misc_alloc_init) 4389 dnl __(mflr loc_pc)4390 dnl __(build_lisp_frame(fn,loc_pc,vsp))4391 dnl __(mov fn,#0)4392 dnl __(mov temp0,arg_z) /* initval */4393 dnl __(mov arg_z,arg_y) /* subtag */4394 dnl __(mov arg_y,arg_x) /* element-count */4395 dnl __(bl _SPstack_misc_alloc)4396 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr])4397 dnl __(mtlr loc_pc)4398 dnl __(ldr fn,[sp,#lisp_frame.savefn])4399 dnl __(ldr vsp,[sp,#lisp_frame.savevsp])4400 dnl __(discard_lisp_frame())4401 dnl __(mov fname,#nrs.init_misc)4402 dnl __(set_nargs(2))4403 dnl __(mov arg_y,temp0)4404 dnl __(jump_fname())4405 dnl 4406 dnl 2625 dnl __(mflr loc_pc) 2626 dnl __(build_lisp_frame(fn,loc_pc,vsp)) 2627 dnl __(mov fn,#0) 2628 dnl __(mov temp0,arg_z) /* initval */ 2629 dnl __(mov arg_z,arg_y) /* subtag */ 2630 dnl __(mov arg_y,arg_x) /* element-count */ 2631 dnl __(bl _SPstack_misc_alloc) 2632 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 2633 dnl __(mtlr loc_pc) 2634 dnl __(ldr fn,[sp,#lisp_frame.savefn]) 2635 dnl __(ldr vsp,[sp,#lisp_frame.savevsp]) 2636 dnl __(discard_lisp_frame()) 2637 dnl __(mov fname,#nrs.init_misc) 2638 dnl __(set_nargs(2)) 2639 dnl __(mov arg_y,temp0) 2640 dnl __(jump_fname()) 2641 dnl 2642 dnl 4407 2643 dnl _spentry(callbuiltin) 4408 dnl __(ref_nrs_value(fname,builtin_functions))4409 dnl __(la imm0,misc_data_offset(imm0))4410 dnl __(ldrx(fname,fname,imm0))4411 dnl __(jump_fname())2644 dnl __(ref_nrs_value(fname,builtin_functions)) 2645 dnl __(la imm0,misc_data_offset(imm0)) 2646 dnl __(ldrx(fname,fname,imm0)) 2647 dnl __(jump_fname()) 4412 2648 dnl 4413 2649 dnl /* the value of the nilreg-relative symbol %builtin-functions% should be */ … … 4416 2652 dnl 4417 2653 dnl _spentry(callbuiltin0) 4418 dnl __(set_nargs(0))4419 dnl __(ref_nrs_value(fname,builtin_functions))4420 dnl __(la imm0,misc_data_offset(imm0))4421 dnl __(ldrx(fname,fname,imm0))4422 dnl __(jump_fname())2654 dnl __(set_nargs(0)) 2655 dnl __(ref_nrs_value(fname,builtin_functions)) 2656 dnl __(la imm0,misc_data_offset(imm0)) 2657 dnl __(ldrx(fname,fname,imm0)) 2658 dnl __(jump_fname()) 4423 2659 dnl 4424 2660 dnl _spentry(callbuiltin1) 4425 dnl __(ref_nrs_value(fname,builtin_functions))4426 dnl __(set_nargs(1))4427 dnl __(la imm0,misc_data_offset(imm0))4428 dnl __(ldrx(fname,fname,imm0))4429 dnl __(jump_fname())2661 dnl __(ref_nrs_value(fname,builtin_functions)) 2662 dnl __(set_nargs(1)) 2663 dnl __(la imm0,misc_data_offset(imm0)) 2664 dnl __(ldrx(fname,fname,imm0)) 2665 dnl __(jump_fname()) 4430 2666 dnl 4431 2667 dnl _spentry(callbuiltin2) 4432 dnl __(set_nargs(2))4433 dnl __(ref_nrs_value(fname,builtin_functions))4434 dnl __(la imm0,misc_data_offset(imm0))4435 dnl __(ldrx(fname,fname,imm0))4436 dnl __(jump_fname())2668 dnl __(set_nargs(2)) 2669 dnl __(ref_nrs_value(fname,builtin_functions)) 2670 dnl __(la imm0,misc_data_offset(imm0)) 2671 dnl __(ldrx(fname,fname,imm0)) 2672 dnl __(jump_fname()) 4437 2673 dnl 4438 2674 dnl 4439 2675 dnl _spentry(callbuiltin3) 4440 dnl __(set_nargs(3))4441 dnl __(ref_nrs_value(fname,builtin_functions))4442 dnl __(la imm0,misc_data_offset(imm0))4443 dnl __(ldrx(fname,fname,imm0))4444 dnl __(jump_fname())4445 dnl 2676 dnl __(set_nargs(3)) 2677 dnl __(ref_nrs_value(fname,builtin_functions)) 2678 dnl __(la imm0,misc_data_offset(imm0)) 2679 dnl __(ldrx(fname,fname,imm0)) 2680 dnl __(jump_fname()) 2681 dnl 4446 2682 dnl 4447 2683 dnl _spentry(popj) 4448 dnl .globl C(popj)2684 dnl .globl C(popj) 4449 2685 dnl C(popj): 4450 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr])4451 dnl __(ldr vsp,[sp,#lisp_frame.savevsp])4452 dnl __(mtlr loc_pc)4453 dnl __(ldr fn,[sp,#lisp_frame.savefn])4454 dnl __(discard_lisp_frame())4455 dnl __(bx lr)2686 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 2687 dnl __(ldr vsp,[sp,#lisp_frame.savevsp]) 2688 dnl __(mtlr loc_pc) 2689 dnl __(ldr fn,[sp,#lisp_frame.savefn]) 2690 dnl __(discard_lisp_frame()) 2691 dnl __(bx lr) 4456 2692 dnl 4457 2693 dnl _spentry(restorefullcontext) 4458 dnl __(mflr loc_pc)4459 dnl __(mtctr loc_pc)4460 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr])4461 dnl __(mtlr loc_pc)4462 dnl __(ldr vsp,[sp,#lisp_frame.savevsp])4463 dnl __(ldr fn,[sp,#lisp_frame.savefn])4464 dnl __(discard_lisp_frame())4465 dnl __(bctr)2694 dnl __(mflr loc_pc) 2695 dnl __(mtctr loc_pc) 2696 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 2697 dnl __(mtlr loc_pc) 2698 dnl __(ldr vsp,[sp,#lisp_frame.savevsp]) 2699 dnl __(ldr fn,[sp,#lisp_frame.savefn]) 2700 dnl __(discard_lisp_frame()) 2701 dnl __(bctr) 4466 2702 dnl 4467 2703 dnl _spentry(savecontextvsp) 4468 dnl __(ldr imm0,[rcontext,#tcr.cs_limit])4469 dnl __(build_lisp_frame(fn,loc_pc,vsp))4470 dnl __(mov fn,nfn)4471 dnl __(trllt(sp,imm0))4472 dnl __(bx lr)2704 dnl __(ldr imm0,[rcontext,#tcr.cs_limit]) 2705 dnl __(build_lisp_frame(fn,loc_pc,vsp)) 2706 dnl __(mov fn,nfn) 2707 dnl __(trllt(sp,imm0)) 2708 dnl __(bx lr) 4473 2709 dnl 4474 2710 dnl _spentry(savecontext0) 4475 dnl __(add imm0,vsp,imm0)4476 dnl __(build_lisp_frame(fn,loc_pc,imm0))4477 dnl __(ldr imm0,[rcontext,#tcr.cs_limit])4478 dnl __(mov fn,nfn)4479 dnl __(trllt(sp,imm0))4480 dnl __(bx lr)2711 dnl __(add imm0,vsp,imm0) 2712 dnl __(build_lisp_frame(fn,loc_pc,imm0)) 2713 dnl __(ldr imm0,[rcontext,#tcr.cs_limit]) 2714 dnl __(mov fn,nfn) 2715 dnl __(trllt(sp,imm0)) 2716 dnl __(bx lr) 4481 2717 dnl 4482 2718 dnl … … 4484 2720 dnl /* winds up in loc-pc instead of getting thrashed around ... */ 4485 2721 dnl _spentry(restorecontext) 4486 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr])4487 dnl __(ldr vsp,[sp,#lisp_frame.savevsp])4488 dnl __(ldr fn,[sp,#lisp_frame.savefn])4489 dnl __(discard_lisp_frame())4490 dnl __(bx lr)2722 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 2723 dnl __(ldr vsp,[sp,#lisp_frame.savevsp]) 2724 dnl __(ldr fn,[sp,#lisp_frame.savefn]) 2725 dnl __(discard_lisp_frame()) 2726 dnl __(bx lr) 4491 2727 dnl 4492 2728 dnl … … 4498 2734 dnl /* multiple values, then things are even simpler. */ 4499 2735 dnl _spentry(lexpr_entry) 4500 dnl __(ref_global(imm1,ret1val_addr))4501 dnl __(cmpr(cr0,imm1,loc_pc))4502 dnl __(build_lisp_frame(fn,loc_pc,imm0))4503 dnl __(bne cr0,1f)4504 dnl __(ref_global(imm0,lexpr_return))4505 dnl __(build_lisp_frame(rzero,imm0,vsp))4506 dnl __(mov loc_pc,imm1)4507 dnl __(ldr imm0,[rcontext,#tcr.cs_limit])4508 dnl __(trllt(sp,imm0))4509 dnl __(mov fn,#0)4510 dnl __(bx lr)2736 dnl __(ref_global(imm1,ret1val_addr)) 2737 dnl __(cmpr(cr0,imm1,loc_pc)) 2738 dnl __(build_lisp_frame(fn,loc_pc,imm0)) 2739 dnl __(bne cr0,1f) 2740 dnl __(ref_global(imm0,lexpr_return)) 2741 dnl __(build_lisp_frame(rzero,imm0,vsp)) 2742 dnl __(mov loc_pc,imm1) 2743 dnl __(ldr imm0,[rcontext,#tcr.cs_limit]) 2744 dnl __(trllt(sp,imm0)) 2745 dnl __(mov fn,#0) 2746 dnl __(bx lr) 4511 2747 dnl 4512 2748 dnl /* The single-value case just needs to return to something that'll pop */ 4513 2749 dnl /* the variable-length frame off of the vstack. */ 4514 2750 dnl 1: 4515 dnl __(ref_global(loc_pc,lexpr_return1v)) 4516 dnl __(ldr imm0,[rcontext,#tcr.cs_limit]) 4517 dnl __(trllt(sp,imm0)) 4518 dnl __(mov fn,#0) 4519 dnl __(bx lr) 4520 dnl 4521 dnl /* */ 4522 dnl /* Do a system call in Darwin. The stack is set up much as it would be */ 4523 dnl /* for a PowerOpen ABI ff-call: register parameters are in the stack */ 4524 dnl /* frame, and there are 4 extra words at the bottom of the frame that */ 4525 dnl /* we can carve a lisp frame out of. */ 4526 dnl /* */ 4527 dnl /* System call return conventions are a little funky in Darwin: if "@sc" */ 4528 dnl /* is the address of the "sc" instruction, errors return to @sc+4 and */ 4529 dnl /* non-error cases return to @sc+8. Error values are returned as */ 4530 dnl /* positive values in r3; this is true even if the system call returns */ 4531 dnl /* a doubleword (64-bit) result. Since r3 would ordinarily contain */ 4532 dnl /* the high half of a doubleword result, this has to be special-cased. */ 4533 dnl /* */ 4534 dnl /* The caller should set the c_frame.crsave field of the stack frame */ 4535 dnl /* to 0 if the result is to be interpreted as anything but a doubleword */ 4536 dnl /* and to non-zero otherwise. (This only matters on an error return.) */ 4537 dnl 4538 dnl 4539 dnl _spentry(poweropen_syscall) 4540 dnl __(mflr loc_pc) 4541 dnl __(vpush_saveregs()) 4542 dnl __(ldr imm1,[sp,#0]) 4543 dnl __(la imm2,-lisp_frame.size(imm1)) 4544 dnl __(zero_doublewords imm2,0,lisp_frame.size) 4545 dnl __(str(imm1,lisp_frame.backlink(imm2))) 4546 dnl __(str(imm2,c_frame.backlink(sp))) 4547 dnl __(str(fn,lisp_frame.savefn(imm2))) 4548 dnl __(str(loc_pc,lisp_frame.savelr(imm2))) 4549 dnl __(str(vsp,lisp_frame.savevsp(imm2))) 4550 dnl __(ldr imm3,[rcontext,#tcr.cs_area]) 4551 dnl __(str(imm2,area.active(imm3))) 4552 dnl __(str(allocptr,tcr.save_allocptr(rcontext))) 4553 dnl __(str(allocbase,tcr.save_allocbase(rcontext))) 4554 dnl __(str(tsp,tcr.save_tsp(rcontext))) 4555 dnl __(str(vsp,tcr.save_vsp(rcontext))) 4556 dnl __(str(rzero,tcr.ffi_exception(rcontext))) 4557 dnl __(mov save0,rcontext) 4558 dnl __(mov r3,#TCR_STATE_FOREIGN) 4559 dnl __(str(r3,tcr.valence(rcontext))) 4560 dnl __(mov rcontext,#0) 4561 dnl __(ldr r3,[sp,#c_frame.param0]) 4562 dnl __(ldr r4,[sp,#c_frame.param1]) 4563 dnl __(ldr r5,[sp,#c_frame.param2]) 4564 dnl __(ldr r6,[sp,#c_frame.param3]) 4565 dnl __(ldr r7,[sp,#c_frame.param4]) 4566 dnl __(ldr r8,[sp,#c_frame.param5]) 4567 dnl __(ldr r9,[sp,#c_frame.param6]) 4568 dnl __(ldr r10,[sp,#c_frame.param7]) 4569 dnl __(unbox_fixnum(r0,arg_z)) 4570 dnl __(sc) 4571 dnl __ifdef(`LINUX') 4572 dnl __(bns+ 9f) 4573 dnl __else 4574 dnl __(b 1f) 4575 dnl __(b 9f) 4576 dnl __endif 4577 dnl 1: 4578 dnl __ifdef(`PPC64') 4579 dnl __(neg r3,r3) 4580 dnl __else 4581 dnl __(ldr imm2,[sp,#c_frame.crsave]) 4582 dnl __(cmpri(cr0,imm2,0)) 4583 dnl __(bne cr0,2f) 4584 dnl /* 32-bit result */ 4585 dnl __(neg r3,r3) 4586 dnl __(b 9f) 4587 dnl 2: 4588 dnl /* 64-bit result */ 4589 dnl __(neg r4,r3) 4590 dnl __(mov r3,#-1) 4591 dnl __endif 4592 dnl 9: 4593 dnl __(mov imm2,save0) /* recover context */ 4594 dnl __(ldr sp,[sp,#c_frame.backlink]) 4595 dnl __(mov imm4,#TCR_STATE_LISP) 4596 dnl __(mov rzero,#0) 4597 dnl __(mov loc_pc,#0) 4598 dnl __(mov arg_x,#nil_value) 4599 dnl __(mov arg_y,#nil_value) 4600 dnl __(mov arg_z,#nil_value) 4601 dnl __(mov temp0,#nil_value) 4602 dnl __(mov temp1,#nil_value) 4603 dnl __(mov temp2,#nil_value) 4604 dnl __(mov temp3,#nil_value) 4605 dnl __(mov fn,#nil_value) 4606 dnl __(mov rcontext,imm2) 4607 dnl __(ldr allocptr,[rcontext,#tcr.save_allocptr]) 4608 dnl __(ldr allocbase,[rcontext,#tcr.save_allocbase]) 4609 dnl __(ldr tsp,[rcontext,#tcr.save_tsp]) 4610 dnl __(mov save0,#0) 4611 dnl __(mov save1,#0) 4612 dnl __(mov save2,#0) 4613 dnl __(mov save3,#0) 4614 dnl __(mov save4,#0) 4615 dnl __(mov save5,#0) 4616 dnl __(mov save6,#0) 4617 dnl __(mov save7,#0) 4618 dnl __(str(imm4,tcr.valence(rcontext))) 4619 dnl __(vpop_saveregs) 4620 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 4621 dnl __(mtlr loc_pc) 4622 dnl __(ldr fn,[sp,#lisp_frame.savefn]) 4623 dnl __(discard_lisp_frame) 4624 dnl __(mtxer rzero) 4625 dnl __(check_pending_interrupt(`cr1')) 4626 dnl __(bx lr) 2751 dnl __(ref_global(loc_pc,lexpr_return1v)) 2752 dnl __(ldr imm0,[rcontext,#tcr.cs_limit]) 2753 dnl __(trllt(sp,imm0)) 2754 dnl __(mov fn,#0) 2755 dnl __(bx lr) 2756 dnl 4627 2757 dnl 4628 2758 dnl 4629 2759 dnl 4630 2760 dnl _spentry(builtin_div) 4631 dnl __(jump_builtin(_builtin_div,2))2761 dnl __(jump_builtin(_builtin_div,2)) 4632 2762 dnl 4633 2763 dnl … … 4646 2776 dnl __(cmpr(cr0,imm0,imm1)) 4647 2777 dnl __(bne cr0,2f) 4648 dnl __(jump_builtin(_builtin_eql,2))4649 dnl 1: __(mov arg_z,#t_value)4650 dnl __(bx lr)4651 dnl 2: __(mov arg_z,#nil_value)4652 dnl __(bx lr)2778 dnl __(jump_builtin(_builtin_eql,2)) 2779 dnl 1: __(mov arg_z,#t_value) 2780 dnl __(bx lr) 2781 dnl 2: __(mov arg_z,#nil_value) 2782 dnl __(bx lr) 4653 2783 dnl 4654 2784 dnl _spentry(builtin_length) 4655 2785 dnl __(cmpri(cr1,arg_z,nil_value)) 4656 dnl __(extract_typecode(imm0,arg_z))4657 dnl __(cmpri(cr0,imm0,min_vector_subtag))2786 dnl __(extract_typecode(imm0,arg_z)) 2787 dnl __(cmpri(cr0,imm0,min_vector_subtag)) 4658 2788 dnl __(beq cr1,1f) 4659 dnl __ifdef(`PPC64') 4660 dnl __(cmpdi cr2,imm0,fulltag_cons) 4661 dnl __else 4662 dnl __(cmpwi cr2,imm0,tag_list) 4663 dnl __endif 4664 dnl __(beq- cr0,2f) 4665 dnl __(blt- cr0,3f) 4666 dnl /* (simple-array * (*)) */ 4667 dnl __(vector_length(arg_z,arg_z,imm0)) 4668 dnl __(bx lr) 2789 dnl __(cmpwi cr2,imm0,tag_list) 2790 dnl __(beq- cr0,2f) 2791 dnl __(blt- cr0,3f) 2792 dnl /* (simple-array * (*)) */ 2793 dnl __(vector_length(arg_z,arg_z,imm0)) 2794 dnl __(bx lr) 4669 2795 dnl 1: __(mov arg_z,#0) 4670 2796 dnl __(bx lr) 4671 2797 dnl 2: 4672 dnl __(ldr arg_z,[arg_z,#vectorH.logsize]) 4673 dnl __(bx lr) 4674 dnl 3: __(bne cr2,8f) 4675 dnl __(mov temp2,#-1<<fixnum_shift) 4676 dnl __(mov temp0,arg_z) /* fast pointer */ 4677 dnl __(mov temp1,arg_z) /* slow pointer */ 4678 dnl __ifdef(`PPC64') 4679 dnl 4: __(extract_fulltag(imm0,temp0)) 4680 dnl __(cmpdi cr7,temp0,nil_value) 4681 dnl __(cmpdi cr1,imm0,fulltag_cons) 4682 dnl __(addi temp2,temp2,fixnum_one) 4683 dnl __(beq cr7,9f) 4684 dnl __(andi. imm0,temp2,1<<fixnum_shift) 4685 dnl __(bne cr1,8f) 4686 dnl __(extract_fulltag(imm1,temp1)) 4687 dnl __(_cdr(temp0,temp0)) 4688 dnl __(cmpdi cr1,imm1,fulltag_cons) 4689 dnl __(beq cr0,4b) 4690 dnl __(bne cr1,8f) 4691 dnl __(_cdr(temp1,temp1)) 4692 dnl __(cmpd cr0,temp0,temp1) 4693 dnl __(bne cr0,4b) 4694 dnl __else 4695 dnl 4: __(extract_lisptag(imm0,temp0)) 4696 dnl __(cmpri(cr7,temp0,nil_value)) 4697 dnl __(cmpri(cr1,imm0,tag_list)) 4698 dnl __(addi temp2,temp2,fixnum_one) 4699 dnl __(beq cr7,9f) 4700 dnl __(andi. imm0,temp2,1<<fixnum_shift) 4701 dnl __(bne cr1,8f) 4702 dnl __(extract_lisptag(imm1,temp1)) 4703 dnl __(_cdr(temp0,temp0)) 4704 dnl __(cmpri(cr1,imm1,tag_list)) 4705 dnl __(beq cr0,4b) 4706 dnl __(bne cr1,8f) 4707 dnl __(_cdr(temp1,temp1)) 4708 dnl __(cmpr(cr0,temp0,temp1)) 4709 dnl __(bne cr0,4b) 4710 dnl __endif 4711 dnl 8: 4712 dnl __(jump_builtin(_builtin_length,1)) 4713 dnl 9: 4714 dnl __(mov arg_z,temp2) 4715 dnl __(bx lr) 2798 dnl __(ldr arg_z,[arg_z,#vectorH.logsize]) 2799 dnl __(bx lr) 2800 dnl 3: __(bne cr2,8f) 2801 dnl __(mov temp2,#-1<<fixnum_shift) 2802 dnl __(mov temp0,arg_z) /* fast pointer */ 2803 dnl __(mov temp1,arg_z) /* slow pointer */ 2804 dnl 4: __(extract_lisptag(imm0,temp0)) 2805 dnl __(cmpri(cr7,temp0,nil_value)) 2806 dnl __(cmpri(cr1,imm0,tag_list)) 2807 dnl __(addi temp2,temp2,fixnum_one) 2808 dnl __(beq cr7,9f) 2809 dnl __(andi. imm0,temp2,1<<fixnum_shift) 2810 dnl __(bne cr1,8f) 2811 dnl __(extract_lisptag(imm1,temp1)) 2812 dnl __(_cdr(temp0,temp0)) 2813 dnl __(cmpri(cr1,imm1,tag_list)) 2814 dnl __(beq cr0,4b) 2815 dnl __(bne cr1,8f) 2816 dnl __(_cdr(temp1,temp1)) 2817 dnl __(cmpr(cr0,temp0,temp1)) 2818 dnl __(bne cr0,4b) 2819 2820 dnl 8: 2821 dnl __(jump_builtin(_builtin_length,1)) 2822 dnl 9: 2823 dnl __(mov arg_z,temp2) 2824 dnl __(bx lr) 4716 2825 dnl 4717 2826 dnl _spentry(builtin_seqtype) 4718 dnl __ifdef(`PPC64') 4719 dnl __(cmpdi cr2,arg_z,nil_value) 4720 dnl __(extract_typecode(imm0,arg_z)) 4721 dnl __(beq cr2,1f) 4722 dnl __(cmpri(cr0,imm0,fulltag_cons)) 4723 dnl __else 4724 dnl __(extract_typecode(imm0,arg_z)) 4725 dnl __(cmpri(cr0,imm0,tag_list)) 4726 dnl __endif 4727 dnl __(cmpri(cr1,imm0,min_vector_subtag)) 4728 dnl __(beq cr0,1f) 4729 dnl __(blt- cr1,2f) 4730 dnl __(mov arg_z,#nil_value) 4731 dnl __(bx lr) 4732 dnl 1: __(mov arg_z,#t_value) 4733 dnl __(bx lr) 2827 dnl __(extract_typecode(imm0,arg_z)) 2828 dnl __(cmpri(cr0,imm0,tag_list)) 2829 dnl __(cmpri(cr1,imm0,min_vector_subtag)) 2830 dnl __(beq cr0,1f) 2831 dnl __(blt- cr1,2f) 2832 dnl __(mov arg_z,#nil_value) 2833 dnl __(bx lr) 2834 dnl 1: __(mov arg_z,#t_value) 2835 dnl __(bx lr) 4734 2836 dnl 2: 4735 dnl __(jump_builtin(_builtin_seqtype,1)) 4736 dnl 4737 dnl _spentry(builtin_assq) 4738 dnl __(cmpri(arg_z,nil_value)) 4739 dnl __(beqlr) 4740 dnl 1: __(trap_unless_list(arg_z,imm0)) 4741 dnl __(_car(arg_x,arg_z)) 4742 dnl __(_cdr(arg_z,arg_z)) 4743 dnl __(cmpri(cr2,arg_x,nil_value)) 4744 dnl __(cmpri(cr1,arg_z,nil_value)) 4745 dnl __(beq cr2,2f) 4746 dnl __(trap_unless_list(arg_x,imm0)) 4747 dnl __(_car(temp0,arg_x)) 4748 dnl __(cmpr(temp0,arg_y)) 4749 dnl __(bne cr0,2f) 4750 dnl __(mov arg_z,arg_x) 4751 dnl __(bx lr) 4752 dnl 2: __(bne cr1,1b) 4753 dnl __(bx lr) 4754 dnl 4755 dnl _spentry(builtin_memq) 4756 dnl __(cmpri(cr1,arg_z,nil_value)) 4757 dnl __(b 2f) 4758 dnl 1: __(trap_unless_list(arg_z,imm0)) 4759 dnl __(_car(arg_x,arg_z)) 4760 dnl __(_cdr(temp0,arg_z)) 4761 dnl __(cmpr(arg_x,arg_y)) 4762 dnl __(cmpri(cr1,temp0,nil_value)) 4763 dnl __(beqlr) 4764 dnl __(mov arg_z,temp0) 4765 dnl 2: __(bne cr1,1b) 4766 dnl __(bx lr) 4767 dnl 4768 dnl logbitp_max_bit = 30 4769 dnl 4770 dnl _spentry(builtin_logbitp) 4771 dnl /* Call out unless both fixnums,0 <= arg_y < logbitp_max_bit */ 4772 dnl __(cmplri(cr2,arg_y,logbitp_max_bit<<fixnum_shift)) 4773 dnl __(extract_lisptag(imm0,arg_y)) 4774 dnl __(extract_lisptag(imm1,arg_z)) 4775 dnl __(cmpri(cr0,imm0,tag_fixnum)) 4776 dnl __(cmpri(cr1,imm1,tag_fixnum)) 4777 dnl __(unbox_fixnum(imm0,arg_y)) 4778 dnl __(subfic imm0,imm0,logbitp_max_bit) 4779 dnl __ifdef(`PPC64') 4780 dnl __(rldcl imm0,arg_z,imm0,63) 4781 dnl __(mulli imm0,imm0,t_offset) 4782 dnl __else 4783 dnl __(rlwnm imm0,arg_z,imm0,31,31) 4784 dnl __(rlwimi imm0,imm0,4,27,27) 4785 dnl __endif 4786 dnl __(bnl cr2,1f) 4787 dnl __(bne cr0,1f) 4788 dnl __(bne cr1,1f) 4789 dnl __(addi arg_z,imm0,nil_value) 4790 dnl __(bx lr) 4791 dnl 1: 4792 dnl __(jump_builtin(_builtin_logbitp,2)) 4793 dnl 4794 dnl _spentry(builtin_logior) 4795 dnl __(orr imm0,arg_y,arg_z) 4796 dnl __(test_fixnum(imm0)) 4797 dnl __(moveq arg_z,imm0) 4798 dnl __(bxeq lr) 4799 dnl 1: 4800 dnl __(jump_builtin(_builtin_logior,2)) 4801 dnl 4802 dnl _spentry(builtin_logand) 4803 dnl __(orr imm0,arg_y,arg_z) 4804 dnl __(test_fixnum(imm0)) 4805 dnl __(andeq arg_z,arg_y,arg_z) 4806 dnl __(bxeq lr) 4807 dnl __(jump_builtin(_builtin_logand,2)) 4808 dnl 4809 dnl _spentry(builtin_ash) 4810 dnl __ifdef(`PPC64') 4811 dnl __(cmpdi cr1,arg_z,0) 4812 dnl __(extract_lisptag(imm0,arg_y)) 4813 dnl __(extract_lisptag(imm1,arg_z)) 4814 dnl __(cmpdi cr0,imm0,tag_fixnum) 4815 dnl __(cmpdi cr3,imm1,tag_fixnum) 4816 dnl __(cmpdi cr2,arg_z,-(63<<3)) /* !! 3 = fixnumshift */ 4817 dnl __(bne- cr0,9f) 4818 dnl __(bne- cr3,9f) 4819 dnl __(bne cr1,0f) 4820 dnl __(mov arg_z,arg_y) /* (ash n 0) => n */ 4821 dnl __(bx lr) 4822 dnl 0: 4823 dnl __(unbox_fixnum(imm1,arg_y)) 4824 dnl __(unbox_fixnum(imm0,arg_z)) 4825 dnl __(bgt cr1,2f) 4826 dnl /* (ash n -count) => fixnum */ 4827 dnl __(neg imm2,imm0) 4828 dnl __(bgt cr2,1f) 4829 dnl __(mov imm2,#63) 4830 dnl 1: 4831 dnl __(srad imm0,imm1,imm2) 4832 dnl __(box_fixnum(arg_z,imm0)) 4833 dnl __(bx lr) 4834 dnl /* Integer-length of arg_y/imm1 to imm2 */ 4835 dnl 2: 4836 dnl __(cntlzd. imm2,imm1) 4837 dnl __(bne 3f) /* cr0`eq' set if negative */ 4838 dnl __(not imm2,imm1) 4839 dnl __(cntlzd imm2,imm2) 4840 dnl 3: 4841 dnl __(subfic imm2,imm2,64) 4842 dnl __(add imm2,imm2,imm0) /* imm2 <- integer-length(imm1) + count */ 4843 dnl __(cmpdi cr1,imm2,63-fixnumshift) 4844 dnl __(cmpdi cr2,imm0,64) 4845 dnl __(sld imm2,imm1,imm0) 4846 dnl __(bgt cr1,6f) 4847 dnl __(box_fixnum(arg_z,imm2)) 4848 dnl __(bx lr) 4849 dnl 6: 4850 dnl __(bgt cr2,9f) 4851 dnl __(bne cr2,7f) 4852 dnl /* Shift left by 64 bits exactly */ 4853 dnl __(mov imm0,imm1) 4854 dnl __(mov imm1,#0) 4855 dnl __(beq _SPmakes128) 4856 dnl __(b _SPmakeu128) 4857 dnl 7: 4858 dnl /* Shift left by fewer than 64 bits, result not a fixnum */ 4859 dnl __(subfic imm0,imm0,64) 4860 dnl __(beq 8f) 4861 dnl __(srd imm0,imm1,imm0) 4862 dnl __(mov imm1,imm2) 4863 dnl __(b _SPmakeu128) 4864 dnl 8: 4865 dnl __(srad imm0,imm1,imm0) 4866 dnl __(mov imm1,imm2) 4867 dnl __(b _SPmakes128) 4868 dnl __else 4869 dnl __(cmpri(cr1,arg_z,0)) 4870 dnl __(extract_lisptag(imm0,arg_y)) 4871 dnl __(extract_lisptag(imm1,arg_z)) 4872 dnl __(cmpri(cr0,imm0,tag_fixnum)) 4873 dnl __(cmpri(cr3,imm1,tag_fixnum)) 4874 dnl __(cmpri(cr2,arg_z,-(29<<2))) /* !! 2 = fixnumshift */ 4875 dnl __(bne- cr0,9f) 4876 dnl __(bne- cr3,9f) 4877 dnl __(bne cr1,0f) 4878 dnl __(mov arg_z,arg_y) /* (ash n 0) => n */ 4879 dnl __(bx lr) 4880 dnl 0: 4881 dnl __(unbox_fixnum(imm1,arg_y)) 4882 dnl __(unbox_fixnum(imm0,arg_z)) 4883 dnl __(bgt cr1,2f) 4884 dnl /* (ash n -count) => fixnum */ 4885 dnl __(neg imm2,imm0) 4886 dnl __(bgt cr2,1f) 4887 dnl __(mov imm2,#31) 4888 dnl 1: 4889 dnl __(sraw imm0,imm1,imm2) 4890 dnl __(box_fixnum(arg_z,imm0)) 4891 dnl __(bx lr) 4892 dnl /* Integer-length of arg_y/imm1 to imm2 */ 4893 dnl 2: 4894 dnl __(cntlzw. imm2,imm1) 4895 dnl __(bne 3f) /* cr0`eq' set if negative */ 4896 dnl __(not imm2,imm1) 4897 dnl __(cntlzw imm2,imm2) 4898 dnl 3: 4899 dnl __(subfic imm2,imm2,32) 4900 dnl __(add imm2,imm2,imm0) /* imm2 <- integer-length(imm1) + count */ 4901 dnl __(cmpri(cr1,imm2,31-fixnumshift)) 4902 dnl __(cmpri(cr2,imm0,32)) 4903 dnl __(slw imm2,imm1,imm0) 4904 dnl __(bgt cr1,6f) 4905 dnl __(box_fixnum(arg_z,imm2)) 4906 dnl __(bx lr) 4907 dnl 6: 4908 dnl __(bgt cr2,9f) 4909 dnl __(bne cr2,7f) 4910 dnl /* Shift left by 32 bits exactly */ 4911 dnl __(mov imm0,imm1) 4912 dnl __(mov imm1,#0) 4913 dnl __(beq _SPmakes64) 4914 dnl __(b _SPmakeu64) 4915 dnl 7: 4916 dnl /* Shift left by fewer than 32 bits, result not a fixnum */ 4917 dnl __(subfic imm0,imm0,32) 4918 dnl __(beq 8f) 4919 dnl __(srw imm0,imm1,imm0) 4920 dnl __(mov imm1,imm2) 4921 dnl __(b _SPmakeu64) 4922 dnl 8: 4923 dnl __(sraw imm0,imm1,imm0) 4924 dnl __(mov imm1,imm2) 4925 dnl __(b _SPmakes64) 4926 dnl __endif 4927 dnl 9: 4928 dnl __(jump_builtin(_builtin_ash,2)) 4929 dnl 4930 dnl _spentry(builtin_negate) 4931 dnl __(test_fixnum(arg_z)) 4932 dnl __(bne 1f) 4933 dnl __(rsbs arg_z,arg_z,#0) 4934 dnl __(bxvc lr) 4935 dnl __(unbox_fixnum(imm1,arg_z)) 4936 dnl __ifdef(`PPC64') 4937 dnl __(mov imm0,#two_digit_bignum_header) 4938 dnl __(rotldi imm1,imm1,32) 4939 dnl __(xoris imm1,imm1,0xe000) 4940 dnl __(Misc_Alloc_Fixed(arg_z,imm0,aligned_bignum_size(2))) 4941 dnl __(str(imm1,misc_data_offset(arg_z))) 4942 dnl __else 4943 dnl __(mov imm0,#one_digit_bignum_header) 4944 dnl __(xoris imm1,imm1,0xc000) 4945 dnl __(Misc_Alloc_Fixed(arg_z,imm0,aligned_bignum_size(1))) 4946 dnl __(str(imm1,misc_data_offset(arg_z))) 4947 dnl __endif 4948 dnl __(bx lr) 4949 dnl 1: 4950 dnl __(jump_builtin(_builtin_negate,1)) 2837 dnl __(jump_builtin(_builtin_seqtype,1)) 2838 2839 /* This is 2840 _spentry(builtin_assq) 2841 __(b 2f) 2842 1: __(trap_unless_list(arg_z,imm0)) 2843 __(_car(arg_x,arg_z)) 2844 __(_cdr(arg_z,arg_z)) 2845 __(cmp arg_x,#nil_value) 2846 __(beq 2f) 2847 __(trap_unless_list(arg_x,imm0)) 2848 __(_car(temp0,arg_x)) 2849 __(cmp temp0,arg_y) 2850 __(bne 2f) 2851 __(mov arg_z,arg_x) 2852 __(bx lr) 2853 2: __(cmp arg_z,#nil_value) 2854 __(bne 1b) 2855 __(bx lr) 2856 2857 _spentry(builtin_memq) 2858 __(cmp arg_z,nil_value) 2859 __(b 2f) 2860 1: __(trap_unless_list(arg_z,imm0)) 2861 __(_car(arg_x,arg_z)) 2862 __(_cdr(temp0,arg_z)) 2863 __(cmp arg_x,arg_y) 2864 __(bxeq lr) 2865 __(cmp temp0,nil_value) 2866 __(mov arg_z,temp0) 2867 2: __(bne 1b) 2868 __(bx lr) 2869 2870 2871 _spentry(builtin_logbitp) 2872 /* Call out unless both fixnums,0 <= arg_y < logbitp_max_bit */ 2873 __(test_two_fixnums(arg_y,arg_z,imm0)) 2874 __(bne 1f) 2875 __(uuo_suspend_now(al)) 2876 __(cmp arg_y,#(nbits_in_word-fixnumshift)<<fixnumshift) 2877 __(bhs 1f) 2878 __(unbox_fixnum(imm0,arg_y)) 2879 __(mov imm1,#fixnum1) 2880 __(tst arg_z,imm1,lsl imm0) 2881 __(mov arg_z,#nil_value) 2882 __(addne arg_z,arg_z,#t_offset) 2883 __(bx lr) 2884 1: 2885 __(jump_builtin(_builtin_logbitp,2)) 2886 2887 _spentry(builtin_logior) 2888 __(orr imm0,arg_y,arg_z) 2889 __(test_fixnum(imm0)) 2890 __(moveq arg_z,imm0) 2891 __(bxeq lr) 2892 __(jump_builtin(_builtin_logior,2)) 2893 2894 _spentry(builtin_logand) 2895 __(test_two_fixnums(arg_y,arg_z,imm0)) 2896 __(andeq arg_z,arg_y,arg_z) 2897 __(bxeq lr) 2898 __(jump_builtin(_builtin_logand,2)) 2899 2900 _spentry(builtin_ash) 2901 __(test_two_fixnums(arg_y,arg_z,imm0)) 2902 __(bne 9f) 2903 __(cmp arg_z,#0) 2904 __(bgt 1f) 2905 __(moveq arg_z,arg_y) 2906 __(bxeq lr) 2907 /* Shift right */ 2908 __(unbox_fixnum(imm2,arg_z)) 2909 __(rsb imm2,imm2,0) 2910 __(cmp imm2,#32) 2911 __(movge imm2,#31) 2912 __(mov arg_z,#-fixnumone) 2913 __(and arg_z,arg_z,arg_y,lsr imm2) 2914 __(bx lr) 2915 /* shift left */ 2916 1: __(unbox_fixnum(imm0,arg_y)) 2917 __(mov imm1,imm0,asr #31) 2918 __(unbox_fixnum(imm2,arg_z)) 2919 __(cmp imm2,#32) 2920 __(moveq imm1,imm0) 2921 __(moveq imm0,#0) 2922 __(beq _SPmakes64) 2923 __(bgt 9f) 2924 __(mov imm1,imm1,asl imm2) 2925 __(rsb imm2,imm2,#32) 2926 __(orr imm1,imm1,imm0,lsr imm2) 2927 __(unbox_fixnum(imm2,arg_z)) 2928 __(mov imm0,imm0,asl imm2) 2929 __(b _SPmake64) 2930 9: 2931 __(jump_builtin(_builtin_ash,2)) 2932 2933 _spentry(builtin_negate) 2934 __(test_fixnum(arg_z)) 2935 __(bne 1f) 2936 __(rsbs arg_z,arg_z,#0) 2937 __(bxvc lr) 2938 __(b _SPfix_overflow) 2939 1: 2940 __(jump_builtin(_builtin_negate,1)) 4951 2941 dnl 4952 2942 dnl _spentry(builtin_logxor) … … 4954 2944 dnl __(extract_lisptag(imm1,arg_z)) 4955 2945 dnl __(ands imm0,imm0,imm1) 4956 dnl __(eoreq arg_z,arg_y,arg_z)4957 dnl __(bxeq lr)4958 dnl __(jump_builtin(_builtin_logxor,2))2946 dnl __(eoreq arg_z,arg_y,arg_z) 2947 dnl __(bxeq lr) 2948 dnl __(jump_builtin(_builtin_logxor,2)) 4959 2949 dnl 4960 2950 dnl … … 4962 2952 dnl 4963 2953 dnl _spentry(builtin_aset1) 4964 dnl __(extract_typecode(imm0,arg_x))4965 dnl __(cmpri(cr0,imm0,min_vector_subtag))4966 dnl __(box_fixnum(temp0,imm0))4967 dnl __(bgt cr0,1f)4968 dnl __(jump_builtin(_builtin_aset1,3))2954 dnl __(extract_typecode(imm0,arg_x)) 2955 dnl __(cmpri(cr0,imm0,min_vector_subtag)) 2956 dnl __(box_fixnum(temp0,imm0)) 2957 dnl __(bgt cr0,1f) 2958 dnl __(jump_builtin(_builtin_aset1,3)) 4969 2959 dnl 1: 4970 dnl __(b _SPsubtag_misc_set)2960 dnl __(b _SPsubtag_misc_set) 4971 2961 dnl 4972 2962 dnl /* Enter the debugger */ 4973 2963 dnl _spentry(breakpoint) 4974 dnl __(mov r3,#0)4975 dnl __(tw 28,sp,sp)/* 28 = lt|gt|eq (assembler bug for the latter) */4976 dnl __(bx lr)/* if handler didn't */2964 dnl __(mov r3,#0) 2965 dnl __(tw 28,sp,sp) /* 28 = lt|gt|eq (assembler bug for the latter) */ 2966 dnl __(bx lr) /* if handler didn't */ 4977 2967 dnl 4978 2968 dnl /* */ … … 4982 2972 dnl /* then shrink the eabi_c_frame. */ 4983 2973 dnl /* */ 4984 dnl 2974 dnl 4985 2975 dnl _spentry(eabi_ff_call) 4986 dnl __(mflr loc_pc)4987 dnl __(str(sp,eabi_c_frame.savelr(sp)))4988 dnl __(vpush_saveregs())/* Now we can use save0-save7 to point to stacks */4989 dnl __(mov save0,rcontext)/* or address globals. */4990 dnl __(extract_typecode(imm0,arg_z))4991 dnl __(cmpri(imm0,subtag_macptr))4992 dnl __(ldr save1,[sp,#0])/* bottom of reserved lisp frame */4993 dnl __(la save2,-lisp_frame.size(save1))/* top of lisp frame */2976 dnl __(mflr loc_pc) 2977 dnl __(str(sp,eabi_c_frame.savelr(sp))) 2978 dnl __(vpush_saveregs()) /* Now we can use save0-save7 to point to stacks */ 2979 dnl __(mov save0,rcontext) /* or address globals. */ 2980 dnl __(extract_typecode(imm0,arg_z)) 2981 dnl __(cmpri(imm0,subtag_macptr)) 2982 dnl __(ldr save1,[sp,#0]) /* bottom of reserved lisp frame */ 2983 dnl __(la save2,-lisp_frame.size(save1)) /* top of lisp frame */ 4994 2984 dnl __(zero_doublewords save2,0,lisp_frame.size) 4995 dnl __(str(save1,lisp_frame.backlink(save2)))4996 dnl __(str(save2,c_frame.backlink(sp)))4997 dnl __(str(fn,lisp_frame.savefn(save2)))4998 dnl __(str(loc_pc,lisp_frame.savelr(save2)))4999 dnl __(str(vsp,lisp_frame.savevsp(save2)))5000 dnl __(bne 1f)5001 dnl __(ldr arg_z,[arg_z,#macptr.address])2985 dnl __(str(save1,lisp_frame.backlink(save2))) 2986 dnl __(str(save2,c_frame.backlink(sp))) 2987 dnl __(str(fn,lisp_frame.savefn(save2))) 2988 dnl __(str(loc_pc,lisp_frame.savelr(save2))) 2989 dnl __(str(vsp,lisp_frame.savevsp(save2))) 2990 dnl __(bne 1f) 2991 dnl __(ldr arg_z,[arg_z,#macptr.address]) 5002 2992 dnl 1: 5003 dnl __(ldr save3,[rcontext,#tcr.cs_area])5004 dnl __(str(save2,area.active(save3)))5005 dnl __(str(allocptr,tcr.save_allocptr(rcontext)))5006 dnl __(str(allocbase,tcr.save_allocbase(rcontext)))5007 dnl __(str(tsp,tcr.save_tsp(rcontext)))5008 dnl __(str(vsp,tcr.save_vsp(rcontext)))5009 dnl __(mtctr arg_z)5010 dnl __(str(rzero,tcr.ffi_exception(rcontext)))5011 dnl __(mffs f0)5012 dnl __(stfd f0,tcr.lisp_fpscr(rcontext))/* remember lisp's fpscr */5013 dnl __(mtfsf 0xff,fp_zero)/* zero foreign fpscr */5014 dnl __(mov imm1,#TCR_STATE_FOREIGN)5015 dnl __(str(imm1,tcr.valence(rcontext)))5016 dnl __(ldr r2,[rcontext,#tcr.native_thread_info])5017 dnl __(ldr r13,[0,#lisp_globals.saveR13])5018 dnl __(ldr r3,[sp,#eabi_c_frame.param0])5019 dnl __(ldr r4,[sp,#eabi_c_frame.param1])5020 dnl __(ldr r5,[sp,#eabi_c_frame.param2])5021 dnl __(ldr r6,[sp,#eabi_c_frame.param3])5022 dnl __(ldr r7,[sp,#eabi_c_frame.param4])5023 dnl __(ldr r8,[sp,#eabi_c_frame.param5])5024 dnl __(ldr r9,[sp,#eabi_c_frame.param6])5025 dnl __(ldr r10,[sp,#eabi_c_frame.param7])5026 dnl __(la save1,eabi_c_frame.minsiz-eabi_c_frame.param0(sp))5027 dnl __(str(rzero,eabi_c_frame.savelr(save1)))5028 dnl __(str(save2,eabi_c_frame.backlink(save1)))5029 dnl __(mov sp,save1)5030 dnl /* If we're calling a varargs C function, it'll want to */5031 dnl /* know whether or not we've passed any args in FP regs. */5032 dnl /* Better to say that we did (and force callee to save FP */5033 dnl /* arg regs on entry) than to say that we didn't and get */5034 dnl /* garbage results */5035 dnl __(crset 6)5036 dnl __(bctrl)5037 dnl /* C should have preserved save0 (= rcontext) for us. */5038 dnl __(ldr sp,[sp,#0])5039 dnl __(mov imm2,save0)5040 dnl __(ldr vsp,[sp,#lisp_frame.savevsp])5041 dnl __(mov rzero,#0)5042 dnl __(mov loc_pc,rzero)5043 dnl __(mov arg_x,#nil_value)5044 dnl __(mov arg_y,#nil_value)5045 dnl __(mov arg_z,#nil_value)5046 dnl __(mov temp0,#nil_value)5047 dnl __(mov temp1,#nil_value)5048 dnl __(mov temp2,#nil_value)5049 dnl __(mov temp3,#nil_value)5050 dnl __(mov fn,#nil_value)5051 dnl __(mov rcontext,imm2)5052 dnl __(mov imm2,#TCR_STATE_LISP)5053 dnl __(ldr tsp,[rcontext,#tcr.save_tsp])2993 dnl __(ldr save3,[rcontext,#tcr.cs_area]) 2994 dnl __(str(save2,area.active(save3))) 2995 dnl __(str(allocptr,tcr.save_allocptr(rcontext))) 2996 dnl __(str(allocbase,tcr.save_allocbase(rcontext))) 2997 dnl __(str(tsp,tcr.save_tsp(rcontext))) 2998 dnl __(str(vsp,tcr.save_vsp(rcontext))) 2999 dnl __(mtctr arg_z) 3000 dnl __(str(rzero,tcr.ffi_exception(rcontext))) 3001 dnl __(mffs f0) 3002 dnl __(stfd f0,tcr.lisp_fpscr(rcontext)) /* remember lisp's fpscr */ 3003 dnl __(mtfsf 0xff,fp_zero) /* zero foreign fpscr */ 3004 dnl __(mov imm1,#TCR_STATE_FOREIGN) 3005 dnl __(str(imm1,tcr.valence(rcontext))) 3006 dnl __(ldr r2,[rcontext,#tcr.native_thread_info]) 3007 dnl __(ldr r13,[0,#lisp_globals.saveR13]) 3008 dnl __(ldr r3,[sp,#eabi_c_frame.param0]) 3009 dnl __(ldr r4,[sp,#eabi_c_frame.param1]) 3010 dnl __(ldr r5,[sp,#eabi_c_frame.param2]) 3011 dnl __(ldr r6,[sp,#eabi_c_frame.param3]) 3012 dnl __(ldr r7,[sp,#eabi_c_frame.param4]) 3013 dnl __(ldr r8,[sp,#eabi_c_frame.param5]) 3014 dnl __(ldr r9,[sp,#eabi_c_frame.param6]) 3015 dnl __(ldr r10,[sp,#eabi_c_frame.param7]) 3016 dnl __(la save1,eabi_c_frame.minsiz-eabi_c_frame.param0(sp)) 3017 dnl __(str(rzero,eabi_c_frame.savelr(save1))) 3018 dnl __(str(save2,eabi_c_frame.backlink(save1))) 3019 dnl __(mov sp,save1) 3020 dnl /* If we're calling a varargs C function, it'll want to */ 3021 dnl /* know whether or not we've passed any args in FP regs. */ 3022 dnl /* Better to say that we did (and force callee to save FP */ 3023 dnl /* arg regs on entry) than to say that we didn't and get */ 3024 dnl /* garbage results */ 3025 dnl __(crset 6) 3026 dnl __(bctrl) 3027 dnl /* C should have preserved save0 (= rcontext) for us. */ 3028 dnl __(ldr sp,[sp,#0]) 3029 dnl __(mov imm2,save0) 3030 dnl __(ldr vsp,[sp,#lisp_frame.savevsp]) 3031 dnl __(mov rzero,#0) 3032 dnl __(mov loc_pc,rzero) 3033 dnl __(mov arg_x,#nil_value) 3034 dnl __(mov arg_y,#nil_value) 3035 dnl __(mov arg_z,#nil_value) 3036 dnl __(mov temp0,#nil_value) 3037 dnl __(mov temp1,#nil_value) 3038 dnl __(mov temp2,#nil_value) 3039 dnl __(mov temp3,#nil_value) 3040 dnl __(mov fn,#nil_value) 3041 dnl __(mov rcontext,imm2) 3042 dnl __(mov imm2,#TCR_STATE_LISP) 3043 dnl __(ldr tsp,[rcontext,#tcr.save_tsp]) 5054 3044 dnl __(mov save0,#0) 5055 3045 dnl __(mov save1,#0) … … 5062 3052 dnl __(mov allocptr,#-dnode_size) 5063 3053 dnl __(mov allocbase,#-dnode_size) 5064 dnl __(str(imm2,tcr.valence(rcontext)))5065 dnl __(vpop_saveregs())5066 dnl __(ldr allocptr,[rcontext,#tcr.save_allocptr])5067 dnl __(ldr allocbase,[rcontext,#tcr.save_allocbase])5068 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr])5069 dnl __(mtlr loc_pc)5070 dnl __(ldr fn,[sp,#lisp_frame.savefn])5071 dnl __(mffs f0)5072 dnl __(stfd f0,8(sp))5073 dnl __(lwz imm3,12(sp))/* imm3 = FPSCR after call */3054 dnl __(str(imm2,tcr.valence(rcontext))) 3055 dnl __(vpop_saveregs()) 3056 dnl __(ldr allocptr,[rcontext,#tcr.save_allocptr]) 3057 dnl __(ldr allocbase,[rcontext,#tcr.save_allocbase]) 3058 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 3059 dnl __(mtlr loc_pc) 3060 dnl __(ldr fn,[sp,#lisp_frame.savefn]) 3061 dnl __(mffs f0) 3062 dnl __(stfd f0,8(sp)) 3063 dnl __(lwz imm3,12(sp)) /* imm3 = FPSCR after call */ 5074 3064 dnl __(clrrwi imm2,imm3,8) 5075 dnl __(discard_lisp_frame())5076 dnl __(str(imm2,tcr.ffi_exception(rcontext)))5077 dnl __(lfd f0,tcr.lisp_fpscr(rcontext))5078 dnl __(mtfsf 0xff,f0)5079 dnl __(check_pending_interrupt(`cr1'))3065 dnl __(discard_lisp_frame()) 3066 dnl __(str(imm2,tcr.ffi_exception(rcontext))) 3067 dnl __(lfd f0,tcr.lisp_fpscr(rcontext)) 3068 dnl __(mtfsf 0xff,f0) 3069 dnl __(check_pending_interrupt(`cr1')) 5080 3070 dnl __(mtxer rzero) 5081 3071 dnl __(mtctr rzero) 5082 dnl __(bx lr) 5083 dnl 5084 dnl /* */ 5085 dnl /* This gets called with R11 holding the unboxed callback index. */ 5086 dnl /* */ 5087 dnl 5088 dnl _spentry(eabi_callback) 5089 dnl /* First, we extend the C frame so that it has room for */ 5090 dnl /* incoming arg regs. */ 5091 dnl __(ldr r0,[sp,#eabi_c_frame.backlink]) 5092 dnl __(stru(r0,eabi_c_frame.param0-varargs_eabi_c_frame.incoming_stack_args(sp))) 5093 dnl __(mflr r0) 5094 dnl __(str(r0,varargs_eabi_c_frame.savelr(sp))) 5095 dnl __(str(r3,varargs_eabi_c_frame.gp_save+(0*4)(sp))) 5096 dnl __(str(r4,varargs_eabi_c_frame.gp_save+(1*4)(sp))) 5097 dnl __(str(r5,varargs_eabi_c_frame.gp_save+(2*4)(sp))) 5098 dnl __(str(r6,varargs_eabi_c_frame.gp_save+(3*4)(sp))) 5099 dnl __(str(r7,varargs_eabi_c_frame.gp_save+(4*4)(sp))) 5100 dnl __(str(r8,varargs_eabi_c_frame.gp_save+(5*4)(sp))) 5101 dnl __(str(r9,varargs_eabi_c_frame.gp_save+(6*4)(sp))) 5102 dnl __(str(r10,varargs_eabi_c_frame.gp_save+(7*4)(sp))) 5103 dnl /* Could check the appropriate CR bit and skip saving FP regs here */ 5104 dnl __(stfd f1,varargs_eabi_c_frame.fp_save+(0*8)(sp)) 5105 dnl __(stfd f2,varargs_eabi_c_frame.fp_save+(1*8)(sp)) 5106 dnl __(stfd f3,varargs_eabi_c_frame.fp_save+(2*8)(sp)) 5107 dnl __(stfd f4,varargs_eabi_c_frame.fp_save+(3*8)(sp)) 5108 dnl __(stfd f5,varargs_eabi_c_frame.fp_save+(4*8)(sp)) 5109 dnl __(stfd f6,varargs_eabi_c_frame.fp_save+(5*8)(sp)) 5110 dnl __(stfd f7,varargs_eabi_c_frame.fp_save+(6*8)(sp)) 5111 dnl __(stfd f8,varargs_eabi_c_frame.fp_save+(7*8)(sp)) 5112 dnl __(la r0,varargs_eabi_c_frame.incoming_stack_args(sp)) 5113 dnl __(str(r0,varargs_eabi_c_frame.overflow_arg_area(sp))) 5114 dnl __(la r0,varargs_eabi_c_frame.regsave(sp)) 5115 dnl __(str(r0,varargs_eabi_c_frame.reg_save_area(sp))) 5116 dnl __(mov r0,#0) 5117 dnl __(str(r0,varargs_eabi_c_frame.flags(sp))) 5118 dnl 5119 dnl /* Save the non-volatile registers on the sp stack */ 5120 dnl /* This is a non-standard stack frame, but noone will ever see it, */ 5121 dnl /* so it doesn't matter. It will look like more of the stack frame pushed below. */ 5122 dnl __(stru(sp,-(c_reg_save.size)(sp))) 5123 dnl __(str(r13,c_reg_save.save_gprs+(0*node_size)(sp))) 5124 dnl __(str(r14,c_reg_save.save_gprs+(1*node_size)(sp))) 5125 dnl __(str(r15,c_reg_save.save_gprs+(2*node_size)(sp))) 5126 dnl __(str(r16,c_reg_save.save_gprs+(3*node_size)(sp))) 5127 dnl __(str(r17,c_reg_save.save_gprs+(4*node_size)(sp))) 5128 dnl __(str(r18,c_reg_save.save_gprs+(5*node_size)(sp))) 5129 dnl __(str(r19,c_reg_save.save_gprs+(6*node_size)(sp))) 5130 dnl __(str(r20,c_reg_save.save_gprs+(7*node_size)(sp))) 5131 dnl __(str(r21,c_reg_save.save_gprs+(8*node_size)(sp))) 5132 dnl __(str(r22,c_reg_save.save_gprs+(9*node_size)(sp))) 5133 dnl __(str(r23,c_reg_save.save_gprs+(10*node_size)(sp))) 5134 dnl __(str(r24,c_reg_save.save_gprs+(11*node_size)(sp))) 5135 dnl __(str(r25,c_reg_save.save_gprs+(12*node_size)(sp))) 5136 dnl __(str(r26,c_reg_save.save_gprs+(13*node_size)(sp))) 5137 dnl __(str(r27,c_reg_save.save_gprs+(14*node_size)(sp))) 5138 dnl __(str(r28,c_reg_save.save_gprs+(15*node_size)(sp))) 5139 dnl __(str(r29,c_reg_save.save_gprs+(16*node_size)(sp))) 5140 dnl __(str(r30,c_reg_save.save_gprs+(17*node_size)(sp))) 5141 dnl __(str(r31,c_reg_save.save_gprs+(18*node_size)(sp))) 5142 dnl __(mffs f0) 5143 dnl __(stfd f0,c_reg_save.save_fp_zero(sp)) 5144 dnl __(ldr r31,[sp,#c_reg_save.save_fp_zero+4]) /* recover FPSCR image */ 5145 dnl __(str(r31,c_reg_save.save_fpscr(sp))) 5146 dnl __(mov r30,#0x43300000) 5147 dnl __(mov r31,#0x80000000) 5148 dnl __(str(r30,c_reg_save.save_fp_zero(sp))) 5149 dnl __(str(r31,c_reg_save.save_fp_zero+4(sp))) 5150 dnl __(stfd fp_s32conv,c_reg_save.save_fps32conv(sp)) 5151 dnl __(lfd fp_s32conv,c_reg_save.save_fp_zero(sp)) 5152 dnl __(stfd fp_zero,c_reg_save.save_fp_zero(sp)) 5153 dnl __(lfs fp_zero,lisp_globals.short_float_zero(0)) /* ensure that fp_zero contains 0.0 */ 5154 dnl 5155 dnl 5156 dnl /* Restore rest of Lisp context. */ 5157 dnl /* Could spread out the memory references here to gain a little speed */ 5158 dnl __(mov loc_pc,#0) 5159 dnl __(mov fn,#0) /* subprim, not a lisp function */ 5160 dnl __(mov temp3,#0) 5161 dnl __(mov temp2,#0) 5162 dnl __(mov temp1,#0) 5163 dnl __(mov temp0,#0) 5164 dnl __(mov arg_x,#0) 5165 dnl __(box_fixnum(arg_y,r11)) /* callback-index */ 5166 dnl __(la arg_z,c_reg_save.size+varargs_eabi_c_frame.gp_save(sp)) /* parameters (tagged as a fixnum) */ 5167 dnl 5168 dnl /* Recover lisp thread context. Have to call C code to do so. */ 5169 dnl __(ref_global(r12,get_tcr)) 5170 dnl __(mtctr r12) 5171 dnl __(mov r3,#1) 5172 dnl __(stru(sp,-(stack_align(eabi_c_frame.minsiz))(sp))) 5173 dnl __(bctrl) 5174 dnl __(la sp,(stack_align(eabi_c_frame.minsiz))(sp)) 5175 dnl __(la rcontext,TCR_BIAS(r3)) 5176 dnl __(mov allocptr,#0) 5177 dnl __(mov allocbase,#0) 5178 dnl __(ldr vsp,[rcontext,#tcr.save_vsp]) 5179 dnl __(ldr tsp,[rcontext,#tcr.save_tsp]) 5180 dnl __(mov rzero,#0) 5181 dnl __(mtxer rzero) /* lisp wants the overflow bit clear */ 5182 dnl __(mov imm0,#TCR_STATE_LISP) 5183 dnl __(mov save0,#0) 5184 dnl __(mov save1,#0) 5185 dnl __(mov save2,#0) 5186 dnl __(mov save3,#0) 5187 dnl __(mov save4,#0) 5188 dnl __(mov save5,#0) 5189 dnl __(mov save6,#0) 5190 dnl __(mov save7,#0) 5191 dnl __(mtctr rzero) 5192 dnl __(str(imm0,tcr.valence(rcontext))) 5193 dnl __(ldr allocptr,[rcontext,#tcr.save_allocptr]) 5194 dnl __(ldr allocbase,[rcontext,#tcr.save_allocbase]) 5195 dnl __(lfd f0,tcr.lisp_fpscr(rcontext)) 5196 dnl __(mtfsf 0xff,f0) 5197 dnl 5198 dnl __(restore_saveregs(vsp)) 5199 dnl /* load nargs and callback to the lisp */ 5200 dnl __(set_nargs(2)) 5201 dnl __(ldr imm2,[rcontext,#tcr.cs_area]) 5202 dnl __(ldr imm4,[imm2,#area.active]) 5203 dnl __(stru(imm4,-lisp_frame.size(sp))) 5204 dnl __(str(imm3,lisp_frame.savelr(sp))) 5205 dnl __(str(vsp,lisp_frame.savevsp(sp))) /* for stack overflow code */ 5206 dnl __(mov fname,#nrs.callbacks) /* %pascal-functions% */ 5207 dnl __(call_fname) 5208 dnl __(ldr imm2,[sp,#lisp_frame.backlink]) 5209 dnl __(ldr imm3,[rcontext,#tcr.cs_area]) 5210 dnl __(str(imm2,area.active(imm3))) 5211 dnl __(discard_lisp_frame()) 5212 dnl /* save_vsp will be restored from ff_call's stack frame, but */ 5213 dnl /* I included it here for consistency. */ 5214 dnl /* save_tsp is set below after we exit Lisp context. */ 5215 dnl __(str(allocptr,tcr.save_allocptr(rcontext))) 5216 dnl __(str(allocbase,tcr.save_allocbase(rcontext))) 5217 dnl __(str(vsp,tcr.save_vsp(rcontext))) 5218 dnl __(str(tsp,tcr.save_tsp(rcontext))) 5219 dnl /* Exit lisp context */ 5220 dnl /* This is not necessary yet, but will be once we can be interrupted */ 5221 dnl __(mov imm1,#TCR_STATE_FOREIGN) 5222 dnl __(str(imm1,tcr.valence(rcontext))) 5223 dnl /* Restore the non-volatile registers & fpscr */ 5224 dnl __(lfd fp_zero,c_reg_save.save_fp_zero(sp)) 5225 dnl __(ldr r31,[sp,#c_reg_save.save_fpscr]) 5226 dnl __(str(r31,c_reg_save.save_fp_zero+4(sp))) 5227 dnl __(lfd f0,c_reg_save.save_fp_zero(sp)) 5228 dnl __(mtfsf 0xff,f0) 5229 dnl __(ldr r13,c_reg_save.save_gprs+(0*node_size)(sp))) 5230 dnl __(ldr(r14,c_reg_save.save_gprs+(1*node_size)(sp))) 5231 dnl __(ldr(r15,c_reg_save.save_gprs+(2*node_size)(sp))) 5232 dnl __(ldr(r16,c_reg_save.save_gprs+(3*node_size)(sp))) 5233 dnl __(ldr(r17,c_reg_save.save_gprs+(4*node_size)(sp))) 5234 dnl __(ldr(r18,c_reg_save.save_gprs+(5*node_size)(sp))) 5235 dnl __(ldr(r19,c_reg_save.save_gprs+(6*node_size)(sp))) 5236 dnl __(ldr(r20,c_reg_save.save_gprs+(7*node_size)(sp))) 5237 dnl __(ldr(r21,c_reg_save.save_gprs+(8*node_size)(sp))) 5238 dnl __(ldr(r22,c_reg_save.save_gprs+(9*node_size)(sp))) 5239 dnl __(ldr(r23,c_reg_save.save_gprs+(10*node_size)(sp))) 5240 dnl __(ldr(r24,c_reg_save.save_gprs+(11*node_size)(sp))) 5241 dnl __(ldr(r25,c_reg_save.save_gprs+(12*node_size)(sp))) 5242 dnl __(ldr(r26,c_reg_save.save_gprs+(13*node_size)(sp))) 5243 dnl __(ldr(r27,c_reg_save.save_gprs+(14*node_size)(sp))) 5244 dnl __(ldr(r28,c_reg_save.save_gprs+(15*node_size)(sp))) 5245 dnl __(ldr(r29,c_reg_save.save_gprs+(16*node_size)(sp))) 5246 dnl __(ldr(r30,c_reg_save.save_gprs+(17*node_size)(sp))) 5247 dnl __(ldr(r31,c_reg_save.save_gprs+(18*node_size)(sp))) 5248 dnl __(lfd fp_s32conv,c_reg_save.save_fps32conv(sp)) 5249 dnl __(ldr(sp,0(sp))) 5250 dnl 5251 dnl __(ldr(r3,varargs_eabi_c_frame.gp_save+(0*4)(sp))) 5252 dnl __(ldr(r4,varargs_eabi_c_frame.gp_save+(1*4)(sp))) 5253 dnl __(lfd f1,varargs_eabi_c_frame.gp_save+(2*4)(sp)) 5254 dnl __(ldr(r5,varargs_eabi_c_frame.savelr(sp))) 5255 dnl __(str(r5,varargs_eabi_c_frame.old_savelr(sp))) 5256 dnl __(mtlr r5) 5257 dnl __(ldr(r5,varargs_eabi_c_frame.backlink(sp))) 5258 dnl __(str(r5,varargs_eabi_c_frame.old_backlink(sp))) 5259 dnl __(la sp,varargs_eabi_c_frame.old_backlink(sp)) 5260 dnl __(bx lr) 5261 dnl 5262 dnl 5263 dnl /* Do a linux system call: the system call index is (boxed) */ 5264 dnl /* in arg_z, and other arguments are in an eabi_c_frame on */ 5265 dnl /* the C stack. As is the case with an eabi_ff_call, there's */ 5266 dnl /* a lisp frame reserved underneath the eabi_c_frame. */ 5267 dnl 5268 dnl /* This is a little simpler than eabi_ff_call, because we */ 5269 dnl /* can assume that there are no synchronous callbacks to */ 5270 dnl /* lisp (that might cause a GC.) It's also simpler for the */ 5271 dnl /* caller, since we return error status atomically. */ 5272 dnl 5273 dnl /* A system call can clobber any or all of r9-r12, so we need */ 5274 dnl /* to save and restore allocptr, allocbase, and tsp. */ 5275 dnl 5276 dnl _spentry(eabi_syscall) 5277 dnl /* We're entered with an eabi_c_frame on the C stack. There's a */ 5278 dnl /* lisp_frame reserved underneath it; we'll link it in in a minute. */ 5279 dnl /* Load the outgoing GPR arguments from eabi_c_frame.param`0-7', */ 5280 dnl /* then shrink the eabi_c_frame. */ 5281 dnl 5282 dnl __(mflr loc_pc) 5283 dnl __(vpush_saveregs()) 5284 dnl __(str(sp,eabi_c_frame.savelr(sp))) 5285 dnl __(mov arg_x,#nil_value) 5286 dnl __(mov temp0,rcontext) 5287 dnl __(ldr temp1,[sp,#c_frame.backlink]) /* bottom of reserved lisp frame */ 5288 dnl __(la temp2,-lisp_frame.size(temp1)) /* top of lisp frame */ 5289 dnl __(zero_doublewords temp2,0,lisp_frame.size) 5290 dnl __(str(temp1,lisp_frame.backlink(temp2))) 5291 dnl __(str(temp2,c_frame.backlink(sp))) 5292 dnl __(str(fn,lisp_frame.savefn(temp2))) 5293 dnl __(str(loc_pc,lisp_frame.savelr(temp2))) 5294 dnl __(str(vsp,lisp_frame.savevsp(temp2))) 5295 dnl __(ldr temp3,[rcontext,#tcr.cs_area]) 5296 dnl __(str(temp2,area.active(temp3))) 5297 dnl __(str(allocptr,tcr.save_allocptr(rcontext))) 5298 dnl __(str(allocbase,tcr.save_allocbase(rcontext))) 5299 dnl __(str(tsp,tcr.save_tsp(rcontext))) 5300 dnl __(str(vsp,tcr.save_vsp(rcontext))) 5301 dnl __(str(rzero,tcr.ffi_exception(rcontext))) 5302 dnl __(mov imm1,#TCR_STATE_FOREIGN) 5303 dnl __(str(imm1,tcr.valence(rcontext))) 5304 dnl __(ldr r13,[0,#lisp_globals.saveR13]) 5305 dnl __(ldr r3,[sp,#eabi_c_frame.param0]) 5306 dnl __(ldr r4,[sp,#eabi_c_frame.param1]) 5307 dnl __(ldr r5,[sp,#eabi_c_frame.param2]) 5308 dnl __(ldr r6,[sp,#eabi_c_frame.param3]) 5309 dnl __(ldr r7,[sp,#eabi_c_frame.param4]) 5310 dnl __(ldr r8,[sp,#eabi_c_frame.param5]) 5311 dnl __(ldr r9,[sp,#eabi_c_frame.param6]) 5312 dnl __(ldr r10,[sp,#eabi_c_frame.param7]) 5313 dnl __(la temp1,eabi_c_frame.minsiz-eabi_c_frame.param0(sp)) 5314 dnl __(str(rzero,eabi_c_frame.savelr(temp1))) 5315 dnl __(str(temp2,eabi_c_frame.backlink(temp1))) 5316 dnl __(mov sp,temp1) 5317 dnl __(unbox_fixnum(r0,arg_z)) 5318 dnl __(sc) 5319 dnl __(nop) 5320 dnl /* C should have preserved temp0 (= rcontext) for us. */ 5321 dnl __(ldr sp,[sp,#0]) 5322 dnl __(mov imm2,temp0) 5323 dnl __(ldr vsp,[sp,#lisp_frame.savevsp]) 5324 dnl __(mov rzero,#0) 5325 dnl __(mov loc_pc,rzero) 5326 dnl __(mov fn,rzero) 5327 dnl __(mov arg_x,#nil_value) 5328 dnl __(mov arg_y,#nil_value) 5329 dnl __(mov arg_z,#nil_value) 5330 dnl __(mov temp0,#nil_value) 5331 dnl __(mov temp1,#nil_value) 5332 dnl __(mov temp2,#nil_value) 5333 dnl __(mov temp3,#nil_value) 5334 dnl __(mov fn,#nil_value) 5335 dnl 5336 dnl __(mov imm3,#TCR_STATE_LISP) 5337 dnl __(mov rcontext,imm2) 5338 dnl __(mov save0,#0) 5339 dnl __(mov save1,#0) 5340 dnl __(mov save2,#0) 5341 dnl __(mov save3,#0) 5342 dnl __(mov save4,#0) 5343 dnl __(mov save5,#0) 5344 dnl __(mov save6,#0) 5345 dnl __(mov save7,#0) 5346 dnl __(str(imm3,tcr.valence(rcontext))) 5347 dnl __(vpop_saveregs) 5348 dnl __(ldr allocptr,[rcontext,#tcr.save_allocptr]) 5349 dnl __(ldr allocbase,[rcontext,#tcr.save_allocbase]) 5350 dnl __(ldr tsp,[rcontext,#tcr.save_tsp]) 5351 dnl __(ldr loc_pc,[sp,#lisp_frame.savelr]) 5352 dnl __(mtlr loc_pc) 5353 dnl __(ldr fn,[sp,#lisp_frame.savefn]) 5354 dnl __(discard_lisp_frame()) 5355 dnl __(bns 1f) 5356 dnl __(neg r3,r3) 5357 dnl 1: 5358 dnl __(check_pending_interrupt(`cr1')) 5359 dnl __(mtxer rzero) 5360 dnl __(bx lr) 5361 dnl 5362 dnl /* arg_z should be of type (UNSIGNED-BYTE 64); */ 5363 dnl /* On PPC32, return high 32 bits in imm0, low 32 bits in imm1 */ 5364 dnl /* On PPC64, return unboxed value in imm0 */ 5365 dnl 5366 dnl _spentry(getu64) 5367 dnl __ifdef(`PPC64') 5368 dnl __(extract_typecode(imm0,arg_z)) 5369 dnl __(cmpdi cr0,imm0,tag_fixnum) 5370 dnl __(cmpdi cr2,arg_z,0) 5371 dnl __(cmpdi cr1,imm0,subtag_bignum) 5372 dnl __(bne cr0,1f) 5373 dnl __(unbox_fixnum(imm0,arg_z)) 5374 dnl __(bgelr cr2) 5375 dnl 0: 5376 dnl __(uuo_interr(error_object_not_u64,arg_z)) 5377 dnl 5378 dnl 1: __(bne cr1,0b) 5379 dnl __(getvheader(imm1,arg_z)) 5380 dnl __(ld imm0,misc_data_offset(arg_z)) 5381 dnl __(cmpdi cr2,imm1,two_digit_bignum_header) 5382 dnl __(rotldi imm0,imm0,32) 5383 dnl __(cmpdi cr1,imm1,three_digit_bignum_header) 5384 dnl __(cmpdi cr0,imm0,0) 5385 dnl __(beq cr2,2f) 5386 dnl __(lwz imm1,misc_data_offset+8(arg_z)) 5387 dnl __(bne cr1,0b) 5388 dnl __(cmpwi imm1,0) 5389 dnl __(bne 0b) 5390 dnl __(bx lr) 5391 dnl 2: __(blt 0b) 5392 dnl __(bx lr) 5393 dnl __else 5394 dnl __(extract_typecode(imm0,arg_z)) 5395 dnl __(cmpri(cr0,imm0,tag_fixnum)) 5396 dnl __(cmpri(cr1,arg_z,0)) 5397 dnl __(cmpri(cr2,imm0,subtag_bignum)) 5398 dnl __(unbox_fixnum(imm1,arg_z)) 5399 dnl __(bne cr0,8f) 5400 dnl __(bgelr cr1) 5401 dnl 9: 5402 dnl __(uuo_interr(error_object_not_u64,arg_z)) 5403 dnl 8: 5404 dnl __(bne- cr2,9b) 5405 dnl __(getvheader(imm2,arg_z)) 5406 dnl __(cmpri(cr2,imm2,two_digit_bignum_header)) 5407 dnl __(vrefr(imm1,arg_z,0)) 5408 dnl __(cmpri(cr1,imm1,0)) 5409 dnl __(mov imm0,#0) 5410 dnl __(bge cr2,2f) 5411 dnl __(blt- cr1,9b) 5412 dnl __(bx lr) 5413 dnl 2: 5414 dnl __(cmpri(cr0,imm2,three_digit_bignum_header)) 5415 dnl __(vrefr(imm0,arg_z,1)) 5416 dnl __(cmpri(cr1,imm0,0)) 5417 dnl __(bne cr2,3f) 5418 dnl __(blt- cr1,9b) 5419 dnl __(bx lr) 5420 dnl 3: 5421 dnl __(vrefr(imm2,arg_z,2)) 5422 dnl __(cmpri(cr1,imm2,0)) 5423 dnl __(bne- cr0,9b) 5424 dnl __(bne- cr1,9b) 5425 dnl __(bx lr) 5426 dnl __endif 5427 dnl 5428 dnl /* arg_z should be of type (SIGNED-BYTE 64); */ 5429 dnl /* PPC32: return high 32 bits in imm0, low 32 bits in imm1 */ 5430 dnl /* PPC64: return unboxed value in imm0 */ 5431 dnl 5432 dnl _spentry(gets64) 5433 dnl __ifdef(`PPC64') 5434 dnl __(extract_typecode(imm1,arg_z)) 5435 dnl __(unbox_fixnum(imm0,arg_z)) 5436 dnl __(cmpri(cr0,imm1,tag_fixnum)) 5437 dnl __(cmpri(cr2,imm1,subtag_bignum)) 5438 dnl __(beqlr cr0) 5439 dnl __(bne cr2,9f) 5440 dnl __(ld imm1,misc_header_offset(arg_z)) 5441 dnl __(ld imm0,misc_data_offset(arg_z)) 5442 dnl __(cmpdi imm1,two_digit_bignum_header) 5443 dnl __(rotldi imm0,imm0,32) 5444 dnl __(beqlr) 5445 dnl __else 5446 dnl __(extract_typecode(imm0,arg_z)) 5447 dnl __(cmpri(cr0,imm0,tag_fixnum)) 5448 dnl __(cmpri(cr2,imm0,subtag_bignum)) 5449 dnl __(unbox_fixnum(imm1,arg_z)) 5450 dnl __(srawi imm0,imm1,31) 5451 dnl __(beqlr cr0) 5452 dnl __(bne cr2,9f) 5453 dnl __(getvheader(imm2,arg_z)) 5454 dnl __(cmpri(cr2,imm2,two_digit_bignum_header)) 5455 dnl __(vrefr(imm1,arg_z,0)) 5456 dnl __(srawi imm0,imm1,31) 5457 dnl __(bltlr cr2) 5458 dnl __(vrefr(imm0,arg_z,1)) 5459 dnl __(beqlr cr2) 5460 dnl __endif 5461 dnl 9: 5462 dnl __(uuo_interr(error_object_not_s64,arg_z)) 5463 dnl 5464 dnl 5465 dnl 5466 dnl 5467 dnl 5468 dnl 5469 dnl 5470 dnl 5471 dnl 5472 dnl /* imm0:imm1 constitute an unsigned integer, almost certainly a bignum. */ 5473 dnl /* Make a lisp integer out of those 128 bits .. */ 5474 dnl _spentry(makeu128) 5475 dnl __ifdef(`PPC64') 5476 dnl __(cmpdi imm0,0) 5477 dnl __(cmpdi cr1,imm1,0) 5478 dnl __(srdi imm3,imm0,32) 5479 dnl __(srawi imm4,imm0,31) 5480 dnl __(cmpdi cr3,imm3,0) 5481 dnl __(cmpdi cr4,imm4,0) 5482 dnl __(mov imm2,#five_digit_bignum_header) 5483 dnl __(blt cr1,0f) 5484 dnl __(beq 3f) 5485 dnl 0: 5486 dnl __(bge 1f) 5487 dnl /* All 128 bits are significant, and the most significant */ 5488 dnl /* bit is set. Allocate a 5-digit bignum (with a zero */ 5489 dnl /* sign digit */ 5490 dnl __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(5))) 5491 dnl __(rotldi imm0,imm0,32) 5492 dnl __(rotldi imm1,imm1,32) 5493 dnl __(std imm1,misc_data_offset(arg_z)) 5494 dnl __(std imm0,misc_data_offset+8(arg_z)) 5495 dnl __(bx lr) 5496 dnl 1: /* If the high word of imm0 is a zero-extension of the low */ 5497 dnl /* word, we only need 3 digits ; otherwise, we need 4. */ 5498 dnl __(mov imm2,#three_digit_bignum_header) 5499 dnl __(rotldi imm1,imm1,32) 5500 dnl __(bne cr3,2f) /* high word of imm0 is non-zero */ 5501 dnl __(bne cr4,2f) /* sign bit is on in low word of imm0 */ 5502 dnl __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(3))) 5503 dnl __(std imm1,misc_data_offset(arg_z)) 5504 dnl __(stw imm0,misc_data_offset+8(arg_z)) 5505 dnl __(bx lr) 5506 dnl 2: __(mov imm2,#four_digit_bignum_header) 5507 dnl __(rotldi imm0,imm0,32) 5508 dnl __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(4))) 5509 dnl __(std imm1,misc_data_offset(arg_z)) 5510 dnl __(std imm0,misc_data_offset+8(arg_z)) 5511 dnl __(bx lr) 5512 dnl 3: __(mov imm0,imm1) 5513 dnl __(b _SPmakeu64) 5514 dnl __else 5515 dnl __(twgei r0,r0) 5516 dnl __endif 5517 dnl 5518 dnl /* imm0:imm1 constitute a signed integer, almost certainly a bignum. */ 5519 dnl /* Make a lisp integer out of those 128 bits .. */ 5520 dnl _spentry(makes128) 5521 dnl __ifdef(`PPC64') 5522 dnl /* Is imm0 just a sign-extension of imm1 ? */ 5523 dnl __(sradi imm2,imm1,63) 5524 dnl /* Is the high word of imm0 just a sign-extension of the low word ? */ 5525 dnl __(extsw imm3,imm0) 5526 dnl __(cmpd imm2,imm0) 5527 dnl __(cmpd cr1,imm3,imm0) 5528 dnl __(beq 2f) 5529 dnl __(rotldi imm0,imm0,32) 5530 dnl __(rotldi imm1,imm1,32) 5531 dnl __(beq cr1,1f) 5532 dnl __(mov imm2,#four_digit_bignum_header) 5533 dnl __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(4))) 5534 dnl __(std imm1,misc_data_offset(arg_z)) 5535 dnl __(std imm0,misc_data_offset+8(arg_z)) 5536 dnl __(bx lr) 5537 dnl 1: __(mov imm2,#three_digit_bignum_header) 5538 dnl __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(3))) 5539 dnl __(std imm1,misc_data_offset(arg_z)) 5540 dnl __(stw imm3,misc_data_offset+8(arg_z)) 5541 dnl __(bx lr) 5542 dnl 2: __(mov imm0,imm1) 5543 dnl __(b _SPmakes64) 5544 dnl __else 5545 dnl __(twgei r0,r0) 5546 dnl __endif 5547 dnl 5548 dnl /* on entry: arg_z = symbol. On exit, arg_z = value (possibly */ 5549 dnl /* unbound_marker), arg_y = symbol, imm3 = symbol.binding-index */ 5550 dnl _spentry(specref) 5551 dnl __(ldr imm1,[arg_z,#symbol.binding_index]) 5552 dnl __(ldr imm0,[rcontext,#tcr.tlb_limit]) 5553 dnl __(cmp imm1,imm0) 5554 dnl __(ldr temp0,[rcontext,#tcr.tlb_pointer]) 5555 dnl __(mov arg_y,arg_z) 5556 dnl __(movhs imm1,#0) 5557 dnl __(ldr arg_z,[temp0,imm1]) 5558 dnl __(cmp arg_z,#no_thread_local_binding_marker) 5559 dnl __(ldreq arg_z,[arg_y,#symbol.vcell]) 5560 dnl __(bx lr) 5561 dnl 5562 dnl 5563 dnl _spentry(specrefcheck) 5564 dnl __(ldr imm1,[arg_z,#symbol.binding_index]) 5565 dnl __(ldr imm0,[rcontext,#tcr.tlb_limit]) 5566 dnl __(cmp imm1,imm0) 5567 dnl __(movhs imm1,#0) 5568 dnl __(ldr imm0,[rcontext,#tcr.tlb_pointer]) 5569 dnl __(mov arg_y,arg_z) 5570 dnl __(ldrx arg_z,[imm0,imm1]) 5571 dnl __(cmp arg_z,#no_thread_local_binding_marker) 5572 dnl __(ldreq arg_z,[arg_y,#symbol.vcell]) 5573 dnl __(cmp arg_z,#unbound_marker) 5574 dnl __(uuo_error_unbound(eq,arg_y) 5575 dnl __(bx lr) 5576 dnl 5577 dnl /* arg_y = special symbol, arg_z = new value. */ 5578 dnl _spentry(specset) 5579 dnl __(ldr imm3,[arg_y,#symbol.binding_index]) 5580 dnl __(ldr imm0,[rcontext,#tcr.tlb_limit]) 5581 dnl __(ldr imm2,[rcontext,#tcr.tlb_pointer]) 5582 dnl __(cmpr(imm3,imm0)) 5583 dnl __(bge 1f) 5584 dnl __(ldrx(temp1,imm2,imm3)) 5585 dnl __(cmpri(temp1,no_thread_local_binding_marker)) 5586 dnl __(beq 1f) 5587 dnl __(str arg_z,imm2,imm3) 5588 dnl __(bx lr) 5589 dnl 1: __(mov arg_x,arg_y) 5590 dnl __(mov arg_y,#symbol.vcell-misc_data_offset) 5591 dnl __(b _SPgvset) 5592 dnl 3072 dnl __(bx lr) 3073 3074 3075 3076 3077 /* arg_z should be of type (UNSIGNED-BYTE 64); */ 3078 /* return high 32 bits in imm1, low 32 bits in imm0 */ 3079 3080 3081 _spentry(getu64) 3082 __(test_fixnum(arg_z)) 3083 __(bne 1f) 3084 __(unbox_fixnum(imm0,arg_z)) 3085 __(movs imm1,imm0,asr #31) 3086 __(bxeq lr) 3087 0: 3088 __(uuo_error_reg_not_xtype(al,arg_z,xtype_u64)) 3089 1: 3090 __(extract_typecode(imm0,arg_z)) 3091 __(cmp imm0,#subtag_bignum) 3092 __(bne 0b) 3093 __(movc16(imm1,two_digit_bignum_header)) 3094 __(getvheader(imm0,arg_z)) 3095 __(cmp imm0,imm1) 3096 __(bne 2f) 3097 __(vrefr(imm0,arg_z,0)) 3098 __(vrefr(imm1,arg_z,1)) 3099 __(cmp imm1,#0) 3100 __(bxge lr) 3101 __(uuo_error_reg_not_xtype(al,arg_z,xtype_u64)) 3102 2: __(movc16(imm1,three_digit_bignum_header)) 3103 __(cmp imm0,imm1) 3104 __(uuo_error_reg_not_xtype(ne,arg_z,xtype_u64)) 3105 __(vrefr(imm2,arg_z,2)) 3106 __(cmp imm2,#0) 3107 __(vrefr(imm1,arg_z,1)) 3108 __(vrefr(imm0,arg_z,0)) 3109 __(bxeq lr) 3110 __(uuo_error_reg_not_xtype(al,arg_z,xtype_u64)) 3111 3112 3113 /* arg_z should be of type (SIGNED-BYTE 64); */ 3114 /* return high 32 bits in imm1, low 32 bits in imm0 */ 3115 3116 _spentry(gets64) 3117 __(test_fixnum(arg_z)) 3118 __(moveq imm0,arg_z,asr #fixnumshift) 3119 __(moveq imm1,imm0,asr #31) 3120 __(bxeq lr) 3121 __(mov imm2,#0) 3122 __(extract_lisptag(imm0,arg_z)) 3123 __(cmp imm0,#tag_misc) 3124 __(ldreq imm2,[arg_z,#misc_header_offset]) 3125 __(movc16(imm1,two_digit_bignum_header)) 3126 __(cmp imm1,imm2) 3127 __(uuo_error_reg_not_xtype(ne,arg_z,xtype_s64)) 3128 __(vrefr(imm1,arg_z,1)) 3129 __(vrefr(imm0,arg_z,0)) 3130 __(bx lr) 3131 3132 3133 /* on entry: arg_z = symbol. On exit, arg_z = value (possibly */ 3134 /* unbound_marker), arg_y = symbol, imm1 = symbol.binding-index */ 3135 _spentry(specref) 3136 __(ldr imm1,[arg_z,#symbol.binding_index]) 3137 __(ldr imm0,[rcontext,#tcr.tlb_limit]) 3138 __(cmp imm1,imm0) 3139 __(ldr temp0,[rcontext,#tcr.tlb_pointer]) 3140 __(mov arg_y,arg_z) 3141 __(movhs imm1,#0) 3142 __(ldr arg_z,[temp0,imm1]) 3143 __(cmp arg_z,#no_thread_local_binding_marker) 3144 __(ldreq arg_z,[arg_y,#symbol.vcell]) 3145 __(bx lr) 3146 3147 _spentry(specrefcheck) 3148 __(ldr imm1,[arg_z,#symbol.binding_index]) 3149 __(ldr imm0,[rcontext,#tcr.tlb_limit]) 3150 __(cmp imm1,imm0) 3151 __(movhs imm1,#0) 3152 __(ldr imm0,[rcontext,#tcr.tlb_pointer]) 3153 __(mov arg_y,arg_z) 3154 __(ldr arg_z,[imm0,imm1]) 3155 __(cmp arg_z,#no_thread_local_binding_marker) 3156 __(ldreq arg_z,[arg_y,#symbol.vcell]) 3157 __(cmp arg_z,#unbound_marker) 3158 __(uuo_error_unbound(eq,arg_y)) 3159 __(bx lr) 3160 3161 /* arg_y = special symbol, arg_z = new value. */ 3162 _spentry(specset) 3163 __(ldr imm1,[arg_y,#symbol.binding_index]) 3164 __(ldr imm0,[rcontext,#tcr.tlb_limit]) 3165 __(ldr imm2,[rcontext,#tcr.tlb_pointer]) 3166 __(cmp imm1,imm0) 3167 __(movge imm1,#0) 3168 __(ldr temp1,[imm2,imm1]) 3169 __(cmp temp1,#no_thread_local_binding_marker) 3170 __(strne arg_z,[imm2,imm1]) 3171 __(bxne lr) 3172 __(mov arg_x,arg_y) 3173 __(mov arg_y,#symbol.vcell-misc_data_offset) 3174 __(b _SPgvset) 3175 5593 3176 dnl /* Restore current thread's interrupt level to arg_z, */ 5594 3177 dnl /* noting whether the tcr's interrupt_pending flag was set. */ 5595 3178 dnl _spentry(restoreintlevel) 5596 dnl __(cmpri(cr1,arg_z,0))5597 dnl __(ldr imm0,[rcontext,#tcr.interrupt_pending])5598 dnl __(cmpri(cr0,imm0,0))5599 dnl __(bne cr1,1f)5600 dnl __(beq cr0,1f)5601 dnl __(str(rzero,tcr.interrupt_pending(rcontext)))5602 dnl __(mov nargs,#fixnum_one)5603 dnl __(trgti(nargs,0))5604 dnl __(bx lr)3179 dnl __(cmpri(cr1,arg_z,0)) 3180 dnl __(ldr imm0,[rcontext,#tcr.interrupt_pending]) 3181 dnl __(cmpri(cr0,imm0,0)) 3182 dnl __(bne cr1,1f) 3183 dnl __(beq cr0,1f) 3184 dnl __(str(rzero,tcr.interrupt_pending(rcontext))) 3185 dnl __(mov nargs,#fixnum_one) 3186 dnl __(trgti(nargs,0)) 3187 dnl __(bx lr) 5605 3188 dnl 1: 5606 3189 dnl __(ldr nargs,[rcontext,#tcr.tlb_pointer]) 5607 dnl __(str(arg_z,INTERRUPT_LEVEL_BINDING_INDEX(nargs)))5608 dnl __(bx lr)5609 dnl 5610 dnl 3190 dnl __(str(arg_z,INTERRUPT_LEVEL_BINDING_INDEX(nargs))) 3191 dnl __(bx lr) 3192 3193 5611 3194 dnl /* Construct a lisp integer out of the 32-bit signed value in imm0 */ 5612 dnl5613 dnl5614 dnl5615 dnl5616 dnl5617 dnl /* */5618 3195 dnl /* arg_z should be of type (SIGNED-BYTE 32); return unboxed result in imm0 */ 5619 dnl /* */ 5620 dnl _spentry(gets32) 5621 dnl __ifdef(`PPC64') 5622 dnl __(sldi imm1,arg_z,32-fixnumshift) 5623 dnl __(extract_lisptag_(imm0,arg_z)) 5624 dnl __(sradi imm1,imm1,32-fixnumshift) 5625 dnl __(box_fixnum(imm0,arg_z)) 5626 dnl __(cmpd cr1,imm1,arg_z) 5627 dnl __(bne cr0,9f) 5628 dnl __(beqlr cr1) 5629 dnl __(b 9f) 5630 dnl __else 5631 dnl __(extract_typecode(imm1,arg_z)) 5632 dnl __(cmpri(cr0,imm1,tag_fixnum)) 5633 dnl __(cmpri(cr2,imm1,subtag_bignum)) 5634 dnl __(unbox_fixnum(imm0,arg_z)) 5635 dnl __(beqlr+ cr0) 5636 dnl __(bne cr2,9f) 5637 dnl __(getvheader(imm1,arg_z)) 5638 dnl __(cmpri(cr1,imm1,one_digit_bignum_header)) 5639 dnl __(vrefr(imm0,arg_z,0)) 5640 dnl __(beqlr+ cr1) 5641 dnl __endif 5642 dnl 9: 5643 dnl __(uuo_interr(error_object_not_signed_byte_32,arg_z)) 5644 dnl 5645 dnl /* */ 5646 dnl /* arg_z should be of type (UNSIGNED-BYTE 32); return unboxed result in imm0 */ 5647 dnl /* */ 5648 dnl 5649 dnl _spentry(getu32) 5650 dnl __(extract_typecode(imm1,arg_z)) 5651 dnl __(cmpri(cr0,imm1,tag_fixnum)) 5652 dnl __(cmpri(cr1,arg_z,0)) 5653 dnl __(cmpri(cr2,imm1,subtag_bignum)) 5654 dnl __(unbox_fixnum(imm0,arg_z)) 5655 dnl __(bne cr0,8f) 5656 dnl __(bgelr cr1) 5657 dnl 8: 5658 dnl __(bne- cr2,9f) 5659 dnl __(getvheader(imm2,arg_z)) 5660 dnl __(cmpri(cr2,imm2,two_digit_bignum_header)) 5661 dnl __(vrefr(imm0,arg_z,0)) 5662 dnl __(cmpri(cr0,imm0,0)) 5663 dnl __(bgt cr2,9f) 5664 dnl __(beq cr2,2f) 5665 dnl __(blt cr0,9f) 5666 dnl __(bx lr) 5667 dnl 2: 5668 dnl __(vrefr(imm1,arg_z,1)) 5669 dnl __(cmpri(cr0,imm1,0)) 5670 dnl __(beqlr+ cr0) 5671 dnl 5672 dnl 9: 5673 dnl __(uuo_interr(error_object_not_unsigned_byte_32,arg_z)) 5674 dnl 5675 dnl 5676 dnl 5677 dnl 5678 dnl /* */ 5679 dnl /* As per mvpass above, but in this case fname is known to be a */ 5680 dnl /* symbol. */ 5681 dnl 5682 dnl _spentry(mvpasssym) 5683 dnl __(cmpri(cr0,nargs,node_size*nargregs)) 5684 dnl __(mflr loc_pc) 5685 dnl __(mov imm0,vsp) 5686 dnl __(ble+ cr0,1f) 5687 dnl __(subi imm0,imm0,node_size*nargregs) 5688 dnl __(add imm0,imm0,nargs) 5689 dnl 1: 5690 dnl __(build_lisp_frame(fn,loc_pc,imm0)) 5691 dnl __(ref_global(loc_pc,ret1val_addr)) 5692 dnl __(mov fn,#0) 5693 dnl __(mtlr loc_pc) 5694 dnl __(jump_fname()) 5695 dnl 5696 dnl 5697 dnl 3196 3197 _spentry(gets32) 3198 __(test_fixnum(arg_z)) 3199 __(moveq imm0,arg_z,asr #fixnumshift) 3200 __(bxeq lr) 3201 __(extract_lisptag(imm0,arg_z)) 3202 __(cmp imm0,#tag_misc) 3203 __(uuo_error_reg_not_xtype(ne,arg_z,xtype_s32)) 3204 __(getvheader(imm0,arg_z)) 3205 __(movc16(imm1,one_digit_bignum_header)) 3206 __(cmp imm0,imm1) 3207 __(uuo_error_reg_not_xtype(ne,arg_z,xtype_s32)) 3208 __(vrefr(imm0,arg_z,0)) 3209 __(bx lr) 3210 3211 3212 /* */ 3213 /* arg_z should be of type (UNSIGNED-BYTE 32); return unboxed result in imm0 */ 3214 /* */ 3215 3216 _spentry(getu32) 3217 __(test_fixnum(arg_z)) 3218 __(moveq imm0,arg_z,asr #fixnumshift) 3219 __(movseq imm1,imm0,asr #31) 3220 __(bxeq lr) 3221 __(movc16(imm1,one_digit_bignum_header)) 3222 __(extract_lisptag(imm0,arg_z)) 3223 __(cmp imm0,#tag_misc) 3224 __(uuo_error_reg_not_xtype(ne,arg_z,xtype_u32)) 3225 __(getvheader(imm0,arg_z)) 3226 __(cmp imm0,imm1) 3227 __(ldreq imm0,[arg_z,#misc_data_offset]) 3228 __(beq 7f) 3229 __(movc16(imm1,two_digit_bignum_header)) 3230 __(cmp imm0,imm1) 3231 __(ldreq imm0,[arg_z,#misc_data_offset]) 3232 __(ldreq imm1,[arg_z,#misc_data_offset+4]) 3233 __(cmpeq imm1,#0) 3234 __(bxeq lr) 3235 __(uuo_error_reg_not_xtype(ne,arg_z,xtype_u32)) 3236 7: 3237 __(movs imm1,imm0,asr #31) 3238 __(bxeq lr) 3239 __(uuo_error_reg_not_xtype(ne,arg_z,xtype_u32)) 3240 3241 3242 /* */ 3243 /* As per mvpass above, but in this case fname is known to be a */ 3244 /* symbol. */ 3245 3246 _spentry(mvpasssym) 3247 __(cmp nargs,#node_size*nargregs) 3248 __(mov nfn,vsp) 3249 __(subgt nfn,nfn,#node_size*nargregs) 3250 __(addgt nfn,nfn,nargs) 3251 __(build_lisp_frame(imm0,nfn)) 3252 __(ref_global(lr,ret1val_addr,imm0)) 3253 __(mov fn,#0) 3254 __(jump_fname()) 3255 5698 3256 dnl _spentry(unbind) 5699 3257 dnl __(ldr imm1,[rcontext,#tcr.db_link]) … … 5733 3291 dnl __(str(imm1,tcr.db_link(rcontext))) 5734 3292 dnl __(bx lr) 5735 dnl 3293 dnl 5736 3294 dnl 5737 3295 dnl … … 5747 3305 dnl 5748 3306 dnl _spentry(progvrestore) 5749 dnl __(ldr imm0,[tsp,#tsp_frame.backlink]) /* ignore .SPnthrowXXX values frame */ 5750 dnl __(ldr imm0,[imm0,#tsp_frame.data_offset]) 5751 dnl __(cmpri(cr0,imm0,0)) 5752 dnl __(unbox_fixnum(imm0,imm0)) 5753 dnl __(bne+ cr0,_SPunbind_n) 5754 dnl __(bx lr) 5755 dnl 5756 dnl /* Bind CCL::*INTERRUPT-LEVEL* to 0. If its value had been negative, check */ 5757 dnl /* for pending interrupts after doing so. "nargs" can be freely used for an */ 5758 dnl /* interrupt trap in this context. */ 5759 dnl _spentry(bind_interrupt_level_0) 5760 dnl __(ldr imm4,[rcontext,#tcr.tlb_pointer]) 5761 dnl __(ldr temp0,[imm4,#INTERRUPT_LEVEL_BINDING_INDEX]) 5762 dnl __(ldr imm1,[rcontext,#tcr.db_link]) 5763 dnl __(cmpri(temp0,0)) 5764 dnl __(mov imm3,#INTERRUPT_LEVEL_BINDING_INDEX) 5765 dnl __(vpush1(temp0)) 5766 dnl __(vpush1(imm3)) 5767 dnl __(vpush1(imm1)) 5768 dnl __(str(rzero,INTERRUPT_LEVEL_BINDING_INDEX(imm4))) 5769 dnl __(str(vsp,tcr.db_link(rcontext))) 5770 dnl __(beqlr) 5771 dnl __(mov nargs,temp0) 5772 dnl __(bgt 1f) 5773 dnl __(ldr nargs,[rcontext,#tcr.interrupt_pending]) 5774 dnl 1: __(trgti(nargs,0)) 5775 dnl __(bx lr) 5776 dnl 5777 dnl /* Bind CCL::*INTERRUPT-LEVEL* to the fixnum -1. (This has the effect */ 5778 dnl /* of disabling interrupts.) */ 5779 dnl _spentry(bind_interrupt_level_m1) 5780 dnl __(mov imm2,#-fixnumone) 5781 dnl __(mov imm3,#INTERRUPT_LEVEL_BINDING_INDEX) 5782 dnl __(ldr imm4,[rcontext,#tcr.tlb_pointer]) 5783 dnl __(ldr temp0,[imm4,#INTERRUPT_LEVEL_BINDING_INDEX]) 5784 dnl __(ldr imm1,[rcontext,#tcr.db_link]) 5785 dnl __(vpush1(temp0)) 5786 dnl __(vpush1(imm3)) 5787 dnl __(vpush1(imm1)) 5788 dnl __(str(imm2,INTERRUPT_LEVEL_BINDING_INDEX(imm4))) 5789 dnl __(str(vsp,tcr.db_link(rcontext))) 5790 dnl __(bx lr) 5791 dnl 5792 dnl 5793 dnl /* Bind CCL::*INTERRUPT-LEVEL* to the value in arg_z. If that value's 0, */ 5794 dnl /* do what _SPbind_interrupt_level_0 does */ 5795 dnl _spentry(bind_interrupt_level) 5796 dnl __(cmpri(arg_z,0)) 5797 dnl __(mov imm3,#INTERRUPT_LEVEL_BINDING_INDEX) 5798 dnl __(ldr imm4,[rcontext,#tcr.tlb_pointer]) 5799 dnl __(ldr temp0,[imm4,#INTERRUPT_LEVEL_BINDING_INDEX]) 5800 dnl __(ldr imm1,[rcontext,#tcr.db_link]) 5801 dnl __(beq _SPbind_interrupt_level_0) 5802 dnl __(vpush1(temp0)) 5803 dnl __(vpush1(imm3)) 5804 dnl __(vpush1(imm1)) 5805 dnl __(str(arg_z,INTERRUPT_LEVEL_BINDING_INDEX(imm4))) 5806 dnl __(str(vsp,tcr.db_link(rcontext))) 5807 dnl __(bx lr) 5808 dnl 5809 dnl /* Unbind CCL::*INTERRUPT-LEVEL*. If the value changes from negative to */ 5810 dnl /* non-negative, check for pending interrupts. This is often called in */ 5811 dnl /* a context where nargs is significant, so save and restore nargs around */ 5812 dnl /* any interrupt polling */ 5813 dnl 5814 dnl _spentry(unbind_interrupt_level) 5815 dnl __(ldr imm0,[rcontext,#tcr.flags]) 5816 dnl __(ldr imm2,[rcontext,#tcr.tlb_pointer]) 5817 dnl __(andi. imm0,imm0,1<<TCR_FLAG_BIT_PENDING_SUSPEND) 5818 dnl __(ldr imm1,[rcontext,#tcr.db_link]) 5819 dnl __(ldr temp1,[imm2,#INTERRUPT_LEVEL_BINDING_INDEX]) 5820 dnl __(bne 5f) 5821 dnl 0: __(cmpri(cr1,temp1,0)) 5822 dnl __(ldr temp1,[imm1,#binding.val]) 5823 dnl __(ldr imm1,[imm1,#binding.link]) 5824 dnl __(cmpri(cr0,temp1,0)) 5825 dnl __(str(temp1,INTERRUPT_LEVEL_BINDING_INDEX(imm2))) 5826 dnl __(str(imm1,tcr.db_link(rcontext))) 5827 dnl __(bgelr cr1) 5828 dnl __(bltlr cr0) 5829 dnl __(mov imm2,nargs) 5830 dnl __(check_pending_interrupt(`cr1')) 5831 dnl __(mov nargs,imm2) 5832 dnl __(bx lr) 5833 dnl 5: /* Missed a suspend request; force suspend now if we're restoring 5834 dnl interrupt level to -1 or greater */ 5835 dnl __(cmpri(temp1,-2<<fixnumshift)) 5836 dnl __(bne 0b) 5837 dnl __(ldr imm0,[imm1,#binding.val]) 5838 dnl __(cmpr(imm0,temp1)) 5839 dnl __(beq 0b) 5840 dnl __(mov imm0,#1<<fixnumshift) 5841 dnl __(str(imm0,INTERRUPT_LEVEL_BINDING_INDEX(imm2))) 5842 dnl __(suspend_now()) 5843 dnl __(b 0b) 5844 dnl 5845 dnl 5846 dnl /* arg_x = array, arg_y = i, arg_z = j. Typecheck everything. 5847 dnl We don't know whether the array is alleged to be simple or 5848 dnl not, and don't know anythng about the element type. */ 5849 dnl _spentry(aref2) 5850 dnl __(extract_typecode(imm2,arg_x)) 5851 dnl __(trap_unless_lisptag_equal(arg_y,tag_fixnum,imm0)) 5852 dnl __(cmpri(cr2,imm2,subtag_arrayH)) 5853 dnl __(trap_unless_lisptag_equal(arg_z,tag_fixnum,imm0)) 5854 dnl __(bne cr2,1f) 5855 dnl __(ldr imm1,[arg_x,#arrayH.rank]) 5856 dnl __(cmpri(imm1,2<<fixnumshift)) 5857 dnl __(bne 1f) 5858 dnl /* It's a 2-dimensional array. Check bounds */ 5859 dnl __(ldr imm0,[arg_x,#arrayH.dim0]) 5860 dnl __(trlge(arg_y,imm0)) 5861 dnl __(ldr imm0,[arg_x,#arrayH.dim0+node_size]) 5862 dnl __(trlge(arg_z,imm0)) 5863 dnl __(unbox_fixnum(imm0,imm0)) 5864 dnl __(mullr(arg_y,arg_y,imm0)) 5865 dnl __(add arg_z,arg_z,arg_y) 5866 dnl /* arg_z is now row-major-index; get data vector and 5867 dnl add in possible offset */ 5868 dnl __(mov arg_y,arg_x) 5869 dnl 0: __(ldr imm0,[arg_y,#arrayH.displacement]) 5870 dnl __(ldr arg_y,[arg_y,#arrayH.data_vector]) 5871 dnl __(extract_subtag(imm1,arg_y)) 5872 dnl __(cmpri(imm1,subtag_vectorH)) 5873 dnl __(add arg_z,arg_z,imm0) 5874 dnl __(bgt local_label(misc_ref_common)) 5875 dnl __(b 0b) 5876 dnl 1: 5877 dnl __(uuo_interr(error_object_not_array_2d,arg_x)) 5878 dnl 5879 dnl /* temp0 = array, arg_x = i, arg_y = j, arg_z = k */ 5880 dnl _spentry(aref3) 5881 dnl __(extract_typecode(imm2,temp0)) 5882 dnl __(trap_unless_lisptag_equal(arg_x,tag_fixnum,imm0)) 5883 dnl __(cmpri(cr2,imm2,subtag_arrayH)) 5884 dnl __(trap_unless_lisptag_equal(arg_y,tag_fixnum,imm0)) 5885 dnl __(bne cr2,1f) 5886 dnl __(ldr imm1,[temp0,#arrayH.rank]) 5887 dnl __(trap_unless_lisptag_equal(arg_z,tag_fixnum,imm0)) 5888 dnl __(cmpri(imm1,3<<fixnumshift)) 5889 dnl __(bne 1f) 5890 dnl /* It's a 3-dimensional array. Check bounds */ 5891 dnl __(ldr imm2,arrayH.dim0+(node_size*2)(temp0))) 5892 dnl __(ldr imm1,[temp0,#arrayH.dim0+node_size]) 5893 dnl __(ldr imm0,[temp0,#arrayH.dim0]) 5894 dnl __(trlge(arg_z,imm2)) 5895 dnl __(unbox_fixnum(imm2,imm2)) 5896 dnl __(trlge(arg_y,imm1)) 5897 dnl __(unbox_fixnum(imm1,imm1)) 5898 dnl __(trlge(arg_x,imm0)) 5899 dnl __(mullr(arg_y,arg_y,imm2)) 5900 dnl __(mullr(imm1,imm2,imm1)) 5901 dnl __(mullr(arg_x,imm1,arg_x)) 5902 dnl __(add arg_z,arg_z,arg_y) 5903 dnl __(add arg_z,arg_z,arg_x) 5904 dnl __(mov arg_y,temp0) 5905 dnl 0: __(ldr arg_x,[arg_y,#arrayH.displacement]) 5906 dnl __(ldr arg_y,[arg_y,#arrayH.data_vector]) 5907 dnl __(extract_subtag(imm1,arg_y)) 5908 dnl __(cmpri(imm1,subtag_vectorH)) 5909 dnl __(add arg_z,arg_x,arg_z) 5910 dnl __(bgt local_label(misc_ref_common)) 5911 dnl __(b 0b) 5912 dnl 1: 5913 dnl __(uuo_interr(error_object_not_array_3d,temp0)) 5914 dnl 5915 dnl 5916 dnl 5917 dnl 3307 dnl __(ldr imm0,[tsp,#tsp_frame.backlink]) /* ignore .SPnthrowXXX values frame */ 3308 dnl __(ldr imm0,[imm0,#tsp_frame.data_offset]) 3309 dnl __(cmpri(cr0,imm0,0)) 3310 dnl __(unbox_fixnum(imm0,imm0)) 3311 dnl __(bne+ cr0,_SPunbind_n) 3312 dnl __(bx lr) 3313 dnl 3314 /* Bind CCL::*INTERRUPT-LEVEL* to 0. If its value had been negative, check */ 3315 /* for pending interrupts after doing so. */ 3316 _spentry(bind_interrupt_level_0) 3317 __(ldr temp1,[rcontext,#tcr.tlb_pointer]) 3318 __(ldr temp0,[temp1,#INTERRUPT_LEVEL_BINDING_INDEX]) 3319 __(ldr imm0,[rcontext,#tcr.db_link]) 3320 __(cmp temp0,#0) 3321 __(mov imm1,#INTERRUPT_LEVEL_BINDING_INDEX) 3322 __(vpush1(temp0)) 3323 __(vpush1(imm1)) 3324 __(vpush1(imm0)) 3325 __(mov imm0,#0) 3326 __(str imm0,[temp1,#INTERRUPT_LEVEL_BINDING_INDEX]) 3327 __(str vsp,[rcontext,#tcr.db_link]) 3328 __(bxeq lr) 3329 __(ldrlt temp0,[rcontext,#tcr.interrupt_pending]) 3330 __(cmp temp0,#0) 3331 __(uuo_interrupt_now(gt)) 3332 __(bx lr) 3333 3334 /* Bind CCL::*INTERRUPT-LEVEL* to the fixnum -1. (This has the effect */ 3335 /* of disabling interrupts.) */ 3336 _spentry(bind_interrupt_level_m1) 3337 __(mov imm2,#-fixnumone) 3338 __(mov imm1,#INTERRUPT_LEVEL_BINDING_INDEX) 3339 __(ldr temp1,[rcontext,#tcr.tlb_pointer]) 3340 __(ldr temp0,[temp1,#INTERRUPT_LEVEL_BINDING_INDEX]) 3341 __(ldr imm0,[rcontext,#tcr.db_link]) 3342 __(vpush1(temp0)) 3343 __(vpush1(imm1)) 3344 __(vpush1(imm0)) 3345 __(str imm2,[temp1,#INTERRUPT_LEVEL_BINDING_INDEX]) 3346 __(str vsp,[rcontext,tcr.db_link]) 3347 __(bx lr) 3348 3349 3350 /* Bind CCL::*INTERRUPT-LEVEL* to the value in arg_z. If that value's 0, */ 3351 /* do what _SPbind_interrupt_level_0 does */ 3352 _spentry(bind_interrupt_level) 3353 __(cmp arg_z,#0) 3354 __(mov imm1,#INTERRUPT_LEVEL_BINDING_INDEX) 3355 __(ldr temp1,[rcontext,#tcr.tlb_pointer]) 3356 __(ldr temp0,[temp1,#INTERRUPT_LEVEL_BINDING_INDEX]) 3357 __(ldr imm0,[rcontext,#tcr.db_link]) 3358 __(beq _SPbind_interrupt_level_0) 3359 __(vpush1(temp0)) 3360 __(vpush1(imm1)) 3361 __(vpush1(imm0)) 3362 __(str arg_z,[temp1,INTERRUPT_LEVEL_BINDING_INDEX]) 3363 __(str vsp,[rcontext,#tcr.db_link]) 3364 __(bx lr) 3365 3366 /* Unbind CCL::*INTERRUPT-LEVEL*. If the value changes from negative to */ 3367 /* non-negative, check for pending interrupts. This is often called in */ 3368 /* a context where nargs is significant, so save and restore nargs around */ 3369 /* any interrupt polling */ 3370 3371 _spentry(unbind_interrupt_level) 3372 __(ldr imm0,[rcontext,#tcr.flags]) 3373 __(ldr temp2,[rcontext,#tcr.tlb_pointer]) 3374 __(tst imm0,#1<<TCR_FLAG_BIT_PENDING_SUSPEND) 3375 __(ldr imm0,[rcontext,#tcr.db_link]) 3376 __(ldr temp0,[temp2,#INTERRUPT_LEVEL_BINDING_INDEX]) 3377 __(bne 5f) 3378 0: 3379 __(ldr temp1,[imm0,#binding.val]) 3380 __(ldr imm0,[imm0,#binding.link]) 3381 __(str temp1,[temp2,#INTERRUPT_LEVEL_BINDING_INDEX]) 3382 __(str imm0,[rcontext,#tcr.db_link]) 3383 __(cmp temp0,#0) 3384 __(bxge lr) 3385 __(cmp temp1,#0) 3386 __(bxlt lr) 3387 __(check_enabled_pending_interrupt(imm0)) 3388 __(bx lr) 3389 5: /* Missed a suspend request; force suspend now if we're restoring 3390 interrupt level to -1 or greater */ 3391 __(cmp temp0,#-2<<fixnumshift) 3392 __(bne 0b) 3393 __(ldr imm0,[imm1,#binding.val]) 3394 __(cmp imm0,temp0) 3395 __(beq 0b) 3396 __(mov imm0,#1<<fixnumshift) 3397 __(str imm0,[temp2,INTERRUPT_LEVEL_BINDING_INDEX]) 3398 __(suspend_now()) 3399 __(b 0b) 3400 3401 3402 /* arg_x = array, arg_y = i, arg_z = j. Typecheck everything. 3403 We don't know whether the array is alleged to be simple or 3404 not, and don't know anythng about the element type. */ 3405 _spentry(aref2) 3406 __(trap_unless_fixnum(arg_y)) 3407 __(trap_unless_fixnum(arg_z)) 3408 __(extract_typecode(imm2,arg_x)) 3409 __(cmp imm2,#subtag_arrayH) 3410 __(ldreq imm1,[arg_x,#arrayH.rank]) 3411 __(cmpeq imm1,#2<<fixnumshift) 3412 __(uuo_error_reg_not_xtype(ne,arg_x,xtype_array2d)) 3413 /* It's a 2-dimensional array. Check bounds */ 3414 __(ldr imm0,[arg_x,#arrayH.dim0]) 3415 __(cmp arg_y,imm0) 3416 __(uuo_error_array_bounds(hs,arg_y,arg_x)) 3417 __(ldr imm0,[arg_x,#arrayH.dim0+node_size]) 3418 __(cmp arg_z,imm0) 3419 __(uuo_error_array_bounds(hs,arg_z,arg_x)) 3420 __(unbox_fixnum(imm0,imm0)) 3421 __(mul temp0,arg_y,imm0) /* no MLA on ARMv5 */ 3422 __(add arg_z,arg_z,temp0) 3423 /* arg_z is now row-major-index; get data vector and 3424 add in possible offset */ 3425 __(mov arg_y,arg_x) 3426 0: __(ldr imm0,[arg_y,#arrayH.displacement]) 3427 __(ldr arg_y,[arg_y,#arrayH.data_vector]) 3428 __(extract_subtag(imm1,arg_y)) 3429 __(cmp imm1,#subtag_vectorH) 3430 __(add arg_z,arg_z,imm0) 3431 __(bgt C(misc_ref_common)) 3432 __(b 0b) 3433 3434 /* temp0 = array, arg_x = i, arg_y = j, arg_z = k */ 3435 _spentry(aref3) 3436 __(trap_unless_fixnum(arg_x)) 3437 __(trap_unless_fixnum(arg_y)) 3438 __(trap_unless_fixnum(arg_z)) 3439 __(extract_typecode(imm2,temp0)) 3440 __(mov imm1,#0) 3441 __(cmp imm2,#subtag_arrayH) 3442 __(ldreq imm1,[temp0,#arrayH.rank]) 3443 __(cmp imm1,#3<<fixnumshift) 3444 __(uuo_error_reg_not_xtype(ne,temp0,xtype_array3d)) 3445 /* It's a 3-dimensional array. Check bounds */ 3446 __(ldr imm2,[temp0,arrayH.dim0+(node_size*2)]) 3447 __(ldr imm1,[temp0,#arrayH.dim0+node_size]) 3448 __(ldr imm0,[temp0,#arrayH.dim0]) 3449 __(cmp arg_z,imm2) 3450 __(uuo_error_array_bounds(hs,arg_z,temp0)) 3451 __(cmp arg_y,imm1) 3452 __(uuo_error_array_bounds(hs,arg_y,temp0)) 3453 __(cmp arg_x,imm0) 3454 __(uuo_error_array_bounds(hs,arg_x,temp0)) 3455 __(unbox_fixnum(imm2,imm2)) 3456 __(unbox_fixnum(imm1,imm1)) 3457 __(mul arg_y,imm2,arg_y) 3458 __(mul imm1,imm2,imm1) 3459 __(mul arg_x,imm1,arg_x) 3460 __(add arg_z,arg_z,arg_y) 3461 __(add arg_z,arg_z,arg_x) 3462 __(mov arg_y,temp0) 3463 0: __(ldr arg_x,[arg_y,#arrayH.displacement]) 3464 __(ldr arg_y,[arg_y,#arrayH.data_vector]) 3465 __(extract_subtag(imm1,arg_y)) 3466 __(cmp imm1,#subtag_vectorH) 3467 __(add arg_z,arg_x,arg_z) 3468 __(bgt C(misc_ref_common)) 3469 __(b 0b) 3470 3471 3472 3473 5918 3474 dnl /* As for aref2 above, but temp = array, arg_x = i, arg_y = j, arg_z = newval */ 5919 3475 dnl _spentry(aset2) … … 5942 3498 dnl __(cmpri(imm1,subtag_vectorH)) 5943 3499 dnl __(add arg_y,arg_y,imm0) 5944 dnl __(bgt local_label(misc_set_common))3500 dnl __(bgt C(misc_set_common)) 5945 3501 dnl __(b 0b) 5946 3502 dnl 1: … … 5978 3534 dnl __(cmpri(imm1,subtag_vectorH)) 5979 3535 dnl __(add arg_y,arg_y,temp0) 5980 dnl __(bgt local_label(misc_set_common))3536 dnl __(bgt C(misc_set_common)) 5981 3537 dnl __(b 0b) 5982 3538 dnl 1: … … 5986 3542 dnl 5987 3543 dnl 5988 dnl _spentry(nmkunwind) 5989 dnl __(mov imm2,#-fixnumone) 5990 dnl __(mov imm3,#INTERRUPT_LEVEL_BINDING_INDEX) 5991 dnl __(ldr imm4,[rcontext,#tcr.tlb_pointer]) 5992 dnl __(ldr arg_y,[imm4,#INTERRUPT_LEVEL_BINDING_INDEX]) 5993 dnl __(ldr imm1,[rcontext,#tcr.db_link]) 5994 dnl __(vpush1(arg_y)) 5995 dnl __(vpush1(imm3)) 5996 dnl __(vpush1(imm1)) 5997 dnl __(str(imm2,INTERRUPT_LEVEL_BINDING_INDEX(imm4))) 5998 dnl __(str(vsp,tcr.db_link(rcontext))) 5999 dnl __(mov arg_z,#unbound_marker) 6000 dnl __(mov imm2,#fixnum_one) 6001 dnl __(mkcatch()) 6002 dnl __(mov arg_z,arg_y) 6003 dnl __(b _SPbind_interrupt_level) 6004 dnl 6005 dnl 6006 dnl 6007 dnl /* EOF, basically */ 6008 dnl .globl _SPsp_end 6009 dnl b _SPsp_end 6010 dnl 6011 local_label(misc_ref_common): 6012 __(adr imm0,(local_label(misc_ref_jmp))) 6013 __(ldr pc,[imm0,imm1,lsl #2]) 6014 6015 local_label(misc_ref_jmp): 6016 /* 00-0f */ 6017 .long local_label(misc_ref_invalid) /* 00 even_fixnum */ 6018 6019 .long local_label(misc_ref_invalid) /* 01 cons */ 6020 .long local_label(misc_ref_invalid) /* 02 nodeheader */ 6021 .long local_label(misc_ref_invalid) /* 03 imm */ 6022 .long local_label(misc_ref_invalid) /* 04 odd_fixnum */ 6023 .long local_label(misc_ref_invalid) /* 05 nil */ 6024 .long local_label(misc_ref_invalid) /* 06 misc */ 6025 .long local_label(misc_ref_u32) /* 07 bignum */ 6026 .long local_label(misc_ref_invalid) /* 08 even_fixnum */ 6027 .long local_label(misc_ref_invalid) /* 09 cons */ 6028 .long local_label(misc_ref_node) /* 0a ratio */ 6029 .long local_label(misc_ref_invalid) /* 0b imm */ 6030 .long local_label(misc_ref_invalid) /* 0c odd_fixnum */ 6031 .long local_label(misc_ref_invalid) /* 0d nil */ 6032 .long local_label(misc_ref_invalid) /* 0e misc */ 6033 .long local_label(misc_ref_u32) /* 0f single_float */ 6034 /* 10-1f */ 6035 .long local_label(misc_ref_invalid) /* 10 even_fixnum */ 6036 .long local_label(misc_ref_invalid) /* 11 cons */ 6037 .long local_label(misc_ref_invalid) /* 12 nodeheader */ 6038 .long local_label(misc_ref_invalid) /* 13 imm */ 6039 .long local_label(misc_ref_invalid) /* 14 odd_fixnum */ 6040 .long local_label(misc_ref_invalid) /* 15 nil */ 6041 .long local_label(misc_ref_invalid) /* 16 misc */ 6042 .long local_label(misc_ref_u32) /* 17 double_float */ 6043 .long local_label(misc_ref_invalid) /* 18 even_fixnum */ 6044 .long local_label(misc_ref_invalid) /* 19 cons */ 6045 .long local_label(misc_ref_node) /* 1a complex */ 6046 .long local_label(misc_ref_invalid) /* 1b imm */ 6047 .long local_label(misc_ref_invalid) /* 1c odd_fixnum */ 6048 .long local_label(misc_ref_invalid) /* 1d nil */ 6049 .long local_label(misc_ref_invalid) /* 1e misc */ 6050 .long local_label(misc_ref_u32) /* 1f macptr */ 6051 /* 20-2f */ 6052 .long local_label(misc_ref_invalid) /* 20 even_fixnum */ 6053 .long local_label(misc_ref_invalid) /* 21 cons */ 6054 .long local_label(misc_ref_node) /* 22 catch_frame */ 6055 .long local_label(misc_ref_invalid) /* 23 imm */ 6056 .long local_label(misc_ref_invalid) /* 24 odd_fixnum */ 6057 .long local_label(misc_ref_invalid) /* 25 nil */ 6058 .long local_label(misc_ref_invalid) /* 26 misc */ 6059 .long local_label(misc_ref_u32) /* 27 dead_macptr */ 6060 .long local_label(misc_ref_invalid) /* 28 even_fixnum */ 6061 .long local_label(misc_ref_invalid) /* 29 cons */ 6062 .long local_label(misc_ref_node) /* 2a function */ 6063 .long local_label(misc_ref_invalid) /* 2b imm */ 6064 .long local_label(misc_ref_invalid) /* 2c odd_fixnum */ 6065 .long local_label(misc_ref_invalid) /* 2d nil */ 6066 .long local_label(misc_ref_invalid) /* 2e misc */ 6067 .long local_label(misc_ref_u32) /* 2f code_vector */ 6068 /* 30-3f */ 6069 .long local_label(misc_ref_invalid) /* 30 even_fixnum */ 6070 .long local_label(misc_ref_invalid) /* 31 cons */ 6071 .long local_label(misc_ref_node) /* 32 lisp_thread */ 6072 .long local_label(misc_ref_invalid) /* 33 imm */ 6073 .long local_label(misc_ref_invalid) /* 34 odd_fixnum */ 6074 .long local_label(misc_ref_invalid) /* 35 nil */ 6075 .long local_label(misc_ref_invalid) /* 36 misc */ 6076 .long local_label(misc_ref_u32) /* 37 creole */ 6077 .long local_label(misc_ref_invalid) /* 38 even_fixnum */ 6078 .long local_label(misc_ref_invalid) /* 39 cons */ 6079 .long local_label(misc_ref_node) /* 3a symbol */ 6080 .long local_label(misc_ref_invalid) /* 3b imm */ 6081 .long local_label(misc_ref_invalid) /* 3c odd_fixnum */ 6082 .long local_label(misc_ref_invalid) /* 3d nil */ 6083 .long local_label(misc_ref_invalid) /* 3e misc */ 6084 .long local_label(misc_ref_u32) /* 3f xcode_vector */ 6085 /* 40-4f */ 6086 .long local_label(misc_ref_invalid) /* 40 even_fixnum */ 6087 .long local_label(misc_ref_invalid) /* 41 cons */ 6088 .long local_label(misc_ref_node) /* 42 lock */ 6089 .long local_label(misc_ref_invalid) /* 43 imm */ 6090 .long local_label(misc_ref_invalid) /* 44 odd_fixnum */ 6091 .long local_label(misc_ref_invalid) /* 45 nil */ 6092 .long local_label(misc_ref_invalid) /* 46 misc */ 6093 .long local_label(misc_ref_invalid) /* 47 immheader */ 6094 .long local_label(misc_ref_invalid) /* 48 even_fixnum */ 6095 .long local_label(misc_ref_invalid) /* 49 cons */ 6096 .long local_label(misc_ref_node) /* 4a hash_vector */ 6097 .long local_label(misc_ref_invalid) /* 4b imm */ 6098 .long local_label(misc_ref_invalid) /* 4c odd_fixnum */ 6099 .long local_label(misc_ref_invalid) /* 4d nil */ 6100 .long local_label(misc_ref_invalid) /* 4e misc */ 6101 .long local_label(misc_ref_invalid) /* 4f immheader */ 6102 /* 50-5f */ 6103 .long local_label(misc_ref_invalid) /* 50 even_fixnum */ 6104 .long local_label(misc_ref_invalid) /* 51 cons */ 6105 .long local_label(misc_ref_node) /* 52 pool */ 6106 .long local_label(misc_ref_invalid) /* 53 imm */ 6107 .long local_label(misc_ref_invalid) /* 54 odd_fixnum */ 6108 .long local_label(misc_ref_invalid) /* 55 nil */ 6109 .long local_label(misc_ref_invalid) /* 56 misc */ 6110 .long local_label(misc_ref_invalid) /* 57 immheader */ 6111 .long local_label(misc_ref_invalid) /* 58 even_fixnum */ 6112 .long local_label(misc_ref_invalid) /* 59 cons */ 6113 .long local_label(misc_ref_node) /* 5a weak */ 6114 .long local_label(misc_ref_invalid) /* 5b imm */ 6115 .long local_label(misc_ref_invalid) /* 5c odd_fixnum */ 6116 .long local_label(misc_ref_invalid) /* 5d nil */ 6117 .long local_label(misc_ref_invalid) /* 5e misc */ 6118 .long local_label(misc_ref_invalid) /* 5f immheader */ 6119 /* 60-6f */ 6120 .long local_label(misc_ref_invalid) /* 60 even_fixnum */ 6121 .long local_label(misc_ref_invalid) /* 61 cons */ 6122 .long local_label(misc_ref_node) /* 62 package */ 6123 .long local_label(misc_ref_invalid) /* 63 imm */ 6124 .long local_label(misc_ref_invalid) /* 64 odd_fixnum */ 6125 .long local_label(misc_ref_invalid) /* 65 nil */ 6126 .long local_label(misc_ref_invalid) /* 66 misc */ 6127 .long local_label(misc_ref_invalid) /* 67 immheader */ 6128 .long local_label(misc_ref_invalid) /* 68 even_fixnum */ 6129 .long local_label(misc_ref_invalid) /* 69 cons */ 6130 .long local_label(misc_ref_node) /* 6a slot_vector */ 6131 .long local_label(misc_ref_invalid) /* 6b imm */ 6132 .long local_label(misc_ref_invalid) /* 6c odd_fixnum */ 6133 .long local_label(misc_ref_invalid) /* 6d nil */ 6134 .long local_label(misc_ref_invalid) /* 6e misc */ 6135 .long local_label(misc_ref_invalid) /* 6f immheader */ 6136 /* 70-7f */ 6137 .long local_label(misc_ref_invalid) /* 70 even_fixnum */ 6138 .long local_label(misc_ref_invalid) /* 71 cons */ 6139 .long local_label(misc_ref_node) /* 72 instance */ 6140 .long local_label(misc_ref_invalid) /* 73 imm */ 6141 .long local_label(misc_ref_invalid) /* 74 odd_fixnum */ 6142 .long local_label(misc_ref_invalid) /* 75 nil */ 6143 .long local_label(misc_ref_invalid) /* 76 misc */ 6144 .long local_label(misc_ref_invalid) /* 77 immheader */ 6145 .long local_label(misc_ref_invalid) /* 78 even_fixnum */ 6146 .long local_label(misc_ref_invalid) /* 79 cons */ 6147 .long local_label(misc_ref_node) /* 7a struct */ 6148 .long local_label(misc_ref_invalid) /* 7b imm */ 6149 .long local_label(misc_ref_invalid) /* 7c odd_fixnum */ 6150 .long local_label(misc_ref_invalid) /* 7d nil */ 6151 .long local_label(misc_ref_invalid) /* 7e misc */ 6152 .long local_label(misc_ref_invalid) /* 7f immheader */ 6153 /* 80-8f */ 6154 .long local_label(misc_ref_invalid) /* 80 even_fixnum */ 6155 .long local_label(misc_ref_invalid) /* 81 cons */ 6156 .long local_label(misc_ref_node) /* 82 istruct */ 6157 .long local_label(misc_ref_invalid) /* 83 imm */ 6158 .long local_label(misc_ref_invalid) /* 84 odd_fixnum */ 6159 .long local_label(misc_ref_invalid) /* 85 nil */ 6160 .long local_label(misc_ref_invalid) /* 86 misc */ 6161 .long local_label(misc_ref_invalid) /* 87 immheader */ 6162 .long local_label(misc_ref_invalid) /* 88 even_fixnum */ 6163 .long local_label(misc_ref_invalid) /* 89 cons */ 6164 .long local_label(misc_ref_node) /* 8a value_cell */ 6165 .long local_label(misc_ref_invalid) /* 8b imm */ 6166 .long local_label(misc_ref_invalid) /* 8c odd_fixnum */ 6167 .long local_label(misc_ref_invalid) /* 8d nil */ 6168 .long local_label(misc_ref_invalid) /* 8e misc */ 6169 .long local_label(misc_ref_invalid) /* 8f immheader */ 6170 /* 90-9f */ 6171 .long local_label(misc_ref_invalid) /* 90 even_fixnum */ 6172 .long local_label(misc_ref_invalid) /* 91 cons */ 6173 .long local_label(misc_ref_node) /* 92 xfunction */ 6174 .long local_label(misc_ref_invalid) /* 93 imm */ 6175 .long local_label(misc_ref_invalid) /* 94 odd_fixnum */ 6176 .long local_label(misc_ref_invalid) /* 95 nil */ 6177 .long local_label(misc_ref_invalid) /* 96 misc */ 6178 .long local_label(misc_ref_invalid) /* 97 immheader */ 6179 .long local_label(misc_ref_invalid) /* 98 even_fixnum */ 6180 .long local_label(misc_ref_invalid) /* 99 cons */ 6181 .long local_label(misc_ref_node) /* 9a arrayN */ 6182 .long local_label(misc_ref_invalid) /* 9b imm */ 6183 .long local_label(misc_ref_invalid) /* 9c odd_fixnum */ 6184 .long local_label(misc_ref_invalid) /* 9d nil */ 6185 .long local_label(misc_ref_invalid) /* 9e misc */ 6186 .long local_label(misc_ref_invalid) /* 9f immheader */ 6187 /* a0-af */ 6188 .long local_label(misc_ref_invalid) /* a0 even_fixnum */ 6189 .long local_label(misc_ref_invalid) /* a1 cons */ 6190 .long local_label(misc_ref_node) /* a2 vectorH */ 6191 .long local_label(misc_ref_invalid) /* a3 imm */ 6192 .long local_label(misc_ref_invalid) /* a4 odd_fixnum */ 6193 .long local_label(misc_ref_invalid) /* a5 nil */ 6194 .long local_label(misc_ref_invalid) /* a6 misc */ 6195 .long local_label(misc_ref_single_float_vector) /* a7 sf_vector */ 6196 .long local_label(misc_ref_invalid) /* a8 even_fixnum */ 6197 .long local_label(misc_ref_invalid) /* a9 cons */ 6198 .long local_label(misc_ref_node) /* aa simple_vector */ 6199 .long local_label(misc_ref_invalid) /* ab imm */ 6200 .long local_label(misc_ref_invalid) /* ac odd_fixnum */ 6201 .long local_label(misc_ref_invalid) /* ad nil */ 6202 .long local_label(misc_ref_invalid) /* ae misc */ 6203 .long local_label(misc_ref_u32) /* af u32 */ 6204 /* b0-bf */ 6205 .long local_label(misc_ref_invalid) /* b0 even_fixnum */ 6206 .long local_label(misc_ref_invalid) /* b1 cons */ 6207 .long local_label(misc_ref_invalid) /* b2 nodeheader */ 6208 .long local_label(misc_ref_invalid) /* b3 imm */ 6209 .long local_label(misc_ref_invalid) /* b4 odd_fixnum */ 6210 .long local_label(misc_ref_invalid) /* b5 nil */ 6211 .long local_label(misc_ref_invalid) /* b6 misc */ 6212 .long local_label(misc_ref_s32) /* b7 s32 */ 6213 .long local_label(misc_ref_invalid) /* b8 even_fixnum */ 6214 .long local_label(misc_ref_invalid) /* b9 cons */ 6215 .long local_label(misc_ref_invalid) /* ba nodeheader */ 6216 .long local_label(misc_ref_invalid) /* bb imm */ 6217 .long local_label(misc_ref_invalid) /* bc odd_fixnum */ 6218 .long local_label(misc_ref_invalid) /* bd nil */ 6219 .long local_label(misc_ref_invalid) /* be misc */ 6220 .long local_label(misc_ref_fixnum_vector) /* bf fixnum_vector */ 6221 /* c0-cf */ 6222 .long local_label(misc_ref_invalid) /* c0 even_fixnum */ 6223 .long local_label(misc_ref_invalid) /* c1 cons */ 6224 .long local_label(misc_ref_invalid) /* c2 nodeheader */ 6225 .long local_label(misc_ref_invalid) /* c3 imm */ 6226 .long local_label(misc_ref_invalid) /* c4 odd_fixnum */ 6227 .long local_label(misc_ref_invalid) /* c5 nil */ 6228 .long local_label(misc_ref_invalid) /* c6 misc */ 6229 .long local_label(misc_ref_new_string) /* c7 new_string */ 6230 .long local_label(misc_ref_invalid) /* c8 even_fixnum */ 6231 .long local_label(misc_ref_invalid) /* c9 cons */ 6232 .long local_label(misc_ref_invalid) /* ca nodeheader */ 6233 .long local_label(misc_ref_invalid) /* cb imm */ 6234 .long local_label(misc_ref_invalid) /* cc odd_fixnum */ 6235 .long local_label(misc_ref_invalid) /* cd nil */ 6236 .long local_label(misc_ref_invalid) /* ce misc */ 6237 .long local_label(misc_ref_u8) /* cf u8 */ 6238 /* d0-df */ 6239 .long local_label(misc_ref_invalid) /* d0 even_fixnum */ 6240 .long local_label(misc_ref_invalid) /* d1 cons */ 6241 .long local_label(misc_ref_invalid) /* d2 nodeheader */ 6242 .long local_label(misc_ref_invalid) /* d3 imm */ 6243 .long local_label(misc_ref_invalid) /* d4 odd_fixnum */ 6244 .long local_label(misc_ref_invalid) /* d5 nil */ 6245 .long local_label(misc_ref_invalid) /* d6 misc */ 6246 .long local_label(misc_ref_s8) /* d7 s8 */ 6247 .long local_label(misc_ref_invalid) /* d8 even_fixnum */ 6248 .long local_label(misc_ref_invalid) /* d9 cons */ 6249 .long local_label(misc_ref_invalid) /* da nodeheader */ 6250 .long local_label(misc_ref_invalid) /* db imm */ 6251 .long local_label(misc_ref_invalid) /* dc odd_fixnum */ 6252 .long local_label(misc_ref_invalid) /* dd nil */ 6253 .long local_label(misc_ref_invalid) /* de misc */ 6254 .long local_label(misc_ref_old_string) /* df (old)subtag_simple_base_string */ 6255 /* e0-ef */ 6256 .long local_label(misc_ref_invalid) /* e0 even_fixnum */ 6257 .long local_label(misc_ref_invalid) /* e1 cons */ 6258 .long local_label(misc_ref_invalid) /* e2 nodeheader */ 6259 .long local_label(misc_ref_invalid) /* e3 imm */ 6260 .long local_label(misc_ref_invalid) /* e4 odd_fixnum */ 6261 .long local_label(misc_ref_invalid) /* e5 nil */ 6262 .long local_label(misc_ref_invalid) /* e6 misc */ 6263 .long local_label(misc_ref_u16) /* e7 u16 */ 6264 .long local_label(misc_ref_invalid) /* e8 even_fixnum */ 6265 .long local_label(misc_ref_invalid) /* e9 cons */ 6266 .long local_label(misc_ref_invalid) /* ea nodeheader */ 6267 .long local_label(misc_ref_invalid) /* eb imm */ 6268 .long local_label(misc_ref_invalid) /* ec odd_fixnum */ 6269 .long local_label(misc_ref_invalid) /* ed nil */ 6270 .long local_label(misc_ref_invalid) /* ee misc */ 6271 .long local_label(misc_ref_s16) /* ef s16 */ 6272 /* f0-ff */ 6273 .long local_label(misc_ref_invalid) /* f0 even_fixnum */ 6274 .long local_label(misc_ref_invalid) /* f1 cons */ 6275 .long local_label(misc_ref_invalid) /* f2 nodeheader */ 6276 .long local_label(misc_ref_invalid) /* f3 imm */ 6277 .long local_label(misc_ref_invalid) /* f4 odd_fixnum */ 6278 .long local_label(misc_ref_invalid) /* f5 nil */ 6279 .long local_label(misc_ref_invalid) /* f6 misc */ 6280 .long local_label(misc_ref_double_float_vector) /* f7 df vector */ 6281 .long local_label(misc_ref_invalid) /* f8 even_fixnum */ 6282 .long local_label(misc_ref_invalid) /* f9 cons */ 6283 .long local_label(misc_ref_invalid) /* fa nodeheader */ 6284 .long local_label(misc_ref_invalid) /* fb imm */ 6285 .long local_label(misc_ref_invalid) /* fc odd_fixnum */ 6286 .long local_label(misc_ref_invalid) /* fd nil */ 6287 .long local_label(misc_ref_invalid) /* fe misc */ 6288 .long local_label(misc_ref_bit_vector) /* ff bit_vector */ 6289 6290 local_label(misc_ref_node): 6291 /* A node vector. */ 6292 __(add imm0,arg_z,#misc_data_offset) 6293 __(ldr arg_z,[arg_y,imm0]) 6294 __(bx lr) 6295 local_label(misc_ref_single_float_vector): 6296 __(add imm0,arg_z,misc_data_offset) 6297 __(movc16(imm1,single_float_header)) 6298 __(ldr imm0,[arg_y,imm0]) 6299 __(Misc_Alloc_Fixed(arg_z,imm1,single_float.size)) 6300 __(str imm0,[arg_z,#single_float.value]) 6301 __(bx lr) 6302 local_label(misc_ref_new_string): 6303 __(add imm0,arg_z,#misc_data_offset) 6304 __(ldr imm0,[arg_y,imm0]) 6305 __(mov arg_z,imm0,lsl #charcode_shift) 6306 __(orr arg_z,arg_z,#subtag_character) 6307 __(bx lr) 6308 local_label(misc_ref_s32): 6309 __(add imm0,arg_z,#misc_data_offset) 6310 __(ldr imm0,[arg_y,imm0]) 6311 __(b _SPmakes32) 6312 local_label(misc_ref_fixnum_vector): 6313 __(add imm0,arg_z,#misc_data_offset) 6314 __(ldr imm0,[arg_y,imm0]) 6315 __(box_fixnum(arg_z,imm0)) 6316 __(bx lr) 6317 local_label(misc_ref_u32): 6318 __(add imm0,arg_z,#misc_data_offset) 6319 __(ldr imm0,[arg_y,imm0]) 6320 __(b _SPmakeu32) 6321 local_label(misc_ref_double_float_vector): 6322 __(mov imm0,arg_z,lsl #1) 6323 __(add imm0,imm0,#misc_dfloat_offset) 6324 __(ldrd imm0,imm1,[arg_y,imm0]) 6325 __(movc16(imm2,double_float_header)) 6326 __(Misc_Alloc_Fixed(arg_z,imm2,double_float.size)) 6327 __(strd imm0,imm1,[arg_z,#double_float.value]) 6328 __(bx lr) 6329 local_label(misc_ref_bit_vector): 6330 __(mov imm1,#nbits_in_word-1) 6331 __(and imm1,imm1,arg_z,lsr #2) 6332 __(mov imm2,#1) 6333 __(mov imm2,imm2,lsl imm1) 6334 __(mov imm0,arg_z,lsr #5+fixnumshift) 6335 __(mov imm0,imm0,lsl #2) 6336 __(add imm0,imm0,#misc_data_offset) 6337 __(mov arg_z,#0) 6338 __(ldr imm0,[arg_y,imm0]) 6339 __(tst imm0,imm2) 6340 __(addne arg_z,arg_z,#fixnumone) 6341 __(bx lr) 6342 local_label(misc_ref_s8): 6343 __(mov imm0,arg_z,lsr #2) 6344 __(add imm0,imm0,#misc_data_offset) 6345 __(ldsb imm0,[arg_y,imm0]) 6346 __(box_fixnum(arg_z,imm0)) 6347 __(bx lr) 6348 local_label(misc_ref_u8): 6349 __(mov imm0,arg_z,lsr #2) 6350 __(add imm0,imm0,#misc_data_offset) 6351 __(ldrb imm0,[arg_y,imm0]) 6352 __(box_fixnum(arg_z,imm0)) 6353 __(bx lr) 6354 local_label(misc_ref_old_string): 6355 __(mov imm0,arg_z,lsr #2) 6356 __(add imm0,imm0,#misc_data_offset) 6357 __(ldrb imm0,[arg_y,imm0]) 6358 __(mov arg_z,imm0,lsl #charcode_shift) 6359 __(orr arg_z,arg_z,#subtag_character) 6360 __(bx lr) 6361 local_label(misc_ref_u16): 6362 __(mov imm0,arg_z,lsr #1) 6363 __(add imm0,imm0,#misc_data_offset) 6364 __(ldrh imm0,[arg_y,imm0]) 6365 __(box_fixnum(arg_z,imm0)) 6366 __(bx lr) 6367 local_label(misc_ref_s16): 6368 __(mov imm0,arg_z,lsr #1) 6369 __(add imm0,imm0,#misc_data_offset) 6370 __(ldrsh imm0,[arg_y,imm0]) 6371 __(box_fixnum(arg_z,imm0)) 6372 __(bx lr) 6373 local_label(misc_ref_invalid): 6374 __(mov arg_x,#XBADVEC) 6375 __(set_nargs(3)) 6376 __(b _SPksignalerr) 6377 6378 _endfile 6379 3544 _spentry(nmkunwind) 3545 __(mov imm2,#-fixnumone) 3546 __(mov imm1,#INTERRUPT_LEVEL_BINDING_INDEX) 3547 __(ldr temp0,[rcontext,#tcr.tlb_pointer]) 3548 __(ldr arg_y,[temp0,#INTERRUPT_LEVEL_BINDING_INDEX]) 3549 __(ldr imm0,[rcontext,#tcr.db_link]) 3550 __(vpush1(arg_y)) 3551 __(vpush1(imm1)) 3552 __(vpush1(imm0)) 3553 __(str imm2,[temp0,#INTERRUPT_LEVEL_BINDING_INDEX]) 3554 __(str vsp,[rcontext,#tcr.db_link]) 3555 __(mov arg_z,#unbound_marker) 3556 __(mov imm2,#fixnum_one) 3557 __(mkcatch()) 3558 __(mov arg_z,arg_y) 3559 __(b _SPbind_interrupt_level) 3560 3561 /* EOF, basically */ 3562 3563 _exportfn(C(misc_ref_common)) 3564 __(adr imm0,(local_label(misc_ref_jmp))) 3565 __(ldr pc,[imm0,imm1,lsl #2]) 3566 3567 local_label(misc_ref_jmp): 3568 /* 00-0f */ 3569 .long local_label(misc_ref_invalid) /* 00 even_fixnum */ 3570 3571 .long local_label(misc_ref_invalid) /* 01 cons */ 3572 .long local_label(misc_ref_invalid) /* 02 nodeheader */ 3573 .long local_label(misc_ref_invalid) /* 03 imm */ 3574 .long local_label(misc_ref_invalid) /* 04 odd_fixnum */ 3575 .long local_label(misc_ref_invalid) /* 05 nil */ 3576 .long local_label(misc_ref_invalid) /* 06 misc */ 3577 .long local_label(misc_ref_u32) /* 07 bignum */ 3578 .long local_label(misc_ref_invalid) /* 08 even_fixnum */ 3579 .long local_label(misc_ref_invalid) /* 09 cons */ 3580 .long local_label(misc_ref_node) /* 0a ratio */ 3581 .long local_label(misc_ref_invalid) /* 0b imm */ 3582 .long local_label(misc_ref_invalid) /* 0c odd_fixnum */ 3583 .long local_label(misc_ref_invalid) /* 0d nil */ 3584 .long local_label(misc_ref_invalid) /* 0e misc */ 3585 .long local_label(misc_ref_u32) /* 0f single_float */ 3586 /* 10-1f */ 3587 .long local_label(misc_ref_invalid) /* 10 even_fixnum */ 3588 .long local_label(misc_ref_invalid) /* 11 cons */ 3589 .long local_label(misc_ref_invalid) /* 12 nodeheader */ 3590 .long local_label(misc_ref_invalid) /* 13 imm */ 3591 .long local_label(misc_ref_invalid) /* 14 odd_fixnum */ 3592 .long local_label(misc_ref_invalid) /* 15 nil */ 3593 .long local_label(misc_ref_invalid) /* 16 misc */ 3594 .long local_label(misc_ref_u32) /* 17 double_float */ 3595 .long local_label(misc_ref_invalid) /* 18 even_fixnum */ 3596 .long local_label(misc_ref_invalid) /* 19 cons */ 3597 .long local_label(misc_ref_node) /* 1a complex */ 3598 .long local_label(misc_ref_invalid) /* 1b imm */ 3599 .long local_label(misc_ref_invalid) /* 1c odd_fixnum */ 3600 .long local_label(misc_ref_invalid) /* 1d nil */ 3601 .long local_label(misc_ref_invalid) /* 1e misc */ 3602 .long local_label(misc_ref_u32) /* 1f macptr */ 3603 /* 20-2f */ 3604 .long local_label(misc_ref_invalid) /* 20 even_fixnum */ 3605 .long local_label(misc_ref_invalid) /* 21 cons */ 3606 .long local_label(misc_ref_node) /* 22 catch_frame */ 3607 .long local_label(misc_ref_invalid) /* 23 imm */ 3608 .long local_label(misc_ref_invalid) /* 24 odd_fixnum */ 3609 .long local_label(misc_ref_invalid) /* 25 nil */ 3610 .long local_label(misc_ref_invalid) /* 26 misc */ 3611 .long local_label(misc_ref_u32) /* 27 dead_macptr */ 3612 .long local_label(misc_ref_invalid) /* 28 even_fixnum */ 3613 .long local_label(misc_ref_invalid) /* 29 cons */ 3614 .long local_label(misc_ref_node) /* 2a function */ 3615 .long local_label(misc_ref_invalid) /* 2b imm */ 3616 .long local_label(misc_ref_invalid) /* 2c odd_fixnum */ 3617 .long local_label(misc_ref_invalid) /* 2d nil */ 3618 .long local_label(misc_ref_invalid) /* 2e misc */ 3619 .long local_label(misc_ref_u32) /* 2f code_vector */ 3620 /* 30-3f */ 3621 .long local_label(misc_ref_invalid) /* 30 even_fixnum */ 3622 .long local_label(misc_ref_invalid) /* 31 cons */ 3623 .long local_label(misc_ref_node) /* 32 lisp_thread */ 3624 .long local_label(misc_ref_invalid) /* 33 imm */ 3625 .long local_label(misc_ref_invalid) /* 34 odd_fixnum */ 3626 .long local_label(misc_ref_invalid) /* 35 nil */ 3627 .long local_label(misc_ref_invalid) /* 36 misc */ 3628 .long local_label(misc_ref_u32) /* 37 creole */ 3629 .long local_label(misc_ref_invalid) /* 38 even_fixnum */ 3630 .long local_label(misc_ref_invalid) /* 39 cons */ 3631 .long local_label(misc_ref_node) /* 3a symbol */ 3632 .long local_label(misc_ref_invalid) /* 3b imm */ 3633 .long local_label(misc_ref_invalid) /* 3c odd_fixnum */ 3634 .long local_label(misc_ref_invalid) /* 3d nil */ 3635 .long local_label(misc_ref_invalid) /* 3e misc */ 3636 .long local_label(misc_ref_u32) /* 3f xcode_vector */ 3637 /* 40-4f */ 3638 .long local_label(misc_ref_invalid) /* 40 even_fixnum */ 3639 .long local_label(misc_ref_invalid) /* 41 cons */ 3640 .long local_label(misc_ref_node) /* 42 lock */ 3641 .long local_label(misc_ref_invalid) /* 43 imm */ 3642 .long local_label(misc_ref_invalid) /* 44 odd_fixnum */ 3643 .long local_label(misc_ref_invalid) /* 45 nil */ 3644 .long local_label(misc_ref_invalid) /* 46 misc */ 3645 .long local_label(misc_ref_invalid) /* 47 immheader */ 3646 .long local_label(misc_ref_invalid) /* 48 even_fixnum */ 3647 .long local_label(misc_ref_invalid) /* 49 cons */ 3648 .long local_label(misc_ref_node) /* 4a hash_vector */ 3649 .long local_label(misc_ref_invalid) /* 4b imm */ 3650 .long local_label(misc_ref_invalid) /* 4c odd_fixnum */ 3651 .long local_label(misc_ref_invalid) /* 4d nil */ 3652 .long local_label(misc_ref_invalid) /* 4e misc */ 3653 .long local_label(misc_ref_invalid) /* 4f immheader */ 3654 /* 50-5f */ 3655 .long local_label(misc_ref_invalid) /* 50 even_fixnum */ 3656 .long local_label(misc_ref_invalid) /* 51 cons */ 3657 .long local_label(misc_ref_node) /* 52 pool */ 3658 .long local_label(misc_ref_invalid) /* 53 imm */ 3659 .long local_label(misc_ref_invalid) /* 54 odd_fixnum */ 3660 .long local_label(misc_ref_invalid) /* 55 nil */ 3661 .long local_label(misc_ref_invalid) /* 56 misc */ 3662 .long local_label(misc_ref_invalid) /* 57 immheader */ 3663 .long local_label(misc_ref_invalid) /* 58 even_fixnum */ 3664 .long local_label(misc_ref_invalid) /* 59 cons */ 3665 .long local_label(misc_ref_node) /* 5a weak */ 3666 .long local_label(misc_ref_invalid) /* 5b imm */ 3667 .long local_label(misc_ref_invalid) /* 5c odd_fixnum */ 3668 .long local_label(misc_ref_invalid) /* 5d nil */ 3669 .long local_label(misc_ref_invalid) /* 5e misc */ 3670 .long local_label(misc_ref_invalid) /* 5f immheader */ 3671 /* 60-6f */ 3672 .long local_label(misc_ref_invalid) /* 60 even_fixnum */ 3673 .long local_label(misc_ref_invalid) /* 61 cons */ 3674 .long local_label(misc_ref_node) /* 62 package */ 3675 .long local_label(misc_ref_invalid) /* 63 imm */ 3676 .long local_label(misc_ref_invalid) /* 64 odd_fixnum */ 3677 .long local_label(misc_ref_invalid) /* 65 nil */ 3678 .long local_label(misc_ref_invalid) /* 66 misc */ 3679 .long local_label(misc_ref_invalid) /* 67 immheader */ 3680 .long local_label(misc_ref_invalid) /* 68 even_fixnum */ 3681 .long local_label(misc_ref_invalid) /* 69 cons */ 3682 .long local_label(misc_ref_node) /* 6a slot_vector */ 3683 .long local_label(misc_ref_invalid) /* 6b imm */ 3684 .long local_label(misc_ref_invalid) /* 6c odd_fixnum */ 3685 .long local_label(misc_ref_invalid) /* 6d nil */ 3686 .long local_label(misc_ref_invalid) /* 6e misc */ 3687 .long local_label(misc_ref_invalid) /* 6f immheader */ 3688 /* 70-7f */ 3689 .long local_label(misc_ref_invalid) /* 70 even_fixnum */ 3690 .long local_label(misc_ref_invalid) /* 71 cons */ 3691 .long local_label(misc_ref_node) /* 72 instance */ 3692 .long local_label(misc_ref_invalid) /* 73 imm */ 3693 .long local_label(misc_ref_invalid) /* 74 odd_fixnum */ 3694 .long local_label(misc_ref_invalid) /* 75 nil */ 3695 .long local_label(misc_ref_invalid) /* 76 misc */ 3696 .long local_label(misc_ref_invalid) /* 77 immheader */ 3697 .long local_label(misc_ref_invalid) /* 78 even_fixnum */ 3698 .long local_label(misc_ref_invalid) /* 79 cons */ 3699 .long local_label(misc_ref_node) /* 7a struct */ 3700 .long local_label(misc_ref_invalid) /* 7b imm */ 3701 .long local_label(misc_ref_invalid) /* 7c odd_fixnum */ 3702 .long local_label(misc_ref_invalid) /* 7d nil */ 3703 .long local_label(misc_ref_invalid) /* 7e misc */ 3704 .long local_label(misc_ref_invalid) /* 7f immheader */ 3705 /* 80-8f */ 3706 .long local_label(misc_ref_invalid) /* 80 even_fixnum */ 3707 .long local_label(misc_ref_invalid) /* 81 cons */ 3708 .long local_label(misc_ref_node) /* 82 istruct */ 3709 .long local_label(misc_ref_invalid) /* 83 imm */ 3710 .long local_label(misc_ref_invalid) /* 84 odd_fixnum */ 3711 .long local_label(misc_ref_invalid) /* 85 nil */ 3712 .long local_label(misc_ref_invalid) /* 86 misc */ 3713 .long local_label(misc_ref_invalid) /* 87 immheader */ 3714 .long local_label(misc_ref_invalid) /* 88 even_fixnum */ 3715 .long local_label(misc_ref_invalid) /* 89 cons */ 3716 .long local_label(misc_ref_node) /* 8a value_cell */ 3717 .long local_label(misc_ref_invalid) /* 8b imm */ 3718 .long local_label(misc_ref_invalid) /* 8c odd_fixnum */ 3719 .long local_label(misc_ref_invalid) /* 8d nil */ 3720 .long local_label(misc_ref_invalid) /* 8e misc */ 3721 .long local_label(misc_ref_invalid) /* 8f immheader */ 3722 /* 90-9f */ 3723 .long local_label(misc_ref_invalid) /* 90 even_fixnum */ 3724 .long local_label(misc_ref_invalid) /* 91 cons */ 3725 .long local_label(misc_ref_node) /* 92 xfunction */ 3726 .long local_label(misc_ref_invalid) /* 93 imm */ 3727 .long local_label(misc_ref_invalid) /* 94 odd_fixnum */ 3728 .long local_label(misc_ref_invalid) /* 95 nil */ 3729 .long local_label(misc_ref_invalid) /* 96 misc */ 3730 .long local_label(misc_ref_invalid) /* 97 immheader */ 3731 .long local_label(misc_ref_invalid) /* 98 even_fixnum */ 3732 .long local_label(misc_ref_invalid) /* 99 cons */ 3733 .long local_label(misc_ref_node) /* 9a arrayN */ 3734 .long local_label(misc_ref_invalid) /* 9b imm */ 3735 .long local_label(misc_ref_invalid) /* 9c odd_fixnum */ 3736 .long local_label(misc_ref_invalid) /* 9d nil */ 3737 .long local_label(misc_ref_invalid) /* 9e misc */ 3738 .long local_label(misc_ref_invalid) /* 9f immheader */ 3739 /* a0-af */ 3740 .long local_label(misc_ref_invalid) /* a0 even_fixnum */ 3741 .long local_label(misc_ref_invalid) /* a1 cons */ 3742 .long local_label(misc_ref_node) /* a2 vectorH */ 3743 .long local_label(misc_ref_invalid) /* a3 imm */ 3744 .long local_label(misc_ref_invalid) /* a4 odd_fixnum */ 3745 .long local_label(misc_ref_invalid) /* a5 nil */ 3746 .long local_label(misc_ref_invalid) /* a6 misc */ 3747 .long local_label(misc_ref_single_float_vector) /* a7 sf_vector */ 3748 .long local_label(misc_ref_invalid) /* a8 even_fixnum */ 3749 .long local_label(misc_ref_invalid) /* a9 cons */ 3750 .long local_label(misc_ref_node) /* aa simple_vector */ 3751 .long local_label(misc_ref_invalid) /* ab imm */ 3752 .long local_label(misc_ref_invalid) /* ac odd_fixnum */ 3753 .long local_label(misc_ref_invalid) /* ad nil */ 3754 .long local_label(misc_ref_invalid) /* ae misc */ 3755 .long local_label(misc_ref_u32) /* af u32 */ 3756 /* b0-bf */ 3757 .long local_label(misc_ref_invalid) /* b0 even_fixnum */ 3758 .long local_label(misc_ref_invalid) /* b1 cons */ 3759 .long local_label(misc_ref_invalid) /* b2 nodeheader */ 3760 .long local_label(misc_ref_invalid) /* b3 imm */ 3761 .long local_label(misc_ref_invalid) /* b4 odd_fixnum */ 3762 .long local_label(misc_ref_invalid) /* b5 nil */ 3763 .long local_label(misc_ref_invalid) /* b6 misc */ 3764 .long local_label(misc_ref_s32) /* b7 s32 */ 3765 .long local_label(misc_ref_invalid) /* b8 even_fixnum */ 3766 .long local_label(misc_ref_invalid) /* b9 cons */ 3767 .long local_label(misc_ref_invalid) /* ba nodeheader */ 3768 .long local_label(misc_ref_invalid) /* bb imm */ 3769 .long local_label(misc_ref_invalid) /* bc odd_fixnum */ 3770 .long local_label(misc_ref_invalid) /* bd nil */ 3771 .long local_label(misc_ref_invalid) /* be misc */ 3772 .long local_label(misc_ref_fixnum_vector) /* bf fixnum_vector */ 3773 /* c0-cf */ 3774 .long local_label(misc_ref_invalid) /* c0 even_fixnum */ 3775 .long local_label(misc_ref_invalid) /* c1 cons */ 3776 .long local_label(misc_ref_invalid) /* c2 nodeheader */ 3777 .long local_label(misc_ref_invalid) /* c3 imm */ 3778 .long local_label(misc_ref_invalid) /* c4 odd_fixnum */ 3779 .long local_label(misc_ref_invalid) /* c5 nil */ 3780 .long local_label(misc_ref_invalid) /* c6 misc */ 3781 .long local_label(misc_ref_new_string) /* c7 new_string */ 3782 .long local_label(misc_ref_invalid) /* c8 even_fixnum */ 3783 .long local_label(misc_ref_invalid) /* c9 cons */ 3784 .long local_label(misc_ref_invalid) /* ca nodeheader */ 3785 .long local_label(misc_ref_invalid) /* cb imm */ 3786 .long local_label(misc_ref_invalid) /* cc odd_fixnum */ 3787 .long local_label(misc_ref_invalid) /* cd nil */ 3788 .long local_label(misc_ref_invalid) /* ce misc */ 3789 .long local_label(misc_ref_u8) /* cf u8 */ 3790 /* d0-df */ 3791 .long local_label(misc_ref_invalid) /* d0 even_fixnum */ 3792 .long local_label(misc_ref_invalid) /* d1 cons */ 3793 .long local_label(misc_ref_invalid) /* d2 nodeheader */ 3794 .long local_label(misc_ref_invalid) /* d3 imm */ 3795 .long local_label(misc_ref_invalid) /* d4 odd_fixnum */ 3796 .long local_label(misc_ref_invalid) /* d5 nil */ 3797 .long local_label(misc_ref_invalid) /* d6 misc */ 3798 .long local_label(misc_ref_s8) /* d7 s8 */ 3799 .long local_label(misc_ref_invalid) /* d8 even_fixnum */ 3800 .long local_label(misc_ref_invalid) /* d9 cons */ 3801 .long local_label(misc_ref_invalid) /* da nodeheader */ 3802 .long local_label(misc_ref_invalid) /* db imm */ 3803 .long local_label(misc_ref_invalid) /* dc odd_fixnum */ 3804 .long local_label(misc_ref_invalid) /* dd nil */ 3805 .long local_label(misc_ref_invalid) /* de misc */ 3806 .long local_label(misc_ref_old_string) /* df (old)subtag_simple_base_string */ 3807 /* e0-ef */ 3808 .long local_label(misc_ref_invalid) /* e0 even_fixnum */ 3809 .long local_label(misc_ref_invalid) /* e1 cons */ 3810 .long local_label(misc_ref_invalid) /* e2 nodeheader */ 3811 .long local_label(misc_ref_invalid) /* e3 imm */ 3812 .long local_label(misc_ref_invalid) /* e4 odd_fixnum */ 3813 .long local_label(misc_ref_invalid) /* e5 nil */ 3814 .long local_label(misc_ref_invalid) /* e6 misc */ 3815 .long local_label(misc_ref_u16) /* e7 u16 */ 3816 .long local_label(misc_ref_invalid) /* e8 even_fixnum */ 3817 .long local_label(misc_ref_invalid) /* e9 cons */ 3818 .long local_label(misc_ref_invalid) /* ea nodeheader */ 3819 .long local_label(misc_ref_invalid) /* eb imm */ 3820 .long local_label(misc_ref_invalid) /* ec odd_fixnum */ 3821 .long local_label(misc_ref_invalid) /* ed nil */ 3822 .long local_label(misc_ref_invalid) /* ee misc */ 3823 .long local_label(misc_ref_s16) /* ef s16 */ 3824 /* f0-ff */ 3825 .long local_label(misc_ref_invalid) /* f0 even_fixnum */ 3826 .long local_label(misc_ref_invalid) /* f1 cons */ 3827 .long local_label(misc_ref_invalid) /* f2 nodeheader */ 3828 .long local_label(misc_ref_invalid) /* f3 imm */ 3829 .long local_label(misc_ref_invalid) /* f4 odd_fixnum */ 3830 .long local_label(misc_ref_invalid) /* f5 nil */ 3831 .long local_label(misc_ref_invalid) /* f6 misc */ 3832 .long local_label(misc_ref_double_float_vector) /* f7 df vector */ 3833 .long local_label(misc_ref_invalid) /* f8 even_fixnum */ 3834 .long local_label(misc_ref_invalid) /* f9 cons */ 3835 .long local_label(misc_ref_invalid) /* fa nodeheader */ 3836 .long local_label(misc_ref_invalid) /* fb imm */ 3837 .long local_label(misc_ref_invalid) /* fc odd_fixnum */ 3838 .long local_label(misc_ref_invalid) /* fd nil */ 3839 .long local_label(misc_ref_invalid) /* fe misc */ 3840 .long local_label(misc_ref_bit_vector) /* ff bit_vector */ 3841 3842 local_label(misc_ref_node): 3843 /* A node vector. */ 3844 __(add imm0,arg_z,#misc_data_offset) 3845 __(ldr arg_z,[arg_y,imm0]) 3846 __(bx lr) 3847 local_label(misc_ref_single_float_vector): 3848 __(add imm0,arg_z,misc_data_offset) 3849 __(movc16(imm1,single_float_header)) 3850 __(ldr imm0,[arg_y,imm0]) 3851 __(Misc_Alloc_Fixed(arg_z,imm1,single_float.size)) 3852 __(str imm0,[arg_z,#single_float.value]) 3853 __(bx lr) 3854 local_label(misc_ref_new_string): 3855 __(add imm0,arg_z,#misc_data_offset) 3856 __(ldr imm0,[arg_y,imm0]) 3857 __(mov arg_z,imm0,lsl #charcode_shift) 3858 __(orr arg_z,arg_z,#subtag_character) 3859 __(bx lr) 3860 local_label(misc_ref_s32): 3861 __(add imm0,arg_z,#misc_data_offset) 3862 __(ldr imm0,[arg_y,imm0]) 3863 __(b _SPmakes32) 3864 local_label(misc_ref_fixnum_vector): 3865 __(add imm0,arg_z,#misc_data_offset) 3866 __(ldr imm0,[arg_y,imm0]) 3867 __(box_fixnum(arg_z,imm0)) 3868 __(bx lr) 3869 local_label(misc_ref_u32): 3870 __(add imm0,arg_z,#misc_data_offset) 3871 __(ldr imm0,[arg_y,imm0]) 3872 __(b _SPmakeu32) 3873 local_label(misc_ref_double_float_vector): 3874 __(mov imm0,arg_z,lsl #1) 3875 __(add imm0,imm0,#misc_dfloat_offset) 3876 __(ldrd imm0,imm1,[arg_y,imm0]) 3877 __(movc16(imm2,double_float_header)) 3878 __(Misc_Alloc_Fixed(arg_z,imm2,double_float.size)) 3879 __(strd imm0,imm1,[arg_z,#double_float.value]) 3880 __(bx lr) 3881 local_label(misc_ref_bit_vector): 3882 __(mov imm1,#nbits_in_word-1) 3883 __(and imm1,imm1,arg_z,lsr #2) 3884 __(mov imm2,#1) 3885 __(mov imm2,imm2,lsl imm1) 3886 __(mov imm0,arg_z,lsr #5+fixnumshift) 3887 __(mov imm0,imm0,lsl #2) 3888 __(add imm0,imm0,#misc_data_offset) 3889 __(mov arg_z,#0) 3890 __(ldr imm0,[arg_y,imm0]) 3891 __(tst imm0,imm2) 3892 __(addne arg_z,arg_z,#fixnumone) 3893 __(bx lr) 3894 local_label(misc_ref_s8): 3895 __(mov imm0,arg_z,lsr #2) 3896 __(add imm0,imm0,#misc_data_offset) 3897 __(ldsb imm0,[arg_y,imm0]) 3898 __(box_fixnum(arg_z,imm0)) 3899 __(bx lr) 3900 local_label(misc_ref_u8): 3901 __(mov imm0,arg_z,lsr #2) 3902 __(add imm0,imm0,#misc_data_offset) 3903 __(ldrb imm0,[arg_y,imm0]) 3904 __(box_fixnum(arg_z,imm0)) 3905 __(bx lr) 3906 local_label(misc_ref_old_string): 3907 __(mov imm0,arg_z,lsr #2) 3908 __(add imm0,imm0,#misc_data_offset) 3909 __(ldrb imm0,[arg_y,imm0]) 3910 __(mov arg_z,imm0,lsl #charcode_shift) 3911 __(orr arg_z,arg_z,#subtag_character) 3912 __(bx lr) 3913 local_label(misc_ref_u16): 3914 __(mov imm0,arg_z,lsr #1) 3915 __(add imm0,imm0,#misc_data_offset) 3916 __(ldrh imm0,[arg_y,imm0]) 3917 __(box_fixnum(arg_z,imm0)) 3918 __(bx lr) 3919 local_label(misc_ref_s16): 3920 __(mov imm0,arg_z,lsr #1) 3921 __(add imm0,imm0,#misc_data_offset) 3922 __(ldrsh imm0,[arg_y,imm0]) 3923 __(box_fixnum(arg_z,imm0)) 3924 __(bx lr) 3925 local_label(misc_ref_invalid): 3926 __(mov arg_x,#XBADVEC) 3927 __(set_nargs(3)) 3928 __(b _SPksignalerr) 3929 _endfn 3930 3931 _exportfn(C(misc_set_common)) 3932 __(adr imm0,local_label(misc_set_jmp)) 3933 __(ldr pc,[imm0,imm1,lsl #2]) 3934 local_label(misc_set_jmp): 3935 /* 00-0f */ 3936 .long local_label(misc_set_invalid) /* 00 even_fixnum */ 3937 .long local_label(misc_set_invalid) /* 01 cons */ 3938 .long local_label(misc_set_invalid) /* 02 nodeheader */ 3939 .long local_label(misc_set_invalid) /* 03 imm */ 3940 .long local_label(misc_set_invalid) /* 04 odd_fixnum */ 3941 .long local_label(misc_set_invalid) /* 05 nil */ 3942 .long local_label(misc_set_invalid) /* 06 misc */ 3943 .long local_label(misc_set_u32) /* 07 bignum */ 3944 .long local_label(misc_set_invalid) /* 08 even_fixnum */ 3945 .long local_label(misc_set_invalid) /* 09 cons */ 3946 .long _SPgvset /* 0a ratio */ 3947 .long local_label(misc_set_invalid) /* 0b imm */ 3948 .long local_label(misc_set_invalid) /* 0c odd_fixnum */ 3949 .long local_label(misc_set_invalid) /* 0d nil */ 3950 .long local_label(misc_set_invalid) /* 0e misc */ 3951 .long local_label(misc_set_u32) /* 0f single_float */ 3952 /* 10-1f */ 3953 .long local_label(misc_set_invalid) /* 10 even_fixnum */ 3954 .long local_label(misc_set_invalid) /* 11 cons */ 3955 .long local_label(misc_set_invalid) /* 12 nodeheader */ 3956 .long local_label(misc_set_invalid) /* 13 imm */ 3957 .long local_label(misc_set_invalid) /* 14 odd_fixnum */ 3958 .long local_label(misc_set_invalid) /* 15 nil */ 3959 .long local_label(misc_set_invalid) /* 16 misc */ 3960 .long local_label(misc_set_u32) /* 17 double_float */ 3961 .long local_label(misc_set_invalid) /* 18 even_fixnum */ 3962 .long local_label(misc_set_invalid) /* 19 cons */ 3963 .long _SPgvset /* 1a complex */ 3964 .long local_label(misc_set_invalid) /* 1b imm */ 3965 .long local_label(misc_set_invalid) /* 1c odd_fixnum */ 3966 .long local_label(misc_set_invalid) /* 1d nil */ 3967 .long local_label(misc_set_invalid) /* 1e misc */ 3968 .long local_label(misc_set_u32) /* 1f macptr */ 3969 /* 20-2f */ 3970 .long local_label(misc_set_invalid) /* 20 even_fixnum */ 3971 .long local_label(misc_set_invalid) /* 21 cons */ 3972 .long _SPgvset /* 22 catch_frame */ 3973 .long local_label(misc_set_invalid) /* 23 imm */ 3974 .long local_label(misc_set_invalid) /* 24 odd_fixnum */ 3975 .long local_label(misc_set_invalid) /* 25 nil */ 3976 .long local_label(misc_set_invalid) /* 26 misc */ 3977 .long local_label(misc_set_u32) /* 27 dead_macptr */ 3978 .long local_label(misc_set_invalid) /* 28 even_fixnum */ 3979 .long local_label(misc_set_invalid) /* 29 cons */ 3980 .long _SPgvset /* 2a function */ 3981 .long local_label(misc_set_invalid) /* 2b imm */ 3982 .long local_label(misc_set_invalid) /* 2c odd_fixnum */ 3983 .long local_label(misc_set_invalid) /* 2d nil */ 3984 .long local_label(misc_set_invalid) /* 2e misc */ 3985 .long local_label(misc_set_u32) /* 2f code_vector */ 3986 /* 30-3f */ 3987 .long local_label(misc_set_invalid) /* 30 even_fixnum */ 3988 .long local_label(misc_set_invalid) /* 31 cons */ 3989 .long _SPgvset /* 32 lisp_thread */ 3990 .long local_label(misc_set_invalid) /* 33 imm */ 3991 .long local_label(misc_set_invalid) /* 34 odd_fixnum */ 3992 .long local_label(misc_set_invalid) /* 35 nil */ 3993 .long local_label(misc_set_invalid) /* 36 misc */ 3994 .long local_label(misc_set_u32) /* 37 creole */ 3995 .long local_label(misc_set_invalid) /* 38 even_fixnum */ 3996 .long local_label(misc_set_invalid) /* 39 cons */ 3997 .long _SPgvset /* 3a symbol */ 3998 .long local_label(misc_set_invalid) /* 3b imm */ 3999 .long local_label(misc_set_invalid) /* 3c odd_fixnum */ 4000 .long local_label(misc_set_invalid) /* 3d nil */ 4001 .long local_label(misc_set_invalid) /* 3e misc */ 4002 .long local_label(misc_set_u32) /* 3f xcode_vector */ 4003 /* 40-4f */ 4004 .long local_label(misc_set_invalid) /* 40 even_fixnum */ 4005 .long local_label(misc_set_invalid) /* 41 cons */ 4006 .long _SPgvset /* 42 lock */ 4007 .long local_label(misc_set_invalid) /* 43 imm */ 4008 .long local_label(misc_set_invalid) /* 44 odd_fixnum */ 4009 .long local_label(misc_set_invalid) /* 45 nil */ 4010 .long local_label(misc_set_invalid) /* 46 misc */ 4011 .long local_label(misc_set_invalid) /* 47 immheader */ 4012 .long local_label(misc_set_invalid) /* 48 even_fixnum */ 4013 .long local_label(misc_set_invalid) /* 49 cons */ 4014 .long _SPgvset /* 4a hash_vector */ 4015 .long local_label(misc_set_invalid) /* 4b imm */ 4016 .long local_label(misc_set_invalid) /* 4c odd_fixnum */ 4017 .long local_label(misc_set_invalid) /* 4d nil */ 4018 .long local_label(misc_set_invalid) /* 4e misc */ 4019 .long local_label(misc_set_invalid) /* 4f immheader */ 4020 /* 50-5f */ 4021 .long local_label(misc_set_invalid) /* 50 even_fixnum */ 4022 .long local_label(misc_set_invalid) /* 51 cons */ 4023 .long _SPgvset /* 52 pool */ 4024 .long local_label(misc_set_invalid) /* 53 imm */ 4025 .long local_label(misc_set_invalid) /* 54 odd_fixnum */ 4026 .long local_label(misc_set_invalid) /* 55 nil */ 4027 .long local_label(misc_set_invalid) /* 56 misc */ 4028 .long local_label(misc_set_invalid) /* 57 immheader */ 4029 .long local_label(misc_set_invalid) /* 58 even_fixnum */ 4030 .long local_label(misc_set_invalid) /* 59 cons */ 4031 .long _SPgvset /* 5a weak */ 4032 .long local_label(misc_set_invalid) /* 5b imm */ 4033 .long local_label(misc_set_invalid) /* 5c odd_fixnum */ 4034 .long local_label(misc_set_invalid) /* 5d nil */ 4035 .long local_label(misc_set_invalid) /* 5e misc */ 4036 .long local_label(misc_set_invalid) /* 5f immheader */ 4037 /* 60-6f */ 4038 .long local_label(misc_set_invalid) /* 60 even_fixnum */ 4039 .long local_label(misc_set_invalid) /* 61 cons */ 4040 .long _SPgvset /* 62 package */ 4041 .long local_label(misc_set_invalid) /* 63 imm */ 4042 .long local_label(misc_set_invalid) /* 64 odd_fixnum */ 4043 .long local_label(misc_set_invalid) /* 65 nil */ 4044 .long local_label(misc_set_invalid) /* 66 misc */ 4045 .long local_label(misc_set_invalid) /* 67 immheader */ 4046 .long local_label(misc_set_invalid) /* 68 even_fixnum */ 4047 .long local_label(misc_set_invalid) /* 69 cons */ 4048 .long _SPgvset /* 6a slot_vector */ 4049 .long local_label(misc_set_invalid) /* 6b imm */ 4050 .long local_label(misc_set_invalid) /* 6c odd_fixnum */ 4051 .long local_label(misc_set_invalid) /* 6d nil */ 4052 .long local_label(misc_set_invalid) /* 6e misc */ 4053 .long local_label(misc_set_invalid) /* 6f immheader */ 4054 /* 70-7f */ 4055 .long local_label(misc_set_invalid) /* 70 even_fixnum */ 4056 .long local_label(misc_set_invalid) /* 71 cons */ 4057 .long _SPgvset /* 72 instance */ 4058 .long local_label(misc_set_invalid) /* 73 imm */ 4059 .long local_label(misc_set_invalid) /* 74 odd_fixnum */ 4060 .long local_label(misc_set_invalid) /* 75 nil */ 4061 .long local_label(misc_set_invalid) /* 76 misc */ 4062 .long local_label(misc_set_invalid) /* 77 immheader */ 4063 .long local_label(misc_set_invalid) /* 78 even_fixnum */ 4064 .long local_label(misc_set_invalid) /* 79 cons */ 4065 .long _SPgvset /* 7a struct */ 4066 .long local_label(misc_set_invalid) /* 7b imm */ 4067 .long local_label(misc_set_invalid) /* 7c odd_fixnum */ 4068 .long local_label(misc_set_invalid) /* 7d nil */ 4069 .long local_label(misc_set_invalid) /* 7e misc */ 4070 .long local_label(misc_set_invalid) /* 7f immheader */ 4071 /* 80-8f */ 4072 .long local_label(misc_set_invalid) /* 80 even_fixnum */ 4073 .long local_label(misc_set_invalid) /* 81 cons */ 4074 .long _SPgvset /* 82 istruct */ 4075 .long local_label(misc_set_invalid) /* 83 imm */ 4076 .long local_label(misc_set_invalid) /* 84 odd_fixnum */ 4077 .long local_label(misc_set_invalid) /* 85 nil */ 4078 .long local_label(misc_set_invalid) /* 86 misc */ 4079 .long local_label(misc_set_invalid) /* 87 immheader */ 4080 .long local_label(misc_set_invalid) /* 88 even_fixnum */ 4081 .long local_label(misc_set_invalid) /* 89 cons */ 4082 .long _SPgvset /* 8a value_cell */ 4083 .long local_label(misc_set_invalid) /* 8b imm */ 4084 .long local_label(misc_set_invalid) /* 8c odd_fixnum */ 4085 .long local_label(misc_set_invalid) /* 8d nil */ 4086 .long local_label(misc_set_invalid) /* 8e misc */ 4087 .long local_label(misc_set_invalid) /* 8f immheader */ 4088 /* 90-9f */ 4089 .long local_label(misc_set_invalid) /* 90 even_fixnum */ 4090 .long local_label(misc_set_invalid) /* 91 cons */ 4091 .long _SPgvset /* 92 xfunction */ 4092 .long local_label(misc_set_invalid) /* 93 imm */ 4093 .long local_label(misc_set_invalid) /* 94 odd_fixnum */ 4094 .long local_label(misc_set_invalid) /* 95 nil */ 4095 .long local_label(misc_set_invalid) /* 96 misc */ 4096 .long local_label(misc_set_invalid) /* 97 immheader */ 4097 .long local_label(misc_set_invalid) /* 98 even_fixnum */ 4098 .long local_label(misc_set_invalid) /* 99 cons */ 4099 .long _SPgvset /* 9a arrayH */ 4100 .long local_label(misc_set_invalid) /* 9b imm */ 4101 .long local_label(misc_set_invalid) /* 9c odd_fixnum */ 4102 .long local_label(misc_set_invalid) /* 9d nil */ 4103 .long local_label(misc_set_invalid) /* 9e misc */ 4104 .long local_label(misc_set_invalid) /* 9f immheader */ 4105 /* a0-af */ 4106 .long local_label(misc_set_invalid) /* a0 even_fixnum */ 4107 .long local_label(misc_set_invalid) /* a1 cons */ 4108 .long _SPgvset /* a2 vectorH */ 4109 .long local_label(misc_set_invalid) /* a3 imm */ 4110 .long local_label(misc_set_invalid) /* a4 odd_fixnum */ 4111 .long local_label(misc_set_invalid) /* a5 nil */ 4112 .long local_label(misc_set_invalid) /* a6 misc */ 4113 .long local_label(misc_set_single_float_vector) /* a7 sf vector */ 4114 .long local_label(misc_set_invalid) /* a8 even_fixnum */ 4115 .long local_label(misc_set_invalid) /* a9 cons */ 4116 .long _SPgvset /* aa vectorH */ 4117 .long local_label(misc_set_invalid) /* ab imm */ 4118 .long local_label(misc_set_invalid) /* ac odd_fixnum */ 4119 .long local_label(misc_set_invalid) /* ad nil */ 4120 .long local_label(misc_set_invalid) /* ae misc */ 4121 .long local_label(misc_set_u32) /* af u32 */ 4122 /* b0-bf */ 4123 .long local_label(misc_set_invalid) /* b0 even_fixnum */ 4124 .long local_label(misc_set_invalid) /* b1 cons */ 4125 .long local_label(misc_set_invalid) /* b2 node */ 4126 .long local_label(misc_set_invalid) /* b3 imm */ 4127 .long local_label(misc_set_invalid) /* b4 odd_fixnum */ 4128 .long local_label(misc_set_invalid) /* b5 nil */ 4129 .long local_label(misc_set_invalid) /* b6 misc */ 4130 .long local_label(misc_set_s32) /* b7 s32 */ 4131 .long local_label(misc_set_invalid) /* b8 even_fixnum */ 4132 .long local_label(misc_set_invalid) /* b9 cons */ 4133 .long local_label(misc_set_invalid) /* ba nodeheader */ 4134 .long local_label(misc_set_invalid) /* bb imm */ 4135 .long local_label(misc_set_invalid) /* bc odd_fixnum */ 4136 .long local_label(misc_set_invalid) /* bd nil */ 4137 .long local_label(misc_set_invalid) /* be misc */ 4138 .long local_label(misc_set_fixnum_vector) /* bf fixnum_vector */ 4139 /* c0-cf */ 4140 .long local_label(misc_set_invalid) /* c0 even_fixnum */ 4141 .long local_label(misc_set_invalid) /* c1 cons */ 4142 .long local_label(misc_set_invalid) /* c2 nodeheader */ 4143 .long local_label(misc_set_invalid) /* c3 imm */ 4144 .long local_label(misc_set_invalid) /* c4 odd_fixnum */ 4145 .long local_label(misc_set_invalid) /* c5 nil */ 4146 .long local_label(misc_set_invalid) /* c6 misc */ 4147 .long local_label(misc_set_new_string) /* c7 new_string */ 4148 .long local_label(misc_set_invalid) /* c8 even_fixnum */ 4149 .long local_label(misc_set_invalid) /* c9 cons */ 4150 .long local_label(misc_set_invalid) /* ca nodeheader */ 4151 .long local_label(misc_set_invalid) /* cb imm */ 4152 .long local_label(misc_set_invalid) /* cc odd_fixnum */ 4153 .long local_label(misc_set_invalid) /* cd nil */ 4154 .long local_label(misc_set_invalid) /* ce misc */ 4155 .long local_label(misc_set_u8) /* cf u8 */ 4156 /* d0-df */ 4157 .long local_label(misc_set_invalid) /* d0 even_fixnum */ 4158 .long local_label(misc_set_invalid) /* d1 cons */ 4159 .long local_label(misc_set_invalid) /* d2 nodeheader */ 4160 .long local_label(misc_set_invalid) /* d3 imm */ 4161 .long local_label(misc_set_invalid) /* d4 odd_fixnum */ 4162 .long local_label(misc_set_invalid) /* d5 nil */ 4163 .long local_label(misc_set_invalid) /* d6 misc */ 4164 .long local_label(misc_set_s8) /* d7 s8 */ 4165 .long local_label(misc_set_invalid) /* d8 even_fixnum */ 4166 .long local_label(misc_set_invalid) /* d9 cons */ 4167 .long local_label(misc_set_invalid) /* da nodeheader */ 4168 .long local_label(misc_set_invalid) /* db imm */ 4169 .long local_label(misc_set_invalid) /* dc odd_fixnum */ 4170 .long local_label(misc_set_invalid) /* dd nil */ 4171 .long local_label(misc_set_invalid) /* de misc */ 4172 .long local_label(misc_set_old_string) /* df (old) simple_base_string */ 4173 /* e0-ef */ 4174 .long local_label(misc_set_invalid) /* e0 even_fixnum */ 4175 .long local_label(misc_set_invalid) /* e1 cons */ 4176 .long local_label(misc_set_invalid) /* e2 nodeheader */ 4177 .long local_label(misc_set_invalid) /* e3 imm */ 4178 .long local_label(misc_set_invalid) /* e4 odd_fixnum */ 4179 .long local_label(misc_set_invalid) /* e5 nil */ 4180 .long local_label(misc_set_invalid) /* e6 misc */ 4181 .long local_label(misc_set_u16) /* e7 u16 */ 4182 .long local_label(misc_set_invalid) /* e8 even_fixnum */ 4183 .long local_label(misc_set_invalid) /* e9 cons */ 4184 .long local_label(misc_set_invalid) /* ea nodeheader */ 4185 .long local_label(misc_set_invalid) /* eb imm */ 4186 .long local_label(misc_set_invalid) /* ec odd_fixnum */ 4187 .long local_label(misc_set_invalid) /* ed nil */ 4188 .long local_label(misc_set_invalid) /* ee misc */ 4189 .long local_label(misc_set_s16) /* ef s16 */ 4190 /* f0-ff */ 4191 .long local_label(misc_set_invalid) /* f0 even_fixnum */ 4192 .long local_label(misc_set_invalid) /* f1 cons */ 4193 .long local_label(misc_set_invalid) /* f2 nodeheader */ 4194 .long local_label(misc_set_invalid) /* f3 imm */ 4195 .long local_label(misc_set_invalid) /* f4 odd_fixnum */ 4196 .long local_label(misc_set_invalid) /* f5 nil */ 4197 .long local_label(misc_set_invalid) /* f6 misc */ 4198 .long local_label(misc_set_double_float_vector) /* f7 df vector */ 4199 .long local_label(misc_set_invalid) /* f8 even_fixnum */ 4200 .long local_label(misc_set_invalid) /* f9 cons */ 4201 .long local_label(misc_set_invalid) /* fa nodeheader */ 4202 .long local_label(misc_set_invalid) /* fb imm */ 4203 .long local_label(misc_set_invalid) /* fc odd_fixnum */ 4204 .long local_label(misc_set_invalid) /* fd nil */ 4205 .long local_label(misc_set_invalid) /* fe misc */ 4206 .long local_label(misc_set_bit_vector) /* ff bit_vector */ 4207 4208 local_label(misc_set_u32): 4209 /* Either a non-negative fixnum, a positive one-digit bignum, */ 4210 /* or a two-digit bignum whose sign-digit is 0 is ok. */ 4211 __(add imm0,arg_y,#misc_data_offset) 4212 __(test_fixnum(arg_z)) 4213 __(bne local_label(set_not_fixnum_u32)) 4214 __(tst arg_z,#0x80000000) 4215 __(bne local_label(set_bad)) 4216 __(unbox_fixnum(imm1,arg_z)) 4217 local_label(set_set32): 4218 __(str imm1,[arg_x,imm0]) 4219 __(bx lr) 4220 local_label(set_not_fixnum_u32): 4221 __(extract_lisptag(imm1,arg_z)) 4222 __(cmp imm1,#tag_misc) 4223 __(bne local_label(set_bad)) 4224 __(movc16(imm2,one_digit_bignum_header)) 4225 __(getvheader(imm1,arg_z)) 4226 __(cmp imm1,imm2) 4227 __(bne local_label(set_not_1_digit_u32)) 4228 __(ldr imm1,[arg_z,#misc_data_offset]) 4229 __(cmp imm1,#0) 4230 __(bge local_label(set_set32)) 4231 __(b local_label(set_bad)) 4232 local_label(set_not_1_digit_u32): 4233 __(movc16(imm2,two_digit_bignum_header)) 4234 __(cmp imm1,imm2) 4235 __(bne local_label(set_bad)) 4236 __(vrefr(imm2,arg_z,1)) 4237 __(vrefr(imm1,arg_z,0)) 4238 __(cmp imm2,#0) 4239 __(beq local_label(set_set32)) 4240 local_label(set_bad): 4241 /* arg_z does not match the array-element-type of arg_x. */ 4242 __(mov arg_y,arg_z) 4243 __(mov arg_z,arg_x) 4244 __(mov arg_x,#XNOTELT) 4245 __(set_nargs(3)) 4246 __(b _SPksignalerr) 4247 local_label(misc_set_fixnum_vector): 4248 __(add imm0,arg_z,#misc_data_offset) 4249 __(test_fixnum(arg_z)) 4250 __(bne local_label(set_bad)) 4251 __(unbox_fixnum(imm1,arg_z)) 4252 __(str imm1,[arg_x,imm0]) 4253 __(bx lr) 4254 local_label(misc_set_new_string): 4255 __(add imm0,arg_z,#misc_data_offset) 4256 __(extract_lowbyte(imm2,arg_z)) 4257 __(cmp imm2,#subtag_character) 4258 __(bne local_label(set_bad)) 4259 __(unbox_character(imm1,arg_z)) 4260 __(str imm1,[arg_x,imm0]) 4261 __(bx lr) 4262 local_label(misc_set_s32): 4263 __(add imm0,arg_z,#misc_data_offset) 4264 __(test_fixnum(arg_z)) 4265 __(moveq imm1,arg_z,asr #fixnumshift) 4266 __(beq local_label(set_set32)) 4267 __(extract_lisptag(imm2,arg_z)) 4268 __(cmp imm2,#tag_misc) 4269 __(bne local_label(set_bad)) 4270 __(movc16(imm1,one_digit_bignum_header)) 4271 __(getvheader(imm2,arg_z)) 4272 __(cmp imm2,imm1) 4273 __(vrefr(imm1,arg_z,0)) 4274 __(beq local_label(set_set32)) 4275 __(b local_label(set_bad)) 4276 local_label(misc_set_single_float_vector): 4277 __(add imm0,arg_z,#misc_data_offset) 4278 __(extract_typecode(imm2,arg_z)) 4279 __(cmp imm2,#subtag_single_float) 4280 __(bne local_label(set_bad)) 4281 __(ldr imm1,[arg_z,#single_float.value]) 4282 __(str imm1,[arg_x,imm0]) 4283 __(bx lr) 4284 local_label(misc_set_u8): 4285 __(mov imm0,arg_y,lsr #2) 4286 __(add imm0,imm0,#misc_data_offset) 4287 __(mov imm2,#~(0xff<<fixnumshift)) 4288 __(tst arg_z,imm2) 4289 __(bne local_label(set_bad)) 4290 __(unbox_fixnum(imm1,arg_z)) 4291 __(strb imm1,[arg_x,imm0]) 4292 __(bx lr) 4293 local_label(misc_set_old_string): 4294 __(mov imm0,arg_y,lsr #2) 4295 __(add imm0,imm0,#misc_data_offset) 4296 __(extract_lowbyte(imm2,arg_z)) 4297 __(cmp imm2,#subtag_character) 4298 __(unbox_character(imm1,arg_z)) 4299 __(bne local_label(set_bad)) 4300 __(strb imm1,[arg_x,imm0]) 4301 __(bx lr) 4302 local_label(misc_set_s8): 4303 __(mov imm0,arg_y,lsr #2) 4304 __(add imm0,imm0,#misc_data_offset) 4305 __(test_fixnum(arg_z)) 4306 __(bne local_label(set_bad)) 4307 __(unbox_fixnum(imm1,arg_z)) 4308 __(mov imm2,imm1,lsl #32-8) 4309 __(cmp imm1,imm2,asr #32-8) 4310 __(bne local_label(set_bad)) 4311 __(strb imm1,[arg_x,imm0]) 4312 __(bx lr) 4313 local_label(misc_set_u16): 4314 __(mov imm0,arg_y,lsr #1) 4315 __(add imm0,imm0,#misc_data_offset) 4316 __(test_fixnum(arg_z)) 4317 __(bne local_label(set_bad)) 4318 __(unbox_fixnum(imm1,arg_z)) 4319 __(mov imm2,imm1,lsl #16) 4320 __(cmp imm1,imm2,lsr #16) 4321 __(bne local_label(set_bad)) 4322 __(strh imm1,[arg_x,imm0]) 4323 __(bx lr) 4324 local_label(misc_set_s16): 4325 __(mov imm0,arg_y,lsr #1) 4326 __(add imm0,imm0,#misc_data_offset) 4327 __(test_fixnum(arg_z)) 4328 __(bne local_label(set_bad)) 4329 __(unbox_fixnum(imm1,arg_z)) 4330 __(mov imm2,imm1,lsl #16) 4331 __(cmp imm1,imm2,asr #16) 4332 __(bne local_label(set_bad)) 4333 __(strh imm1,[arg_x,imm0]) 4334 __(bx lr) 4335 local_label(misc_set_bit_vector): 4336 __(bics imm0,arg_z,#fixnumone) 4337 __(bne local_label(set_bad)) 4338 __(mov imm2,#31) 4339 __(and imm2,imm1,arg_y,lsr #2) 4340 __(mov imm1,#1) 4341 __(mov imm1,imm1,lsl imm2) 4342 __(mov imm0,arg_y,lsr #fixnumshift+5) 4343 __(mov imm0,imm0,lsl #2) 4344 __(add imm0,imm0,#misc_data_offset) 4345 __(cmp arg_z,#0) 4346 __(ldr imm2,[arg_x,imm0]) 4347 __(orrne imm2,imm2,imm1) 4348 __(biceq imm2,imm2,imm1) 4349 __(str imm2,[arg_x,imm0]) 4350 __(bx lr) 4351 4352 local_label(misc_set_double_float_vector): 4353 __(extract_subtag(imm2,arg_z)) 4354 __(cmp imm2,#subtag_double_float) 4355 __(bne local_label(misc_set_bad)) 4356 __(ldrd imm0,imm1,[arg_z,#misc_dfloat_offset]) 4357 __(mov imm2,arg_y,lsl #1) 4358 __(add imm2,imm2,#misc_dfloat_offset) 4359 __(strd imm0,imm1,[arg_z,imm2]) 4360 __(bx lr) 4361 local_label(misc_set_invalid): 4362 __(mov temp0,#XSETBADVEC) 4363 __(set_nargs(4)) 4364 __(vpush1(temp0)) 4365 __(b _SPksignalerr) 4366 4367 _endfile -
branches/arm/lisp-kernel/arm-uuo.s
r13666 r13679 53 53 define(`unaryUUO',`UUO($1,uuo_format_unary,($2|($3<<4)))') 54 54 55 define(`binaryUUO',`UUO($1,uuo_format_binary,($2|($3<<4)|($4<<8)))') 56 55 57 /* Simple type error (reg not lisptag), cond = $1, reg = $2, lisptag = $3 */ 56 58 define(`uuo_error_reg_not_lisptag',`UUO($1,uuo_format_error_lisptag,$2|($3<<4))') … … 71 73 define(`uuo_gc_trap',`nullaryUUO($1,2)') /* probably unconditional */ 72 74 define(`uuo_debug_trap',`nullaryUUO($1,3)') 73 define(`uuo_tlb_too_small',`nullaryUUO($1,4)') 74 define(`uuo_interrupt_now',`nullaryUUO($1,5)') 75 define(`uuo_suspend_now',`nullaryUUO($1,6)') 75 76 77 define(`uuo_interrupt_now',`nullaryUUO($1,4)') 78 define(`uuo_suspend_now',`nullaryUUO($1,5)') 76 79 77 80 /* Unary UUOs */ … … 79 82 define(`uuo_cerror_unbound',`unaryUUO($1,$2,1)') 80 83 define(`uuo_error_not_callable',`unaryUUO($1,$2,2)') 84 define(`uuo_tlb_too_small',`unaryUUO($1,$2,4)') 81 85 82 86 /* Binary UUOs */ -
branches/arm/lisp-kernel/ppc-macros.s
r13337 r13679 602 602 __(sub allocptr,allocptr,$3) 603 603 __(alloc_trap()) 604 __(str($2, misc_header_offset(allocptr)))604 __(str($2,[allocptr,#misc_header_offset])) 605 605 __(mr $1,allocptr) 606 606 __(clear_alloc_tag())
Note:
See TracChangeset
for help on using the changeset viewer.
