Changeset 6531


Ignore:
Timestamp:
May 9, 2007, 9:03:33 AM (15 years ago)
Author:
gb
Message:

nmkunwind. New calling sequence; new TRA interpretation.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ccl/lisp-kernel/x86-spentry64.s

    r6253 r6531  
    3737        jump_fname()
    3838])
     39
     40       
    3941
    4042_spentry(bad_funcall)   
     
    5557        __(xorq %imm1,%imm0)
    5658        __(movq %imm0,misc_data_offset(%arg_z))
    57         __(jmp *%ra0)   
     59        __(ret)
    5860_endsubp(fix_overflow)
    5961
    60        
     62
    6163/* Make a lisp integer (fixnum or two-digit bignum) from the signed  */
    6264/* 64-bit value in %imm0.   */
     
    7375        __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(2)))
    7476        __(movq %mm0,misc_data_offset(%arg_z))
    75 0:      __(jmp *%ra0)
     770:      __(repret)
    7678_endsubp(makes64)       
    77                                
     79
     80                                       
    7881
    7982/* %imm1:%imm0 constitute a signed integer, almost certainly a bignum.  */
     
    111114        __(movq %mm0,misc_data_offset(%arg_z))
    112115        __(movq %mm1,misc_data_offset+8(%arg_z))
    113         __(jmp *%ra0)
     116        __(ret)
    1141173:      __(mov $three_digit_bignum_header,%imm0)
    115118        __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(3)))
    116119        __(movq %mm0,misc_data_offset(%arg_z))
    117120        __(movd %mm1,misc_data_offset+8(%arg_z))
    118         __(jmp *%ra0)
     121        __(ret)
    119122_endfn
    120123
     124       
    121125/* %imm1:%imm0 constitute an unsigned integer, almost certainly a bignum.  */
    122126/* Make a lisp integer out of those 128 bits ..  */
     
    152156        __(movq %mm0,misc_data_offset(%arg_z))
    153157        __(movd %mm1,misc_data_offset+8(%arg_z))
    154         __(jmp *%ra0)
     158        __(ret)
    1551594:      __(movq $four_digit_bignum_header,%imm0)
    156160        __(Misc_Alloc_Fixed(%arg_z,aligned_bignum_size(4)))
     
    1601646:      __(movq %mm0,misc_data_offset(%arg_z))
    161165        __(movq %mm0,misc_data_offset+8(%arg_z))
    162         __(jmpq *%ra0)
     166        __(ret)
    163167_endfn
    164168
     
    186190_startfn(C(misc_ref_common))
    187191        __(movzbl %imm1_b,%imm1_l)
    188         __(lea local_label(misc_ref_jmp)(%rip),%temp2)
    189         __(jmp *(%temp2,%imm1,8))
     192        __(lea local_label(misc_ref_jmp)(%rip),%imm2)
     193        __(jmp *(%imm2,%imm1,8))
    190194        .p2align 3
    191195local_label(misc_ref_jmp):     
     
    475479local_label(misc_ref_node):
    476480        __(movq misc_data_offset(%arg_y,%arg_z),%arg_z)
    477         __(jmp *%ra0)
     481        __(ret)
    478482local_label(misc_ref_u64):
    479483        __(movq misc_data_offset(%arg_y,%arg_z),%imm0)
     
    484488        __(Misc_Alloc_Fixed(%arg_z,double_float.size))
    485489        __(movsd %fp1,double_float.value(%arg_z))
    486         __(jmp *%ra0)
     490        __(ret)
    487491local_label(misc_ref_fixnum_vector):   
    488492        __(movq misc_data_offset(%arg_y,%arg_z),%imm0)
    489493        __(box_fixnum(%imm0,%arg_z))
    490         __(jmp *%ra0)
     494        __(ret)
    491495local_label(misc_ref_s64):     
    492496        __(movq misc_data_offset(%arg_y,%arg_z),%imm0)
     
    497501        __(movl misc_data_offset(%arg_y,%imm0),%imm0_l)
    498502        __(box_fixnum(%imm0,%arg_z))
    499         __(jmp *%ra0)
     503        __(ret)
    500504local_label(misc_ref_s32):
    501505        __(movq %arg_z,%imm0)
     
    503507        __(movslq misc_data_offset(%arg_y,%imm0),%imm0)
    504508        __(box_fixnum(%imm0,%arg_z))
    505         __(jmp *%ra0)
     509        __(ret)
    506510local_label(misc_ref_single_float_vector):
    507511        __(movq %arg_z,%imm0)
     
    511515        __(shl $32,%imm0)
    512516        __(lea subtag_single_float(%imm0),%arg_z)
    513         __(jmp *%ra0)
     517        __(ret)
    514518local_label(misc_ref_u8):
    515519        __(movq %arg_z,%imm0)
     
    517521        __(movzbl misc_data_offset(%arg_y,%imm0),%imm0_l)
    518522        __(box_fixnum(%imm0,%arg_z))
    519         __(jmp *%ra0)
     523        __(ret)
    520524local_label(misc_ref_s8):       
    521525        __(movq %arg_z,%imm0)
     
    523527        __(movsbq misc_data_offset(%arg_y,%imm0),%imm0)
    524528        __(box_fixnum(%imm0,%arg_z))
    525         __(jmp *%ra0)
     529        __(ret)
    526530local_label(misc_ref_string):
    527531        __(movq %arg_z,%imm0)
     
    530534        __(shlq $charcode_shift,%imm0)
    531535        __(leaq subtag_character(%imm0),%arg_z)
    532         __(jmp *%ra0)
     536        __(ret)
    533537local_label(misc_ref_new_string):
    534538        __(movq %arg_z,%imm0)
     
    537541        __(shlq $charcode_shift,%imm0)
    538542        __(leaq subtag_character(%imm0),%arg_z)
    539         __(jmp *%ra0)       
     543        __(ret)       
    540544local_label(misc_ref_u16):     
    541545        __(movq %arg_z,%imm0)
     
    543547        __(movzwl misc_data_offset(%arg_y,%imm0),%imm0_l)
    544548        __(box_fixnum(%imm0,%arg_z))
    545         __(jmp *%ra0)
     549        __(ret)
    546550local_label(misc_ref_s16):     
    547551        __(movq %arg_z,%imm0)
     
    549553        __(movswq misc_data_offset(%arg_y,%imm0),%imm0)
    550554        __(box_fixnum(%imm0,%arg_z))
    551         __(jmp *%ra0)
     555        __(ret)
    552556local_label(misc_ref_bit_vector):
    553557        __(unbox_fixnum(%arg_z,%imm0))
     
    560564        __(andl $fixnum_one,%imm0_l)
    561565        __(movq %imm0,%arg_z)
    562         __(jmp *%ra0)
     566        __(ret)
    563567local_label(misc_ref_invalid):
    564568        __(movq $XBADVEC,%arg_x)
     
    628632_startfn(C(misc_set_common))
    629633        __(movzbl %imm1_b,%imm1_l)
    630         __(lea local_label(misc_set_jmp)(%rip),%temp2)
    631         __(jmp *(%temp2,%imm1,8))
     634        __(lea local_label(misc_set_jmp)(%rip),%imm2)
     635        __(jmp *(%imm2,%imm1,8))
    632636        .p2align 3
    633637local_label(misc_set_jmp):             
     
    939943        __(jne local_label(misc_set_bad))
    9409449:      __(movq %imm0,misc_data_offset(%arg_x,%arg_y))
    941         __(jmp *%ra0)
     945        __(ret)
    942946local_label(misc_set_fixnum_vector):
    943947        __(movq %arg_z,%imm0)
     
    946950        __(jne local_label(misc_set_bad))
    947951        __(movq %imm0,misc_data_offset(%arg_x,%arg_y))
    948         __(jmp *%ra0)   
     952        __(ret)
    949953local_label(misc_set_s64):
    950954        __(movq %arg_z,%imm0)
     
    964968        __(jne local_label(misc_set_bad))
    9659699:      __(movq %imm0,misc_data_offset(%arg_x,%arg_y))
    966         __(jmp *%ra0)   
     970        __(ret)
    967971local_label(misc_set_bad):
    968972        __(movq %arg_z,%arg_y)
     
    980984        __(movq double_float.value(%arg_z),%imm0)
    981985        __(movq %imm0,misc_dfloat_offset(%arg_x,%arg_y))
    982         __(jmp *%ra0)
     986        __(ret)
    983987local_label(misc_set_s32):     
    984988        __(movq %arg_z,%imm0)
     
    993997        __(shr $fixnumshift,%imm0)
    994998        __(movl %imm0_l,misc_data_offset(%arg_x,%imm1))
    995         __(jmp *%ra0)
     999        __(ret)
    9961000local_label(misc_set_single_float_vector):
    9971001        __(cmpb $tag_single_float,%arg_z_b)
     
    10021006        __(shr $32,%imm0)
    10031007        __(movl %imm0_l,misc_data_offset(%arg_x,%imm1))
    1004         __(jmp *%ra0)
     1008        __(ret)
    10051009local_label(misc_set_u32):
    10061010        __(movq %arg_y,%imm1)   
     
    10111015        __(unbox_fixnum(%arg_z,%imm0))
    10121016        __(movl %imm0_l,misc_data_offset(%arg_x,%imm1))
    1013         __(jmp *%ra0)
     1017        __(ret)
    10141018local_label(misc_set_bit_vector):       
    10151019        __(testq $~fixnumone,%arg_z)
     
    10231027local_label(misc_set_set_bit): 
    10241028        __(btsq %imm0,misc_data_offset(%arg_x,%imm1,8))
    1025         __(jmp *%ra0)
     1029        __(ret)
    10261030local_label(misc_set_clr_bit): 
    10271031        __(btrq %imm0,misc_data_offset(%arg_x,%imm1,8))
    1028         __(jmp *%ra0)
     1032        __(ret)
    10291033local_label(misc_set_u8):       
    10301034        __(testq $~(0xff<<fixnumshift),%arg_z)
     
    10341038        __(shrq $3,%imm1)
    10351039        __(movb %imm0_b,misc_data_offset(%arg_x,%imm1))
    1036         __(jmp *%ra0)
     1040        __(ret)
    10371041local_label(misc_set_s8):
    10381042        __(movq %arg_z,%imm0)
     
    10471051        __(shrq $3,%imm1)
    10481052        __(movb %imm0_b,misc_data_offset(%arg_x,%imm1))
    1049         __(jmp *%ra0)
     1053        __(ret)
    10501054local_label(misc_set_string):
    10511055        __(cmpb $subtag_character,%arg_z_b)
     
    10561060        __(shrq $3,%imm1)
    10571061        __(movb %imm0_b,misc_data_offset(%arg_x,%imm1))
    1058         __(jmp *%ra0)
     1062        __(ret)
    10591063local_label(misc_set_new_string):
    10601064        __(cmpb $subtag_character,%arg_z_b)
     
    10651069        __(shrq $1,%imm1)
    10661070        __(movl %imm0_l,misc_data_offset(%arg_x,%imm1))
    1067         __(jmp *%ra0)       
     1071        __(ret)       
    10681072local_label(misc_set_s16):     
    10691073        __(movq %arg_z,%imm0)
     
    10781082        __(shrq $fixnumshift,%imm0)
    10791083        __(movw %imm0_w,misc_data_offset(%arg_x,%imm1))
    1080         __(jmp *%ra0)
     1084        __(ret)
    10811085local_label(misc_set_u16):
    10821086        __(movq %arg_y,%imm1)
     
    10861090        __(unbox_fixnum(%arg_z,%imm0))
    10871091        __(movw %imm0_w,misc_data_offset(%arg_x,%imm1))
    1088         __(jmp *%ra0)
     1092        __(ret)
    10891093local_label(misc_set_invalid):
    10901094        __(push $XSETBADVEC)
     
    11001104        .globl C(ret1valn)
    11011105__(tra(C(ret1valn)))
    1102         __(pop %ra0)
    1103         __(push %arg_z)
     1106        __(movq (%rsp),%ra0)
     1107        __(movq %arg_z,(%rsp))
    11041108        __(set_nargs(1))
    11051109        __(jmpq *%ra0)
     
    11181122        __(cmovneq -node_size(%rsp,%nargs_q),%arg_z)
    11191123        __(leaveq)
    1120         __(popq %ra0)
    1121         __(jmp *%ra0)
     1124        __(ret)
     1125
    11221126       
    11231127/* actually need to return values ; always need to copy   */
     
    11551159
    11561160_spentry(mkcatch1v)
    1157         __(Make_Catch(0))
    1158         __(jmp *%ra0)
     1161        __(nMake_Catch(0))
     1162        __(ret)
    11591163_endsubp(mkcatch1v)
    11601164
     
    11641168        __(jmp *%ra0)
    11651169_endsubp(mkunwind)
     1170       
     1171/* this takes a return address in %ra0; it's "new" in that it does the
     1172   double binding of *interrupt-level* out-of-line */
     1173_spentry(nmkunwind)
     1174        __(movq %rcontext:tcr.tlb_pointer,%arg_x)
     1175        __(movq INTERRUPT_LEVEL_BINDING_INDEX(%arg_x),%arg_y)
     1176        __(push %arg_y)
     1177        __(push $INTERRUPT_LEVEL_BINDING_INDEX)
     1178        __(push %rcontext:tcr.db_link)
     1179        __(movq %rsp,%rcontext:tcr.db_link)
     1180        __(movq $-1<<fixnumshift,INTERRUPT_LEVEL_BINDING_INDEX(%arg_x))
     1181        __(movq $undefined,%arg_z)
     1182        __(Make_Catch(fixnumone))
     1183        __(movq %arg_y,%arg_z)
     1184        __(jmp _SPbind_interrupt_level)
     1185_endsubp(nmkunwind)
    11661186
    11671187_spentry(mkcatchmv)
    1168         __(Make_Catch(fixnumone))
    1169         __(jmp *%ra0)
     1188        __(nMake_Catch(fixnumone))
     1189        __(ret)
    11701190_endsubp(mkcatchmv)
    1171 
     1191       
    11721192_spentry(throw)
    11731193        __(movq %rcontext:tcr.catch_top,%imm1)
     
    12041224        __(jz local_label(_threw_one_value_dont_unbind))
    12051225        __(lea local_label(_threw_one_value_dont_unbind)(%rip),%ra0)
     1226        __(push %ra0)
    12061227        __(jmp _SPunbind_to)
    12071228__(tra(local_label(_threw_one_value_dont_unbind)))
     
    12331254        __(cmpq %imm0,%imm1)
    12341255        __(je local_label(_threw_multiple_dont_unbind))
    1235         __(leaq local_label(_threw_multiple_dont_unbind)(%rip),%r10)
     1256        __(leaq local_label(_threw_multiple_dont_unbind)(%rip),%ra0)
     1257        __(push %ra0)
    12361258        __(jmp _SPunbind_to)
    12371259__(tra(local_label(_threw_multiple_dont_unbind)))
     
    12851307        __(push %ra0)
    12861308        __(leaq local_label(_nthrowv_back_from_unbind)(%rip),%ra0)
     1309        __(push %ra0)
    12871310        __(jmp _SPunbind_to)
    12881311__(tra(local_label(_nthrowv_back_from_unbind)))
     
    13711394/* Ready to call cleanup code. set up tra, jmp to %xfn   */
    13721395        __(leaq local_label(_nthrowv_called_cleanup)(%rip),%ra0)
     1396        __(push %ra0)
    13731397        __(movb $0,%rcontext:tcr.unwinding)
    13741398        __(jmp *%xfn)
     
    14211445        __(push %ra0)
    14221446        __(leaq local_label(_nthrow1v_back_from_unbind)(%rip),%ra0)
     1447        __(push %ra0)
    14231448        __(jmp _SPunbind_to)
    14241449__(tra(local_label(_nthrow1v_back_from_unbind)))
     
    14791504        __(leaq local_label(_nthrow1v_called_cleanup)(%rip),%ra0)
    14801505        __(movb $0,%rcontext:tcr.unwinding)
     1506        __(push %ra0)
    14811507        __(jmp *%xfn)
    14821508__(tra(local_label(_nthrow1v_called_cleanup)))
     
    15221548        __(movq $XSYMNOBIND,%arg_y)
    15231549        __(set_nargs(2))
     1550        __(push %ra0)
    15241551        __(jmp _SPksignalerr)   
    15251552_endsubp(bind)
     
    155215799:      __(movq $XSYMNOBIND,%arg_y)
    15531580        __(set_nargs(2))
     1581        __(push %ra0)
    15541582        __(jmp _SPksignalerr)
    15551583_endsubp(bind_self)
     
    157216009:      __(movq $XSYMNOBIND,%arg_y)
    15731601        __(set_nargs(2))
     1602        __(push %ra0)
    15741603        __(jmp _SPksignalerr)
    15751604_endsubp(bind_nil)
     
    160616359:      __(movq $XSYMNOBIND,%arg_y)
    16071636        __(set_nargs(2))
     1637        __(push %ra0)
    16081638        __(jmp _SPksignalerr)
    16091639_endsubp(bind_self_boundp_check)
     
    17201750/* setting the bit needs to be done atomically, unless we're sure that other  */
    17211751/* threads are suspended.)  */
    1722 /* 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.  */
    17231753
    17241754       
     
    17291759        __(_rplaca(%arg_y,%arg_z))
    17301760        __(ja 1f)
    1731 0:      __(jmp *%ra0)
     17610:      __(repret)
    173217621:      __(movq %arg_y,%imm0)
    17331763        __(subq lisp_global(heap_start),%imm0)
     
    17421772        __(lock)
    17431773        __(btsq %imm0,(%temp0,%imm1,8))
    1744         __(jmp *%ra0)
     1774        __(ret)
    17451775_endsubp(rplaca)
    17461776
     
    17511781        __(_rplacd(%arg_y,%arg_z))
    17521782        __(ja 1f)
    1753 0:      __(jmp *%ra0)
     17830:      __(repret)
    175417841:      __(movq %arg_y,%imm0)
    17551785        __(subq lisp_global(heap_start),%imm0)
     
    17641794        __(lock)
    17651795        __(btsq %imm0,(%temp0,%imm1,8))
    1766         __(jmp *%ra0)
     1796        __(ret)
    17671797_endsubp(rplacd)
    17681798
     
    17761806        __(movq %arg_z,misc_data_offset(%arg_x,%arg_y))
    17771807        __(ja 1f)
    1778 0:      __(jmp *%ra0)
     18080:      __(repret)
    177918091:      __(lea misc_data_offset(%arg_x,%arg_y),%imm0)
    17801810        __(subq lisp_global(heap_start),%imm0)
     
    17891819        __(lock)
    17901820        __(btsq %imm0,(%temp0,%imm1,8))
    1791         __(jmp *%ra0)               
     1821        __(ret)               
    17921822_endsubp(gvset)
    17931823
     
    18031833        __(movq %arg_z,misc_data_offset(%arg_x,%arg_y))
    18041834        __(ja 1f)
    1805 0:      __(jmp *%ra0)
     18350:      __(repret)
    180618361:      __(lea misc_data_offset(%arg_x,%arg_y),%imm0)
    18071837        __(subq lisp_global(heap_start),%imm0)
     
    18261856        __(lock)
    18271857        __(btsq %imm0,(%temp0,%imm1,8))
    1828         __(jmp *%ra0)               
     1858        __(ret)               
    18291859_endsubp(set_hash_key)
    18301860
     
    18631893C(egc_write_barrier_end):
    186418942:      __(movl $t_value,%arg_z_l)
    1865         __(jmp *%ra0)
     1895        __(ret)
    186618963:      __(movl $nil_value,%arg_z_l)
    1867         __(jmp *%ra0)
     1897        __(ret)
    18681898_endsubp(store_node_conditional)
    18691899                               
     
    190419348:      __(movq $XIMPROPERLIST,%arg_y)
    19051935        __(set_nargs(2))
     1936        __(push %ra0)
    19061937        __(jmp _SPksignalerr)
    190719389:      /* Whew           */
     
    19221953        __(jne 2f)
    19231954        __(TSP_Alloc_Fixed(2*node_size,%imm0))
    1924         __(jmp *%ra0)
     1955        __(ret)
    192519562:      __(movq %imm0,%imm1)
    19261957        __(add %imm1,%imm1)
     
    19521983        __(jne 3b)
    19531984        __(movq %temp1,%rcontext:tcr.db_link)
    1954         __(jmp *%ra0)
     1985        __(ret)
    19551986_endsubp(progvsave)
    19561987
     
    20162047        __(movq %imm0,tsp_frame.fixed_overhead(%temp0))
    20172048        __(leaq tsp_frame.fixed_overhead+fulltag_misc(%temp0),%arg_z)
    2018         __(jmp *%ra0)
     2049        __(ret)
    20192050local_label(stack_misc_alloc_heap_alloc_ivector):
    20202051        __(movq %rcontext:tcr.foreign_sp,%imm1)
     
    20312062        __(movq %imm0,(%temp0))
    20322063        __(leaq fulltag_misc(%temp0),%arg_z)
    2033         __(jmp *%ra0)
     2064        __(ret)
    20342065local_label(stack_misc_alloc_heap_alloc_gvector):       
    20352066        __(TSP_Alloc_Fixed(0,%imm0))
     
    20742105
    20752106_spentry(values)
     2107        __(movq (%temp0),%ra0)
    20762108        __(ref_global(ret1val_addr,%imm1))
    20772109        __(cmpq %imm1,%ra0)
     
    20822114        __(cmovneq -node_size(%rsp,%nargs_q),%arg_z)
    20832115        __(movq %temp0,%rsp)
    2084         __(jmp *%ra0)
    2085 0:      __(movq (%temp0),%ra0)
    2086         __(lea node_size(%temp0),%temp0)
     2116        __(ret)
     21170:      __(movq 8(%temp0),%ra0)
     2118        __(addq $2*node_size,%temp0)
    20872119        __(lea (%rsp,%nargs_q),%imm0)
    20882120        __(jmp 2f)
    2089 1:      __(lea -node_size(%imm0),%imm0)
     21211:      __(subq $node_size,%imm0)
    20902122        __(movq (%imm0),%temp1)
    2091         __(lea -node_size(%temp0),%temp0)
     2123        __(subq $node_size,%temp0)
    20922124        __(movq %temp1,(%temp0))
    209321252:      __(cmpq %imm0,%rsp)
     
    23122344        __(movl $XBADKEYS,%arg_y_l)
    23132345        __(set_nargs(2))
     2346        __(push %ra0)
    23142347        __(jmp _SPksignalerr)
    231523489:      __(jmp *%ra0)
     
    23872420
    23882421
    2389 /* Prepend all but the first four (3 words of code, inner fn) and last   */
    2390 /* (lfbits) elements of %fn to the "arglist".   */
    2391        
    2392 _spentry(call_closure)
    2393         __(subq $fulltag_function-fulltag_misc,%fn)
    2394         __(vector_length(%fn,%imm0))
    2395         __(movzwl %nargs,%nargs_l)
    2396        
    2397         __(subq $5<<fixnumshift,%imm0)  /* imm0 = inherited arg count   */
    2398         __(cmpw $nargregs<<fixnumshift,%nargs)
    2399         __(jna,pt local_label(no_insert))
    2400        
    2401 /* Some arguments have already been pushed.  Push imm0's worth   */
    2402 /* of NILs, copy those arguments that have already been vpushed from   */
    2403 /* the old TOS to the new, then insert all of the inerited args   */
    2404 /* and go to the function.  */
    2405        
    2406         __(movq %imm0,%imm1)
    2407 local_label(push_nil_loop):     
    2408         __(push $nil_value)
    2409         __(sub $fixnumone,%imm1)
    2410         __(jne local_label(push_nil_loop))
    2411        
    2412 /* Need to use arg regs as temporaries here.    */
    2413         __(movq %rsp,%temp1)
    2414         __(push %arg_z)
    2415         __(push %arg_y)
    2416         __(push %arg_x)
    2417         __(lea 3*node_size(%rsp,%imm0),%arg_x)
    2418         __(lea -nargregs<<fixnumshift(%nargs_q),%arg_y)
    2419 local_label(copy_already_loop):
    2420         __(movq (%arg_x),%arg_z)
    2421         __(addq $fixnumone,%arg_x)
    2422         __(movq %arg_z,(%temp1))
    2423         __(addq $fixnumone,%temp1)
    2424         __(subq $fixnumone,%arg_y)
    2425         __(jne local_label(copy_already_loop))
    2426        
    2427         __(movl $4<<fixnumshift,%imm1_l) /* skip code, new fn   */
    2428 local_label(insert_loop):               
    2429         __(movq misc_data_offset(%fn,%imm1),%arg_z)
    2430         __(addq $node_size,%imm1)
    2431         __(addw $fixnum_one,%nargs)
    2432         __(subq $node_size,%arg_x)
    2433         __(movq %arg_z,(%arg_x))
    2434         __(subq $fixnum_one,%imm0)
    2435         __(jne local_label(insert_loop))
    2436 
    2437         /* Recover the argument registers, pushed earlier   */
    2438         __(pop %arg_x)
    2439         __(pop %arg_y)
    2440         __(pop %arg_z)
    2441         __(jmp local_label(go))
    2442 
    2443 /* Here if nothing was pushed by the caller.  If we're  */
    2444 /* going to push anything, we have to reserve a stack  */
    2445 /* frame first. (We'll need to push something if the  */
    2446 /* sum of %nargs and %imm0 is greater than nargregs)   */
    2447        
    2448 local_label(no_insert):
    2449         __(lea (%nargs_q,%imm0),%imm1)
    2450         __(cmpq $nargregs<<fixnumshift,%imm1)
    2451         __(jna local_label(no_insert_no_frame))
    2452         /* Reserve space for a stack frame   */
    2453         __(push $reserved_frame_marker)
    2454         __(push $reserved_frame_marker)
    2455 local_label(no_insert_no_frame):       
    2456         /* nargregs or fewer args were already vpushed.   */
    2457         /* if exactly nargregs, vpush remaining inherited vars.   */
    2458         __(cmpw $nargregs<<fixnumshift,%nargs)
    2459         __(movl $4<<fixnumshift,%imm1_l) /* skip code, new fn   */
    2460         __(leaq 4<<fixnumshift(%imm0),%temp1)
    2461         __(jnz local_label(set_regs))
    2462 local_label(vpush_remaining): 
    2463         __(push misc_data_offset(%fn,%imm1))
    2464         __(addq $node_size,%imm1)
    2465         __(addw $fixnumone,%nargs)
    2466         __(subq $node_size,%imm0)
    2467         __(jnz local_label(vpush_remaining))
    2468         __(jmp local_label(go))
    2469 local_label(set_regs):
    2470         /* if nargs was > 1 (and we know that it was < 3), it must have   */
    2471         /* been 2.  Set arg_x, then vpush the remaining args.   */
    2472         __(cmpw $fixnumone,%nargs)
    2473         __(jle local_label(set_y_z))
    2474 local_label(set_arg_x):
    2475         __(subq $node_size,%temp1)
    2476         __(movq misc_data_offset(%fn,%temp1),%arg_x)
    2477         __(addw $fixnumone,%nargs)
    2478         __(subq $fixnumone,%imm0)
    2479         __(jne local_label(vpush_remaining))
    2480         __(jmp local_label(go))
    2481         /* Maybe set arg_y or arg_z, preceding args   */
    2482 local_label(set_y_z):
    2483         __(jne local_label(set_arg_z))
    2484         /* Set arg_y, maybe arg_x, preceding args   */
    2485 local_label(set_arg_y):
    2486         __(subq $node_size,%temp1)
    2487         __(movq misc_data_offset(%fn,%temp1),%arg_y)
    2488         __(addw $fixnumone,%nargs)
    2489         __(subq $fixnum_one,%imm0)
    2490         __(jnz local_label(set_arg_x))
    2491         __(jmp local_label(go))
    2492 local_label(set_arg_z):
    2493         __(subq $node_size,%temp1)
    2494         __(movq misc_data_offset(%fn,%temp1),%arg_z)
    2495         __(addw $fixnumone,%nargs)
    2496         __(subq $fixnum_one,%imm0)
    2497         __(jne local_label(set_arg_y))
    2498 local_label(go):       
    2499         __(movq misc_data_offset+(3*node_size)(%fn),%fn)
    2500         __(jmp *%fn)               
    2501 _endsubp(call_closure)
    25022422
    25032423_spentry(getxlong)
     
    25482468        __(movq $XNOSPREAD,%arg_y)
    25492469        __(set_nargs(2))
     2470        __(push %ra0)
    25502471        __(jmp _SPksignalerr)
    25512472_endsubp(spreadargz)
     
    25702491        __(lea (%rbp,%imm1),%rsp)
    25712492        __(movq 8(%rbp),%ra0)
    2572         __(movq 0(%rbp),%rbp)
     2493        __(movq (%rbp),%rbp)
     2494        __(pushq %ra0)
    25732495        __(do_funcall())
    25742496        /* All args in regs; exactly the same as the tfuncallvsp case   */
    257524979:             
    25762498        __(leave)
    2577         __(pop %ra0)
    25782499        __(do_funcall())
    25792500_endsubp(tfuncallgen)
     
    25942515        __(lea (%rbp,%imm1),%rsp)
    25952516        __(movq 8(%rbp),%ra0)
    2596         __(movq 0(%rbp),%rbp)
     2517        __(movq (%rbp),%rbp)
     2518        __(push %ra0)
    25972519        __(do_funcall())       
    25982520_endsubp(tfuncallslide)
     
    26012523_spentry(tfuncallvsp)
    26022524        __(leave)
    2603         __(pop %ra0)
    26042525        __(do_funcall())
    26052526_endsubp(tfuncallvsp)
     
    26212542        __(lea (%rbp,%imm1),%rsp)
    26222543        __(movq 8(%rbp),%ra0)
    2623         __(movq 0(%rbp),%rbp)
     2544        __(movq (%rbp),%rbp)
     2545        __(pushq %ra0)
    26242546        __(jump_fname())
    26252547/* All args in regs; exactly the same as the tcallsymvsp case   */
    262625489:             
    26272549        __(leave)
    2628         __(pop %ra0)
    26292550        __(jump_fname())
    26302551_endsubp(tcallsymgen)
     
    26452566        __(movq 8(%rbp),%ra0)
    26462567        __(movq 0(%rbp),%rbp)
     2568        __(pushq %ra0)
    26472569        __(jump_fname())
    26482570_endsubp(tcallsymslide)
     
    26502572_spentry(tcallsymvsp)
    26512573        __(leave)
    2652         __(pop %ra0)
    26532574        __(jump_fname())
    26542575_endsubp(tcallsymvsp)
     
    26722593        __(movq lisp_frame.savera0(%rbp),%ra0)
    26732594        __(movq lisp_frame.backlink(%rbp),%rbp)
     2595        __(pushq %ra0)
    26742596        __(jmp *%fn)
    26752597/* All args in regs; exactly the same as the tcallnfnvsp case   */
     
    26772599        __(movq %temp0,%fn)
    26782600        __(leave)
    2679         __(pop %ra0)
    26802601        __(jmp *%fn)
    26812602_endsubp(tcallnfngen)
     
    26972618        __(movq lisp_frame.savera0(%rbp),%ra0)
    26982619        __(movq lisp_frame.backlink(%rbp),%rbp)
     2620        __(pushq %ra0)
    26992621        __(jmp *%fn)
    27002622_endsubp(tcallnfnslide)
     
    27032625        __(movq %temp0,%fn)
    27042626        __(leave)
    2705         __(pop %ra0)
    27062627        __(jmp *%fn)
    27072628_endsubp(tcallnfnvsp)
     
    27262647        __(movsd %fpzero,macptr.domain(%arg_z))
    27272648        __(movsd %fpzero,macptr.type(%arg_z))
    2728         __(jmp *%ra0)
     2649        __(ret)
    272926501:      __(movq %rcontext:tcr.foreign_sp,%imm1)
    27302651        __(subq $dnode_size,%rcontext:tcr.foreign_sp)
     
    275626772:      __(cmpq %imm0,%imm1)
    27572678        __(jne 1b)             
    2758         __(jmp *%ra0)
     2679        __(repret)
    275926809:      __(movq %rcontext:tcr.foreign_sp,%imm1)
    27602681        __(subq $dnode_size,%rcontext:tcr.foreign_sp)
     
    27832704        __(jge 0b)
    27842705        __(movq %temp1,%arg_z)
    2785         __(jmp *%ra0)
     2706        __(ret)
    278627072:      __(TSP_Alloc_Fixed(0,%imm0))
    27872708        __(jmp 4f)
     
    27902711        __(jge 3b)
    27912712        __(movq %temp1,%arg_z)
    2792         __(jmp *%ra0)
     2713        __(ret)
    27932714_endsubp(makestacklist)
    27942715
     
    28592780        __(dnode_align(%imm1,node_size,%imm1))
    28602781        __(Misc_Alloc(%arg_z))
    2861         __(jmp *%ra0)
     2782        __(ret)
    28622783local_label(misc_alloc_not_u56):
    28632784        __(uuo_error_reg_not_type(Rarg_y,error_object_not_unsigned_byte_56))
     
    30532974        __(movq %whole_reg,%arg_z)
    30542975        __(set_nargs(2))
     2976        __(push %ra0)
    30552977        __(jmp _SPksignalerr)
    30562978_endfn(C(destbind1))   
     
    30662988        __(movq %whole_reg,%arg_z)
    30672989        __(set_nargs(2))
     2990        __(push %ra0)       
    30682991        __(jmp _SPksignalerr)
    30692992_endsubp(macro_bind)
     
    30973020        __(shr $num_subtag_bits,%imm0)
    30983021        __(movslq misc_data_offset-4(%arg_z,%imm0,4),%imm0)
    3099 8:      __(jmp *%ra0)
     30228:      __(repret)
    310030239:      __(uuo_error_reg_not_type(Rarg_z,error_object_not_integer))
    31013024_endsubp(integer_sign)
     
    32583181
    32593182_spentry(misc_alloc_init)
    3260         __(push %ra0)
    32613183        __(push %rbp)
    32623184        __(movq %rsp,%rbp)
     
    32653187        __(movq %arg_x,%arg_y)
    32663188        __(lea local_label(misc_alloc_init_back)(%rip),%ra0)
     3189        __(push %ra0)
    32673190        __(jmp _SPmisc_alloc)
    32683191__(tra(local_label(misc_alloc_init_back)))
    32693192        __(pop %arg_y)
    32703193        __(leave)
    3271         __(pop %ra0)
    32723194        __(movq $nrs.init_misc,%fname)
    32733195        __(set_nargs(2))
     
    32763198
    32773199_spentry(stack_misc_alloc_init)
    3278         __(push %ra0)
    32793200        __(push %rbp)
    32803201        __(movq %rsp,%rbp)
     
    32833204        __(movq %arg_x,%arg_y)
    32843205        __(lea local_label(stack_misc_alloc_init_back)(%rip),%ra0)
     3206        __(push %ra0)
    32853207        __(jmp _SPstack_misc_alloc)
    32863208__(tra(local_label(stack_misc_alloc_init_back)))
    32873209        __(pop %arg_y)
    32883210        __(leave)
    3289         __(pop %ra0)
    32903211        __(movq $nrs.init_misc,%fname)
    32913212        __(set_nargs(2))
     
    32993220C(popj):
    33003221        __(leave)
    3301         __(pop %ra0)
    3302         __(jmp *%ra0)
     3222        __(ret)
    33033223_endsubp(popj)
    33043224
     
    33113231        __(jne 1f)
    33123232        __(sarq $fixnumshift,%imm0)
    3313         __(jmp *%ra0)
     3233        __(ret)
    331432341:      __(andb $tagmask,%imm0_b)
    33153235        __(cmpb $tag_misc,%imm0_b)
     
    33263246        __(testq %imm0,%imm0)
    33273247        __(js 9f)
    3328         __(jmp *%ra0)
     3248        __(repret)
    332932493:      __(movq misc_data_offset(%arg_z),%imm0)
    33303250        __(cmpl $0,misc_data_offset+8(%arg_z))
    33313251        __(jne 9f)
    3332         __(jmp *%ra0)
     3252        __(repret)
    333332539:      __(uuo_error_reg_not_type(Rarg_z,error_object_not_u64))
    33343254_endsubp(getu64)
     
    33503270        __(movq misc_data_offset(%arg_z),%imm0)
    33513271        __(jne 9f)
    3352 8:      __(jmp *%ra0)
     32728:      __(repret)
    335332739:      __(uuo_error_reg_not_type(Rarg_z,error_object_not_u64))
    33543274_endsubp(gets64)
     
    33703290        __(Misc_Alloc(%arg_z))
    33713291        __(movq %mm0,misc_data_offset(%arg_z))
    3372         __(jmp *%ra0)
     3292        __(ret)
    337332933:      __(movl $three_digit_bignum_header,%imm0_l)
    33743294        __(movl $aligned_bignum_size(3),%imm1_l)
    33753295        __(Misc_Alloc(%arg_z))
    33763296        __(movq %mm0,misc_data_offset(%arg_z))
    3377 9:      __(jmp *%ra0)
     32979:      __(repret)
    33783298_endsubp(makeu64)
    33793299
     
    33903310        __(jne 8f)
    339133117:      __(movq symbol.vcell(%arg_y),%arg_z)
    3392 8:      __(jmp *%ra0)           
     33128:      __(repret)             
    33933313_endsubp(specref)
    33943314
     
    34033323        __(je 1f)
    34043324        __(movq %arg_z,(%imm1,%imm0))
    3405         __(jmp *%ra0)
     3325        __(ret)
    340633261:      __(lea fulltag_misc-fulltag_symbol(%arg_y),%arg_x)
    34073327        __(movq $1<<fixnumshift,%arg_y)
     
    34223342        __(jne,pt 9f)
    34233343        __(uuo_error_reg_unbound(Rarg_y))
    3424 9:      __(jmp *%ra0)           
     33449:      __(repret)             
    34253345_endsubp(specrefcheck)
    34263346
     
    34573377        __(movq %arg_y,(%arg_x,%temp1))
    34583378        __(movq %imm1,%rcontext:tcr.db_link)
    3459         __(jmp *%ra0)   
     3379        __(ret)
    34603380_endsubp(unbind)
    34613381
     
    34713391        __(jne 1b)
    34723392        __(movq %imm1,%rcontext:tcr.db_link)
    3473         __(jmp *%ra0)   
     3393        __(ret)
    34743394_endsubp(unbind_n)
    34753395
     
    34853405        __(jne 1b)
    34863406        __(movq %imm1,%rcontext:tcr.db_link)
    3487         __(jmp *%ra0)   
     3407        __(ret)
    34883408_endsubp(unbind_to)
    34893409
     
    35483468        __(movq %imm1,%rcontext:tcr.db_link)
    35493469        __(js,pn 1f)
    3550 0:      __(jmp *%ra0)
     34700:      __(repret)
    355134711:      __(testq %temp0,%temp0)
    35523472        __(js 0b)
    35533473        __(check_pending_enabled_interrupt(2f))
    3554 2:      __(jmp *%ra0)   
     34742:      __(repret)     
    35553475_endsubp(unbind_interrupt_level)
    35563476
     
    35623482        __(shrq $fixnumshift,%imm0)
    35633483        __(jne _SPunbind_n)
    3564         __(jmp *%ra0)
     3484        __(repret)
    35653485_endsubp(progvrestore)
    35663486       
     
    35753495        __(addq %arg_y,%arg_z)
    35763496        __(jo,pn C(fix_one_bit_overflow))
    3577         __(jmp *%ra0)
     3497        __(repret)
    357834981:      __(jump_builtin(_builtin_plus,2))
    35793499_endsubp(builtin_plus)
     
    35903510        __(subq %arg_y,%arg_z)
    35913511        __(jo,pn C(fix_one_bit_overflow))
    3592         __(jmp *%ra0)
     3512        __(repret)
    359335131:      __(jump_builtin(_builtin_minus,2))
    35943514_endsubp(builtin_minus)
     
    36073527        __(jo 1f)
    36083528        __(mov %imm0,%arg_z)
    3609         __(jmp *%ra0)
     3529        __(ret)
    361035301:      __(unbox_fixnum(%arg_z,%imm0))
    36113531        __(unbox_fixnum(%arg_y,%imm1))
     
    36263546        __(rcmpq(%arg_z,%arg_y))
    36273547        __(condition_to_boolean(e,%imm0,%arg_z))
    3628         __(jmp *%ra0)
     3548        __(ret)
    362935491:      __(jump_builtin(_builtin_eq,2))
    36303550_endsubp(builtin_eq)
     
    36383558        __(rcmpq(%arg_z,%arg_y))
    36393559        __(condition_to_boolean(ne,%imm0,%arg_z))
    3640         __(jmp *%ra0)
     3560        __(ret)
    364135611:      __(jump_builtin(_builtin_ne,2))
    36423562_endsubp(builtin_ne)
     
    36503570        __(rcmpq(%arg_y,%arg_z))
    36513571        __(condition_to_boolean(g,%imm0,%arg_z))
    3652         __(jmp *%ra0)
     3572        __(ret)
    365335731:      __(jump_builtin(_builtin_gt,2))
    36543574_endsubp(builtin_gt)
     
    36623582        __(rcmpq(%arg_y,%arg_z))
    36633583        __(condition_to_boolean(ge,%imm0,%arg_z))
    3664         __(jmp *%ra0)
     3584        __(ret)
    366535851:      __(jump_builtin(_builtin_ge,2))
    36663586_endsubp(builtin_ge)
     
    36743594        __(rcmpq(%arg_y,%arg_z))
    36753595        __(condition_to_boolean(l,%imm0,%arg_z))
    3676         __(jmp *%ra0)
     3596        __(ret)
    367735971:      __(jump_builtin(_builtin_lt,2))
    36783598_endsubp(builtin_lt)
     
    36863606        __(rcmpq(%arg_y,%arg_z))
    36873607        __(condition_to_boolean(le,%imm0,%arg_z))
    3688         __(jmp *%ra0)
     3608        __(ret)
    368936091:      __(jump_builtin(_builtin_le,2))
    36903610_endsubp(builtin_le)
     
    37073627        __(jump_builtin(_builtin_eql,2))
    370836281:      __(movl $t_value,%arg_z_l)
    3709         __(jmp *%ra0)
     3629        __(ret)
    371036302:      __(movl $nil_value,%arg_z_l)
    3711         __(jmp *%ra0)   
     3631        __(ret)
    37123632_endsubp(builtin_eql)
    37133633
     
    37253645        __(movq %arg_z,%arg_y)
    37263646        __(vector_length(%arg_y,%arg_z))
    3727         __(jmp *%ra0)
     3647        __(ret)
    372836481:      /* vector header   */
    37293649        __(movq vectorH.logsize(%arg_z),%arg_z)
    3730         __(jmp *%ra0)
     3650        __(ret)
    373136512:      /* list.  Maybe null, maybe dotted or circular.   */
    3732         __(movq $-fixnumone,%temp2)
     3652        __(movq $-fixnumone,%imm2)
    37333653        __(movq %arg_z,%temp0)  /* fast pointer   */
    37343654        __(movq %arg_z,%temp1)  /* slow pointer   */
    373536553:      __(extract_lisptag(%temp0,%imm0))       
    37363656        __(compare_reg_to_nil(%temp0))
    3737         __(leaq fixnumone(%temp2),%temp2)
     3657        __(leaq fixnumone(%imm2),%imm2)
    37383658        __(je 9f)
    37393659        __(cmpb $tag_list,%imm0_b)
    37403660        __(jne 8f)
    37413661        __(extract_lisptag(%temp1,%imm1))
    3742         __(testb $fixnumone,%temp2_b)
     3662        __(testb $fixnumone,%imm2_b)
    37433663        __(_cdr(%temp0,%temp0))
    37443664        __(je 3b)
     
    37513671        __(jump_builtin(_builtin_length,1))
    375236729:     
    3753         __(movq %temp2,%arg_z)
    3754         __(jmp *%ra0)           
     3673        __(movq %imm2,%arg_z)
     3674        __(ret)         
    37553675_endsubp(builtin_length)
    37563676
     
    37663686        __(jb 2f)
    37673687        __(movl $nil_value,%arg_z_l)
    3768         __(jmp *%ra0)
     3688        __(ret)
    376936891:      __(movl $t_value,%arg_z_l)
    3770         __(jmp *%ra0)
     3690        __(ret)
    377136912:     
    37723692        __(jump_builtin(_builtin_seqtype,1))
     
    37943714        __(jnz 4f)
    37953715        __(movq %arg_x,%arg_z)
    3796         __(jmp *%ra0)
     3716        __(ret)
    379737174:      __(cmpb $fulltag_nil,%arg_z_b)
    379837185:      __(jnz 1b)
    3799         __(jmp *%ra0)                   
     3719        __(repret)                     
    38003720_endsubp(builtin_assq) 
    38013721
     
    38153735        __(movq %temp0,%arg_z)
    381637363:      __(jnz 1b)
    3817 4:      __(jmp *%ra0)                           
     37374:      __(repret)                             
    38183738_endsubp(builtin_memq)
    38193739
     
    38373757        __(bt %imm0,%arg_z)
    38383758        __(condition_to_boolean(b,%imm0,%arg_z))
    3839         __(jmp *%ra0)
     3759        __(ret)
    384037601:      __(jump_builtin(_builtin_logbitp,2))
    38413761_endsubp(builtin_logbitp)
     
    38473767        __(jne 1f)
    38483768        __(orq %arg_y,%arg_z)
    3849         __(jmp *%ra0)
     3769        __(ret)
    385037701:     
    38513771        __(jump_builtin(_builtin_logior,2))
     
    38593779        __(jne 1f)
    38603780        __(andq %arg_y,%arg_z)
    3861         __(jmp *%ra0)
     3781        __(ret)
    386237821:             
    38633783        __(jump_builtin(_builtin_logand,2))
     
    38693789        __(negq %arg_z)
    38703790        __(jo,pn C(fix_one_bit_overflow))
    3871         __(jmp *%ra0)
     3791        __(repret)
    387237921:             
    38733793        __(jump_builtin(_builtin_negate,1))     
     
    38803800        __(jne 1f)
    38813801        __(xorq %arg_y,%arg_z)
    3882         __(jmp *%ra0)
     3802        __(ret)
    388338031:             
    38843804        __(jump_builtin(_builtin_logxor,2))
     
    38943814_endsubp(builtin_aset1)
    38953815
    3896 /* We have to be a little careful here  %cl has to be used for  */
    3897 /*   the (unboxed) shift count in all variable-length shifts, and  */
    3898 /*   %temp2 = %rcx.  Zero all but the low 8 (or 6) bits of %rcx,  */
    3899 /*   so that the shift count doesn't confuse the GC.  */
    39003816
    39013817_spentry(builtin_ash)
     
    39093825        __(jnz 1f)
    39103826        __(movq %arg_y,%arg_z)  /* shift by 0   */
    3911         __(jmp *%ra0)
     3827        __(ret)
    391238281:      __(jns 3f)
    39133829        __(rcmpq(%imm0,$-63))
     
    39153831        __(sar $63,%imm1)
    39163832        __(box_fixnum(%imm1,%arg_z))
    3917         __(jmp *%ra0)
     3833        __(ret)
    391838342:      /* Right-shift by small fixnum   */
    39193835        __(negb %imm0_b)
    39203836        __(movzbl %imm0_b,%ecx)
    39213837        __(sar %cl,%imm1)
    3922         __(xorl %ecx,%ecx)
    39233838        __(box_fixnum(%imm1,%arg_z))
    3924         __(jmp *%ra0)
     3839        __(ret)
    392538403:      /* Left shift by fixnum. We cant shift by more than 63 bits, though  */
    39263841        /* shifting by 64 is actually easy.   */
     
    39383853        __(shld %cl,%imm0,%imm1)
    39393854        __(shl %cl,%imm0)
    3940         __(xorb %cl,%cl)
    39413855        __(jmp C(makes128))
    394238565:      __(shld %cl,%imm0,%imm1)
    39433857        __(shl %cl,%imm0)
    3944         __(xorb %cl,%cl)
    39453858        __(jmp C(makes128))
    394638599:     
     
    398739000:             
    39883901        /* Save lisp registers   */
     3902        __(push %rbp)
     3903        __(movq %rsp,%rbp)
    39893904        __(push %temp0)
    39903905        __(push %temp1)
     
    39963911        __(push %save1)
    39973912        __(push %save2)
    3998         __(push %save3)
     3913        __(push %save3)         /* 10 registers pushed after %rbp */
    39993914        __(push %fn)
    4000         __(push %ra0)
    4001         __(push %rbp)
    4002         __(movq %rsp,%rbp)
    40033915        __(movq %rsp,%rcontext:tcr.save_vsp)
    40043916        __(movq %rbp,%rcontext:tcr.save_rbp)
     
    40593971        __(clr %temp0)
    40603972        __(clr %fn)
    4061         __(clr %ra0)
    40623973        __(pxor %fpzero,%fpzero)
    40633974        /* Darwin's math library seems to be pretty casual
     
    40703981        __(movq $TCR_STATE_LISP,%rcontext:tcr.valence)
    40713982        __(movq %rcontext:tcr.save_vsp,%rsp)
    4072         __(pop %rbp)
    4073         __(pop %ra0)
     3983        __(movq %rcontext:tcr.save_rbp,%rbp)
    40743984        __(pop %fn)
    40753985        __(pop %save3)
     
    40853995        __(check_pending_interrupt(%temp0))
    40863996        __(pop %temp0)
    4087         __(jmp *%ra0)
     3997        __(leave)
     3998        __(ret)
    40883999_endsubp(ffcall)
    40894000
     
    409740080:             
    40984009        /* Save lisp registers   */
     4010        __(push %rbp)
     4011        __(movq %rsp,%rbp)
    40994012        __(push %temp0)
    41004013        __(push %temp1)
     
    41094022        __(movq macptr.address(%arg_y),%rbx)  /* %rbx non-volatile */
    41104023        __(push %fn)
    4111         __(push %ra0)
    4112         __(push %rbp)
    4113         __(movq %rsp,%rbp)
    41144024        __(movq %rsp,%rcontext:tcr.save_vsp)
    41154025        __(movq %rbp,%rcontext:tcr.save_rbp)
     
    41744084        __(clr %temp0)
    41754085        __(clr %fn)
    4176         __(clr %ra0)
    41774086        __(pxor %fpzero,%fpzero)
    41784087        /* Darwin's math library seems to be pretty casual
     
    41854094        __(movq $TCR_STATE_LISP,%rcontext:tcr.valence)
    41864095        __(movq %rcontext:tcr.save_vsp,%rsp)
    4187         __(pop %rbp)
    4188         __(pop %ra0)
     4096        __(movq %rcontext:tcr.save_rbp,%rbp)
    41894097        __(pop %fn)
    41904098        __(pop %save3)
     
    42004108        __(check_pending_interrupt(%temp0))
    42014109        __(pop %temp0)
    4202         __(jmp *%ra0)
     4110        __(leave)
     4111        __(ret)
    42034112_endsubp(ffcall_returning_registers)
    42044113       
    42054114_spentry(syscall)
    42064115        /* Save lisp registers   */
     4116        __(push %rbp)
     4117        __(movq %rsp,%rbp)
    42074118        __(push %temp0)
    42084119        __(push %temp1)
     
    42164127        __(push %save3)
    42174128        __(push %fn)
    4218         __(push %ra0)
    4219         __(push %rbp)
    4220         __(movq %rsp,%rbp)
    42214129        __(movq %rsp,%rcontext:tcr.save_vsp)
     4130        __(movq %rbp,%rcontext:tcr.save_rbp)
    42224131        __(movq %rcontext:tcr.foreign_sp,%rsp)
    42234132        __(movq $TCR_STATE_FOREIGN,%rcontext:tcr.valence)
     
    42514160        __(clr %temp0)
    42524161        __(clr %fn)
    4253         __(clr %ra0)
    42544162        __(pxor %fpzero,%fpzero)
    42554163        __(movq $TCR_STATE_LISP,%rcontext:tcr.valence)
    42564164        __(movq %rcontext:tcr.save_vsp,%rsp)
    4257         __(pop %rbp)
    4258         __(pop %ra0)
     4165        __(movq %rcontext:tcr.save_rbp,%rbp)
    42594166        __(pop %fn)
    42604167        __(pop %save3)
     
    42694176        __(check_pending_interrupt(%temp0))
    42704177        __(pop %temp0)
    4271         __(jmp *%ra0)
     4178        __(leave)
     4179        __(ret)
    42724180_endsubp(syscall)               
    42734181
     
    44054313        __(clr %temp0)
    44064314        __(clr %fn)
    4407         __(clr %ra0)
    44084315        __(pxor %fpzero,%fpzero)
    44094316        __(movq $TCR_STATE_LISP,%rcontext:tcr.valence)
     
    44164323        __(movq %rcontext:tcr.save_rbp,%rbp)
    44174324        __(movq $nrs.callbacks,%fname)
     4325        __(lea local_label(back_from_callback)(%rip),%ra0)
    44184326        __(set_nargs(2))
    4419         __(lea local_label(back_from_callback)(%rip),%ra0)
     4327        __(push %ra0)
    44204328        __(jump_fname())
    44214329__(tra(local_label(back_from_callback)))
     
    46044512        __(jmp 8b)
    46054513_endsubp(aset3)
     4514
    46064515       
     4516
     4517
     4518/* Prepend all but the first five (4 words of code, inner fn) and last   */
     4519/* (lfbits) elements of %fn to the "arglist".   */
     4520       
     4521_spentry(call_closure)
     4522        new_local_labels()
     4523        __(subq $fulltag_function-fulltag_misc,%fn)
     4524        __(vector_length(%fn,%imm0))
     4525        __(movzwl %nargs,%nargs_l)
     4526       
     4527        __(subq $6<<fixnumshift,%imm0)  /* imm0 = inherited arg count   */
     4528        __(lea (%nargs_q,%imm0),%imm1)
     4529        __(cmpw $nargregs<<fixnumshift,%imm1_w)
     4530        __(jna,pt local_label(regs_only))
     4531        __(pop %ra0)
     4532        __(cmpw $nargregs<<fixnumshift,%nargs)
     4533        __(jna,pt local_label(no_insert))
     4534       
     4535/* Some arguments have already been pushed.  Push imm0's worth   */
     4536/* of NILs, copy those arguments that have already been vpushed from   */
     4537/* the old TOS to the new, then insert all of the inerited args   */
     4538/* and go to the function.  */
     4539       
     4540        __(movq %imm0,%imm1)
     4541local_label(push_nil_loop):     
     4542        __(push $nil_value)
     4543        __(sub $fixnumone,%imm1)
     4544        __(jne local_label(push_nil_loop))
     4545       
     4546/* Need to use arg regs as temporaries here.    */
     4547        __(movq %rsp,%temp1)
     4548        __(push %arg_z)
     4549        __(push %arg_y)
     4550        __(push %arg_x)
     4551        __(lea 3*node_size(%rsp,%imm0),%arg_x)
     4552        __(lea -nargregs<<fixnumshift(%nargs_q),%arg_y)
     4553local_label(copy_already_loop):
     4554        __(movq (%arg_x),%arg_z)
     4555        __(addq $fixnumone,%arg_x)
     4556        __(movq %arg_z,(%temp1))
     4557        __(addq $fixnumone,%temp1)
     4558        __(subq $fixnumone,%arg_y)
     4559        __(jne local_label(copy_already_loop))
     4560       
     4561        __(movl $5<<fixnumshift,%imm1_l) /* skip code, new fn   */
     4562local_label(insert_loop):               
     4563        __(movq misc_data_offset(%fn,%imm1),%arg_z)
     4564        __(addq $node_size,%imm1)
     4565        __(addw $fixnum_one,%nargs)
     4566        __(subq $node_size,%arg_x)
     4567        __(movq %arg_z,(%arg_x))
     4568        __(subq $fixnum_one,%imm0)
     4569        __(jne local_label(insert_loop))
     4570
     4571        /* Recover the argument registers, pushed earlier   */
     4572        __(pop %arg_x)
     4573        __(pop %arg_y)
     4574        __(pop %arg_z)
     4575        __(jmp local_label(go))
     4576
     4577/* Here if nothing was pushed by the caller.  If we're  */
     4578/* going to push anything, we have to reserve a stack  */
     4579/* frame first. (We'll need to push something if the  */
     4580/* sum of %nargs and %imm0 is greater than nargregs)   */
     4581       
     4582local_label(no_insert):
     4583        __(lea (%nargs_q,%imm0),%imm1)
     4584        __(cmpq $nargregs<<fixnumshift,%imm1)
     4585        __(jna local_label(no_insert_no_frame))
     4586        /* Reserve space for a stack frame   */
     4587        __(push $reserved_frame_marker)
     4588        __(push $reserved_frame_marker)
     4589local_label(no_insert_no_frame):       
     4590        /* nargregs or fewer args were already vpushed.   */
     4591        /* if exactly nargregs, vpush remaining inherited vars.   */
     4592        __(cmpw $nargregs<<fixnumshift,%nargs)
     4593        __(movl $5<<fixnumshift,%imm1_l) /* skip code, new fn   */
     4594        __(leaq 5<<fixnumshift(%imm0),%temp1)
     4595        __(jnz local_label(set_regs))
     4596local_label(vpush_remaining): 
     4597        __(push misc_data_offset(%fn,%imm1))
     4598        __(addq $node_size,%imm1)
     4599        __(addw $fixnumone,%nargs)
     4600        __(subq $node_size,%imm0)
     4601        __(jnz local_label(vpush_remaining))
     4602        __(jmp local_label(go))
     4603local_label(set_regs):
     4604        /* if nargs was > 1 (and we know that it was < 3), it must have   */
     4605        /* been 2.  Set arg_x, then vpush the remaining args.   */
     4606        __(cmpw $fixnumone,%nargs)
     4607        __(jle local_label(set_y_z))
     4608local_label(set_arg_x):
     4609        __(subq $node_size,%temp1)
     4610        __(movq misc_data_offset(%fn,%temp1),%arg_x)
     4611        __(addw $fixnumone,%nargs)
     4612        __(subq $fixnumone,%imm0)
     4613        __(jne local_label(vpush_remaining))
     4614        __(jmp local_label(go))
     4615        /* Maybe set arg_y or arg_z, preceding args   */
     4616local_label(set_y_z):
     4617        __(jne local_label(set_arg_z))
     4618        /* Set arg_y, maybe arg_x, preceding args   */
     4619local_label(set_arg_y):
     4620        __(subq $node_size,%temp1)
     4621        __(movq misc_data_offset(%fn,%temp1),%arg_y)
     4622        __(addw $fixnumone,%nargs)
     4623        __(subq $fixnum_one,%imm0)
     4624        __(jnz local_label(set_arg_x))
     4625        __(jmp local_label(go))
     4626local_label(set_arg_z):
     4627        __(subq $node_size,%temp1)
     4628        __(movq misc_data_offset(%fn,%temp1),%arg_z)
     4629        __(addw $fixnumone,%nargs)
     4630        __(subq $fixnum_one,%imm0)
     4631        __(jne local_label(set_arg_y))
     4632local_label(go):       
     4633        __(movq misc_data_offset+(4*node_size)(%fn),%fn)
     4634        __(push %ra0)
     4635        __(jmp *%fn)
     4636local_label(regs_only):
     4637        __(leaq 5<<fixnumshift(%imm0),%temp1)
     4638        __(testw %nargs,%nargs)
     4639        __(jne local_label(some_args))
     4640        __(cmpw $node_size,%imm0)
     4641        __(movq misc_data_offset-node_size(%fn,%temp1),%arg_z)
     4642        __(je local_label(rgo))
     4643        __(cmpw $2*node_size,%imm0)
     4644        __(movq misc_data_offset-(node_size*2)(%fn,%temp1),%arg_y)
     4645        __(je local_label(rgo))
     4646        __(movq misc_data_offset-(node_size*3)(%fn,%temp1),%arg_x)
     4647local_label(rgo):
     4648        __(addw %imm0_w,%nargs)
     4649        __(jmp *misc_data_offset+(4*node_size)(%fn))
     4650local_label(some_args):         
     4651        __(cmpw $2*node_size,%nargs)
     4652        __(jz local_label(rtwo))
     4653        /* One arg was passed, could be one or two inherited args */
     4654        __(cmpw $node_size,%imm0)
     4655        __(movq misc_data_offset-node_size(%fn,%temp1),%arg_y)
     4656        __(je local_label(rgo))
     4657        __(movq misc_data_offset-(node_size*2)(%fn,%temp1),%arg_x)
     4658        __(jmp local_label(rgo))
     4659local_label(rtwo):     
     4660        __(movq misc_data_offset-node_size(%fn,%temp1),%arg_x)
     4661        __(jmp local_label(rgo))
     4662_endsubp(call_closure)
     4663                                       
    46074664       
    46084665_spentry(poweropen_callbackX)
Note: See TracChangeset for help on using the changeset viewer.