#include <math.h>
#include "math_private.h"
long double
nextafterl(long double x, long double y)
{
int32_t hx,hy,ix,iy;
u_int32_t lx,ly;
int32_t esx,esy;
GET_LDOUBLE_WORDS(esx,hx,lx,x);
GET_LDOUBLE_WORDS(esy,hy,ly,y);
ix = esx&0x7fff;
iy = esy&0x7fff;
if (((ix==0x7fff)&&(((hx&0x7fffffff)|lx)!=0)) ||
((iy==0x7fff)&&(((hy&0x7fffffff)|ly)!=0)))
return x+y;
if(x==y) return y;
if((ix|hx|lx)==0) {
volatile long double u;
SET_LDOUBLE_WORDS(x,esy&0x8000,0,1);
u = x;
u = u * u;
return x;
}
if(esx>=0) {
if(esx>esy||((esx==esy) && (hx>hy||((hx==hy)&&(lx>ly))))) {
if(lx==0) {
if ((hx&0x7fffffff)==0) esx -= 1;
hx = (hx - 1) | (hx & 0x80000000);
}
lx -= 1;
} else {
lx += 1;
if(lx==0) {
hx = (hx + 1) | (hx & 0x80000000);
if ((hx&0x7fffffff)==0) esx += 1;
}
}
} else {
if(esy>=0||(esx>esy||((esx==esy)&&(hx>hy||((hx==hy)&&(lx>ly)))))){
if(lx==0) {
if ((hx&0x7fffffff)==0) esx -= 1;
hx = (hx - 1) | (hx & 0x80000000);
}
lx -= 1;
} else {
lx += 1;
if(lx==0) {
hx = (hx + 1) | (hx & 0x80000000);
if ((hx&0x7fffffff)==0) esx += 1;
}
}
}
esy = esx&0x7fff;
if(esy==0x7fff) return x+x;
if(esy==0) {
volatile long double u = x*x;
if(u==x) {
SET_LDOUBLE_WORDS(x,esx,hx,lx);
return x;
}
}
SET_LDOUBLE_WORDS(x,esx,hx,lx);
return x;
}
DEF_STD(nextafterl);
MAKE_UNUSED_CLONE(nexttowardl, nextafterl);