Changeset 6341 for branches/x8664-call


Ignore:
Timestamp:
Apr 23, 2007, 4:49:36 AM (13 years ago)
Author:
gb
Message:

.SPncall-closure.

Location:
branches/x8664-call/ccl
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/x8664-call/ccl/compiler/X86/X8664/x8664-arch.lisp

    r6321 r6341  
    11211121         (defx8664subprim .SPnspecset)
    11221122         (defx8664subprim .SPnspecrefcheck)
     1123         (defx8664subprim .SPncall-closure)
    11231124         )))))
    11241125
  • branches/x8664-call/ccl/lisp-kernel/x86-spentry64.s

    r6340 r6341  
    513951399:      __(ret)         
    51405140_endsubp(nspecrefcheck)
    5141                                
     5141
     5142/* Prepend all but the first five (4 words of code, inner fn) and last   */
     5143/* (lfbits) elements of %fn to the "arglist".   */
     5144       
     5145_spentry(ncall_closure)
     5146        __(subq $fulltag_function-fulltag_misc,%fn)
     5147        __(vector_length(%fn,%imm0))
     5148        __(movzwl %nargs,%nargs_l)
     5149       
     5150        __(subq $6<<fixnumshift,%imm0)  /* imm0 = inherited arg count   */
     5151        __(cmpw $nargregs<<fixnumshift,%nargs)
     5152        __(jna,pt local_label(nno_insert))
     5153       
     5154/* Some arguments have already been pushed.  Push imm0's worth   */
     5155/* of NILs, copy those arguments that have already been vpushed from   */
     5156/* the old TOS to the new, then insert all of the inerited args   */
     5157/* and go to the function.  */
     5158       
     5159        __(movq %imm0,%imm1)
     5160local_label(npush_nil_loop):     
     5161        __(push $nil_value)
     5162        __(sub $fixnumone,%imm1)
     5163        __(jne local_label(npush_nil_loop))
     5164       
     5165/* Need to use arg regs as temporaries here.    */
     5166        __(movq %rsp,%temp1)
     5167        __(push %arg_z)
     5168        __(push %arg_y)
     5169        __(push %arg_x)
     5170        __(lea 3*node_size(%rsp,%imm0),%arg_x)
     5171        __(lea -nargregs<<fixnumshift(%nargs_q),%arg_y)
     5172local_label(ncopy_already_loop):
     5173        __(movq (%arg_x),%arg_z)
     5174        __(addq $fixnumone,%arg_x)
     5175        __(movq %arg_z,(%temp1))
     5176        __(addq $fixnumone,%temp1)
     5177        __(subq $fixnumone,%arg_y)
     5178        __(jne local_label(ncopy_already_loop))
     5179       
     5180        __(movl $5<<fixnumshift,%imm1_l) /* skip code, new fn   */
     5181local_label(ninsert_loop):               
     5182        __(movq misc_data_offset(%fn,%imm1),%arg_z)
     5183        __(addq $node_size,%imm1)
     5184        __(addw $fixnum_one,%nargs)
     5185        __(subq $node_size,%arg_x)
     5186        __(movq %arg_z,(%arg_x))
     5187        __(subq $fixnum_one,%imm0)
     5188        __(jne local_label(ninsert_loop))
     5189
     5190        /* Recover the argument registers, pushed earlier   */
     5191        __(pop %arg_x)
     5192        __(pop %arg_y)
     5193        __(pop %arg_z)
     5194        __(jmp local_label(ngo))
     5195
     5196/* Here if nothing was pushed by the caller.  If we're  */
     5197/* going to push anything, we have to reserve a stack  */
     5198/* frame first. (We'll need to push something if the  */
     5199/* sum of %nargs and %imm0 is greater than nargregs)   */
     5200       
     5201local_label(nno_insert):
     5202        __(lea (%nargs_q,%imm0),%imm1)
     5203        __(cmpq $nargregs<<fixnumshift,%imm1)
     5204        __(jna local_label(nno_insert_no_frame))
     5205        /* Reserve space for a stack frame   */
     5206        __(push $reserved_frame_marker)
     5207        __(push $reserved_frame_marker)
     5208local_label(nno_insert_no_frame):       
     5209        /* nargregs or fewer args were already vpushed.   */
     5210        /* if exactly nargregs, vpush remaining inherited vars.   */
     5211        __(cmpw $nargregs<<fixnumshift,%nargs)
     5212        __(movl $5<<fixnumshift,%imm1_l) /* skip code, new fn   */
     5213        __(leaq 5<<fixnumshift(%imm0),%temp1)
     5214        __(jnz local_label(nset_regs))
     5215local_label(nvpush_remaining): 
     5216        __(push misc_data_offset(%fn,%imm1))
     5217        __(addq $node_size,%imm1)
     5218        __(addw $fixnumone,%nargs)
     5219        __(subq $node_size,%imm0)
     5220        __(jnz local_label(nvpush_remaining))
     5221        __(jmp local_label(ngo))
     5222local_label(nset_regs):
     5223        /* if nargs was > 1 (and we know that it was < 3), it must have   */
     5224        /* been 2.  Set arg_x, then vpush the remaining args.   */
     5225        __(cmpw $fixnumone,%nargs)
     5226        __(jle local_label(nset_y_z))
     5227local_label(nset_arg_x):
     5228        __(subq $node_size,%temp1)
     5229        __(movq misc_data_offset(%fn,%temp1),%arg_x)
     5230        __(addw $fixnumone,%nargs)
     5231        __(subq $fixnumone,%imm0)
     5232        __(jne local_label(nvpush_remaining))
     5233        __(jmp local_label(ngo))
     5234        /* Maybe set arg_y or arg_z, preceding args   */
     5235local_label(nset_y_z):
     5236        __(jne local_label(nset_arg_z))
     5237        /* Set arg_y, maybe arg_x, preceding args   */
     5238local_label(nset_arg_y):
     5239        __(subq $node_size,%temp1)
     5240        __(movq misc_data_offset(%fn,%temp1),%arg_y)
     5241        __(addw $fixnumone,%nargs)
     5242        __(subq $fixnum_one,%imm0)
     5243        __(jnz local_label(nset_arg_x))
     5244        __(jmp local_label(ngo))
     5245local_label(nset_arg_z):
     5246        __(subq $node_size,%temp1)
     5247        __(movq misc_data_offset(%fn,%temp1),%arg_z)
     5248        __(addw $fixnumone,%nargs)
     5249        __(subq $fixnum_one,%imm0)
     5250        __(jne local_label(nset_arg_y))
     5251local_label(ngo):       
     5252        __(movq misc_data_offset+(4*node_size)(%fn),%fn)
     5253        __(jmp *%fn)               
     5254_endsubp(ncall_closure)
     5255                                       
    51425256       
    51435257_spentry(poweropen_callbackX)
  • branches/x8664-call/ccl/lisp-kernel/x86-spjump64.s

    r6317 r6341  
    211211        _spjump(nspecset)
    212212        _spjump(nspecrefcheck)
     213        _spjump(ncall_closure)
    213214         .globl C(spjump_end)
    214215C(spjump_end):
Note: See TracChangeset for help on using the changeset viewer.