develooper Front page | perl.perl5.porters | Postings from November 2000

Re: pp_add -> pp_i_add efficiency hack?

Thread Previous | Thread Next
From:
Jarkko Hietaniemi
Date:
November 11, 2000 17:13
Subject:
Re: pp_add -> pp_i_add efficiency hack?
Message ID:
20001111191306.A4826@chaos.wustl.edu
Here's a patch for some of my latest attempts.  Seems to only fool
with pp_add and pp_multiply, and not necessarily a fully functional
one, so caveat patchor.

==== //depot/perl/pod/perlapi.pod#26 - /u/vieraat/vieraat/jhi/pp4/perl/pod/perlapi.pod ====
==== //depot/perl/pp.c#203 - /u/vieraat/vieraat/jhi/pp4/perl/pp.c ====
Index: perl/pp.c
--- perl/pp.c.~1~	Mon Sep 11 02:34:37 2000
+++ perl/pp.c	Mon Sep 11 02:34:37 2000
@@ -928,10 +928,105 @@
 PP(pp_multiply)
 {
     djSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
+#ifdef PRESERVE_UV
+    if (SvIOK(TOPs) && SvIOK(TOPm1s)) {
+	bool auvok = SvUOK(TOPm1s);
+	bool buvok = SvUOK(TOPs);
+
+	if (!auvok) {
+	    IV aiv = SvIVx(TOPm1s);
+
+	    if (!buvok) {	/* IV * IV */
+		IV biv = SvIVx(TOPs);
+
+		if (aiv < 0 == biv < 0) { /* same side of zero */
+		    if (biv == 0 || aiv <= IV_MAX / biv) {
+			SP--;
+			SETi( aiv * biv );
+			RETURN;
+		    }
+		    if (aiv >= 0 && (UV)aiv <= UV_MAX / (UV)biv) {
+			SP--;
+			SETu( (UV)aiv * (UV)biv );
+			RETURN;
+		    }
+		    if (aiv > IV_MIN && biv > IV_MIN &&
+			(UV)-aiv <= UV_MAX / (UV)-aiv) {
+			SP--;
+			SETu( (UV)-aiv * (UV)-biv );
+			RETURN;
+		    }
+		}
+		else {
+		    if (biv == 0 || aiv >= IV_MIN / biv) {
+			SP--;
+			SETi( aiv * biv );
+			RETURN;
+		    }
+		}
+	    }
+	    else {		/* IV * UV */
+		UV buv = SvUVx(TOPs);
+
+		if (buv <= (UV)IV_MAX) { 
+		    if (buv == 0 || aiv >= 0 && aiv <= IV_MAX / (IV)buv) {
+			SP--;
+			SETi( aiv * (IV)buv );
+			RETURN;
+		    }
+		    if (aiv <= 0 && aiv >= IV_MIN / (IV)buv) {
+			SP--;
+			SETi( aiv * (IV)buv );
+			RETURN;
+		    }
+		    if (aiv > 0 && (UV)aiv <= UV_MAX / buv) {
+			SP--;
+			SETu( (UV)aiv * buv );
+			RETURN;
+		    }
+		}
+	    }
+	}
+	else {
+	    UV auv = SvUVx(TOPm1s);
+
+	    if (!buvok) {	/* UV * IV */
+		IV biv = SvIVx(TOPs);
+
+		if (auv <= (UV)IV_MAX) {
+		    if (auv == 0 || biv >= 0 && biv <= IV_MAX / (IV)auv) {
+			SP--;
+			SETi( (IV)auv * biv );
+			RETURN;
+		    }
+		    if (biv <= 0 && biv >= IV_MIN / (IV)auv) {
+			SP--;
+			SETi( (IV)auv * biv );
+			RETURN;
+		    }
+		    if (biv > 0 && auv <= UV_MAX / (UV)biv) {
+			SP--;
+			SETu( auv * (UV)biv );
+			RETURN;
+		    }
+		}
+	    }
+	    else {		/* UV * UV */
+		UV buv = SvUVx(TOPs);
+		
+		if (buv == 0 || auv <= UV_MAX / buv) {
+		    SP--;
+		    SETu( auv * buv );
+		    RETURN;
+		}
+	    }
+	}
+    }
+#endif
     {
-      dPOPTOPnnrl;
-      SETn( left * right );
-      RETURN;
+	dPOPTOPnnrl;
+	SETn( left * right );
+	RETURN;
     }
 }
 
