Changeset 8242


Ignore:
Timestamp:
Jan 23, 2008, 6:10:26 AM (12 years ago)
Author:
gb
Message:

set_nargs tries to avoid partial-register operations.

File:
1 edited

Legend:

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

    r8130 r8242  
    2020                                       
    2121define([ref_global],[
    22         mov lisp_global($1),$2
     22        __(mov lisp_global($1),$2)
    2323])
    2424
    2525define([set_global],[
    26         mov $1,lisp_global($2)
     26        __(mov $1,lisp_global($2))
    2727])
    2828
    2929define([ref_nrs_value],[
    30         mov nrs.$1+symbol.vcell,$2
     30        __(mov nrs.$1+symbol.vcell,$2)
    3131])
    3232       
    3333define([set_nrs_value],[
    34         mov $1,nrs.$2+symbol.vcell
     34        __(mov $1,nrs.$2+symbol.vcell)
    3535])
    3636                                                       
    3737define([unbox_fixnum],[
    38         mov $1,$2
    39         sar [$]fixnumshift,$2
     38        __(mov $1,$2)
     39        __(sar [$]fixnumshift,$2)
    4040])
    4141
    4242define([box_fixnum],[
    43         imulq [$]fixnumone,$1,$2
     43        __(imulq [$]fixnumone,$1,$2)
    4444])     
    4545
     
    4747/* box_fixnum, with no effect on flags */
    4848define([box_fixnum_no_flags],[
    49         leaq (,$1,8),$2
     49        __(leaq (,$1,8),$2)
    5050])
    5151                               
    52 define([save_node_regs],[
    53         push %arg_z
    54         push %arg_y
    55         push %arg_x
    56         push %temp0
    57         push %temp1
    58         push %temp2
    59         push %save0
    60         push %save1
    61         push %save2
    62         push %save3
    63         push %ra0
    64         push %fn
    65 ])
    66 
    67 /* This needs to be done before we transition back to the lisp stack  */
    68 /* from the foreign stack.   */
    69                
    70 define([zero_node_regs],[
    71         xor %fn,%fn
    72         mov %fn,%ra0
    73         mov %fn,%save3
    74         mov %fn,%save2
    75         mov %fn,%save1
    76         mov %fn,%save0
    77         mov %fn,%temp2
    78         mov %fn,%temp1
    79         mov %fn,%temp0
    80         mov %fn,%arg_x
    81         mov %fn,%arg_y
    82         mov %fn,arg_z
    83 ])     
    84 define([restore_node_regs],[
    85         pop %fn
    86         pop %ra0
    87         pop %save3
    88         pop %save2
    89         pop %save1
    90         pop %save0
    91         pop %temp2
    92         pop %temp1
    93         pop %temp0
    94         pop %arg_x
    95         pop %arg_y
    96         pop %arg_z
    97 ])     
    9852
    9953/* Zero $3 bytes worth of dnodes, starting at offset $2 relative  */
     
    10458        .macro zero_dnodes
    10559        .if $2
    106         movapd %fpzero,$1($0)
    107         zero_dnodes $0,$1+dnode_size,$2-dnode_size
     60        __(movapd %fpzero,$1($0))
     61        __(zero_dnodes $0,$1+dnode_size,$2-dnode_size)
    10862        .endif
    10963        .endmacro
     
    11165        .macro zero_dnodes base,disp,nbytes
    11266        .ifgt \nbytes
    113         movapd %fpzero,\disp(\base)
     67        __(movapd %fpzero,\disp(\base))
    11468        zero_dnodes \base,"\disp+dnode_size","\nbytes-dnode_size"
    11569        .endif
     
    12377define([TSP_Alloc_Fixed],[
    12478        define([TSP_Alloc_Size],[((($1+node_size) & ~(dnode_size-1))+dnode_size)])
    125         subq [$]TSP_Alloc_Size,%rcontext:tcr.next_tsp
    126         movq %rcontext:tcr.save_tsp,%stack_temp
    127         movq %rcontext:tcr.next_tsp,$2
     79        __(subq [$]TSP_Alloc_Size,%rcontext:tcr.next_tsp)
     80        __(movq %rcontext:tcr.save_tsp,%stack_temp)
     81        __(movq %rcontext:tcr.next_tsp,$2)
    12882        zero_dnodes $2,0,TSP_Alloc_Size
    129         movq %stack_temp,($2)
    130         movq %rbp,tsp_frame.save_rbp($2)
    131         movq $2,%rcontext:tcr.save_tsp
     83        __(movq %stack_temp,($2))
     84        __(movq %rbp,tsp_frame.save_rbp($2))
     85        __(movq $2,%rcontext:tcr.save_tsp)
    13286        undefine([TSP_Alloc_Size])
    13387])
     
    13993        new_macro_labels()
    14094        subq $1,%rcontext:tcr.next_tsp
    141         movq %rcontext:tcr.save_tsp,%stack_temp
    142         movq %rcontext:tcr.next_tsp,$2
    143         jmp macro_label(test)
     95        __(movq %rcontext:tcr.save_tsp,%stack_temp)
     96        __(movq %rcontext:tcr.next_tsp,$2)
     97        __(jmp macro_label(test))
    14498macro_label(loop):
    145         movapd %fpzero,0($2)
    146         addq $dnode_size,$2
     99        __(movapd %fpzero,0($2))
     100        __(addq $dnode_size,$2)
    147101macro_label(test):     
    148         subq $dnode_size,$1
    149         jge macro_label(loop)
    150         movq %rcontext:tcr.next_tsp,$2
    151         movd %stack_temp,$1
    152         movq $1,($2)
    153         movq %rbp,tsp_frame.save_rbp($2)
    154         movq $2,%rcontext:tcr.save_tsp
    155         addq $dnode_size,$2
     102        __(subq $dnode_size,$1)
     103        __(jge macro_label(loop))
     104        __(movq %rcontext:tcr.next_tsp,$2)
     105        __(movd %stack_temp,$1)
     106        __(movq $1,($2))
     107        __(movq %rbp,tsp_frame.save_rbp($2))
     108        __(movq $2,%rcontext:tcr.save_tsp)
     109        __(addq $dnode_size,$2)
    156110])
    157111       
     
    160114define([Allocate_Catch_Frame],[
    161115        TSP_Alloc_Fixed(catch_frame.size,$1)
    162         movq [$](catch_frame.element_count<<subtag_shift)|subtag_catch_frame,dnode_size($1)
    163         addq [$]dnode_size+fulltag_misc,$1
     116        __(movq [$](catch_frame.element_count<<subtag_shift)|subtag_catch_frame,dnode_size($1))
     117        __(addq [$]dnode_size+fulltag_misc,$1)
    164118])
    165119
     
    168122define([Make_Catch],[
    169123        Allocate_Catch_Frame(%imm2)
    170         movq %rcontext:tcr.catch_top,%imm0
    171         movq %rcontext:tcr.db_link,%imm1
    172         movq %arg_z,catch_frame.catch_tag(%imm2)
    173         movq %imm0,catch_frame.link(%imm2)
    174         movq [$]$1,catch_frame.mvflag(%imm2)
    175         movq %rcontext:tcr.xframe,%imm0
    176         movq %rsp,catch_frame.rsp(%imm2)
    177         movq %rbp,catch_frame.rbp(%imm2)
    178         movq %rcontext:tcr.foreign_sp,%stack_temp
    179         movq %imm1,catch_frame.db_link(%imm2)
    180         movq %save3,catch_frame._save3(%imm2)
    181         movq %save2,catch_frame._save2(%imm2)
    182         movq %save1,catch_frame._save1(%imm2)
    183         movq %save0,catch_frame._save0(%imm2)
    184         movq %imm0,catch_frame.xframe(%imm2)
    185         movq %stack_temp,catch_frame.foreign_sp(%imm2)
    186         movq %xfn,catch_frame.pc(%imm2)
    187         movq %imm2,%rcontext:tcr.catch_top
     124        __(movq %rcontext:tcr.catch_top,%imm0)
     125        __(movq %rcontext:tcr.db_link,%imm1)
     126        __(movq %arg_z,catch_frame.catch_tag(%imm2))
     127        __(movq %imm0,catch_frame.link(%imm2))
     128        __(movq [$]$1,catch_frame.mvflag(%imm2))
     129        __(movq %rcontext:tcr.xframe,%imm0)
     130        __(movq %rsp,catch_frame.rsp(%imm2))
     131        __(movq %rbp,catch_frame.rbp(%imm2))
     132        __(movq %rcontext:tcr.foreign_sp,%stack_temp)
     133        __(movq %imm1,catch_frame.db_link(%imm2))
     134        __(movq %save3,catch_frame._save3(%imm2))
     135        __(movq %save2,catch_frame._save2(%imm2))
     136        __(movq %save1,catch_frame._save1(%imm2))
     137        __(movq %save0,catch_frame._save0(%imm2))
     138        __(movq %imm0,catch_frame.xframe(%imm2))
     139        __(movq %stack_temp,catch_frame.foreign_sp(%imm2))
     140        __(movq %xfn,catch_frame.pc(%imm2))
     141        __(movq %imm2,%rcontext:tcr.catch_top)
    188142])     
    189143
    190144define([nMake_Catch],[
    191145        Allocate_Catch_Frame(%imm2)
    192         movq %rcontext:tcr.catch_top,%imm0
    193         movq %rcontext:tcr.db_link,%imm1
    194         movq %arg_z,catch_frame.catch_tag(%imm2)
    195         movq %imm0,catch_frame.link(%imm2)
    196         lea node_size(%rsp),%imm0
    197         movq [$]$1,catch_frame.mvflag(%imm2)
    198         movq %imm0,catch_frame.rsp(%imm2)
    199         movq %rcontext:tcr.xframe,%imm0
    200         movq %rbp,catch_frame.rbp(%imm2)
    201         movq %rcontext:tcr.foreign_sp,%stack_temp
    202         movq %imm1,catch_frame.db_link(%imm2)
    203         movq %save3,catch_frame._save3(%imm2)
    204         movq %save2,catch_frame._save2(%imm2)
    205         movq %save1,catch_frame._save1(%imm2)
    206         movq %save0,catch_frame._save0(%imm2)
    207         movq %imm0,catch_frame.xframe(%imm2)
    208         movq %stack_temp,catch_frame.foreign_sp(%imm2)
    209         movq %xfn,catch_frame.pc(%imm2)
    210         movq %imm2,%rcontext:tcr.catch_top
     146        __(movq %rcontext:tcr.catch_top,%imm0)
     147        __(movq %rcontext:tcr.db_link,%imm1)
     148        __(movq %arg_z,catch_frame.catch_tag(%imm2))
     149        __(movq %imm0,catch_frame.link(%imm2))
     150        __(lea node_size(%rsp),%imm0)
     151        __(movq [$]$1,catch_frame.mvflag(%imm2))
     152        __(movq %imm0,catch_frame.rsp(%imm2))
     153        __(movq %rcontext:tcr.xframe,%imm0)
     154        __(movq %rbp,catch_frame.rbp(%imm2))
     155        __(movq %rcontext:tcr.foreign_sp,%stack_temp)
     156        __(movq %imm1,catch_frame.db_link(%imm2))
     157        __(movq %save3,catch_frame._save3(%imm2))
     158        __(movq %save2,catch_frame._save2(%imm2))
     159        __(movq %save1,catch_frame._save1(%imm2))
     160        __(movq %save0,catch_frame._save0(%imm2))
     161        __(movq %imm0,catch_frame.xframe(%imm2))
     162        __(movq %stack_temp,catch_frame.foreign_sp(%imm2))
     163        __(movq %xfn,catch_frame.pc(%imm2))
     164        __(movq %imm2,%rcontext:tcr.catch_top)
    211165])     
    212166               
     
    229183/* to interrupt; the interrupting code has to recognize and possibly  */
    230184/* emulate the instructions in between   */
    231         subq $cons.size-fulltag_cons,%rcontext:tcr.save_allocptr
    232         movq %rcontext:tcr.save_allocptr,%allocptr
    233         rcmpq(%allocptr,%rcontext:tcr.save_allocbase)
    234         jg macro_label(no_trap)
     185        __(subq $cons.size-fulltag_cons,%rcontext:tcr.save_allocptr)
     186        __(movq %rcontext:tcr.save_allocptr,%allocptr)
     187        __(rcmpq(%allocptr,%rcontext:tcr.save_allocbase))
     188        __(jg macro_label(no_trap))
    235189        uuo_alloc()
    236190macro_label(no_trap):   
    237         andb $~fulltagmask,%rcontext:tcr.save_allocptr
     191        __(andb $~fulltagmask,%rcontext:tcr.save_allocptr)
    238192/* Easy to interrupt now that tcr.save_allocptr isn't tagged as a cons    */
    239         movq $2,cons.cdr(%allocptr)
    240         movq $1,cons.car(%allocptr)
     193        __(movq $2,cons.cdr(%allocptr))
     194        __(movq $1,cons.car(%allocptr))
    241195        ifelse($3,[],[],[
    242          movq %allocptr,$3
     196         __(movq %allocptr,$3)
    243197        ])
    244198])
     
    248202
    249203define([Misc_Alloc],[
    250         subq [$]fulltag_misc,%imm1
     204        __(subq [$]fulltag_misc,%imm1)
    251205        Misc_Alloc_Internal($1)
    252206])
     
    257211               
    258212        new_macro_labels()
    259         subq %imm1,%rcontext:tcr.save_allocptr
    260         movq %rcontext:tcr.save_allocptr,%allocptr
    261         rcmpq(%allocptr,%rcontext:tcr.save_allocbase)
    262         jg macro_label(no_trap)
     213        __(subq %imm1,%rcontext:tcr.save_allocptr)
     214        __(movq %rcontext:tcr.save_allocptr,%allocptr)
     215        __(rcmpq(%allocptr,%rcontext:tcr.save_allocbase))
     216        __(jg macro_label(no_trap))
    263217        uuo_alloc()
    264218macro_label(no_trap):   
    265         movq %imm0,misc_header_offset(%allocptr)
    266         andb $~fulltagmask,%rcontext:tcr.save_allocptr
     219        __(movq %imm0,misc_header_offset(%allocptr))
     220        __(andb $~fulltagmask,%rcontext:tcr.save_allocptr)
    267221/* Now that tcr.save_allocptr is untagged, it's easier to be interrupted   */
    268222        ifelse($1,[],[],[
    269          mov %allocptr,$1
     223         __(mov %allocptr,$1)
    270224        ])
    271225])
    272226       
    273227define([Misc_Alloc_Fixed],[
    274         movq [$]$2-fulltag_misc,%imm1
     228        __(movq [$]$2-fulltag_misc,%imm1)
    275229        Misc_Alloc_Internal($1)
    276230])                                     
    277231
    278232define([vrefr],[
    279         mov misc_data_offset+($3<<word_shift)($2),$1
     233        __(mov misc_data_offset+($3<<word_shift)($2),$1)
    280234])     
    281235
    282236define([jump_fn],[
    283         jmpq *%fn
     237        __(jmpq *%fn)
    284238])
    285239                       
    286240define([jump_fname],[
    287         mov symbol.fcell(%fname),%fn
     241        __(mov symbol.fcell(%fname),%fn)
    288242        jump_fn()
    289243])     
    290244       
    291245define([set_nargs],[
    292         movw [$]$1<<fixnumshift,%nargs
    293 ])
     246        ifelse(eval($1>15),1,[
     247        __(movl [$]$1<<fixnumshift,%nargs_l)
     248        ],[
     249        __(xorl %nargs_l,%nargs_l)
     250        ifelse(eval($1),0,[],[
     251        __(addl [$]$1<<fixnumshift,%nargs_l)
     252        ])])])
     253       
     254
    294255
    295256/* $1 = ndigits.  Assumes 4-byte digits           */
     
    298259
    299260define([_car],[
    300         movq cons.car($1),$2
     261        __(movq cons.car($1),$2)
    301262])     
    302263
    303264define([_rplaca],[
    304         movq $2,cons.car($1)
     265        __(movq $2,cons.car($1))
    305266])     
    306267               
    307268define([_cdr],[
    308         movq cons.cdr($1),$2
     269        __(movq cons.cdr($1),$2)
    309270])
    310271
    311272define([_rplacd],[
    312         movq $2,cons.cdr($1)
     273        __(movq $2,cons.cdr($1))
    313274])     
    314275               
     
    327288define([do_funcall],[
    328289        new_macro_labels()
    329         movb %temp0_b,%imm0_b
    330         andb $fulltagmask,%imm0_b
    331         cmpb $fulltag_symbol,%imm0_b
     290        __(movb %temp0_b,%imm0_b)
     291        __(andb $fulltagmask,%imm0_b)
     292        __(cmpb $fulltag_symbol,%imm0_b)
    332293        /* %fname == %temp0   */
    333         cmovgq %temp0,%fn
     294        __(cmovgq %temp0,%fn)
    334295        jl macro_label(bad)
    335         cmoveq symbol.fcell(%fname),%fn
    336         jmp *%fn
     296        __(cmoveq symbol.fcell(%fname),%fn)
     297        __(jmp *%fn)
    337298macro_label(bad):               
    338299        __(uuo_error_not_callable)
     
    340301
    341302define([getvheader],[
    342         movq misc_header_offset($1),$2
     303        __(movq misc_header_offset($1),$2)
    343304])
    344305
     
    346307/*    both be immediate registers   */
    347308define([header_size],[
    348         movq $1,$2
    349         shr $num_subtag_bits,$2
     309        __(movq $1,$2)
     310        __(shr $num_subtag_bits,$2)
    350311])
    351312
    352313/* $2 (length) is fixnum element-count.   */
    353314define([header_length],[
    354         movq $~255,$2
    355         andq $1,$2
    356         shr $num_subtag_bits-fixnumshift,$2
     315        __(movq $~255,$2)
     316        __(andq $1,$2)
     317        __(shr $num_subtag_bits-fixnumshift,$2)
    357318])
    358319
     
    365326/* $1 = vector, $2 = dest   */
    366327define([vector_length],[                                 
    367         movq $~255,$2
    368         andq misc_header_offset($1),$2
    369         shr $num_subtag_bits-fixnumshift,$2
     328        __(movq $~255,$2)
     329        __(andq misc_header_offset($1),$2)
     330        __(shr $num_subtag_bits-fixnumshift,$2)
    370331])
    371332               
    372333/* GAS/ATT comparison arg order drives me nuts   */
    373334define([rcmpq],[
    374         cmpq $2,$1
     335        __(cmpq $2,$1)
    375336])
    376337
    377338define([rcmpl],[
    378         cmpl $2,$1
     339        __(cmpl $2,$1)
    379340])     
    380341
    381342define([rcmpw],[
    382         cmpw $2,$1
     343        __(cmpw $2,$1)
    383344])     
    384345
    385346define([rcmpb],[
    386         cmpb $2,$1
     347        __(cmpb $2,$1)
    387348])             
    388349
    389350
    390351define([condition_to_boolean],[
    391         movl [$]t_value,$2_l
    392         lea (-t_offset)($2),$3
    393         cmov$1l $2_l,$3_l
     352        __(movl [$]t_value,$2_l)
     353        __(lea (-t_offset)($2),$3)
     354        __(cmov$1l $2_l,$3_l)
    394355])
    395356
    396357define([compare_reg_to_nil],[
    397         cmpb $fulltag_nil,$1_b
     358        __(cmpb $fulltag_nil,$1_b)
    398359])             
    399360       
    400361define([extract_lisptag],[
    401         movzbl $1_b,$2_l
    402         andb [$]tagmask,$2_b
     362        __(movzbl $1_b,$2_l)
     363        __(andb [$]tagmask,$2_b)
    403364])
    404365
    405366                                                               
    406367define([extract_fulltag],[
    407         movzbl $1_b,$2_l
    408         andb [$]fulltagmask,$2_b
     368        __(movzbl $1_b,$2_l)
     369        __(andb [$]fulltagmask,$2_b)
    409370])
    410371
    411372define([extract_subtag],[
    412         movb misc_subtag_offset($1),$2
     373        __(movb misc_subtag_offset($1),$2)
    413374])
    414375
    415376define([extract_typecode],[
    416377        new_macro_labels()
    417         movzbl $1_b,$2_l
    418         andb $tagmask,$2_b
    419         cmpb $tag_misc,$2_b
    420         jne macro_label(done)
    421         movb misc_subtag_offset($1),$2_b
     378        __(movzbl $1_b,$2_l)
     379        __(andb $tagmask,$2_b)
     380        __(cmpb $tag_misc,$2_b)
     381        __(jne macro_label(done))
     382        __(movb misc_subtag_offset($1),$2_b)
    422383macro_label(done):     
    423384])
     
    426387
    427388        define([dnode_align],[
    428         lea ($2+(dnode_size-1))($1),$3
    429         andb $~(dnode_size-1),$3_b
     389        __(lea ($2+(dnode_size-1))($1),$3)
     390        __(andb $~(dnode_size-1),$3_b)
    430391])
    431392       
    432393define([push_argregs],[
    433394        new_macro_labels()
    434         testw %nargs,%nargs
    435         jz macro_label(done)
    436         cmpw [$]2*node_size,%nargs
    437         je macro_label(yz)
    438         jb macro_label(z)
    439         push %arg_x
     395        __(testw %nargs,%nargs)
     396        __(jz macro_label(done))
     397        __(cmpw [$]2*node_size,%nargs)
     398        __(je macro_label(yz))
     399        __(jb macro_label(z))
     400        __(push %arg_x)
    440401macro_label(yz):
    441         push %arg_y
     402        __(push %arg_y)
    442403macro_label(z):
    443         push %arg_z
     404        __(push %arg_z)
    444405macro_label(done):
    445406])     
     
    450411
    451412define([discard_temp_frame],[
    452         movq %rcontext:tcr.save_tsp,$1
    453         movq ($1),$1
    454         movq $1,%rcontext:tcr.save_tsp
    455         movq $1,%rcontext:tcr.next_tsp
     413        __(movq %rcontext:tcr.save_tsp,$1)
     414        __(movq ($1),$1)
     415        __(movq $1,%rcontext:tcr.save_tsp)
     416        __(movq $1,%rcontext:tcr.next_tsp)
    456417
    457418])     
    458419
    459420define([check_pending_enabled_interrupt],[
    460         btrq [$]63,%rcontext:tcr.interrupt_pending
    461         jnc,pt $1
     421        __(btrq [$]63,%rcontext:tcr.interrupt_pending)
     422        __(jnc,pt $1)
    462423        interrupt_now()
    463424])
     
    470431define([check_pending_interrupt],[
    471432        new_macro_labels()
    472         movq %rcontext:tcr.tlb_pointer,$1
    473         cmpq [$]0,INTERRUPT_LEVEL_BINDING_INDEX($1)
    474         js,pt macro_label(done)
     433        __(movq %rcontext:tcr.tlb_pointer,$1)
     434        __(cmpq [$]0,INTERRUPT_LEVEL_BINDING_INDEX($1))
     435        __(js,pt macro_label(done))
    475436        check_pending_enabled_interrupt(macro_label(done))
    476437macro_label(done):
     
    486447        ifelse($1,[],[
    487448        ],[
    488         movq $1,%rdi
     449        __(movq $1,%rdi)
    489450        ])
    490         movl [$]0x3000003,%eax
    491         syscall
     451        __(movl [$]0x3000003,%eax)
     452        __(syscall)
    492453])
    493454
     
    503464
    504465define([save_tcr_linear],[
    505         movq %rcontext:tcr.linear,$1
     466        __(movq %rcontext:tcr.linear,$1)
    506467])
    507468       
     
    512473/*  branch or (b) immediately follows a conditional branch not taken. */
    513474define([repret],[
    514         .byte 0xf3
    515          ret
     475        __(.byte 0xf3)
     476        __(ret)
    516477])
    517478                               
Note: See TracChangeset for help on using the changeset viewer.