Changeset 8575


Ignore:
Timestamp:
Feb 23, 2008, 2:02:46 PM (12 years ago)
Author:
andreas
Message:

Make C-callable X86-64 assembler functions platform independent by introducing symbolic register
names. Also fix some of the C prototypes for these functions that used "unsigned" when they
really meant "natural" (unsigned is 32 bits on Windows).

Location:
trunk/source/lisp-kernel
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/lisp-kernel/pmcl-kernel.c

    r8561 r8575  
    13701370  probably complain if we don't have (at least) SSE2.
    13711371*/
    1372 extern int cpuid(int, int*, int*, int*);
     1372extern int cpuid(natural, natural*, natural*, natural*);
    13731373
    13741374#define X86_FEATURE_CMOV    (1<<15)
     
    13831383check_x86_cpu()
    13841384{
    1385   int eax, ebx, ecx, edx;
     1385  natural eax, ebx, ecx, edx;
    13861386 
    13871387  eax = cpuid(0, &ebx, &ecx, &edx);
  • trunk/source/lisp-kernel/x86-asmutils64.s

    r8561 r8575  
    2020        _beginfile
    2121
    22 /* Flush %rsi cache lines, starting at address in %rdi.  Each line is */
    23 /*   assumed to be %rdx bytes wide. */
     22/* Flush %carg1 cache lines, starting at address in %carg0.  Each line is */
     23/*   assumed to be %carg2 bytes wide. */
    2424_exportfn(C(flush_cache_lines))
    25         __(cmpq $0,%rsi)
     25        __(cmpq $0,%carg1)
    2626        __(jmp 2f)
    27 1:      __(clflush (%rdi))
    28         __(addq %rdx,%rdi)
    29         __(subq $1,%rsi)
     271:      __(clflush (%carg0))
     28        __(addq %carg2,%carg0)
     29        __(subq $1,%carg1)
    30302:      __(jg 1b)       
    3131        __(repret)
     
    3333
    3434_exportfn(C(current_stack_pointer))
    35         __(movq %rsp,%rax)
     35        __(movq %rsp,%cret)
    3636        __(ret)
    3737_endfn
    3838
    3939_exportfn(C(touch_page))
    40         __(movq %rdi,(%rdi))
    41         __(movq $0,(%rdi))
    42         __(movl $1,%eax)
     40        __(movq %carg0,(%carg0))
     41        __(movq $0,(%carg0))
     42        __(movl $1,%cret_l)
    4343        .globl C(touch_page_end)
    4444C(touch_page_end):     
     
    4646                       
    4747_exportfn(C(count_leading_zeros))
    48         __(bsrq %rdi,%rax)
    49         __(xorq $63,%rax)
     48        __(bsrq %carg0,%cret)
     49        __(xorq $63,%cret)
    5050        __(ret)
    5151_endfn
     
    5656
    5757_exportfn(C(set_mxcsr))
    58         __(pushq %rdi)
     58        __(pushq %carg0)
    5959        __(ldmxcsr (%rsp))
    6060        __(addq $8,%rsp)
     
    6565        __(pushq $0)
    6666        __(stmxcsr (%rsp))
    67         __(popq %rax)
     67        __(popq %cret)
    6868        __(ret)
    6969_endfn
     
    7575_endfn                       
    7676
    77 /*  Atomically store new value (%rdx) in *%rdi, if old value == %rsi. */
     77/*  Atomically store new value (%carg2) in *%carg0, if old value == %carg1. */
    7878/*  Return actual old value. */
    7979_exportfn(C(store_conditional))
    80         __(mov %rsi,%rax)
     80        __(mov %carg1,%cret)
    8181        __(lock)
    82         __(cmpxchgq %rdx,(%rdi))
    83         __(cmovne %rdx,%rax)
     82        __(cmpxchgq %carg2,(%carg0))
     83        __(cmovne %carg2,%cret)
    8484        __(ret)
    8585_endfn
    8686
    87 /*      Atomically store new_value(%rsi) in *%rdi ;  return previous contents */
    88 /*      of *%rdi. */
     87/*      Atomically store new_value(%carg1) in *%carg0 ;  return previous contents */
     88/*      of *%carg0. */
    8989
    9090_exportfn(C(atomic_swap))
    9191        __(lock)
    92         __(xchg %rsi,(%rdi))
    93         __(mov %rsi,%rax)
    94         __(ret)
    95 _endfn
    96 
    97 /*        Logior the value in *%rdi with the value in %rsi (presumably a */
     92        __(xchg %carg1,(%carg0))
     93        __(mov %carg1,%cret)
     94        __(ret)
     95_endfn
     96
     97/*        Logior the value in *%carg0 with the value in %carg1 (presumably a */
    9898/*      bitmask with exactly 1 bit set.)  Return non-zero if any of */
    9999/*      the bits in that bitmask were already set. */
    100100_exportfn(C(atomic_ior))
    101 0:      __(movq (%rdi), %rax)
    102         __(movq %rax,%rcx)
    103         __(orq %rsi,%rcx)
     1010:      __(movq (%carg0),%cret)
     102        __(movq %cret,%carg2)
     103        __(orq %carg1,%carg2)
    104104        __(lock)
    105         __(cmpxchg %rcx,(%rdi))
     105        __(cmpxchg %carg2,(%carg0))
    106106        __(jnz 0b)
    107         __(andq %rsi,%rax)
    108         __(ret)
    109 _endfn
    110        
    111        
    112 /* Logand the value in *rdi with the value in rsi (presumably a bitmask with exactly 1 */
    113 /* bit set.)  Return the value now in *rdi (for some value of "now" */
     107        __(andq %carg1,%cret)
     108        __(ret)
     109_endfn
     110       
     111       
     112/* Logand the value in *carg0 with the value in carg1 (presumably a bitmask with exactly 1 */
     113/* bit set.)  Return the value now in *carg0 (for some value of "now" */
    114114
    115115_exportfn(C(atomic_and))
    116 0:      __(movq (%rdi), %rax)
    117         __(movq %rax,%rcx)
    118         __(and %rsi,%rcx)
     1160:      __(movq (%carg0),%cret)
     117        __(movq %cret,%carg2)
     118        __(and %carg1,%carg2)
    119119        __(lock)
    120         __(cmpxchg %rcx,(%rdi))
     120        __(cmpxchg %carg2,(%carg0))
    121121        __(jnz 0b)
    122         __(movq %rcx,%rax)
     122        __(movq %carg2,%cret)
    123123        __(ret)
    124124_endfn
     
    132132        __endif                       
    133133
    134 /* int cpuid (int code, int *pebx, int *pecx, int *pedx)  */
    135 /* UNIX           %rdi,     %rsi,      %rdx,      %rcx               */
    136 /* WIN            %ecx,     %rdx,      %r8,       %r9 */   
     134/* int cpuid (natural code, natural *pebx, natural *pecx, natural *pedx)  */
    137135_exportfn(C(cpuid))
    138         __ifdef([WINDOWS])
    139         __(pushq %r8)           /* pecx */
    140         __(pushq %r9)           /* pedx */
    141         __(movq %rdx, %rsi)     /* pebx */
    142         __(pushq %rbx)          /* %rbx is non-volatile */
    143         __(xorq %rax, %rax)
    144         __(movl %ecx,%eax)
    145         __else
    146         __(pushq %rdx)          /* pecx */
    147         __(pushq %rcx)          /* pedx */
    148         __(pushq %rbx)          /* %rbx is non-volatile */
    149         __(movq %rdi,%rax)
    150         __endif
    151         __(xorl %ecx,%ecx)
     136        __(pushq %carg2)
     137        __(pushq %carg3)
     138        __(movq %carg1, %ctemp0)
     139        __(pushq %rbx)          /* non-volatile reg, clobbered by CPUID */
     140        __(movq %carg0, %rax)
     141        __(xorq %rcx,%rcx)
    152142        __(cpuid)
    153         __(movl %ebx,(%rsi))
     143        __(movq %rbx,(%ctemp0))
    154144        __(popq %rbx)
    155         __(popq %rsi)           /* recover pedx */
    156         __(movl %edx,(%rsi))
    157         __(popq %rsi)           /* recover pecx */
    158         __(movl %ecx,(%rsi))
     145        __(popq %ctemp0)           /* recover pedx */
     146        __(movq %rdx,(%ctemp0))
     147        __(popq %ctemp0)                /* recover pecx */
     148        __(movq %rcx,(%ctemp0))
    159149        __(ret)
    160150_endfn
     
    163153/*   Not fully general, but should get us off of the signal stack */
    164154_exportfn(C(switch_to_foreign_stack))
    165         __(movq %rdi,%rsp)
    166         __(movq %rsi,%rax)
    167         __(movq %rdx,%rdi)
    168         __(movq %rcx,%rsi)
    169         __(movq %r8,%rdx)
    170         __(movq %r9,%rcx)
     155        __ifdef([WINDOWS])
     156        __(movq 8(%rsp), %ctemp0)
     157        __(movq 16(%rsp), %ctemp1)
     158        __endif
     159        __(movq %carg0,%rsp)
     160        __(movq %carg1,%rax)
     161        __(movq %carg2,%carg0)
     162        __(movq %carg3,%carg1)
     163        __ifdef([WINDOWS])
     164        __(movq %ctemp0, %carg2)
     165        __(movq %ctemp1, %carg3)
     166        __else
     167        __(movq %carg4,%carg2)
     168        __(movq %carg5,%carg3)
     169        __endif
    171170        __(jmp *%rax)
    172171_endfn
     
    183182       
    184183        __ifdef([DARWIN_GS_HACK])
    185 /* Check (in and ugly, non-portable way) to see if %gs is addressing
     184/* Check (in an ugly, non-portable way) to see if %gs is addressing
    186185   pthreads data.  If it was, return 0; otherwise, assume that it's
    187186   addressing a lisp tcr and set %gs to point to the tcr's tcr.osid,
  • trunk/source/lisp-kernel/x86-constants64.s

    r8562 r8575  
    8181        save0..save3:           R15, R14, R12, R11
    8282        arg_x, arg_y, arg_z:    R8, RDI, RSI
    83         fn:                     R13     
     83        fn:                     R13
     84        rcontext_reg:           GS
     85
     86        Win64 specifics:
     87        rcontext_reg:           R11
    8488       
    8589*/
     
    131135define([r15_b],[r15b])                                                 
    132136
     137/* Registers when using Lisp calling conventions */
     138       
    133139define([imm0],[rax])
    134140        define([imm0_l],[eax])
     
    257263define([fpzero],[fp15])
    258264
     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])
    259391       
    260392nbits_in_word = 64
  • trunk/source/lisp-kernel/x86-exceptions.c

    r8547 r8575  
    434434}
    435435
    436 extern unsigned get_mxcsr();
    437 extern void set_mxcsr(unsigned);
     436extern natural get_mxcsr();
     437extern void set_mxcsr(natural);
    438438 
    439439int
Note: See TracChangeset for help on using the changeset viewer.