diff options
author | Perl 5 Porters <perl5-porters@africa.nicoh.com> | 1996-09-03 17:49:22 -0400 |
---|---|---|
committer | Andy Dougherty <doughera@lafcol.lafayette.edu> | 1996-09-03 17:49:22 -0400 |
commit | 1e11cddc85856dc36c8916d69f33899971799644 (patch) | |
tree | 22112e7b8c00b8b66f7c5451856d39fcf702d517 /pp.c | |
parent | 303f2f76425edd3b59c90912b081ea27ca197620 (diff) | |
download | perl-1e11cddc85856dc36c8916d69f33899971799644.tar.gz |
perl 5.003_05: pp.c
Date: Fri, 23 Aug 1996 17:22:40 -0400 (EDT)
From: Chip Salzenberg <salzench@nielsenmedia.com>
Subject: Minor integer speedups in mathematics
This patch provides minor speedups by using integer math and SVt_IV
values when performing bitwise operations and modulus.
Date: Tue, 3 Sep 1996 17:49:22 -0400 (EDT)
From: Kenneth Albanowski <kjahds@kjahds.com>
Subject: Pack Patch (was Re: 5.002 - pack/unpack does not do "I" right)
(double)auint cast added for call to sv_setnv().
Diffstat (limited to 'pp.c')
-rw-r--r-- | pp.c | 44 |
1 files changed, 27 insertions, 17 deletions
@@ -687,19 +687,17 @@ PP(pp_modulo) { dSP; dATARGET; tryAMAGICbin(mod,opASSIGN); { - register unsigned long tmpulong; - register long tmplong; - I32 value; + register IV value; + register UV uval; - tmpulong = (unsigned long) POPn; - if (tmpulong == 0L) + uval = POPn; + if (!uval) DIE("Illegal modulus zero"); value = TOPn; - if (value >= 0.0) - value = (I32)(((unsigned long)value) % tmpulong); + if (value >= 0) + value = (UV)value % uval; else { - tmplong = (long)value; - value = (I32)(tmpulong - ((-tmplong - 1) % tmpulong)) - 1; + value = (uval - ((UV)(-value - 1) % uval)) - 1; } SETi(value); RETURN; @@ -926,7 +924,10 @@ PP(pp_bit_and) { if (SvNIOKp(left) || SvNIOKp(right)) { unsigned long value = U_L(SvNV(left)); value = value & U_L(SvNV(right)); - SETn((double)value); + if ((IV)value == value) + SETi(value); + else + SETn((double)value); } else { do_vop(op->op_type, TARG, left, right); @@ -944,7 +945,10 @@ PP(pp_bit_xor) if (SvNIOKp(left) || SvNIOKp(right)) { unsigned long value = U_L(SvNV(left)); value = value ^ U_L(SvNV(right)); - SETn((double)value); + if ((IV)value == value) + SETi(value); + else + SETn((double)value); } else { do_vop(op->op_type, TARG, left, right); @@ -962,7 +966,10 @@ PP(pp_bit_or) if (SvNIOKp(left) || SvNIOKp(right)) { unsigned long value = U_L(SvNV(left)); value = value | U_L(SvNV(right)); - SETn((double)value); + if ((IV)value == value) + SETi(value); + else + SETn((double)value); } else { do_vop(op->op_type, TARG, left, right); @@ -1019,11 +1026,11 @@ PP(pp_complement) register I32 anum; if (SvNIOKp(sv)) { - IV iv = ~SvIV(sv); - if (iv < 0) - SETn( (double) ~U_L(SvNV(sv)) ); + UV value = ~SvIV(sv); + if ((IV)value == value) + SETi(value); else - SETi( iv ); + SETn((double)value); } else { register char *tmps; @@ -2687,7 +2694,10 @@ PP(pp_unpack) Copy(s, &auint, 1, unsigned int); s += sizeof(unsigned int); sv = NEWSV(41, 0); - sv_setiv(sv, (I32)auint); + if (auint <= I32_MAX) + sv_setiv(sv, (I32)auint); + else + sv_setnv(sv, (double)auint); PUSHs(sv_2mortal(sv)); } } |