Changeset 9987


Ignore:
Timestamp:
Jul 10, 2008, 9:55:49 AM (11 years ago)
Author:
gb
Message:

From trunK: define symbolic names for C arg regs.
'nargs' names the 32-bit %ecx register.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/working-0711/ccl/lisp-kernel/x86-constants64.s

    r8039 r9987  
    2020
    2121
     22/*
     23
     24        Register usage in C calling conventions differ between
     25        Darwin/Linux/FreeBSD (which use the AMD-defined ABI) and
     26        Windows64 (which uses something else).  The good news is that
     27        Win64 did away with the cdecl/stdcall/fastcall madness, there
     28        is only one ABI left.  Here's a rundown.
     29
     30        AMD64^Wx86-64 ABI:
     31         * Integer and pointer function arguments passed (from left to
     32        right) in RDI, RSI, RDX, RCX, R8 and R9
     33         * FP arguments are passed in XMM0..XMM7
     34         * rest is passed on stack
     35         * return value in RAX
     36         * Callee must preserve RBP, RBX, R12..R15, MXCSR control bits
     37         * On function entry, x87 mode and DF clear is assumed
     38         * [RSP]..[RSP-128] must not be touched by signal handlers
     39
     40        Win64 ABI:
     41         * Integer and pointers passed in RCX, RDX, R8, R9
     42         * FP passed in XMM0..XMM3
     43         * rest is passed on stack
     44         * Return value in RAX or XMM0
     45         * Caller (!) responsible for creating and cleaning stack space for
     46        spilling integer registers
     47         * Callee must preserve RBP, RBX, RSI, RDI, R12..R15, XMM6..XMM15
     48
     49        Both want their stack pointers to be 16 byte aligned on call,
     50        equivalent to 8 byte offset after call due to pushed return address.
     51       
     52        http://msdn2.microsoft.com/en-us/library/zthk2dkh(VS.80).aspx
     53        http://www.tortall.net/projects/yasm/manual/html/objfmt-win64-exception.html
     54        http://www.x86-64.org/documentation/abi.pdf
     55
     56
     57        Lisp register usage:
     58
     59        Clozure CL renames the physical registers, giving them names
     60        based on their usage. An overview:
     61
     62        imm0..imm2
     63        temp0..temp2
     64        save0..save3
     65        arg_x, arg_y, arg_z
     66        fn
     67
     68        On top of that, further mappings are defined:
     69
     70        fname, next_method_context:     temp0
     71        nargs:                          imm2
     72        ra0:                            temp2
     73        xfn:                            temp1
     74        allocptr:                       temp0
     75        stack_temp:                     mm7     
     76       
     77        x86-64 ABI mapping:
     78       
     79        imm0..imm2:             RAX, RDX, RCX
     80        temp0..temp2:           RBX, R9, R10
     81        save0..save3:           R15, R14, R12, R11
     82        arg_x, arg_y, arg_z:    R8, RDI, RSI
     83        fn:                     R13
     84        rcontext_reg:           GS
     85
     86        Win64 specifics:
     87        rcontext_reg:           R11
     88       
     89*/
     90       
    2291
    2392/* Redefining these standard register names - with the same _l, _w, _b suffixes  */
     
    66135define([r15_b],[r15b])                                                 
    67136
     137/* Registers when using Lisp calling conventions */
     138       
    68139define([imm0],[rax])
    69140        define([imm0_l],[eax])
     
    150221        define([Rsave0],[15])   
    151222
     223
     224ifdef([WINDOWS],[
     225/* We keep the TCR pointer in r11 */
     226        define([rcontext_reg], r11)
     227        define([rcontext],[$1(%rcontext_reg)])
     228],[
    152229/* The TCR can be accessed relative to %gs   */
    153 define([rcontext],[gs])
     230        define([rcontext_reg],[gs])
     231        define([rcontext],[%rcontext_reg:$1])
     232])
    154233define([fname],[temp0])
    155234define([next_method_context],[temp0])
    156235define([nargs_b],[imm2_b])     
    157 define([nargs],[imm2_w])
     236define([nargs_w],[imm2_w])
    158237define([nargs_q],[imm2])
    159 define([nargs_l],[imm2_l])
     238define([nargs],[imm2_l])
    160239define([ra0],[temp2])       
    161240                                               
    162 define([xfn],[temp1])   
    163 
     241define([xfn],[temp1])
    164242
    165243define([allocptr],[temp0])             
     
    184262define([fp15],[xmm15])         
    185263define([fpzero],[fp15])
    186        
     264
     265/* Registers when running with native C calling conventions */
     266
     267define([cret],[rax])
     268        define([cret_l],[eax])
     269        define([cret_w],[ax])
     270        define([cret_b],[al])
     271        define([Rcret],[0])
     272       
     273define([ctemp0],[r10])
     274        define([ctemp0_l],[r10d])
     275        define([ctemp0_w],[r10w])
     276        define([ctemp0_b],[r10b])
     277        define([Rctemp0],[10])
     278       
     279define([ctemp1],[r11])         
     280        define([ctemp1_l],[r11d])
     281        define([ctemp1_w],[r11w])
     282        define([ctemp1_b],[r11b])
     283        define([Rctemp1],[11])
     284       
     285define([csave0],[rbx])
     286        define([csave0_l],[ebx])
     287        define([csave0_w],[bx])
     288        define([csave0_b],[bl])
     289        define([Rcsave0],[3])
     290
     291define([csave1],[r12])
     292        define([csave1_l],[r12d])
     293        define([csave1_w],[r12w])
     294        define([csave1_b],[r12b])
     295        define([Rcsave1],[12])
     296       
     297define([csave2],[r13])
     298        define([csave2_l],[r13d])
     299        define([csave2_w],[r13w])
     300        define([csave2_b],[r13b])
     301        define([Rcsave2],[13])
     302       
     303define([csave3],[r14])
     304        define([csave3_l],[r14d])
     305        define([csave3_w],[r14w])
     306        define([csave3_b],[r14b])
     307        define([Rcsave3],[14])
     308               
     309define([csave4],[r15])
     310        define([csave4_l],[r15d])
     311        define([csave4_w],[r15w])
     312        define([csave4_b],[r15b])
     313        define([Rcsave4],[15]) 
     314
     315ifdef([WINDOWS],[
     316
     317define([carg0],[rcx])
     318        define([carg0_l],[ecx])
     319        define([carg0_w],[cx])
     320        define([carg0_b],[cl])
     321        define([Rcarg0],[1])
     322       
     323define([carg1],[rdx])
     324        define([carg1_l],[edx])
     325        define([carg1_w],[dx])
     326        define([carg1_b],[dl])
     327        define([Rcarg1],[2])
     328       
     329define([carg2],[r8])
     330        define([carg2_l],[r8d])
     331        define([carg2_w],[r8w])
     332        define([carg2_b],[r8b])
     333        define([Rcarg2],[8])
     334
     335define([carg3],[r9])
     336        define([carg3_l],[r9d])
     337        define([carg3_w],[r9w])
     338        define([carg3_b],[r9b])
     339        define([Rcarg3],[9])
     340
     341define([csave5],[rsi])
     342        define([csave5_l],[esi])
     343        define([csave5_w],[si])
     344        define([csave5_b],[sil])
     345        define([csave5_z],[6])
     346
     347define([csave6],[rdi])
     348        define([csave6_l],[edi])
     349        define([csave6_w],[di])
     350        define([csave6_b],[dil])
     351        define([Rcsave6],[7])
     352
     353],[
     354       
     355define([carg0],[rdi])
     356        define([carg0_l],[edi])
     357        define([carg0_w],[di])
     358        define([carg0_b],[dil])
     359        define([Rcarg0],[7])
     360
     361define([carg1],[rsi])
     362        define([carg1_l],[esi])
     363        define([carg1_w],[si])
     364        define([carg1_b],[sil])
     365        define([carg1_z],[6])
     366
     367define([carg2],[rdx])
     368        define([carg2_l],[edx])
     369        define([carg2_w],[dx])
     370        define([carg2_b],[dl])
     371        define([Rcarg2],[2])
     372       
     373define([carg3],[rcx])
     374        define([carg3_l],[ecx])
     375        define([carg3_w],[cx])
     376        define([carg3_b],[cl])
     377        define([Rcarg3],[1])
     378       
     379define([carg4],[r8])
     380        define([carg4_l],[r8d])
     381        define([carg4_w],[r8w])
     382        define([carg4_b],[r8b])
     383        define([Rcarg4],[8])
     384
     385define([carg5],[r9])
     386        define([carg5_l],[r9d])
     387        define([carg5_w],[r9w])
     388        define([carg5_b],[r9b])
     389        define([Rcarg5],[9])   
     390])
    187391       
    188392nbits_in_word = 64
Note: See TracChangeset for help on using the changeset viewer.