Changeset 13679


Ignore:
Timestamp:
Apr 28, 2010, 3:31:40 AM (15 years ago)
Author:
Gary Byers
Message:

Inch forward.

Location:
branches/arm/lisp-kernel
Files:
5 edited

Legend:

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

    r13671 r13679  
    733733         _node(get_tcr)                 /* address of get_tcr() */
    734734        _ends
    735                
    736        
     735
     736/* extended type codes, for UUOs.  Shouldn't conflict with defined subtags */
     737
     738xtype_unsigned_byte_24 = 252
     739xtype_array2d = 248
     740xtype_array3d = 244
     741xtype_integer = 4
     742xtype_s64 = 8
     743xtype_u64 = 12
     744xtype_s32 = 16
     745xtype_u32 = 20
     746xtype_s16 = 24
     747xtype_u16 = 28
     748xtype_s8 = 32
     749xtype_u8 = 36
     750xtype_bit = 40                               
     751                                               
     752                       
     753                       
    737754INTERRUPT_LEVEL_BINDING_INDEX = fixnumone
  • branches/arm/lisp-kernel/arm-macros.s

    r13671 r13679  
    2020/* dnode_align(dest,src,delta) */
    2121        define(`dnode_align',`
    22         __(add $1,[$2,#(dnode_size-1)])
     22        __(add $1,$2,#$3+(dnode_size-1))
    2323        __(bic $1,$1,#((1<<dnode_align_bits)-1))
    2424')
     
    8080        ')
    8181
     82define(`unbox_character',`
     83        __(mov $1,$2, lsr #charcode_shift)
     84        ')
     85               
    8286define(`loaddf',`
    8387        __(lfd $1,dfloat.value($2))')
     
    135139                       
    136140define(`getvheader',`
    137         __(ldr($1,vector.header($2)))
     141        __(ldr $1,[$2,#vector.header])
    138142        ')
    139143       
     
    154158       
    155159define(`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])
    158162')
    159163
     
    163167        __(ldr $1,[$1,#((nrs.$2)+(symbol.vcell))])
    164168')
     169
     170/* This approach may not work if the symbol is too far from nil */       
     171define(`ref_nrs_symbol',`
     172        __(mov $1,#nil_value)
     173        __(add $1,$1,#nrs.$2)
     174        ')
    165175       
    166176define(`set_nrs_value',`
     
    253263')
    254264
     265define(`trap_unless_fixnum',`
     266        __(test_fixnum($1))
     267        __(uuo_error_reg_not_lisptag(ne,$1,tag_fixnum))
     268        ')
     269               
    255270define(`trap_unless_fulltag_equal',`
    256271        __(extract_fulltag($3,$1))
    257         __(trnei($3,$2))
     272        __(cmp $3,#$2)
     273        __(uuo_error_reg_not_fulltag(ne,$1,$2))
    258274')
    259275       
    260276define(`trap_unless_typecode_equal',`
    261277        __(extract_typecode($3,$1))
    262         __(trnei($3,$2))
     278        __(cmp $3,#$2)
     279        __(uuo_error_reg_not_xtype(ne,$2))
    263280')
    264281       
     
    366383
    367384/* $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.
    370386/* $3 = register containing size in bytes.  (We're going to subtract */
    371387/* fulltag_misc from this; do it in the macro body, rather than force the
     
    374390
    375391define(`Misc_Alloc',`
    376         __(la $3,-fulltag_misc($3))
     392        __(sub $3,$3,#fulltag_misc)
    377393        __(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)
    381399        __(clear_alloc_tag())
    382400')
     
    501519')             
    502520
     521define(`check_enabled_pending_interrupt',`
     522        __(ldr $1,[rcontext,#tcr.interrupt_pending])
     523        __(cmp $1,0)
     524        __(uuo_interrupt_now(gt))
     525        ')
     526       
    503527define(`check_pending_interrupt',`
    504528        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))
    513534macro_label(done):
    514535')
     
    520541        __(uuo_suspend_now(al))
    521542')
     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. */
     546define(`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)
     569macro_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  
    1414
    1515
    16        
     16
    1717        include(lisp.s)
    1818        _beginfile
    19         .align 2
    20         .arm
    21         .syntax unified
    22        
     19        .align 2
     20        .arm
     21        .syntax unified
     22
    2323local_label(start):
    24         .set sporg,0       
     24        .set sporg,0       
    2525define(`_spentry',`ifdef(`__func_name',`_endfn',`')
    26         .org sporg
     26        .org sporg
    2727        _exportfn(_SP$1)
    28         .set sporg,sporg+256       
     28        .set sporg,sporg+256       
    2929        .line  __line__
    3030')
    3131
    32              
     32
    3333define(`_endsubp',`
    3434        _endfn(_SP$1)
     
    3737
    3838
    39                        
    40                
     39       
     40
    4141define(`jump_builtin',`
    4242        ref_nrs_value(fname,builtin_functions)
     
    4545        jump_fname()
    4646')
    47        
     47
    4848_spentry(jmpsym)
    4949        __(jump_fname())
    50        
     50
    5151_spentry(jmpnfn)
    5252        __(jump_nfn())
    53        
     53
    5454        /*  Call nfn if it's either a symbol or function */
    5555_spentry(funcall)
    5656        __(funcall_nfn())
    57        
     57
    5858/* Subprims for catch, throw, unwind_protect.  */
    5959
     
    6262        __(mov imm2,#0)
    6363        __(mkcatch())
    64         __(bx lr)
    65        
     64        __(bx lr)
     65
    6666_spentry(mkunwind)
    6767        __(mov arg_z,#unbound_marker)
     
    6969        __(mkcatch())
    7070        __(bx lr)
    71        
     71
    7272_spentry(mkcatchmv)
    7373        __(mov imm2,#fixnum_one)
    7474        __(mkcatch())
    75         __(bx lr)
     75        __(bx lr)
    7676
    7777/* This never affects the symbol's vcell  */
    7878/* Non-null symbol in arg_y, new value in arg_z          */
    7979_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)
    95959:
    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)
    100100
    101101_spentry(conslist)
    102102        __(mov arg_z,#nil_value)
    103         __(cmp nargs,#0)
    104         __(b 2f)       
     103        __(cmp nargs,#0)
     104        __(b 2f) 
    1051051:
    106         __(vpop1(arg_y))
     106        __(vpop1(arg_y))
    107107        __(Cons(arg_z,arg_z,arg_z))
    108108        __(subs nargs,nargs,#fixnum_one)
     
    110110        __(bne 1b)
    111111        __(bx lr)
    112        
     112
    113113/* do list*: last arg in arg_z, all others vpushed, nargs set to #args vpushed.  */
    114114/* Cons, one cons cell at at time.  Maybe optimize this later.  */
    115        
     115
    116116_spentry(conslist_star)
    117         __(cmp nargs,#0)
    118         __(b 2f)       
     117        __(cmp nargs,#0)
     118        __(b 2f) 
    1191191:
    120120        __(vpop1(arg_y))
     
    124124        __(bne 1b)
    125125        __(bx lr)
    126        
     126
    127127_spentry(makes32)
    128         __(adds imm1,imm0,imm0)
     128        __(adds imm1,imm0,imm0)
    129129        __(addsvc arg_z,imm1,imm1)
    130130        __(bxvc lr)
     
    136136/* Construct a lisp integer out of the 32-bit unsigned value in imm0 */
    137137
    138        
     138
    139139_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)))
    147147        __(str imm0,[arg_z,#misc_data_offset])
    148148        __(bx lr)
     
    153153        __(bx lr)
    154154
    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. */
    157158/* Make a bignum out of it. */
    158159
    159160_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)
    163164
    164165_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)
    1701711:
    171172        __(jump_builtin(_builtin_plus,2))
    172        
     173
    173174_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)
    1791801:
    180181        __(jump_builtin(_builtin_minus,2))
     
    182183/*  Construct a lisp integer out of the 64-bit unsigned value in */
    183184/*           imm0 (low 32 bits) and imm1 (high 32 bits) */
    184                
     185       
    185186_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))
    190191        __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(2)))
    191192        __(str imm0,[arg_z,#misc_data_offset])
     
    193194        __(bx lr)
    1941953:             
    195         __(movc16(imm2,three_digit_bignum_header))
     196        __(movc16(imm2,three_digit_bignum_header))
    196197        __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(3)))
    197198        __(str imm0,[arg_z,#misc_data_offset])
     
    202203/*        imm0 (low 32 bits) and imm1 (high 32 bits). */
    203204_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 */
    206207        __(movc16(imm2,two_digit_bignum_header))
    207208        __(Misc_Alloc_Fixed(arg_z,imm2,aligned_bignum_size(2)))
     
    209210        __(str imm1,[arg_z,#misc_data_offset+4])
    210211        __(bx lr)
    211        
     212
    212213_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
     2291: __(jump_builtin(_builtin_times,2))
    229230
    230231_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)       
    2372381:
    238239        __(jump_builtin(_builtin_eq,2))
    239240
    240241_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)
    246247        __(bx lr)
    2472481:
     
    249250
    250251_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)
    256257        __(bx lr)
    2572581:
     
    259260
    260261_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)
    266267        __(bx lr)
    2672681:
     
    269270
    270271_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)
    276277        __(bx lr)
    2772781:
     
    279280
    280281_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)
    286287        __(bx lr)
    2872881:
     
    290291/* funcall nfn, returning multiple values if it does.  */
    291292_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)
    295296        __(build_lisp_frame(temp1,imm0))
    296         __(adr lr,C(ret1valn))
     297        __(adr lr,C(ret1valn))
    297298        __(mov fn,#0)
    298299        __(funcall_nfn())
     
    303304
    304305_exportfn(C(ret1valn))
    305         __(restore_lisp_frame(imm0))
     306        __(restore_lisp_frame(imm0))
    306307        __(vpush1(arg_z))
    307308        __(set_nargs(1))
     
    336337        __(cmp nargs,#fixnum_one) /* sadly, a very common case  */
    337338        __(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)
    3423434:
    343344        __(blt 6f)
     
    353354        __(bx lr)
    354355
    355        
     356
    356357/* Come here with saved context on top of stack.  */
    357358_spentry(nvalret)
    358359        .globl C(nvalret)
    359 C(nvalret):     
     360C(nvalret): 
    360361        __(ldr lr,[sp,#lisp_frame.savelr])
    361362        __(ldr temp0,[sp,#lisp_frame.savevsp])
    362363        __(ldr fn,[sp,#lisp_frame.savefn])
    363364        __(discard_lisp_frame())
    364         __(b local_label(return_values))
    365                                                
    366        
     365        __(b local_label(return_values))                         
     366
    367367dnl /* Caller has pushed tag and 0 or more values; nargs = nvalues.  */
    368368dnl /* Otherwise, process unwind-protects and throw to indicated catch frame.  */
    369369dnl
    370370dnl _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))
     371dnl  __(ldr imm1,[rcontext, #tcr.catch_top])
     372dnl  __(mov imm0,#0) /* count intervening catch/unwind-protect frames.  */
     373dnl  __(cmpri(cr0,imm1,0))
     374dnl  __(ldr temp0,[vsp,nargs])
     375dnl  __(beq- cr0,local_label(_throw_tag_not_found))
    376376dnl 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))
     377dnl  __(ldr temp1,[imm1,#catch_frame.catch_tag])
     378dnl  __(cmpr(cr0,temp0,temp1))
     379dnl  __(mov imm2,imm1)
     380dnl  __(ldr imm1,[imm1,#catch_frame.link])
     381dnl  __(cmpri(cr1,imm1,0))
     382dnl  __(beq cr0,local_label(_throw_found))
     383dnl  __(addi imm0,imm0,fixnum_one)
     384dnl  __(beq- cr1,local_label(_throw_tag_not_found))
     385dnl  __(b local_label(_throw_loop))
    386386dnl /* imm2: (tstack-consed) target catch frame, imm0: count of intervening  */
    387387dnl /* frames. If target isn't a multiple-value receiver, discard extra values */
    388388dnl /* (less hair, maybe.)  */
    389389dnl 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))
     390dnl  __(ldr imm1,[imm2,#catch_frame.mvflag])
     391dnl  __(cmpri(cr0,imm1,0))
     392dnl  __(cmpri(cr1,nargs,0))
     393dnl  __(mov fn,#0)
     394dnl  __(add imm1,vsp,nargs)
     395dnl  __(add imm1,[imm1,#-node_size])
     396dnl  __(bne cr0,local_label(_throw_all_values))
     397dnl  __(set_nargs(1))
     398dnl  __(beq cr1,local_label(_throw_default_1_val))
     399dnl  __(mov vsp,imm1)
     400dnl  __(b local_label(_throw_all_values))
    401401dnl local_label(_throw_default_1_val):
    402 dnl     __(mov imm4,#nil_value)
    403 dnl     __(vpush1(imm4))
     402dnl  __(mov imm4,#nil_value)
     403dnl  __(vpush1(imm4))
    404404dnl 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))
     405dnl  __(bl _SPnthrowvalues)
     406dnl  __(ldr imm3,[rcontext,#tcr.catch_top])
     407dnl  __(ldr imm1,[rcontext,#tcr.db_link])
     408dnl  __(ldr imm0,[imm3,#catch_frame.db_link])
     409dnl  __(ldr imm4,[imm3,#catch_frame.mvflag])
     410dnl  __(cmpr(cr0,imm0,imm1))
     411dnl  __(cmpri(cr1,imm4,0))
     412dnl  __(add tsp,[imm3,#-((tsp_frame.fixed_overhead+fulltag_misc))])
     413dnl  __(beq cr0,local_label(_throw_dont_unbind))
    414414dnl         __(bl _SPunbind_to)
    415415dnl 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))
     416dnl  __(add imm0,vsp,nargs)
     417dnl  __(cmpri(cr0,nargs,0))
     418dnl  __(ldr imm1,[imm3,#catch_frame.csp])
     419dnl  __(ldr imm1,[imm1,#lisp_frame.savevsp])
     420dnl  __(bne cr1,local_label(_throw_multiple))
    421421dnl         /* Catcher expects single value in arg_z  */
    422 dnl     __(ldr arg_z,[imm0,#-node_size])
    423 dnl     __(b local_label(_throw_pushed_values))
     422dnl  __(ldr arg_z,[imm0,#-node_size])
     423dnl  __(b local_label(_throw_pushed_values))
    424424dnl local_label(_throw_multiple):
    425 dnl     __(beq cr0,local_label(_throw_pushed_values))
    426 dnl     __(mov imm2,nargs)
     425dnl  __(beq cr0,local_label(_throw_pushed_values))
     426dnl  __(mov imm2,nargs)
    427427dnl 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))
     428dnl  __(subi imm2,imm2,fixnum_one)
     429dnl  __(cmpri(imm2,0))
     430dnl  __(ldru(temp0,-node_size(imm0)))
     431dnl  __(push(temp0,imm1))
     432dnl  __(bgt local_label(_throw_mvloop))
    433433dnl 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)
     434dnl  __(mov vsp,imm1)
     435dnl  __(ldr imm1,[imm3,#catch_frame.xframe])
     436dnl  __(str(imm1,tcr.xframe(rcontext)))
     437dnl  __(ldr sp,[imm3,#catch_frame.csp])
     438dnl  __(ldr fn,[sp,#lisp_frame.savefn])
     439dnl  __(ldr loc_pc,[sp,#lisp_frame.savelr])
     440dnl  __(discard_lisp_frame())
     441dnl  __(mtlr loc_pc)
    442442dnl         __(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)
     443dnl  __(ldr imm3,[imm3,#catch_frame.link])
     444dnl  __(str(imm3,tcr.catch_top(rcontext)))
     445dnl  __(unlink(tsp))
     446dnl  __(bx lr)
    447447dnl 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)
     448dnl  __(uuo_interr(error_throw_tag_missing,temp0))
     449dnl  __(strux(temp0,vsp,nargs))
     450dnl  __(b _SPthrow)
    451451dnl
    452452dnl
     
    454454dnl _spentry(nthrowvalues)
    455455dnl         __(mov imm1,#1)
    456 dnl     __(mov imm4,imm0)
     456dnl  __(mov imm4,imm0)
    457457dnl         __(str(imm1,tcr.unwinding(rcontext)))
    458458dnl 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)
     459dnl  __(subi imm4,imm4,fixnum_one)
     460dnl  __(cmpri(cr1,imm4,0))
     461dnl  __(ldr temp0,[rcontext,#tcr.catch_top])
     462dnl  __(ldr imm1,[rcontext,#tcr.db_link])
     463dnl  __(blt cr1,local_label(_nthrowv_done))
     464dnl  __(ldr imm0,[temp0,#catch_frame.db_link])
     465dnl  __(ldr imm3,[temp0,#catch_frame.link])
     466dnl  __(cmpr(cr0,imm0,imm1))
     467dnl  __(str(imm3,tcr.catch_top(rcontext)))
     468dnl  __(ldr temp1,[temp0,#catch_frame.catch_tag])
     469dnl  __(cmpri(cr7,temp1,unbound_marker))  /* unwind-protect ?  */
     470dnl  __(ldr first_nvr,[temp0,#catch_frame.xframe])
     471dnl  __(str(first_nvr,tcr.xframe(rcontext)))
     472dnl  __(ldr sp,[temp0,#catch_frame.csp])
     473dnl  __(beq cr0,local_label(_nthrowv_dont_unbind))
     474dnl  __(mflr loc_pc)
    475475dnl         __(bl _SPunbind_to)
    476 dnl     __(mtlr loc_pc)
     476dnl  __(mtlr loc_pc)
    477477dnl local_label(_nthrowv_dont_unbind):
    478 dnl     __(beq cr7,local_label(_nthrowv_do_unwind))
     478dnl  __(beq cr7,local_label(_nthrowv_do_unwind))
    479479dnl /* 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))
     480dnl  __(bne cr1,local_label(_nthrowv_skip))
     481dnl  __(ldr imm0,[sp,#lisp_frame.savevsp])
     482dnl  __(str(rzero,lisp_frame.savevsp(sp))) /* marker for stack overflow code  */
     483dnl  __(add imm1,vsp,nargs)
     484dnl  __(mov imm2,nargs)
     485dnl  __(b local_label(_nthrowv_push_test))
    486486dnl local_label(_nthrowv_push_loop):
    487 dnl     __(ldru(temp1,-node_size(imm1)))
    488 dnl     __(push(temp1,imm0))
     487dnl  __(ldru(temp1,-node_size(imm1)))
     488dnl  __(push(temp1,imm0))
    489489dnl 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)
     490dnl  __(cmpri(imm2,0))
     491dnl  __(subi imm2,imm2,fixnum_one)
     492dnl  __(bne local_label(_nthrowv_push_loop))
     493dnl  __(mov vsp,imm0)
    494494dnl         __(restore_catch_nvrs(temp0))
    495495dnl
    496496dnl 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))
     497dnl  __(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0))
     498dnl  __(unlink(tsp))
     499dnl  __(discard_lisp_frame())
     500dnl  __(b local_label(_nthrowv_nextframe))
    501501dnl local_label(_nthrowv_do_unwind):
    502502dnl         /* This is harder.  Call the cleanup code with the multiple */
    503 dnl     /* values (and nargs, which is a fixnum.)  Remember the throw count  */
     503dnl  /* values (and nargs, which is a fixnum.)  Remember the throw count  */
    504504dnl         /* (also a fixnum) as well.  */
    505505dnl         /* Save our caller's LR and FN in the csp frame created by the unwind-  */
    506506dnl         /* protect.  (Clever, eh ?)  */
    507 dnl     __(ldr first_nvr,[temp0,#catch_frame.xframe])
    508 dnl     __(str(first_nvr,tcr.xframe(rcontext)))
     507dnl  __(ldr first_nvr,[temp0,#catch_frame.xframe])
     508dnl  __(str(first_nvr,tcr.xframe(rcontext)))
    509509dnl         __(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))
     510dnl  __(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0))
     511dnl  __(unlink(tsp))
     512dnl  __(ldr loc_pc,[sp,#lisp_frame.savelr])
     513dnl  __(ldr nfn,[sp,#lisp_frame.savefn])
     514dnl  __(mtctr loc_pc) /* cleanup code address.  */
     515dnl  __(str(fn,lisp_frame.savefn(sp)))
     516dnl  __(mflr loc_pc)
     517dnl  __(mov fn,nfn)
     518dnl  __(str(loc_pc,lisp_frame.savelr(sp)))
     519dnl  __(dnode_align(imm0,nargs,tsp_frame.fixed_overhead+(2*node_size))) /* tsp overhead, nargs, throw count  */
     520dnl  __(TSP_Alloc_Var_Boxed_nz(imm0,imm1))
     521dnl  __(mov imm2,nargs)
     522dnl  __(add imm1,nargs,vsp)
     523dnl  __(la imm0,tsp_frame.data_offset(tsp))
     524dnl  __(str(nargs,0(imm0)))
     525dnl  __(b local_label(_nthrowv_tpushtest))
    526526dnl 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)
     527dnl  __(ldru(temp0,-node_size(imm1)))
     528dnl  __(stru(temp0,node_size(imm0)))
     529dnl  __(subi imm2,imm2,fixnum_one)
    530530dnl 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])
     531dnl  __(cmpri(imm2,0))
     532dnl  __(bne local_label(_nthrowv_tpushloop))
     533dnl  __(stru(imm4,node_size(imm0)))
     534dnl  __(ldr vsp,[sp,#lisp_frame.savevsp])
    535535dnl         /* Interrupts should be disabled here (we're calling and returning */
    536536dnl         /* from the cleanup form.  Clear the tcr.unwinding flag, so that */
    537537dnl         /* interrupts can be taken if they're enabled in the cleanup form.  */
    538538dnl         __(str(rzero,tcr.unwinding(rcontext)))       
    539 dnl     __(bctrl)
     539dnl  __(bctrl)
    540540dnl         __(mov imm1,#1)
    541 dnl     __(la imm0,tsp_frame.data_offset(tsp))
     541dnl  __(la imm0,tsp_frame.data_offset(tsp))
    542542dnl         __(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))
     543dnl  __(ldr fn,[sp,#lisp_frame.savefn])
     544dnl  __(ldr loc_pc,[sp,#lisp_frame.savelr])
     545dnl  __(discard_lisp_frame())
     546dnl  __(mtlr loc_pc)
     547dnl  __(ldr nargs,[imm0,#0])
     548dnl  __(mov imm2,nargs)
     549dnl  __(b local_label(_nthrowv_tpoptest))
    550550dnl local_label(_nthrowv_tpoploop):
    551 dnl     __(ldru(temp0,node_size(imm0)))
    552 dnl     __(vpush1(temp0))
    553 dnl     __(subi imm2,imm2,fixnum_one)
     551dnl  __(ldru(temp0,node_size(imm0)))
     552dnl  __(vpush1(temp0))
     553dnl  __(subi imm2,imm2,fixnum_one)
    554554dnl 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))
     555dnl  __(cmpri(imm2,0))
     556dnl  __(bne local_label(_nthrowv_tpoploop))
     557dnl  __(ldr imm4,[imm0,#node_size])
     558dnl  __(unlink(tsp))
     559dnl  __(b local_label(_nthrowv_nextframe))
    560560dnl local_label(_nthrowv_done):
    561561dnl         __(str(rzero,tcr.unwinding(rcontext)))
     
    573573dnl _spentry(nthrow1value)
    574574dnl         __(mov imm1,#1)
    575 dnl     __(mov imm4,imm0)
     575dnl  __(mov imm4,imm0)
    576576dnl         __(str(imm1,tcr.unwinding(rcontext)))
    577577dnl 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)))
     578dnl  __(subi imm4,imm4,fixnum_one)
     579dnl  __(cmpri(cr1,imm4,0))
     580dnl  __(ldr temp0,[rcontext,#tcr.catch_top])
     581dnl  __(ldr imm1,[rcontext,#tcr.db_link])
     582dnl  __(set_nargs(1))
     583dnl  __(blt cr1,local_label(_nthrow1v_done))
     584dnl  __(ldr imm3,[temp0,#catch_frame.link])
     585dnl  __(ldr imm0,[temp0,#catch_frame.db_link])
     586dnl  __(cmpr(cr0,imm0,imm1))
     587dnl  __(str(imm3,tcr.catch_top(rcontext)))
    588588dnl         __(ldr imm3,[temp0,#catch_frame.xframe])
    589 dnl     __(ldr temp1,[temp0,#catch_frame.catch_tag])
    590 dnl     __(cmpri(cr7,temp1,unbound_marker))             /* unwind-protect ?  */
     589dnl  __(ldr temp1,[temp0,#catch_frame.catch_tag])
     590dnl  __(cmpri(cr7,temp1,unbound_marker))  /* unwind-protect ?  */
    591591dnl         __(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)
     592dnl  __(ldr sp,[temp0,#catch_frame.csp])
     593dnl  __(beq cr0,local_label(_nthrow1v_dont_unbind))
     594dnl   __(mflr loc_pc)
    595595dnl          __(bl _SPunbind_to)
    596 dnl     __(mtlr loc_pc)
     596dnl   __(mtlr loc_pc)
    597597dnl local_label(_nthrow1v_dont_unbind):
    598 dnl     __(beq cr7,local_label(_nthrow1v_do_unwind))
     598dnl  __(beq cr7,local_label(_nthrow1v_do_unwind))
    599599dnl         /* 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])
     600dnl  __(bne cr1,local_label(_nthrow1v_skip))
     601dnl  __(ldr vsp,[sp,#lisp_frame.savevsp])
    602602dnl         __(restore_catch_nvrs(temp0))
    603603dnl 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))
     604dnl  __(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0))
     605dnl  __(unlink(tsp))
     606dnl  __(discard_lisp_frame())
     607dnl  __(b local_label(_nthrow1v_nextframe))
    608608dnl local_label(_nthrow1v_do_unwind):
    609609dnl         /* This is harder, but not as hard (not as much BLTing) as the  */
     
    613613dnl
    614614dnl         __(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])
     615dnl  __(la tsp,-(tsp_frame.fixed_overhead+fulltag_misc)(temp0))
     616dnl  __(unlink(tsp))
     617dnl  __(ldr loc_pc,[sp,#lisp_frame.savelr])
     618dnl  __(ldr nfn,[sp,#lisp_frame.savefn])
     619dnl  __(mtctr loc_pc)  /* cleanup code address.  */
     620dnl  __(str(fn,lisp_frame.savefn(sp)))
     621dnl  __(mflr loc_pc)
     622dnl  __(mov fn,nfn)
     623dnl  __(str(loc_pc,lisp_frame.savelr(sp)))
     624dnl  __(TSP_Alloc_Fixed_Boxed(2*node_size)) /* tsp overhead, value, throw count  */
     625dnl  __(str(arg_z,tsp_frame.data_offset(tsp)))
     626dnl  __(str(imm4,tsp_frame.data_offset+node_size(tsp)))
     627dnl  __(ldr vsp,[sp,#lisp_frame.savevsp])
    628628dnl         __(str(rzero,tcr.unwinding(rcontext)))
    629 dnl     __(bctrl)
     629dnl  __(bctrl)
    630630dnl         __(mov imm1,#1)
    631 dnl     __(ldr arg_z,[tsp,#tsp_frame.data_offset])
     631dnl  __(ldr arg_z,[tsp,#tsp_frame.data_offset])
    632632dnl         __(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))
     633dnl  __(ldr imm4,[tsp,#tsp_frame.data_offset+node_size])
     634dnl  __(ldr fn,[sp,#lisp_frame.savefn])
     635dnl  __(ldr loc_pc,[sp,#lisp_frame.savelr])
     636dnl  __(discard_lisp_frame())
     637dnl  __(mtlr loc_pc)
     638dnl  __(unlink(tsp))
     639dnl  __(b local_label(_nthrow1v_nextframe))
    640640dnl local_label(_nthrow1v_done):
    641641dnl         __(str(rzero,tcr.unwinding(rcontext)))
     
    644644dnl         __(check_pending_interrupt())
    645645dnl         __(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)
     6679:      __(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)
     6999:      __(mov arg_y,#XSYMNOBIND)
     700        __(set_nargs(2))
     701        __(b _SPksignalerr)
    718702dnl
    719703dnl
     
    735719dnl /* threads are suspended.) */
    736720dnl /* We can unconditionally set the suspended thread's PC to its LR. */
    737 dnl    
     721dnl  
    738722dnl         .globl C(egc_write_barrier_start)
    739723dnl _spentry(rplaca)
     
    768752dnl C(egc_rplacd):
    769753dnl         __(cmplr(cr2,arg_z,arg_y))
    770 dnl     __(_rplacd(arg_y,arg_z))
     754dnl  __(_rplacd(arg_y,arg_z))
    771755dnl         __(blelr cr2)
    772756dnl         __(ref_global(imm2,ref_base))
     
    792776dnl         __(bx lr)
    793777dnl
    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 dnl C(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)
     782C(egc_gvset):
    799783dnl         __(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)
    802787dnl         __(blelr cr2)
    803788dnl         __(add imm0,imm0,arg_x)
     
    875860dnl         
    876861dnl /*
    877 dnl    Interrupt handling (in pc_luser_xp()) notes:     
     862dnl    Interrupt handling (in pc_luser_xp()) notes: 
    878863dnl    If we are in this function and before the test which follows the
    879864dnl    conditional (at egc_store_node_conditional), or at that test
     
    886871dnl    body of the next subprim (and at or beyond 'egc_write_barrier_end').
    887872dnl
    888 dnl    N.B:     it's not possible to really understand what's going on just
     873dnl    N.B: it's not possible to really understand what's going on just
    889874dnl    by the state of the cr0`eq' bit.  A transient failure in the
    890875dnl    conditional stores that handle memoization might clear cr0`eq'
     
    903888dnl         __(bne cr1,5f)
    904889dnl         __(strcx(arg_z,arg_x,imm4))
    905 dnl     .globl C(egc_store_node_conditional_test)
    906 dnl C(egc_store_node_conditional_test): 
     890dnl  .globl C(egc_store_node_conditional_test)
     891dnl C(egc_store_node_conditional_test): 
    907892dnl         __(bne 1b)
    908893dnl         __(isync)
     
    932917dnl    we have to do more work to actually do the memoization.*/
    933918dnl _spentry(set_hash_key_conditional)
    934 dnl     .globl C(egc_set_hash_key_conditional)
     919dnl  .globl C(egc_set_hash_key_conditional)
    935920dnl 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 */         
     921dnl  __(cmplr(cr2,arg_z,arg_x))
     922dnl  __(vpop(imm4))
     923dnl  __(unbox_fixnum(imm4,imm4))
     924dnl 1: __(lrarx(temp1,arg_x,imm4))
     925dnl  __(cmpr(cr1,temp1,arg_y))
     926dnl  __(bne cr1,5f)
     927dnl  __(strcx(arg_z,arg_x,imm4))
     928dnl  .globl C(egc_set_hash_key_conditional_test)
     929dnl C(egc_set_hash_key_conditional_test): 
     930dnl  __(bne 1b)
     931dnl  __(isync)
     932dnl  __(add imm0,imm4,arg_x)
     933dnl  __(ref_global(imm2,ref_base))
     934dnl  __(ref_global(imm1,oldspace_dnode_count))
     935dnl  __(sub imm0,imm0,imm2)
     936dnl  __(load_highbit(imm3))
     937dnl  __(srri(imm0,imm0,dnode_shift))
     938dnl  __(cmplr(imm0,imm1))
     939dnl  __(extract_bit_shift_count(imm2,imm0))
     940dnl  __(srri(imm0,imm0,bitmap_shift))
     941dnl  __(srr(imm3,imm3,imm2))
     942dnl  __(ref_global(imm2,refbits))
     943dnl  __(bge 4f)
     944dnl  __(slri(imm0,imm0,word_shift))
     945dnl 2: __(lrarx(imm1,imm2,imm0))
     946dnl  __(or imm1,imm1,imm3)
     947dnl  __(strcx(imm1,imm2,imm0))
     948dnl  __(bne- 2b)
     949dnl  __(isync)
     950dnl  /* Memoize hash table header */ 
    966951dnl         __(ref_global(imm1,ref_base))
    967952dnl         __(sub imm0,arg_x,imm1)
     
    981966dnl         __(isync)
    982967dnl C(egc_write_barrier_end):
    983 dnl 4:  __(mov arg_z,#t_value)
    984 dnl     __(bx lr)
     968dnl 4: __(mov arg_z,#t_value)
     969dnl  __(bx lr)
    985970dnl 5:      __(mov imm0,#RESERVATION_DISCHARGE)
    986971dnl         __(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     
     972dnl  __(mov arg_z,#nil_value)
     973dnl  __(bx lr)
     974dnl 
     975dnl 
    1062976dnl         
    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     
     977dnl 
     978dnl
     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)
     984C(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)
     9971:      __(str imm1,[temp1,#-node_size]!)
     998        __(str imm1,[temp1,#-node_size]!)
     9992:      __(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)
     10051:      __(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)
     10114:
     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)
     10331:      __(str temp2,[temp1,#-node_size]!)
     1034        __(str temp2,[temp1,#-node_size]!)
     10352:      __(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)
     10423:      __(vpop1(arg_y))
     1043        __(str arg_y,[imm1,#-node_size]!)
     1044        __(sub nargs,nargs,#node_size)
     10454:      __(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
    10751060dnl _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    
     1061dnl  /* Error if arg_z isn't a proper list.  That's unlikely, */
     1062dnl  /* but it's better to check now than to crash later. */
     1063dnl  
     1064dnl  __(cmpri(arg_z,nil_value))
     1065dnl  __(mov arg_x,arg_z) /* fast  */
     1066dnl  __(mov temp1,arg_z) /* slow  */
     1067dnl  __(beq 9f)  /* Null list is proper  */
     1068dnl 0: 
     1069dnl  __(trap_unless_list(arg_x,imm0))
     1070dnl  __(_cdr(temp2,arg_x)) /* (null (cdr fast)) ?  */
     1071dnl  __(cmpri(cr3,temp2,nil_value))
     1072dnl  __(trap_unless_list(temp2,imm0,cr0))
     1073dnl  __(_cdr(arg_x,temp2))
     1074dnl  __(beq cr3,9f)
     1075dnl  __(_cdr(temp1,temp1))
     1076dnl  __(cmpr(arg_x,temp1))
     1077dnl  __(bne 0b)
     1078dnl  __(mov arg_y,#XIMPROPERLIST)
     1079dnl  __(set_nargs(2))
     1080dnl  __(b _SPksignalerr)
     1081dnl 9: /* Whew  */
     1082dnl  
    10981083dnl         /* Next, determine the length of arg_y.  We  */
    10991084dnl         /* know that it's a proper list.  */
    1100 dnl     __(mov imm0,#-node_size)
    1101 dnl     __(mov arg_x,arg_y)
     1085dnl  __(mov imm0,#-node_size)
     1086dnl  __(mov arg_x,arg_y)
    11021087dnl 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)
     1088dnl  __(cmpri(cr0,arg_x,nil_value))
     1089dnl  __(la imm0,node_size(imm0))
     1090dnl  __(_cdr(arg_x,arg_x))
     1091dnl  __(bne 1b)
     1092dnl  /* imm0 is now (boxed) triplet count.  */
     1093dnl  /* Determine word count, add 1 (to align), and make room.  */
     1094dnl  /* if count is 0, make an empty tsp frame and exit  */
     1095dnl  __(cmpri(cr0,imm0,0))
     1096dnl  __(add imm1,imm0,imm0)
     1097dnl  __(add imm1,imm1,imm0)
    11131098dnl         __(dnode_align(imm1,imm1,node_size))
    1114 dnl     __(bne+ cr0,2f)
    1115 dnl     __(TSP_Alloc_Fixed_Boxed(2*node_size))
    1116 dnl     __(bx lr)
     1099dnl  __(bne+ cr0,2f)
     1100dnl   __(TSP_Alloc_Fixed_Boxed(2*node_size))
     1101dnl   __(bx lr)
    11171102dnl 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])
     1103dnl  __(la imm1,tsp_frame.fixed_overhead(imm1)) /* tsp header  */
     1104dnl  __(TSP_Alloc_Var_Boxed_nz(imm1,imm2))
     1105dnl  __(str(imm0,tsp_frame.data_offset(tsp)))
     1106dnl  __(ldr imm2,[tsp,#tsp_frame.backlink])
     1107dnl  __(mov arg_x,arg_y)
     1108dnl  __(ldr imm1,[rcontext,#tcr.db_link])
    11241109dnl         __(ldr imm3,[rcontext,#tcr.tlb_limit])
    11251110dnl 3:
    11261111dnl         __(cmpri(cr1,arg_z,nil_value))
    1127 dnl     __(_car(temp0,arg_x))
     1112dnl  __(_car(temp0,arg_x))
    11281113dnl         __(ldr imm0,[temp0,#symbol.binding_index])
    1129 dnl     __(_cdr(arg_x,arg_x))
     1114dnl  __(_cdr(arg_x,arg_x))
    11301115dnl         __(trlle(imm3,imm0))
    11311116dnl         __(ldr imm4,[rcontext,#tcr.tlb_pointer]) /* Need to reload after trap  */
    11321117dnl         __(ldrx(temp3,imm4,imm0))
    1133 dnl     __(cmpri(cr0,arg_x,nil_value))
     1118dnl  __(cmpri(cr0,arg_x,nil_value))
    11341119dnl         __(mov temp2,#unbound_marker)
    11351120dnl         __(beq cr1,4f)
    1136 dnl     __(_car(temp2,arg_z))
    1137 dnl     __(_cdr(arg_z,arg_z))
     1121dnl  __(_car(temp2,arg_z))
     1122dnl  __(_cdr(arg_z,arg_z))
    11381123dnl 4:      __(push(temp3,imm2))
    1139 dnl     __(push(imm0,imm2))
    1140 dnl     __(push(imm1,imm2))
     1124dnl  __(push(imm0,imm2))
     1125dnl  __(push(imm1,imm2))
    11411126dnl         __(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     
     1127dnl  __(mov imm1,imm2)
     1128dnl  __(bne cr0,3b)
     1129dnl  __(str(imm2,tcr.db_link(rcontext)))
     1130dnl  __(bx lr)
     1131dnl
     1132dnl 
     1133       
    11481134dnl /* Allocate a miscobj on the temp stack.  (Push a frame on the tsp and  */
    11491135dnl /* heap-cons the object if there's no room on the tstack.)  */
    11501136dnl _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)
     1137dnl   __(rlwinm. imm2,arg_y,32-fixnumshift,0,(8+fixnumshift)-1)
     1138dnl   __(unbox_fixnum(imm0,arg_z))
     1139dnl   __(extract_fulltag(imm1,imm0))
     1140dnl   __(bne- cr0,9f)
     1141dnl   __(cmpri(cr0,imm1,fulltag_nodeheader))
     1142dnl   __(mov imm3,imm0)
     1143dnl   __(cmplri(cr1,imm0,max_32_bit_ivector_subtag))
     1144dnl   __(rlwimi imm0,arg_y,num_subtag_bits-fixnum_shift,0,31-num_subtag_bits) /* imm0 now = header  */
     1145dnl   __(mov imm2,arg_y)
     1146dnl   __(beq cr0,1f) /* do probe if node object  */
     1147dnl           /* (fixnum element count = byte count).  */
     1148dnl   __(cmplri(cr0,imm3,max_16_bit_ivector_subtag))
     1149dnl   __(bng cr1,1f) /* do probe if 32-bit imm object  */
     1150dnl   __(cmplri(cr1,imm3,max_8_bit_ivector_subtag))
     1151dnl   __(srwi imm2,imm2,1)
     1152dnl   __(bgt cr0,3f)
     1153dnl   __(bgt cr1,1f)
     1154dnl   __(srwi imm2,imm2,1)
    11691155dnl /* imm2 now = byte count.  Add 4 for header, 7 to align, then  */
    1170 dnl /*  clear low three bits.  */
     1156dnl /* clear low three bits.  */
    11711157dnl 1:
    11721158dnl          __(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))
     1159dnl   __(cmplri(cr0,imm3,tstack_alloc_limit)) /* more than limit ?  */
     1160dnl   __(bgt- cr0,0f)
     1161dnl   __(TSP_Alloc_Var_Boxed_nz(imm3,imm4))
    11761162dnl
    11771163dnl /* 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)
     1164dnl   __(str(imm0,tsp_frame.data_offset(tsp)))
     1165dnl   __(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp))
     1166dnl   __(bx lr)
    11811167dnl 9:
    11821168dnl
     
    11861172dnl /* sure that there's an empty tsp frame to keep the compiler happy.  */
    11871173dnl 0:
    1188 dnl     __(TSP_Alloc_Fixed_Unboxed(0))
    1189 dnl     __(b _SPmisc_alloc)
     1174dnl   __(TSP_Alloc_Fixed_Unboxed(0))
     1175dnl   __(b _SPmisc_alloc)
    11901176dnl 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     
     1177dnl   __(cmplri(imm3,subtag_double_float_vector))
     1178dnl   __(slwi imm2,arg_y,1)
     1179dnl   __(beq 1b)
     1180dnl   __(addi imm2,arg_y,7<<fixnumshift)
     1181dnl   __(srwi imm2,imm2,fixnumshift+3)
     1182dnl   __(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)
     12001:
     1201        __(str temp0,[arg_z,imm2])
     12022:
     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)
     12171:
     1218        __(subs imm0,imm0,#node_size)
     1219        __(vpush1(imm1))       
     1220        __(add nargs,nargs,#node_size)
     12212:
     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)
     12471:
     1248        __(add imm1,imm1,#fixnum_one)
     1249        __(cmp imm1,imm0)
     1250        __(vpush1(arg_z))
     1251        __(bne 1b)
     1252        __(bx lr)
     1253
    12811254dnl /* Indicate whether &optional arguments were actually supplied.  nargs  */
    12821255dnl /* contains the actual arg count (minus the number of required args);  */
     
    12841257dnl /* Note that nargs may be > imm0 if &rest/&key is involved.  */
    12851258dnl _spentry(opt_supplied_p)
    1286 dnl     __(mov imm1,#0)
     1259dnl  __(mov imm1,#0)
    12871260dnl 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     
     1261dnl  /* (vpush (< imm1 nargs))  */
     1262dnl   __(xor imm2,imm1,nargs)
     1263dnl   __(srawi imm2,imm2,31)
     1264dnl   __(or imm2,imm2,imm1)
     1265dnl   __(addi imm1,imm1,fixnumone)
     1266dnl   __(cmpr(cr0,imm1,imm0))
     1267dnl   __(subf imm2,nargs,imm2)
     1268dnl   __(srwi imm2,imm2,31)
     1269dnl   __(insrwi imm2,imm2,1,27)
     1270dnl   __(addi imm2,imm2,nil_value)
     1271dnl   __(vpush1(imm2))
     1272dnl   __(bne cr0,1b)
     1273dnl   __(bx lr)
     1274dnl 
     1275dnl
     1276dnl
     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)
     12841:
     1285        __(vpop1(arg_y))
     1286        __(Cons(arg_z,arg_y,arg_z))
     1287        __(subs imm1,imm1,#fixnum_one)
     12882:
     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)
     13021:
     1303        __(vpop1(arg_y))
     1304        __(Cons(arg_z,arg_y,arg_z))
     1305        __(subs imm1,imm1,#fixnum_one)
     13062:
     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)
     13161:
     1317        __(vpop1(arg_y))
     1318        __(Cons(arg_z,arg_y,arg_z))
     1319        __(subs imm1,imm1,#fixnum_one)
     13202:
     1321        __(bgt 1b)
     1322        __(vpush1(arg_z))
     1323        __(bx lr)
     1324dnl
     1325dnl 
    13791326dnl _spentry(simple_keywords)
    1380 dnl     __(mov imm0,#0)
     1327dnl  __(mov imm0,#0)
    13811328dnl         __(vpush_argregs())
    13821329dnl         __(b _SPkeyword_bind)
    13831330dnl                 
    13841331dnl _spentry(keyword_args)
    1385 dnl     __(vpush_argregs())
     1332dnl  __(vpush_argregs())
    13861333dnl         __(b _SPkeyword_bind)
    13871334dnl
     
    14131360dnl         /* how many args have actually been pushed.  Ordinarily, that'd  */
    14141361dnl         /* 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)
     1362dnl  /* if we had to default any &optionals.  */
     1363dnl  /* So, the number of args pushed so far is the larger of nargs  */
     1364dnl  /* and the (canonical) total of required/&optional args received.  */
     1365dnl  __(cmpr(cr0,nargs,imm0))
     1366dnl  __(add arg_z,vsp,nargs)
     1367dnl  __(bge+ cr0,1f)
     1368dnl  __(add arg_z,vsp,imm0)
    14221369dnl 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)
     1370dnl  __(build_lisp_frame(fn,loc_pc,arg_z))
     1371dnl  __(mov fn,nfn)
     1372dnl  /* If there are key/value pairs to consider, we slide them down  */
     1373dnl  /* the vstack to make room for the value/supplied-p pairs.  */
     1374dnl  /* The first step in that operation involves pushing imm3 pairs  */
     1375dnl  /* of NILs.  */
     1376dnl  /* If there aren't any such pairs, the first step is the last  */
     1377dnl  /* step.  */
     1378dnl  __(cmpri(cr0,imm3,0))
     1379dnl  __(mov arg_z,#0)
     1380dnl  __(sub imm1,nargs,imm0)
     1381dnl  __(mov imm4,vsp) /* in case odd keywords error  */
     1382dnl  __(cmpri(cr1,imm1,0))
     1383dnl  __(b 3f)
    14371384dnl 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))
     1385dnl  __(addi arg_z,arg_z,fixnum_one)
     1386dnl  __(cmplr(cr0,arg_z,imm3))
     1387dnl  __(mov imm5,#nil_value)
     1388dnl  __(vpush1(imm5))
     1389dnl  __(vpush1(imm5))
    14431390dnl 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)
     1391dnl  __(bne cr0,2b)
     1392dnl  __(andi. arg_z,imm1,fixnum_one)
     1393dnl  __(blelr cr1) /* no keyword/value pairs to consider.  */
     1394dnl  __(bne cr0,odd_keywords)
     1395dnl  /* We have key/value pairs.  Move them to the top of the vstack,  */
     1396dnl  /* then set the value/supplied-p vars to NIL.  */
     1397dnl  /* Have to use some save regs to do this.  */
     1398dnl  __(vpush1(limit))
     1399dnl  __(vpush1(valptr))
     1400dnl  __(vpush1(varptr))
     1401dnl  /* recompute ptr to user args in case stack overflowed  */
     1402dnl  __(add imm4,vsp,imm3)
     1403dnl  __(add imm4,imm4,imm3)
     1404dnl  __(addi imm4,imm4,3*node_size)
     1405dnl  /* error if odd number of keyword/value args  */
     1406dnl  __(mov varptr,imm4)
     1407dnl  __(la limit,3*node_size(vsp))
     1408dnl  __(mov valptr,limit)
     1409dnl  __(mov arg_z,imm1)
    14631410dnl 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)
     1411dnl  __(mov imm4,#nil_value)
     1412dnl  __(subi arg_z,arg_z,2<<fixnumshift)
     1413dnl  __(cmplri(cr0,arg_z,0))
     1414dnl  __(ldr arg_x,[varptr,#node_size*0])
     1415dnl  __(ldr arg_y,[varptr,#node_size*1])
     1416dnl  __(str(imm4,node_size*0(varptr)))
     1417dnl  __(str(imm4,node_size*1(varptr)))
     1418dnl  __(la varptr,node_size*2(varptr))
     1419dnl  __(str(arg_x,node_size*0(valptr)))
     1420dnl  __(str(arg_y,node_size*1(valptr)))
     1421dnl  __(la valptr,node_size*2(valptr))
     1422dnl  __(bne cr0,4b)
    14761423dnl
    14771424dnl
     
    14851432dnl         /* When done, complain if any unknown keywords were found and that  */
    14861433dnl         /* situation was unexpected.  */
    1487 dnl     __(mov imm4,valptr)
     1434dnl  __(mov imm4,valptr)
    14881435dnl 5:
    14891436dnl         __(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)
     1437dnl  __(ldru(arg_z,-node_size(valptr)))
     1438dnl  __(ldru(arg_y,-node_size(valptr)))
     1439dnl  __(cmpri(cr1,arg_y,nil_value))
     1440dnl  __(mov arg_x,#nrs.kallowotherkeys)
    14941441dnl         /* 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)
     1442dnl  __(cmpr(cr6,arg_x,arg_z))
     1443dnl  __(cmpr(cr7,valptr,limit))
     1444dnl  __(bne cr6,6f)
    14981445dnl         __(bge cr0,6f) /* Already seen :allow-other-keys  */
    14991446dnl         __(ori keyword_flags,keyword_flags,16<<fixnumshift)
    1500 dnl     __(beq cr1,6f)
    1501 dnl     __(ori keyword_flags,keyword_flags,fixnum_one)
     1447dnl  __(beq cr1,6f)
     1448dnl  __(ori keyword_flags,keyword_flags,fixnum_one)
    15021449dnl 6:
    1503 dnl     __(cmpri(cr1,imm3,0))
    1504 dnl     __(mov imm1,#misc_data_offset)
    1505 dnl     __(mov imm0,#0)
    1506 dnl     __(b 8f)
     1450dnl  __(cmpri(cr1,imm3,0))
     1451dnl  __(mov imm1,#misc_data_offset)
     1452dnl  __(mov imm0,#0)
     1453dnl  __(b 8f)
    15071454dnl 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)
     1455dnl  __(addi imm0,imm0,fixnum_one)
     1456dnl  __(cmpr(cr1,imm0,imm3))
     1457dnl  __(ldrx(arg_x,keyword_vector,imm1))
     1458dnl  __(cmpr(cr0,arg_x,arg_z))
     1459dnl  __(addi imm1,imm1,fixnum_one)
     1460dnl  __(bne cr0,8f)
     1461dnl  __(add imm0,imm0,imm0)
     1462dnl  __(sub imm0,varptr,imm0)
     1463dnl  __(ldr arg_x,[imm0,#0])
     1464dnl  __(cmpri(cr0,arg_x,nil_value))
     1465dnl  __(mov arg_z,#t_value)
     1466dnl  __(bne cr0,9f)
     1467dnl  __(str(arg_y,node_size(imm0)))
     1468dnl  __(str(arg_z,0(imm0)))
     1469dnl  __(b 9f)
    15231470dnl 8:
    1524 dnl     __(bne cr1,7b)
    1525 dnl     /* Unknown keyword. If it was :allow-other-keys, cr6_eq will still */
     1471dnl  __(bne cr1,7b)
     1472dnl  /* Unknown keyword. If it was :allow-other-keys, cr6_eq will still */
    15261473dnl         /* be set.  */
    15271474dnl         __(beq cr6,9f)
    1528 dnl     __(ori keyword_flags,keyword_flags,2<<fixnumshift)
     1475dnl  __(ori keyword_flags,keyword_flags,2<<fixnumshift)
    15291476dnl 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)
     1477dnl  __(bne cr7,5b)
     1478dnl  __(vpop(varptr))
     1479dnl  __(vpop(valptr))
     1480dnl  __(vpop(limit))
     1481dnl  /* All keyword/value pairs have been processed.  */
     1482dnl  /* If we saw an unknown keyword and didn't expect to, error.  */
     1483dnl  /* Unless bit 2 is set in the fixnum in keyword_flags, discard the  */
     1484dnl  /* keyword/value pairs from the vstack.  */
     1485dnl  __(andi. imm0,keyword_flags,(fixnum_one)|(2<<fixnumshift))
     1486dnl  __(cmpri(cr0,imm0,2<<fixnumshift))
     1487dnl  __(beq- cr0,badkeys)
     1488dnl  __(andi. imm2,keyword_flags,4<<fixnumshift)
     1489dnl  __(bnelr cr0)
     1490dnl  __(mov vsp,imm4)
     1491dnl  __(bx lr)
    15451492dnl
    15461493dnl /* Signal an error.  We saved context on entry, so this thing doesn't  */
     
    15541501dnl /* error with that list as an operand.  */
    15551502dnl odd_keywords:
    1556 dnl     __(mov vsp,imm4)
    1557 dnl     __(mov nargs,imm1)
    1558 dnl     __(b 1f)
     1503dnl  __(mov vsp,imm4)
     1504dnl  __(mov nargs,imm1)
     1505dnl  __(b 1f)
    15591506dnl badkeys:
    1560 dnl     __(sub nargs,imm4,vsp)
     1507dnl  __(sub nargs,imm4,vsp)
    15611508dnl 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         
     1509dnl  __(bl _SPconslist)
     1510dnl  __(mov arg_y,#XBADKEYS)
     1511dnl  __(set_nargs(2))
     1512dnl  __(b _SPksignalerr)
     1513dnl
     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
    20101522dnl /* As in the heap-consed cases, only stack-cons the &rest arg  */
    20111523dnl _spentry(stack_rest_arg)
    2012 dnl     __(mov imm0,#0)
    2013 dnl     __(vpush_argregs())
     1524dnl  __(mov imm0,#0)
     1525dnl  __(vpush_argregs())
    20141526dnl         __(b _SPstack_cons_rest_arg)
    20151527dnl
    2016 dnl    
     1528dnl  
    20171529dnl _spentry(req_stack_rest_arg)
    2018 dnl     __(vpush_argregs())
     1530dnl  __(vpush_argregs())
    20191531dnl         __(b _SPstack_cons_rest_arg)
    2020 dnl    
     1532dnl  
    20211533dnl _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))
     1534dnl  __(sub imm1,nargs,imm0)
     1535dnl  __(cmpri(cr0,imm1,0))
     1536dnl  __(cmpri(cr1,imm1,(4096-dnode_size)/2))
     1537dnl  __(mov arg_z,#nil_value)
     1538dnl  __(ble cr0,2f)  /* always temp-push something.  */
     1539dnl  __(bge cr1,3f)
     1540dnl  __(add imm1,imm1,imm1)
     1541dnl  __(dnode_align(imm2,imm1,tsp_frame.fixed_overhead))
     1542dnl  __(TSP_Alloc_Var_Boxed(imm2,imm3))
     1543dnl  __(la imm0,tsp_frame.data_offset+fulltag_cons(tsp))
    20321544dnl 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)
     1545dnl  __(cmpri(cr0,imm1,cons.size)) /* last time through ?  */
     1546dnl  __(subi imm1,imm1,cons.size)
     1547dnl  __(vpop(arg_x))
     1548dnl  __(_rplacd(imm0,arg_z))
     1549dnl  __(_rplaca(imm0,arg_x))
     1550dnl  __(mov arg_z,imm0)
     1551dnl  __(la imm0,cons.size(imm0))
     1552dnl  __(bne cr0,1b)
     1553dnl  __(vpush1(arg_z))
     1554dnl  __(bx lr)
    20431555dnl 2:
    2044 dnl     __(TSP_Alloc_Fixed_Unboxed(0))
    2045 dnl     __(vpush1(arg_z))
    2046 dnl     __(bx lr)
     1556dnl  __(TSP_Alloc_Fixed_Unboxed(0))
     1557dnl  __(vpush1(arg_z))
     1558dnl  __(bx lr)
    20471559dnl 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     
     1560dnl  __(TSP_Alloc_Fixed_Unboxed(0))
     1561dnl  __(b _SPheap_cons_rest_arg)
     1562dnl
     1563       
    20571564dnl /* Prepend all but the first two (closure code, fn) and last two  */
    20581565dnl /* (function name, lfbits) elements of nfn to the "arglist".  */
     
    20611568dnl /* even in cases where no closure object is created.  */
    20621569dnl _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)
     1570dnl  __(cmpri(cr0,nargs,nargregs<<fixnumshift))
     1571dnl  __(cmpri(cr1,nargs,fixnum_one))
     1572dnl  __(vector_length(imm0,nfn,imm0))
     1573dnl  __(subi imm0,imm0,4<<fixnumshift) /* imm0 = inherited arg count  */
     1574dnl  __(mov imm1,#misc_data_offset+(2<<fixnumshift)) /* point to 1st arg  */
     1575dnl  __(mov imm4,#nil_value)
     1576dnl  __(ble+ cr0,local_label(no_insert))
     1577dnl  /* Some arguments have already been vpushed.  Vpush imm0's worth  */
     1578dnl  /* of NILs, copy those arguments that have already been vpushed from  */
     1579dnl  /* the old TOS to the new, then insert all of the inerited args  */
     1580dnl  /* and go to the function.  */
     1581dnl  __(mov imm2,#0)
    20751582dnl 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)
     1583dnl  __(addi imm2,imm2,fixnum_one)
     1584dnl  __(cmpr(cr2,imm2,imm0))
     1585dnl  __(vpush1(imm4))
     1586dnl  __(bne cr2,local_label(push_nil_loop))
     1587dnl
     1588dnl  __(mov imm3,vsp)
     1589dnl  __(add imm4,vsp,imm0)
     1590dnl  __(subi imm2,nargs,nargregs<<fixnumshift)
    20841591dnl 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))
     1592dnl  __(cmpri(cr2,imm2,fixnum_one))
     1593dnl  __(subi imm2,imm2,fixnum_one)
     1594dnl  __(ldr fname,[imm4,#0])
     1595dnl  __(addi imm4,imm4,fixnum_one)
     1596dnl  __(str(fname,0(imm3)))
     1597dnl  __(addi imm3,imm3,fixnum_one)
     1598dnl  __(bne cr2,local_label(copy_already_loop))
    20921599dnl
    20931600dnl 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))
     1601dnl  __(cmpri(cr2,imm0,fixnum_one))
     1602dnl  __(ldrx(fname,nfn,imm1))
     1603dnl  __(addi imm1,imm1,fixnum_one)
     1604dnl  __(addi nargs,nargs,fixnum_one)
     1605dnl  __(subi imm0,imm0,fixnum_one)
     1606dnl  __(push(fname,imm4))
     1607dnl  __(bne cr2,local_label(insert_loop))
     1608dnl  __(b local_label(go))
    21021609dnl 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))
     1610dnl  /* nargregs or fewer args were already vpushed.  */
     1611dnl  /* if exactly nargregs, vpush remaining inherited vars.  */
     1612dnl  __(add imm2,imm1,imm0)
     1613dnl  __(bne cr0,local_label(set_regs))
    21071614dnl 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))
     1615dnl  __(cmpri(cr2,imm0,fixnum_one))
     1616dnl  __(ldrx(fname,nfn,imm1))
     1617dnl  __(addi imm1,imm1,fixnum_one)
     1618dnl  __(vpush1(fname))
     1619dnl  __(subi imm0,imm0,fixnum_one)
     1620dnl  __(addi nargs,nargs,fixnum_one)
     1621dnl  __(bne cr2,local_label(vpush_remaining))
     1622dnl  __(b local_label(go))
    21161623dnl 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))
     1624dnl  /* if nargs was > 1 (and we know that it was < 3), it must have  */
     1625dnl  /* been 2.  Set arg_x, then vpush the remaining args.  */
     1626dnl  __(ble cr1,local_label(set_y_z))
    21201627dnl 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  */
     1628dnl  __(subi imm0,imm0,fixnum_one)
     1629dnl  __(cmpri(cr0,imm0,0))
     1630dnl  __(subi imm2,imm2,fixnum_one)
     1631dnl  __(ldrx(arg_x,nfn,imm2))
     1632dnl  __(addi nargs,nargs,fixnum_one)
     1633dnl  __(bne cr0,local_label(vpush_remaining))
     1634dnl  __(b local_label(go))
     1635dnl  /* Maybe set arg_y or arg_z, preceding args  */
    21291636dnl local_label(set_y_z):
    2130 dnl     __(bne cr1,local_label(set_arg_z))
    2131 dnl     /* Set arg_y, maybe arg_x, preceding args  */
     1637dnl  __(bne cr1,local_label(set_arg_z))
     1638dnl  /* Set arg_y, maybe arg_x, preceding args  */
    21321639dnl 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))
     1640dnl  __(subi imm0,imm0,fixnum_one)
     1641dnl  __(cmpri(cr0,imm0,0))
     1642dnl  __(subi imm2,imm2,fixnum_one)
     1643dnl  __(ldrx(arg_y,nfn,imm2))
     1644dnl  __(addi nargs,nargs,fixnum_one)
     1645dnl  __(bne cr0,local_label(set_arg_x))
     1646dnl  __(b local_label(go))
    21401647dnl 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))
     1648dnl  __(subi imm0,imm0,fixnum_one)
     1649dnl  __(cmpri(cr0,imm0,0))
     1650dnl  __(subi imm2,imm2,fixnum_one)
     1651dnl  __(ldrx(arg_z,nfn,imm2))
     1652dnl  __(addi nargs,nargs,fixnum_one)
     1653dnl  __(bne cr0,local_label(set_arg_y))
    21471654dnl
    21481655dnl 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)
     1656dnl  __(vrefr(nfn,nfn,1))
     1657dnl  __(ldr loc_pc,[nfn,#_function.codevector])
     1658dnl  __(mtctr loc_pc)
     1659dnl  __(bctr)
    21531660dnl         
    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         __else
    2162 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 dnl
    2177 dnl
    2178 dnl
    2179 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 dnl
    2187 dnl
    2188 dnl         __endif
    21891661dnl                 
    21901662dnl /* Everything up to the last arg has been vpushed, nargs is set to  */
     
    21941666dnl /* ppc2-invoke-fn assumes that temp1 is preserved here.  */
    21951667dnl _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)
     1668dnl   __(extract_lisptag(imm1,arg_z))
     1669dnl   __(cmpri(cr1,imm1,tag_list))
     1670dnl  __(cmpri(cr0,arg_z,nil_value))
     1671dnl  __(mov imm0,#0)
     1672dnl  __(mov arg_y,arg_z)  /*  save in case of error  */
     1673dnl  __(beq cr0,2f)
    22071674dnl 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)
     1675dnl  __(bne- cr1,3f)
     1676dnl  __(_car(arg_x,arg_z))
     1677dnl  __(_cdr(arg_z,arg_z))
     1678dnl  __(cmpri(cr0,arg_z,nil_value))
     1679dnl   __(extract_lisptag(imm1,arg_z))
     1680dnl   __(cmpri(cr1,imm1,tag_list))
     1681dnl  __(vpush1(arg_x))
     1682dnl  __(addi imm0,imm0,fixnum_one)
     1683dnl  __(bne cr0,1b)
    22221684dnl 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)
     1685dnl  __(add. nargs,nargs,imm0)
     1686dnl  __(cmpri(cr2,nargs,2<<fixnumshift))
     1687dnl  __(beqlr- cr0)
     1688dnl  __(vpop(arg_z))
     1689dnl  __(bltlr cr2)
     1690dnl  __(vpop(arg_y))
     1691dnl  __(beqlr cr2)
     1692dnl  __(vpop(arg_x))
     1693dnl  __(bx lr)
    22321694dnl         /*  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)
     1695dnl 3: 
     1696dnl  __(add vsp,vsp,imm0)
     1697dnl  __(mov arg_z,arg_y)  /* recover original arg_z  */
     1698dnl  __(mov arg_y,#XNOSPREAD)
     1699dnl  __(set_nargs(2))
     1700dnl  __(b _SPksignalerr)
    22391701dnl         
    22401702dnl /* Tail-recursively funcall temp0.  */
    22411703dnl /* Pretty much the same as the tcallsym* cases above.  */
    22421704dnl _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)
     1705dnl  __(cmpri(cr0,nargs,nargregs<<fixnumshift))
     1706dnl  __(ldr loc_pc,[sp,#lisp_frame.savelr])
     1707dnl  __(ldr fn,[sp,#lisp_frame.savefn])
     1708dnl  __(mtlr loc_pc)
     1709dnl  __(ble cr0,2f)
     1710dnl  __(ldr imm0,[sp,#lisp_frame.savevsp])
     1711dnl  __(discard_lisp_frame())
     1712dnl  /* can use nfn (= temp2) as a temporary  */
     1713dnl  __(subi imm1,nargs,nargregs<<fixnumshift)
     1714dnl  __(add imm1,imm1,vsp)
    22531715dnl 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())
     1716dnl  __(ldru(temp2,-node_size(imm1)))
     1717dnl  __(cmpr(cr0,imm1,vsp))
     1718dnl  __(push(temp2,imm0))
     1719dnl  __(bne cr0,1b)
     1720dnl  __(mov vsp,imm0)
     1721dnl  __(do_funcall())
    22601722dnl 2:
    2261 dnl     __(ldr vsp,[sp,#lisp_frame.savevsp])
    2262 dnl     __(discard_lisp_frame())
    2263 dnl     __(do_funcall())
     1723dnl  __(ldr vsp,[sp,#lisp_frame.savevsp])
     1724dnl  __(discard_lisp_frame())
     1725dnl  __(do_funcall())
    22641726dnl
    22651727dnl
     
    22671729dnl /* the current frame, then do funcall.  */
    22681730dnl _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)
     1731dnl  __(ldr loc_pc,[sp,#lisp_frame.savelr])
     1732dnl  __(ldr fn,[sp,#lisp_frame.savefn])
     1733dnl  __(ldr imm0,[sp,#lisp_frame.savevsp])
     1734dnl  __(discard_lisp_frame())
     1735dnl  /* can use nfn (= temp2) as a temporary  */
     1736dnl  __(subi imm1,nargs,nargregs<<fixnumshift)
     1737dnl  __(add imm1,imm1,vsp)
     1738dnl  __(mtlr loc_pc)
    22771739dnl 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())
     1740dnl  __(ldru(temp2,-node_size(imm1)))
     1741dnl  __(cmpr(cr0,imm1,vsp))
     1742dnl  __(push(temp2,imm0))
     1743dnl  __(bne cr0,1b)
     1744dnl  __(mov vsp,imm0)
     1745dnl  __(do_funcall())
    22841746dnl
    22851747dnl /* No args were vpushed; recover saved context & do funcall  */
    22861748dnl _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())
     1749dnl  __(ldr loc_pc,[sp,#lisp_frame.savelr])
     1750dnl  __(ldr fn,[sp,#lisp_frame.savefn])
     1751dnl  __(ldr vsp,[sp,#lisp_frame.savevsp])
     1752dnl  __(mtlr loc_pc)
     1753dnl  __(discard_lisp_frame())
     1754dnl  __(do_funcall())
    22931755dnl         
    22941756dnl /* Tail-recursively call the (known symbol) in fname.  */
     
    22981760dnl /* vsp, lr, fn from the saved lisp frame on the control stack.  */
    22991761dnl _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)
     1762dnl  __(cmpri(cr0,nargs,nargregs<<fixnumshift))
     1763dnl  __(ldr loc_pc,[sp,#lisp_frame.savelr])
     1764dnl  __(ldr fn,[sp,#lisp_frame.savefn])
     1765dnl  __(mtlr loc_pc)
     1766dnl  __(ble cr0,2f)
     1767dnl
     1768dnl  __(ldr imm0,[sp,#lisp_frame.savevsp])
     1769dnl  __(discard_lisp_frame())
     1770dnl  /* can use nfn (= temp2) as a temporary  */
     1771dnl  __(subi imm1,nargs,nargregs<<fixnumshift)
     1772dnl  __(add imm1,imm1,vsp)
    23111773dnl 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    
     1774dnl  __(ldru(temp2,-node_size(imm1)))
     1775dnl  __(cmpr(cr0,imm1,vsp))
     1776dnl  __(push(temp2,imm0))
     1777dnl  __(bne cr0,1b)
     1778dnl  __(mov vsp,imm0)
     1779dnl  __(jump_fname)
     1780dnl  
     1781dnl 2: 
     1782dnl  __(ldr vsp,[sp,#lisp_frame.savevsp])
     1783dnl  __(discard_lisp_frame())
     1784dnl  __(jump_fname)
     1785dnl  
     1786dnl  
    23251787dnl /* Some args were vpushed.  Slide them down to the base of  */
    23261788dnl /* the current frame, then do funcall.  */
    23271789dnl _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)
     1790dnl  __(ldr loc_pc,[sp,#lisp_frame.savelr])
     1791dnl  __(ldr fn,[sp,#lisp_frame.savefn])
     1792dnl  __(ldr imm0,[sp,#lisp_frame.savevsp])
     1793dnl  __(discard_lisp_frame())
     1794dnl  __(mtlr loc_pc)
     1795dnl  /* can use nfn (= temp2) as a temporary  */
     1796dnl  __(subi imm1,nargs,nargregs<<fixnumshift)
     1797dnl  __(add imm1,imm1,vsp)
    23361798dnl 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)
     1799dnl  __(ldru(temp2,-node_size(imm1)))
     1800dnl  __(cmpr(cr0,imm1,vsp))
     1801dnl  __(push(temp2,imm0))
     1802dnl  __(bne cr0,1b)
     1803dnl  __(mov vsp,imm0)
     1804dnl  __(jump_fname)
    23431805dnl
    23441806dnl /* No args were vpushed; recover saved context & call symbol  */
    23451807dnl _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    
     1808dnl  __(ldr loc_pc,[sp,#lisp_frame.savelr])
     1809dnl  __(ldr fn,[sp,#lisp_frame.savefn])
     1810dnl  __(ldr vsp,[sp,#lisp_frame.savevsp])
     1811dnl  __(discard_lisp_frame())
     1812dnl  __(mtlr loc_pc)
     1813dnl  __(jump_fname)
     1814dnl  
    23531815dnl /* Tail-recursively call the function in nfn.  */
    23541816dnl /* Pretty much the same as the tcallsym* cases above.  */
    23551817dnl _spentry(tcallnfngen)
    2356 dnl     __(cmpri(cr0,nargs,nargregs<<fixnumshift))
    2357 dnl     __(ble cr0,_SPtcallnfnvsp)
     1818dnl  __(cmpri(cr0,nargs,nargregs<<fixnumshift))
     1819dnl  __(ble cr0,_SPtcallnfnvsp)
    23581820dnl         __(b _SPtcallnfnslide)
    23591821dnl
     
    23611823dnl /* the current frame, then do funcall.  */
    23621824dnl _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)
     1825dnl  __(ldr loc_pc,[sp,#lisp_frame.savelr])
     1826dnl  __(ldr fn,[sp,#lisp_frame.savefn])
     1827dnl  __(ldr imm0,[sp,#lisp_frame.savevsp])
     1828dnl  __(discard_lisp_frame())
     1829dnl  __(mtlr loc_pc)
     1830dnl  /* Since we have a known function, can use fname as a temporary.  */
     1831dnl  __(subi imm1,nargs,nargregs<<fixnumshift)
     1832dnl  __(add imm1,imm1,vsp)
    23711833dnl 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())
     1834dnl  __(ldru(fname,-node_size(imm1)))
     1835dnl  __(cmpr(cr0,imm1,vsp))
     1836dnl  __(push(fname,imm0))
     1837dnl  __(bne cr0,1b)
     1838dnl  __(mov vsp,imm0)
     1839dnl         __(jump_nfn())
    23781840dnl         
    23791841dnl _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    
     1842dnl  __(ldr loc_pc,[sp,#lisp_frame.savelr])
     1843dnl  __(ldr fn,[sp,#lisp_frame.savefn])
     1844dnl  __(ldr vsp,[sp,#lisp_frame.savevsp])
     1845dnl  __(discard_lisp_frame())
     1846dnl  __(mtlr loc_pc)
     1847dnl         __(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))
     1879dnl          
     1880dnl  
    24191881dnl /* Make a cons cell on the vstack.  Always push 3 words, 'cause we're   */
    24201882dnl /* not sure how the vstack will be aligned.  */
    24211883dnl _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)
     1884dnl  __(mov imm0,#nil_value)
     1885dnl  __(vpush1(imm0))
     1886dnl  __(vpush1(imm0))
     1887dnl  __(vpush1(imm0))
     1888dnl  __(andi. imm0,vsp,1<<word_shift) /* (oddp vsp ?)  */
     1889dnl  __(beq cr0,1f)
     1890dnl  __(str(arg_y,node_size*2(vsp))) /* car  */
     1891dnl  __(str(arg_z,node_size(vsp))) /* cdr  */
     1892dnl  __(la arg_z,fulltag_cons+node_size(vsp))
     1893dnl  __(bx lr)
    24321894dnl 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)
     1895dnl  __(str(arg_y,node_size(vsp))) /* car, again  */
     1896dnl  __(str(arg_z,0(vsp)))
     1897dnl  __(la arg_z,fulltag_cons(vsp))
     1898dnl  __(bx lr)
    24371899dnl
    24381900dnl /* Make a stack-consed value cell.  Much like the case of */
     
    24401902dnl /* (already vpushed).  Replace that locative with the vcell.  */
    24411903dnl _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)
     1904dnl  __(sub imm1,imm0,vsp) /* imm1 = delta from vsp to value cell loc  */
     1905dnl  __(mov arg_z,#nil_value)
     1906dnl  __(vpush1(arg_z))
     1907dnl  __(vpush1(arg_z))
     1908dnl  __(vpush1(arg_z))
     1909dnl  __(addi imm1,imm1,node_size*3)
     1910dnl  __(add imm0,vsp,imm1) /* in case stack overflowed  */
     1911dnl  __(andi. imm1,vsp,1<<word_shift) /* (oddp vsp) ?  */
     1912dnl  __(mov imm1,#value_cell_header)
     1913dnl  __(ldr arg_z,[imm0,#0])
     1914dnl  __(beq cr0,1f)
     1915dnl  __(str(arg_z,node_size*2(vsp)))
     1916dnl  __(str(imm1,node_size(vsp)))
     1917dnl  __(la arg_z,fulltag_misc+node_size(vsp))
     1918dnl  __(str(arg_z,0(imm0)))
     1919dnl  __(bx lr)
    24581920dnl 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)
     1921dnl  __(str(arg_z,node_size(vsp)))
     1922dnl  __(str(imm1,0(vsp)))
     1923dnl  __(la arg_z,fulltag_misc(vsp))
     1924dnl  __(str(arg_z,0(imm0)))
     1925dnl  __(bx lr)
    24641926dnl
    24651927dnl         
    24661928dnl _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)
     1929dnl  __(mov arg_z,#nil_value)
     1930dnl  __(vpush1(arg_z))
     1931dnl  __(vpush1(arg_z))
     1932dnl  __(vpush1(arg_z))
     1933dnl  __(mov imm1,#node_size*3)
     1934dnl  __(add imm0,vsp,imm1) /* in case stack overflowed  */
     1935dnl  __(andi. imm1,vsp,1<<word_shift) /* (oddp vsp) ?  */
     1936dnl  __(mov imm1,#value_cell_header)
     1937dnl  __(ldr arg_z,[imm0,#0])
     1938dnl  __(beq cr0,1f)
     1939dnl  __(str(arg_z,node_size*2(vsp)))
     1940dnl  __(str(imm1,node_size(vsp)))
     1941dnl  __(la arg_z,fulltag_misc+node_size(vsp))
     1942dnl  __(str(arg_z,0(imm0)))
     1943dnl  __(bx lr)
    24821944dnl 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)
     1945dnl  __(str(arg_z,node_size(vsp)))
     1946dnl  __(str(imm1,0(vsp)))
     1947dnl  __(la arg_z,fulltag_misc(vsp))
     1948dnl  __(str(arg_z,0(imm0)))
     1949dnl  __(bx lr)
    24881950dnl
    24891951dnl /* Make a "raw" area on the temp stack, stack-cons a macptr to point to it,  */
     
    24911953dnl /* in arg_z on exit.  */
    24921954dnl _spentry(makestackblock)
    2493 dnl     __(unbox_fixnum(imm0,arg_z))
     1955dnl  __(unbox_fixnum(imm0,arg_z))
    24941956dnl         __(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)
     1957dnl  __(cmplri(cr0,imm0,tstack_alloc_limit))
     1958dnl  __(bge cr0,1f)
     1959dnl  __(TSP_Alloc_Var_Unboxed(imm0))
     1960dnl  __(mov imm0,#macptr_header)
     1961dnl  __(la imm1,tsp_frame.data_offset+macptr.size(tsp))
     1962dnl  __(str(imm0,tsp_frame.data_offset(tsp)))
     1963dnl  __(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp))
     1964dnl  __(str(imm1,macptr.address(arg_z)))
     1965dnl   __(stfd fp_zero,macptr.domain(arg_z))
     1966dnl  __(bx lr)
    25101967dnl
    25111968dnl         /* Too big. Heap cons a gcable macptr  */
    25121969dnl 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())
     1970dnl  __(TSP_Alloc_Fixed_Unboxed(0))
     1971dnl  __(set_nargs(1))
     1972dnl  __(mov fname,#nrs.new_gcable_ptr)
     1973dnl  __(jump_fname())
    25171974dnl
    25181975dnl /* As above, only set the block's contents to 0.  */
    25191976dnl _spentry(makestackblock0)
    2520 dnl     __(unbox_fixnum(imm0,arg_z))
     1977dnl  __(unbox_fixnum(imm0,arg_z))
    25211978dnl         __(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)
     1979dnl  __(cmplri(cr0,imm0,tstack_alloc_limit))
     1980dnl  __(bge cr0,3f)
     1981dnl  __(TSP_Alloc_Var_Unboxed(imm0))
     1982dnl  __(Zero_TSP_Frame(imm0,imm1))
     1983dnl  __(mov imm0,#macptr_header)
     1984dnl  __(la imm1,tsp_frame.data_offset+macptr.size(tsp))
     1985dnl  __(str(imm0,tsp_frame.data_offset(tsp)))
     1986dnl  __(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp))
     1987dnl  __(str(imm1,macptr.address(arg_z))) /* makestackblock0 expects the address to be in imm1  */
     1988dnl  __(stfd fp_zero,macptr.domain(arg_z))
     1989dnl  __(bx lr)
    25331990dnl
    25341991dnl         /* Too big. Heap cons a gcable macptr  */
    25351992dnl 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())
     1993dnl  __(TSP_Alloc_Fixed_Unboxed(0)) /* "raw" block to make the compiler happy  */
     1994dnl
     1995dnl  __(mov arg_y,arg_z) /* save block size  */
     1996dnl  __(mov arg_z,#t_value) /* clear-p arg to %new-gcable-ptr  */
     1997dnl  __(set_nargs(2))
     1998dnl  __(mov fname,#nrs.new_gcable_ptr)
     1999dnl  __(jump_fname())
    25432000dnl
    25442001dnl /* Make a list of length arg_y (boxed), initial-element arg_z (boxed) on  */
    25452002dnl /* the tstack.  Return the list in arg_z.  */
    25462003dnl _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)
     2004dnl  __(add imm0,arg_y,arg_y)
     2005dnl  __(cmplri(cr1,imm0,((tstack_alloc_limit+1)-cons.size)))
     2006dnl  __(addi imm0,imm0,tsp_frame.fixed_overhead)
     2007dnl  __(bge cr1,3f)
     2008dnl  __(TSP_Alloc_Var_Boxed(imm0,imm1))
     2009dnl  __(mov imm1,arg_y)
     2010dnl  __(cmpri(cr1,imm1,0))
     2011dnl  __(mov arg_y,arg_z)
     2012dnl  __(mov arg_z,#nil_value)
     2013dnl  __(ldr imm2,[tsp,#tsp_frame.backlink])
     2014dnl  __(la imm2,-tsp_frame.fixed_overhead+fulltag_cons(imm2))
     2015dnl  __(b 2f)
    25592016dnl 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)
     2017dnl  __(subi imm1,imm1,fixnum1)
     2018dnl  __(cmpri(cr1,imm1,0))
     2019dnl  __(_rplacd(imm2,arg_z))
     2020dnl  __(_rplaca(imm2,arg_y))
     2021dnl  __(mov arg_z,imm2)
     2022dnl  __(subi imm2,imm2,cons.size)
    25662023dnl 2:
    2567 dnl     __(bne cr1,1b)
    2568 dnl     __(bx lr)
     2024dnl  __(bne cr1,1b)
     2025dnl  __(bx lr)
    25692026dnl
    25702027dnl 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)
     2028dnl  __(cmpri(cr1,arg_y,0))
     2029dnl  __(TSP_Alloc_Fixed_Boxed(0))  /* make the compiler happy  */
     2030dnl  __(mov imm1,arg_y) /* count  */
     2031dnl  __(mov arg_y,arg_z) /* initial value  */
     2032dnl  __(mov arg_z,#nil_value) /* result  */
     2033dnl  __(b 5f)
    25772034dnl 4:
    2578 dnl     __(subi imm1,imm1,fixnum1)
    2579 dnl     __(cmpri(cr1,imm1,0))
    2580 dnl     __(Cons(arg_z,arg_y,arg_z))
     2035dnl  __(subi imm1,imm1,fixnum1)
     2036dnl  __(cmpri(cr1,imm1,0))
     2037dnl  __(Cons(arg_z,arg_y,arg_z))
    25812038dnl 5:
    2582 dnl     __(bne cr1,4b)
    2583 dnl     __(bx lr)
     2039dnl  __(bne cr1,4b)
     2040dnl  __(bx lr)
    25842041dnl
    25852042dnl /* subtype (boxed) vpushed before initial values. (Had better be a  */
     
    25872044dnl
    25882045dnl _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
     2046dnl  __(la imm0,-fixnum_one(nargs))
     2047dnl  __(cmpri(cr1,imm0,0))
     2048dnl  __(add imm1,vsp,nargs)
     2049dnl  __(ldru(temp0,-node_size(imm1)))
     2050dnl  __(slri(imm2,imm0,num_subtag_bits-fixnumshift))
     2051dnl   __(rlwimi imm2,temp0,32-fixnumshift,32-num_subtag_bits,31)
    26002052dnl         __(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)
     2053dnl  __(TSP_Alloc_Var_Boxed_nz(imm0,imm3))
     2054dnl  __(str(imm2,tsp_frame.data_offset(tsp)))
     2055dnl  __(la arg_z,tsp_frame.data_offset+fulltag_misc(tsp))
     2056dnl  __(la imm3,misc_header_offset(arg_z))
     2057dnl  __(mov imm0,#fixnum1)
     2058dnl  __(b 2f)
    26072059dnl 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)))
     2060dnl  __(addi imm0,imm0,fixnum1)
     2061dnl  __(cmpr(cr1,imm0,nargs))
     2062dnl  __(ldru(temp0,-node_size(imm1)))
     2063dnl  __(stru(temp0,node_size(imm3)))
    26122064dnl 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
     2065dnl  __(bne cr1,1b)
     2066dnl  __(add vsp,vsp,nargs)
     2067dnl  __(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
     2077unsigned_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.  */
     21051:
     2106        __(dnode_align(imm2,imm2,node_size))
     2107        __(Misc_Alloc(arg_z,imm0,imm2))
     2108        __(bx lr)
     21099:
     2110        __(uuo_error_reg_not_xtype(al,arg_y,xtype_unsigned_byte_24))
     2111
    27042112dnl         
    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 dnl
    27112113dnl
    27122114dnl /* Destructuring-bind, macro-bind.  */
     
    27262128dnl
    27272129dnl _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
     2130dnl   __(mov whole_reg,arg_reg)
     2131dnl   __(extract_lisptag(imm0,arg_reg))
     2132dnl   __(cmpri(cr0,imm0,tag_list))
     2133dnl   __(bne- cr0,1f)
     2134dnl   __(_cdr(arg_reg,arg_reg))
     2135dnl   __(b (local_label(destbind1)))
    27462136dnl 1:
    2747 dnl     __(mov arg_y,#XCALLNOMATCH)
    2748 dnl     __(mov arg_z,whole_reg)
    2749 dnl     __(set_nargs(2))
    2750 dnl     __(b _SPksignalerr)
     2137dnl  __(mov arg_y,#XCALLNOMATCH)
     2138dnl  __(mov arg_z,whole_reg)
     2139dnl  __(set_nargs(2))
     2140dnl  __(b _SPksignalerr)
    27512141dnl
    27522142dnl
    27532143dnl _spentry(destructuring_bind)
    2754 dnl     __(mov whole_reg,arg_reg)
     2144dnl  __(Mov whole_reg,arg_reg)
    27552145dnl         __(b local_label(destbind1))
    2756 dnl    
     2146dnl  
    27572147dnl _spentry(destructuring_bind_inner)
    2758 dnl     __(mov whole_reg,arg_z)
     2148dnl  __(mov whole_reg,arg_z)
    27592149dnl 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)
     2150dnl  /* Extract required arg count.  */
     2151dnl  /* A bug in gas: can't handle shift count of "32" (= 0  */
     2152dnl  ifelse(eval(mask_req_width+mask_req_start),eval(32),`
     2153dnl  __(clrlwi. imm0,nargs,mask_req_start)
     2154dnl  ',`
     2155dnl  __(extrwi. imm0,nargs,mask_req_width,mask_req_start)
     2156dnl  ')
     2157dnl  __(extrwi imm1,nargs,mask_opt_width,mask_opt_start)
     2158dnl  __(rlwinm imm2,nargs,0,mask_initopt,mask_initopt)
     2159dnl  __(rlwinm imm4,nargs,0,mask_keyp,mask_keyp)
     2160dnl  __(cmpri(cr4,imm4,0))
     2161dnl  __(rlwinm imm4,nargs,0,mask_restp,mask_restp)
     2162dnl  __(cmpri(cr5,imm4,0))
     2163dnl  __(cmpri(cr1,imm1,0))
     2164dnl  __(cmpri(cr2,imm2,0))
     2165dnl  /* Save entry vsp in case of error.  */
     2166dnl  __(mov imm4,vsp)
     2167dnl  __(beq cr0,2f)
    27782168dnl 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)
     2169dnl  __(cmpri(cr7,arg_reg,nil_value))
     2170dnl   __(extract_lisptag(imm3,arg_reg))
     2171dnl   __(cmpri(cr3,imm3,tag_list))
     2172dnl  __(subi imm0,imm0,1)
     2173dnl  __(cmpri(cr0,imm0,0))
     2174dnl  __(beq cr7,toofew)
     2175dnl  __(bne cr3,badlist)
     2176dnl  __(ldr arg_x,[arg_reg,#cons.car])
     2177dnl  __(ldr arg_reg,[arg_reg,#cons.cdr])
     2178dnl  __(vpush1(arg_x))
     2179dnl  __(bne cr0,1b)
    27952180dnl 2:
    2796 dnl     __(beq cr1,rest_keys)
    2797 dnl     __(bne cr2,opt_supp)
    2798 dnl     /* 'simple' &optionals: no supplied-p, default to nil.  */
     2181dnl  __(beq cr1,rest_keys)
     2182dnl  __(bne cr2,opt_supp)
     2183dnl  /* 'simple' &optionals: no supplied-p, default to nil.  */
    27992184dnl 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)
     2185dnl  __(cmpri(cr0,arg_reg,nil_value))
     2186dnl   __(extract_lisptag(imm3,arg_reg))
     2187dnl   __(cmpri(cr3,imm3,tag_list))
     2188dnl  __(subi imm1,imm1,1)
     2189dnl  __(cmpri(cr1,imm1,0))
     2190dnl  __(mov imm5,#nil_value)
     2191dnl  __(beq cr0,default_simple_opt)
     2192dnl  __(bne cr3,badlist)
     2193dnl  __(ldr arg_x,[arg_reg,#cons.car])
     2194dnl  __(ldr arg_reg,[arg_reg,#cons.cdr])
     2195dnl  __(vpush1(arg_x))
     2196dnl  __(bne cr1,simple_opt_loop)
     2197dnl  __(b rest_keys)
    28182198dnl default_simple_opt_loop:
    2819 dnl     __(subi imm1,imm1,1)
    2820 dnl     __(cmpri(cr1,imm1,0))
     2199dnl  __(subi imm1,imm1,1)
     2200dnl  __(cmpri(cr1,imm1,0))
    28212201dnl 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.  */
     2202dnl  __(vpush1(imm5))
     2203dnl  __(bne cr1,default_simple_opt_loop)
     2204dnl  __(b rest_keys)
     2205dnl  /* Provide supplied-p vars for the &optionals.  */
    28262206dnl opt_supp:
    2827 dnl     __(mov arg_y,#t_value)
     2207dnl  __(mov arg_y,#t_value)
    28282208dnl 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)
     2209dnl  __(cmpri(cr0,arg_reg,nil_value))
     2210dnl   __(extract_lisptag(imm3,arg_reg))
     2211dnl   __(cmpri(cr3,imm3,tag_list))
     2212dnl  __(subi imm1,imm1,1)
     2213dnl  __(cmpri(cr1,imm1,0))
     2214dnl  __(beq cr0,default_hard_opt)
     2215dnl  __(bne cr3,badlist)
     2216dnl  __(ldr arg_x,[arg_reg,#cons.car])
     2217dnl  __(ldr arg_reg,[arg_reg,#cons.cdr])
     2218dnl  __(vpush1(arg_x))
     2219dnl  __(vpush1(arg_y))
     2220dnl  __(bne cr1,opt_supp_loop)
     2221dnl  __(b rest_keys)
    28472222dnl default_hard_opt_loop:
    2848 dnl     __(subi imm1,imm1,1)
    2849 dnl     __(cmpri(cr1,imm1,0))
     2223dnl  __(subi imm1,imm1,1)
     2224dnl  __(cmpri(cr1,imm1,0))
    28502225dnl default_hard_opt:
    2851 dnl     __(vpush1(imm5))
    2852 dnl     __(vpush1(imm5))
    2853 dnl     __(bne cr1,default_hard_opt_loop)
     2226dnl  __(vpush1(imm5))
     2227dnl  __(vpush1(imm5))
     2228dnl  __(bne cr1,default_hard_opt_loop)
    28542229dnl 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)
     2230dnl  __(cmpri(cr0,arg_reg,nil_value))
     2231dnl  __(bne cr5,have_rest)
     2232dnl  __(bne cr4,have_keys)
     2233dnl  __(bne cr0,toomany)
     2234dnl  __(bx lr)
    28602235dnl have_rest:
    2861 dnl     __(vpush1(arg_reg))
    2862 dnl     __(beqlr cr4)
     2236dnl  __(vpush1(arg_reg))
     2237dnl  __(beqlr cr4)
    28632238dnl 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)
     2239dnl  /* Ensure that arg_reg contains a proper,even-length list.  */
     2240dnl  /* Insist that its length is <= 512 (as a cheap circularity check.)  */
     2241dnl  __(mov imm0,#256)
     2242dnl  __(mov arg_x,arg_reg)
    28682243dnl 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)
     2244dnl   __(extract_lisptag(imm3,arg_x))
     2245dnl   __(cmpri(cr3,imm3,tag_list))
     2246dnl  __(cmpri(cr0,arg_x,nil_value))
     2247dnl  __(subi imm0,imm0,1)
     2248dnl  __(cmpri(cr4,imm0,0))
     2249dnl  __(beq cr0,counted_keys)
     2250dnl  __(bne cr3,badlist)
     2251dnl  __(ldr arg_x,[arg_x,#cons.cdr])
     2252dnl   __(extract_lisptag(imm3,arg_x))
     2253dnl   __(cmpri(cr3,imm3,tag_list))
     2254dnl  __(blt cr4,toomany)
     2255dnl  __(cmpri(cr0,arg_x,nil_value))
     2256dnl  __(beq cr0,db_badkeys)
     2257dnl  __(bne cr3,badlist)
     2258dnl  __(ldr arg_x,[arg_x,#cons.cdr])
     2259dnl  __(b count_keys_loop)
    28952260dnl 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)
     2261dnl  /* We've got a proper, even-length list of key/value pairs in */
     2262dnl  /* arg_reg. For each keyword var in the lambda-list, push a pair */
     2263dnl  /* of NILs on the vstack.  */
     2264dnl  __(extrwi. imm0,nargs,mask_key_width,mask_key_start )
     2265dnl  __(mov imm2,imm0)  /* save number of keys  */
     2266dnl  __(mov imm5,#nil_value)
     2267dnl  __(b push_pair_test)
    29032268dnl push_pair_loop:
    2904 dnl     __(cmpri(cr0,imm0,1))
    2905 dnl     __(subi imm0,imm0,1)
    2906 dnl     __(vpush1(imm5))
    2907 dnl     __(vpush1(imm5))
     2269dnl  __(cmpri(cr0,imm0,1))
     2270dnl  __(subi imm0,imm0,1)
     2271dnl  __(vpush1(imm5))
     2272dnl  __(vpush1(imm5))
    29082273dnl 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,  */
     2274dnl  __(bne cr0,push_pair_loop)
     2275dnl  __(slwi imm2,imm2,dnode_shift)  /* pairs -> bytes  */
     2276dnl  __(add imm2,vsp,imm2)  /* imm2 points below pairs  */
     2277dnl  __(mov imm0,#0)   /* count unknown keywords so far  */
     2278dnl  __(extrwi imm1,nargs,1,mask_aok) /* unknown keywords allowed  */
     2279dnl  __(extrwi nargs,nargs,mask_key_width,mask_key_start)
     2280dnl  /* Now, for each keyword/value pair in the list  */
     2281dnl  /*  a) if the keyword is found in the keyword vector, set the  */
     2282dnl  /*     corresponding entry on the vstack to the value and the  */
     2283dnl  /*     associated supplied-p var to T.  */
     2284dnl  /*  b) Regardless of whether or not the keyword is found,  */
    29202285dnl         /*     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 */
     2286dnl  /*     set the low bit of imm1 to indicate that unknown keywords  */
     2287dnl  /*     are acceptable. (This bit is pre-set above to the value */
    29232288dnl         /*     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.  */
     2289dnl  /*  c) If the keyword is not found (and isn't :ALLOW-OTHER-KEYS), increment  */
     2290dnl  /*     the count of unknown keywords in the high bits of imm1*/
     2291dnl  /* At the end of the list, signal an error if any unknown keywords were seen  */
     2292dnl  /* but not allowed.  Otherwise, return.  */
    29282293dnl
    29292294dnl 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)
     2295dnl  __(cmpri(cr0,arg_reg,nil_value))
     2296dnl  __(mov imm0,#0)
     2297dnl  __(mov imm3,#misc_data_offset)
     2298dnl  __(beq cr0,matched_keys)
     2299dnl  __(ldr arg_x,[arg_reg,#cons.car])
     2300dnl  __(mov arg_y,#nrs.kallowotherkeys)
     2301dnl  __(cmpr(cr3,arg_x,arg_y)) /* :ALLOW-OTHER-KEYS ?  */
     2302dnl  __(ldr arg_reg,[arg_reg,#cons.cdr])
     2303dnl  __(ldr arg_y,[arg_reg,#cons.car])
     2304dnl  __(cmpr(cr4,imm0,nargs))
     2305dnl  __(ldr arg_reg,[arg_reg,#cons.cdr])
     2306dnl  __(b match_test)
    29422307dnl 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)))
     2308dnl  __(ldrx(temp0,keyvect_reg,imm3))
     2309dnl  __(cmpr(cr0,arg_x,temp0))
     2310dnl  __(addi imm0,imm0,1)
     2311dnl  __(cmpr(cr4,imm0,nargs))
     2312dnl  __(addi imm3,imm3,node_size)
     2313dnl  __(bne cr0,match_test)
     2314dnl  /* Got a hit.  Unless this keyword's been seen already, set it.  */
     2315dnl  __(slwi imm0,imm0,dnode_shift)
     2316dnl  __(subf imm0,imm0,imm2)
     2317dnl  __(ldr temp0,[imm0,#0])
     2318dnl  __(cmpri(cr0,temp0,nil_value))
     2319dnl  __(mov temp0,#t_value)
     2320dnl  __(bne cr0,match_keys_loop) /* already saw this  */
     2321dnl  __(str(arg_y,node_size*1(imm0)))
     2322dnl  __(str(temp0,node_size*0(imm0)))
    29582323dnl         __(bne cr3,match_keys_loop)
    2959 dnl     __(b match_keys_check_aok)
     2324dnl  __(b match_keys_check_aok)
    29602325dnl match_test:
    2961 dnl     __(bne cr4,match_loop)
     2326dnl  __(bne cr4,match_loop)
    29622327dnl         __(beq cr3,match_keys_check_aok)
    29632328dnl         __(addi imm1,imm1,node_size)
     
    29702335dnl         __(beq cr1,match_keys_loop)
    29712336dnl         __(ori imm1,imm1,1)
    2972 dnl     __(b match_keys_loop)
     2337dnl  __(b match_keys_loop)
    29732338dnl matched_keys:
    29742339dnl         __(clrrwi. imm0,imm1,2)
     
    29762341dnl         __(andi. imm1,imm1,1)
    29772342dnl         __(bnelr)
    2978 dnl     /* Some unrecognized keywords.  Complain generically about  */
    2979 dnl     /* invalid keywords.  */
     2343dnl  /* Some unrecognized keywords.  Complain generically about  */
     2344dnl  /* invalid keywords.  */
    29802345dnl db_badkeys:
    2981 dnl     __(mov arg_y,#XBADKEYS)
    2982 dnl     __(b destructure_error)
     2346dnl  __(mov arg_y,#XBADKEYS)
     2347dnl  __(b destructure_error)
    29832348dnl toomany:
    2984 dnl     __(mov arg_y,#XCALLTOOMANY)
    2985 dnl     __(b destructure_error)
     2349dnl  __(mov arg_y,#XCALLTOOMANY)
     2350dnl  __(b destructure_error)
    29862351dnl toofew:
    2987 dnl     __(mov arg_y,#XCALLTOOFEW)
    2988 dnl     __(b destructure_error)
     2352dnl  __(mov arg_y,#XCALLTOOFEW)
     2353dnl  __(b destructure_error)
    29892354dnl badlist:
    2990 dnl     __(mov arg_y,#XCALLNOMATCH)
    2991 dnl     /* b destructure_error  */
     2355dnl  __(mov arg_y,#XCALLNOMATCH)
     2356dnl  /* b destructure_error  */
    29922357dnl 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)
     2358dnl  __(mov vsp,imm4)  /* undo everything done to the stack  */
     2359dnl  __(mov arg_z,whole_reg)
     2360dnl  __(set_nargs(2))
     2361dnl  __(b _SPksignalerr)
    29972362dnl         
    29982363dnl /* vpush the values in the value set atop the vsp, incrementing nargs.  */
     
    30032368dnl /* First, walk the segments reversing the pointer to previous segment pointers  */
    30042369dnl /* 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  */
     2370dnl  __(ldr imm0,[tsp,#tsp_frame.backlink]) /* previous tsp  */
     2371dnl  __(mov imm1,tsp) /* current segment  */
     2372dnl  __(mov imm2,tsp) /* last segment  */
    30082373dnl 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))
     2374dnl  __(ldr imm3,[imm1,#tsp_frame.fixed_overhead+node_size]) /* next segment  */
     2375dnl  __(cmpr(cr0,imm0,imm3)) /* last segment?  */
     2376dnl  __(str(imm2,tsp_frame.fixed_overhead+node_size(imm1))) /* reverse pointer  */
     2377dnl  __(mov imm2,imm1) /* last segment <- current segment  */
     2378dnl  __(mov imm1,imm3) /* current segment <- next segment  */
     2379dnl  __(bne cr0,local_label(walkloop))
    30152380dnl
    30162381dnl         /* the final segment ptr is now in imm2  */
    30172382dnl         /* walk backwards, pushing values on VSP and incrementing NARGS  */
    30182383dnl 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)
     2384dnl  __(ldr imm0,[imm2,#tsp_frame.data_offset]) /* nargs in segment  */
     2385dnl  __(cmpri(cr0,imm0,0))
     2386dnl  __(cmpr(cr1,imm2,tsp))
     2387dnl  __(la imm3,tsp_frame.data_offset+(2*node_size)(imm2))
     2388dnl  __(add imm3,imm3,imm0)
     2389dnl  __(add nargs,nargs,imm0)
     2390dnl  __(b 2f)
    30262391dnl 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))
     2392dnl  __(ldru(arg_z,-node_size(imm3)))
     2393dnl  __(cmpri(cr0,imm0,fixnum_one))
     2394dnl  __(subi imm0,imm0,fixnum_one)
     2395dnl  __(vpush1(arg_z))
    30312396dnl 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
     2397dnl  __(bne cr0,1b)
     2398dnl  __(ldr imm2,[imm2,#tsp_frame.data_offset+node_size]) /* previous segment  */
     2399dnl  __(bne cr1,local_label(pushloop))
     2400dnl  __(unlink(tsp))
     2401dnl  __(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
    30882430dnl /* like misc_set, only pass the (boxed) subtag in temp0  */
    30892431dnl _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
     2432dnl  __(trap_unless_fulltag_equal(arg_x,fulltag_misc,imm0))
     2433dnl  __(trap_unless_lisptag_equal(arg_y,tag_fixnum,imm0))
     2434dnl  __(vector_length(imm0,arg_x,imm1))
     2435dnl  __(trlge(arg_y,imm0))
     2436dnl  __(unbox_fixnum(imm1,temp0))
     2437dnl     __(b C(misc_set_common))
     2438
     2439
    40062440dnl
    40072441dnl /* misc_set (vector index newval).  Pretty damned similar to  */
     
    40092443dnl
    40102444dnl _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))
     2445dnl  __(trap_unless_fulltag_equal(arg_x,fulltag_misc,imm0))
     2446dnl  __(trap_unless_lisptag_equal(arg_y,tag_fixnum,imm0))
     2447dnl  __(vector_length(imm0,arg_x,imm1))
     2448dnl  __(trlge(arg_y,imm0))
     2449dnl  __(extract_lowbyte(imm1,imm1))
     2450dnl         __(b C(misc_set_common))
    40172451dnl         
    40182452dnl /* "spread" the lexpr in arg_z.  */
    40192453dnl /* ppc2-invoke-fn assumes that temp1 is preserved here.  */
    40202454dnl _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.  */
     2455dnl  __(ldr imm0,[arg_z,#0])
     2456dnl  __(cmpri(cr3,imm0,3<<fixnumshift))
     2457dnl  __(cmpri(cr4,imm0,2<<fixnumshift))
     2458dnl  __(add imm1,arg_z,imm0)
     2459dnl  __(cmpri(cr0,imm0,0))
     2460dnl  __(add nargs,nargs,imm0)
     2461dnl  __(cmpri(cr1,nargs,0))
     2462dnl  __(cmpri(cr2,nargs,2<<fixnumshift))
     2463dnl  __(la imm1,node_size(imm1))
     2464dnl  __(bge cr3,9f)
     2465dnl  __(beq cr4,2f)
     2466dnl  __(bne cr0,1f)
     2467dnl  /* lexpr count was 0; vpop the arg regs that  */
     2468dnl  /* were vpushed by the caller  */
     2469dnl  __(beqlr cr1)
     2470dnl  __(vpop(arg_z))
     2471dnl  __(bltlr cr2)
     2472dnl  __(vpop(arg_y))
     2473dnl  __(beqlr cr2)
     2474dnl  __(vpop(arg_x))
     2475dnl  __(bx lr)
     2476dnl
     2477dnl  /* vpush args from the lexpr until we have only  */
     2478dnl  /* three left, then assign them to arg_x, arg_y,  */
     2479dnl  /* and arg_z.  */
    40462480dnl 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))
     2481dnl  __(cmpri(cr3,imm0,4<<fixnumshift))
     2482dnl  __(subi imm0,imm0,fixnumone)
     2483dnl  __(ldru(arg_z,-node_size(imm1)))
     2484dnl  __(vpush1(arg_z))
    40512485dnl 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)
     2486dnl  __(bne cr3,8b)
     2487dnl  __(ldr arg_x,[imm1,#-node_size*1])
     2488dnl  __(ldr arg_y,[imm1,#-node_size*2])
     2489dnl  __(ldr arg_z,[imm1,#-node_size*3])
     2490dnl  __(bx lr)
     2491dnl
     2492dnl  /* lexpr count is two: set arg_y, arg_z from the  */
     2493dnl  /* lexpr, maybe vpop arg_x  */
     2494dnl 2: 
     2495dnl  __(ldr arg_y,[imm1,#-node_size*1])
     2496dnl  __(ldr arg_z,[imm1,#-node_size*2])
     2497dnl  __(beqlr cr2)  /* return if (new) nargs = 2  */
     2498dnl  __(vpop(arg_x))
     2499dnl  __(bx lr)
     2500dnl
     2501dnl  /* lexpr count is one: set arg_z from the lexpr,  */
     2502dnl  /* maybe vpop arg_y, arg_x  */
     2503dnl 1: 
     2504dnl  __(ldr arg_z,[imm1,#-node_size])
     2505dnl  __(bltlr cr2)  /* return if (new) nargs < 2  */
     2506dnl  __(vpop(arg_y))
     2507dnl  __(beqlr cr2)  /* return if (new) nargs = 2  */
     2508dnl  __(vpop(arg_x))
     2509dnl  __(bx lr)
    40762510dnl         
    4077 dnl            
     2511dnl  
    40782512dnl _spentry(reset)
    4079 dnl     .globl _SPthrow
    4080 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    
     2513dnl  .globl _SPthrow
     2514dnl  __(nop)
     2515dnl  __(ref_nrs_value(temp0,toplcatch))
     2516dnl  __(mov temp1,#XSTKOVER)
     2517dnl  __(vpush1(temp0))
     2518dnl  __(vpush1(temp1))
     2519dnl  __(set_nargs(1))
     2520dnl  __(b _SPthrow)
     2521dnl
     2522dnl  
    40892523dnl /* "slide" nargs worth of values up the vstack.  IMM0 contains  */
    40902524dnl /* the difference between the current VSP and the target.  */
    40912525dnl _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)
     2526dnl  __(cmpri(cr0,nargs,0))
     2527dnl  __(mov imm3,nargs)
     2528dnl  __(add imm2,vsp,nargs)
     2529dnl  __(add imm2,imm2,imm0)
     2530dnl  __(add imm0,vsp,nargs)
     2531dnl  __(beq 2f)
    40982532dnl 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)
     2533dnl  __(cmpri(cr0,imm3,1<<fixnumshift))
     2534dnl  __(subi imm3,imm3,1<<fixnumshift)
     2535dnl  __(ldru(temp0,-node_size(imm0)))
     2536dnl  __(stru(temp0,-node_size(imm2)))
     2537dnl  __(bne cr0,1b)
    41042538dnl 2:
    4105 dnl     __(mov vsp,imm2)
    4106 dnl     __(bx lr)
     2539dnl  __(mov vsp,imm2)
     2540dnl  __(bx lr)
    41072541dnl
    41082542dnl /* Build a new TSP area to hold nargs worth of multiple-values.  */
     
    41232557dnl
    41242558dnl _spentry(save_values)
    4125 dnl     __(mov imm1,tsp)
     2559dnl  __(mov imm1,tsp)
    41262560dnl
    41272561dnl         /* common exit: nargs = values in this set, imm1 = ptr to tsp before  */
    41282562dnl         /* call to save_values  */
    41292563dnl 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)
     2564dnl  __(mov imm2,tsp)
     2565dnl  __(dnode_align(imm0,nargs,tsp_frame.fixed_overhead+(2*node_size))) /* count, link  */
     2566dnl  __(TSP_Alloc_Var_Boxed_nz(imm0,imm3))
     2567dnl  __(str(imm1,tsp_frame.backlink(tsp))) /* keep one tsp "frame" as far as rest of lisp is concerned  */
     2568dnl  __(str(nargs,tsp_frame.data_offset(tsp)))
     2569dnl  __(str(imm2,tsp_frame.data_offset+node_size(tsp))) /* previous tsp  */
     2570dnl  __(la imm3,tsp_frame.data_offset+node_size*2(tsp))
     2571dnl  __(add imm3,imm3,nargs)
     2572dnl  __(add imm0,vsp,nargs)
     2573dnl  __(cmpr(cr0,imm0,vsp))
     2574dnl  __(b 2f)
    41412575dnl 1:
    4142 dnl     __(ldru(arg_z,-node_size(imm0)))
    4143 dnl     __(cmpr(cr0,imm0,vsp))
    4144 dnl     __(stru(arg_z,-node_size(imm3)))
     2576dnl  __(ldru(arg_z,-node_size(imm0)))
     2577dnl  __(cmpr(cr0,imm0,vsp))
     2578dnl  __(stru(arg_z,-node_size(imm3)))
    41452579dnl 2:
    4146 dnl     __(bne cr0,1b)
    4147 dnl     __(add vsp,vsp,nargs) /*  discard values  */
    4148 dnl     __(bx lr)
    4149 dnl    
     2580dnl  __(bne cr0,1b)
     2581dnl  __(add vsp,vsp,nargs) /*  discard values  */
     2582dnl  __(bx lr)
     2583dnl  
    41502584dnl
    41512585dnl /* Add the multiple values that are on top of the vstack to the set  */
     
    41582592dnl
    41592593dnl _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)
     2594dnl  __(cmpri(cr0,nargs,0))
     2595dnl  __(ldr imm1,[tsp,#0])
     2596dnl  __(bne cr0,local_label(save_values_to_tsp))
     2597dnl  __(bx lr)
    41642598dnl         
    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         __endif
    4172 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 dnl
    4186 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 dnl
    4236 dnl /* Restore rest of Lisp context.  */
    4237 dnl /* Could spread out the memory references here to gain a little speed  */
    4238 dnl
    4239 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 dnl
    4251 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         __endif
    4257 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 dnl
    4264 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 dnl     
    4286 dnl         __(restore_saveregs(vsp))
    4287 dnl
    4288 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)
    43632599dnl         
    43642600dnl /* Like misc_alloc (a LOT like it, since it does most of the work), but takes  */
     
    43672603dnl
    43682604dnl _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())
     2605dnl  __(mflr loc_pc)
     2606dnl  __(build_lisp_frame(fn,loc_pc,vsp))
     2607dnl  __(mov fn,#0)
     2608dnl  __(mov temp0,arg_z)  /* initval  */
     2609dnl  __(mov arg_z,arg_y)  /* subtag  */
     2610dnl  __(mov arg_y,arg_x)  /* element-count  */
     2611dnl  __(bl _SPmisc_alloc)
     2612dnl  __(ldr loc_pc,[sp,#lisp_frame.savelr])
     2613dnl  __(mtlr loc_pc)
     2614dnl  __(ldr fn,[sp,#lisp_frame.savefn])
     2615dnl  __(ldr vsp,[sp,#lisp_frame.savevsp])
     2616dnl  __(discard_lisp_frame())
     2617dnl  __(mov fname,#nrs.init_misc)
     2618dnl  __(set_nargs(2))
     2619dnl  __(mov arg_y,temp0)
     2620dnl  __(jump_fname())
    43852621dnl
    43862622dnl /* As in stack_misc_alloc above, only with a non-default initial-value.  */
    43872623dnl
    43882624dnl _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    
     2625dnl  __(mflr loc_pc)
     2626dnl  __(build_lisp_frame(fn,loc_pc,vsp))
     2627dnl  __(mov fn,#0)
     2628dnl  __(mov temp0,arg_z) /* initval  */
     2629dnl  __(mov arg_z,arg_y) /* subtag  */
     2630dnl  __(mov arg_y,arg_x) /* element-count  */
     2631dnl  __(bl _SPstack_misc_alloc)
     2632dnl  __(ldr loc_pc,[sp,#lisp_frame.savelr])
     2633dnl  __(mtlr loc_pc)
     2634dnl  __(ldr fn,[sp,#lisp_frame.savefn])
     2635dnl  __(ldr vsp,[sp,#lisp_frame.savevsp])
     2636dnl  __(discard_lisp_frame())
     2637dnl  __(mov fname,#nrs.init_misc)
     2638dnl  __(set_nargs(2))
     2639dnl  __(mov arg_y,temp0)
     2640dnl  __(jump_fname())
     2641dnl
     2642dnl  
    44072643dnl _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())
     2644dnl  __(ref_nrs_value(fname,builtin_functions))
     2645dnl  __(la imm0,misc_data_offset(imm0))
     2646dnl  __(ldrx(fname,fname,imm0))
     2647dnl  __(jump_fname())
    44122648dnl
    44132649dnl /* the value of the nilreg-relative symbol %builtin-functions% should be  */
     
    44162652dnl
    44172653dnl _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())
     2654dnl  __(set_nargs(0))
     2655dnl  __(ref_nrs_value(fname,builtin_functions))
     2656dnl  __(la imm0,misc_data_offset(imm0))
     2657dnl  __(ldrx(fname,fname,imm0))
     2658dnl  __(jump_fname())
    44232659dnl
    44242660dnl _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())
     2661dnl  __(ref_nrs_value(fname,builtin_functions))
     2662dnl  __(set_nargs(1))
     2663dnl  __(la imm0,misc_data_offset(imm0))
     2664dnl  __(ldrx(fname,fname,imm0))
     2665dnl  __(jump_fname())
    44302666dnl
    44312667dnl _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())
     2668dnl  __(set_nargs(2))
     2669dnl  __(ref_nrs_value(fname,builtin_functions))
     2670dnl  __(la imm0,misc_data_offset(imm0))
     2671dnl  __(ldrx(fname,fname,imm0))
     2672dnl  __(jump_fname())
    44372673dnl
    44382674dnl
    44392675dnl _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    
     2676dnl  __(set_nargs(3))
     2677dnl  __(ref_nrs_value(fname,builtin_functions))
     2678dnl  __(la imm0,misc_data_offset(imm0))
     2679dnl  __(ldrx(fname,fname,imm0))
     2680dnl  __(jump_fname())
     2681dnl  
    44462682dnl
    44472683dnl _spentry(popj)
    4448 dnl     .globl C(popj)
     2684dnl  .globl C(popj)
    44492685dnl 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)
     2686dnl  __(ldr loc_pc,[sp,#lisp_frame.savelr])
     2687dnl  __(ldr vsp,[sp,#lisp_frame.savevsp])
     2688dnl  __(mtlr loc_pc)
     2689dnl  __(ldr fn,[sp,#lisp_frame.savefn])
     2690dnl  __(discard_lisp_frame())
     2691dnl  __(bx lr)
    44562692dnl
    44572693dnl _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)
     2694dnl  __(mflr loc_pc)
     2695dnl  __(mtctr loc_pc)
     2696dnl  __(ldr loc_pc,[sp,#lisp_frame.savelr])
     2697dnl  __(mtlr loc_pc)
     2698dnl  __(ldr vsp,[sp,#lisp_frame.savevsp])
     2699dnl  __(ldr fn,[sp,#lisp_frame.savefn])
     2700dnl  __(discard_lisp_frame())
     2701dnl  __(bctr)
    44662702dnl
    44672703dnl _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)
     2704dnl  __(ldr imm0,[rcontext,#tcr.cs_limit])
     2705dnl  __(build_lisp_frame(fn,loc_pc,vsp))
     2706dnl  __(mov fn,nfn)
     2707dnl  __(trllt(sp,imm0))
     2708dnl  __(bx lr)
    44732709dnl
    44742710dnl _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)
     2711dnl  __(add imm0,vsp,imm0)
     2712dnl  __(build_lisp_frame(fn,loc_pc,imm0))
     2713dnl  __(ldr imm0,[rcontext,#tcr.cs_limit])
     2714dnl  __(mov fn,nfn)
     2715dnl  __(trllt(sp,imm0))
     2716dnl  __(bx lr)
    44812717dnl
    44822718dnl
     
    44842720dnl /* winds up in loc-pc instead of getting thrashed around ...  */
    44852721dnl _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)
     2722dnl  __(ldr loc_pc,[sp,#lisp_frame.savelr])
     2723dnl  __(ldr vsp,[sp,#lisp_frame.savevsp])
     2724dnl  __(ldr fn,[sp,#lisp_frame.savefn])
     2725dnl  __(discard_lisp_frame())
     2726dnl  __(bx lr)
    44912727dnl
    44922728dnl         
     
    44982734dnl /* multiple values, then things are even simpler.  */
    44992735dnl _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)
     2736dnl  __(ref_global(imm1,ret1val_addr))
     2737dnl  __(cmpr(cr0,imm1,loc_pc))
     2738dnl  __(build_lisp_frame(fn,loc_pc,imm0))
     2739dnl  __(bne cr0,1f)
     2740dnl  __(ref_global(imm0,lexpr_return))
     2741dnl  __(build_lisp_frame(rzero,imm0,vsp))
     2742dnl  __(mov loc_pc,imm1)
     2743dnl  __(ldr imm0,[rcontext,#tcr.cs_limit])
     2744dnl  __(trllt(sp,imm0))
     2745dnl  __(mov fn,#0)
     2746dnl  __(bx lr)
    45112747dnl
    45122748dnl         /* The single-value case just needs to return to something that'll pop  */
    45132749dnl         /* the variable-length frame off of the vstack.  */
    45142750dnl 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)
     2751dnl  __(ref_global(loc_pc,lexpr_return1v))
     2752dnl  __(ldr imm0,[rcontext,#tcr.cs_limit])
     2753dnl  __(trllt(sp,imm0))
     2754dnl  __(mov fn,#0)
     2755dnl  __(bx lr)
     2756dnl
    46272757dnl         
    46282758dnl         
    46292759dnl
    46302760dnl _spentry(builtin_div)
    4631 dnl     __(jump_builtin(_builtin_div,2))
     2761dnl  __(jump_builtin(_builtin_div,2))
    46322762dnl
    46332763dnl
     
    46462776dnl         __(cmpr(cr0,imm0,imm1))
    46472777dnl         __(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)
     2778dnl  __(jump_builtin(_builtin_eql,2))
     2779dnl 1: __(mov arg_z,#t_value)
     2780dnl  __(bx lr)
     2781dnl 2: __(mov arg_z,#nil_value)
     2782dnl  __(bx lr)
    46532783dnl         
    46542784dnl _spentry(builtin_length)
    46552785dnl         __(cmpri(cr1,arg_z,nil_value))
    4656 dnl     __(extract_typecode(imm0,arg_z))
    4657 dnl     __(cmpri(cr0,imm0,min_vector_subtag))
     2786dnl  __(extract_typecode(imm0,arg_z))
     2787dnl  __(cmpri(cr0,imm0,min_vector_subtag))
    46582788dnl         __(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)
     2789dnl   __(cmpwi cr2,imm0,tag_list)
     2790dnl  __(beq- cr0,2f)
     2791dnl  __(blt- cr0,3f)
     2792dnl  /* (simple-array * (*))  */
     2793dnl  __(vector_length(arg_z,arg_z,imm0))
     2794dnl  __(bx lr)
    46692795dnl 1:      __(mov arg_z,#0)
    46702796dnl         __(bx lr)
    46712797dnl 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)
     2798dnl  __(ldr arg_z,[arg_z,#vectorH.logsize])
     2799dnl  __(bx lr)       
     2800dnl 3: __(bne cr2,8f)
     2801dnl  __(mov temp2,#-1<<fixnum_shift)
     2802dnl  __(mov temp0,arg_z) /* fast pointer  */
     2803dnl  __(mov temp1,arg_z) /* slow pointer  */
     2804dnl 4:  __(extract_lisptag(imm0,temp0))
     2805dnl   __(cmpri(cr7,temp0,nil_value))
     2806dnl   __(cmpri(cr1,imm0,tag_list))
     2807dnl   __(addi temp2,temp2,fixnum_one)
     2808dnl   __(beq cr7,9f)
     2809dnl   __(andi. imm0,temp2,1<<fixnum_shift)
     2810dnl   __(bne cr1,8f)
     2811dnl   __(extract_lisptag(imm1,temp1))
     2812dnl   __(_cdr(temp0,temp0))
     2813dnl   __(cmpri(cr1,imm1,tag_list))
     2814dnl   __(beq cr0,4b)
     2815dnl   __(bne cr1,8f)
     2816dnl   __(_cdr(temp1,temp1))
     2817dnl   __(cmpr(cr0,temp0,temp1))
     2818dnl   __(bne cr0,4b)
     2819
     2820dnl 8:
     2821dnl  __(jump_builtin(_builtin_length,1))
     2822dnl 9:
     2823dnl  __(mov arg_z,temp2)
     2824dnl  __(bx lr)
    47162825dnl         
    47172826dnl _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)
     2827dnl   __(extract_typecode(imm0,arg_z))
     2828dnl    __(cmpri(cr0,imm0,tag_list))
     2829dnl  __(cmpri(cr1,imm0,min_vector_subtag))
     2830dnl  __(beq cr0,1f)
     2831dnl  __(blt- cr1,2f)
     2832dnl  __(mov arg_z,#nil_value)
     2833dnl  __(bx lr)
     2834dnl 1: __(mov arg_z,#t_value)
     2835dnl  __(bx lr)
    47342836dnl 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))
     2837dnl  __(jump_builtin(_builtin_seqtype,1))
     2838
     2839/* This is                 
     2840_spentry(builtin_assq)
     2841        __(b 2f)
     28421:      __(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)
     28532:      __(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)
     28601:      __(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)
     28672:      __(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)
     28841:
     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 */
     29161:      __(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)
     29309: 
     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)
     29391:
     2940        __(jump_builtin(_builtin_negate,1))
    49512941dnl
    49522942dnl _spentry(builtin_logxor)
     
    49542944dnl         __(extract_lisptag(imm1,arg_z))
    49552945dnl         __(ands imm0,imm0,imm1)
    4956 dnl     __(eoreq arg_z,arg_y,arg_z)
    4957 dnl     __(bxeq lr)
    4958 dnl     __(jump_builtin(_builtin_logxor,2))
     2946dnl  __(eoreq arg_z,arg_y,arg_z)
     2947dnl  __(bxeq lr)
     2948dnl  __(jump_builtin(_builtin_logxor,2))
    49592949dnl
    49602950dnl
     
    49622952dnl         
    49632953dnl _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))
     2954dnl  __(extract_typecode(imm0,arg_x))
     2955dnl  __(cmpri(cr0,imm0,min_vector_subtag))
     2956dnl  __(box_fixnum(temp0,imm0))
     2957dnl  __(bgt cr0,1f)
     2958dnl  __(jump_builtin(_builtin_aset1,3))
    49692959dnl 1:
    4970 dnl     __(b _SPsubtag_misc_set)
     2960dnl  __(b _SPsubtag_misc_set)
    49712961dnl
    49722962dnl /* Enter the debugger  */
    49732963dnl _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  */
     2964dnl  __(mov r3,#0)
     2965dnl  __(tw 28,sp,sp) /* 28 = lt|gt|eq (assembler bug for the latter)  */
     2966dnl  __(bx lr)  /* if handler didn't  */
    49772967dnl
    49782968dnl /* */
     
    49822972dnl /* then shrink the eabi_c_frame. */
    49832973dnl /*  */
    4984 dnl    
     2974dnl  
    49852975dnl _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 */
     2976dnl  __(mflr loc_pc)
     2977dnl  __(str(sp,eabi_c_frame.savelr(sp)))
     2978dnl  __(vpush_saveregs())  /* Now we can use save0-save7 to point to stacks  */
     2979dnl  __(mov save0,rcontext) /* or address globals.  */
     2980dnl  __(extract_typecode(imm0,arg_z))
     2981dnl  __(cmpri(imm0,subtag_macptr))
     2982dnl  __(ldr save1,[sp,#0]) /* bottom of reserved lisp frame  */
     2983dnl  __(la save2,-lisp_frame.size(save1)) /* top of lisp frame */
    49942984dnl         __(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])
     2985dnl  __(str(save1,lisp_frame.backlink(save2)))
     2986dnl  __(str(save2,c_frame.backlink(sp)))
     2987dnl  __(str(fn,lisp_frame.savefn(save2)))
     2988dnl  __(str(loc_pc,lisp_frame.savelr(save2)))
     2989dnl  __(str(vsp,lisp_frame.savevsp(save2)))
     2990dnl  __(bne 1f)
     2991dnl  __(ldr arg_z,[arg_z,#macptr.address])
    50022992dnl 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])
     2993dnl  __(ldr save3,[rcontext,#tcr.cs_area])
     2994dnl  __(str(save2,area.active(save3)))
     2995dnl  __(str(allocptr,tcr.save_allocptr(rcontext)))
     2996dnl  __(str(allocbase,tcr.save_allocbase(rcontext)))
     2997dnl  __(str(tsp,tcr.save_tsp(rcontext)))
     2998dnl  __(str(vsp,tcr.save_vsp(rcontext)))
     2999dnl  __(mtctr arg_z)
     3000dnl  __(str(rzero,tcr.ffi_exception(rcontext)))
     3001dnl  __(mffs f0)
     3002dnl  __(stfd f0,tcr.lisp_fpscr(rcontext)) /* remember lisp's fpscr  */
     3003dnl  __(mtfsf 0xff,fp_zero) /* zero foreign fpscr  */
     3004dnl  __(mov imm1,#TCR_STATE_FOREIGN)
     3005dnl  __(str(imm1,tcr.valence(rcontext)))
     3006dnl  __(ldr r2,[rcontext,#tcr.native_thread_info])
     3007dnl  __(ldr r13,[0,#lisp_globals.saveR13])
     3008dnl  __(ldr r3,[sp,#eabi_c_frame.param0])
     3009dnl  __(ldr r4,[sp,#eabi_c_frame.param1])
     3010dnl  __(ldr r5,[sp,#eabi_c_frame.param2])
     3011dnl  __(ldr r6,[sp,#eabi_c_frame.param3])
     3012dnl  __(ldr r7,[sp,#eabi_c_frame.param4])
     3013dnl  __(ldr r8,[sp,#eabi_c_frame.param5])
     3014dnl  __(ldr r9,[sp,#eabi_c_frame.param6])
     3015dnl  __(ldr r10,[sp,#eabi_c_frame.param7])
     3016dnl  __(la save1,eabi_c_frame.minsiz-eabi_c_frame.param0(sp))
     3017dnl  __(str(rzero,eabi_c_frame.savelr(save1)))
     3018dnl  __(str(save2,eabi_c_frame.backlink(save1)))
     3019dnl  __(mov sp,save1)
     3020dnl  /* If we're calling a varargs C function, it'll want to */
     3021dnl  /* know whether or not we've passed any args in FP regs. */
     3022dnl  /* Better to say that we did (and force callee to save FP */
     3023dnl  /* arg regs on entry) than to say that we didn't and get */
     3024dnl  /* garbage results  */
     3025dnl  __(crset 6)
     3026dnl  __(bctrl)
     3027dnl  /* C should have preserved save0 (= rcontext) for us.  */
     3028dnl  __(ldr sp,[sp,#0])
     3029dnl  __(mov imm2,save0)
     3030dnl  __(ldr vsp,[sp,#lisp_frame.savevsp])
     3031dnl  __(mov rzero,#0)
     3032dnl  __(mov loc_pc,rzero)
     3033dnl  __(mov arg_x,#nil_value)
     3034dnl  __(mov arg_y,#nil_value)
     3035dnl  __(mov arg_z,#nil_value)
     3036dnl  __(mov temp0,#nil_value)
     3037dnl  __(mov temp1,#nil_value)
     3038dnl  __(mov temp2,#nil_value)
     3039dnl  __(mov temp3,#nil_value)
     3040dnl  __(mov fn,#nil_value)
     3041dnl  __(mov rcontext,imm2)
     3042dnl  __(mov imm2,#TCR_STATE_LISP)
     3043dnl  __(ldr tsp,[rcontext,#tcr.save_tsp])
    50543044dnl         __(mov save0,#0)
    50553045dnl         __(mov save1,#0)
     
    50623052dnl         __(mov allocptr,#-dnode_size)
    50633053dnl         __(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  */
     3054dnl  __(str(imm2,tcr.valence(rcontext)))
     3055dnl  __(vpop_saveregs())
     3056dnl  __(ldr allocptr,[rcontext,#tcr.save_allocptr])
     3057dnl  __(ldr allocbase,[rcontext,#tcr.save_allocbase])
     3058dnl  __(ldr loc_pc,[sp,#lisp_frame.savelr])
     3059dnl  __(mtlr loc_pc)
     3060dnl  __(ldr fn,[sp,#lisp_frame.savefn])
     3061dnl  __(mffs f0)
     3062dnl  __(stfd f0,8(sp))
     3063dnl  __(lwz imm3,12(sp)) /* imm3 = FPSCR after call  */
    50743064dnl         __(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'))
     3065dnl  __(discard_lisp_frame())
     3066dnl  __(str(imm2,tcr.ffi_exception(rcontext)))
     3067dnl  __(lfd f0,tcr.lisp_fpscr(rcontext))
     3068dnl  __(mtfsf 0xff,f0)
     3069dnl  __(check_pending_interrupt(`cr1'))
    50803070dnl         __(mtxer rzero)
    50813071dnl         __(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
     3072dnl  __(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)
     30870:             
     3088        __(uuo_error_reg_not_xtype(al,arg_z,xtype_u64))
     30891:
     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))
     31022:      __(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
    55933176dnl /* Restore current thread's interrupt level to arg_z, */
    55943177dnl /* noting whether the tcr's interrupt_pending flag was set.  */
    55953178dnl _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)
     3179dnl  __(cmpri(cr1,arg_z,0))
     3180dnl  __(ldr imm0,[rcontext,#tcr.interrupt_pending])
     3181dnl  __(cmpri(cr0,imm0,0))
     3182dnl  __(bne cr1,1f)
     3183dnl  __(beq cr0,1f)
     3184dnl  __(str(rzero,tcr.interrupt_pending(rcontext)))
     3185dnl  __(mov nargs,#fixnum_one)
     3186dnl  __(trgti(nargs,0))
     3187dnl  __(bx lr)
    56053188dnl 1:
    56063189dnl         __(ldr nargs,[rcontext,#tcr.tlb_pointer])
    5607 dnl     __(str(arg_z,INTERRUPT_LEVEL_BINDING_INDEX(nargs)))
    5608 dnl     __(bx lr)
    5609 dnl
    5610 dnl
     3190dnl  __(str(arg_z,INTERRUPT_LEVEL_BINDING_INDEX(nargs)))
     3191dnl  __(bx lr)
     3192
     3193       
    56113194dnl /* Construct a lisp integer out of the 32-bit signed value in imm0 */
    5612 dnl
    5613 dnl         
    5614 dnl
    5615 dnl
    5616 dnl
    5617 dnl /*  */
    56183195dnl /* 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))
     32367:             
     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
    56983256dnl _spentry(unbind)
    56993257dnl         __(ldr imm1,[rcontext,#tcr.db_link])
     
    57333291dnl         __(str(imm1,tcr.db_link(rcontext)))
    57343292dnl         __(bx lr)
    5735 dnl    
     3293dnl  
    57363294dnl
    57373295dnl
     
    57473305dnl                         
    57483306dnl _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
     3307dnl  __(ldr imm0,[tsp,#tsp_frame.backlink]) /* ignore .SPnthrowXXX values frame  */
     3308dnl  __(ldr imm0,[imm0,#tsp_frame.data_offset])
     3309dnl  __(cmpri(cr0,imm0,0))
     3310dnl  __(unbox_fixnum(imm0,imm0))
     3311dnl  __(bne+ cr0,_SPunbind_n)
     3312dnl  __(bx lr)
     3313dnl
     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)
     33780:     
     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)
     33895:       /* 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)
     34260:      __(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)
     34630:      __(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
    59183474dnl /* As for aref2 above, but temp = array, arg_x = i, arg_y = j, arg_z = newval */
    59193475dnl _spentry(aset2)
     
    59423498dnl         __(cmpri(imm1,subtag_vectorH))
    59433499dnl         __(add arg_y,arg_y,imm0)
    5944 dnl         __(bgt local_label(misc_set_common))
     3500dnl         __(bgt C(misc_set_common))
    59453501dnl         __(b 0b)
    59463502dnl 1:             
     
    59783534dnl         __(cmpri(imm1,subtag_vectorH))
    59793535dnl         __(add arg_y,arg_y,temp0)
    5980 dnl         __(bgt local_label(misc_set_common))
     3536dnl         __(bgt C(misc_set_common))
    59813537dnl         __(b 0b)
    59823538dnl 1:             
     
    59863542dnl         
    59873543dnl
    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
     3567local_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
     3842local_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)
     3847local_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)
     3854local_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)
     3860local_label(misc_ref_s32):       
     3861        __(add imm0,arg_z,#misc_data_offset)
     3862        __(ldr imm0,[arg_y,imm0])
     3863        __(b _SPmakes32)
     3864local_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)       
     3869local_label(misc_ref_u32):       
     3870        __(add imm0,arg_z,#misc_data_offset)
     3871        __(ldr imm0,[arg_y,imm0])
     3872        __(b _SPmakeu32)
     3873local_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)
     3881local_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)
     3894local_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)
     3900local_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)
     3906local_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)
     3913local_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)
     3919local_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)
     3925local_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])
     3934local_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
     4208local_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))
     4217local_label(set_set32):         
     4218        __(str imm1,[arg_x,imm0])
     4219        __(bx lr)
     4220local_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))
     4232local_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))
     4240local_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)
     4247local_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)
     4254local_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)
     4262local_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))
     4276local_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)
     4284local_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)
     4293local_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)
     4302local_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)
     4313local_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)
     4324local_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)
     4335local_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
     4352local_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)
     4361local_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  
    5353define(`unaryUUO',`UUO($1,uuo_format_unary,($2|($3<<4)))')
    5454
     55define(`binaryUUO',`UUO($1,uuo_format_binary,($2|($3<<4)|($4<<8)))')
     56
    5557/* Simple type error (reg not lisptag), cond = $1, reg = $2, lisptag = $3 */
    5658define(`uuo_error_reg_not_lisptag',`UUO($1,uuo_format_error_lisptag,$2|($3<<4))')
     
    7173define(`uuo_gc_trap',`nullaryUUO($1,2)') /* probably unconditional */
    7274define(`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
     77define(`uuo_interrupt_now',`nullaryUUO($1,4)')
     78define(`uuo_suspend_now',`nullaryUUO($1,5)')
    7679
    7780/* Unary UUOs */
     
    7982define(`uuo_cerror_unbound',`unaryUUO($1,$2,1)')
    8083define(`uuo_error_not_callable',`unaryUUO($1,$2,2)')
     84define(`uuo_tlb_too_small',`unaryUUO($1,$2,4)')
    8185
    8286/* Binary UUOs */
  • branches/arm/lisp-kernel/ppc-macros.s

    r13337 r13679  
    602602        __(sub allocptr,allocptr,$3)
    603603        __(alloc_trap())
    604         __(str($2,misc_header_offset(allocptr)))
     604        __(str($2,[allocptr,#misc_header_offset]))
    605605        __(mr $1,allocptr)
    606606        __(clear_alloc_tag())
Note: See TracChangeset for help on using the changeset viewer.