summaryrefslogtreecommitdiff
path: root/pp.c
diff options
context:
space:
mode:
authorDan Sugalski <dan@sidhe.org>1999-08-10 09:34:56 -0700
committerJarkko Hietaniemi <jhi@iki.fi>1999-08-10 22:39:11 +0000
commitd28f7c377ae191ca53d9157f124642cf323614a0 (patch)
tree6c1a399c1e250f23c69dd5af823906a52a0e01c7 /pp.c
parent6da84e39ed5bfdbbe350321e38b2730554d2576c (diff)
downloadperl-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.c99
1 files changed, 38 insertions, 61 deletions
diff --git a/pp.c b/pp.c
index 8a0f0f7131..3cc975921d 100644
--- a/pp.c
+++ b/pp.c
@@ -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 {