From 54d63fdef4e0b2d4041375ff474a8af383f59bb1 Mon Sep 17 00:00:00 2001 From: toy <toy> Date: Wed, 13 Nov 2002 17:14:18 +0000 Subject: [PATCH] Add some #defines and macros to make it easier to create (and understand!) SC_OFFSETs in assembly files. --- lisp/sparc-assem.S | 21 ++++++++----------- lisp/sparc-lispregs.h | 48 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 13 deletions(-) diff --git a/lisp/sparc-assem.S b/lisp/sparc-assem.S index 3f41a021e..38ae96b05 100644 --- a/lisp/sparc-assem.S +++ b/lisp/sparc-assem.S @@ -280,11 +280,13 @@ _undefined_tramp: /* Number of argument bytes */ .byte 4 .byte UNDEFINED_SYMBOL_ERROR - /* Escape to create 16bit BE number from following two values */ + /* Escape to create 16bit number from following two bytes, + in little-endian order */ .byte 254 /* SC_OFFSET(sc_DescriptorReg,reg_FDEFN) */ - .byte sc_DescriptorReg - .byte 3 + .byte SC_OFFSET_LO(sc_DescriptorReg,reg_FDEFN_NUM) + .byte SC_OFFSET_HI(sc_DescriptorReg,reg_FDEFN_NUM) + .align 4 1: ld [reg_FDEFN+FDEFN_RAW_ADDR_OFFSET], reg_CODE @@ -405,8 +407,6 @@ _resolve_linkage_tramp: .global _undefined_foreign_symbol_trap FUNCDEF(_undefined_foreign_symbol_trap) -#define SC_OFFSET_HI(sc, reg) ((sc | (reg << 5)) >> 8) -#define SC_OFFSET_LO(sc, reg) ((sc | (reg << 5)) & 0xff) /* * When we get called, %o0 contains the address of the data_vector object * which is a string naming the bad symbol. @@ -434,14 +434,11 @@ _undefined_foreign_symbol_trap: unimp trap_Error .byte 4 /* Number of argument bytes */ .byte UNDEFINED_FOREIGN_SYMBOL_ERROR - /* Escape to create 16bit BE number from following two values - but bytes are given in little-endian order (!) */ + /* Escape to create 16bit number from following two bytes, in + little-endian order */ .byte 254 - /* SC_OFFSET(sc_DescriptorReg,A0) = (offset << 5) | sc_DescriptorReg */ - /* reg_A0 = 16. See the defref for a0 in sparc/vm.lisp */ - - .byte SC_OFFSET_LO(sc_DescriptorReg, 16) - .byte SC_OFFSET_HI(sc_DescriptorReg, 16) + .byte SC_OFFSET_LO(sc_DescriptorReg, reg_A0_NUM) + .byte SC_OFFSET_HI(sc_DescriptorReg, reg_A0_NUM) .align 4 #endif diff --git a/lisp/sparc-lispregs.h b/lisp/sparc-lispregs.h index a8ad17c7f..ff24f164f 100644 --- a/lisp/sparc-lispregs.h +++ b/lisp/sparc-lispregs.h @@ -1,4 +1,4 @@ -/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/sparc-lispregs.h,v 1.5 2000/10/27 19:42:31 dtc Exp $ */ +/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/sparc-lispregs.h,v 1.6 2002/11/13 17:14:18 toy Exp $ */ @@ -32,41 +32,87 @@ #endif +#define GREG_NUM(num) (num) +#define OREG_NUM(num) ((num)+8) +#define LREG_NUM(num) ((num)+16) +#define IREG_NUM(num) ((num)+24) + #define NREGS (32) +/* + * Define all the Lisp registers appropriately for assembly and C. + * The registers ending with NUM are meant for use in assembly + * routines where we need the register number for getting SC_OFFSET + */ #define reg_ZERO GREG(0) +#define reg_ZERO_NUM GREG_NUM(0) #define reg_ALLOC GREG(1) +#define reg_ALLOC_NUM GREG_NUM(1) #define reg_NIL GREG(2) +#define reg_NIL_NUM GREG_NUM(2) #define reg_CSP GREG(3) +#define reg_CSP_NUM GREG_NUM(3) #define reg_CFP GREG(4) +#define reg_CFP_NUM GREG_NUM(4) #define reg_BSP GREG(5) +#define reg_BSP_NUM GREG_NUM(5) /* %g6 and %g7 are supposed to be reserved for the system */ #define reg_NL0 OREG(0) +#define reg_NL0_NUM OREG_NUM(0) #define reg_NL1 OREG(1) +#define reg_NL1_NUM OREG_NUM(1) #define reg_NL2 OREG(2) +#define reg_NL2_NUM OREG_NUM(2) #define reg_NL3 OREG(3) +#define reg_NL3_NUM OREG_NUM(3) #define reg_NL4 OREG(4) +#define reg_NL4_NUM OREG_NUM(4) #define reg_NL5 OREG(5) +#define reg_NL5_NUM OREG_NUM(5) #define reg_NSP OREG(6) +#define reg_NSP_NUM OREG_NUM(6) #define reg_NARGS OREG(7) +#define reg_NARGS_NUM OREG_NUM(7) #define reg_A0 LREG(0) +#define reg_A0_NUM LREG_NUM(0) #define reg_A1 LREG(1) +#define reg_A1_NUM LREG_NUM(1) #define reg_A2 LREG(2) +#define reg_A2_NUM LREG_NUM(2) #define reg_A3 LREG(3) +#define reg_A3_NUM LREG_NUM(3) #define reg_A4 LREG(4) +#define reg_A4_NUM LREG_NUM(4) #define reg_A5 LREG(5) +#define reg_A5_NUM LREG_NUM(5) #define reg_OCFP LREG(6) +#define reg_OCFP_NUM LREG_NUM(6) #define reg_LRA LREG(7) +#define reg_LRA_NUM LREG_NUM(7) #define reg_FDEFN IREG(0) +#define reg_FDEFN_NUM IREG_NUM(0) #define reg_LEXENV IREG(1) +#define reg_LEXENV_NUM IREG_NUM(1) #define reg_L0 IREG(2) +#define reg_L0_NUM IREG_NUM(2) #define reg_NFP IREG(3) +#define reg_NFP_NUM IREG_NUM(3) #define reg_CFUNC IREG(4) +#define reg_CFUNC_NUM IREG_NUM(4) #define reg_CODE IREG(5) +#define reg_CODE_NUM IREG_NUM(5) #define reg_LIP IREG(7) +#define reg_LIP_NUM IREG_NUM(7) + +/* + * Macros to compute the SC_OFFSET value. See read-var-integer and + * sc-offset and friends in debug-info.lisp + */ +#define SC_OFFSET_HI(sc, reg) ((SC_OFFSET(sc,reg)) >> 8) +#define SC_OFFSET_LO(sc, reg) ((SC_OFFSET(sc,reg)) & 0xff) #define REGNAMES \ "ZERO", "ALLOC", "NULL", "CSP", \ -- GitLab