Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libm')
-rw-r--r--newlib/libm/common/s_llrint.c31
-rw-r--r--newlib/libm/common/s_lrint.c31
-rw-r--r--newlib/libm/common/sf_llrint.c6
-rw-r--r--newlib/libm/common/sf_lrint.c6
4 files changed, 26 insertions, 48 deletions
diff --git a/newlib/libm/common/s_llrint.c b/newlib/libm/common/s_llrint.c
index 72452dbe9..f2c48766e 100644
--- a/newlib/libm/common/s_llrint.c
+++ b/newlib/libm/common/s_llrint.c
@@ -66,26 +66,17 @@ long long int
if(j0 < 20)
{
/* j0 in [-1023,19] */
- if(j0 < -1)
- return 0;
- else
- {
- /* j0 in [0,19] */
- /* shift amt in [0,19] */
- w = TWO52[sx] + x;
- t = w - TWO52[sx];
- GET_HIGH_WORD(i0, t);
- /* Detect the all-zeros representation of plus and
- minus zero, which fails the calculation below. */
- if ((i0 & ~((__int32_t)1 << 31)) == 0)
- return 0;
- /* After round: j0 in [0,20] */
- j0 = ((i0 & 0x7ff00000) >> 20) - 1023;
- i0 &= 0x000fffff;
- i0 |= 0x00100000;
- /* shift amt in [20,0] */
- result = i0 >> (20 - j0);
- }
+ w = TWO52[sx] + x;
+ t = w - TWO52[sx];
+ GET_HIGH_WORD(i0, t);
+ /* Detect the all-zeros representation of plus and
+ minus zero, which fails the calculation below. */
+ if ((i0 & ~((__int32_t)1 << 31)) == 0)
+ return 0;
+ j0 = ((i0 & 0x7ff00000) >> 20) - 1023;
+ i0 &= 0x000fffff;
+ i0 |= 0x00100000;
+ result = (j0 < 0 ? 0 : i0 >> (20 - j0));
}
else if (j0 < (int)(8 * sizeof (long long int)) - 1)
{
diff --git a/newlib/libm/common/s_lrint.c b/newlib/libm/common/s_lrint.c
index b37f50fd4..b37b93aff 100644
--- a/newlib/libm/common/s_lrint.c
+++ b/newlib/libm/common/s_lrint.c
@@ -103,26 +103,17 @@ TWO52[2]={
if(j0 < 20)
{
/* j0 in [-1023,19] */
- if(j0 < -1)
- return 0;
- else
- {
- /* j0 in [0,19] */
- /* shift amt in [0,19] */
- w = TWO52[sx] + x;
- t = w - TWO52[sx];
- GET_HIGH_WORD(i0, t);
- /* Detect the all-zeros representation of plus and
- minus zero, which fails the calculation below. */
- if ((i0 & ~(1L << 31)) == 0)
- return 0;
- /* After round: j0 in [0,20] */
- j0 = ((i0 & 0x7ff00000) >> 20) - 1023;
- i0 &= 0x000fffff;
- i0 |= 0x00100000;
- /* shift amt in [20,0] */
- result = i0 >> (20 - j0);
- }
+ w = TWO52[sx] + x;
+ t = w - TWO52[sx];
+ GET_HIGH_WORD(i0, t);
+ /* Detect the all-zeros representation of plus and
+ minus zero, which fails the calculation below. */
+ if ((i0 & ~(1L << 31)) == 0)
+ return 0;
+ j0 = ((i0 & 0x7ff00000) >> 20) - 1023;
+ i0 &= 0x000fffff;
+ i0 |= 0x00100000;
+ result = (j0 < 0 ? 0 : i0 >> (20 - j0));
}
else if (j0 < (int)(8 * sizeof (long int)) - 1)
{
diff --git a/newlib/libm/common/sf_llrint.c b/newlib/libm/common/sf_llrint.c
index 7558e89ac..905a5b21d 100644
--- a/newlib/libm/common/sf_llrint.c
+++ b/newlib/libm/common/sf_llrint.c
@@ -60,9 +60,7 @@ TWO23[2]={
if (j0 < (int)(sizeof (long long int) * 8) - 1)
{
- if (j0 < -1)
- return 0;
- else if (j0 >= 23)
+ if (j0 >= 23)
result = (long long int) ((i0 & 0x7fffff) | 0x800000) << (j0 - 23);
else
{
@@ -76,7 +74,7 @@ TWO23[2]={
j0 = ((i0 >> 23) & 0xff) - 0x7f;
i0 &= 0x7fffff;
i0 |= 0x800000;
- result = i0 >> (23 - j0);
+ result = (j0 < 0 ? 0 : i0 >> (23 - j0));
}
}
else
diff --git a/newlib/libm/common/sf_lrint.c b/newlib/libm/common/sf_lrint.c
index 3c58c5d10..7fe47aefb 100644
--- a/newlib/libm/common/sf_lrint.c
+++ b/newlib/libm/common/sf_lrint.c
@@ -60,9 +60,7 @@ TWO23[2]={
if (j0 < (int)(sizeof (long int) * 8) - 1)
{
- if (j0 < -1)
- return 0;
- else if (j0 >= 23)
+ if (j0 >= 23)
result = (long int) ((i0 & 0x7fffff) | 0x800000) << (j0 - 23);
else
{
@@ -76,7 +74,7 @@ TWO23[2]={
j0 = ((i0 >> 23) & 0xff) - 0x7f;
i0 &= 0x7fffff;
i0 |= 0x800000;
- result = i0 >> (23 - j0);
+ result = (j0 < 0 ? 0 : i0 >> (23 - j0));
}
}
else