Discussion:
[PATCH] libm round - fix for 16-bit CPU
Jon Beniston
2018-06-20 16:04:32 UTC
Permalink
Hi,

The following is a patch for round on 16-bit CPUs to avoid a shift being out
of range:

libm/common/s_round.c (round): Make constant long so shift isn't out of
range on 16-bit CPUs

---
newlib/libm/common/s_round.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/newlib/libm/common/s_round.c b/newlib/libm/common/s_round.c
index 047574a84..f0926d85f 100644
--- a/newlib/libm/common/s_round.c
+++ b/newlib/libm/common/s_round.c
@@ -68,7 +68,7 @@ SEEALSO
msw &= 0x80000000;
if (exponent_less_1023 == -1)
/* Result is +1.0 or -1.0. */
- msw |= (1023 << 20);
+ msw |= (1023L << 20);
lsw = 0;
}
else
--
2.15.1
Craig Howland
2018-06-20 16:22:28 UTC
Permalink
Post by Jon Beniston
Hi,
The following is a patch for round on 16-bit CPUs to avoid a shift being out
libm/common/s_round.c (round): Make constant long so shift isn't out of
range on 16-bit CPUs
---
newlib/libm/common/s_round.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/newlib/libm/common/s_round.c b/newlib/libm/common/s_round.c
index 047574a84..f0926d85f 100644
--- a/newlib/libm/common/s_round.c
+++ b/newlib/libm/common/s_round.c
@@ -68,7 +68,7 @@ SEEALSO
msw &= 0x80000000;
if (exponent_less_1023 == -1)
/* Result is +1.0 or -1.0. */
- msw |= (1023 << 20);
+ msw |= (1023L << 20);
lsw = 0;
}
else
Might it be slightly better to use a cast with the type of msw? While it would
probably make no difference on any 16-bit target, it could prevent an
intermediate change to 64 bits instead of 32 on some targets.  So

+ msw |= (((__int32_t)1023 << 20);

(Or, better for maintenance, but not as portable with a GCC extension:

+ msw |= (((typeof(msw))1023 << 20);
(There do seem to be multiple uses of typeof already, although the first few I checked are all gated with validity checks. So probably not appropriate as shown here.))

Craig
Jon Beniston
2018-06-20 19:47:24 UTC
Permalink
Hi Craig,
Post by Craig Howland
Might it be slightly better to use a cast with the type of msw?
Yep.

From: Jon Beniston <***@beniston.com>
Date: Wed, 20 Jun 2018 20:45:01 +0100
Subject: [PATCH] libm/common/s_round.c (round): Add cast for 16-bit CPUs

---
newlib/libm/common/s_round.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/newlib/libm/common/s_round.c b/newlib/libm/common/s_round.c
index f0926d85f..e3a91d6c2 100644
--- a/newlib/libm/common/s_round.c
+++ b/newlib/libm/common/s_round.c
@@ -68,7 +68,7 @@ SEEALSO
msw &= 0x80000000;
if (exponent_less_1023 == -1)
/* Result is +1.0 or -1.0. */
- msw |= (1023 << 20);
+ msw |= ((__int32_t)1023 << 20);
lsw = 0;
}
else
--
2.15.1
Corinna Vinschen
2018-06-21 07:35:25 UTC
Permalink
Post by Jon Beniston
Date: Wed, 20 Jun 2018 20:45:01 +0100
Subject: [PATCH] libm/common/s_round.c (round): Add cast for 16-bit CPUs
---
newlib/libm/common/s_round.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/newlib/libm/common/s_round.c b/newlib/libm/common/s_round.c
index f0926d85f..e3a91d6c2 100644
--- a/newlib/libm/common/s_round.c
+++ b/newlib/libm/common/s_round.c
@@ -68,7 +68,7 @@ SEEALSO
msw &= 0x80000000;
if (exponent_less_1023 == -1)
/* Result is +1.0 or -1.0. */
- msw |= (1023 << 20);
+ msw |= ((__int32_t)1023 << 20);
lsw = 0;
}
else
--
2.15.1
Pushed.


Thanks,
Corinna
--
Corinna Vinschen
Cygwin Maintainer
Red Hat
Loading...