Changeset 8635


Ignore:
Timestamp:
Mar 1, 2008, 8:41:32 PM (12 years ago)
Author:
rme
Message:

Implement subprims: .SPnvalret, .SPstack_misc_alloc, .SPgvector, .SPmisc_alloc

Fix to .SPbuiltin_minus (left out a local label).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/ia32/lisp-kernel/x86-spentry32.s

    r8467 r8635  
    445445        .globl C(nvalret)                       
    446446C(nvalret):
     447        __(ref_global(ret1val_addr,%temp0))
     448        __(cmpl lisp_frame.savera0(%ebp),%temp0)
     449        __(je 1f)
     450        __(test %nargs,%nargs)
     451        __(movl $nil_value,%arg_z)
     452        __(cmovnel -node_size(%esp,%nargs),%arg_z)
    447453        __(leave)
    448454        __(ret)
     455
     456/* actually need to return values; always need to copy. */
     4571:      __(lea 2*node_size(%ebp),%imm0)
     458        __(pushl (%imm0))
     459        __(movl 0(%ebp),%ebp)
     460        __(addl $node_size,%imm0)
     461        __(lea node_size(%esp,%nargs),%temp0)
     462        __(xorl %arg_y,%arg_y)
     463        __(jmp 3f)
     4642:      __(movl -node_size(%temp0),%arg_z)
     465        __(subl $node_size,%temp0)
     466        __(addl $node_size,%arg_y)
     467        __(movl %arg_z,-node_size(%imm0))
     468        __(subl $node_size,%imm0)
     4693:      __(cmpl %arg_y,%nargs)
     470        __(jne 2b)
     471        __(pop %ra0)
     472        __(movl %imm0,%esp)
     473        __(jmp *%ra0)
    449474_endsubp(nvalret)
    450475
     
    807832       
    808833_spentry(stack_misc_alloc)
    809         __(int $3)
     834        __(testl $~(((1<<24)-1)<<fixnumshift),%arg_y)
     835        __(jne local_label(stack_misc_alloc_not_u24))
     836        __(unbox_fixnum(%arg_z,%imm0))
     837        __(mov %arg_y,%temp0)
     838        __(shl $num_subtag_bits-fixnumshift,%temp0)
     839        __(or %temp0,%imm0)     /* %imm0 now = header */
     840        __(movd %imm0,%mm0)     /* cache header in %mm0 */
     841        __(andb $fulltagmask,%imm0_b)
     842        __(cmpb $fulltag_nodeheader,%imm0_b)
     843        __(je local_label(stack_misc_alloc_node))
     844        __(movd %mm0,%imm0)
     845        __(cmpb $max_32_bit_ivector_subtag,%imm0_b)
     846        __(jbe local_label(stack_misc_alloc_32))
     847        __(cmpb $max_8_bit_ivector_subtag,%imm0_b)
     848        __(jbe local_label(stack_misc_alloc_8))
     849        __(cmpb $max_16_bit_ivector_subtag,%imm0_b)
     850        __(jbe local_label(stack_misc_alloc_16))
     851        __(cmpb $subtag_double_float_vector,%imm0_b)
     852        __(jne local_label(stack_misc_alloc_1))
     853        /* double-float vector case */
     854        __(imul $2,%arg_y,%imm0)
     855        __(jmp local_label(stack_misc_alloc_alloc_ivector))
     856local_label(stack_misc_alloc_1):
     857        __(unbox_fixnum(%arg_y,%imm0))
     858        __(addl $7,%imm0)
     859        __(shrl $3,%imm0)
     860        __(jmp local_label(stack_misc_alloc_alloc_ivector))
     861local_label(stack_misc_alloc_8):
     862        __(unbox_fixnum(%arg_y,%imm0))
     863        __(jmp local_label(stack_misc_alloc_alloc_ivector))
     864local_label(stack_misc_alloc_16):
     865        __(unbox_fixnum(%arg_y,%imm0))
     866        __(shl $1,%imm0)
     867        __(jmp local_label(stack_misc_alloc_alloc_ivector))
     868local_label(stack_misc_alloc_32):
     869        __(mov %arg_y,%imm0)
     870local_label(stack_misc_alloc_alloc_ivector):
     871        /* byte count in %imm0 */
     872        __(dnode_align(%imm0,tsp_frame.fixed_overhead+node_size,%imm0))
     873        __(cmpl $tstack_alloc_limit,%imm0)
     874        __(ja local_label(stack_misc_alloc_heap_alloc_ivector))
     875        __(movd %rcontext:tcr.foreign_sp,%stack_temp)
     876        __(movd %stack_temp,%temp1)
     877        __(subl %imm0,%rcontext:tcr.foreign_sp)
     878        __(movl %rcontext:tcr.foreign_sp,%temp0)
     8790:      __(movsd %fpzero,-dnode_size(%temp1))
     880        __(subl $dnode_size,%temp1)
     881        __(cmpl %temp1,%temp0)
     882        __(jnz 0b)
     883        __(movd %stack_temp,(%temp0))
     884        __(movd %mm0,tsp_frame.fixed_overhead(%temp0))
     885        __(lea tsp_frame.fixed_overhead+fulltag_misc(%temp0),%arg_z)
     886        __(ret)
     887local_label(stack_misc_alloc_heap_alloc_ivector):
     888        __(movd %rcontext:tcr.foreign_sp,%stack_temp)
     889        __(subl $dnode_size,%rcontext:tcr.foreign_sp)
     890        __(movl %rcontext:tcr.foreign_sp,%imm0)
     891        __(movd %stack_temp,(%imm0))
     892        __(jmp _SPmisc_alloc)
     893local_label(stack_misc_alloc_node):
     894        __(movl %arg_y,%imm0)
     895        __(dnode_align(%imm0,tsp_frame.fixed_overhead+node_size,%imm0))
     896        __(cmpl $tstack_alloc_limit,%imm0)
     897        __(ja local_label(stack_misc_alloc_heap_alloc_gvector))
     898        __(TSP_Alloc_Var(%imm0,%temp1))
     899        __(movd %mm0,(%temp1))
     900        __(leal fulltag_misc(%temp1),%arg_z)
     901        __(ret)
     902local_label(stack_misc_alloc_heap_alloc_gvector):
     903        __(TSP_Alloc_Fixed(0,%imm0))
     904        __(jmp _SPmisc_alloc)
     905       
     906local_label(stack_misc_alloc_not_u24):
     907        __(uuo_error_reg_not_type(Rarg_y,error_object_not_unsigned_byte_24))
    810908_endsubp(stack_misc_alloc)
    811909
    812 /* subtype (boxed, of course) is pushed, followed by nargs bytes worth of   */
    813 /* initial-contents.  Note that this can be used to cons any type of initialized   */
    814 /* node-header'ed misc object (symbols, closures, ...) as well as vector-like  */
    815 /* objects.  */
     910/* subtype (boxed, of course) is pushed, followed by nargs bytes worth of */
     911/* initial-contents.  Note that this can be used to cons any type of */
     912/* initialized node-header'ed misc object (symbols, closures, ...) */
     913/* as well as vector-like objects. */
    816914_spentry(gvector)
    817         __(int $3)
     915        __(subl $node_size,%nargs)      /* off by one in x862-%gvector */
     916        __(movl (%esp,%nargs),%imm0)    /* boxed subtype */
     917        __(sarl $fixnumshift,%imm0)
     918        __(movl %nargs,%arg_z)
     919        __(shll $num_subtag_bits-word_shift,%arg_z)
     920        __(orl %arg_z,%imm0)
     921        __(movd %imm0,%mm0)
     922        __(dnode_align(%nargs,node_size,%imm0))
     923        __(push %ra0)   /* aka %temp0, can't be live while consing */
     924        __(Misc_Alloc(%arg_z))
     925        __(pop %ra0)
     926        __(movl %nargs,%imm0)
     927        __(jmp 2f)
     9281:      __(movl %arg_y,misc_data_offset(%arg_z,%imm0))
     9292:      __(subl $node_size,%imm0)
     930        __(pop %arg_y)  /* Note the intentional fencepost: */
     931                        /* discard the subtype as well. */
     932        __(jge 1b)
     933        __(jmp *%ra0)
    818934_endsubp(gvector)
    819935
     
    12181334_endsubp(stkgvector)
    12191335
     1336/* Allocate a fulltag-misc object. */
     1337/* arg_y = boxed element count, arg_z = subtag (boxed, of course) */
    12201338_spentry(misc_alloc)
    1221         __(int $3)
     1339        __(testl $~(((1<<24)-1)<<fixnumshift),%arg_y)
     1340        __(jne local_label(misc_alloc_not_u24))
     1341        __(unbox_fixnum(%arg_z,%imm0))
     1342        __(mov %arg_y,%temp0)
     1343        __(shl $num_subtag_bits-fixnumshift,%temp0)
     1344        __(or %temp0,%imm0)     /* %imm0 now = header */
     1345        __(movd %imm0,%mm0)     /* Misc_Alloc wants header in %mm0 */
     1346        __(andb $fulltagmask,%imm0_b)
     1347        __(cmpb $fulltag_nodeheader,%imm0_b)
     1348        __(je local_label(misc_alloc_32))
     1349        __(movd %mm0,%imm0)
     1350        __(cmpb $max_32_bit_ivector_subtag,%imm0_b)
     1351        __(jbe local_label(misc_alloc_32))
     1352        __(cmpb $max_8_bit_ivector_subtag,%imm0_b)
     1353        __(jbe local_label(misc_alloc_8))
     1354        __(cmpb $max_16_bit_ivector_subtag,%imm0_b)
     1355        __(jbe local_label(misc_alloc_16))
     1356        __(cmpb $subtag_double_float_vector,%imm0_b)
     1357        __(jne local_label(misc_alloc_1))
     1358        /* double-float vector case */
     1359        __(imul $2,%arg_y,%imm0)
     1360        __(jmp local_label(misc_alloc_alloc_vector))
     1361local_label(misc_alloc_1):
     1362        __(unbox_fixnum(%arg_y,%imm0))
     1363        __(addl $7,%imm0)
     1364        __(shrl $3,%imm0)
     1365        __(jmp local_label(misc_alloc_alloc_vector))
     1366local_label(misc_alloc_8):
     1367        __(unbox_fixnum(%arg_y,%imm0))
     1368        __(jmp local_label(misc_alloc_alloc_vector))
     1369local_label(misc_alloc_16):
     1370        __(unbox_fixnum(%arg_y,%imm0))
     1371        __(shl $1,%imm0)
     1372        __(jmp local_label(misc_alloc_alloc_vector))
     1373local_label(misc_alloc_32):
     1374        __(movl %arg_y,%imm0)
     1375local_label(misc_alloc_alloc_vector):
     1376        __(dnode_align(%imm0,node_size,%imm0))
     1377        __(Misc_Alloc(%arg_z))
     1378        __(ret)
     1379local_label(misc_alloc_not_u24):
     1380        __(uuo_error_reg_not_type(Rarg_y,error_object_not_unsigned_byte_24))
    12221381_endsubp(misc_alloc)
    12231382
     
    15191678        __(jo,pn C(fix_one_bit_overflow))
    15201679        __(repret)
    1521         __(jump_builtin(_builtin_minus,2))
     16801:      __(jump_builtin(_builtin_minus,2))
    15221681_endsubp(builtin_minus)
    15231682
Note: See TracChangeset for help on using the changeset viewer.