diff options
author | Dan Sugalski <dan@sidhe.org> | 1999-08-10 09:34:56 -0700 |
---|---|---|
committer | Jarkko Hietaniemi <jhi@iki.fi> | 1999-08-10 22:39:11 +0000 |
commit | d28f7c377ae191ca53d9157f124642cf323614a0 (patch) | |
tree | 6c1a399c1e250f23c69dd5af823906a52a0e01c7 /pp.c | |
parent | 6da84e39ed5bfdbbe350321e38b2730554d2576c (diff) | |
download | perl-d28f7c377ae191ca53d9157f124642cf323614a0.tar.gz |
Patches needed to get _60 building with
To: vmsperl@perl.org, perl5-porters@perl.org,
sarathy@activestate.com, bailey@newman.upenn.edu
threads on VMS
Message-ID: <Pine.LNX.4.10.9908101631030.18266-100000@tuatha.sidhe.org>
p4raw-id: //depot/cfgperl@3955
Diffstat (limited to 'pp.c')
-rw-r--r-- | pp.c | 99 |
1 files changed, 38 insertions, 61 deletions
@@ -28,37 +28,6 @@ static double UV_MAX_cxux = ((double)UV_MAX); #endif /* - * Types used in bitwise operations. - * - * Normally we'd just use IV and UV. However, some hardware and - * software combinations (e.g. Alpha and current OSF/1) don't have a - * floating-point type to use for NV that has adequate bits to fully - * hold an IV/UV. (In other words, sizeof(long) == sizeof(double).) - * - * It just so happens that "int" is the right size almost everywhere. - */ -typedef int IBW; -typedef unsigned UBW; - -/* - * Mask used after bitwise operations. - * - * There is at least one realm (Cray word machines) that doesn't - * have an integral type (except char) small enough to be represented - * in a double without loss; that is, it has no 32-bit type. - */ -#if LONGSIZE > 4 && defined(_CRAY) && !defined(_CRAYMPP) -# define BW_BITS 32 -# define BW_MASK ((1 << BW_BITS) - 1) -# define BW_SIGN (1 << (BW_BITS - 1)) -# define BWi(i) (((i) & BW_SIGN) ? ((i) | ~BW_MASK) : ((i) & BW_MASK)) -# define BWu(u) ((u) & BW_MASK) -#else -# define BWi(i) (i) -# define BWu(u) (u) -#endif - -/* * Offset for integer pack/unpack. * * On architectures where I16 and I32 aren't really 16 and 32 bits, @@ -931,6 +900,7 @@ PP(pp_pow) PP(pp_multiply) { djSP; dATARGET; tryAMAGICbin(mult,opASSIGN); + tryIVIVbin(*); { dPOPTOPnnrl; SETn( left * right ); @@ -941,6 +911,16 @@ PP(pp_multiply) PP(pp_divide) { djSP; dATARGET; tryAMAGICbin(div,opASSIGN); + if (TOPIOKbin) { + dPOPTOPiirl_ul; + if (right == 0) + DIE(aTHX_ "Illegal division by zero"); + if ((left % right) && !(PL_op->op_private & HINT_INTEGER)) + SETn( (NV)left / (NV)right ); + else + SETi( left / right ); + RETURN; + } { dPOPPOPnnrl; NV value; @@ -1120,6 +1100,7 @@ PP(pp_repeat) PP(pp_subtract) { djSP; dATARGET; tryAMAGICbin(subtr,opASSIGN); + tryIVIVbin(-); { dPOPTOPnnrl_ul; SETn( left - right ); @@ -1131,16 +1112,14 @@ PP(pp_left_shift) { djSP; dATARGET; tryAMAGICbin(lshift,opASSIGN); { - IBW shift = POPi; + IV shift = POPi; if (PL_op->op_private & HINT_INTEGER) { - IBW i = TOPi; - i = BWi(i) << shift; - SETi(BWi(i)); + IV i = TOPi; + SETi(i << shift); } else { - UBW u = TOPu; - u <<= shift; - SETu(BWu(u)); + UV u = TOPu; + SETu(u << shift); } RETURN; } @@ -1150,16 +1129,14 @@ PP(pp_right_shift) { djSP; dATARGET; tryAMAGICbin(rshift,opASSIGN); { - IBW shift = POPi; + IV shift = POPi; if (PL_op->op_private & HINT_INTEGER) { - IBW i = TOPi; - i = BWi(i) >> shift; - SETi(BWi(i)); + IV i = TOPi; + SETi(i >> shift); } else { - UBW u = TOPu; - u >>= shift; - SETu(BWu(u)); + UV u = TOPu; + SETu(u >> shift); } RETURN; } @@ -1329,12 +1306,12 @@ PP(pp_bit_and) dPOPTOPssrl; if (SvNIOKp(left) || SvNIOKp(right)) { if (PL_op->op_private & HINT_INTEGER) { - IBW value = SvIV(left) & SvIV(right); - SETi(BWi(value)); + IV value = SvIV(left) & SvIV(right); + SETi(value); } else { - UBW value = SvUV(left) & SvUV(right); - SETu(BWu(value)); + UV value = SvUV(left) & SvUV(right); + SETu(value); } } else { @@ -1352,12 +1329,12 @@ PP(pp_bit_xor) dPOPTOPssrl; if (SvNIOKp(left) || SvNIOKp(right)) { if (PL_op->op_private & HINT_INTEGER) { - IBW value = (USE_LEFT(left) ? SvIV(left) : 0) ^ SvIV(right); - SETi(BWi(value)); + IV value = (USE_LEFT(left) ? SvIV(left) : 0) ^ SvIV(right); + SETi(value); } else { - UBW value = (USE_LEFT(left) ? SvUV(left) : 0) ^ SvUV(right); - SETu(BWu(value)); + UV value = (USE_LEFT(left) ? SvUV(left) : 0) ^ SvUV(right); + SETu(value); } } else { @@ -1375,12 +1352,12 @@ PP(pp_bit_or) dPOPTOPssrl; if (SvNIOKp(left) || SvNIOKp(right)) { if (PL_op->op_private & HINT_INTEGER) { - IBW value = (USE_LEFT(left) ? SvIV(left) : 0) | SvIV(right); - SETi(BWi(value)); + IV value = (USE_LEFT(left) ? SvIV(left) : 0) | SvIV(right); + SETi(value); } else { - UBW value = (USE_LEFT(left) ? SvUV(left) : 0) | SvUV(right); - SETu(BWu(value)); + UV value = (USE_LEFT(left) ? SvUV(left) : 0) | SvUV(right); + SETu(value); } } else { @@ -1441,12 +1418,12 @@ PP(pp_complement) dTOPss; if (SvNIOKp(sv)) { if (PL_op->op_private & HINT_INTEGER) { - IBW value = ~SvIV(sv); - SETi(BWi(value)); + IV value = ~SvIV(sv); + SETi(value); } else { - UBW value = ~SvUV(sv); - SETu(BWu(value)); + UV value = ~SvUV(sv); + SETu(value); } } else { |