Changeset 8069


Ignore:
Timestamp:
Jan 15, 2008, 2:49:45 AM (12 years ago)
Author:
rme
Message:

Add x8632 macros.

File:
1 edited

Legend:

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

    r6529 r8069  
    4141
    4242define([box_fixnum],[
    43         imulq [$]fixnumone,$1,$2
     43        imul [$]fixnumone,$1,$2
    4444])     
    4545
     
    4747/* box_fixnum, with no effect on flags */
    4848define([box_fixnum_no_flags],[
    49         leaq (,$1,8),$2
    50 ])
    51                                
     49        lea (,$1,fixnumone),$2
     50])
     51
     52ifdef([X8632],[
     53define([save_node_regs],[
     54        push %arg_z
     55        push %arg_y
     56        push %temp0
     57        push %temp1
     58        push %fn
     59])],[
    5260define([save_node_regs],[
    5361        push %arg_z
     
    6371        push %ra0
    6472        push %fn
    65 ])
     73])])
    6674
    6775/* This needs to be done before we transition back to the lisp stack  */
    6876/* from the foreign stack.   */
    69                
     77
     78ifdef([X8632],[
     79define([zero_node_regs],[
     80        xor %fn,%fn
     81        mov %fn,%temp1
     82        mov %fn,%temp0
     83        mov %fn,%arg_y
     84        mov %fn,%arg_z
     85])],[
    7086define([zero_node_regs],[
    7187        xor %fn,%fn
     
    8197        mov %fn,%arg_y
    8298        mov %fn,arg_z
    83 ])     
     99])])
     100
     101ifdef([X8632],[
     102define([restore_node_regs],[
     103        pop %fn
     104        pop %temp1
     105        pop %temp0
     106        pop %arg_y
     107        pop %arg_z
     108])],[
    84109define([restore_node_regs],[
    85110        pop %fn
     
    95120        pop %arg_y
    96121        pop %arg_z
    97 ])     
     122])])
    98123
    99124/* Zero $3 bytes worth of dnodes, starting at offset $2 relative  */
     
    104129        .macro zero_dnodes
    105130        .if $2
     131        ifdef([X8632],[
     132        movsd %fpzero,$1($0)
     133        ],[
    106134        movapd %fpzero,$1($0)
     135        ])
    107136        zero_dnodes $0,$1+dnode_size,$2-dnode_size
    108137        .endif
     
    111140        .macro zero_dnodes base,disp,nbytes
    112141        .ifgt \nbytes
     142        ifdef([X8632],[
     143        movsd %fpzero,\disp(\base)
     144        ],[
    113145        movapd %fpzero,\disp(\base)
     146        ])
    114147        zero_dnodes \base,"\disp+dnode_size","\nbytes-dnode_size"
    115148        .endif
     
    120153/* Allocate $1+dnode_size zeroed bytes on the tstack, using $2 as a temp  */
    121154/* reg.  */
    122        
     155
     156ifdef([X8632],[
     157define([TSP_Alloc_Fixed],[
     158        define([TSP_Alloc_Size],[((($1+node_size) & ~(dnode_size-1))+dnode_size)])
     159        subl [$]TSP_Alloc_Size,%rcontext:tcr.next_tsp
     160        movd %rcontext:tcr.save_tsp,%stack_temp
     161        movl %rcontext:tcr.next_tsp,$2
     162        zero_dnodes $2,0,TSP_Alloc_Size
     163        movd %stack_temp,($2)
     164        movl $2,%rcontext:tcr.save_tsp
     165        undefine([TSP_Alloc_Size])
     166])],[
    123167define([TSP_Alloc_Fixed],[
    124168        define([TSP_Alloc_Size],[((($1+node_size) & ~(dnode_size-1))+dnode_size)])
     
    130174        movq $2,%rcontext:tcr.save_tsp
    131175        undefine([TSP_Alloc_Size])
    132 ])
     176])])
    133177
    134178/* $1 = size (dnode-aligned, including tsp overhead, $2 scratch.  */
    135179/* Modifies both $1 and $2; on exit, $2 = new_tsp+tsp_overhead, $1 = old tsp  */
    136        
     180
     181ifdef([X8632],[
     182define([TSP_Alloc_Var],[
     183        new_macro_labels()
     184        subl $1,%rcontext:tcr.next_tsp
     185        movd %rcontext:tcr.save_tsp,%stack_temp
     186        movl %rcontext:tcr.next_tsp,$2
     187        jmp macro_label(test)
     188macro_label(loop):
     189        movapd %fpzero,0($2)
     190        addl $dnode_size,$2
     191macro_label(test):     
     192        subl $dnode_size,$1
     193        jge macro_label(loop)
     194        movl %rcontext:tcr.next_tsp,$2
     195        movd %stack_temp,$1
     196        movl $1,($2)
     197        movl $2,%rcontext:tcr.save_tsp
     198        addl $dnode_size,$2
     199])],[
    137200define([TSP_Alloc_Var],[
    138201        new_macro_labels()
     
    152215        movq $2,%rcontext:tcr.save_tsp
    153216        addq $dnode_size,$2
    154 ])
    155        
    156        
    157 
     217])])
     218       
     219       
     220ifdef([X8632],[
     221define([Allocate_Catch_Frame],[
     222        TSP_Alloc_Fixed(catch_frame.size,$1)
     223        movl [$](catch_frame.element_count<<subtag_shift)|subtag_catch_frame,dnode_size($1)
     224        addl [$]dnode_size+fulltag_misc,$1
     225])],[
    158226define([Allocate_Catch_Frame],[
    159227        TSP_Alloc_Fixed(catch_frame.size,$1)
    160228        movq [$](catch_frame.element_count<<subtag_shift)|subtag_catch_frame,dnode_size($1)
    161229        addq [$]dnode_size+fulltag_misc,$1
    162 ])
     230])])
    163231
    164232/* %arg_z = tag,  %xfn = pc, $1 = mvflag          */
    165        
     233
     234ifdef([X8632],[
     235define([Make_Catch],[
     236        Allocate_Catch_Frame(%imm0)
     237        movd %rcontext:tcr.catch_top,%mm0
     238        movd %rcontext:tcr.db_link,%mm1
     239        movq %arg_z,catch_frame.catch_tag(%imm0)
     240        movd %mm0,catch_frame.link(%imm0)
     241        movq [$]$1,catch_frame.mvflag(%imm0)
     242        movd %rcontext:tcr.xframe,%mm0
     243        movq %esp,catch_frame.esp(%imm0)
     244        movq %ebp,catch_frame.ebp(%imm0)
     245        movd %rcontext:tcr.foreign_sp,%stack_temp
     246        movd %mm1,catch_frame.db_link(%imm0)
     247        movd %imm0,catch_frame.xframe(%imm0)
     248        movd %stack_temp,catch_frame.foreign_sp(%imm0)
     249        movl %xfn,catch_frame.pc(%imm0)
     250        movd %imm0,%rcontext:tcr.catch_top
     251])],[
    166252define([Make_Catch],[
    167253        Allocate_Catch_Frame(%imm2)
     
    184270        movq %xfn,catch_frame.pc(%imm2)
    185271        movq %imm2,%rcontext:tcr.catch_top
    186 ])     
    187 
     272])])   
     273
     274ifdef([X8632],[
     275define([nMake_Catch],[
     276        Allocate_Catch_Frame(%imm0)
     277        movd %rcontext:tcr.catch_top,%mm0
     278        movd %rcontext:tcr.db_link,%mm1
     279        movl %arg_z,catch_frame.catch_tag(%imm0)
     280        movd %mm0,catch_frame.link(%imm0)
     281        movl %esp,catch_frame.esp(%imm0)
     282        addl $node_size,catch_frame.esp(%imm0)
     283        movl [$]$1,catch_frame.mvflag(%imm0)
     284        movd %rcontext:tcr.xframe,%mm0
     285        movl %ebp,catch_frame.ebp(%imm0)
     286        movd %rcontext:tcr.foreign_sp,%stack_temp
     287        movd %mm1,catch_frame.db_link(%imm0)
     288        movd %mm0,catch_frame.xframe(%imm0)
     289        movd %stack_temp,catch_frame.foreign_sp(%imm0)
     290        movl %xfn,catch_frame.pc(%imm0)
     291        movl %imm0,%rcontext:tcr.catch_top
     292])],[   
    188293define([nMake_Catch],[
    189294        Allocate_Catch_Frame(%imm2)
     
    207312        movq %xfn,catch_frame.pc(%imm2)
    208313        movq %imm2,%rcontext:tcr.catch_top
    209 ])     
     314])])   
    210315               
    211316       
     
    242347])
    243348
    244 /* The header has to be in %imm0, and the physical size in bytes has  */
    245 /*  to be in %imm1. We bash %imm1.   */
    246 
     349ifdef([X8632],[
     350/* Header in %mm0, size in bytes in %imm0.  We bash %imm0. */
     351define([Misc_Alloc],[
     352        sub [$]fulltag_misc,%imm0
     353        Misc_Alloc_Internal($1)
     354])],[
     355/* Header in %imm0, size in bytes in %imm1.  We bash %imm1. */
    247356define([Misc_Alloc],[
    248357        subq [$]fulltag_misc,%imm1
    249358        Misc_Alloc_Internal($1)
    250 ])
    251 
    252 define([Misc_Alloc_Internal],[                 
     359])])
     360
     361
    253362/* Here Be Monsters: we have to treat some/all of this instruction   */
    254363/* sequence atomically, as soon as tcr.save_allocptr becomes tagged.  */
    255364               
     365ifdef([X8632],[
     366define([Misc_Alloc_Internal],[                 
     367        new_macro_labels()
     368        subl %imm0,%rcontext:tcr.save_allocptr      /* decrement allocptr */
     369        movl %rcontext:tcr.save_allocptr,%allocptr  /* load into temp0 */
     370        cmpl %rcontext:tcr.save_allocbase,%allocptr /* above allocbase? */
     371        jg macro_label(no_trap)                     /* yes, skip trap */
     372        uuo_alloc()                                 /* uh, don't skip trap */
     373macro_label(no_trap):   
     374        movd %mm0,misc_header_offset(%allocptr)         /* write header */
     375        andb $~fulltagmask,%rcontext:tcr.save_allocptr  /* untag allocptr */
     376/* Now that tcr.save_allocptr is untagged, it's easier to be interrupted   */
     377        ifelse($1,[],[],[
     378         mov %allocptr,$1
     379        ])
     380])],[   
     381define([Misc_Alloc_Internal],[                 
    256382        new_macro_labels()
    257383        subq %imm1,%rcontext:tcr.save_allocptr
     
    267393         mov %allocptr,$1
    268394        ])
    269 ])
    270        
     395])])
     396
     397ifdef([X8632],[
    271398define([Misc_Alloc_Fixed],[
    272         movq [$]$2-fulltag_misc,%imm1
     399        mov [$]$2-fulltag_misc,%imm0
    273400        Misc_Alloc_Internal($1)
    274 ])                                     
     401])],[
     402define([Misc_Alloc_Fixed],[
     403        mov [$]$2-fulltag_misc,%imm1
     404        Misc_Alloc_Internal($1)
     405])])                                   
    275406
    276407define([vrefr],[
     
    279410
    280411define([jump_fn],[
    281         jmpq *%fn
     412        jmp *%fn
    282413])
    283414                       
     
    296427
    297428define([_car],[
    298         movq cons.car($1),$2
     429        mov cons.car($1),$2
    299430])     
    300431
    301432define([_rplaca],[
    302         movq $2,cons.car($1)
     433        mov $2,cons.car($1)
    303434])     
    304435               
    305436define([_cdr],[
    306         movq cons.cdr($1),$2
     437        mov cons.cdr($1),$2
    307438])
    308439
    309440define([_rplacd],[
    310         movq $2,cons.cdr($1)
     441        mov $2,cons.cdr($1)
    311442])     
    312443               
    313444       
    314        
     445ifdef([X8632],[
     446define([tra],[
     447        .p2align 3
     448        .long 0
     449        .byte 0
     450$1:     
     451])],[
    315452define([tra],[
    316453        .p2align 3
     
    321458        ])
    322459$1:     
    323 ])
    324                                
     460])])
     461
     462ifdef([X8632],[
     463define([do_funcall],[
     464        new_macro_labels()
     465        movl %imm0,%temp1 /* preserve nargs */
     466        extract_fulltag(%temp0,%imm0)
     467        cmpb $fulltag_misc,%imm0_b
     468        movl %temp1,%imm0
     469        jne macro_label(bad)
     470        cmpb $subtag_function,misc_subtag_offset(%temp0)
     471        jne macro_label(maybe_symbol)
     472        mov %temp0,%fn
     473        jmp *%fn
     474macro_label(maybe_symbol):
     475        cmpb $subtag_symbol,misc_subtag_offset(%temp0)
     476        jne macro_label(bad)
     477        /* %fname == %temp0 */
     478        mov symbol.fcell(%fname),%fn
     479        jmp *%fn
     480macro_label(bad):
     481        __(uuo_error_not_callable)
     482])],[
    325483define([do_funcall],[
    326484        new_macro_labels()
     
    335493macro_label(bad):               
    336494        __(uuo_error_not_callable)
    337 ])
     495])])
    338496
    339497define([getvheader],[
    340         movq misc_header_offset($1),$2
     498        mov misc_header_offset($1),$2
    341499])
    342500
     
    344502/*    both be immediate registers   */
    345503define([header_size],[
    346         movq $1,$2
     504        mov $1,$2
    347505        shr $num_subtag_bits,$2
    348506])
     
    350508/* $2 (length) is fixnum element-count.   */
    351509define([header_length],[
    352         movq $~255,$2
    353         andq $1,$2
     510        mov $~255,$2
     511        and $1,$2
    354512        shr $num_subtag_bits-fixnumshift,$2
    355513])
     
    363521/* $1 = vector, $2 = dest   */
    364522define([vector_length],[                                 
    365         movq $~255,$2
    366         andq misc_header_offset($1),$2
     523        mov $~255,$2
     524        and misc_header_offset($1),$2
    367525        shr $num_subtag_bits-fixnumshift,$2
    368526])
     
    392550])
    393551
     552ifdef([X8632],[
     553define([compare_reg_to_nil],[
     554        cmp $nil_value,$1
     555])],[
    394556define([compare_reg_to_nil],[
    395557        cmpb $fulltag_nil,$1_b
    396 ])             
     558])])
    397559       
    398560define([extract_lisptag],[
     
    413575define([extract_typecode],[
    414576        new_macro_labels()
    415         movzbl $1_b,$2_l
     577        mov $1,$2
    416578        andb $tagmask,$2_b
    417579        cmpb $tag_misc,$2_b
     
    423585/* dnode_align(src,delta,dest)  */
    424586
    425         define([dnode_align],[
     587define([dnode_align],[
    426588        lea ($2+(dnode_size-1))($1),$3
    427589        andb $~(dnode_size-1),$3_b
    428590])
    429        
     591
     592ifdef([X8632],[
     593define([push_argregs],[
     594        new_macro_labels()
     595        cmpw [$]1*node_size,%nargs
     596        jb macro_label(done)
     597        je macro_label(z)
     598        push %arg_y
     599macro_label(z):
     600        push %arg_z
     601macro_label(done):
     602])],[
    430603define([push_argregs],[
    431604        new_macro_labels()
     
    441614        push %arg_z
    442615macro_label(done):
    443 ])     
     616])])   
    444617
    445618
     
    448621
    449622define([discard_temp_frame],[
    450         movq %rcontext:tcr.save_tsp,$1
    451         movq ($1),$1
    452         movq $1,%rcontext:tcr.save_tsp
    453         movq $1,%rcontext:tcr.next_tsp
    454 
    455 ])     
    456 
     623        mov %rcontext:tcr.save_tsp,$1
     624        mov ($1),$1
     625        mov $1,%rcontext:tcr.save_tsp
     626        mov $1,%rcontext:tcr.next_tsp
     627
     628])     
     629
     630ifdef([X8632],[
     631define([check_pending_enabled_interrupt],[
     632        btrl [$]31,%rcontext:tcr.interrupt_pending
     633        jnc,pt $1
     634        interrupt_now()
     635])],[
    457636define([check_pending_enabled_interrupt],[
    458637        btrq [$]63,%rcontext:tcr.interrupt_pending
    459638        jnc,pt $1
    460639        interrupt_now()
    461 ])
     640])])
    462641       
    463642/* $1 = scratch register, used to access tcr.tlb_pointer.  An interrupt  */
     
    468647define([check_pending_interrupt],[
    469648        new_macro_labels()
    470         movq %rcontext:tcr.tlb_pointer,$1
    471         cmpq [$]0,INTERRUPT_LEVEL_BINDING_INDEX($1)
     649        mov %rcontext:tcr.tlb_pointer,$1
     650        cmp [$]0,INTERRUPT_LEVEL_BINDING_INDEX($1)
    472651        js,pt macro_label(done)
    473652        check_pending_enabled_interrupt(macro_label(done))
     
    513692         ret
    514693])
    515                                
    516        
     694
     695ifdef([X8632],[
     696define([regnum],[ifelse($1, [eax], [0],
     697       $1, [ecx], [1],
     698       $1, [edx], [2],
     699       $1, [ebx], [3],
     700       $1, [esp], [4],
     701       $1, [ebp], [5],
     702       $1, [esi], [6],
     703       $1, [edi], [7])dnl
     704])
     705
     706define([mark_as_node], [
     707        xorl %$1, %$1
     708        orb [$](1<<regnum($1)), %rcontext:tcr.node_regs_mask
     709])
     710
     711define([mark_as_imm],[
     712        andb [$]~(1<<regnum($1)), %rcontext:tcr.node_regs_mask
     713])
     714
     715])
     716
Note: See TracChangeset for help on using the changeset viewer.