diff options
Diffstat (limited to 'newlib/libm/machine/spu/headers/nextafterd2.h')
-rw-r--r-- | newlib/libm/machine/spu/headers/nextafterd2.h | 15 |
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)); |