Changeset 10089


Ignore:
Timestamp:
Jul 18, 2008, 6:47:06 PM (11 years ago)
Author:
rme
Message:

Conditionalize for x8632.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/lisp-kernel/x86-macros.s

    r8607 r10089  
    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
    5252
    5353/* Zero $3 bytes worth of dnodes, starting at offset $2 relative  */
     
    5858        .macro zero_dnodes
    5959        .if $2
     60        ifdef([X8664],[
    6061        __(movapd %fpzero,$1($0))
     62        ],[
     63        __(movsd %fpzero,$1($0))
     64        ])
    6165        __(zero_dnodes $0,$1+dnode_size,$2-dnode_size)
    6266        .endif
     
    6569        .macro zero_dnodes base,disp,nbytes
    6670        .ifgt \nbytes
     71        ifdef([X8664],[
    6772        movapd %fpzero,\disp(\base)
     73        ],[
     74        movsd %fpzero,\disp(\base)
     75        ])
    6876        zero_dnodes \base,"\disp+dnode_size","\nbytes-dnode_size"
    6977        .endif
     
    7482/* Allocate $1+dnode_size zeroed bytes on the tstack, using $2 as a temp  */
    7583/* reg.  */
    76        
     84
     85ifdef([X8632],[
     86define([TSP_Alloc_Fixed],[
     87        define([TSP_Alloc_Size],[((($1+node_size) & ~(dnode_size-1))+dnode_size)])
     88        __(subl [$]TSP_Alloc_Size,rcontext(tcr.next_tsp))
     89        __(movd rcontext(tcr.save_tsp),%stack_temp)
     90        __(movl rcontext(tcr.next_tsp),$2)
     91        zero_dnodes $2,0,TSP_Alloc_Size
     92        __(movd %stack_temp,($2))
     93        __(movl %ebp,tsp_frame.save_ebp($2))
     94        __(movl $2,rcontext(tcr.save_tsp))
     95        undefine([TSP_Alloc_Size])
     96])],[
    7797define([TSP_Alloc_Fixed],[
    7898        define([TSP_Alloc_Size],[((($1+node_size) & ~(dnode_size-1))+dnode_size)])
     
    85105        __(movq $2,rcontext(tcr.save_tsp))
    86106        undefine([TSP_Alloc_Size])
    87 ])
     107])])
    88108
    89109/* $1 = size (dnode-aligned, including tsp overhead, $2 scratch.  */
    90110/* Modifies both $1 and $2; on exit, $2 = new_tsp+tsp_overhead, $1 = old tsp  */
    91        
     111
     112ifdef([X8632],[
     113define([TSP_Alloc_Var],[
     114        new_macro_labels()
     115        __(subl $1,rcontext(tcr.next_tsp))
     116        __(movd rcontext(tcr.save_tsp),%stack_temp)
     117        __(movl rcontext(tcr.next_tsp),$2)
     118        __(jmp macro_label(test))
     119macro_label(loop):
     120        __(movsd %fpzero,0($2))
     121        __(addl $dnode_size,$2)
     122macro_label(test):
     123        __(subl $dnode_size,$1)
     124        __(jge macro_label(loop))
     125        __(movl rcontext(tcr.next_tsp),$2)
     126        __(movd %stack_temp,$1)
     127        __(movl $1,($2))
     128        __(movl %ebp,tsp_frame.save_ebp($2))
     129        __(movl $2,rcontext(tcr.save_tsp))
     130        __(addl $dnode_size,$2)
     131])],[
    92132define([TSP_Alloc_Var],[
    93133        new_macro_labels()
     
    108148        __(movq $2,rcontext(tcr.save_tsp))
    109149        __(addq $dnode_size,$2)
    110 ])
    111        
    112        
    113 
     150])])
     151       
     152       
     153ifdef([X8632],[
     154define([Allocate_Catch_Frame],[
     155        TSP_Alloc_Fixed(catch_frame.size,$1)
     156        __(movl [$](catch_frame.element_count<<subtag_shift)|subtag_catch_frame,dnode_size($1))
     157        __(addl [$]dnode_size+fulltag_misc,$1)
     158])],[
    114159define([Allocate_Catch_Frame],[
    115160        TSP_Alloc_Fixed(catch_frame.size,$1)
    116161        __(movq [$](catch_frame.element_count<<subtag_shift)|subtag_catch_frame,dnode_size($1))
    117162        __(addq [$]dnode_size+fulltag_misc,$1)
    118 ])
     163])])
    119164
    120165/* %arg_z = tag,  %xfn = pc, $1 = mvflag          */
    121        
     166
     167ifdef([X8632],[
     168define([Make_Catch],[
     169        Allocate_Catch_Frame(%imm0)
     170        __(movd rcontext(tcr.catch_top),%mm0)
     171        __(movd rcontext(tcr.db_link),%mm1)
     172        __(movl %arg_z,catch_frame.catch_tag(%imm0))
     173        __(movd %mm0,catch_frame.link(%imm0))
     174        __(movl [$]$1,catch_frame.mvflag(%imm0))
     175        __(movd rcontext(tcr.xframe),%mm0)
     176        __(movl %esp,catch_frame.esp(%imm0))
     177        __(movl %ebp,catch_frame.ebp(%imm0))
     178        __(movd rcontext(tcr.foreign_sp),%stack_temp)
     179        __(movd %stack_temp,catch_frame.foreign_sp(%imm0))
     180        __(movd %mm1,catch_frame.db_link(%imm0))
     181        __(movd %mm0,catch_frame.xframe(%imm0))
     182        __(movl %xfn,catch_frame.pc(%imm0))
     183        __(movl %imm0,rcontext(tcr.catch_top))
     184])],[
    122185define([Make_Catch],[
    123186        Allocate_Catch_Frame(%imm2)
     
    142205        __(movq %xfn,catch_frame.pc(%imm2))
    143206        __(movq %imm2,rcontext(tcr.catch_top))
    144 ])     
    145 
     207])])   
     208
     209ifdef([X8632],[
     210define([nMake_Catch],[
     211        Allocate_Catch_Frame(%imm0)
     212        __(movd rcontext(tcr.catch_top),%mm0)
     213        __(movd rcontext(tcr.db_link),%mm1)
     214        __(movl %arg_z,catch_frame.catch_tag(%imm0))
     215        __(movd %mm0,catch_frame.link(%imm0))
     216        __(movl %esp,catch_frame.esp(%imm0))
     217        __(addl $node_size,catch_frame.esp(%imm0))
     218        __(movl [$]$1,catch_frame.mvflag(%imm0))
     219        __(movd rcontext(tcr.xframe),%mm0)
     220        __(movl %ebp,catch_frame.ebp(%imm0))
     221        __(movd rcontext(tcr.foreign_sp),%stack_temp)
     222        __(movd %mm1,catch_frame.db_link(%imm0))
     223        __(movd %mm0,catch_frame.xframe(%imm0))
     224        __(movd %stack_temp,catch_frame.foreign_sp(%imm0))
     225        __(movl %xfn,catch_frame.pc(%imm0))
     226        __(movl %imm0,rcontext(tcr.catch_top))
     227])],[   
    146228define([nMake_Catch],[
    147229        Allocate_Catch_Frame(%imm2)
     
    167249        __(movq %xfn,catch_frame.pc(%imm2))
    168250        __(movq %imm2,rcontext(tcr.catch_top))
    169 ])     
     251])])   
    170252               
    171253       
     
    182264
    183265/* $1=new_car,$2=new_cdr,$3=dest   */
     266
     267ifdef([X8632],[
     268define([Cons],[
     269        new_macro_labels()
     270/* The instructions where tcr.save_allocptr is tagged are difficult  */
     271/* to interrupt; the interrupting code has to recognize and possibly  */
     272/* emulate the instructions in between   */
     273        __(subl $cons.size-fulltag_cons,rcontext(tcr.save_allocptr))
     274        __(movl rcontext(tcr.save_allocptr),%allocptr)
     275        __(rcmpl(%allocptr,rcontext(tcr.save_allocbase)))
     276        __(jg macro_label(no_trap))
     277        uuo_alloc()
     278macro_label(no_trap):
     279        __(andb $~fulltagmask,rcontext(tcr.save_allocptr))
     280/* Easy to interrupt now that tcr.save_allocptr isn't tagged as a cons    */
     281        __(movl $2,cons.cdr(%allocptr))
     282        __(movl $1,cons.car(%allocptr))
     283        ifelse($3,[],[],[
     284         __(movl %allocptr,$3)
     285        ])
     286])],[
     287
    184288define([Cons],[
    185289        new_macro_labels()
     
    200304         __(movq %allocptr,$3)
    201305        ])
    202 ])
    203 
    204 /* The header has to be in %imm0, and the physical size in bytes has  */
    205 /*  to be in %imm1. We bash %imm1.   */
    206 
     306])])
     307
     308ifdef([X8632],[
     309/* Header in %mm0, size in bytes in %imm0.  We bash %imm0. */
     310define([Misc_Alloc],[
     311        __(sub [$]fulltag_misc,%imm0)
     312        Misc_Alloc_Internal($1)
     313])],[
     314/* Header in %imm0, size in bytes in %imm1.  We bash %imm1. */
    207315define([Misc_Alloc],[
    208316        __(subq [$]fulltag_misc,%imm1)
    209317        Misc_Alloc_Internal($1)
    210 ])
    211 
    212 define([Misc_Alloc_Internal],[                 
     318])])
     319
    213320/* Here Be Monsters: we have to treat some/all of this instruction   */
    214321/* sequence atomically, as soon as tcr.save_allocptr becomes tagged.  */
    215322               
     323ifdef([X8632],[
     324define([Misc_Alloc_Internal],[                 
     325        new_macro_labels()
     326        __(subl %imm0,rcontext(tcr.save_allocptr))
     327        __(movl rcontext(tcr.save_allocptr),%allocptr)
     328        __(cmpl rcontext(tcr.save_allocbase),%allocptr)
     329        __(jg macro_label(no_trap))
     330        uuo_alloc()
     331macro_label(no_trap):   
     332        __(movd %mm0,misc_header_offset(%allocptr))
     333        __(andb $~fulltagmask,rcontext(tcr.save_allocptr))
     334/* Now that tcr.save_allocptr is untagged, it's easier to be interrupted   */
     335        ifelse($1,[],[],[
     336         __(mov %allocptr,$1)
     337        ])
     338])],[   
     339define([Misc_Alloc_Internal],[                 
    216340        new_macro_labels()
    217341        __(subq %imm1,rcontext(tcr.save_allocptr))
     
    227351         __(mov %allocptr,$1)
    228352        ])
    229 ])
    230        
     353])])
     354
     355ifdef([X8632],[
     356define([Misc_Alloc_Fixed],[
     357        __(mov [$]$2-fulltag_misc,%imm0)
     358        Misc_Alloc_Internal($1)
     359])],[
    231360define([Misc_Alloc_Fixed],[
    232361        __(movq [$]$2-fulltag_misc,%imm1)
    233362        Misc_Alloc_Internal($1)
    234 ])                                     
     363])])                                   
    235364
    236365define([vrefr],[
     
    239368
    240369define([jump_fn],[
    241         __(jmpq *%fn)
     370        __(jmp *%fn)
    242371])
    243372                       
     
    246375        jump_fn()
    247376])     
    248        
     377
     378ifdef([X8632],[
     379define([set_nargs],[
     380        __(xorl %nargs,%nargs)
     381        __(addl [$]$1<<fixnumshift,%nargs)
     382])],[
    249383define([set_nargs],[
    250384        ifelse(eval($1>15),1,[
     
    255389        __(addl [$]$1<<fixnumshift,%nargs)
    256390        ])])])
    257        
    258 
     391])
    259392
    260393/* $1 = ndigits.  Assumes 4-byte digits           */
     
    263396
    264397define([_car],[
    265         __(movq cons.car($1),$2)
     398        __(mov cons.car($1),$2)
    266399])     
    267400
    268401define([_rplaca],[
    269         __(movq $2,cons.car($1))
     402        __(mov $2,cons.car($1))
    270403])     
    271404               
    272405define([_cdr],[
    273         __(movq cons.cdr($1),$2)
     406        __(mov cons.cdr($1),$2)
    274407])
    275408
    276409define([_rplacd],[
    277         __(movq $2,cons.cdr($1))
     410        __(mov $2,cons.cdr($1))
    278411])     
    279412               
    280413       
    281414       
     415ifdef([X8632],[
     416define([tra],[
     417        .p2align 3
     418        .long 0
     419        .byte 0
     420$1:     
     421])],[
    282422define([tra],[
    283423        .p2align 3
     
    288428        ])
    289429$1:     
    290 ])
    291                                
     430])])
     431
     432ifdef([X8632],[
     433define([do_funcall],[
     434        new_macro_labels()
     435        extract_fulltag(%temp0,%imm0)
     436        __(cmpb $fulltag_misc,%imm0_b)
     437        __(jne macro_label(bad))
     438        __(cmpb $subtag_function,misc_subtag_offset(%temp0))
     439        __(jne macro_label(maybe_symbol))
     440        __(mov %temp0,%fn)
     441        __(jmp *%fn)
     442macro_label(maybe_symbol):
     443        __(cmpb $subtag_symbol,misc_subtag_offset(%temp0))
     444        __(jne macro_label(bad))
     445        /* %fname == %temp0 */
     446        __(mov symbol.fcell(%fname),%fn)
     447        __(jmp *%fn)
     448macro_label(bad):
     449        __(uuo_error_not_callable)
     450])],[
    292451define([do_funcall],[
    293452        new_macro_labels()
     
    302461macro_label(bad):               
    303462        __(uuo_error_not_callable)
    304 ])
     463])])
    305464
    306465define([getvheader],[
    307         __(movq misc_header_offset($1),$2)
     466        __(mov misc_header_offset($1),$2)
    308467])
    309468
     
    311470/*    both be immediate registers   */
    312471define([header_size],[
    313         __(movq $1,$2)
     472        __(mov $1,$2)
    314473        __(shr $num_subtag_bits,$2)
    315474])
     
    317476/* $2 (length) is fixnum element-count.   */
    318477define([header_length],[
    319         __(movq $~255,$2)
    320         __(andq $1,$2)
     478        __(mov $~255,$2)
     479        __(and $1,$2)
    321480        __(shr $num_subtag_bits-fixnumshift,$2)
    322481])
     
    324483/* $1 = vector, $2 = header, $3 = dest   */
    325484define([vector_size],[                                 
    326         getvheader($1,$2)
    327         header_size($2,$3)
     485        __(getvheader($1,$2))
     486        __(header_size($2,$3))
    328487])
    329488
    330489/* $1 = vector, $2 = dest   */
    331490define([vector_length],[                                 
    332         __(movq $~255,$2)
    333         __(andq misc_header_offset($1),$2)
     491        __(mov $~255,$2)
     492        __(and misc_header_offset($1),$2)
    334493        __(shr $num_subtag_bits-fixnumshift,$2)
    335494])
     
    359518])
    360519
     520ifdef([X8632],[
     521define([compare_reg_to_nil],[
     522        __(cmp $nil_value,$1)
     523])],[
    361524define([compare_reg_to_nil],[
    362525        __(cmpb $fulltag_nil,$1_b)
    363 ])             
    364        
     526])])
     527
     528ifdef([X8632],[
     529define([extract_lisptag],[
     530        __(movl $1,$2)
     531        __(and [$]tagmask,$2)
     532])],[
    365533define([extract_lisptag],[
    366534        __(movzbl $1_b,$2_l)
    367535        __(andb [$]tagmask,$2_b)
    368 ])
     536])])
    369537
    370538                                                               
     
    378546])
    379547
     548ifdef([X8632],[
     549define([extract_typecode],[
     550        new_macro_labels()
     551        __(mov $1,$2)
     552        __(andl $tagmask,$2)
     553        __(cmpb $tag_misc,$2_b)
     554        __(jne macro_label(done))
     555        __(movb misc_subtag_offset($1),$2_b)
     556macro_label(done):
     557])],[
    380558define([extract_typecode],[
    381559        new_macro_labels()
     
    385563        __(jne macro_label(done))
    386564        __(movb misc_subtag_offset($1),$2_b)
    387 macro_label(done):     
    388 ])
     565macro_label(done):
     566])])
    389567
    390568/* dnode_align(src,delta,dest)  */
    391569
    392         define([dnode_align],[
     570define([dnode_align],[
    393571        __(lea ($2+(dnode_size-1))($1),$3)
    394572        __(andb $~(dnode_size-1),$3_b)
    395573])
    396        
     574
     575ifdef([X8632],[
     576define([push_argregs],[
     577        new_macro_labels()
     578        /* xxx hack alert: when the compiler calls a keyword subprim */
     579        /* (SPsimple_keywords, SPkeyword_args, SP_keyword_bind) */
     580        /* it puts some flags in the upper half of %temp1, which
     581        /* is %nargs.  We use the cmpw here to avoid seeing those flags. */
     582        __(cmpw [$]1*node_size,%nargs_w)
     583        __(jb macro_label(done))
     584        __(je macro_label(z))
     585        __(push %arg_y)
     586macro_label(z):
     587        __(push %arg_z)
     588macro_label(done):
     589])],[
    397590define([push_argregs],[
    398591        new_macro_labels()
     
    408601        __(push %arg_z)
    409602macro_label(done):
    410 ])     
     603])])   
    411604
    412605
     
    415608
    416609define([discard_temp_frame],[
    417         __(movq rcontext(tcr.save_tsp),$1)
    418         __(movq ($1),$1)
    419         __(movq $1,rcontext(tcr.save_tsp))
    420         __(movq $1,rcontext(tcr.next_tsp))
    421 
    422 ])     
    423 
     610        __(mov rcontext(tcr.save_tsp),$1)
     611        __(mov ($1),$1)
     612        __(mov $1,rcontext(tcr.save_tsp))
     613        __(mov $1,rcontext(tcr.next_tsp))
     614])
     615
     616ifdef([X8632],[
     617define([check_pending_enabled_interrupt],[
     618        __(btrl [$]31,rcontext(tcr.interrupt_pending))
     619        __(jnc $1)
     620        interrupt_now()
     621])],[
    424622define([check_pending_enabled_interrupt],[
    425623        __(btrq [$]63,rcontext(tcr.interrupt_pending))
    426624        __(jnc,pt $1)
    427625        interrupt_now()
    428 ])
     626])])
    429627       
    430628/* $1 = scratch register, used to access tcr.tlb_pointer.  An interrupt  */
     
    435633define([check_pending_interrupt],[
    436634        new_macro_labels()
    437         __(movq rcontext(tcr.tlb_pointer),$1)
    438         __(cmpq [$]0,INTERRUPT_LEVEL_BINDING_INDEX($1))
    439         __(js,pt macro_label(done))
     635        __(mov rcontext(tcr.tlb_pointer),$1)
     636        __(cmp [$]0,INTERRUPT_LEVEL_BINDING_INDEX($1))
     637        __(js macro_label(done))
    440638        check_pending_enabled_interrupt(macro_label(done))
    441639macro_label(done):
     
    480678        __(ret)
    481679])
    482                                
    483        
     680
     681ifdef([X8632],[
     682define([regnum],[ifelse($1, [%eax], [0],
     683       $1, [%ecx], [1],
     684       $1, [%edx], [2],
     685       $1, [%ebx], [3],
     686       $1, [%esp], [4],
     687       $1, [%ebp], [5],
     688       $1, [%esi], [6],
     689       $1, [%edi], [7],
     690        "unknown register")dnl
     691])
     692
     693define([mark_as_node], [
     694        __(xorl $1,$1)
     695        __(orb [$](1<<regnum($1)), rcontext(tcr.node_regs_mask))
     696])
     697
     698define([mark_as_imm],[
     699        __(andb [$]~(1<<regnum($1)), rcontext(tcr.node_regs_mask))
     700])
     701])
     702
Note: See TracChangeset for help on using the changeset viewer.