From: Thiemo S. <th...@ne...> - 2005-07-08 12:14:17
|
Hello All, this patch extends the virtual address spaces on mips to 2x512 MB dynamic space, 128 MB static space, and 112 MB read-only space. Register $28 aka $gp was unused on the lisp side before, and is now a temporary specifically for jump/branch relaxation. On a sidenote, the branch relaxation code for mips is broken because it relies on absolute offsets, which means it will work until the first GC run. I prepare a followup patch once I found out how to do branch relaxation with relative offsets efficiently. Thiemo Index: src/compiler/mips/insts.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/mips/insts.lisp,v retrieving revision 1.6 diff -u -p -r1.6 insts.lisp --- src/compiler/mips/insts.lisp 10 Jun 2005 09:24:51 -0000 1.6 +++ src/compiler/mips/insts.lisp 8 Jul 2005 11:54:43 -0000 @@ -58,8 +58,7 @@ (:hi-reg 64) (:low-reg 65) (:float-status 66) - (:ctrl-stat-reg 67) - (:r31 31))))) + (:ctrl-stat-reg 67))))) (defparameter reg-symbols (map 'vector @@ -668,9 +674,9 @@ (:declare (type label target)) (:printer immediate ((op bcond-op) (rs 0) (rt #b01001) (immediate nil :type 'relative-label)) - '(:name :tab immediate)) + '(:name :tab immediate)) (:attributes branch) - (:dependencies (writes :r31)) + (:dependencies (writes lip-tn)) (:delay 1) (:emitter (emit-relative-branch segment bcond-op 0 #b10001 target))) @@ -757,7 +763,7 @@ immediate ((op bcond-op) (rt #b01000) (immediate nil :type 'relative-label)) cond-branch-printer) (:attributes branch) - (:dependencies (reads reg) (writes :r31)) + (:dependencies (reads reg) (writes lip-tn)) (:delay 1) (:emitter (emit-relative-branch segment bcond-op reg #b10000 target))) @@ -769,7 +775,7 @@ cond-branch-printer) (:attributes branch) (:delay 1) - (:dependencies (reads reg) (writes :r31)) + (:dependencies (reads reg) (writes lip-tn)) (:emitter (emit-relative-branch segment bcond-op reg #b10001 target))) @@ -791,28 +797,41 @@ (emit-register-inst segment special-op (reg-tn-encoding target) 0 0 0 #b001000)) (fixup - (note-fixup segment :jump target) - (emit-jump-inst segment #b000010 0))))) + (note-fixup segment :lui target) + (emit-immediate-inst segment #b001111 0 28 0) + (note-fixup segment :addi target) + (emit-immediate-inst segment #b001001 28 28 0) + (emit-register-inst segment special-op 28 0 0 0 #b001000))))) (define-instruction jal (segment reg-or-target &optional target) (:declare (type (or null tn fixup) target) - (type (or tn fixup (integer -16 31)) reg-or-target)) + (type (or tn fixup) reg-or-target)) (:printer register ((op special-op) (rt 0) (funct #b001001)) j-printer) (:printer jump ((op #b000011)) j-printer) (:attributes branch) - (:dependencies (if target (writes reg-or-target) (writes :r31))) + (:dependencies (cond + (target + (writes reg-or-target) (reads target)) + (t + (writes lip-tn) + (when (tn-p reg-or-target) + (reads reg-or-target))))) (:delay 1) (:emitter (unless target - (setf target reg-or-target) - (setf reg-or-target 31)) + (setf target reg-or-target + reg-or-target lip-tn)) (etypecase target (tn (emit-register-inst segment special-op (reg-tn-encoding target) 0 - reg-or-target 0 #b001001)) + (reg-tn-encoding reg-or-target) 0 #b001001)) (fixup - (note-fixup segment :jump target) - (emit-jump-inst segment #b000011 0))))) + (note-fixup segment :lui target) + (emit-immediate-inst segment #b001111 0 28 0) + (note-fixup segment :addi target) + (emit-immediate-inst segment #b001001 28 28 0) + (emit-register-inst segment special-op 28 0 + (reg-tn-encoding reg-or-target) 0 #b001001))))) (define-instruction bc1f (segment target) (:declare (type label target)) Index: src/compiler/mips/parms.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/mips/parms.lisp,v retrieving revision 1.9 diff -u -p -r1.9 parms.lisp --- src/compiler/mips/parms.lisp 29 May 2005 15:48:38 -0000 1.9 +++ src/compiler/mips/parms.lisp 8 Jul 2005 11:54:43 -0000 @@ -57,18 +57,41 @@ ;;;; Description of the target address space. -;;; Where to put the different spaces. -;;; -(def!constant read-only-space-start #x01000000) -(def!constant read-only-space-end #x05000000) - -(def!constant static-space-start #x06000000) -(def!constant static-space-end #x08000000) - -(def!constant dynamic-0-space-start #x08000000) -(def!constant dynamic-0-space-end #x0c000000) -(def!constant dynamic-1-space-start #x0c000000) -(def!constant dynamic-1-space-end #x10000000) +#!+irix +(progn + ;; Where to put the different spaces. + ;; Old definitions, might be still relevant for an IRIX port. + ;; + (def!constant read-only-space-start #x01000000) + (def!constant read-only-space-end #x05000000) + + (def!constant static-space-start #x06000000) + (def!constant static-space-end #x08000000) + + (def!constant dynamic-0-space-start #x08000000) + (def!constant dynamic-0-space-end #x0c000000) + (def!constant dynamic-1-space-start #x0c000000) + (def!constant dynamic-1-space-end #x10000000)) + +#!+linux +(progn + ;; Where to put the address spaces on Linux. + ;; + ;; C runtime executable segment starts at 0x00400000 + (def!constant read-only-space-start #x01000000) + (def!constant read-only-space-end #x08000000) + + (def!constant static-space-start #x08000000) + (def!constant static-space-end #x10000000) + ;; C runtime read/write segment starts at 0x10000000, heap and DSOs + ;; start at 0x2a000000 + (def!constant dynamic-0-space-start #x30000000) + (def!constant dynamic-0-space-end #x50000000) + (def!constant dynamic-1-space-start #x50000000) + (def!constant dynamic-1-space-end #x70000000) + ;; C stack grows downward from 0x80000000 + ) + ;;;; Other non-type constants. Index: src/compiler/mips/vm.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/mips/vm.lisp,v retrieving revision 1.10 diff -u -p -r1.10 vm.lisp --- src/compiler/mips/vm.lisp 4 Jul 2005 10:29:05 -0000 1.10 +++ src/compiler/mips/vm.lisp 8 Jul 2005 11:54:43 -0000 @@ -61,7 +61,8 @@ (defreg l1 24) ; tagged temporary 1 (defreg alloc 25) ; ALLOC pointer ;; 26 and 27 are used by the system kernel. - ;; 28 is the global pointer of our C runtime. + ;; 28 is the global pointer of our C runtime, and used for + ;; jump/branch relaxation in Lisp. (defreg nsp 29) ; number (native) stack pointer ;; C frame pointer, or additional saved register. (defreg code 30) ; current function object |
From: Thiemo S. <th...@ne...> - 2005-07-15 13:48:11
|
Thiemo Seufer wrote: > Hello All, > > this patch extends the virtual address spaces on mips to 2x512 MB > dynamic space, 128 MB static space, and 112 MB read-only space. > > Register $28 aka $gp was unused on the lisp side before, and is now > a temporary specifically for jump/branch relaxation. > > On a sidenote, the branch relaxation code for mips is broken because > it relies on absolute offsets, which means it will work until the first > GC run. I prepare a followup patch once I found out how to do branch > relaxation with relative offsets efficiently. Updated for detabification. Thiemo Index: src/compiler/mips/insts.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/mips/insts.lisp,v retrieving revision 1.7 diff -u -p -r1.7 insts.lisp --- src/compiler/mips/insts.lisp 14 Jul 2005 18:48:32 -0000 1.7 +++ src/compiler/mips/insts.lisp 15 Jul 2005 13:29:07 -0000 @@ -58,8 +58,7 @@ (:hi-reg 64) (:low-reg 65) (:float-status 66) - (:ctrl-stat-reg 67) - (:r31 31))))) + (:ctrl-stat-reg 67))))) (defparameter reg-symbols (map 'vector @@ -670,7 +677,7 @@ (immediate nil :type 'relative-label)) '(:name :tab immediate)) (:attributes branch) - (:dependencies (writes :r31)) + (:dependencies (writes lip-tn)) (:delay 1) (:emitter (emit-relative-branch segment bcond-op 0 #b10001 target))) @@ -757,7 +764,7 @@ immediate ((op bcond-op) (rt #b01000) (immediate nil :type 'relative-label)) cond-branch-printer) (:attributes branch) - (:dependencies (reads reg) (writes :r31)) + (:dependencies (reads reg) (writes lip-tn)) (:delay 1) (:emitter (emit-relative-branch segment bcond-op reg #b10000 target))) @@ -769,7 +776,7 @@ cond-branch-printer) (:attributes branch) (:delay 1) - (:dependencies (reads reg) (writes :r31)) + (:dependencies (reads reg) (writes lip-tn)) (:emitter (emit-relative-branch segment bcond-op reg #b10001 target))) @@ -791,28 +798,41 @@ (emit-register-inst segment special-op (reg-tn-encoding target) 0 0 0 #b001000)) (fixup - (note-fixup segment :jump target) - (emit-jump-inst segment #b000010 0))))) + (note-fixup segment :lui target) + (emit-immediate-inst segment #b001111 0 28 0) + (note-fixup segment :addi target) + (emit-immediate-inst segment #b001001 28 28 0) + (emit-register-inst segment special-op 28 0 0 0 #b001000))))) (define-instruction jal (segment reg-or-target &optional target) (:declare (type (or null tn fixup) target) - (type (or tn fixup (integer -16 31)) reg-or-target)) + (type (or tn fixup) reg-or-target)) (:printer register ((op special-op) (rt 0) (funct #b001001)) j-printer) (:printer jump ((op #b000011)) j-printer) (:attributes branch) - (:dependencies (if target (writes reg-or-target) (writes :r31))) + (:dependencies (cond + (target + (writes reg-or-target) (reads target)) + (t + (writes lip-tn) + (when (tn-p reg-or-target) + (reads reg-or-target))))) (:delay 1) (:emitter (unless target - (setf target reg-or-target) - (setf reg-or-target 31)) + (setf target reg-or-target + reg-or-target lip-tn)) (etypecase target (tn (emit-register-inst segment special-op (reg-tn-encoding target) 0 - reg-or-target 0 #b001001)) + (reg-tn-encoding reg-or-target) 0 #b001001)) (fixup - (note-fixup segment :jump target) - (emit-jump-inst segment #b000011 0))))) + (note-fixup segment :lui target) + (emit-immediate-inst segment #b001111 0 28 0) + (note-fixup segment :addi target) + (emit-immediate-inst segment #b001001 28 28 0) + (emit-register-inst segment special-op 28 0 + (reg-tn-encoding reg-or-target) 0 #b001001))))) (define-instruction bc1f (segment target) (:declare (type label target)) Index: src/compiler/mips/parms.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/mips/parms.lisp,v retrieving revision 1.10 diff -u -p -r1.10 parms.lisp --- src/compiler/mips/parms.lisp 14 Jul 2005 18:48:32 -0000 1.10 +++ src/compiler/mips/parms.lisp 15 Jul 2005 13:29:07 -0000 @@ -57,18 +57,41 @@ ;;;; Description of the target address space. -;;; Where to put the different spaces. -;;; -(def!constant read-only-space-start #x01000000) -(def!constant read-only-space-end #x05000000) - -(def!constant static-space-start #x06000000) -(def!constant static-space-end #x08000000) +#!+irix +(progn + ;; Where to put the different spaces. + ;; Old definitions, might be still relevant for an IRIX port. + ;; + (def!constant read-only-space-start #x01000000) + (def!constant read-only-space-end #x05000000) + + (def!constant static-space-start #x06000000) + (def!constant static-space-end #x08000000) + + (def!constant dynamic-0-space-start #x08000000) + (def!constant dynamic-0-space-end #x0c000000) + (def!constant dynamic-1-space-start #x0c000000) + (def!constant dynamic-1-space-end #x10000000)) + +#!+linux +(progn + ;; Where to put the address spaces on Linux. + ;; + ;; C runtime executable segment starts at 0x00400000 + (def!constant read-only-space-start #x01000000) + (def!constant read-only-space-end #x08000000) + + (def!constant static-space-start #x08000000) + (def!constant static-space-end #x10000000) + ;; C runtime read/write segment starts at 0x10000000, heap and DSOs + ;; start at 0x2a000000 + (def!constant dynamic-0-space-start #x30000000) + (def!constant dynamic-0-space-end #x50000000) + (def!constant dynamic-1-space-start #x50000000) + (def!constant dynamic-1-space-end #x70000000) + ;; C stack grows downward from 0x80000000 + ) -(def!constant dynamic-0-space-start #x08000000) -(def!constant dynamic-0-space-end #x0c000000) -(def!constant dynamic-1-space-start #x0c000000) -(def!constant dynamic-1-space-end #x10000000) ;;;; Other non-type constants. Index: src/compiler/mips/vm.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/mips/vm.lisp,v retrieving revision 1.11 diff -u -p -r1.11 vm.lisp --- src/compiler/mips/vm.lisp 14 Jul 2005 18:48:32 -0000 1.11 +++ src/compiler/mips/vm.lisp 15 Jul 2005 13:29:07 -0000 @@ -61,7 +61,8 @@ (defreg l1 24) ; tagged temporary 1 (defreg alloc 25) ; ALLOC pointer ;; 26 and 27 are used by the system kernel. - ;; 28 is the global pointer of our C runtime. + ;; 28 is the global pointer of our C runtime, and used for + ;; jump/branch relaxation in Lisp. (defreg nsp 29) ; number (native) stack pointer ;; C frame pointer, or additional saved register. (defreg code 30) ; current function object |
From: Thiemo S. <th...@ne...> - 2005-07-15 14:35:44
|
Thiemo Seufer wrote: > Thiemo Seufer wrote: > > Hello All, > > > > this patch extends the virtual address spaces on mips to 2x512 MB > > dynamic space, 128 MB static space, and 112 MB read-only space. > > > > Register $28 aka $gp was unused on the lisp side before, and is now > > a temporary specifically for jump/branch relaxation. > > > > On a sidenote, the branch relaxation code for mips is broken because > > it relies on absolute offsets, which means it will work until the first > > GC run. I prepare a followup patch once I found out how to do branch > > relaxation with relative offsets efficiently. > > Updated for detabification. Btw, this patch fixes the last test in bit-vector.impure-cload.lisp for mips (the one disabled for x86-64). Thiemo |
From: Christophe R. <cs...@ca...> - 2005-07-28 14:05:44
|
Thiemo Seufer <th...@ne...> writes: > Thiemo Seufer wrote: >> Hello All, >> >> this patch extends the virtual address spaces on mips to 2x512 MB >> dynamic space, 128 MB static space, and 112 MB read-only space. > > Updated for detabification. Thank you -- merged in sbcl-0.9.3.7. >> Register $28 aka $gp was unused on the lisp side before, and is now >> a temporary specifically for jump/branch relaxation. Even if we are careful about restoring $gp before calling into C, is this not a little dangerous? (I'm thinking about debugging with gdb, for instance, which might get even more confused than usual) >> On a sidenote, the branch relaxation code for mips is broken because >> it relies on absolute offsets, which means it will work until the first >> GC run. I prepare a followup patch once I found out how to do branch >> relaxation with relative offsets efficiently. Understood. Thank you again, Cheers, Christophe (PS: are we close to the position yet that this can be let loose on the Debian autobuilders?) |
From: Thiemo S. <th...@ne...> - 2005-07-28 14:30:14
|
Christophe Rhodes wrote: [snip] > >> Register $28 aka $gp was unused on the lisp side before, and is now > >> a temporary specifically for jump/branch relaxation. > > Even if we are careful about restoring $gp before calling into C, is > this not a little dangerous? (I'm thinking about debugging with gdb, > for instance, which might get even more confused than usual) Gdb assumes to find C ABI conforming function frames, for lisp code it can't traceback anyway. So far, I never had a need to debug C code while staying on the lisp side, a breakpoint on call_into{c,lisp} was always sufficient. [snip] > (PS: are we close to the position yet that this can be let loose on > the Debian autobuilders?) Once the other four testsuite failures are either fixed or disabled, I think. Thiemo |