/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Linux/PA-RISC Project (http://www.parisc-linux.org/)
 *
 * Floating-point emulation code
 *  Copyright (C) 2001 Hewlett-Packard (Paul Bame) <bame@debian.org>
 */

#ifdef __NO_PA_HDRS
    PA header file -- do not include this header file for non-PA builds.
#endif

/* 32-bit word grabbing functions */
#define Sgl_firstword(value) Sall(value)
#define Sgl_secondword(value) dummy_location
#define Sgl_thirdword(value) dummy_location
#define Sgl_fourthword(value) dummy_location

#define Sgl_sign(object) Ssign(object)
#define Sgl_exponent(object) Sexponent(object)
#define Sgl_signexponent(object) Ssignexponent(object)
#define Sgl_mantissa(object) Smantissa(object)
#define Sgl_exponentmantissa(object) Sexponentmantissa(object)
#define Sgl_all(object) Sall(object)

/* sgl_and_signs ANDs the sign bits of each argument and puts the result
 * into the first argument. sgl_or_signs ors those same sign bits */
#define Sgl_and_signs( src1dst, src2)		\
    Sall(src1dst) = (Sall(src2)|~((unsigned int)1<<31)) & Sall(src1dst)
#define Sgl_or_signs( src1dst, src2)		\
    Sall(src1dst) = (Sall(src2)&((unsigned int)1<<31)) | Sall(src1dst)

/* The hidden bit is always the low bit of the exponent */
#define Sgl_clear_exponent_set_hidden(srcdst) Deposit_sexponent(srcdst,1)
#define Sgl_clear_signexponent_set_hidden(srcdst) \
    Deposit_ssignexponent(srcdst,1)
#define Sgl_clear_sign(srcdst) Sall(srcdst) &= ~((unsigned int)1<<31)
#define Sgl_clear_signexponent(srcdst) Sall(srcdst) &= 0x007fffff

/* varamount must be less than 32 for the next three functions */
#define Sgl_rightshift(srcdst, varamount)	\
    Sall(srcdst) >>= varamount
#define Sgl_leftshift(srcdst, varamount)	\
    Sall(srcdst) <<= varamount
#define Sgl_rightshift_exponentmantissa(srcdst, varamount) \
    Sall(srcdst) = \
	(Sexponentmantissa(srcdst) >> varamount) | \
	(Sall(srcdst) & ((unsigned int)1<<31))

#define Sgl_leftshiftby1_withextent(left,right,result) \
    Shiftdouble(Sall(left),Extall(right),31,Sall(result))
    
#define Sgl_rightshiftby1_withextent(left,right,dst)		\
    Shiftdouble(Sall(left),Extall(right),1,Extall(right))
#define Sgl_arithrightshiftby1(srcdst)	\
    Sall(srcdst) = (int)Sall(srcdst) >> 1
    
/* Sign extend the sign bit with an integer destination */
#define Sgl_signextendedsign(value) Ssignedsign(value)

#define Sgl_isone_hidden(sgl_value) (Shidden(sgl_value))
#define Sgl_increment(sgl_value) Sall(sgl_value) += 1
#define Sgl_increment_mantissa(sgl_value) \
    Deposit_smantissa(sgl_value,sgl_value+1)
#define Sgl_decrement(sgl_value) Sall(sgl_value) -= 1

#define Sgl_isone_sign(sgl_value) (Is_ssign(sgl_value)!=0)
#define Sgl_isone_hiddenoverflow(sgl_value) \
    (Is_shiddenoverflow(sgl_value)!=0)
#define Sgl_isone_lowmantissa(sgl_value) (Is_slow(sgl_value)!=0)
#define Sgl_isone_signaling(sgl_value) (Is_ssignaling(sgl_value)!=0)
#define Sgl_is_signalingnan(sgl_value) (Ssignalingnan(sgl_value)==0x1ff)
#define Sgl_isnotzero(sgl_value) (Sall(sgl_value)!=0)
#define Sgl_isnotzero_hiddenhigh7mantissa(sgl_value) \
    (Shiddenhigh7mantissa(sgl_value)!=0)
#define Sgl_isnotzero_low4(sgl_value) (Slow4(sgl_value)!=0)
#define Sgl_isnotzero_exponent(sgl_value) (Sexponent(sgl_value)!=0)
#define Sgl_isnotzero_mantissa(sgl_value) (Smantissa(sgl_value)!=0)
#define Sgl_isnotzero_exponentmantissa(sgl_value) \
    (Sexponentmantissa(sgl_value)!=0)
#define Sgl_iszero(sgl_value) (Sall(sgl_value)==0)
#define Sgl_iszero_signaling(sgl_value) (Is_ssignaling(sgl_value)==0)
#define Sgl_iszero_hidden(sgl_value) (Is_shidden(sgl_value)==0)
#define Sgl_iszero_hiddenoverflow(sgl_value) \
    (Is_shiddenoverflow(sgl_value)==0)
#define Sgl_iszero_hiddenhigh3mantissa(sgl_value) \
    (Shiddenhigh3mantissa(sgl_value)==0)
#define Sgl_iszero_hiddenhigh7mantissa(sgl_value) \
    (Shiddenhigh7mantissa(sgl_value)==0)
#define Sgl_iszero_sign(sgl_value) (Is_ssign(sgl_value)==0)
#define Sgl_iszero_exponent(sgl_value) (Sexponent(sgl_value)==0)
#define Sgl_iszero_mantissa(sgl_value) (Smantissa(sgl_value)==0)
#define Sgl_iszero_exponentmantissa(sgl_value) \
    (Sexponentmantissa(sgl_value)==0)
#define Sgl_isinfinity_exponent(sgl_value) 		\
    (Sgl_exponent(sgl_value)==SGL_INFINITY_EXPONENT)
#define Sgl_isnotinfinity_exponent(sgl_value) 		\
    (Sgl_exponent(sgl_value)!=SGL_INFINITY_EXPONENT)
#define Sgl_isinfinity(sgl_value)			\
    (Sgl_exponent(sgl_value)==SGL_INFINITY_EXPONENT &&	\
    Sgl_mantissa(sgl_value)==0)
#define Sgl_isnan(sgl_value)				\
    (Sgl_exponent(sgl_value)==SGL_INFINITY_EXPONENT &&	\
    Sgl_mantissa(sgl_value)!=0)
#define Sgl_isnotnan(sgl_value)				\
    (Sgl_exponent(sgl_value)!=SGL_INFINITY_EXPONENT ||	\
    Sgl_mantissa(sgl_value)==0)
#define Sgl_islessthan(sgl_op1,sgl_op2)			\
    (Sall(sgl_op1) < Sall(sgl_op2))
#define Sgl_isgreaterthan(sgl_op1,sgl_op2)		\
    (Sall(sgl_op1) > Sall(sgl_op2))
#define Sgl_isnotlessthan(sgl_op1,sgl_op2)		\
    (Sall(sgl_op1) >= Sall(sgl_op2))
#define Sgl_isequal(sgl_op1,sgl_op2)			\
    (Sall(sgl_op1) == Sall(sgl_op2))

#define Sgl_leftshiftby8(sgl_value) \
    Sall(sgl_value) <<= 8
#define Sgl_leftshiftby4(sgl_value) \
    Sall(sgl_value) <<= 4
#define Sgl_leftshiftby3(sgl_value) \
    Sall(sgl_value) <<= 3
#define Sgl_leftshiftby2(sgl_value) \
    Sall(sgl_value) <<= 2
#define Sgl_leftshiftby1(sgl_value) \
    Sall(sgl_value) <<= 1
#define Sgl_rightshiftby1(sgl_value) \
    Sall(sgl_value) >>= 1
#define Sgl_rightshiftby4(sgl_value) \
    Sall(sgl_value) >>= 4
#define Sgl_rightshiftby8(sgl_value) \
    Sall(sgl_value) >>= 8
    
#define Sgl_ismagnitudeless(signlessleft,signlessright)			\
/*  unsigned int signlessleft, signlessright; */			\
      (signlessleft < signlessright)  
    

#define Sgl_copytoint_exponentmantissa(source,dest)     \
    dest = Sexponentmantissa(source)

/* A quiet NaN has the high mantissa bit clear and at least on other (in this
 * case the adjacent bit) bit set. */
#define Sgl_set_quiet(sgl_value) Deposit_shigh2mantissa(sgl_value,1)
#define Sgl_set_exponent(sgl_value,exp) Deposit_sexponent(sgl_value,exp)

#define Sgl_set_mantissa(dest,value) Deposit_smantissa(dest,value)
#define Sgl_set_exponentmantissa(dest,value) \
    Deposit_sexponentmantissa(dest,value)

/*  An infinity is represented with the max exponent and a zero mantissa */
#define Sgl_setinfinity_exponent(sgl_value) \
    Deposit_sexponent(sgl_value,SGL_INFINITY_EXPONENT)
#define Sgl_setinfinity_exponentmantissa(sgl_value)	\
    Deposit_sexponentmantissa(sgl_value, \
	(SGL_INFINITY_EXPONENT << (32-(1+SGL_EXP_LENGTH))))
#define Sgl_setinfinitypositive(sgl_value)		\
    Sall(sgl_value) = (SGL_INFINITY_EXPONENT << (32-(1+SGL_EXP_LENGTH)))
#define Sgl_setinfinitynegative(sgl_value)		\
    Sall(sgl_value) = (SGL_INFINITY_EXPONENT << (32-(1+SGL_EXP_LENGTH))) \
    | ((unsigned int)1<<31)
#define Sgl_setinfinity(sgl_value,sign)					\
    Sall(sgl_value) = (SGL_INFINITY_EXPONENT << (32-(1+SGL_EXP_LENGTH))) | \
     ((unsigned int)sign << 31)
#define Sgl_sethigh4bits(sgl_value, extsign)  \
    Deposit_shigh4(sgl_value,extsign)
#define Sgl_set_sign(sgl_value,sign) Deposit_ssign(sgl_value,sign)
#define Sgl_invert_sign(sgl_value)  \
    Deposit_ssign(sgl_value,~Ssign(sgl_value))
#define Sgl_setone_sign(sgl_value) Deposit_ssign(sgl_value,1)
#define Sgl_setone_lowmantissa(sgl_value) Deposit_slow(sgl_value,1)
#define Sgl_setzero_sign(sgl_value)  Sall(sgl_value) &= 0x7fffffff
#define Sgl_setzero_exponent(sgl_value) Sall(sgl_value) &= 0x807fffff
#define Sgl_setzero_mantissa(sgl_value) Sall(sgl_value) &= 0xff800000
#define Sgl_setzero_exponentmantissa(sgl_value)  Sall(sgl_value) &= 0x80000000
#define Sgl_setzero(sgl_value) Sall(sgl_value) = 0
#define Sgl_setnegativezero(sgl_value) Sall(sgl_value) = (unsigned int)1 << 31

/* Use following macro for both overflow & underflow conditions */
#define ovfl -
#define unfl +
#define Sgl_setwrapped_exponent(sgl_value,exponent,op) \
    Deposit_sexponent(sgl_value,(exponent op SGL_WRAP))

#define Sgl_setlargestpositive(sgl_value) 				\
    Sall(sgl_value) = ((SGL_EMAX+SGL_BIAS) << (32-(1+SGL_EXP_LENGTH)))	\
                      | ((1<<(32-(1+SGL_EXP_LENGTH))) - 1 )
#define Sgl_setlargestnegative(sgl_value)				\
    Sall(sgl_value) = ((SGL_EMAX+SGL_BIAS) << (32-(1+SGL_EXP_LENGTH)))	\
                      | ((1<<(32-(1+SGL_EXP_LENGTH))) - 1 )		\
		      | ((unsigned int)1<<31)

#define Sgl_setnegativeinfinity(sgl_value)	\
    Sall(sgl_value) = 				\
    ((1<<SGL_EXP_LENGTH) | SGL_INFINITY_EXPONENT) << (32-(1+SGL_EXP_LENGTH))
#define Sgl_setlargest(sgl_value,sign) 					\
    Sall(sgl_value) = (unsigned int)sign << 31 |			\
        (((SGL_EMAX+SGL_BIAS) << (32-(1+SGL_EXP_LENGTH)))		\
	  | ((1 << (32-(1+SGL_EXP_LENGTH))) - 1 ))
#define Sgl_setlargest_exponentmantissa(sgl_value)			\
    Sall(sgl_value) = Sall(sgl_value) & ((unsigned int)1<<31) |		\
        (((SGL_EMAX+SGL_BIAS) << (32-(1+SGL_EXP_LENGTH)))		\
	  | ((1 << (32-(1+SGL_EXP_LENGTH))) - 1 ))

/* The high bit is always zero so arithmetic or logical shifts will work. */
#define Sgl_right_align(srcdst,shift,extent)				\
    /* sgl_floating_point srcdst; int shift; extension extent */	\
    if (shift < 32) {							\
	Extall(extent) = Sall(srcdst) << (32-(shift));			\
    	Sall(srcdst) >>= shift;						\
    }									\
    else {								\
	Extall(extent) = Sall(srcdst);					\
	Sall(srcdst) = 0;						\
    }
#define Sgl_hiddenhigh3mantissa(sgl_value) Shiddenhigh3mantissa(sgl_value)
#define Sgl_hidden(sgl_value) Shidden(sgl_value)
#define Sgl_lowmantissa(sgl_value) Slow(sgl_value)

/* The left argument is never smaller than the right argument */
#define Sgl_subtract(sgl_left,sgl_right,sgl_result) \
    Sall(sgl_result) = Sall(sgl_left) - Sall(sgl_right)

/* Subtract right augmented with extension from left augmented with zeros and
 * store into result and extension. */
#define Sgl_subtract_withextension(left,right,extent,result)		\
    /* sgl_floating_point left,right,result; extension extent */	\
  Sgl_subtract(left,right,result);					\
  if((Extall(extent) = 0-Extall(extent)))				\
      Sall(result) = Sall(result)-1

#define Sgl_addition(sgl_left,sgl_right,sgl_result) \
    Sall(sgl_result) = Sall(sgl_left) + Sall(sgl_right)

#define Sgl_xortointp1(left,right,result)			\
    result = Sall(left) XOR Sall(right);

#define Sgl_xorfromintp1(left,right,result)			\
    Sall(result) = left XOR Sall(right)

/* Need to Initialize */
#define Sgl_makequietnan(dest)						\
    Sall(dest) = ((SGL_EMAX+SGL_BIAS)+1)<< (32-(1+SGL_EXP_LENGTH))	\
                 | (1<<(32-(1+SGL_EXP_LENGTH+2)))
#define Sgl_makesignalingnan(dest)					\
    Sall(dest) = ((SGL_EMAX+SGL_BIAS)+1)<< (32-(1+SGL_EXP_LENGTH))	\
                 | (1<<(32-(1+SGL_EXP_LENGTH+1)))

#define Sgl_normalize(sgl_opnd,exponent)			\
	while(Sgl_iszero_hiddenhigh7mantissa(sgl_opnd)) {	\
		Sgl_leftshiftby8(sgl_opnd);			\
		exponent -= 8;					\
	}							\
	if(Sgl_iszero_hiddenhigh3mantissa(sgl_opnd)) {		\
		Sgl_leftshiftby4(sgl_opnd);			\
		exponent -= 4;					\
	}							\
	while(Sgl_iszero_hidden(sgl_opnd)) {			\
		Sgl_leftshiftby1(sgl_opnd);			\
		exponent -= 1;					\
	}

#define Sgl_setoverflow(sgl_opnd)				\
	/* set result to infinity or largest number */		\
	switch (Rounding_mode()) {				\
		case ROUNDPLUS:					\
			if (Sgl_isone_sign(sgl_opnd)) {		\
				Sgl_setlargestnegative(sgl_opnd); \
			}					\
			else {					\
				Sgl_setinfinitypositive(sgl_opnd); \
			}					\
			break;					\
		case ROUNDMINUS:				\
			if (Sgl_iszero_sign(sgl_opnd)) {	\
				Sgl_setlargestpositive(sgl_opnd); \
			}					\
			else {					\
				Sgl_setinfinitynegative(sgl_opnd); \
			}					\
			break;					\
		case ROUNDNEAREST:				\
			Sgl_setinfinity_exponentmantissa(sgl_opnd); \
			break;					\
		case ROUNDZERO:					\
			Sgl_setlargest_exponentmantissa(sgl_opnd); \
	}

#define Sgl_denormalize(opnd,exponent,guard,sticky,inexact)		\
	Sgl_clear_signexponent_set_hidden(opnd);			\
	if (exponent >= (1 - SGL_P)) {					\
		guard = (Sall(opnd) >> -exponent) & 1;			\
		if (exponent < 0) sticky |= Sall(opnd) << (32+exponent); \
		inexact = guard | sticky;				\
		Sall(opnd) >>= (1-exponent);				\
	}								\
	else {								\
		guard = 0;						\
		sticky |= Sall(opnd);					\
		inexact = sticky;					\
		Sgl_setzero(opnd);					\
	}

/* 
 * The fused multiply add instructions requires a single extended format,
 * with 48 bits of mantissa.
 */
#define SGLEXT_THRESHOLD 48

#define Sglext_setzero(valA,valB)	\
    Sextallp1(valA) = 0; Sextallp2(valB) = 0

#define Sglext_isnotzero_mantissap2(valB) (Sextallp2(valB)!=0)
#define Sglext_isone_lowp1(val) (Sextlowp1(val)!=0)
#define Sglext_isone_highp2(val) (Sexthighp2(val)!=0)
#define Sglext_isnotzero_low31p2(val) (Sextlow31p2(val)!=0)
#define Sglext_iszero(valA,valB) (Sextallp1(valA)==0 && Sextallp2(valB)==0)

#define Sgl_copytoptr(src,destptr) *destptr = src
#define Sgl_copyfromptr(srcptr,dest) dest = *srcptr
#define Sglext_copy(srca,srcb,desta,destb) \
    Sextallp1(desta) = Sextallp1(srca);	\
    Sextallp2(destb) = Sextallp2(srcb)
#define Sgl_copyto_sglext(src1,dest1,dest2) \
	Sextallp1(dest1) = Sall(src1); Sextallp2(dest2) = 0

#define Sglext_swap_lower(leftp2,rightp2)  \
    Sextallp2(leftp2)  = Sextallp2(leftp2) XOR Sextallp2(rightp2);  \
    Sextallp2(rightp2) = Sextallp2(leftp2) XOR Sextallp2(rightp2);  \
    Sextallp2(leftp2)  = Sextallp2(leftp2) XOR Sextallp2(rightp2)

#define Sglext_setone_lowmantissap2(value) Deposit_dlowp2(value,1)

/* The high bit is always zero so arithmetic or logical shifts will work. */
#define Sglext_right_align(srcdstA,srcdstB,shift) \
  {int shiftamt, sticky;						\
    shiftamt = shift % 32;						\
    sticky = 0;								\
    switch (shift/32) {							\
     case 0: if (shiftamt > 0) {					\
	        sticky = Sextallp2(srcdstB) << 32 - (shiftamt);		\
                Variable_shift_double(Sextallp1(srcdstA),		\
		 Sextallp2(srcdstB),shiftamt,Sextallp2(srcdstB));	\
	        Sextallp1(srcdstA) >>= shiftamt;			\
	     }								\
	     break;							\
     case 1: if (shiftamt > 0) {					\
	        sticky = (Sextallp1(srcdstA) << 32 - (shiftamt)) |	\
			 Sextallp2(srcdstB);				\
	     }								\
	     else {							\
		sticky = Sextallp2(srcdstB);				\
	     }								\
	     Sextallp2(srcdstB) = Sextallp1(srcdstA) >> shiftamt;	\
	     Sextallp1(srcdstA) = 0;					\
	     break;							\
    }									\
    if (sticky) Sglext_setone_lowmantissap2(srcdstB);			\
  }

/* The left argument is never smaller than the right argument */
#define Sglext_subtract(lefta,leftb,righta,rightb,resulta,resultb) \
    if( Sextallp2(rightb) > Sextallp2(leftb) ) Sextallp1(lefta)--; \
    Sextallp2(resultb) = Sextallp2(leftb) - Sextallp2(rightb);	\
    Sextallp1(resulta) = Sextallp1(lefta) - Sextallp1(righta)

#define Sglext_addition(lefta,leftb,righta,rightb,resulta,resultb) \
    /* If the sum of the low words is less than either source, then \
     * an overflow into the next word occurred. */ \
    if ((Sextallp2(resultb) = Sextallp2(leftb)+Sextallp2(rightb)) < \
        Sextallp2(rightb)) \
	    Sextallp1(resulta) = Sextallp1(lefta)+Sextallp1(righta)+1; \
    else Sextallp1(resulta) = Sextallp1(lefta)+Sextallp1(righta)


#define Sglext_arithrightshiftby1(srcdstA,srcdstB)	\
    Shiftdouble(Sextallp1(srcdstA),Sextallp2(srcdstB),1,Sextallp2(srcdstB)); \
    Sextallp1(srcdstA) = (int)Sextallp1(srcdstA) >> 1
   
#define Sglext_leftshiftby8(valA,valB) \
    Shiftdouble(Sextallp1(valA),Sextallp2(valB),24,Sextallp1(valA)); \
    Sextallp2(valB) <<= 8
#define Sglext_leftshiftby4(valA,valB) \
    Shiftdouble(Sextallp1(valA),Sextallp2(valB),28,Sextallp1(valA)); \
    Sextallp2(valB) <<= 4
#define Sglext_leftshiftby3(valA,valB) \
    Shiftdouble(Sextallp1(valA),Sextallp2(valB),29,Sextallp1(valA)); \
    Sextallp2(valB) <<= 3
#define Sglext_leftshiftby2(valA,valB) \
    Shiftdouble(Sextallp1(valA),Sextallp2(valB),30,Sextallp1(valA)); \
    Sextallp2(valB) <<= 2
#define Sglext_leftshiftby1(valA,valB) \
    Shiftdouble(Sextallp1(valA),Sextallp2(valB),31,Sextallp1(valA)); \
    Sextallp2(valB) <<= 1

#define Sglext_rightshiftby4(valueA,valueB) \
    Shiftdouble(Sextallp1(valueA),Sextallp2(valueB),4,Sextallp2(valueB)); \
    Sextallp1(valueA) >>= 4
#define Sglext_rightshiftby3(valueA,valueB) \
    Shiftdouble(Sextallp1(valueA),Sextallp2(valueB),3,Sextallp2(valueB)); \
    Sextallp1(valueA) >>= 3
#define Sglext_rightshiftby1(valueA,valueB) \
    Shiftdouble(Sextallp1(valueA),Sextallp2(valueB),1,Sextallp2(valueB)); \
    Sextallp1(valueA) >>= 1

#define Sglext_xortointp1(left,right,result) Sgl_xortointp1(left,right,result)
#define Sglext_xorfromintp1(left,right,result) \
	Sgl_xorfromintp1(left,right,result)
#define Sglext_copytoint_exponentmantissa(src,dest) \
	Sgl_copytoint_exponentmantissa(src,dest)
#define Sglext_ismagnitudeless(signlessleft,signlessright) \
	Sgl_ismagnitudeless(signlessleft,signlessright)

#define Sglext_set_sign(dbl_value,sign)  Sgl_set_sign(dbl_value,sign)  
#define Sglext_clear_signexponent_set_hidden(srcdst) \
	Sgl_clear_signexponent_set_hidden(srcdst) 
#define Sglext_clear_signexponent(srcdst) Sgl_clear_signexponent(srcdst) 
#define Sglext_clear_sign(srcdst) Sgl_clear_sign(srcdst) 
#define Sglext_isone_hidden(dbl_value) Sgl_isone_hidden(dbl_value) 

#define Sglext_denormalize(opndp1,opndp2,exponent,is_tiny)		\
  {int sticky;								\
    is_tiny = TRUE;							\
    if (exponent == 0 && Sextallp2(opndp2)) {				\
	switch (Rounding_mode()) {					\
	case ROUNDPLUS:							\
		if (Sgl_iszero_sign(opndp1))				\
			if (Sgl_isone_hiddenoverflow(opndp1 + 1))	\
				is_tiny = FALSE;			\
		break;							\
	case ROUNDMINUS:						\
		if (Sgl_isone_sign(opndp1)) {				\
			if (Sgl_isone_hiddenoverflow(opndp1 + 1))	\
				is_tiny = FALSE;			\
		}							\
		break;							\
	case ROUNDNEAREST:						\
		if (Sglext_isone_highp2(opndp2) &&			\
		    (Sglext_isone_lowp1(opndp1) || 			\
		     Sglext_isnotzero_low31p2(opndp2)))			\
			if (Sgl_isone_hiddenoverflow(opndp1 + 1))	\
				is_tiny = FALSE;			\
		break;							\
	}								\
    }									\
    Sglext_clear_signexponent_set_hidden(opndp1);			\
    if (exponent >= (1-DBL_P)) {					\
	if (exponent >= -31) {						\
	    if (exponent > -31) {					\
		sticky = Sextallp2(opndp2) << 31+exponent;		\
		Variable_shift_double(opndp1,opndp2,1-exponent,opndp2);	\
		Sextallp1(opndp1) >>= 1-exponent;			\
	    }								\
	    else {							\
		sticky = Sextallp2(opndp2);				\
		Sextallp2(opndp2) = Sextallp1(opndp1);			\
		Sextallp1(opndp1) = 0;					\
	    }								\
	}								\
	else {								\
	    sticky = (Sextallp1(opndp1) << 31+exponent) | 		\
		     Sextallp2(opndp2);					\
	    Sextallp2(opndp2) = Sextallp1(opndp1) >> -31-exponent;	\
	    Sextallp1(opndp1) = 0;					\
	}								\
    }									\
    else {								\
	sticky = Sextallp1(opndp1) | Sextallp2(opndp2);			\
	Sglext_setzero(opndp1,opndp2);					\
    }									\
    if (sticky) Sglext_setone_lowmantissap2(opndp2);			\
    exponent = 0;							\
  }
