Changeset 6364 for branches/x8664-call


Ignore:
Timestamp:
Apr 29, 2007, 9:27:29 AM (13 years ago)
Author:
gb
Message:

Lose most of the "new" call/ret-based subprim variants; most things
now use call/ret, with a few exceptions that manipulate the stack
directly.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/x8664-call/ccl/lisp-kernel/x86-spentry64.s

    r6351 r6364  
    3838])
    3939
    40 define([pop_jump_builtin],[
    41         pop %ra0
    42         jump_builtin($1,$2)
    43 ])               
    4440       
    4541
     
    6157        __(xorq %imm1,%imm0)
    6258        __(movq %imm0,misc_data_offset(%arg_z))
    63         __(jmp *%ra0)   
     59        __(ret)
    6460_endsubp(fix_overflow)
    6561
    6662
    67 _spentry(nfix_overflow)       
    68 C(nfix_one_bit_overflow):       
    69         __(movq $two_digit_bignum_header,%imm0)
    70         __(Misc_Alloc_Fixed([],aligned_bignum_size(2)))
    71         __(unbox_fixnum(%arg_z,%imm0))
    72         __(movq $0xe000000000000000,%imm1)
    73         __(mov %temp0,%arg_z)
    74         __(xorq %imm1,%imm0)
    75         __(movq %imm0,misc_data_offset(%arg_z))
    76         __(ret)
    77 _endsubp(nfix_overflow)
    78                
    7963/* Make a lisp integer (fixnum or two-digit bignum) from the signed  */
    8064/* 64-bit value in %imm0.   */
     
    9175        __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(2)))
    9276        __(movq %mm0,misc_data_offset(%arg_z))
    93 0:      __(jmp *%ra0)
     770:      __(ret)
    9478_endsubp(makes64)       
    9579
    96 _spentry(nmakes64)
    97         __(movq %imm0,%imm1)
    98         __(shlq $fixnumshift,%imm1)
    99         __(movq %imm1,%arg_z)
    100         __(sarq $fixnumshift,%imm1)
    101         __(cmpq %imm1,%imm0)
    102         __(jz,pt 0f)
    103         __(movd %imm0,%mm0)
    104         __(movq $two_digit_bignum_header,%imm0)
    105         __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(2)))
    106         __(movq %mm0,misc_data_offset(%arg_z))
    107 0:      __(ret)
    108 _endsubp(nmakes64)     
    10980                                       
    11081
     
    143114        __(movq %mm0,misc_data_offset(%arg_z))
    144115        __(movq %mm1,misc_data_offset+8(%arg_z))
    145         __(jmp *%ra0)
     116        __(ret)
    1461173:      __(mov $three_digit_bignum_header,%imm0)
    147118        __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(3)))
    148119        __(movq %mm0,misc_data_offset(%arg_z))
    149120        __(movd %mm1,misc_data_offset+8(%arg_z))
    150         __(jmp *%ra0)
     121        __(ret)
    151122_endfn
    152123
    153 /* %imm1:%imm0 constitute a signed integer, almost certainly a bignum.  */
    154 /* Make a lisp integer out of those 128 bits ..   */
    155        
    156 _startfn(C(nmakes128))
    157        
    158         /*  We're likely to have to make a bignum out of the integer in %imm1 and  */
    159         /*  %imm0. We'll need to use %imm0 and %imm1 to cons the bignum, and  */
    160         /*  will need to do some arithmetic (determining significant bigits)  */
    161         /*  on %imm0 and %imm1 in order to know how large that bignum needs to be.  */
    162         /*  Cache %imm0 and %imm1 in %mm0 and %mm1.   */
    163    
    164         __(movd %imm0,%mm0)
    165         __(movd %imm1,%mm1)
    166        
    167         /* If %imm1 is just a sign extension of %imm0, make a 64-bit signed integer.   */
    168        
    169         __(sarq $63,%imm0)
    170         __(cmpq %imm0,%imm1)
    171         __(movd %mm0,%imm0)
    172         __(je _SPnmakes64)
    173        
    174         /* Otherwise, if the high 32 bits of %imm1 are a sign-extension of the  */
    175         /* low 32 bits of %imm1, make a 3-digit bignum.  If the upper 32 bits  */
    176         /* of %imm1 are significant, make a 4 digit bignum   */
    177        
    178         __(movq %imm1,%imm0)
    179         __(shlq $32,%imm0)
    180         __(sarq $32,%imm0)
    181         __(cmpq %imm0,%imm1)
    182         __(jz 3f)
    183         __(mov $four_digit_bignum_header,%imm0)
    184         __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(4)))
    185         __(movq %mm0,misc_data_offset(%arg_z))
    186         __(movq %mm1,misc_data_offset+8(%arg_z))
    187         __(ret)
    188 3:      __(mov $three_digit_bignum_header,%imm0)
    189         __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(3)))
    190         __(movq %mm0,misc_data_offset(%arg_z))
    191         __(movd %mm1,misc_data_offset+8(%arg_z))
    192         __(ret)
    193 _endfn
    194124       
    195125/* %imm1:%imm0 constitute an unsigned integer, almost certainly a bignum.  */
     
    226156        __(movq %mm0,misc_data_offset(%arg_z))
    227157        __(movd %mm1,misc_data_offset+8(%arg_z))
    228         __(jmp *%ra0)
     158        __(ret)
    2291594:      __(movq $four_digit_bignum_header,%imm0)
    230160        __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(4)))
     
    2341646:      __(movq %mm0,misc_data_offset(%arg_z))
    235165        __(movq %mm0,misc_data_offset+8(%arg_z))
    236         __(jmpq *%ra0)
     166        __(ret)
    237167_endfn
    238168
     
    549479local_label(misc_ref_node):
    550480        __(movq misc_data_offset(%arg_y,%arg_z),%arg_z)
    551         __(jmp *%ra0)
     481        __(ret)
    552482local_label(misc_ref_u64):
    553483        __(movq misc_data_offset(%arg_y,%arg_z),%imm0)
     
    558488        __(Misc_Alloc_Fixed(%arg_z,double_float.size))
    559489        __(movsd %fp1,double_float.value(%arg_z))
    560         __(jmp *%ra0)
     490        __(ret)
    561491local_label(misc_ref_fixnum_vector):   
    562492        __(movq misc_data_offset(%arg_y,%arg_z),%imm0)
    563493        __(box_fixnum(%imm0,%arg_z))
    564         __(jmp *%ra0)
     494        __(ret)
    565495local_label(misc_ref_s64):     
    566496        __(movq misc_data_offset(%arg_y,%arg_z),%imm0)
     
    571501        __(movl misc_data_offset(%arg_y,%imm0),%imm0_l)
    572502        __(box_fixnum(%imm0,%arg_z))
    573         __(jmp *%ra0)
     503        __(ret)
    574504local_label(misc_ref_s32):
    575505        __(movq %arg_z,%imm0)
     
    577507        __(movslq misc_data_offset(%arg_y,%imm0),%imm0)
    578508        __(box_fixnum(%imm0,%arg_z))
    579         __(jmp *%ra0)
     509        __(ret)
    580510local_label(misc_ref_single_float_vector):
    581511        __(movq %arg_z,%imm0)
     
    585515        __(shl $32,%imm0)
    586516        __(lea subtag_single_float(%imm0),%arg_z)
    587         __(jmp *%ra0)
     517        __(ret)
    588518local_label(misc_ref_u8):
    589519        __(movq %arg_z,%imm0)
     
    591521        __(movzbl misc_data_offset(%arg_y,%imm0),%imm0_l)
    592522        __(box_fixnum(%imm0,%arg_z))
    593         __(jmp *%ra0)
     523        __(ret)
    594524local_label(misc_ref_s8):       
    595525        __(movq %arg_z,%imm0)
     
    597527        __(movsbq misc_data_offset(%arg_y,%imm0),%imm0)
    598528        __(box_fixnum(%imm0,%arg_z))
    599         __(jmp *%ra0)
     529        __(ret)
    600530local_label(misc_ref_string):
    601531        __(movq %arg_z,%imm0)
     
    604534        __(shlq $charcode_shift,%imm0)
    605535        __(leaq subtag_character(%imm0),%arg_z)
    606         __(jmp *%ra0)
     536        __(ret)
    607537local_label(misc_ref_new_string):
    608538        __(movq %arg_z,%imm0)
     
    611541        __(shlq $charcode_shift,%imm0)
    612542        __(leaq subtag_character(%imm0),%arg_z)
    613         __(jmp *%ra0)       
     543        __(ret)       
    614544local_label(misc_ref_u16):     
    615545        __(movq %arg_z,%imm0)
     
    617547        __(movzwl misc_data_offset(%arg_y,%imm0),%imm0_l)
    618548        __(box_fixnum(%imm0,%arg_z))
    619         __(jmp *%ra0)
     549        __(ret)
    620550local_label(misc_ref_s16):     
    621551        __(movq %arg_z,%imm0)
     
    623553        __(movswq misc_data_offset(%arg_y,%imm0),%imm0)
    624554        __(box_fixnum(%imm0,%arg_z))
    625         __(jmp *%ra0)
     555        __(ret)
    626556local_label(misc_ref_bit_vector):
    627557        __(unbox_fixnum(%arg_z,%imm0))
     
    634564        __(andl $fixnum_one,%imm0_l)
    635565        __(movq %imm0,%arg_z)
    636         __(jmp *%ra0)
     566        __(ret)
    637567local_label(misc_ref_invalid):
    638568        __(movq $XBADVEC,%arg_x)
     
    1013943        __(jne local_label(misc_set_bad))
    10149449:      __(movq %imm0,misc_data_offset(%arg_x,%arg_y))
    1015         __(jmp *%ra0)
     945        __(ret)
    1016946local_label(misc_set_fixnum_vector):
    1017947        __(movq %arg_z,%imm0)
     
    1020950        __(jne local_label(misc_set_bad))
    1021951        __(movq %imm0,misc_data_offset(%arg_x,%arg_y))
    1022         __(jmp *%ra0)   
     952        __(ret)
    1023953local_label(misc_set_s64):
    1024954        __(movq %arg_z,%imm0)
     
    1038968        __(jne local_label(misc_set_bad))
    10399699:      __(movq %imm0,misc_data_offset(%arg_x,%arg_y))
    1040         __(jmp *%ra0)   
     970        __(ret)
    1041971local_label(misc_set_bad):
    1042972        __(movq %arg_z,%arg_y)
     
    1054984        __(movq double_float.value(%arg_z),%imm0)
    1055985        __(movq %imm0,misc_dfloat_offset(%arg_x,%arg_y))
    1056         __(jmp *%ra0)
     986        __(ret)
    1057987local_label(misc_set_s32):     
    1058988        __(movq %arg_z,%imm0)
     
    1067997        __(shr $fixnumshift,%imm0)
    1068998        __(movl %imm0_l,misc_data_offset(%arg_x,%imm1))
    1069         __(jmp *%ra0)
     999        __(ret)
    10701000local_label(misc_set_single_float_vector):
    10711001        __(cmpb $tag_single_float,%arg_z_b)
     
    10761006        __(shr $32,%imm0)
    10771007        __(movl %imm0_l,misc_data_offset(%arg_x,%imm1))
    1078         __(jmp *%ra0)
     1008        __(ret)
    10791009local_label(misc_set_u32):
    10801010        __(movq %arg_y,%imm1)   
     
    10851015        __(unbox_fixnum(%arg_z,%imm0))
    10861016        __(movl %imm0_l,misc_data_offset(%arg_x,%imm1))
    1087         __(jmp *%ra0)
     1017        __(ret)
    10881018local_label(misc_set_bit_vector):       
    10891019        __(testq $~fixnumone,%arg_z)
     
    10971027local_label(misc_set_set_bit): 
    10981028        __(btsq %imm0,misc_data_offset(%arg_x,%imm1,8))
    1099         __(jmp *%ra0)
     1029        __(ret)
    11001030local_label(misc_set_clr_bit): 
    11011031        __(btrq %imm0,misc_data_offset(%arg_x,%imm1,8))
    1102         __(jmp *%ra0)
     1032        __(ret)
    11031033local_label(misc_set_u8):       
    11041034        __(testq $~(0xff<<fixnumshift),%arg_z)
     
    11081038        __(shrq $3,%imm1)
    11091039        __(movb %imm0_b,misc_data_offset(%arg_x,%imm1))
    1110         __(jmp *%ra0)
     1040        __(ret)
    11111041local_label(misc_set_s8):
    11121042        __(movq %arg_z,%imm0)
     
    11211051        __(shrq $3,%imm1)
    11221052        __(movb %imm0_b,misc_data_offset(%arg_x,%imm1))
    1123         __(jmp *%ra0)
     1053        __(ret)
    11241054local_label(misc_set_string):
    11251055        __(cmpb $subtag_character,%arg_z_b)
     
    11301060        __(shrq $3,%imm1)
    11311061        __(movb %imm0_b,misc_data_offset(%arg_x,%imm1))
    1132         __(jmp *%ra0)
     1062        __(ret)
    11331063local_label(misc_set_new_string):
    11341064        __(cmpb $subtag_character,%arg_z_b)
     
    11391069        __(shrq $1,%imm1)
    11401070        __(movl %imm0_l,misc_data_offset(%arg_x,%imm1))
    1141         __(jmp *%ra0)       
     1071        __(ret)       
    11421072local_label(misc_set_s16):     
    11431073        __(movq %arg_z,%imm0)
     
    11521082        __(shrq $fixnumshift,%imm0)
    11531083        __(movw %imm0_w,misc_data_offset(%arg_x,%imm1))
    1154         __(jmp *%ra0)
     1084        __(ret)
    11551085local_label(misc_set_u16):
    11561086        __(movq %arg_y,%imm1)
     
    11601090        __(unbox_fixnum(%arg_z,%imm0))
    11611091        __(movw %imm0_w,misc_data_offset(%arg_x,%imm1))
    1162         __(jmp *%ra0)
     1092        __(ret)
    11631093local_label(misc_set_invalid):
    11641094        __(push $XSETBADVEC)
     
    11921122        __(cmovneq -node_size(%rsp,%nargs_q),%arg_z)
    11931123        __(leaveq)
    1194         __(popq %ra0)
    1195         __(jmp *%ra0)
     1124        __(ret)
     1125
    11961126       
    11971127/* actually need to return values ; always need to copy   */
     
    12291159
    12301160_spentry(mkcatch1v)
    1231         __(Make_Catch(0))
    1232         __(jmp *%ra0)
     1161        __(nMake_Catch(0))
     1162        __(ret)
    12331163_endsubp(mkcatch1v)
    12341164
    1235 _spentry(nmkcatch1v)
    1236         __(nMake_Catch(0))
    1237         __(ret)
    1238 _endsubp(nmkcatch1v)
    1239        
    12401165_spentry(mkunwind)
    12411166        __(movq $undefined,%arg_z)
     
    12431168        __(jmp *%ra0)
    12441169_endsubp(mkunwind)
    1245 
     1170       
    12461171/* this takes a return address in %ra0; it's "new" in that it does the
    12471172   double binding of *interrupt-level* out-of-line */
     
    12591184        __(jmp _SPbind_interrupt_level)
    12601185_endsubp(nmkunwind)
    1261        
    12621186
    12631187_spentry(mkcatchmv)
    1264         __(Make_Catch(fixnumone))
    1265         __(jmp *%ra0)
     1188        __(nMake_Catch(fixnumone))
     1189        __(ret)
    12661190_endsubp(mkcatchmv)
    1267 
    1268 _spentry(nmkcatchmv)
    1269         __(nMake_Catch(fixnumone))
    1270         __(ret)
    1271 _endsubp(nmkcatchmv)
    12721191       
    12731192_spentry(throw)
     
    13051224        __(jz local_label(_threw_one_value_dont_unbind))
    13061225        __(lea local_label(_threw_one_value_dont_unbind)(%rip),%ra0)
     1226        __(push %ra0)
    13071227        __(jmp _SPunbind_to)
    13081228__(tra(local_label(_threw_one_value_dont_unbind)))
     
    13341254        __(cmpq %imm0,%imm1)
    13351255        __(je local_label(_threw_multiple_dont_unbind))
    1336         __(leaq local_label(_threw_multiple_dont_unbind)(%rip),%r10)
     1256        __(leaq local_label(_threw_multiple_dont_unbind)(%rip),%ra0)
     1257        __(push %ra0)
    13371258        __(jmp _SPunbind_to)
    13381259__(tra(local_label(_threw_multiple_dont_unbind)))
     
    13861307        __(push %ra0)
    13871308        __(leaq local_label(_nthrowv_back_from_unbind)(%rip),%ra0)
     1309        __(push %ra0)
    13881310        __(jmp _SPunbind_to)
    13891311__(tra(local_label(_nthrowv_back_from_unbind)))
     
    14721394/* Ready to call cleanup code. set up tra, jmp to %xfn   */
    14731395        __(leaq local_label(_nthrowv_called_cleanup)(%rip),%ra0)
     1396        __(push %ra0)
    14741397        __(movb $0,%rcontext:tcr.unwinding)
    14751398        __(jmp *%xfn)
     
    15221445        __(push %ra0)
    15231446        __(leaq local_label(_nthrow1v_back_from_unbind)(%rip),%ra0)
     1447        __(push %ra0)
    15241448        __(jmp _SPunbind_to)
    15251449__(tra(local_label(_nthrow1v_back_from_unbind)))
     
    15801504        __(leaq local_label(_nthrow1v_called_cleanup)(%rip),%ra0)
    15811505        __(movb $0,%rcontext:tcr.unwinding)
     1506        __(push %ra0)
    15821507        __(jmp *%xfn)
    15831508__(tra(local_label(_nthrow1v_called_cleanup)))
     
    16231548        __(movq $XSYMNOBIND,%arg_y)
    16241549        __(set_nargs(2))
     1550        __(push %ra0)
    16251551        __(jmp _SPksignalerr)   
    16261552_endsubp(bind)
     
    165315799:      __(movq $XSYMNOBIND,%arg_y)
    16541580        __(set_nargs(2))
     1581        __(push %ra0)
    16551582        __(jmp _SPksignalerr)
    16561583_endsubp(bind_self)
     
    167316009:      __(movq $XSYMNOBIND,%arg_y)
    16741601        __(set_nargs(2))
     1602        __(push %ra0)
    16751603        __(jmp _SPksignalerr)
    16761604_endsubp(bind_nil)
     
    170716359:      __(movq $XSYMNOBIND,%arg_y)
    17081636        __(set_nargs(2))
     1637        __(push %ra0)
    17091638        __(jmp _SPksignalerr)
    17101639_endsubp(bind_self_boundp_check)
     
    18211750/* setting the bit needs to be done atomically, unless we're sure that other  */
    18221751/* threads are suspended.)  */
    1823 /* We can unconditionally set the suspended thread's RIP to its RA0.  */
     1752/* We can unconditionally set the suspended thread's RIP to the return address.  */
    18241753
    18251754       
     
    18301759        __(_rplaca(%arg_y,%arg_z))
    18311760        __(ja 1f)
    1832 0:      __(jmp *%ra0)
     17610:      __(ret)
    183317621:      __(movq %arg_y,%imm0)
    18341763        __(subq lisp_global(heap_start),%imm0)
     
    18431772        __(lock)
    18441773        __(btsq %imm0,(%temp0,%imm1,8))
    1845         __(jmp *%ra0)
     1774        __(ret)
    18461775_endsubp(rplaca)
    18471776
     
    18521781        __(_rplacd(%arg_y,%arg_z))
    18531782        __(ja 1f)
    1854 0:      __(jmp *%ra0)
     17830:      __(ret)
    185517841:      __(movq %arg_y,%imm0)
    18561785        __(subq lisp_global(heap_start),%imm0)
     
    18651794        __(lock)
    18661795        __(btsq %imm0,(%temp0,%imm1,8))
    1867         __(jmp *%ra0)
     1796        __(ret)
    18681797_endsubp(rplacd)
    18691798
     
    18771806        __(movq %arg_z,misc_data_offset(%arg_x,%arg_y))
    18781807        __(ja 1f)
    1879 0:      __(jmp *%ra0)
     18080:      __(ret)
    188018091:      __(lea misc_data_offset(%arg_x,%arg_y),%imm0)
    18811810        __(subq lisp_global(heap_start),%imm0)
     
    18901819        __(lock)
    18911820        __(btsq %imm0,(%temp0,%imm1,8))
    1892         __(jmp *%ra0)               
     1821        __(ret)               
    18931822_endsubp(gvset)
    18941823
     
    19041833        __(movq %arg_z,misc_data_offset(%arg_x,%arg_y))
    19051834        __(ja 1f)
    1906 0:      __(jmp *%ra0)
     18350:      __(ret)
    190718361:      __(lea misc_data_offset(%arg_x,%arg_y),%imm0)
    19081837        __(subq lisp_global(heap_start),%imm0)
     
    19271856        __(lock)
    19281857        __(btsq %imm0,(%temp0,%imm1,8))
    1929         __(jmp *%ra0)               
     1858        __(ret)               
    19301859_endsubp(set_hash_key)
    19311860
     
    19641893C(egc_write_barrier_end):
    196518942:      __(movl $t_value,%arg_z_l)
    1966         __(jmp *%ra0)
     1895        __(ret)
    196718963:      __(movl $nil_value,%arg_z_l)
    1968         __(jmp *%ra0)
     1897        __(ret)
    19691898_endsubp(store_node_conditional)
    19701899                               
     
    200519348:      __(movq $XIMPROPERLIST,%arg_y)
    20061935        __(set_nargs(2))
     1936        __(push %ra0)
    20071937        __(jmp _SPksignalerr)
    200819389:      /* Whew           */
     
    20231953        __(jne 2f)
    20241954        __(TSP_Alloc_Fixed(2*node_size,%imm0))
    2025         __(jmp *%ra0)
     1955        __(ret)
    202619562:      __(movq %imm0,%imm1)
    20271957        __(add %imm1,%imm1)
     
    20531983        __(jne 3b)
    20541984        __(movq %temp1,%rcontext:tcr.db_link)
    2055         __(jmp *%ra0)
     1985        __(ret)
    20561986_endsubp(progvsave)
    20571987
     
    21172047        __(movq %imm0,tsp_frame.fixed_overhead(%temp0))
    21182048        __(leaq tsp_frame.fixed_overhead+fulltag_misc(%temp0),%arg_z)
    2119         __(jmp *%ra0)
     2049        __(ret)
    21202050local_label(stack_misc_alloc_heap_alloc_ivector):
    21212051        __(movq %rcontext:tcr.foreign_sp,%imm1)
     
    21322062        __(movq %imm0,(%temp0))
    21332063        __(leaq fulltag_misc(%temp0),%arg_z)
    2134         __(jmp *%ra0)
     2064        __(ret)
    21352065local_label(stack_misc_alloc_heap_alloc_gvector):       
    21362066        __(TSP_Alloc_Fixed(0,%imm0))
     
    21752105
    21762106_spentry(values)
     2107        __(movq (%temp0),%ra0)
    21772108        __(ref_global(ret1val_addr,%imm1))
    21782109        __(cmpq %imm1,%ra0)
     
    21832114        __(cmovneq -node_size(%rsp,%nargs_q),%arg_z)
    21842115        __(movq %temp0,%rsp)
    2185         __(jmp *%ra0)
    2186 0:      __(movq (%temp0),%ra0)
    2187         __(lea node_size(%temp0),%temp0)
     2116        __(ret)
     21170:      __(movq 8(%temp0),%ra0)
     2118        __(addq $2*node_size,%temp0)
    21882119        __(lea (%rsp,%nargs_q),%imm0)
    21892120        __(jmp 2f)
    2190 1:      __(lea -node_size(%imm0),%imm0)
     21211:      __(subq $node_size,%imm0)
    21912122        __(movq (%imm0),%temp1)
    2192         __(lea -node_size(%temp0),%temp0)
     2123        __(subq $node_size,%temp0)
    21932124        __(movq %temp1,(%temp0))
    219421252:      __(cmpq %imm0,%rsp)
     
    24132344        __(movl $XBADKEYS,%arg_y_l)
    24142345        __(set_nargs(2))
     2346        __(push %ra0)
    24152347        __(jmp _SPksignalerr)
    241623489:      __(jmp *%ra0)
     
    24882420
    24892421
    2490 /* Prepend all but the first four (3 words of code, inner fn) and last   */
    2491 /* (lfbits) elements of %fn to the "arglist".   */
    2492        
    2493 _spentry(call_closure)
    2494         __(subq $fulltag_function-fulltag_misc,%fn)
    2495         __(vector_length(%fn,%imm0))
    2496         __(movzwl %nargs,%nargs_l)
    2497        
    2498         __(subq $5<<fixnumshift,%imm0)  /* imm0 = inherited arg count   */
    2499         __(cmpw $nargregs<<fixnumshift,%nargs)
    2500         __(jna,pt local_label(no_insert))
    2501        
    2502 /* Some arguments have already been pushed.  Push imm0's worth   */
    2503 /* of NILs, copy those arguments that have already been vpushed from   */
    2504 /* the old TOS to the new, then insert all of the inerited args   */
    2505 /* and go to the function.  */
    2506        
    2507         __(movq %imm0,%imm1)
    2508 local_label(push_nil_loop):     
    2509         __(push $nil_value)
    2510         __(sub $fixnumone,%imm1)
    2511         __(jne local_label(push_nil_loop))
    2512        
    2513 /* Need to use arg regs as temporaries here.    */
    2514         __(movq %rsp,%temp1)
    2515         __(push %arg_z)
    2516         __(push %arg_y)
    2517         __(push %arg_x)
    2518         __(lea 3*node_size(%rsp,%imm0),%arg_x)
    2519         __(lea -nargregs<<fixnumshift(%nargs_q),%arg_y)
    2520 local_label(copy_already_loop):
    2521         __(movq (%arg_x),%arg_z)
    2522         __(addq $fixnumone,%arg_x)
    2523         __(movq %arg_z,(%temp1))
    2524         __(addq $fixnumone,%temp1)
    2525         __(subq $fixnumone,%arg_y)
    2526         __(jne local_label(copy_already_loop))
    2527        
    2528         __(movl $4<<fixnumshift,%imm1_l) /* skip code, new fn   */
    2529 local_label(insert_loop):               
    2530         __(movq misc_data_offset(%fn,%imm1),%arg_z)
    2531         __(addq $node_size,%imm1)
    2532         __(addw $fixnum_one,%nargs)
    2533         __(subq $node_size,%arg_x)
    2534         __(movq %arg_z,(%arg_x))
    2535         __(subq $fixnum_one,%imm0)
    2536         __(jne local_label(insert_loop))
    2537 
    2538         /* Recover the argument registers, pushed earlier   */
    2539         __(pop %arg_x)
    2540         __(pop %arg_y)
    2541         __(pop %arg_z)
    2542         __(jmp local_label(go))
    2543 
    2544 /* Here if nothing was pushed by the caller.  If we're  */
    2545 /* going to push anything, we have to reserve a stack  */
    2546 /* frame first. (We'll need to push something if the  */
    2547 /* sum of %nargs and %imm0 is greater than nargregs)   */
    2548        
    2549 local_label(no_insert):
    2550         __(lea (%nargs_q,%imm0),%imm1)
    2551         __(cmpq $nargregs<<fixnumshift,%imm1)
    2552         __(jna local_label(no_insert_no_frame))
    2553         /* Reserve space for a stack frame   */
    2554         __(push $reserved_frame_marker)
    2555         __(push $reserved_frame_marker)
    2556 local_label(no_insert_no_frame):       
    2557         /* nargregs or fewer args were already vpushed.   */
    2558         /* if exactly nargregs, vpush remaining inherited vars.   */
    2559         __(cmpw $nargregs<<fixnumshift,%nargs)
    2560         __(movl $4<<fixnumshift,%imm1_l) /* skip code, new fn   */
    2561         __(leaq 4<<fixnumshift(%imm0),%temp1)
    2562         __(jnz local_label(set_regs))
    2563 local_label(vpush_remaining): 
    2564         __(push misc_data_offset(%fn,%imm1))
    2565         __(addq $node_size,%imm1)
    2566         __(addw $fixnumone,%nargs)
    2567         __(subq $node_size,%imm0)
    2568         __(jnz local_label(vpush_remaining))
    2569         __(jmp local_label(go))
    2570 local_label(set_regs):
    2571         /* if nargs was > 1 (and we know that it was < 3), it must have   */
    2572         /* been 2.  Set arg_x, then vpush the remaining args.   */
    2573         __(cmpw $fixnumone,%nargs)
    2574         __(jle local_label(set_y_z))
    2575 local_label(set_arg_x):
    2576         __(subq $node_size,%temp1)
    2577         __(movq misc_data_offset(%fn,%temp1),%arg_x)
    2578         __(addw $fixnumone,%nargs)
    2579         __(subq $fixnumone,%imm0)
    2580         __(jne local_label(vpush_remaining))
    2581         __(jmp local_label(go))
    2582         /* Maybe set arg_y or arg_z, preceding args   */
    2583 local_label(set_y_z):
    2584         __(jne local_label(set_arg_z))
    2585         /* Set arg_y, maybe arg_x, preceding args   */
    2586 local_label(set_arg_y):
    2587         __(subq $node_size,%temp1)
    2588         __(movq misc_data_offset(%fn,%temp1),%arg_y)
    2589         __(addw $fixnumone,%nargs)
    2590         __(subq $fixnum_one,%imm0)
    2591         __(jnz local_label(set_arg_x))
    2592         __(jmp local_label(go))
    2593 local_label(set_arg_z):
    2594         __(subq $node_size,%temp1)
    2595         __(movq misc_data_offset(%fn,%temp1),%arg_z)
    2596         __(addw $fixnumone,%nargs)
    2597         __(subq $fixnum_one,%imm0)
    2598         __(jne local_label(set_arg_y))
    2599 local_label(go):       
    2600         __(movq misc_data_offset+(3*node_size)(%fn),%fn)
    2601         __(jmp *%fn)               
    2602 _endsubp(call_closure)
    26032422
    26042423_spentry(getxlong)
     
    26492468        __(movq $XNOSPREAD,%arg_y)
    26502469        __(set_nargs(2))
     2470        __(push %ra0)
    26512471        __(jmp _SPksignalerr)
    26522472_endsubp(spreadargz)
     
    26712491        __(lea (%rbp,%imm1),%rsp)
    26722492        __(movq 8(%rbp),%ra0)
    2673         __(movq 0(%rbp),%rbp)
     2493        __(movq (%rbp),%rbp)
     2494        __(pushq %ra0)
    26742495        __(do_funcall())
    26752496        /* All args in regs; exactly the same as the tfuncallvsp case   */
    267624979:             
    26772498        __(leave)
    2678         __(pop %ra0)
    26792499        __(do_funcall())
    26802500_endsubp(tfuncallgen)
     
    26952515        __(lea (%rbp,%imm1),%rsp)
    26962516        __(movq 8(%rbp),%ra0)
    2697         __(movq 0(%rbp),%rbp)
     2517        __(movq (%rbp),%rbp)
     2518        __(push %ra0)
    26982519        __(do_funcall())       
    26992520_endsubp(tfuncallslide)
     
    27022523_spentry(tfuncallvsp)
    27032524        __(leave)
    2704         __(pop %ra0)
    27052525        __(do_funcall())
    27062526_endsubp(tfuncallvsp)
     
    27222542        __(lea (%rbp,%imm1),%rsp)
    27232543        __(movq 8(%rbp),%ra0)
    2724         __(movq 0(%rbp),%rbp)
     2544        __(movq (%rbp),%rbp)
     2545        __(pushq %ra0)
    27252546        __(jump_fname())
    27262547/* All args in regs; exactly the same as the tcallsymvsp case   */
    272725489:             
    27282549        __(leave)
    2729         __(pop %ra0)
    27302550        __(jump_fname())
    27312551_endsubp(tcallsymgen)
     
    27462566        __(movq 8(%rbp),%ra0)
    27472567        __(movq 0(%rbp),%rbp)
     2568        __(pushq %ra0)
    27482569        __(jump_fname())
    27492570_endsubp(tcallsymslide)
     
    27512572_spentry(tcallsymvsp)
    27522573        __(leave)
    2753         __(pop %ra0)
    27542574        __(jump_fname())
    27552575_endsubp(tcallsymvsp)
     
    27732593        __(movq lisp_frame.savera0(%rbp),%ra0)
    27742594        __(movq lisp_frame.backlink(%rbp),%rbp)
     2595        __(pushq %ra0)
    27752596        __(jmp *%fn)
    27762597/* All args in regs; exactly the same as the tcallnfnvsp case   */
     
    27782599        __(movq %temp0,%fn)
    27792600        __(leave)
    2780         __(pop %ra0)
    27812601        __(jmp *%fn)
    27822602_endsubp(tcallnfngen)
     
    27982618        __(movq lisp_frame.savera0(%rbp),%ra0)
    27992619        __(movq lisp_frame.backlink(%rbp),%rbp)
     2620        __(pushq %ra0)
    28002621        __(jmp *%fn)
    28012622_endsubp(tcallnfnslide)
     
    28042625        __(movq %temp0,%fn)
    28052626        __(leave)
    2806         __(pop %ra0)
    28072627        __(jmp *%fn)
    28082628_endsubp(tcallnfnvsp)
     
    28272647        __(movsd %fpzero,macptr.domain(%arg_z))
    28282648        __(movsd %fpzero,macptr.type(%arg_z))
    2829         __(jmp *%ra0)
     2649        __(ret)
    283026501:      __(movq %rcontext:tcr.foreign_sp,%imm1)
    28312651        __(subq $dnode_size,%rcontext:tcr.foreign_sp)
     
    285726772:      __(cmpq %imm0,%imm1)
    28582678        __(jne 1b)             
    2859         __(jmp *%ra0)
     2679        __(ret)
    286026809:      __(movq %rcontext:tcr.foreign_sp,%imm1)
    28612681        __(subq $dnode_size,%rcontext:tcr.foreign_sp)
     
    28842704        __(jge 0b)
    28852705        __(movq %temp1,%arg_z)
    2886         __(jmp *%ra0)
     2706        __(ret)
    288727072:      __(TSP_Alloc_Fixed(0,%imm0))
    28882708        __(jmp 4f)
     
    28912711        __(jge 3b)
    28922712        __(movq %temp1,%arg_z)
    2893         __(jmp *%ra0)
     2713        __(ret)
    28942714_endsubp(makestacklist)
    28952715
     
    29602780        __(dnode_align(%imm1,node_size,%imm1))
    29612781        __(Misc_Alloc(%arg_z))
    2962         __(jmp *%ra0)
     2782        __(ret)
    29632783local_label(misc_alloc_not_u56):
    29642784        __(uuo_error_reg_not_type(Rarg_y,error_object_not_unsigned_byte_56))
     
    31542974        __(movq %whole_reg,%arg_z)
    31552975        __(set_nargs(2))
     2976        __(push %ra0)
    31562977        __(jmp _SPksignalerr)
    31572978_endfn(C(destbind1))   
     
    31672988        __(movq %whole_reg,%arg_z)
    31682989        __(set_nargs(2))
     2990        __(push %ra0)       
    31692991        __(jmp _SPksignalerr)
    31702992_endsubp(macro_bind)
     
    31983020        __(shr $num_subtag_bits,%imm0)
    31993021        __(movslq misc_data_offset-4(%arg_z,%imm0,4),%imm0)
    3200 8:      __(jmp *%ra0)
     30228:      __(ret)
    320130239:      __(uuo_error_reg_not_type(Rarg_z,error_object_not_integer))
    32023024_endsubp(integer_sign)
     
    33593181
    33603182_spentry(misc_alloc_init)
    3361         __(push %ra0)
    33623183        __(push %rbp)
    33633184        __(movq %rsp,%rbp)
     
    33663187        __(movq %arg_x,%arg_y)
    33673188        __(lea local_label(misc_alloc_init_back)(%rip),%ra0)
     3189        __(push %ra0)
    33683190        __(jmp _SPmisc_alloc)
    33693191__(tra(local_label(misc_alloc_init_back)))
    33703192        __(pop %arg_y)
    33713193        __(leave)
    3372         __(pop %ra0)
    33733194        __(movq $nrs.init_misc,%fname)
    33743195        __(set_nargs(2))
     
    33773198
    33783199_spentry(stack_misc_alloc_init)
    3379         __(push %ra0)
    33803200        __(push %rbp)
    33813201        __(movq %rsp,%rbp)
     
    33843204        __(movq %arg_x,%arg_y)
    33853205        __(lea local_label(stack_misc_alloc_init_back)(%rip),%ra0)
     3206        __(push %ra0)
    33863207        __(jmp _SPstack_misc_alloc)
    33873208__(tra(local_label(stack_misc_alloc_init_back)))
    33883209        __(pop %arg_y)
    33893210        __(leave)
    3390         __(pop %ra0)
    33913211        __(movq $nrs.init_misc,%fname)
    33923212        __(set_nargs(2))
     
    34003220C(popj):
    34013221        __(leave)
    3402         __(pop %ra0)
    3403         __(jmp *%ra0)
     3222        __(ret)
    34043223_endsubp(popj)
    34053224
     
    34123231        __(jne 1f)
    34133232        __(sarq $fixnumshift,%imm0)
    3414         __(jmp *%ra0)
     3233        __(ret)
    341532341:      __(andb $tagmask,%imm0_b)
    34163235        __(cmpb $tag_misc,%imm0_b)
     
    34273246        __(testq %imm0,%imm0)
    34283247        __(js 9f)
    3429         __(jmp *%ra0)
     3248        __(ret)
    343032493:      __(movq misc_data_offset(%arg_z),%imm0)
    34313250        __(cmpl $0,misc_data_offset+8(%arg_z))
    34323251        __(jne 9f)
    3433         __(jmp *%ra0)
     3252        __(ret)
    343432539:      __(uuo_error_reg_not_type(Rarg_z,error_object_not_u64))
    34353254_endsubp(getu64)
     
    34513270        __(movq misc_data_offset(%arg_z),%imm0)
    34523271        __(jne 9f)
    3453 8:      __(jmp *%ra0)
     32728:      __(ret)
    345432739:      __(uuo_error_reg_not_type(Rarg_z,error_object_not_u64))
    34553274_endsubp(gets64)
     
    34713290        __(Misc_Alloc(%arg_z))
    34723291        __(movq %mm0,misc_data_offset(%arg_z))
    3473         __(jmp *%ra0)
     3292        __(ret)
    347432933:      __(movl $three_digit_bignum_header,%imm0_l)
    34753294        __(movl $aligned_bignum_size(3),%imm1_l)
    34763295        __(Misc_Alloc(%arg_z))
    34773296        __(movq %mm0,misc_data_offset(%arg_z))
    3478 9:      __(jmp *%ra0)
     32979:      __(ret)
    34793298_endsubp(makeu64)
    34803299
     
    34913310        __(jne 8f)
    349233117:      __(movq symbol.vcell(%arg_y),%arg_z)
    3493 8:      __(jmp *%ra0)           
     33128:      __(ret)         
    34943313_endsubp(specref)
    34953314
     
    35043323        __(je 1f)
    35053324        __(movq %arg_z,(%imm1,%imm0))
    3506         __(jmp *%ra0)
     3325        __(ret)
    350733261:      __(lea fulltag_misc-fulltag_symbol(%arg_y),%arg_x)
    35083327        __(movq $1<<fixnumshift,%arg_y)
     
    35233342        __(jne,pt 9f)
    35243343        __(uuo_error_reg_unbound(Rarg_y))
    3525 9:      __(jmp *%ra0)           
     33449:      __(ret)         
    35263345_endsubp(specrefcheck)
    35273346
     
    35583377        __(movq %arg_y,(%arg_x,%temp1))
    35593378        __(movq %imm1,%rcontext:tcr.db_link)
    3560         __(jmp *%ra0)   
     3379        __(ret)
    35613380_endsubp(unbind)
    35623381
     
    35723391        __(jne 1b)
    35733392        __(movq %imm1,%rcontext:tcr.db_link)
    3574         __(jmp *%ra0)   
     3393        __(ret)
    35753394_endsubp(unbind_n)
    35763395
     
    35863405        __(jne 1b)
    35873406        __(movq %imm1,%rcontext:tcr.db_link)
    3588         __(jmp *%ra0)   
     3407        __(ret)
    35893408_endsubp(unbind_to)
    35903409
     
    36493468        __(movq %imm1,%rcontext:tcr.db_link)
    36503469        __(js,pn 1f)
    3651 0:      __(jmp *%ra0)
     34700:      __(ret)
    365234711:      __(testq %temp0,%temp0)
    36533472        __(js 0b)
    36543473        __(check_pending_enabled_interrupt(2f))
    3655 2:      __(jmp *%ra0)   
     34742:      __(ret)
    36563475_endsubp(unbind_interrupt_level)
    36573476
     
    36633482        __(shrq $fixnumshift,%imm0)
    36643483        __(jne _SPunbind_n)
    3665         __(jmp *%ra0)
     3484        __(ret)
    36663485_endsubp(progvrestore)
    36673486       
     
    36763495        __(addq %arg_y,%arg_z)
    36773496        __(jo,pn C(fix_one_bit_overflow))
    3678         __(jmp *%ra0)
     3497        __(ret)
    367934981:      __(jump_builtin(_builtin_plus,2))
    36803499_endsubp(builtin_plus)
     
    36913510        __(subq %arg_y,%arg_z)
    36923511        __(jo,pn C(fix_one_bit_overflow))
    3693         __(jmp *%ra0)
     3512        __(ret)
    369435131:      __(jump_builtin(_builtin_minus,2))
    36953514_endsubp(builtin_minus)
     
    37083527        __(jo 1f)
    37093528        __(mov %imm0,%arg_z)
    3710         __(jmp *%ra0)
     3529        __(ret)
    371135301:      __(unbox_fixnum(%arg_z,%imm0))
    37123531        __(unbox_fixnum(%arg_y,%imm1))
     
    37273546        __(rcmpq(%arg_z,%arg_y))
    37283547        __(condition_to_boolean(e,%imm0,%arg_z))
    3729         __(jmp *%ra0)
     3548        __(ret)
    373035491:      __(jump_builtin(_builtin_eq,2))
    37313550_endsubp(builtin_eq)
     
    37393558        __(rcmpq(%arg_z,%arg_y))
    37403559        __(condition_to_boolean(ne,%imm0,%arg_z))
    3741         __(jmp *%ra0)
     3560        __(ret)
    374235611:      __(jump_builtin(_builtin_ne,2))
    37433562_endsubp(builtin_ne)
     
    37513570        __(rcmpq(%arg_y,%arg_z))
    37523571        __(condition_to_boolean(g,%imm0,%arg_z))
    3753         __(jmp *%ra0)
     3572        __(ret)
    375435731:      __(jump_builtin(_builtin_gt,2))
    37553574_endsubp(builtin_gt)
     
    37633582        __(rcmpq(%arg_y,%arg_z))
    37643583        __(condition_to_boolean(ge,%imm0,%arg_z))
    3765         __(jmp *%ra0)
     3584        __(ret)
    376635851:      __(jump_builtin(_builtin_ge,2))
    37673586_endsubp(builtin_ge)
     
    37753594        __(rcmpq(%arg_y,%arg_z))
    37763595        __(condition_to_boolean(l,%imm0,%arg_z))
    3777         __(jmp *%ra0)
     3596        __(ret)
    377835971:      __(jump_builtin(_builtin_lt,2))
    37793598_endsubp(builtin_lt)
     
    37873606        __(rcmpq(%arg_y,%arg_z))
    37883607        __(condition_to_boolean(le,%imm0,%arg_z))
    3789         __(jmp *%ra0)
     3608        __(ret)
    379036091:      __(jump_builtin(_builtin_le,2))
    37913610_endsubp(builtin_le)
     
    38083627        __(jump_builtin(_builtin_eql,2))
    380936281:      __(movl $t_value,%arg_z_l)
    3810         __(jmp *%ra0)
     3629        __(ret)
    381136302:      __(movl $nil_value,%arg_z_l)
    3812         __(jmp *%ra0)   
     3631        __(ret)
    38133632_endsubp(builtin_eql)
    38143633
     
    38263645        __(movq %arg_z,%arg_y)
    38273646        __(vector_length(%arg_y,%arg_z))
    3828         __(jmp *%ra0)
     3647        __(ret)
    382936481:      /* vector header   */
    38303649        __(movq vectorH.logsize(%arg_z),%arg_z)
    3831         __(jmp *%ra0)
     3650        __(ret)
    383236512:      /* list.  Maybe null, maybe dotted or circular.   */
    38333652        __(movq $-fixnumone,%temp2)
     
    385336729:     
    38543673        __(movq %temp2,%arg_z)
    3855         __(jmp *%ra0)           
     3674        __(ret)         
    38563675_endsubp(builtin_length)
    38573676
     
    38673686        __(jb 2f)
    38683687        __(movl $nil_value,%arg_z_l)
    3869         __(jmp *%ra0)
     3688        __(ret)
    387036891:      __(movl $t_value,%arg_z_l)
    3871         __(jmp *%ra0)
     3690        __(ret)
    387236912:     
    38733692        __(jump_builtin(_builtin_seqtype,1))
     
    38953714        __(jnz 4f)
    38963715        __(movq %arg_x,%arg_z)
    3897         __(jmp *%ra0)
     3716        __(ret)
    389837174:      __(cmpb $fulltag_nil,%arg_z_b)
    389937185:      __(jnz 1b)
    3900         __(jmp *%ra0)                   
     3719        __(ret)                 
    39013720_endsubp(builtin_assq) 
    39023721
     
    39163735        __(movq %temp0,%arg_z)
    391737363:      __(jnz 1b)
    3918 4:      __(jmp *%ra0)                           
     37374:      __(ret)                         
    39193738_endsubp(builtin_memq)
    39203739
     
    39383757        __(bt %imm0,%arg_z)
    39393758        __(condition_to_boolean(b,%imm0,%arg_z))
    3940         __(jmp *%ra0)
     3759        __(ret)
    394137601:      __(jump_builtin(_builtin_logbitp,2))
    39423761_endsubp(builtin_logbitp)
     
    39483767        __(jne 1f)
    39493768        __(orq %arg_y,%arg_z)
    3950         __(jmp *%ra0)
     3769        __(ret)
    395137701:     
    39523771        __(jump_builtin(_builtin_logior,2))
     
    39603779        __(jne 1f)
    39613780        __(andq %arg_y,%arg_z)
    3962         __(jmp *%ra0)
     3781        __(ret)
    396337821:             
    39643783        __(jump_builtin(_builtin_logand,2))
     
    39703789        __(negq %arg_z)
    39713790        __(jo,pn C(fix_one_bit_overflow))
    3972         __(jmp *%ra0)
     3791        __(ret)
    397337921:             
    39743793        __(jump_builtin(_builtin_negate,1))     
     
    39813800        __(jne 1f)
    39823801        __(xorq %arg_y,%arg_z)
    3983         __(jmp *%ra0)
     3802        __(ret)
    398438031:             
    39853804        __(jump_builtin(_builtin_logxor,2))
     
    40103829        __(jnz 1f)
    40113830        __(movq %arg_y,%arg_z)  /* shift by 0   */
    4012         __(jmp *%ra0)
     3831        __(ret)
    401338321:      __(jns 3f)
    40143833        __(rcmpq(%imm0,$-63))
     
    40163835        __(sar $63,%imm1)
    40173836        __(box_fixnum(%imm1,%arg_z))
    4018         __(jmp *%ra0)
     3837        __(ret)
    401938382:      /* Right-shift by small fixnum   */
    40203839        __(negb %imm0_b)
     
    40233842        __(xorl %ecx,%ecx)
    40243843        __(box_fixnum(%imm1,%arg_z))
    4025         __(jmp *%ra0)
     3844        __(ret)
    402638453:      /* Left shift by fixnum. We cant shift by more than 63 bits, though  */
    40273846        /* shifting by 64 is actually easy.   */
     
    408839070:             
    40893908        /* Save lisp registers   */
     3909        __(push %rbp)
     3910        __(movq %rsp,%rbp)
    40903911        __(push %temp0)
    40913912        __(push %temp1)
     
    40973918        __(push %save1)
    40983919        __(push %save2)
    4099         __(push %save3)
     3920        __(push %save3)         /* 10 registers pushed after %rbp */
    41003921        __(push %fn)
    4101         __(push %ra0)
    4102         __(push %rbp)
    4103         __(movq %rsp,%rbp)
    41043922        __(movq %rsp,%rcontext:tcr.save_vsp)
    41053923        __(movq %rbp,%rcontext:tcr.save_rbp)
     
    41713989        __(movq $TCR_STATE_LISP,%rcontext:tcr.valence)
    41723990        __(movq %rcontext:tcr.save_vsp,%rsp)
    4173         __(pop %rbp)
    4174         __(pop %ra0)
     3991        __(movq %rcontext:tcr.save_rbp,%rbp)
    41753992        __(pop %fn)
    41763993        __(pop %save3)
     
    41864003        __(check_pending_interrupt(%temp0))
    41874004        __(pop %temp0)
    4188         __(jmp *%ra0)
     4005        __(leave)
     4006        __(ret)
    41894007_endsubp(ffcall)
    41904008
     
    419840160:             
    41994017        /* Save lisp registers   */
     4018        __(push %rbp)
     4019        __(movq %rsp,%rbp)
    42004020        __(push %temp0)
    42014021        __(push %temp1)
     
    42104030        __(movq macptr.address(%arg_y),%rbx)  /* %rbx non-volatile */
    42114031        __(push %fn)
    4212         __(push %ra0)
    4213         __(push %rbp)
    4214         __(movq %rsp,%rbp)
    42154032        __(movq %rsp,%rcontext:tcr.save_vsp)
    42164033        __(movq %rbp,%rcontext:tcr.save_rbp)
     
    42864103        __(movq $TCR_STATE_LISP,%rcontext:tcr.valence)
    42874104        __(movq %rcontext:tcr.save_vsp,%rsp)
    4288         __(pop %rbp)
    4289         __(pop %ra0)
     4105        __(movq %rcontext:tcr.save_rbp,%rbp)
    42904106        __(pop %fn)
    42914107        __(pop %save3)
     
    43014117        __(check_pending_interrupt(%temp0))
    43024118        __(pop %temp0)
    4303         __(jmp *%ra0)
     4119        __(leave)
     4120        __(ret)
    43044121_endsubp(ffcall_returning_registers)
    43054122       
    43064123_spentry(syscall)
    43074124        /* Save lisp registers   */
     4125        __(push %rbp)
     4126        __(movq %rsp,%rbp)
    43084127        __(push %temp0)
    43094128        __(push %temp1)
     
    43174136        __(push %save3)
    43184137        __(push %fn)
    4319         __(push %ra0)
    4320         __(push %rbp)
    4321         __(movq %rsp,%rbp)
    43224138        __(movq %rsp,%rcontext:tcr.save_vsp)
     4139        __(movq %rbp,%rcontext:tcr.save_rbp)
    43234140        __(movq %rcontext:tcr.foreign_sp,%rsp)
    43244141        __(movq $TCR_STATE_FOREIGN,%rcontext:tcr.valence)
     
    43564173        __(movq $TCR_STATE_LISP,%rcontext:tcr.valence)
    43574174        __(movq %rcontext:tcr.save_vsp,%rsp)
    4358         __(pop %rbp)
    4359         __(pop %ra0)
     4175        __(movq %rcontext:tcr.save_rbp,%rbp)
    43604176        __(pop %fn)
    43614177        __(pop %save3)
     
    43704186        __(check_pending_interrupt(%temp0))
    43714187        __(pop %temp0)
    4372         __(jmp *%ra0)
     4188        __(leave)
     4189        __(ret)
    43734190_endsubp(syscall)               
    43744191
     
    45174334        __(movq %rcontext:tcr.save_rbp,%rbp)
    45184335        __(movq $nrs.callbacks,%fname)
     4336        __(lea local_label(back_from_callback)(%rip),%ra0)
    45194337        __(set_nargs(2))
    4520         __(lea local_label(back_from_callback)(%rip),%ra0)
     4338        __(push %ra0)
    45214339        __(jump_fname())
    45224340__(tra(local_label(back_from_callback)))
     
    47074525
    47084526       
    4709 /* %arg_z <- %arg_y + %arg_z.  Do the fixnum case - including overflow -  */
    4710 /* inline.  Call out otherwise.   */
    4711 _spentry(nbuiltin_plus)
    4712         __(movb %arg_z_b,%imm0_b)
    4713         __(orb %arg_y_b,%imm0_b)
    4714         __(testb $fixnummask,%imm0_b)
    4715         __(jne 1f)
    4716         __(addq %arg_y,%arg_z)
    4717         __(jo,pn C(nfix_one_bit_overflow))
    4718         __(ret)
    4719 1:      __(pop_jump_builtin(_builtin_plus,2))
    4720 _endsubp(nbuiltin_plus)
    4721        
    4722 
    4723 /* %arg_z <- %arg_z - %arg_y.  Do the fixnum case - including overflow -  */
    4724 /*  inline.  Call out otherwise.   */
    4725 _spentry(nbuiltin_minus)                       
    4726         __(movb %arg_z_b,%imm0_b)
    4727         __(orb %arg_y_b,%imm0_b)
    4728         __(testb $fixnummask,%imm0_b)
    4729         __(jne 1f)
    4730         __(xchgq %arg_y,%arg_z)
    4731         __(subq %arg_y,%arg_z)
    4732         __(jo,pn C(nfix_one_bit_overflow))
    4733         __(ret)
    4734 1:      __(pop_jump_builtin(_builtin_minus,2))
    4735 _endsubp(nbuiltin_minus)
    4736 
    4737 /* %arg_z <- %arg_z * %arg_y.  Do the fixnum case - including overflow -  */
    4738 /* inline.  Call out otherwise.   */
    4739 _spentry(nbuiltin_times)
    4740         __(movb %arg_z_b,%imm0_b)
    4741         __(orb %arg_y_b,%imm0_b)
    4742         __(testb $fixnummask,%imm0_b)
    4743         __(jne 2f)
    4744         __(unbox_fixnum(%arg_z,%imm0))
    4745         /* 128-bit fixnum result in %imm1:%imm0. Overflow set if %imm1  */
    4746         /* is significant   */
    4747         __(imul %arg_y)
    4748         __(jo 1f)
    4749         __(mov %imm0,%arg_z)
    4750         __(ret)
    4751 1:      __(unbox_fixnum(%arg_z,%imm0))
    4752         __(unbox_fixnum(%arg_y,%imm1))
    4753         __(imul %imm1)
    4754         __(jmp C(nmakes128))
    4755 2:      __(pop_jump_builtin(_builtin_times,2))
    4756 _endsubp(nbuiltin_times)
    4757 
    4758 _spentry(nbuiltin_div)
    4759         __(pop_jump_builtin(_builtin_div,2))
    4760 
    4761 /* %arg_z <- (= %arg_y %arg_z).   */
    4762 _spentry(nbuiltin_eq)
    4763         __(movb %arg_z_b,%imm0_b)
    4764         __(orb %arg_y_b,%imm0_b)
    4765         __(testb $fixnummask,%imm0_b)
    4766         __(jne 1f)
    4767         __(rcmpq(%arg_z,%arg_y))
    4768         __(condition_to_boolean(e,%imm0,%arg_z))
    4769         __(ret)
    4770 1:      __(pop_jump_builtin(_builtin_eq,2))
    4771 _endsubp(nbuiltin_eq)
    4772        
    4773 /* %arg_z <- (/= %arg_y %arg_z).          */
    4774 _spentry(nbuiltin_ne)
    4775         __(movb %arg_z_b,%imm0_b)
    4776         __(orb %arg_y_b,%imm0_b)
    4777         __(testb $fixnummask,%imm0_b)
    4778         __(jne 1f)
    4779         __(rcmpq(%arg_z,%arg_y))
    4780         __(condition_to_boolean(ne,%imm0,%arg_z))
    4781         __(ret)
    4782 1:      __(pop_jump_builtin(_builtin_ne,2))
    4783 _endsubp(nbuiltin_ne)
    4784        
    4785 /* %arg_z <- (> %arg_y %arg_z).   */
    4786 _spentry(nbuiltin_gt)
    4787         __(movb %arg_z_b,%imm0_b)
    4788         __(orb %arg_y_b,%imm0_b)
    4789         __(testb $fixnummask,%imm0_b)
    4790         __(jne 1f)
    4791         __(rcmpq(%arg_y,%arg_z))
    4792         __(condition_to_boolean(g,%imm0,%arg_z))
    4793         __(ret)
    4794 1:      __(pop_jump_builtin(_builtin_gt,2))
    4795 _endsubp(nbuiltin_gt)
    4796 
    4797 /* %arg_z <- (>= %arg_y %arg_z).          */
    4798 _spentry(nbuiltin_ge)
    4799         __(movb %arg_z_b,%imm0_b)
    4800         __(orb %arg_y_b,%imm0_b)
    4801         __(testb $fixnummask,%imm0_b)
    4802         __(jne 1f)
    4803         __(rcmpq(%arg_y,%arg_z))
    4804         __(condition_to_boolean(ge,%imm0,%arg_z))
    4805         __(ret)
    4806 1:      __(pop_jump_builtin(_builtin_ge,2))
    4807 _endsubp(nbuiltin_ge)
    4808        
    4809 /* %arg_z <- (< %arg_y %arg_z).   */
    4810 _spentry(nbuiltin_lt)
    4811         __(movb %arg_z_b,%imm0_b)
    4812         __(orb %arg_y_b,%imm0_b)
    4813         __(testb $fixnummask,%imm0_b)
    4814         __(jne 1f)
    4815         __(rcmpq(%arg_y,%arg_z))
    4816         __(condition_to_boolean(l,%imm0,%arg_z))
    4817         __(ret)
    4818 1:      __(pop_jump_builtin(_builtin_lt,2))
    4819 _endsubp(nbuiltin_lt)
    4820 
    4821 /* %arg_z <- (<= %arg_y %arg_z).   */
    4822 _spentry(nbuiltin_le)
    4823         __(movb %arg_z_b,%imm0_b)
    4824         __(orb %arg_y_b,%imm0_b)
    4825         __(testb $fixnummask,%imm0_b)
    4826         __(jne 1f)
    4827         __(rcmpq(%arg_y,%arg_z))
    4828         __(condition_to_boolean(le,%imm0,%arg_z))
    4829         __(ret)
    4830 1:      __(pop_jump_builtin(_builtin_le,2))
    4831 _endsubp(nbuiltin_le)
    4832 
    4833 _spentry(nbuiltin_eql)
    4834         __(cmpq %arg_y,%arg_z)
    4835         __(je 1f)
    4836         /* Not EQ.  Could only possibly be EQL if both are tag-misc  */
    4837         /* and both have the same subtag   */
    4838         __(extract_lisptag(%arg_y,%imm0))
    4839         __(extract_lisptag(%arg_z,%imm1))
    4840         __(cmpb $tag_misc,%imm0_b)
    4841         __(jne 2f)
    4842         __(cmpb %imm0_b,%imm1_b)
    4843         __(jne 2f)
    4844         __(extract_subtag(%arg_y,%imm0_b))
    4845         __(extract_subtag(%arg_z,%imm1_b))
    4846         __(cmpb %imm0_b,%imm1_b)
    4847         __(jne 2f)
    4848         __(pop_jump_builtin(_builtin_eql,2))
    4849 1:      __(movl $t_value,%arg_z_l)
    4850         __(ret)
    4851 2:      __(movl $nil_value,%arg_z_l)
    4852         __(ret)
    4853 _endsubp(nbuiltin_eql)
    4854 
    4855 _spentry(nbuiltin_length)
    4856         __(extract_lisptag(%arg_z,%imm0))
    4857         __(cmpb $tag_list,%imm0_b)
    4858         __(jz 2f)
    4859         __(cmpb $tag_misc,%imm0_b)
    4860         __(jnz 8f)
    4861         __(extract_subtag(%arg_z,%imm0_b))
    4862         __(rcmpb(%imm0_b,$min_vector_subtag))
    4863         __(jb 8f)
    4864         __(je 1f)
    4865         /* (simple-array * (*))   */
    4866         __(movq %arg_z,%arg_y)
    4867         __(vector_length(%arg_y,%arg_z))
    4868         __(ret)
    4869 1:      /* vector header   */
    4870         __(movq vectorH.logsize(%arg_z),%arg_z)
    4871         __(ret)
    4872 2:      /* list.  Maybe null, maybe dotted or circular.   */
    4873         __(movq $-fixnumone,%temp2)
    4874         __(movq %arg_z,%temp0)  /* fast pointer   */
    4875         __(movq %arg_z,%temp1)  /* slow pointer   */
    4876 3:      __(extract_lisptag(%temp0,%imm0))       
    4877         __(compare_reg_to_nil(%temp0))
    4878         __(leaq fixnumone(%temp2),%temp2)
    4879         __(je 9f)
    4880         __(cmpb $tag_list,%imm0_b)
    4881         __(jne 8f)
    4882         __(extract_lisptag(%temp1,%imm1))
    4883         __(testb $fixnumone,%temp2_b)
    4884         __(_cdr(%temp0,%temp0))
    4885         __(je 3b)
    4886         __(cmpb $tag_list,%imm1_b)
    4887         __(jne 8f)
    4888         __(_cdr(%temp1,%temp1))
    4889         __(cmpq %temp0,%temp1)
    4890         __(jne 3b)
    4891 8:     
    4892         __(pop_jump_builtin(_builtin_length,1))
    4893 9:     
    4894         __(movq %temp2,%arg_z)
    4895         __(ret)         
    4896 _endsubp(nbuiltin_length)
    4897 
    4898        
    4899 _spentry(nbuiltin_seqtype)
    4900         __(extract_lisptag(%arg_z,%imm0))
    4901         __(cmpb $tag_list,%imm0_b)
    4902         __(jz 1f)
    4903         __(cmpb $tag_misc,%imm0_b)
    4904         __(jne 2f)
    4905         __(movb misc_subtag_offset(%arg_z),%imm0_b)
    4906         __(rcmpb(%imm0_b,$min_vector_subtag))
    4907         __(jb 2f)
    4908         __(movl $nil_value,%arg_z_l)
    4909         __(ret)
    4910 1:      __(movl $t_value,%arg_z_l)
    4911         __(ret)
    4912 2:     
    4913         __(pop_jump_builtin(_builtin_seqtype,1))
    4914 _endsubp(nbuiltin_seqtype)
    4915 
    4916 _spentry(nbuiltin_assq)
    4917         __(cmpb $fulltag_nil,%arg_z_b)
    4918         __(jz 5f)
    4919 1:      __(movb $tagmask,%imm0_b)
    4920         __(andb %arg_z_b,%imm0_b)
    4921         __(cmpb $tag_list,%imm0_b)
    4922         __(jz,pt 2f)
    4923         __(uuo_error_reg_not_list(Rarg_z))
    4924 2:      __(_car(%arg_z,%arg_x))
    4925         __(_cdr(%arg_z,%arg_z))
    4926         __(cmpb $fulltag_nil,%arg_x_b)
    4927         __(jz 4f)
    4928         __(movb $tagmask,%imm0_b)
    4929         __(andb %arg_x_b,%imm0_b)
    4930         __(cmpb $tag_list,%imm0_b)
    4931         __(jz,pt 3f)
    4932         __(uuo_error_reg_not_list(Rarg_x))
    4933 3:      __(_car(%arg_x,%temp0))
    4934         __(cmpq %temp0,%arg_y)
    4935         __(jnz 4f)
    4936         __(movq %arg_x,%arg_z)
    4937         __(ret)
    4938 4:      __(cmpb $fulltag_nil,%arg_z_b)
    4939 5:      __(jnz 1b)
    4940         __(ret)                 
    4941 _endsubp(nbuiltin_assq)
    4942 
    4943 _spentry(nbuiltin_memq)
    4944         __(cmpb $fulltag_nil,%arg_z_b)
    4945         __(jmp 3f)
    4946 1:      __(movb $tagmask,%imm0_b)
    4947         __(andb %arg_z_b,%imm0_b)
    4948         __(cmpb $tag_list,%imm0_b)
    4949         __(jz,pt 2f)
    4950         __(uuo_error_reg_not_list(Rarg_z))
    4951 2:      __(_car(%arg_z,%arg_x))
    4952         __(_cdr(%arg_z,%temp0))
    4953         __(cmpq %arg_x,%arg_y)
    4954         __(jz 4f)
    4955         __(cmpb $fulltag_nil,%temp0_b)
    4956         __(movq %temp0,%arg_z)
    4957 3:      __(jnz 1b)
    4958 4:      __(ret)                         
    4959 _endsubp(nbuiltin_memq)
    4960 
    4961        
    4962 _spentry(nbuiltin_logbitp)
    4963         __(movb %arg_z_b,%imm0_b)
    4964         __(orb %arg_y_b,%imm0_b)
    4965         __(testb $fixnummask,%imm0_b)
    4966         __(jnz 1f)
    4967         __(unbox_fixnum(%arg_y,%imm0))
    4968         __(movl $logbitp_max_bit-1+fixnumshift,%imm1_l)
    4969         __(js 1f)               /* bit number negative */
    4970         __(addb $fixnumshift,%imm0_b)
    4971         __(cmpq $logbitp_max_bit<<fixnumshift,%arg_y)
    4972         __(cmovael %imm1_l,%imm0_l)
    4973         __(bt %imm0,%arg_z)
    4974         __(condition_to_boolean(b,%imm0,%arg_z))
    4975         __(ret)
    4976 1:      __(pop_jump_builtin(_builtin_logbitp,2))
    4977 _endsubp(nbuiltin_logbitp)
    4978 
    4979 _spentry(nbuiltin_logior)
    4980         __(movb %arg_y_b,%imm0_b)
    4981         __(orb %arg_z_b,%imm0_b)
    4982         __(testb $fixnummask,%imm0_b)
    4983         __(jne 1f)
    4984         __(orq %arg_y,%arg_z)
    4985         __(ret)
    4986 1:     
    4987         __(pop_jump_builtin(_builtin_logior,2))
    4988                
    4989 _endsubp(nbuiltin_logior)
    4990 
    4991 _spentry(nbuiltin_logand)
    4992         __(movb %arg_y_b,%imm0_b)
    4993         __(orb %arg_z_b,%imm0_b)
    4994         __(testb $fixnummask,%imm0_b)
    4995         __(jne 1f)
    4996         __(andq %arg_y,%arg_z)
    4997         __(ret)
    4998 1:             
    4999         __(pop_jump_builtin(_builtin_logand,2))
    5000 _endsubp(nbuiltin_logand)
    5001 
    5002 _spentry(nbuiltin_negate)
    5003         __(testb $fixnummask,%arg_z_b)
    5004         __(jne 1f)
    5005         __(negq %arg_z)
    5006         __(jo,pn C(nfix_one_bit_overflow))
    5007         __(ret)
    5008 1:             
    5009         __(pop_jump_builtin(_builtin_negate,1))
    5010 _endsubp(nbuiltin_negate)
    5011 
    5012 _spentry(nbuiltin_logxor)
    5013         __(movb %arg_y_b,%imm0_b)
    5014         __(orb %arg_z_b,%imm0_b)
    5015         __(testb $fixnummask,%imm0_b)
    5016         __(jne 1f)
    5017         __(xorq %arg_y,%arg_z)
    5018         __(ret)
    5019 1:             
    5020         __(pop_jump_builtin(_builtin_logxor,2))
    5021 _endsubp(nbuiltin_logxor)
    5022 
    5023 
    5024 _spentry(nbuiltin_aset1)
    5025         __(pop %ra0)            /* for now */
    5026         __(extract_typecode(%arg_x,%imm0))
    5027         __(box_fixnum(%imm0,%temp0))
    5028         __(cmpb $min_vector_subtag,%imm0_b)
    5029         __(ja _SPsubtag_misc_set)
    5030         __(jump_builtin(_builtin_aset1,3))
    5031 _endsubp(nbuiltin_aset1)
    5032 
    5033 /* We have to be a little careful here  %cl has to be used for  */
    5034 /*   the (unboxed) shift count in all variable-length shifts, and  */
    5035 /*   %temp2 = %rcx.  Zero all but the low 8 (or 6) bits of %rcx,  */
    5036 /*   so that the shift count doesn't confuse the GC.  */
    5037 
    5038 _spentry(nbuiltin_ash)
    5039         __(movb %arg_y_b,%imm0_b)
    5040         __(orb %arg_z_b,%imm0_b)
    5041         __(testb $fixnummask,%imm0_b)
    5042         __(jne 9f)
    5043         __(unbox_fixnum(%arg_y,%imm1))
    5044         __(unbox_fixnum(%arg_z,%imm0))
    5045         /* Z flag set if zero ASH shift count   */
    5046         __(jnz 1f)
    5047         __(movq %arg_y,%arg_z)  /* shift by 0   */
    5048         __(ret)
    5049 1:      __(jns 3f)
    5050         __(rcmpq(%imm0,$-63))
    5051         __(jg 2f)
    5052         __(sar $63,%imm1)
    5053         __(box_fixnum(%imm1,%arg_z))
    5054         __(ret)
    5055 2:      /* Right-shift by small fixnum   */
    5056         __(negb %imm0_b)
    5057         __(movzbl %imm0_b,%ecx)
    5058         __(sar %cl,%imm1)
    5059         __(xorl %ecx,%ecx)
    5060         __(box_fixnum(%imm1,%arg_z))
    5061         __(ret)
    5062 3:      /* Left shift by fixnum. We cant shift by more than 63 bits, though  */
    5063         /* shifting by 64 is actually easy.   */
    5064         __(rcmpq(%imm0,$64))
    5065         __(jg 9f)
    5066         __(jne 4f)
    5067         /* left-shift by 64-bits exactly   */
    5068         __(xorl %imm0_l,%imm0_l)
    5069         __(jmp C(nmakes128))
    5070 4:      /* left-shift by 1..63 bits.  Safe to move shift count to %rcx/%cl   */
    5071         __(movzbl %imm0_b,%ecx)  /* zero-extending mov   */
    5072         __(movq %imm1,%imm0)
    5073         __(sarq $63,%imm1)
    5074         __(js 5f)
    5075         __(shld %cl,%imm0,%imm1)
    5076         __(shl %cl,%imm0)
    5077         __(xorb %cl,%cl)
    5078         __(jmp C(nmakes128))
    5079 5:      __(shld %cl,%imm0,%imm1)
    5080         __(shl %cl,%imm0)
    5081         __(xorb %cl,%cl)
    5082         __(jmp C(nmakes128))
    5083 9:     
    5084         __(pop_jump_builtin(_builtin_ash,2))
    5085 _endsubp(nbuiltin_ash)
    5086 
    5087 _spentry(nbuiltin_aref1)
    5088         __(pop %ra0)            /* for now */
    5089         __(extract_typecode(%arg_y,%imm0))
    5090         __(cmpb $min_vector_subtag,%imm0_b)
    5091         __(box_fixnum_no_flags(%imm0,%arg_x))
    5092         __(ja _SPsubtag_misc_ref)
    5093         __(jump_builtin(_builtin_aref1,2))
    5094 _endsubp(nbuiltin_aref1)
    5095 
    5096 
    5097 _spentry(nmakeu64)
    5098         __(movq %imm0,%imm1)
    5099         __(shlq $fixnumshift+1,%imm1)
    5100         __(movq %imm1,%arg_z)   /* Tagged as a fixnum, 2x    */
    5101         __(shrq $fixnumshift+1,%imm1)
    5102         __(shrq %arg_z)
    5103         __(cmpq %imm0,%imm1)
    5104         __(je 9f)
    5105         __(testq %imm0,%imm0)
    5106         __(movd %imm0,%mm0)
    5107         __(js 3f)
    5108         /* Make a 2-digit bignum.   */
    5109         __(movl $two_digit_bignum_header,%imm0_l)
    5110         __(movl $aligned_bignum_size(2),%imm1_l)
    5111         __(Misc_Alloc(%arg_z))
    5112         __(movq %mm0,misc_data_offset(%arg_z))
    5113         __(jmp *%ra0)
    5114 3:      __(movl $three_digit_bignum_header,%imm0_l)
    5115         __(movl $aligned_bignum_size(3),%imm1_l)
    5116         __(Misc_Alloc(%arg_z))
    5117         __(movq %mm0,misc_data_offset(%arg_z))
    5118 9:      __(ret)
    5119 _endsubp(nmakeu64)
    5120 
    5121 /* on entry: arg_z = symbol.  On exit, arg_z = value (possibly  */
    5122 /* unbound_marker), arg_y = symbol   */
    5123 _spentry(nspecref)
    5124         __(movq symbol.binding_index(%arg_z),%imm0)
    5125         __(cmp %rcontext:tcr.tlb_limit,%imm0)
    5126         __(movq %rcontext:tcr.tlb_pointer,%imm1)
    5127         __(movq %arg_z,%arg_y)
    5128         __(jae 7f)
    5129         __(movq (%imm1,%imm0),%arg_z)
    5130         __(cmpb $no_thread_local_binding_marker,%arg_z_b)
    5131         __(jne 8f)
    5132 7:      __(movq symbol.vcell(%arg_y),%arg_z)
    5133 8:      __(ret)         
    5134 _endsubp(nspecref)
    5135 
    5136 /* arg_y = special symbol, arg_z = new value.           */
    5137 _spentry(nspecset)
    5138         __(movq symbol.binding_index(%arg_y),%imm0)
    5139         __(cmp %rcontext:tcr.tlb_limit,%imm0)
    5140         __(movq %rcontext:tcr.tlb_pointer,%imm1)
    5141         __(jae 1f)
    5142         __(movq (%imm1,%imm0),%arg_x)
    5143         __(cmpb $no_thread_local_binding_marker,%arg_x_b)
    5144         __(je 1f)
    5145         __(movq %arg_z,(%imm1,%imm0))
    5146         __(ret)
    5147 1:      __(lea fulltag_misc-fulltag_symbol(%arg_y),%arg_x)
    5148         __(movq $1<<fixnumshift,%arg_y)
    5149         __(pop %ra0)
    5150         __(jmp _SPgvset)
    5151 _endsubp(nspecset)
    5152 
    5153 _spentry(nspecrefcheck)
    5154         __(movq symbol.binding_index(%arg_z),%imm0)
    5155         __(cmp %rcontext:tcr.tlb_limit,%imm0)
    5156         __(movq %rcontext:tcr.tlb_pointer,%imm1)
    5157         __(movq %arg_z,%arg_y)
    5158         __(jae 7f)
    5159         __(movq (%imm1,%imm0),%arg_z)
    5160         __(cmpb $no_thread_local_binding_marker,%arg_z_b)
    5161         __(jne 8f)
    5162 7:      __(movq symbol.vcell(%arg_y),%arg_z)
    5163 8:      __(cmpb $unbound_marker,%arg_z_b)
    5164         __(jne,pt 9f)
    5165         __(uuo_error_reg_unbound(Rarg_y))
    5166 9:      __(ret)         
    5167 _endsubp(nspecrefcheck)
     4527
    51684528
    51694529/* Prepend all but the first five (4 words of code, inner fn) and last   */
    51704530/* (lfbits) elements of %fn to the "arglist".   */
    51714531       
    5172 _spentry(ncall_closure)
     4532_spentry(call_closure)
     4533        new_local_labels()
    51734534        __(subq $fulltag_function-fulltag_misc,%fn)
    51744535        __(vector_length(%fn,%imm0))
     
    51764537       
    51774538        __(subq $6<<fixnumshift,%imm0)  /* imm0 = inherited arg count   */
     4539        __(lea (%nargs_q,%imm0),%imm1)
     4540        __(cmpw $nargregs<<fixnumshift,%imm1_w)
     4541        __(jna,pt local_label(regs_only))
     4542        __(pop %ra0)
    51784543        __(cmpw $nargregs<<fixnumshift,%nargs)
    5179         __(jna,pt local_label(nno_insert))
     4544        __(jna,pt local_label(no_insert))
    51804545       
    51814546/* Some arguments have already been pushed.  Push imm0's worth   */
     
    51854550       
    51864551        __(movq %imm0,%imm1)
    5187 local_label(npush_nil_loop):     
     4552local_label(push_nil_loop):     
    51884553        __(push $nil_value)
    51894554        __(sub $fixnumone,%imm1)
    5190         __(jne local_label(npush_nil_loop))
     4555        __(jne local_label(push_nil_loop))
    51914556       
    51924557/* Need to use arg regs as temporaries here.    */
     
    51974562        __(lea 3*node_size(%rsp,%imm0),%arg_x)
    51984563        __(lea -nargregs<<fixnumshift(%nargs_q),%arg_y)
    5199 local_label(ncopy_already_loop):
     4564local_label(copy_already_loop):
    52004565        __(movq (%arg_x),%arg_z)
    52014566        __(addq $fixnumone,%arg_x)
     
    52034568        __(addq $fixnumone,%temp1)
    52044569        __(subq $fixnumone,%arg_y)
    5205         __(jne local_label(ncopy_already_loop))
     4570        __(jne local_label(copy_already_loop))
    52064571       
    52074572        __(movl $5<<fixnumshift,%imm1_l) /* skip code, new fn   */
    5208 local_label(ninsert_loop):               
     4573local_label(insert_loop):               
    52094574        __(movq misc_data_offset(%fn,%imm1),%arg_z)
    52104575        __(addq $node_size,%imm1)
     
    52134578        __(movq %arg_z,(%arg_x))
    52144579        __(subq $fixnum_one,%imm0)
    5215         __(jne local_label(ninsert_loop))
     4580        __(jne local_label(insert_loop))
    52164581
    52174582        /* Recover the argument registers, pushed earlier   */
     
    52194584        __(pop %arg_y)
    52204585        __(pop %arg_z)
    5221         __(jmp local_label(ngo))
     4586        __(jmp local_label(go))
    52224587
    52234588/* Here if nothing was pushed by the caller.  If we're  */
     
    52264591/* sum of %nargs and %imm0 is greater than nargregs)   */
    52274592       
    5228 local_label(nno_insert):
     4593local_label(no_insert):
    52294594        __(lea (%nargs_q,%imm0),%imm1)
    52304595        __(cmpq $nargregs<<fixnumshift,%imm1)
    5231         __(jna local_label(nno_insert_no_frame))
     4596        __(jna local_label(no_insert_no_frame))
    52324597        /* Reserve space for a stack frame   */
    52334598        __(push $reserved_frame_marker)
    52344599        __(push $reserved_frame_marker)
    5235 local_label(nno_insert_no_frame):       
     4600local_label(no_insert_no_frame):       
    52364601        /* nargregs or fewer args were already vpushed.   */
    52374602        /* if exactly nargregs, vpush remaining inherited vars.   */
     
    52394604        __(movl $5<<fixnumshift,%imm1_l) /* skip code, new fn   */
    52404605        __(leaq 5<<fixnumshift(%imm0),%temp1)
    5241         __(jnz local_label(nset_regs))
    5242 local_label(nvpush_remaining): 
     4606        __(jnz local_label(set_regs))
     4607local_label(vpush_remaining): 
    52434608        __(push misc_data_offset(%fn,%imm1))
    52444609        __(addq $node_size,%imm1)
    52454610        __(addw $fixnumone,%nargs)
    52464611        __(subq $node_size,%imm0)
    5247         __(jnz local_label(nvpush_remaining))
    5248         __(jmp local_label(ngo))
    5249 local_label(nset_regs):
     4612        __(jnz local_label(vpush_remaining))
     4613        __(jmp local_label(go))
     4614local_label(set_regs):
    52504615        /* if nargs was > 1 (and we know that it was < 3), it must have   */
    52514616        /* been 2.  Set arg_x, then vpush the remaining args.   */
    52524617        __(cmpw $fixnumone,%nargs)
    5253         __(jle local_label(nset_y_z))
    5254 local_label(nset_arg_x):
     4618        __(jle local_label(set_y_z))
     4619local_label(set_arg_x):
    52554620        __(subq $node_size,%temp1)
    52564621        __(movq misc_data_offset(%fn,%temp1),%arg_x)
    52574622        __(addw $fixnumone,%nargs)
    52584623        __(subq $fixnumone,%imm0)
    5259         __(jne local_label(nvpush_remaining))
    5260         __(jmp local_label(ngo))
     4624        __(jne local_label(vpush_remaining))
     4625        __(jmp local_label(go))
    52614626        /* Maybe set arg_y or arg_z, preceding args   */
    5262 local_label(nset_y_z):
    5263         __(jne local_label(nset_arg_z))
     4627local_label(set_y_z):
     4628        __(jne local_label(set_arg_z))
    52644629        /* Set arg_y, maybe arg_x, preceding args   */
    5265 local_label(nset_arg_y):
     4630local_label(set_arg_y):
    52664631        __(subq $node_size,%temp1)
    52674632        __(movq misc_data_offset(%fn,%temp1),%arg_y)
    52684633        __(addw $fixnumone,%nargs)
    52694634        __(subq $fixnum_one,%imm0)
    5270         __(jnz local_label(nset_arg_x))
    5271         __(jmp local_label(ngo))
    5272 local_label(nset_arg_z):
     4635        __(jnz local_label(set_arg_x))
     4636        __(jmp local_label(go))
     4637local_label(set_arg_z):
    52734638        __(subq $node_size,%temp1)
    52744639        __(movq misc_data_offset(%fn,%temp1),%arg_z)
    52754640        __(addw $fixnumone,%nargs)
    52764641        __(subq $fixnum_one,%imm0)
    5277         __(jne local_label(nset_arg_y))
    5278 local_label(ngo):       
     4642        __(jne local_label(set_arg_y))
     4643local_label(go):       
    52794644        __(movq misc_data_offset+(4*node_size)(%fn),%fn)
    5280         __(jmp *%fn)               
    5281 _endsubp(ncall_closure)
     4645        __(push %ra0)
     4646        __(jmp *%fn)
     4647local_label(regs_only):
     4648        __(leaq 5<<fixnumshift(%imm0),%temp1)
     4649        __(testw %nargs,%nargs)
     4650        __(jne local_label(some_args))
     4651        __(cmpw $node_size,%imm0)
     4652        __(movq misc_data_offset-node_size(%fn,%temp1),%arg_z)
     4653        __(je local_label(rgo))
     4654        __(cmpw $2*node_size,%imm0)
     4655        __(movq misc_data_offset-(node_size*2)(%fn,%temp1),%arg_y)
     4656        __(je local_label(rgo))
     4657        __(movq misc_data_offset-(node_size*3)(%fn,%temp1),%arg_x)
     4658local_label(rgo):
     4659        __(addw %imm0_w,%nargs)
     4660        __(jmp *misc_data_offset+(4*node_size)(%fn))
     4661local_label(some_args):         
     4662        __(cmpw $2*node_size,%nargs)
     4663        __(jz local_label(rtwo))
     4664        /* One arg was passed, could be one or two inherited args */
     4665        __(cmpw $node_size,%imm0)
     4666        __(movq misc_data_offset-node_size(%fn,%temp1),%arg_y)
     4667        __(je local_label(rgo))
     4668        __(movq misc_data_offset-(node_size*2)(%fn,%temp1),%arg_x)
     4669        __(jmp local_label(rgo))
     4670local_label(rtwo):     
     4671        __(movq misc_data_offset-node_size(%fn,%temp1),%arg_x)
     4672        __(jmp local_label(rgo))
     4673_endsubp(call_closure)
    52824674                                       
    52834675       
Note: See TracChangeset for help on using the changeset viewer.