==== //depot/perl/pp.h#33 - /u/vieraat/vieraat/jhi/pp4/perl/pp.h ====
Index: perl/pp.h
--- perl/pp.h.~1~	Mon Sep 11 02:34:37 2000
+++ perl/pp.h	Mon Sep 11 02:34:37 2000
@@ -126,6 +126,7 @@
 #endif
 
 #define TOPs		(*sp)
+#define TOPm1s		(*(sp-1))
 #define TOPp		(SvPV(TOPs, PL_na))		/* deprecated */
 #define TOPpx		(SvPV(TOPs, n_a))
 #define TOPn		(SvNV(TOPs))
@@ -137,6 +138,9 @@
 #define TOPq		((Quad_t)SvIV(TOPs))
 #define TOPuq		((Uquad_t)SvUV(TOPs))
 #endif
+
+/* Try to preserv IVness/UVness in basic arith ops. */
+#undef PRESERVE_IVUV
 
 /* Go to some pains in the rare event that we must extend the stack. */
 
==== //depot/perl/pp_hot.c#185 - /u/vieraat/vieraat/jhi/pp4/perl/pp_hot.c ====
Index: perl/pp_hot.c
--- perl/pp_hot.c.~1~	Mon Sep 11 02:34:37 2000
+++ perl/pp_hot.c	Mon Sep 11 02:34:37 2000
@@ -307,10 +307,105 @@
 PP(pp_add)
 {
     djSP; dATARGET; tryAMAGICbin(add,opASSIGN);
+#ifdef PRESERVE_IVUV
+    if (SvIOK(TOPs) && SvIOK(TOPm1s)) {
+	bool auvok = SvUOK(TOPm1s);
+	bool buvok = SvUOK(TOPs);
+
+	if (!auvok) {
+	    IV aiv = SvIVx(TOPm1s);
+	    
+	    if (!buvok) {		/* IV + IV */
+		IV biv = SvIVx(TOPs);
+
+		if (biv >= 0) {
+		    if (aiv <= IV_MAX - biv) {
+			SP--;
+			SETi( aiv + biv );
+			RETURN;
+		    }
+		    if (aiv >= 0 && (UV)aiv <= UV_MAX - (UV)biv) {
+			SP--;
+			SETu( (UV)aiv + (UV)biv );
+			RETURN;
+		    }
+		}		
+		else { /* biv < 0 */
+		    if (aiv >= IV_MIN - biv) {
+			SP--;
+			SETi( aiv + biv );
+			RETURN;
+		    }
+		}
+	    }
+	    else {			/* IV + UV */
+		UV buv = SvUVx(TOPs);
+
+		if (aiv <= 0 && buv < -aiv) {
+		    SP--;
+		    SETi( aiv + (IV)buv );
+		    RETURN;
+		}
+		if ((IV)buv <= IV_MAX && aiv <= IV_MAX - (IV)buv) {
+		    SP--;
+		    SETi( aiv + (IV)buv );
+		    RETURN;
+		}
+		if (aiv >= 0 && (UV)aiv <= UV_MAX - buv) {
+		    SP--;
+		    SETu( (UV)aiv + buv );
+		    RETURN;
+		}
+		if (aiv < 0 && (UV)-aiv <= UV_MAX - buv) {
+		    SP--;
+		    SETu( buv - (UV)-aiv );
+		    RETURN;
+		}
+	    }
+	}
+	else { /* auvok */
+	    UV auv = SvUVx(TOPm1s);
+
+	    if (!buvok) {		/* UV + IV */
+		IV biv = SvIVx(TOPs);
+
+		if (biv <= 0 && auv < -biv) {
+		    SP--;
+		    SETi( (IV)auv + biv );
+		    RETURN;
+		}
+		if ((IV)auv <= IV_MAX && biv <= IV_MAX - (IV)auv) {
+		    SP--;
+		    SETi( (IV)auv + biv );
+		    RETURN;
+		}
+		if (biv >= 0 && (UV)biv <= UV_MAX - auv) {
+		    SP--;
+		    SETu( auv + (UV)biv );
+		    RETURN;
+		}
+		if (biv < 0 && (UV)-biv <= UV_MAX - auv) {
+		    SP--;
+		    SETu( auv - (UV)-biv );
+		    RETURN;
+		}
+	    }
+	    else {			/* UV + UV */
+		UV buv = SvUVx(TOPs);
+
+		if (auv <= UV_MAX - buv) {
+		    SP--;
+		    SETu( auv + buv );
+		    RETURN;
+		}
+	    }
+	}
+    }
+#endif
     {
-      dPOPTOPnnrl_ul;
-      SETn( left + right );
-      RETURN;
+	dPOPTOPnnrl_ul;
+	SETn( left + right );
+	RETURN;
     }
 }
 
