From: Thiemo S. <th...@ne...> - 2005-06-09 12:15:37
|
Hello All, the appended patch implements branch relaxation in the mips port for branches >18 bits. It also fixes the dependency declarations for some branch instructions. Thiemo Index: src/compiler/mips/insts.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/mips/insts.lisp,v retrieving revision 1.5 diff -u -p -r1.5 insts.lisp --- src/compiler/mips/insts.lisp 28 Mar 2005 18:55:05 -0000 1.5 +++ src/compiler/mips/insts.lisp 9 Jun 2005 12:05:03 -0000 @@ -601,19 +601,58 @@ ;;;; Branch/Jump instructions. (defun emit-relative-branch (segment opcode r1 r2 target) - (emit-back-patch segment 4 - #'(lambda (segment posn) - (emit-immediate-inst segment - opcode - (if (fixnump r1) - r1 - (reg-tn-encoding r1)) - (if (fixnump r2) - r2 - (reg-tn-encoding r2)) - (ash (- (label-position target) - (+ posn 4)) - -2))))) + (emit-chooser + segment 20 2 + #'(lambda (segment posn magic-value) + (declare (ignore magic-value)) + (let ((delta (ash (- (label-position target) (+ posn 4)) -2))) + (when (typep delta '(signed-byte 16)) + (emit-back-patch segment 4 + #'(lambda (segment posn) + (emit-immediate-inst segment + opcode + (if (fixnump r1) + r1 + (reg-tn-encoding r1)) + (if (fixnump r2) + r2 + (reg-tn-encoding r2)) + (ash (- (label-position target) + (+ posn 4)) + -2)))) + t))) + #'(lambda (segment posn) + (declare (ignore posn)) + (let ((linked)) + ;; invert branch condition + (if (or (= opcode bcond-op) (= opcode cop1-op)) + (setf r2 (logxor r2 #b00001)) + (setf opcode (logxor opcode #b00001))) + ;; check link flag + (if (= opcode bcond-op) + (if (logand r2 #b10000) + (progn (setf r2 (logand r2 #b01111)) + (setf linked t)))) + (emit-immediate-inst segment + opcode + (if (fixnump r1) r1 (reg-tn-encoding r1)) + (if (fixnump r2) r2 (reg-tn-encoding r2)) + 4) + (emit-nop segment) + (emit-back-patch segment 8 + #'(lambda (segment posn) + (declare (ignore posn)) + (emit-immediate-inst segment #b001111 0 + (reg-tn-encoding lip-tn) + (ldb (byte 16 16) + (label-position target))) + (emit-immediate-inst segment #b001101 0 + (reg-tn-encoding lip-tn) + (ldb (byte 16 0) + (label-position target))))) + (emit-register-inst segment special-op (reg-tn-encoding lip-tn) + 0 (if linked 31 0) 0 + (if linked #b001001 #b001000)))))) (define-instruction b (segment target) (:declare (type label target)) @@ -631,18 +670,18 @@ (immediate nil :type 'relative-label)) '(:name :tab immediate)) (:attributes branch) + (:dependencies (writes :r31)) (:delay 1) (:emitter (emit-relative-branch segment bcond-op 0 #b10001 target))) - (define-instruction beq (segment r1 r2-or-target &optional target) (:declare (type tn r1) (type (or tn fixnum label) r2-or-target) (type (or label null) target)) (:printer immediate ((op #b000100) (immediate nil :type 'relative-label))) (:attributes branch) - (:dependencies (reads r1) (reads r2-or-target)) + (:dependencies (reads r1) (if target (reads r2-or-target))) (:delay 1) (:emitter (unless target @@ -656,7 +695,7 @@ (type (or label null) target)) (:printer immediate ((op #b000101) (immediate nil :type 'relative-label))) (:attributes branch) - (:dependencies (reads r1) (reads r2-or-target)) + (:dependencies (reads r1) (if target (reads r2-or-target))) (:delay 1) (:emitter (unless target |
From: Christophe R. <cs...@ca...> - 2005-06-10 09:25:43
|
Thiemo Seufer <th...@ne...> writes: > the appended patch implements branch relaxation in the mips port > for branches >18 bits. It also fixes the dependency declarations > for some branch instructions. Thank you; merged in sbcl-0.9.1.36. (I didn't test this, obviously... :-) Cheers, Christophe |
From: Thiemo S. <th...@ne...> - 2005-06-10 13:11:29
|
Christophe Rhodes wrote: > Thiemo Seufer <th...@ne...> writes: > > > the appended patch implements branch relaxation in the mips port > > for branches >18 bits. It also fixes the dependency declarations > > for some branch instructions. > > Thank you; merged in sbcl-0.9.1.36. A small followup patch, whic uses "when" instead of "if". 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 10 Jun 2005 12:58:57 -0000 @@ -629,10 +629,10 @@ (setf r2 (logxor r2 #b00001)) (setf opcode (logxor opcode #b00001))) ;; check link flag - (if (= opcode bcond-op) - (if (logand r2 #b10000) - (progn (setf r2 (logand r2 #b01111)) - (setf linked t)))) + (when (= opcode bcond-op) + (when (logand r2 #b10000) + (progn (setf r2 (logand r2 #b01111)) + (setf linked t)))) (emit-immediate-inst segment opcode (if (fixnump r1) r1 (reg-tn-encoding r1)) |
From: Christophe R. <cs...@ca...> - 2005-06-10 13:31:12
|
Thiemo Seufer <th...@ne...> writes: > Christophe Rhodes wrote: >> Thiemo Seufer <th...@ne...> writes: >> >> > the appended patch implements branch relaxation in the mips port >> > for branches >18 bits. It also fixes the dependency declarations >> > for some branch instructions. >> >> Thank you; merged in sbcl-0.9.1.36. > > A small followup patch, whic uses "when" instead of "if". > > + (when (= opcode bcond-op) > + (when (logand r2 #b10000) > + (progn (setf r2 (logand r2 #b01111)) > + (setf linked t)))) Ah, but... here the indentation is all wrong :-) WHEN has the macro lambda list (test &body body), and the Lisp community over many years has essentially standardized on indenting body forms just two spaces from their parent form. So a standard WHEN expression should be formatted as (when (= opcode bcond-op) (do-something) (do-something else) (and so on)) If the test, for some reason, needed to be on its own line, then the indentation would be (when (= opcode bcond-op) (do-something)) so that the test, which is not a body form, is visually distinguished. This is a pretty general rule, by the way, so even things like multiple-value-bind end up looking like (multiple-value-bind (foo bar) (truncate 19 3) (frob foo) (frob bar) (frob baz)) if all the subforms are split onto their own lines. If you're using emacs, (setq lisp-indent-function 'common-lisp-indent-function) gets you a certain amount of the way there, though that indent function doesn't do complex loop, or indeed define-vop, terribly well. Cheers, Christophe |
From: Thiemo S. <th...@ne...> - 2005-06-10 17:38:21
|
Christophe Rhodes wrote: > Thiemo Seufer <th...@ne...> writes: > > > Christophe Rhodes wrote: > >> Thiemo Seufer <th...@ne...> writes: > >> > >> > the appended patch implements branch relaxation in the mips port > >> > for branches >18 bits. It also fixes the dependency declarations > >> > for some branch instructions. > >> > >> Thank you; merged in sbcl-0.9.1.36. > > > > A small followup patch, whic uses "when" instead of "if". > > > > + (when (= opcode bcond-op) > > + (when (logand r2 #b10000) > > + (progn (setf r2 (logand r2 #b01111)) > > + (setf linked t)))) > > Ah, but... here the indentation is all wrong :-) Is this better? 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 10 Jun 2005 17:12:00 -0000 @@ -612,11 +612,11 @@ (emit-immediate-inst segment opcode (if (fixnump r1) - r1 - (reg-tn-encoding r1)) + r1 + (reg-tn-encoding r1)) (if (fixnump r2) - r2 - (reg-tn-encoding r2)) + r2 + (reg-tn-encoding r2)) (ash (- (label-position target) (+ posn 4)) -2)))) @@ -626,13 +626,13 @@ (let ((linked)) ;; invert branch condition (if (or (= opcode bcond-op) (= opcode cop1-op)) - (setf r2 (logxor r2 #b00001)) - (setf opcode (logxor opcode #b00001))) + (setf r2 (logxor r2 #b00001)) + (setf opcode (logxor opcode #b00001))) ;; check link flag - (if (= opcode bcond-op) - (if (logand r2 #b10000) - (progn (setf r2 (logand r2 #b01111)) - (setf linked t)))) + (when (= opcode bcond-op) + (when (logand r2 #b10000) + (progn (setf r2 (logand r2 #b01111)) + (setf linked t)))) (emit-immediate-inst segment opcode (if (fixnump r1) r1 (reg-tn-encoding r1)) |
From: Christophe R. <cs...@ca...> - 2005-06-11 14:33:37
|
Thiemo Seufer <th...@ne...> writes: >> > + (when (= opcode bcond-op) >> > + (when (logand r2 #b10000) >> > + (progn (setf r2 (logand r2 #b01111)) >> > + (setf linked t)))) >> >> Ah, but... here the indentation is all wrong :-) > > Is this better? > > (if (fixnump r2) > - r2 > - (reg-tn-encoding r2)) > + r2 > + (reg-tn-encoding r2)) I'm afraid not. :-) (if (foo) (bar) (baz)) is the right indentation in Common Lisp. In Emacs Lisp, it's (if (foo) (bar) (baz) (quux)) because the alternative branch of the conditional (but /not/ the consequent) has an "implicit progn"; but in Common Lisp, there is no implicit progn. As for (if (foo) (bar) (baz)) I'm afraid I don't know where that can come from. Cheers, Christophe |
From: Nikodemus S. <tsi...@cc...> - 2005-06-11 15:14:21
|
On Sat, 11 Jun 2005, Christophe Rhodes wrote: >> (if (fixnump r2) >> - r2 >> - (reg-tn-encoding r2)) >> + r2 >> + (reg-tn-encoding r2)) > (if (foo) > (bar) > (baz)) > > I'm afraid I don't know where that can come from. I did not try to apply the patch and check the results, but are you sure that's not just a combination of tabs and -/+? I've seen such strangeness before in diffs with source looking just right. ...which brings me to my actual point: the great detabification. I'd like to see it, how about others? Cheers, -- Nikodemus Schemer: "Buddha is small, clean, and serious." Lispnik: "Buddha is big, has hairy armpits, and laughs." |
From: William H. N. <wil...@ai...> - 2005-06-11 23:53:32
|
On Sat, Jun 11, 2005 at 06:13:51PM +0300, Nikodemus Siivola wrote: > On Sat, 11 Jun 2005, Christophe Rhodes wrote: > > >> (if (fixnump r2) > >>- r2 > >>- (reg-tn-encoding r2)) > >>+ r2 > >>+ (reg-tn-encoding r2)) > > >(if (foo) > > (bar) > > (baz)) > > > >I'm afraid I don't know where that can come from. > > I did not try to apply the patch and check the results, but are > you sure that's not just a combination of tabs and -/+? I've seen > such strangeness before in diffs with source looking just right. > > ...which brings me to my actual point: the great detabification. > I'd like to see it, how about others? I'm for it. As it happens, for a couple of weeks I have been running the experiment of putting ;;;; -*- mode: Lisp; indent-tabs-mode: nil -*- at the head of my actively edited local CL code. I encourage others to try it who, like me, don't have a global knowledge of Emacs behavior and aren't sure whether they'd be happy with INDENT-TABS-MODE=NIL. As far as I can see, it gets rid of some small annoyances without adding any new ones: not a big win, of course, but a small clear tidiness improvement. The one drawback I see is that by touching most of the lines of the code, detabification will tend to make it tricky to get "cvs annotate" information. For all I know it might already be a solved problem to do an ignore-whitespace version of "cvs annotate", but even if it isn't, I would cheerfully trade friction at "cvs annotate" time for less whitespace/indentation friction at diff/patch time. If people generally like the idea, the detabification should be trivial to do early in any release cycle. -- William Harold Newman <wil...@ai...> PGP key fingerprint 85 CE 1C BA 79 8D 51 8C B9 25 FB EE E0 C3 E5 7C Ubi saeva indignatio ulterius cor lacerare nequit. -- Jonathan Swift's epitaph |
From: <me...@ho...> - 2005-06-12 08:09:41
|
So it's not just me. Yes, kill them all. While we're at it what about nuke-trailing-spaces? Oh, and a cvs hook script that checks for tabs in lisp files and refuses the commit or at least warns? Gabor |
From: William H. N. <wil...@ai...> - 2005-06-12 13:10:44
|
On Sun, Jun 12, 2005 at 10:10:17AM +0200, G?bor Melis wrote: > So it's not just me. Yes, kill them all. While we're at it what about > nuke-trailing-spaces? Oh, and a cvs hook script that checks for tabs in lisp > files and refuses the commit or at least warns? "Yes" and "mostly yes" IMO. On a flag day when we we're tweaking whitespace everywhere in the source anyway, we might as well tidy the ends of lines too. And I don't know how easy a CVS hook script is; if easy and clean, then fine, otherwise a 95% solution might be to put a test for whitespace anomalies into the scripts we run for testing, or a 90% solution could be just to retidy the sources manually when we notice that checkins have added anomalies, more or less as we might notice and fix spelling and punctuation errors. Actually, I suppose "y'all" currently seems rather more correct than "we" but someday I might actually be able to return to doing more production coding than prototype incremental algorithm flailing, so I like to keep my options open...:-| -- William Harold Newman <wil...@ai...> PGP key fingerprint 85 CE 1C BA 79 8D 51 8C B9 25 FB EE E0 C3 E5 7C Ubi saeva indignatio ulterius cor lacerare nequit. -- Jonathan Swift's epitaph |
From: William H. N. <wil...@ai...> - 2005-06-27 23:48:49
|
I tentatively plan to detabify the system sources (and delete trailing whitespace, too) late this week. I doubt it will be a significant problem even for people with large unmerged changes in their local source trees, because it should be easy to run detabification scripts on one's local tree, then merge. Probably whatever scripts I use will end up in tools-for-build and be applicable to people's local trees. The worst headache I can think of is for people with big unmerged patches with lots of tabs in them, but ISTR that CVS already has some support for ignoring whitespace differences, so this problem might be soluble even without desperate Perl hackery. Anyway, anyone who might be hit by these issues, or by other issues I haven't thought of, should feel free to speak up and suggest a convenient date, or anything else I might do to minimize friction. -- William Harold Newman <wil...@ai...> PGP key fingerprint 85 CE 1C BA 79 8D 51 8C B9 25 FB EE E0 C3 E5 7C Ubi saeva indignatio ulterius cor lacerare nequit. -- Jonathan Swift's epitaph |
From: Nikodemus S. <nik...@ra...> - 2005-06-28 09:40:29
|
On Mon, 27 Jun 2005, William Harold Newman wrote: > Anyway, anyone who might be hit by these issues, or by other issues I > haven't thought of, should feel free to speak up and suggest a > convenient date, or anything else I might do to minimize friction. Tagging the undetabified last version might be a good idea to allow easy peeks beyond it with cvs annotate. Cheers, -- Nikodemus Schemer: "Buddha is small, clean, and serious." Lispnik: "Buddha is big, has hairy armpits, and laughs." |
From: <me...@ho...> - 2005-06-29 20:25:48
|
Some time ago I experimented with a setup that nuked all trailing spaces in= =20 lisp files. (add-hook 'lisp-mode-hook '(lambda () (add-hook 'write-contents-hooks 'nuke-trailing-whitespace))) Needless to say it was a major hassle to keep my patches reasonable looking= =20 and it was soon commented out in my .emacs. Now that sbcl is getting tidy I= =20 would like to turn it on again, but other projects are likely to take some= =20 time to follow the trend ;-) so a mode specific setting doesn't cut it. Local customization for an entire directory tree is needed and this is what= =20 dirvars does. Debian has it in the emacs-goodies-el package, but=20 unfortunately that version does not have 'eval:' support. This one has: http://www.lifev.org/documentation/codingstandards/dirvars.el C mode indentation could be set to 4 spaces (I normally use two),=20 nuke-trailing-spaces in lisp files, set indent-tabs-mode to nil, ... End of tale. Cheers, G=E1bor |
From: <me...@ho...> - 2005-07-13 12:15:42
Attachments:
dirvars.el
.emacs-dirvars
|
On Wednesday 29 June 2005 22:24, G=E1bor Melis wrote: > Some time ago I experimented with a setup that nuked all trailing spaces > in > lisp files. > > (add-hook 'lisp-mode-hook > '(lambda () > (add-hook 'write-contents-hooks > 'nuke-trailing-whitespace))) > > Needless to say it was a major hassle to keep my patches reasonable > looking > and it was soon commented out in my .emacs. Now that sbcl is getting > tidy I > would like to turn it on again, but other projects are likely to take > some > time to follow the trend ;-) so a mode specific setting doesn't cut it. > > Local customization for an entire directory tree is needed and this is > what > dirvars does. Debian has it in the emacs-goodies-el package, but > unfortunately that version does not have 'eval:' support. This one has: > > http://www.lifev.org/documentation/codingstandards/dirvars.el > > C mode indentation could be set to 4 spaces (I normally use two), > nuke-trailing-spaces in lisp files, set indent-tabs-mode to nil, ... > > End of tale. > > Cheers, G=E1bor Continued, due to the overwhelming silence. Attached is a slightly hacked dirvars.el that has proper eval support=20 and .emacs-dirvars that should go into the sbcl dir. I have dirvars.el in=20 ~/.emacs.d/local/ and require it from my .emacs.=20 It is also a big security hole. |