Annotation of qemu/fpu/softfloat-native.c, revision 1.1

1.1     ! root        1: /* Native implementation of soft float functions. Only a single status
        !             2:    context is supported */
        !             3: #include "softfloat.h"
        !             4: #include <math.h>
        !             5: 
        !             6: void set_float_rounding_mode(int val STATUS_PARAM)
        !             7: {
        !             8:     STATUS(float_rounding_mode) = val;
        !             9: #if defined(_BSD) && !defined(__APPLE__)
        !            10:     fpsetround(val);
        !            11: #elif defined(__arm__)
        !            12:     /* nothing to do */
        !            13: #else
        !            14:     fesetround(val);
        !            15: #endif
        !            16: }
        !            17: 
        !            18: #ifdef FLOATX80
        !            19: void set_floatx80_rounding_precision(int val STATUS_PARAM)
        !            20: {
        !            21:     STATUS(floatx80_rounding_precision) = val;
        !            22: }
        !            23: #endif
        !            24: 
        !            25: #if defined(_BSD)
        !            26: #define lrint(d)               ((int32_t)rint(d))
        !            27: #define llrint(d)              ((int64_t)rint(d))
        !            28: #endif
        !            29: 
        !            30: #if defined(__powerpc__)
        !            31: 
        !            32: /* correct (but slow) PowerPC rint() (glibc version is incorrect) */
        !            33: double qemu_rint(double x)
        !            34: {
        !            35:     double y = 4503599627370496.0;
        !            36:     if (fabs(x) >= y)
        !            37:         return x;
        !            38:     if (x < 0) 
        !            39:         y = -y;
        !            40:     y = (x + y) - y;
        !            41:     if (y == 0.0)
        !            42:         y = copysign(y, x);
        !            43:     return y;
        !            44: }
        !            45: 
        !            46: #define rint qemu_rint
        !            47: #endif
        !            48: 
        !            49: /*----------------------------------------------------------------------------
        !            50: | Software IEC/IEEE integer-to-floating-point conversion routines.
        !            51: *----------------------------------------------------------------------------*/
        !            52: float32 int32_to_float32(int v STATUS_PARAM)
        !            53: {
        !            54:     return (float32)v;
        !            55: }
        !            56: 
        !            57: float64 int32_to_float64(int v STATUS_PARAM)
        !            58: {
        !            59:     return (float64)v;
        !            60: }
        !            61: 
        !            62: #ifdef FLOATX80
        !            63: floatx80 int32_to_floatx80(int v STATUS_PARAM)
        !            64: {
        !            65:     return (floatx80)v;
        !            66: }
        !            67: #endif
        !            68: float32 int64_to_float32( int64_t v STATUS_PARAM)
        !            69: {
        !            70:     return (float32)v;
        !            71: }
        !            72: float64 int64_to_float64( int64_t v STATUS_PARAM)
        !            73: {
        !            74:     return (float64)v;
        !            75: }
        !            76: #ifdef FLOATX80
        !            77: floatx80 int64_to_floatx80( int64_t v STATUS_PARAM)
        !            78: {
        !            79:     return (floatx80)v;
        !            80: }
        !            81: #endif
        !            82: 
        !            83: /*----------------------------------------------------------------------------
        !            84: | Software IEC/IEEE single-precision conversion routines.
        !            85: *----------------------------------------------------------------------------*/
        !            86: int float32_to_int32( float32 a STATUS_PARAM)
        !            87: {
        !            88:     return lrintf(a);
        !            89: }
        !            90: int float32_to_int32_round_to_zero( float32 a STATUS_PARAM)
        !            91: {
        !            92:     return (int)a;
        !            93: }
        !            94: int64_t float32_to_int64( float32 a STATUS_PARAM)
        !            95: {
        !            96:     return llrintf(a);
        !            97: }
        !            98: 
        !            99: int64_t float32_to_int64_round_to_zero( float32 a STATUS_PARAM)
        !           100: {
        !           101:     return (int64_t)a;
        !           102: }
        !           103: 
        !           104: float64 float32_to_float64( float32 a STATUS_PARAM)
        !           105: {
        !           106:     return a;
        !           107: }
        !           108: #ifdef FLOATX80
        !           109: floatx80 float32_to_floatx80( float32 a STATUS_PARAM)
        !           110: {
        !           111:     return a;
        !           112: }
        !           113: #endif
        !           114: 
        !           115: /*----------------------------------------------------------------------------
        !           116: | Software IEC/IEEE single-precision operations.
        !           117: *----------------------------------------------------------------------------*/
        !           118: float32 float32_round_to_int( float32 a STATUS_PARAM)
        !           119: {
        !           120:     return rintf(a);
        !           121: }
        !           122: 
        !           123: float32 float32_rem( float32 a, float32 b STATUS_PARAM)
        !           124: {
        !           125:     return remainderf(a, b);
        !           126: }
        !           127: 
        !           128: float32 float32_sqrt( float32 a STATUS_PARAM)
        !           129: {
        !           130:     return sqrtf(a);
        !           131: }
        !           132: char float32_compare( float32 a, float32 b STATUS_PARAM )
        !           133: {
        !           134:     if (a < b) {
        !           135:         return -1;
        !           136:     } else if (a == b) {
        !           137:         return 0;
        !           138:     } else if (a > b) {
        !           139:         return 1;
        !           140:     } else {
        !           141:         return 2;
        !           142:     }
        !           143: }
        !           144: char float32_compare_quiet( float32 a, float32 b STATUS_PARAM )
        !           145: {
        !           146:     if (isless(a, b)) {
        !           147:         return -1;
        !           148:     } else if (a == b) {
        !           149:         return 0;
        !           150:     } else if (isgreater(a, b)) {
        !           151:         return 1;
        !           152:     } else {
        !           153:         return 2;
        !           154:     }
        !           155: }
        !           156: char float32_is_signaling_nan( float32 a1)
        !           157: {
        !           158:     float32u u;
        !           159:     uint32_t a;
        !           160:     u.f = a1;
        !           161:     a = u.i;
        !           162:     return ( ( ( a>>22 ) & 0x1FF ) == 0x1FE ) && ( a & 0x003FFFFF );
        !           163: }
        !           164: 
        !           165: /*----------------------------------------------------------------------------
        !           166: | Software IEC/IEEE double-precision conversion routines.
        !           167: *----------------------------------------------------------------------------*/
        !           168: int float64_to_int32( float64 a STATUS_PARAM)
        !           169: {
        !           170:     return lrint(a);
        !           171: }
        !           172: int float64_to_int32_round_to_zero( float64 a STATUS_PARAM)
        !           173: {
        !           174:     return (int)a;
        !           175: }
        !           176: int64_t float64_to_int64( float64 a STATUS_PARAM)
        !           177: {
        !           178:     return llrint(a);
        !           179: }
        !           180: int64_t float64_to_int64_round_to_zero( float64 a STATUS_PARAM)
        !           181: {
        !           182:     return (int64_t)a;
        !           183: }
        !           184: float32 float64_to_float32( float64 a STATUS_PARAM)
        !           185: {
        !           186:     return a;
        !           187: }
        !           188: #ifdef FLOATX80
        !           189: floatx80 float64_to_floatx80( float64 a STATUS_PARAM)
        !           190: {
        !           191:     return a;
        !           192: }
        !           193: #endif
        !           194: #ifdef FLOAT128
        !           195: float128 float64_to_float128( float64 a STATUS_PARAM)
        !           196: {
        !           197:     return a;
        !           198: }
        !           199: #endif
        !           200: 
        !           201: /*----------------------------------------------------------------------------
        !           202: | Software IEC/IEEE double-precision operations.
        !           203: *----------------------------------------------------------------------------*/
        !           204: float64 float64_round_to_int( float64 a STATUS_PARAM )
        !           205: {
        !           206: #if defined(__arm__)
        !           207:     switch(STATUS(float_rounding_mode)) {
        !           208:     default:
        !           209:     case float_round_nearest_even:
        !           210:         asm("rndd %0, %1" : "=f" (a) : "f"(a));
        !           211:         break;
        !           212:     case float_round_down:
        !           213:         asm("rnddm %0, %1" : "=f" (a) : "f"(a));
        !           214:         break;
        !           215:     case float_round_up:
        !           216:         asm("rnddp %0, %1" : "=f" (a) : "f"(a));
        !           217:         break;
        !           218:     case float_round_to_zero:
        !           219:         asm("rnddz %0, %1" : "=f" (a) : "f"(a));
        !           220:         break;
        !           221:     }
        !           222: #else
        !           223:     return rint(a);
        !           224: #endif
        !           225: }
        !           226: 
        !           227: float64 float64_rem( float64 a, float64 b STATUS_PARAM)
        !           228: {
        !           229:     return remainder(a, b);
        !           230: }
        !           231: 
        !           232: float64 float64_sqrt( float64 a STATUS_PARAM)
        !           233: {
        !           234:     return sqrt(a);
        !           235: }
        !           236: char float64_compare( float64 a, float64 b STATUS_PARAM )
        !           237: {
        !           238:     if (a < b) {
        !           239:         return -1;
        !           240:     } else if (a == b) {
        !           241:         return 0;
        !           242:     } else if (a > b) {
        !           243:         return 1;
        !           244:     } else {
        !           245:         return 2;
        !           246:     }
        !           247: }
        !           248: char float64_compare_quiet( float64 a, float64 b STATUS_PARAM )
        !           249: {
        !           250:     if (isless(a, b)) {
        !           251:         return -1;
        !           252:     } else if (a == b) {
        !           253:         return 0;
        !           254:     } else if (isgreater(a, b)) {
        !           255:         return 1;
        !           256:     } else {
        !           257:         return 2;
        !           258:     }
        !           259: }
        !           260: char float64_is_signaling_nan( float64 a1)
        !           261: {
        !           262:     float64u u;
        !           263:     uint64_t a;
        !           264:     u.f = a1;
        !           265:     a = u.i;
        !           266:     return
        !           267:            ( ( ( a>>51 ) & 0xFFF ) == 0xFFE )
        !           268:         && ( a & LIT64( 0x0007FFFFFFFFFFFF ) );
        !           269: 
        !           270: }
        !           271: 
        !           272: #ifdef FLOATX80
        !           273: 
        !           274: /*----------------------------------------------------------------------------
        !           275: | Software IEC/IEEE extended double-precision conversion routines.
        !           276: *----------------------------------------------------------------------------*/
        !           277: int floatx80_to_int32( floatx80 a STATUS_PARAM)
        !           278: {
        !           279:     return lrintl(a);
        !           280: }
        !           281: int floatx80_to_int32_round_to_zero( floatx80 a STATUS_PARAM)
        !           282: {
        !           283:     return (int)a;
        !           284: }
        !           285: int64_t floatx80_to_int64( floatx80 a STATUS_PARAM)
        !           286: {
        !           287:     return llrintl(a);
        !           288: }
        !           289: int64_t floatx80_to_int64_round_to_zero( floatx80 a STATUS_PARAM)
        !           290: {
        !           291:     return (int64_t)a;
        !           292: }
        !           293: float32 floatx80_to_float32( floatx80 a STATUS_PARAM)
        !           294: {
        !           295:     return a;
        !           296: }
        !           297: float64 floatx80_to_float64( floatx80 a STATUS_PARAM)
        !           298: {
        !           299:     return a;
        !           300: }
        !           301: 
        !           302: /*----------------------------------------------------------------------------
        !           303: | Software IEC/IEEE extended double-precision operations.
        !           304: *----------------------------------------------------------------------------*/
        !           305: floatx80 floatx80_round_to_int( floatx80 a STATUS_PARAM)
        !           306: {
        !           307:     return rintl(a);
        !           308: }
        !           309: floatx80 floatx80_rem( floatx80 a, floatx80 b STATUS_PARAM)
        !           310: {
        !           311:     return remainderl(a, b);
        !           312: }
        !           313: floatx80 floatx80_sqrt( floatx80 a STATUS_PARAM)
        !           314: {
        !           315:     return sqrtl(a);
        !           316: }
        !           317: char floatx80_compare( floatx80 a, floatx80 b STATUS_PARAM )
        !           318: {
        !           319:     if (a < b) {
        !           320:         return -1;
        !           321:     } else if (a == b) {
        !           322:         return 0;
        !           323:     } else if (a > b) {
        !           324:         return 1;
        !           325:     } else {
        !           326:         return 2;
        !           327:     }
        !           328: }
        !           329: char floatx80_compare_quiet( floatx80 a, floatx80 b STATUS_PARAM )
        !           330: {
        !           331:     if (isless(a, b)) {
        !           332:         return -1;
        !           333:     } else if (a == b) {
        !           334:         return 0;
        !           335:     } else if (isgreater(a, b)) {
        !           336:         return 1;
        !           337:     } else {
        !           338:         return 2;
        !           339:     }
        !           340: }
        !           341: char floatx80_is_signaling_nan( floatx80 a1)
        !           342: {
        !           343:     floatx80u u;
        !           344:     u.f = a1;
        !           345:     return ( ( u.i.high & 0x7FFF ) == 0x7FFF ) && (bits64) ( u.i.low<<1 );
        !           346: }
        !           347: 
        !           348: #endif

unix.superglobalmegacorp.com

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