Changeset 13679


Ignore:
Timestamp:
Apr 28, 2010, 10:31:40 AM (9 years ago)
Author:
gb
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))