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