From: Nathan F. <fr...@gm...> - 2010-01-26 02:06:29
|
Christophe said in: https://bugs.launchpad.net/sbcl/+bug/489388 that he would accept a tested and reviewed patch that fixes the issue described therein. The patch below (a little late, but hey...) enables inlining %UNARY-TRUNCATE/*-FLOAT when the argument has an appropriate range. It tests fine; a review would be appreciated. -Nathan diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp index 7421fd7..f084086 100644 --- a/src/compiler/srctran.lisp +++ b/src/compiler/srctran.lisp @@ -1789,6 +1789,16 @@ #'%unary-truncate-derive-type-aux #'%unary-truncate)) +(defoptimizer (%unary-truncate/single-float derive-type) ((number)) + (one-arg-derive-type number + #'%unary-truncate-derive-type-aux + #'%unary-truncate)) + +(defoptimizer (%unary-truncate/double-float derive-type) ((number)) + (one-arg-derive-type number + #'%unary-truncate-derive-type-aux + #'%unary-truncate)) + (defoptimizer (%unary-ftruncate derive-type) ((number)) (let ((divisor (specifier-type '(integer 1 1)))) (one-arg-derive-type number |
From: JTK <je...@gm...> - 2010-01-26 03:03:13
|
Thank you very much. This patch seemed to do the trick on a ppc G5. Please ignore my previous email concerning the kludgier fix. This is the first time that FLOOR and CEILING and ROUND all inline nicely. Jan On Mon, Jan 25, 2010 at 3:43 PM, Nathan Froyd <fr...@gm...> wrote: > Christophe said in: > > https://bugs.launchpad.net/sbcl/+bug/489388 > > that he would accept a tested and reviewed patch that fixes the issue > described therein. The patch below (a little late, but hey...) > enables inlining %UNARY-TRUNCATE/*-FLOAT when the argument has an > appropriate range. It tests fine; a review would be appreciated. > > -Nathan > > diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp > index 7421fd7..f084086 100644 > --- a/src/compiler/srctran.lisp > +++ b/src/compiler/srctran.lisp > @@ -1789,6 +1789,16 @@ > #'%unary-truncate-derive-type-aux > #'%unary-truncate)) > > +(defoptimizer (%unary-truncate/single-float derive-type) ((number)) > + (one-arg-derive-type number > + #'%unary-truncate-derive-type-aux > + #'%unary-truncate)) > + > +(defoptimizer (%unary-truncate/double-float derive-type) ((number)) > + (one-arg-derive-type number > + #'%unary-truncate-derive-type-aux > + #'%unary-truncate)) > + > (defoptimizer (%unary-ftruncate derive-type) ((number)) > (let ((divisor (specifier-type '(integer 1 1)))) > (one-arg-derive-type number > > > ------------------------------------------------------------------------------ > The Planet: dedicated and managed hosting, cloud storage, colocation > Stay online with enterprise data centers and the best network in the > business > Choose flexible plans and management services without long-term contracts > Personal 24x7 support from experience hosting pros just a phone call away. > http://p.sf.net/sfu/theplanet-com > _______________________________________________ > Sbcl-devel mailing list > Sbc...@li... > https://lists.sourceforge.net/lists/listinfo/sbcl-devel > |
From: Paul K. <pv...@pv...> - 2010-01-26 14:32:48
|
On 2010-01-25, at 8:43 PM, Nathan Froyd wrote: > The patch below (a little late, but hey...) > enables inlining %UNARY-TRUNCATE/*-FLOAT when the argument has an > appropriate range. It tests fine; a review would be appreciated. > > -Nathan > > diff --git a/src/compiler/srctran.lisp b/src/compiler/srctran.lisp > index 7421fd7..f084086 100644 > --- a/src/compiler/srctran.lisp > +++ b/src/compiler/srctran.lisp > @@ -1789,6 +1789,16 @@ > #'%unary-truncate-derive-type-aux > #'%unary-truncate)) > > +(defoptimizer (%unary-truncate/single-float derive-type) ((number)) > + (one-arg-derive-type number > + #'%unary-truncate-derive-type-aux > + #'%unary-truncate)) > + > +(defoptimizer (%unary-truncate/double-float derive-type) ((number)) > + (one-arg-derive-type number > + #'%unary-truncate-derive-type-aux > + #'%unary-truncate)) > + > (defoptimizer (%unary-ftruncate derive-type) ((number)) > (let ((divisor (specifier-type '(integer 1 1)))) > (one-arg-derive-type number Looks fine to me. There's a similar issue with %unary-round. How does the following look like? (defoptimizer (%unary-round derive-type) ((number)) (one-arg-derive-type number (lambda (n) (block nil (unless (numeric-type-real-p n) (return *empty-type*)) (let* ((interval (numeric-type->interval n)) (low (interval-low interval)) (high (interval-high interval))) (specifier-type `(integer ,(if low (round low) '*) ,(if high (round high) '*)))))) #'%unary-round)) While looking at the disassembly, I noticed that we take care not to convert integers to floats from a register on x86-64 (so we only cvtsi2sd xmm, m64, for instance). That seems to be a copy/paste thinko from the x86 backend (x86-64/float.lisp:L1040). Paul Khuong |
From: Nathan F. <fr...@gm...> - 2010-01-26 15:03:46
|
On Tue, Jan 26, 2010 at 9:32 AM, Paul Khuong <pv...@pv...> wrote: > On 2010-01-25, at 8:43 PM, Nathan Froyd wrote: >> The patch below (a little late, but hey...) >> enables inlining %UNARY-TRUNCATE/*-FLOAT when the argument has an >> appropriate range. It tests fine; a review would be appreciated. > > Looks fine to me. Thanks. I wrote a testcase for compiler.pure.lisp's :TRUNCATE-FLOAT test with the semi-obvious extension from GENERIC to UNARY-TRUNCATE. I'll include that too. > There's a similar issue with %unary-round. How does the following look like? > > (defoptimizer (%unary-round derive-type) ((number)) > (one-arg-derive-type number > (lambda (n) > (block nil > (unless (numeric-type-real-p n) > (return *empty-type*)) > (let* ((interval (numeric-type->interval n)) > (low (interval-low interval)) > (high (interval-high interval))) > (specifier-type > `(integer ,(if low > (round low) > '*) > ,(if high > (round high) > '*)))))) > #'%unary-round)) I think this looks reasonable. > While looking at the disassembly, I noticed that we take care not to convert integers to floats from a register on x86-64 (so we only cvtsi2sd xmm, m64, for instance). That seems to be a copy/paste thinko from the x86 backend (x86-64/float.lisp:L1040). Yeah, I noticed that too. I'll fix that in a separate commit unless you beat me to it. (Have a patch already, it's pretty easy.) -Nathan |