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/machine/spu/headers/nextafterd2.h')
-rw-r--r--newlib/libm/machine/spu/headers/nextafterd2.h15
1 files changed, 13 insertions, 2 deletions
diff --git a/newlib/libm/machine/spu/headers/nextafterd2.h b/newlib/libm/machine/spu/headers/nextafterd2.h
index 78238487a..9a9e0247d 100644
--- a/newlib/libm/machine/spu/headers/nextafterd2.h
+++ b/newlib/libm/machine/spu/headers/nextafterd2.h
@@ -74,10 +74,13 @@
static __inline vector double _nextafterd2(vector double x, vector double y)
{
vec_double2 n1ulp = (vec_double2)spu_splats(0x8000000000000001ull);
+ vector unsigned char mov_carry = {0x80,0x80,0x80, 7, 0x80,0x80,0x80,0x80,
+ 0x80,0x80,0x80,15, 0x80,0x80,0x80,0x80};
vec_double2 zerod = spu_splats(0.0);
vec_llong2 one = spu_splats(1ll);
vec_ullong2 xlt0, xgty, xeqy, xeq0;
vec_llong2 xllong;
+ vec_int4 carry;
vec_llong2 delta, deltap1;
vec_double2 result;
@@ -102,10 +105,18 @@ static __inline vector double _nextafterd2(vector double x, vector double y)
/* Determine value to add to x */
delta = (vec_llong2)spu_xor(xgty, xlt0);
- deltap1 = delta + one;
+
+ //deltap1 = delta + one;
+ carry = spu_genc((vec_int4)delta, (vec_int4)one);
+ carry = spu_shuffle(carry, carry, mov_carry);
+ deltap1 = (vec_llong2)spu_addx((vec_int4)delta, (vec_int4)one, (vec_int4)carry);
+
delta = spu_sel(deltap1, delta, (vec_ullong2)delta);
- xllong = xllong + delta;
+ //xllong = xllong + delta;
+ carry = spu_genc((vec_int4)xllong, (vec_int4)delta);
+ carry = spu_shuffle(carry, carry, mov_carry);
+ xllong = (vec_llong2)spu_addx((vec_int4)xllong, (vec_int4)delta, (vec_int4)carry);
/* Fix the case of x = 0, and answer should be -1 ulp */
result = spu_sel((vec_double2)xllong, n1ulp, spu_and((vec_ullong2)delta, xeq0));