Raymond Toy pushed to branch arm64-dev-1 at cmucl / cmucl

Commits:

2 changed files:

Changes:

  • src/lisp/arm64-lispregs.h
    1
    +/*
    
    2
    + * This code was written as part of the CMUCL project and has been
    
    3
    + * placed in the public domain.
    
    4
    + */
    
    5
    +#ifndef ARM64_LISPREGS_H
    
    6
    +#define ARM64_LISPREGS_H
    
    7
    +
    
    8
    +#ifdef LANGUAGE_ASSEMBLY
    
    9
    +#define REG(num) x ## num
    
    10
    +#else
    
    11
    +#define REG(num) (num)
    
    12
    +#endif
    
    13
    +
    
    14
    +#define NREGS 32
    
    15
    +
    
    16
    +/*
    
    17
    + * Non-descriptor (C argument/scratch) registers: X0-X7.
    
    18
    + * Caller-saved in both the C ABI and Lisp; hold raw untagged values.
    
    19
    + */
    
    20
    +#define reg_NL0    REG(0)   /* X0  - C arg 0 / return value */
    
    21
    +#define reg_NL1    REG(1)   /* X1  - C arg 1 */
    
    22
    +#define reg_NL2    REG(2)   /* X2  - C arg 2 */
    
    23
    +#define reg_NL3    REG(3)   /* X3  - C arg 3 */
    
    24
    +#define reg_NL4    REG(4)   /* X4  - C arg 4 */
    
    25
    +#define reg_NL5    REG(5)   /* X5  - C arg 5 */
    
    26
    +#define reg_NL6    REG(6)   /* X6  - C arg 6 */
    
    27
    +#define reg_NL7    REG(7)   /* X7  - C arg 7 */
    
    28
    +
    
    29
    +/* Runtime state registers (non-descriptor range). */
    
    30
    +#define reg_NARGS  REG(8)   /* X8  - number of arguments */
    
    31
    +#define reg_CFUNC  REG(9)   /* X9  - C function address */
    
    32
    +#define reg_NFP    REG(10)  /* X10 - number-stack frame pointer */
    
    33
    +#define reg_BSP    REG(11)  /* X11 - binding stack pointer */
    
    34
    +#define reg_CFP    REG(12)  /* X12 - control frame pointer */
    
    35
    +#define reg_CSP    REG(13)  /* X13 - control stack pointer */
    
    36
    +#define reg_ALLOC  REG(14)  /* X14 - allocation pointer */
    
    37
    +#define reg_NULL   REG(15)  /* X15 - NIL / null register */
    
    38
    +
    
    39
    +/* Code and call-target registers. */
    
    40
    +#define reg_CODE   REG(16)  /* X16 - current code object (C: ip0) */
    
    41
    +#define reg_FDEFN  REG(17)  /* X17 - function definition (C: ip1) */
    
    42
    +
    
    43
    +/* Descriptor (Lisp object) registers. */
    
    44
    +#define reg_CNAME  REG(18)  /* X18 - called name */
    
    45
    +#define reg_LEXENV REG(19)  /* X19 - lexical environment */
    
    46
    +#define reg_OCFP   REG(20)  /* X20 - old control frame pointer */
    
    47
    +#define reg_LRA    REG(21)  /* X21 - lisp return address */
    
    48
    +
    
    49
    +/* Argument registers (descriptor). */
    
    50
    +#define reg_A0     REG(22)  /* X22 - argument 0 */
    
    51
    +#define reg_A1     REG(23)  /* X23 - argument 1 */
    
    52
    +#define reg_A2     REG(24)  /* X24 - argument 2 */
    
    53
    +#define reg_A3     REG(25)  /* X25 - argument 3 */
    
    54
    +
    
    55
    +/* Local (descriptor) registers. */
    
    56
    +#define reg_L0     REG(26)  /* X26 - local 0 */
    
    57
    +#define reg_L1     REG(27)  /* X27 - local 1 */
    
    58
    +#define reg_L2     REG(28)  /* X28 - local 2 */
    
    59
    +
    
    60
    +/* Interior pointer and ABI registers. */
    
    61
    +#define reg_LIP    REG(29)  /* X29 - lisp interior pointer (C ABI FP, reclaimed) */
    
    62
    +#define reg_LR     REG(30)  /* X30 - hardware link register */
    
    63
    +
    
    64
    +/*
    
    65
    + * X31 is context-dependent in AArch64:
    
    66
    + *   - In data-processing encodings:    XZR (zero register), reads as 0.
    
    67
    + *   - In load/store base and SP-arith: SP  (stack pointer).
    
    68
    + */
    
    69
    +#define reg_NSP    REG(31)  /* X31/SP - native stack pointer / zero register */
    
    70
    +
    
    71
    +#define REGNAMES \
    
    72
    +  "NL0", "NL1", "NL2", "NL3", "NL4", "NL5", "NL6", "NL7",   \
    
    73
    +  "NARGS", "CFUNC", "NFP", "BSP", "CFP", "CSP", "ALLOC", "NULL", \
    
    74
    +  "CODE", "FDEFN", "CNAME", "LEXENV", "OCFP", "LRA",          \
    
    75
    +  "A0", "A1", "A2", "A3",                                      \
    
    76
    +  "L0", "L1", "L2",                                            \
    
    77
    +  "LIP", "LR", "ZR/SP"
    
    78
    +
    
    79
    +#define BOXED_REGISTERS { \
    
    80
    +  reg_A0, reg_A1, reg_A2, reg_A3, \
    
    81
    +  reg_CNAME, reg_LEXENV, reg_OCFP, reg_LRA, reg_CODE, reg_FDEFN \
    
    82
    +}
    
    83
    +
    
    84
    +#define SC_REG(scp, reg) (*os_sigcontext_reg(scp, reg))
    
    85
    +#define SC_PC(scp)       (*os_sigcontext_pc(scp))
    
    86
    +#define SC_SP(scp)       SC_REG(scp, reg_CSP)
    
    87
    +
    
    88
    +#endif /* ARM64_LISPREGS_H */

  • src/lisp/lispregs.h
    ... ... @@ -44,6 +44,10 @@
    44 44
     #include "arm-lispregs.h"
    
    45 45
     #endif
    
    46 46
     
    
    47
    +#ifdef __aarch64__
    
    48
    +#include "arm64-lispregs.h"
    
    49
    +#endif
    
    50
    +
    
    47 51
     /* This matches the definition of sc-offset in code/debug-info.lisp */
    
    48 52
     #define SC_OFFSET(sc,offset) (((offset) << 5) | (sc))
    
    49 53