[Git][cmucl/cmucl][sparc64-dev] Add stack bias and other 64-bit support

Raymond Toy rtoy at common-lisp.net
Thu Dec 29 18:56:42 UTC 2016


Raymond Toy pushed to branch sparc64-dev at cmucl / cmucl


Commits:
566a6888 by Raymond Toy at 2016-12-29T10:56:24-08:00
Add stack bias and other 64-bit support

Use the stack bias with %fp.
Use ldn/stn ot do 64-bit loads and stores.
Set the frame size appropriately for 64-bit.

- - - - -


1 changed file:

- src/lisp/sparc64-assem.S


Changes:

=====================================
src/lisp/sparc64-assem.S
=====================================
--- a/src/lisp/sparc64-assem.S
+++ b/src/lisp/sparc64-assem.S
@@ -12,15 +12,18 @@
 #else
 #endif
 
+/* Sparcv9 ABI has a bias on the stack (including sp and fp!) */
+#define WORD_BYTES	8
+
 #define LANGUAGE_ASSEMBLY
 #include "lispregs.h"
 #include "internals.h"
 #include "globals.h"
 
 #define load(sym, reg) \
-        sethi %hi(sym), reg; ld [reg+%lo(sym)], reg
+        sethi %hi(sym), reg; ldn [reg+%lo(sym)], reg
 #define store(reg, sym) \
-        sethi %hi(sym), reg_L0; st reg, [reg_L0+%lo(sym)]
+        sethi %hi(sym), reg_L0; stn reg, [reg_L0+%lo(sym)]
 
 /*
  * Our frame size needs to be large enough to hold our window, 
@@ -31,11 +34,7 @@
  * Since %o0 and %o1 contain the return results, we do not have to save 
  * these.
  */
-#ifdef v8plus	
-#define FRAMESIZE (SA(WINDOWSIZE+4 + 6*8))
-#else	
-#define FRAMESIZE (SA(MINFRAME))
-#endif
+#define FRAMESIZE (SA64(MINFRAME64))
 
 /*
  * Tell assembler we're using %g2 and %g3 here.
@@ -53,7 +52,7 @@ call_into_lisp:
 	ta	ST_FLUSH_WINDOWS
 
         /* Save the return address. */
-        st      %i7, [%fp-4]
+        stn     %i7, [%fp + STACK_BIAS - WORD_BYTES]
 
         /* Clear the descriptor regs. (See sparc/vm.lisp) */
         mov     reg_ZERO, reg_A0
@@ -92,18 +91,18 @@ call_into_lisp:
         sll     %i2, 2, reg_NARGS
         mov     %i1, reg_CFP
 	mov	%i0, reg_LEXENV
-        ld      [reg_CFP+0], reg_A0
-        ld      [reg_CFP+4], reg_A1
-        ld      [reg_CFP+8], reg_A2
-        ld      [reg_CFP+12], reg_A3
-        ld      [reg_CFP+16], reg_A4
-        ld      [reg_CFP+20], reg_A5
+        ldn     [reg_CFP + 0*WORD_BYTES], reg_A0
+        ldn     [reg_CFP + 1*WORD_BYTES], reg_A1
+        ldn     [reg_CFP + 2*WORD_BYTES], reg_A2
+        ldn     [reg_CFP + 3*WORD_BYTES], reg_A3
+        ldn     [reg_CFP + 4*WORD_BYTES], reg_A4
+        ldn     [reg_CFP + 5*WORD_BYTES], reg_A5
 
         /* Calculate LRA */
         set     lra + type_OtherPointer, reg_LRA
 
         /* Indirect closure */
-        ld      [reg_LEXENV+CLOSURE_FUNCTION_OFFSET], reg_CODE
+        ldn     [reg_LEXENV+CLOSURE_FUNCTION_OFFSET], reg_CODE
 
         jmp     reg_CODE+FUNCTION_CODE_OFFSET
         nop
@@ -138,7 +137,7 @@ lra:
 	tne	trap_PseudoAtomic
 
         /* Back to C we go. */
-	ld	[%sp+FRAMESIZE-4], %i7
+	ld	[%sp + STACK_BIAS +FRAMESIZE-WORD_BYTES], %i7
         ret
         restore	%sp, FRAMESIZE, %sp
 	SET_SIZE(call_into_lisp)
@@ -149,12 +148,12 @@ lra:
 	FUNCDEF(call_into_c)
 call_into_c:
 #ifdef v8plus
-	stx	%o2, [%fp - 8 - 1*8]
-	stx	%o3, [%fp - 8 - 2*8]
-	stx	%o4, [%fp - 8 - 3*8]
-	stx	%o5, [%fp - 8 - 4*8]
-	stx	%o6, [%fp - 8 - 5*8]
-	stx	%o7, [%fp - 8 - 6*8]
+	stx	%o2, [%fp + STACK_BIAS - 8 - 1*8]
+	stx	%o3, [%fp + STACK_BIAS - 8 - 2*8]
+	stx	%o4, [%fp + STACK_BIAS - 8 - 3*8]
+	stx	%o5, [%fp + STACK_BIAS - 8 - 4*8]
+	stx	%o6, [%fp + STACK_BIAS - 8 - 5*8]
+	stx	%o7, [%fp + STACK_BIAS - 8 - 6*8]
 #endif		
         /* Build a lisp stack frame */
         mov     reg_CFP, reg_OCFP
@@ -233,12 +232,12 @@ call_into_c:
         mov     reg_OCFP, reg_CFP
 
 #ifdef v8plus
-	ldx	[%fp - 8 - 1*8], %o2
-	ldx	[%fp - 8 - 2*8], %o3
-	ldx	[%fp - 8 - 3*8], %o4
-	ldx	[%fp - 8 - 4*8], %o5
-	ldx	[%fp - 8 - 5*8], %o6
-	ldx	[%fp - 8 - 6*8], %o7
+	ldx	[%fp + STACK_BIAS - 8 - 1*8], %o2
+	ldx	[%fp + STACK_BIAS - 8 - 2*8], %o3
+	ldx	[%fp + STACK_BIAS - 8 - 3*8], %o4
+	ldx	[%fp + STACK_BIAS - 8 - 4*8], %o5
+	ldx	[%fp + STACK_BIAS - 8 - 5*8], %o6
+	ldx	[%fp + STACK_BIAS - 8 - 6*8], %o7
 #endif		
         /* And back into lisp. */
         ret



View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/commit/566a6888220df3f0ae75d23143b92d0000f3a664
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/cmucl-cvs/attachments/20161229/ce4ce008/attachment-0001.html>


More information about the cmucl-cvs mailing list