Annotation of previous_trunk/src/softfloat/softfloat-specialize.h, revision 1.1

1.1     ! root        1: 
        !             2: /*============================================================================
        !             3: 
        !             4: This C source fragment is part of the SoftFloat IEC/IEEE Floating-point
        !             5: Arithmetic Package, Release 2b.
        !             6: 
        !             7: Written by John R. Hauser.  This work was made possible in part by the
        !             8: International Computer Science Institute, located at Suite 600, 1947 Center
        !             9: Street, Berkeley, California 94704.  Funding was partially provided by the
        !            10: National Science Foundation under grant MIP-9311980.  The original version
        !            11: of this code was written as part of a project to build a fixed-point vector
        !            12: processor in collaboration with the University of California at Berkeley,
        !            13: overseen by Profs. Nelson Morgan and John Wawrzynek.  More information
        !            14: is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
        !            15: arithmetic/SoftFloat.html'.
        !            16: 
        !            17: THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort has
        !            18: been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
        !            19: RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
        !            20: AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
        !            21: COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
        !            22: EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
        !            23: INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
        !            24: OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
        !            25: 
        !            26: Derivative works are acceptable, even for commercial purposes, so long as
        !            27: (1) the source code for the derivative work includes prominent notice that
        !            28: the work is derivative, and (2) the source code includes prominent notice with
        !            29: these four paragraphs for those parts of this code that are retained.
        !            30: 
        !            31: =============================================================================*/
        !            32: 
        !            33: /*----------------------------------------------------------------------------
        !            34: | Underflow tininess-detection mode, statically initialized to default value.
        !            35: | (The declaration in `softfloat.h' must match the `int8' type here.)
        !            36: *----------------------------------------------------------------------------*/
        !            37: #if 0
        !            38: int8 float_detect_tininess = float_tininess_before_rounding;
        !            39: #endif
        !            40: 
        !            41: /*----------------------------------------------------------------------------
        !            42: | Raises the exceptions specified by `flags'.  Floating-point traps can be
        !            43: | defined here if desired.  It is currently not possible for such a trap to
        !            44: | substitute a result value.  If traps are not implemented, this routine
        !            45: | should be simply `float_exception_flags |= flags;'.
        !            46: *----------------------------------------------------------------------------*/
        !            47: 
        !            48: void float_raise( int8 flags, float_ctrl* c )
        !            49: {
        !            50: 
        !            51:     c->float_exception_flags |= flags;
        !            52: 
        !            53: }
        !            54: #if 0
        !            55: #ifdef SOFTFLOAT_I860
        !            56: void float_raise2( int8 flags )
        !            57: {
        !            58:     
        !            59:     float_exception_flags2 |= flags;
        !            60:     
        !            61: }
        !            62: #endif
        !            63: #endif
        !            64: 
        !            65: /*----------------------------------------------------------------------------
        !            66: | Internal canonical NaN format.
        !            67: *----------------------------------------------------------------------------*/
        !            68: typedef struct {
        !            69:     flag sign;
        !            70:     bits64 high, low;
        !            71: } commonNaNT;
        !            72: 
        !            73: /*----------------------------------------------------------------------------
        !            74: | Returns 1 if the single-precision floating-point value `a' is a NaN;
        !            75: | otherwise returns 0.
        !            76: *----------------------------------------------------------------------------*/
        !            77: 
        !            78: static flag float32_is_nan( float32 a )
        !            79: {
        !            80: 
        !            81:     return ( 0xFF000000 < (bits32) ( a<<1 ) );
        !            82: 
        !            83: }
        !            84: 
        !            85: /*----------------------------------------------------------------------------
        !            86: | Returns 1 if the single-precision floating-point value `a' is a signaling
        !            87: | NaN; otherwise returns 0.
        !            88: *----------------------------------------------------------------------------*/
        !            89: 
        !            90: flag float32_is_signaling_nan( float32 a )
        !            91: {
        !            92: 
        !            93:     return ( ( ( a>>22 ) & 0x1FF ) == 0x1FE ) && ( a & 0x003FFFFF );
        !            94: 
        !            95: }
        !            96: 
        !            97: /*----------------------------------------------------------------------------
        !            98: | Returns the result of converting the single-precision floating-point NaN
        !            99: | `a' to the canonical NaN format.  If `a' is a signaling NaN, the invalid
        !           100: | exception is raised.
        !           101: *----------------------------------------------------------------------------*/
        !           102: 
        !           103: static commonNaNT float32ToCommonNaN( float32 a, float_ctrl* c )
        !           104: {
        !           105:     commonNaNT z;
        !           106: 
        !           107: #ifdef SOFTFLOAT_I860
        !           108:     if ( float32_is_signaling_nan( a ) ) float_raise( float_flag_signaling, c );
        !           109: #else
        !           110:     if ( float32_is_signaling_nan( a ) ) float_raise( float_flag_signaling );
        !           111: #endif
        !           112:     z.sign = a>>31;
        !           113:     z.low = 0;
        !           114:     z.high = ( (bits64) a )<<41;
        !           115:     return z;
        !           116: 
        !           117: }
        !           118: 
        !           119: /*----------------------------------------------------------------------------
        !           120: | Returns the result of converting the canonical NaN `a' to the single-
        !           121: | precision floating-point format.
        !           122: *----------------------------------------------------------------------------*/
        !           123: 
        !           124: static float32 commonNaNToFloat32( commonNaNT a )
        !           125: {
        !           126: 
        !           127:     return ( ( (bits32) a.sign )<<31 ) | 0x7FC00000 | ( a.high>>41 );
        !           128: 
        !           129: }
        !           130: 
        !           131: /*----------------------------------------------------------------------------
        !           132: | Takes two single-precision floating-point values `a' and `b', one of which
        !           133: | is a NaN, and returns the appropriate NaN result.  If either `a' or `b' is a
        !           134: | signaling NaN, the invalid exception is raised.
        !           135: *----------------------------------------------------------------------------*/
        !           136: 
        !           137: static float32 propagateFloat32NaN( float32 a, float32 b, float_ctrl* c )
        !           138: {
        !           139:     flag aIsNaN, aIsSignalingNaN, bIsNaN, bIsSignalingNaN;
        !           140: 
        !           141:     aIsNaN = float32_is_nan( a );
        !           142:     aIsSignalingNaN = float32_is_signaling_nan( a );
        !           143:     bIsNaN = float32_is_nan( b );
        !           144:     bIsSignalingNaN = float32_is_signaling_nan( b );
        !           145:     a |= 0x00400000;
        !           146:     b |= 0x00400000;
        !           147: #ifdef SOFTFLOAT_I860
        !           148:     if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_signaling, c );
        !           149: #else
        !           150:     if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_signaling );
        !           151: #endif
        !           152:     if ( aIsNaN ) {
        !           153:         return ( aIsSignalingNaN & bIsNaN ) ? b : a;
        !           154:     }
        !           155:     else {
        !           156:         return b;
        !           157:     }
        !           158: 
        !           159: }
        !           160: 
        !           161: /*----------------------------------------------------------------------------
        !           162: | Returns 1 if the double-precision floating-point value `a' is a NaN;
        !           163: | otherwise returns 0.
        !           164: *----------------------------------------------------------------------------*/
        !           165: 
        !           166: static flag float64_is_nan( float64 a )
        !           167: {
        !           168: 
        !           169:     return ( LIT64( 0xFFE0000000000000 ) < (bits64) ( a<<1 ) );
        !           170: 
        !           171: }
        !           172: 
        !           173: /*----------------------------------------------------------------------------
        !           174: | Returns 1 if the double-precision floating-point value `a' is a signaling
        !           175: | NaN; otherwise returns 0.
        !           176: *----------------------------------------------------------------------------*/
        !           177: 
        !           178: flag float64_is_signaling_nan( float64 a )
        !           179: {
        !           180: 
        !           181:     return
        !           182:            ( ( ( a>>51 ) & 0xFFF ) == 0xFFE )
        !           183:         && ( a & LIT64( 0x0007FFFFFFFFFFFF ) );
        !           184: 
        !           185: }
        !           186: 
        !           187: /*----------------------------------------------------------------------------
        !           188: | Returns the result of converting the double-precision floating-point NaN
        !           189: | `a' to the canonical NaN format.  If `a' is a signaling NaN, the invalid
        !           190: | exception is raised.
        !           191: *----------------------------------------------------------------------------*/
        !           192: 
        !           193: static commonNaNT float64ToCommonNaN( float64 a, float_ctrl* c )
        !           194: {
        !           195:     commonNaNT z;
        !           196: 
        !           197: #ifdef SOFTFLOAT_I860
        !           198:     if ( float64_is_signaling_nan( a ) ) float_raise( float_flag_signaling, c );
        !           199: #else
        !           200:     if ( float64_is_signaling_nan( a ) ) float_raise( float_flag_signaling );
        !           201: #endif
        !           202:     z.sign = a>>63;
        !           203:     z.low = 0;
        !           204:     z.high = a<<12;
        !           205:     return z;
        !           206: 
        !           207: }
        !           208: 
        !           209: /*----------------------------------------------------------------------------
        !           210: | Returns the result of converting the canonical NaN `a' to the double-
        !           211: | precision floating-point format.
        !           212: *----------------------------------------------------------------------------*/
        !           213: 
        !           214: static float64 commonNaNToFloat64( commonNaNT a )
        !           215: {
        !           216: 
        !           217:     return
        !           218:           ( ( (bits64) a.sign )<<63 )
        !           219:         | LIT64( 0x7FF8000000000000 )
        !           220:         | ( a.high>>12 );
        !           221: 
        !           222: }
        !           223: 
        !           224: /*----------------------------------------------------------------------------
        !           225: | Takes two double-precision floating-point values `a' and `b', one of which
        !           226: | is a NaN, and returns the appropriate NaN result.  If either `a' or `b' is a
        !           227: | signaling NaN, the invalid exception is raised.
        !           228: *----------------------------------------------------------------------------*/
        !           229: 
        !           230: static float64 propagateFloat64NaN( float64 a, float64 b, float_ctrl* c )
        !           231: {
        !           232:     flag aIsNaN, aIsSignalingNaN, bIsNaN, bIsSignalingNaN;
        !           233: 
        !           234:     aIsNaN = float64_is_nan( a );
        !           235:     aIsSignalingNaN = float64_is_signaling_nan( a );
        !           236:     bIsNaN = float64_is_nan( b );
        !           237:     bIsSignalingNaN = float64_is_signaling_nan( b );
        !           238:     a |= LIT64( 0x0008000000000000 );
        !           239:     b |= LIT64( 0x0008000000000000 );
        !           240: #ifdef SOFTFLOAT_I860
        !           241:     if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_signaling, c );
        !           242: #else
        !           243:     if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_signaling );
        !           244: #endif
        !           245:     if ( aIsNaN ) {
        !           246:         return ( aIsSignalingNaN & bIsNaN ) ? b : a;
        !           247:     }
        !           248:     else {
        !           249:         return b;
        !           250:     }
        !           251: 
        !           252: }
        !           253: 
        !           254: #ifdef FLOATX80
        !           255: 
        !           256: /*----------------------------------------------------------------------------
        !           257: | Returns 1 if the extended double-precision floating-point value `a' is a
        !           258: | NaN; otherwise returns 0.
        !           259: *----------------------------------------------------------------------------*/
        !           260: 
        !           261: flag floatx80_is_nan( floatx80 a )
        !           262: {
        !           263: 
        !           264:     return ( ( a.high & 0x7FFF ) == 0x7FFF ) && (bits64) ( a.low<<1 );
        !           265: 
        !           266: }
        !           267: 
        !           268: /*----------------------------------------------------------------------------
        !           269: | Returns 1 if the extended double-precision floating-point value `a' is a
        !           270: | signaling NaN; otherwise returns 0.
        !           271: *----------------------------------------------------------------------------*/
        !           272: 
        !           273: flag floatx80_is_signaling_nan( floatx80 a )
        !           274: {
        !           275:     bits64 aLow;
        !           276: 
        !           277:     aLow = a.low & ~ LIT64( 0x4000000000000000 );
        !           278:     return
        !           279:            ( ( a.high & 0x7FFF ) == 0x7FFF )
        !           280:         && (bits64) ( aLow<<1 )
        !           281:         && ( a.low == aLow );
        !           282: 
        !           283: }
        !           284: 
        !           285: #ifdef SOFTFLOAT_68K // 28-12-2016: Added for Previous:
        !           286: 
        !           287: /*----------------------------------------------------------------------------
        !           288:  | Returns 1 if the extended double-precision floating-point value `a' is
        !           289:  | zero; otherwise returns 0.
        !           290:  *----------------------------------------------------------------------------*/
        !           291: 
        !           292: flag floatx80_is_zero( floatx80 a )
        !           293: {
        !           294:     
        !           295:     return ( ( a.high & 0x7FFF ) < 0x7FFF ) && ( a.low == 0 );
        !           296:     
        !           297: }
        !           298: 
        !           299: /*----------------------------------------------------------------------------
        !           300:  | Returns 1 if the extended double-precision floating-point value `a' is
        !           301:  | infinity; otherwise returns 0.
        !           302:  *----------------------------------------------------------------------------*/
        !           303: 
        !           304: flag floatx80_is_infinity( floatx80 a )
        !           305: {
        !           306:     
        !           307:     return ( ( a.high & 0x7FFF ) == 0x7FFF ) && ( (bits64) ( a.low<<1 ) == 0 );
        !           308:     
        !           309: }
        !           310: 
        !           311: /*----------------------------------------------------------------------------
        !           312:  | Returns 1 if the extended double-precision floating-point value `a' is
        !           313:  | negative; otherwise returns 0.
        !           314:  *----------------------------------------------------------------------------*/
        !           315: 
        !           316: flag floatx80_is_negative( floatx80 a )
        !           317: {
        !           318:     
        !           319:     return ( ( a.high & 0x8000 ) == 0x8000 );
        !           320:     
        !           321: }
        !           322: 
        !           323: /*----------------------------------------------------------------------------
        !           324:  | Returns 1 if the extended double-precision floating-point value `a' is
        !           325:  | denormal; otherwise returns 0.
        !           326:  *----------------------------------------------------------------------------*/
        !           327: 
        !           328: flag floatx80_is_denormal( floatx80 a )
        !           329: {
        !           330:     
        !           331:     return
        !           332:            ( ( a.high & 0x7FFF ) == 0 )
        !           333:         && ( (bits64) ( a.low & LIT64( 0x8000000000000000 ) ) == LIT64( 0x0000000000000000 ) )
        !           334:         && (bits64) ( a.low<<1 );
        !           335:     
        !           336: }
        !           337: 
        !           338: /*----------------------------------------------------------------------------
        !           339:  | Returns 1 if the extended double-precision floating-point value `a' is
        !           340:  | unnormal; otherwise returns 0.
        !           341:  *----------------------------------------------------------------------------*/
        !           342: 
        !           343: flag floatx80_is_unnormal( floatx80 a )
        !           344: {
        !           345:     
        !           346:     return
        !           347:            ( ( a.high & 0x7FFF ) > 0 )
        !           348:         && ( ( a.high & 0x7FFF ) < 0x7FFF)
        !           349:         && ( (bits64) ( a.low & LIT64( 0x8000000000000000 ) ) == LIT64( 0x0000000000000000 ) );
        !           350:     
        !           351: }
        !           352: 
        !           353: /*----------------------------------------------------------------------------
        !           354:  | Returns 1 if the extended double-precision floating-point value `a' is
        !           355:  | normal; otherwise returns 0.
        !           356:  *----------------------------------------------------------------------------*/
        !           357: 
        !           358: flag floatx80_is_normal( floatx80 a )
        !           359: {
        !           360:     
        !           361:     return
        !           362:            ( ( a.high & 0x7FFF ) < 0x7FFF )
        !           363:         && ( (bits64) ( a.low & LIT64( 0x8000000000000000 ) ) == LIT64( 0x8000000000000000 ) );
        !           364:     
        !           365: }
        !           366: 
        !           367: #endif // End of addition for Previous
        !           368: 
        !           369: /*----------------------------------------------------------------------------
        !           370: | Returns the result of converting the extended double-precision floating-
        !           371: | point NaN `a' to the canonical NaN format.  If `a' is a signaling NaN, the
        !           372: | invalid exception is raised.
        !           373: *----------------------------------------------------------------------------*/
        !           374: 
        !           375: static commonNaNT floatx80ToCommonNaN( floatx80 a, float_ctrl* c )
        !           376: {
        !           377:     commonNaNT z;
        !           378: 
        !           379:     if ( floatx80_is_signaling_nan( a ) ) float_raise( float_flag_signaling, c );
        !           380:     z.sign = a.high>>15;
        !           381:     z.low = 0;
        !           382:     z.high = a.low<<1;
        !           383:     return z;
        !           384: 
        !           385: }
        !           386: 
        !           387: /*----------------------------------------------------------------------------
        !           388: | Returns the result of converting the canonical NaN `a' to the extended
        !           389: | double-precision floating-point format.
        !           390: *----------------------------------------------------------------------------*/
        !           391: 
        !           392: static floatx80 commonNaNToFloatx80( commonNaNT a )
        !           393: {
        !           394:     floatx80 z;
        !           395: #ifdef SOFTFLOAT_68K
        !           396:     z.low = LIT64( 0x4000000000000000 ) | ( a.high>>1 );
        !           397: #else
        !           398:     z.low = LIT64( 0xC000000000000000 ) | ( a.high>>1 );
        !           399: #endif
        !           400:     z.high = ( ( (bits16) a.sign )<<15 ) | 0x7FFF;
        !           401:     return z;
        !           402: 
        !           403: }
        !           404: 
        !           405: /*----------------------------------------------------------------------------
        !           406: | Takes two extended double-precision floating-point values `a' and `b', one
        !           407: | of which is a NaN, and returns the appropriate NaN result.  If either `a' or
        !           408: | `b' is a signaling NaN, the invalid exception is raised.
        !           409: *----------------------------------------------------------------------------*/
        !           410: 
        !           411: floatx80 propagateFloatx80NaN( floatx80 a, floatx80 b, float_ctrl* c )
        !           412: {
        !           413:     flag aIsNaN, aIsSignalingNaN, bIsSignalingNaN;
        !           414: #ifndef SOFTFLOAT_68K
        !           415:     flag bIsNaN;
        !           416:     
        !           417:     bIsNaN = floatx80_is_nan( b );
        !           418: #endif
        !           419:     aIsNaN = floatx80_is_nan( a );
        !           420:     aIsSignalingNaN = floatx80_is_signaling_nan( a );
        !           421:     bIsSignalingNaN = floatx80_is_signaling_nan( b );
        !           422: #ifdef SOFTFLOAT_68K
        !           423:     a.low |= LIT64( 0x4000000000000000 );
        !           424:     b.low |= LIT64( 0x4000000000000000 );
        !           425:     if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_signaling, c );
        !           426:     return aIsNaN ? a : b;
        !           427: #else
        !           428:     a.low |= LIT64( 0xC000000000000000 );
        !           429:     b.low |= LIT64( 0xC000000000000000 );
        !           430:     if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_signaling, c );
        !           431:     if ( aIsNaN ) {
        !           432:         return ( aIsSignalingNaN & bIsNaN ) ? b : a;
        !           433:     }
        !           434:     else {
        !           435:         return b;
        !           436:     }
        !           437: #endif
        !           438: 
        !           439: }
        !           440: 
        !           441: #ifdef SOFTFLOAT_68K
        !           442: /*----------------------------------------------------------------------------
        !           443:  | Takes extended double-precision floating-point  NaN  `a' and returns the
        !           444:  | appropriate NaN result. If `a' is a signaling NaN, the invalid exception
        !           445:  | is raised.
        !           446:  *----------------------------------------------------------------------------*/
        !           447: 
        !           448: floatx80 propagateFloatx80NaNOneArg( floatx80 a, float_ctrl* c )
        !           449: {
        !           450:     if ( floatx80_is_signaling_nan( a ) )
        !           451:         float_raise( float_flag_signaling, c );
        !           452: 
        !           453:     a.low |= LIT64( 0x4000000000000000 );
        !           454:     
        !           455:     return a;
        !           456: }
        !           457: #endif
        !           458: 
        !           459: #define EXP_BIAS 0x3FFF
        !           460: 
        !           461: /*----------------------------------------------------------------------------
        !           462: | Returns the fraction bits of the extended double-precision floating-point
        !           463: | value `a'.
        !           464: *----------------------------------------------------------------------------*/
        !           465: 
        !           466: bits64 extractFloatx80Frac( floatx80 a )
        !           467: {
        !           468: 
        !           469:     return a.low;
        !           470: 
        !           471: }
        !           472: 
        !           473: /*----------------------------------------------------------------------------
        !           474: | Returns the exponent bits of the extended double-precision floating-point
        !           475: | value `a'.
        !           476: *----------------------------------------------------------------------------*/
        !           477: 
        !           478: int32 extractFloatx80Exp( floatx80 a )
        !           479: {
        !           480: 
        !           481:     return a.high & 0x7FFF;
        !           482: 
        !           483: }
        !           484: 
        !           485: /*----------------------------------------------------------------------------
        !           486: | Returns the sign bit of the extended double-precision floating-point value
        !           487: | `a'.
        !           488: *----------------------------------------------------------------------------*/
        !           489: 
        !           490: flag extractFloatx80Sign( floatx80 a )
        !           491: {
        !           492: 
        !           493:     return a.high>>15;
        !           494: 
        !           495: }
        !           496: 
        !           497: #endif
        !           498: 
        !           499: #ifdef FLOAT128
        !           500: 
        !           501: /*----------------------------------------------------------------------------
        !           502: | Returns 1 if the quadruple-precision floating-point value `a' is a NaN;
        !           503: | otherwise returns 0.
        !           504: *----------------------------------------------------------------------------*/
        !           505: 
        !           506: static flag float128_is_nan( float128 a )
        !           507: {
        !           508: 
        !           509:     return
        !           510:            ( LIT64( 0xFFFE000000000000 ) <= (bits64) ( a.high<<1 ) )
        !           511:         && ( a.low || ( a.high & LIT64( 0x0000FFFFFFFFFFFF ) ) );
        !           512: 
        !           513: }
        !           514: 
        !           515: /*----------------------------------------------------------------------------
        !           516: | Returns 1 if the quadruple-precision floating-point value `a' is a
        !           517: | signaling NaN; otherwise returns 0.
        !           518: *----------------------------------------------------------------------------*/
        !           519: 
        !           520: flag float128_is_signaling_nan( float128 a )
        !           521: {
        !           522: 
        !           523:     return
        !           524:            ( ( ( a.high>>47 ) & 0xFFFF ) == 0xFFFE )
        !           525:         && ( a.low || ( a.high & LIT64( 0x00007FFFFFFFFFFF ) ) );
        !           526: 
        !           527: }
        !           528: 
        !           529: /*----------------------------------------------------------------------------
        !           530: | Returns the result of converting the quadruple-precision floating-point NaN
        !           531: | `a' to the canonical NaN format.  If `a' is a signaling NaN, the invalid
        !           532: | exception is raised.
        !           533: *----------------------------------------------------------------------------*/
        !           534: 
        !           535: static commonNaNT float128ToCommonNaN( float128 a, float_ctrl* c )
        !           536: {
        !           537:     commonNaNT z;
        !           538: 
        !           539:     if ( float128_is_signaling_nan( a ) ) float_raise( float_flag_signaling, c );
        !           540:     z.sign = a.high>>63;
        !           541:     shortShift128Left( a.high, a.low, 16, &z.high, &z.low );
        !           542:     return z;
        !           543: 
        !           544: }
        !           545: 
        !           546: /*----------------------------------------------------------------------------
        !           547: | Returns the result of converting the canonical NaN `a' to the quadruple-
        !           548: | precision floating-point format.
        !           549: *----------------------------------------------------------------------------*/
        !           550: 
        !           551: static float128 commonNaNToFloat128( commonNaNT a )
        !           552: {
        !           553:     float128 z;
        !           554: 
        !           555:     shift128Right( a.high, a.low, 16, &z.high, &z.low );
        !           556:     z.high |= ( ( (bits64) a.sign )<<63 ) | LIT64( 0x7FFF800000000000 );
        !           557:     return z;
        !           558: 
        !           559: }
        !           560: 
        !           561: /*----------------------------------------------------------------------------
        !           562: | Takes two quadruple-precision floating-point values `a' and `b', one of
        !           563: | which is a NaN, and returns the appropriate NaN result.  If either `a' or
        !           564: | `b' is a signaling NaN, the invalid exception is raised.
        !           565: *----------------------------------------------------------------------------*/
        !           566: 
        !           567: static float128 propagateFloat128NaN( float128 a, float128 b, float_ctrl* c )
        !           568: {
        !           569:     flag aIsNaN, aIsSignalingNaN, bIsNaN, bIsSignalingNaN;
        !           570: 
        !           571:     aIsNaN = float128_is_nan( a );
        !           572:     aIsSignalingNaN = float128_is_signaling_nan( a );
        !           573:     bIsNaN = float128_is_nan( b );
        !           574:     bIsSignalingNaN = float128_is_signaling_nan( b );
        !           575:     a.high |= LIT64( 0x0000800000000000 );
        !           576:     b.high |= LIT64( 0x0000800000000000 );
        !           577:     if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_signaling, c );
        !           578:     if ( aIsNaN ) {
        !           579:         return ( aIsSignalingNaN & bIsNaN ) ? b : a;
        !           580:     }
        !           581:     else {
        !           582:         return b;
        !           583:     }
        !           584: 
        !           585: }
        !           586: 
        !           587: #endif
        !           588: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.