==== //depot/perl/sv.h#64 - /u/vieraat/vieraat/jhi/pp4/perl/sv.h ====
Index: perl/sv.h
--- perl/sv.h.~1~	Mon Sep 11 02:34:37 2000
+++ perl/sv.h	Mon Sep 11 02:34:37 2000
@@ -448,6 +448,9 @@
 =for apidoc Am|void|SvIOK_UV|SV* sv
 Returns a boolean indicating whether the SV contains an unsigned integer.
 
+=for apidoc Am|void|SvUOK|SV* sv
+Returns a boolean indicating whether the SV contains an unsigned integer.
+
 =for apidoc Am|void|SvIOK_notUV|SV* sv
 Returns a boolean indicating whether the SV contains an signed integer.
 
@@ -562,6 +565,7 @@
 
 #define SvIOK_UV(sv)		((SvFLAGS(sv) & (SVf_IOK|SVf_IVisUV))	\
 				 == (SVf_IOK|SVf_IVisUV))
+#define SvUOK(sv)		SvIOK_UV(sv)
 #define SvIOK_notUV(sv)		((SvFLAGS(sv) & (SVf_IOK|SVf_IVisUV))	\
 				 == SVf_IOK)
 
==== //depot/perl/t/lib/peek.t#12 - /u/vieraat/vieraat/jhi/pp4/perl/t/lib/peek.t ====
Index: perl/t/lib/peek.t
--- perl/t/lib/peek.t.~1~	Mon Sep 11 02:34:37 2000
+++ perl/t/lib/peek.t	Mon Sep 11 02:34:37 2000
@@ -88,10 +88,10 @@
 
 do_test( 6,
         $c + $d,
-'SV = NV\\($ADDR\\) at $ADDR
+'SV = IV\\($ADDR\\) at $ADDR
   REFCNT = 1
-  FLAGS = \\(PADTMP,NOK,pNOK\\)
-  NV = 456');
+  FLAGS = \\(PADTMP,IOK,pIOK\\)
+  IV = 456');
 
 ($d = "789") += 0.1;
 
@@ -154,12 +154,10 @@
       FLAGS = \\(IOK,pIOK\\)
       IV = 123
     Elt No. 1
-    SV = PVNV\\($ADDR\\) at $ADDR
+    SV = IV\\($ADDR\\) at $ADDR
       REFCNT = 1
-      FLAGS = \\(IOK,NOK,pIOK,pNOK\\)
-      IV = 456
-      NV = 456
-      PV = 0');
+      FLAGS = \\(IOK,pIOK\\)
+      IV = 456');
 
 do_test(12,
        {$b=>$c},
@@ -180,12 +178,10 @@
     RITER = -1
     EITER = 0x0
     Elt "123" HASH = $ADDR
-    SV = PVNV\\($ADDR\\) at $ADDR
+    SV = IV\\($ADDR\\) at $ADDR
       REFCNT = 1
-      FLAGS = \\(IOK,NOK,pIOK,pNOK\\)
-      IV = 456
-      NV = 456
-      PV = 0');
+      FLAGS = \\(IOK,pIOK\\)
+      IV = 456');
 
 do_test(13,
         sub(){@_},
End of Patch.


-- 
$jhi++; # http://www.iki.fi/jhi/
        # There is this special biologist word we use for 'stable'.
        # It is 'dead'. -- Jack Cohen

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About