Annotation of tme/ic/sparc/sparc-fpu-auto.c, revision 1.1

1.1     ! root        1: /* automatically generated by sparc-fpu-auto.sh, do not edit! */
        !             2: _TME_RCSID("$Id: sparc-fpu-auto.sh,v 1.4 2007/01/14 16:40:12 fredette Exp $");
        !             3: 
        !             4: /* this sets the floating-point condition codes after a
        !             5:    single-precision operation: */
        !             6: static void inline
        !             7: _tme_sparc_fpu_fcc_single(struct tme_sparc *ic, const struct tme_float *dst, int trap_on_nan)
        !             8: {
        !             9:   tme_uint32_t fcc;
        !            10: 
        !            11:   /* set fcc: */
        !            12:   fcc = (tme_float_is_nan(dst, (TME_FLOAT_FORMAT_IEEE754_SINGLE | TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN))
        !            13:          ? TME_SPARC_FSR_FCC_UN
        !            14:         : tme_float_is_zero(dst, (TME_FLOAT_FORMAT_IEEE754_SINGLE | TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN))
        !            15:         ? TME_SPARC_FSR_FCC_EQ
        !            16:         : tme_float_is_negative(dst, (TME_FLOAT_FORMAT_IEEE754_SINGLE | TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN))
        !            17:         ? TME_SPARC_FSR_FCC_LT
        !            18:         : TME_SPARC_FSR_FCC_GT);
        !            19: 
        !            20:   /* if this is an FCMPE and this is a NaN, we always cause an invalid exception: */
        !            21:   if (trap_on_nan && fcc == TME_SPARC_FSR_FCC_UN) {
        !            22:     _tme_sparc_fpu_exception_ieee754(&ic->tme_sparc_fpu_ieee754_ctl, TME_FLOAT_EXCEPTION_INVALID);
        !            23:   }
        !            24: 
        !            25:   /* set the floating-point condition codes: */
        !            26:   ic->tme_sparc_fpu_fsr = (ic->tme_sparc_fpu_fsr & ~TME_SPARC_FSR_FCC) | fcc;
        !            27: }
        !            28: 
        !            29: /* if the most significant bit of the NaN fraction is zero,
        !            30:    this is a signaling NaN: */
        !            31: #define _TME_SPARC_FPU_IS_SNAN_SINGLE(a) (((*(a)) & ((0x007f0000 | (0x007f0000 >> 1)) ^ (0x007f0000 >> 1))) != 0)
        !            32: static tme_int8_t
        !            33: _tme_sparc_fpu_is_snan_single(tme_uint32_t *value)
        !            34: {
        !            35:   return (_TME_SPARC_FPU_IS_SNAN_SINGLE(value));
        !            36: }
        !            37: 
        !            38: /* single-precision NaN propagation: */
        !            39: static void
        !            40: _tme_sparc_fpu_nan_from_nans_single(struct tme_ieee754_ctl *ctl, 
        !            41:                                     const tme_uint32_t *a,
        !            42:                                     const tme_uint32_t *b,
        !            43:                                     tme_uint32_t *z)
        !            44: {
        !            45:   struct tme_sparc *ic;
        !            46:   int a_is_snan;
        !            47:   int b_is_snan;
        !            48: 
        !            49:   /* recover our data structure : */
        !            50:   ic = ctl->tme_ieee754_ctl_private;    
        !            51: 
        !            52:   /* see if any of the NaNs are signaling NaNs: */
        !            53:   a_is_snan = _TME_SPARC_FPU_IS_SNAN_SINGLE(a);
        !            54:   b_is_snan = _TME_SPARC_FPU_IS_SNAN_SINGLE(b);
        !            55: 
        !            56:   /* if either operand is a signaling NaN: */
        !            57:   if (a_is_snan || b_is_snan) {
        !            58: 
        !            59:     /* signal the signaling NaN: */
        !            60:     _tme_sparc_fpu_exception_ieee754(ctl, TME_FLOAT_EXCEPTION_INVALID);
        !            61:   }
        !            62: 
        !            63:   /* if and only if a (corresponding to f[rs1]) is a signaling NaN, do 
        !            64:      we return a. at all other times we return b (corresponding to f[rs2]): */
        !            65:   if (a_is_snan) {
        !            66:     b = a;
        !            67:   }
        !            68: 
        !            69:   /* return the NaN, but make sure it's nonsignaling: */
        !            70:   *z = *b;
        !            71:   (*(z)) |= ((0x007f0000 | (0x007f0000 >> 1)) ^ (0x007f0000 >> 1));
        !            72: }
        !            73: 
        !            74: 
        !            75: /* this sets the floating-point condition codes after a
        !            76:    double-precision operation: */
        !            77: static void inline
        !            78: _tme_sparc_fpu_fcc_double(struct tme_sparc *ic, const struct tme_float *dst, int trap_on_nan)
        !            79: {
        !            80:   tme_uint32_t fcc;
        !            81: 
        !            82:   /* set fcc: */
        !            83:   fcc = (tme_float_is_nan(dst, (TME_FLOAT_FORMAT_IEEE754_DOUBLE | TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN))
        !            84:          ? TME_SPARC_FSR_FCC_UN
        !            85:         : tme_float_is_zero(dst, (TME_FLOAT_FORMAT_IEEE754_DOUBLE | TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN))
        !            86:         ? TME_SPARC_FSR_FCC_EQ
        !            87:         : tme_float_is_negative(dst, (TME_FLOAT_FORMAT_IEEE754_DOUBLE | TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN))
        !            88:         ? TME_SPARC_FSR_FCC_LT
        !            89:         : TME_SPARC_FSR_FCC_GT);
        !            90: 
        !            91:   /* if this is an FCMPE and this is a NaN, we always cause an invalid exception: */
        !            92:   if (trap_on_nan && fcc == TME_SPARC_FSR_FCC_UN) {
        !            93:     _tme_sparc_fpu_exception_ieee754(&ic->tme_sparc_fpu_ieee754_ctl, TME_FLOAT_EXCEPTION_INVALID);
        !            94:   }
        !            95: 
        !            96:   /* set the floating-point condition codes: */
        !            97:   ic->tme_sparc_fpu_fsr = (ic->tme_sparc_fpu_fsr & ~TME_SPARC_FSR_FCC) | fcc;
        !            98: }
        !            99: 
        !           100: /* if the most significant bit of the NaN fraction is zero,
        !           101:    this is a signaling NaN: */
        !           102: #define _TME_SPARC_FPU_IS_SNAN_DOUBLE(a) (((*(a)).tme_value64_uint32_hi & ((0x000f0000 | (0x000f0000 >> 1)) ^ (0x000f0000 >> 1))) != 0)
        !           103: static tme_int8_t
        !           104: _tme_sparc_fpu_is_snan_double(union tme_value64 *value)
        !           105: {
        !           106:   return (_TME_SPARC_FPU_IS_SNAN_DOUBLE(value));
        !           107: }
        !           108: 
        !           109: /* double-precision NaN propagation: */
        !           110: static void
        !           111: _tme_sparc_fpu_nan_from_nans_double(struct tme_ieee754_ctl *ctl, 
        !           112:                                     const union tme_value64 *a,
        !           113:                                     const union tme_value64 *b,
        !           114:                                     union tme_value64 *z)
        !           115: {
        !           116:   struct tme_sparc *ic;
        !           117:   int a_is_snan;
        !           118:   int b_is_snan;
        !           119: 
        !           120:   /* recover our data structure : */
        !           121:   ic = ctl->tme_ieee754_ctl_private;    
        !           122: 
        !           123:   /* see if any of the NaNs are signaling NaNs: */
        !           124:   a_is_snan = _TME_SPARC_FPU_IS_SNAN_DOUBLE(a);
        !           125:   b_is_snan = _TME_SPARC_FPU_IS_SNAN_DOUBLE(b);
        !           126: 
        !           127:   /* if either operand is a signaling NaN: */
        !           128:   if (a_is_snan || b_is_snan) {
        !           129: 
        !           130:     /* signal the signaling NaN: */
        !           131:     _tme_sparc_fpu_exception_ieee754(ctl, TME_FLOAT_EXCEPTION_INVALID);
        !           132:   }
        !           133: 
        !           134:   /* if and only if a (corresponding to f[rs1]) is a signaling NaN, do 
        !           135:      we return a. at all other times we return b (corresponding to f[rs2]): */
        !           136:   if (a_is_snan) {
        !           137:     b = a;
        !           138:   }
        !           139: 
        !           140:   /* return the NaN, but make sure it's nonsignaling: */
        !           141:   *z = *b;
        !           142:   (*(z)).tme_value64_uint32_hi |= ((0x000f0000 | (0x000f0000 >> 1)) ^ (0x000f0000 >> 1));
        !           143: }
        !           144: 
        !           145: 
        !           146: /* this sets the floating-point condition codes after a
        !           147:    quad-precision operation: */
        !           148: static void inline
        !           149: _tme_sparc_fpu_fcc_quad(struct tme_sparc *ic, const struct tme_float *dst, int trap_on_nan)
        !           150: {
        !           151:   tme_uint32_t fcc;
        !           152: 
        !           153:   /* set fcc: */
        !           154:   fcc = (tme_float_is_nan(dst, (TME_FLOAT_FORMAT_IEEE754_QUAD | TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN))
        !           155:          ? TME_SPARC_FSR_FCC_UN
        !           156:         : tme_float_is_zero(dst, (TME_FLOAT_FORMAT_IEEE754_QUAD | TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN))
        !           157:         ? TME_SPARC_FSR_FCC_EQ
        !           158:         : tme_float_is_negative(dst, (TME_FLOAT_FORMAT_IEEE754_QUAD | TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN))
        !           159:         ? TME_SPARC_FSR_FCC_LT
        !           160:         : TME_SPARC_FSR_FCC_GT);
        !           161: 
        !           162:   /* if this is an FCMPE and this is a NaN, we always cause an invalid exception: */
        !           163:   if (trap_on_nan && fcc == TME_SPARC_FSR_FCC_UN) {
        !           164:     _tme_sparc_fpu_exception_ieee754(&ic->tme_sparc_fpu_ieee754_ctl, TME_FLOAT_EXCEPTION_INVALID);
        !           165:   }
        !           166: 
        !           167:   /* set the floating-point condition codes: */
        !           168:   ic->tme_sparc_fpu_fsr = (ic->tme_sparc_fpu_fsr & ~TME_SPARC_FSR_FCC) | fcc;
        !           169: }
        !           170: 
        !           171: /* if the most significant bit of the NaN fraction is zero,
        !           172:    this is a signaling NaN: */
        !           173: #define _TME_SPARC_FPU_IS_SNAN_QUAD(a) (((*(a)).tme_float_ieee754_quad_hi.tme_value64_uint32_hi & ((0x0000ffff | (0x0000ffff >> 1)) ^ (0x0000ffff >> 1))) != 0)
        !           174: static tme_int8_t
        !           175: _tme_sparc_fpu_is_snan_quad(struct tme_float_ieee754_quad *value)
        !           176: {
        !           177:   return (_TME_SPARC_FPU_IS_SNAN_QUAD(value));
        !           178: }
        !           179: 
        !           180: /* quad-precision NaN propagation: */
        !           181: static void
        !           182: _tme_sparc_fpu_nan_from_nans_quad(struct tme_ieee754_ctl *ctl, 
        !           183:                                     const struct tme_float_ieee754_quad *a,
        !           184:                                     const struct tme_float_ieee754_quad *b,
        !           185:                                     struct tme_float_ieee754_quad *z)
        !           186: {
        !           187:   struct tme_sparc *ic;
        !           188:   int a_is_snan;
        !           189:   int b_is_snan;
        !           190: 
        !           191:   /* recover our data structure : */
        !           192:   ic = ctl->tme_ieee754_ctl_private;    
        !           193: 
        !           194:   /* see if any of the NaNs are signaling NaNs: */
        !           195:   a_is_snan = _TME_SPARC_FPU_IS_SNAN_QUAD(a);
        !           196:   b_is_snan = _TME_SPARC_FPU_IS_SNAN_QUAD(b);
        !           197: 
        !           198:   /* if either operand is a signaling NaN: */
        !           199:   if (a_is_snan || b_is_snan) {
        !           200: 
        !           201:     /* signal the signaling NaN: */
        !           202:     _tme_sparc_fpu_exception_ieee754(ctl, TME_FLOAT_EXCEPTION_INVALID);
        !           203:   }
        !           204: 
        !           205:   /* if and only if a (corresponding to f[rs1]) is a signaling NaN, do 
        !           206:      we return a. at all other times we return b (corresponding to f[rs2]): */
        !           207:   if (a_is_snan) {
        !           208:     b = a;
        !           209:   }
        !           210: 
        !           211:   /* return the NaN, but make sure it's nonsignaling: */
        !           212:   *z = *b;
        !           213:   (*(z)).tme_float_ieee754_quad_hi.tme_value64_uint32_hi |= ((0x0000ffff | (0x0000ffff >> 1)) ^ (0x0000ffff >> 1));
        !           214: }
        !           215: 
        !           216: #define _TME_SPARC_FPU_UNIMPL tme_sparc_fpu_exception(ic, TME_SPARC_FSR_FTT_unimplemented_FPop)
        !           217: #define _TME_SPARC_FPU_UNIMPL_IF(flags) do { if ((ic->tme_sparc_fpu_flags & (flags)) != 0) { _TME_SPARC_FPU_UNIMPL; } } while (/* CONSTCOND */ 0)
        !           218: 
        !           219: void
        !           220: tme_sparc_fpu_fpop1(struct tme_sparc *ic)
        !           221: {
        !           222:   tme_uint8_t rounding_mode;
        !           223:   unsigned int opf;
        !           224:   unsigned int fpreg_rd_number;
        !           225:   const struct tme_float *fpreg_rs1;
        !           226:   const struct tme_float *fpreg_rs2;
        !           227:   struct tme_float fpreg_rs1_buffer;
        !           228:   struct tme_float fpreg_rs2_buffer;
        !           229:   struct tme_float fpreg_rd;
        !           230:   unsigned int fpreg_rd_format;
        !           231: 
        !           232:   /* set the rounding mode: */
        !           233:   switch (ic->tme_sparc_fpu_fsr & TME_SPARC_FSR_RND) {
        !           234:   default: assert(FALSE);
        !           235:   case TME_SPARC_FSR_RND_RN: rounding_mode = TME_FLOAT_ROUND_NEAREST_EVEN; break;
        !           236:   case TME_SPARC_FSR_RND_RZ: rounding_mode = TME_FLOAT_ROUND_TO_ZERO; break;
        !           237:   case TME_SPARC_FSR_RND_RM: rounding_mode = TME_FLOAT_ROUND_DOWN; break;
        !           238:   case TME_SPARC_FSR_RND_RP: rounding_mode = TME_FLOAT_ROUND_UP; break;
        !           239:   }
        !           240:   ic->tme_sparc_fpu_ieee754_ctl.tme_ieee754_ctl_rounding_mode = rounding_mode;
        !           241: 
        !           242:   /* decode the rd and opf fields: */
        !           243:   fpreg_rd_number = TME_FIELD_MASK_EXTRACTU(TME_SPARC_INSN, TME_SPARC_FORMAT3_MASK_RD);
        !           244:   opf = TME_FIELD_MASK_EXTRACTU(TME_SPARC_INSN, (0x1ff << 5));
        !           245: 
        !           246:   /* dispatch on the opf field: */
        !           247:   switch (opf) {
        !           248: #define _TME_SPARC_FPU_FORMAT_RS1(format) fpreg_rs1 = tme_sparc_fpu_fpreg_read(ic, TME_SPARC_FORMAT3_MASK_RS1, (format))
        !           249: #define _TME_SPARC_FPU_FORMAT_RS2(format) fpreg_rs2 = tme_sparc_fpu_fpreg_read(ic, TME_SPARC_FORMAT3_MASK_RS2, (format))
        !           250: #define _TME_SPARC_FPU_FORMAT_RD(format) do { fpreg_rd_format = (format) | TME_IEEE754_FPREG_FORMAT_BUILTIN; tme_sparc_fpu_fpreg_aligned(ic, fpreg_rd_number, fpreg_rd_format); } while (/* CONSTCOND */ 0)
        !           251: 
        !           252:   case 1:  /* 000000001 FMOVs: */
        !           253:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           254:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);
        !           255:     _TME_SPARC_FPU_BEGIN;
        !           256:     fpreg_rd = *fpreg_rs2;
        !           257:     break;
        !           258: 
        !           259:   case 5:  /* 000000101 FNEGs: */
        !           260:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE);
        !           261:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);
        !           262:     _TME_SPARC_FPU_BEGIN;
        !           263:     fpreg_rd = *fpreg_rs2;
        !           264:     fpreg_rd.tme_float_value_ieee754_single ^= 0x80000000;
        !           265:     break;
        !           266: 
        !           267:   case 9:  /* 000001001 FABSs: */
        !           268:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE);
        !           269:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);
        !           270:     _TME_SPARC_FPU_BEGIN;
        !           271:     fpreg_rd = *fpreg_rs2;
        !           272:     fpreg_rd.tme_float_value_ieee754_single &= ~0x80000000;
        !           273:     break;
        !           274: 
        !           275:   case 41:  /* 000101001 FSQRTs: */
        !           276:     _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_FSQRT);
        !           277:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           278:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);
        !           279:     _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_single_sqrt,
        !           280:                               fpreg_rs2, &fpreg_rd);
        !           281:     break;
        !           282: 
        !           283:   case 42:  /* 000101010 FSQRTd: */
        !           284:     _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_FSQRT);
        !           285:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           286:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);
        !           287:     _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_sqrt,
        !           288:                               fpreg_rs2, &fpreg_rd);
        !           289:     break;
        !           290: 
        !           291:   case 43:  /* 000101011 FSQRTq: */
        !           292:     _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_FSQRT | TME_SPARC_FPU_FLAG_NO_QUAD);
        !           293:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           294:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);
        !           295:     _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_sqrt,
        !           296:                               fpreg_rs2, &fpreg_rd);
        !           297:     break;
        !           298: 
        !           299:   case 65:  /* 001000001 FADDs: */
        !           300:     _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           301:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           302:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);
        !           303:     _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_single_add,
        !           304:                              fpreg_rs1, fpreg_rs2, &fpreg_rd);
        !           305:     break;
        !           306: 
        !           307:   case 66:  /* 001000010 FADDd: */
        !           308:     _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           309:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           310:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);
        !           311:     _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_double_add,
        !           312:                              fpreg_rs1, fpreg_rs2, &fpreg_rd);
        !           313:     break;
        !           314: 
        !           315:   case 67:  /* 001000011 FADDq: */
        !           316:     _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_QUAD);
        !           317:     _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           318:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           319:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);
        !           320:     _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_quad_add,
        !           321:                              fpreg_rs1, fpreg_rs2, &fpreg_rd);
        !           322:     break;
        !           323: 
        !           324:   case 69:  /* 001000101 FSUBs: */
        !           325:     _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           326:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           327:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);
        !           328:     _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_single_sub,
        !           329:                              fpreg_rs1, fpreg_rs2, &fpreg_rd);
        !           330:     break;
        !           331: 
        !           332:   case 70:  /* 001000110 FSUBd: */
        !           333:     _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           334:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           335:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);
        !           336:     _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_double_sub,
        !           337:                              fpreg_rs1, fpreg_rs2, &fpreg_rd);
        !           338:     break;
        !           339: 
        !           340:   case 71:  /* 001000111 FSUBq: */
        !           341:     _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_QUAD);
        !           342:     _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           343:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           344:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);
        !           345:     _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_quad_sub,
        !           346:                              fpreg_rs1, fpreg_rs2, &fpreg_rd);
        !           347:     break;
        !           348: 
        !           349:   case 73:  /* 001001001 FMULs: */
        !           350:     _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           351:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           352:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);
        !           353:     _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_single_mul,
        !           354:                              fpreg_rs1, fpreg_rs2, &fpreg_rd);
        !           355:     break;
        !           356: 
        !           357:   case 74:  /* 001001010 FMULd: */
        !           358:     _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           359:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           360:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);
        !           361:     _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_double_mul,
        !           362:                              fpreg_rs1, fpreg_rs2, &fpreg_rd);
        !           363:     break;
        !           364: 
        !           365:   case 75:  /* 001001011 FMULq: */
        !           366:     _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_QUAD);
        !           367:     _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           368:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           369:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);
        !           370:     _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_quad_mul,
        !           371:                              fpreg_rs1, fpreg_rs2, &fpreg_rd);
        !           372:     break;
        !           373: 
        !           374:   case 77:  /* 001001101 FDIVs: */
        !           375:     _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           376:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           377:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);
        !           378:     _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_single_div,
        !           379:                              fpreg_rs1, fpreg_rs2, &fpreg_rd);
        !           380:     break;
        !           381: 
        !           382:   case 78:  /* 001001110 FDIVd: */
        !           383:     _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           384:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           385:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);
        !           386:     _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_double_div,
        !           387:                              fpreg_rs1, fpreg_rs2, &fpreg_rd);
        !           388:     break;
        !           389: 
        !           390:   case 79:  /* 001001111 FDIVq: */
        !           391:     _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_QUAD);
        !           392:     _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           393:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           394:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);
        !           395:     _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_quad_div,
        !           396:                               fpreg_rs1, fpreg_rs2, &fpreg_rd);
        !           397:     break;
        !           398: 
        !           399:   case 105:  /* 001101001 FsMULd: */
        !           400:     _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_FMUL_WIDER);
        !           401:     _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           402:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           403:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);
        !           404:     _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_from_single,
        !           405:                               fpreg_rs1, &fpreg_rs1_buffer);
        !           406:     _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_from_single,
        !           407:                               fpreg_rs2, &fpreg_rs2_buffer);
        !           408:     _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_single_mul,
        !           409:                              &fpreg_rs1_buffer, &fpreg_rs2_buffer, &fpreg_rd);
        !           410:     break;
        !           411: 
        !           412:   case 110:  /* 001101110 FdMULq: */
        !           413:     _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_FMUL_WIDER | TME_SPARC_FPU_FLAG_NO_QUAD);
        !           414:     _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           415:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           416:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);
        !           417:     _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_from_double,
        !           418:                               fpreg_rs1, &fpreg_rs1_buffer);
        !           419:     _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_from_double,
        !           420:                               fpreg_rs2, &fpreg_rs2_buffer);
        !           421:     _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_quad_mul,
        !           422:                              &fpreg_rs1_buffer, &fpreg_rs2_buffer, &fpreg_rd);
        !           423:     break;
        !           424: 
        !           425:   case 196:  /* 011000100 FiTOs: */
        !           426:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE);
        !           427:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);
        !           428:     _TME_SPARC_FPU_BEGIN;
        !           429:     _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_single_from_int32,
        !           430:                               fpreg_rs2->tme_float_value_ieee754_single, &fpreg_rd);
        !           431:     break;
        !           432: 
        !           433:   case 198:  /* 011000110 FdTOs: */
        !           434:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           435:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);
        !           436:     _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_single_from_double,
        !           437:                               fpreg_rs2, &fpreg_rd);
        !           438:     break;
        !           439: 
        !           440:   case 199:  /* 011000111 FqTOs: */
        !           441:     _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_QUAD);
        !           442:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           443:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);
        !           444:     _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_single_from_quad,
        !           445:                               fpreg_rs2, &fpreg_rd);
        !           446:     break;
        !           447: 
        !           448:   case 200:  /* 011001000 FiTOd: */
        !           449:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE);
        !           450:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);
        !           451:     _TME_SPARC_FPU_BEGIN;
        !           452:     _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_from_int32,
        !           453:                               fpreg_rs2->tme_float_value_ieee754_single, &fpreg_rd);
        !           454:     break;
        !           455: 
        !           456:   case 201:  /* 011001001 FsTOd: */
        !           457:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           458:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);
        !           459:     _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_from_single,
        !           460:                               fpreg_rs2, &fpreg_rd);
        !           461:     break;
        !           462: 
        !           463:   case 203:  /* 011001011 FqTOd: */
        !           464:     _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_QUAD);
        !           465:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           466:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_DOUBLE);
        !           467:     _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_from_quad,
        !           468:                               fpreg_rs2, &fpreg_rd);
        !           469:     break;
        !           470: 
        !           471:   case 204:  /* 011001100 FiTOq: */
        !           472:     _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_QUAD);
        !           473:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE);
        !           474:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);
        !           475:     _TME_SPARC_FPU_BEGIN;
        !           476:     _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_from_int32,
        !           477:                               fpreg_rs2->tme_float_value_ieee754_single, &fpreg_rd);
        !           478:     break;
        !           479: 
        !           480:   case 205:  /* 011001101 FsTOq: */
        !           481:     _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_QUAD);
        !           482:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           483:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);
        !           484:     _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_from_single,
        !           485:                               fpreg_rs2, &fpreg_rd);
        !           486:     break;
        !           487: 
        !           488:   case 206:  /* 011001110 FdTOq: */
        !           489:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           490:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_QUAD);
        !           491:     _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_from_double,
        !           492:                               fpreg_rs2, &fpreg_rd);
        !           493:     break;
        !           494: 
        !           495:   case 209:  /* 011010001 FsTOi: */
        !           496:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           497:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);
        !           498:     _TME_SPARC_FPU_BEGIN;
        !           499:     fpreg_rd.tme_float_format = TME_FLOAT_FORMAT_IEEE754_SINGLE;
        !           500:     ic->tme_sparc_fpu_ieee754_ctl.tme_ieee754_ctl_rounding_mode = TME_FLOAT_ROUND_TO_ZERO;
        !           501:     _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_single_to_int32,
        !           502:                               fpreg_rs2, (tme_int32_t *) &fpreg_rd.tme_float_value_ieee754_single);
        !           503:     break;
        !           504: 
        !           505:   case 210:  /* 011010010 FdTOi: */
        !           506:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           507:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);
        !           508:     _TME_SPARC_FPU_BEGIN;
        !           509:     fpreg_rd.tme_float_format = TME_FLOAT_FORMAT_IEEE754_SINGLE;
        !           510:     ic->tme_sparc_fpu_ieee754_ctl.tme_ieee754_ctl_rounding_mode = TME_FLOAT_ROUND_TO_ZERO;
        !           511:     _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_double_to_int32,
        !           512:                               fpreg_rs2, (tme_int32_t *) &fpreg_rd.tme_float_value_ieee754_single);
        !           513:     break;
        !           514: 
        !           515:   case 211:  /* 011010011 FqTOi: */
        !           516:     _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_QUAD);
        !           517:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           518:     _TME_SPARC_FPU_FORMAT_RD(TME_IEEE754_FPREG_FORMAT_SINGLE);
        !           519:     _TME_SPARC_FPU_BEGIN;
        !           520:     fpreg_rd.tme_float_format = TME_FLOAT_FORMAT_IEEE754_SINGLE;
        !           521:     ic->tme_sparc_fpu_ieee754_ctl.tme_ieee754_ctl_rounding_mode = TME_FLOAT_ROUND_TO_ZERO;
        !           522:     _TME_SPARC_FPU_OP_MONADIC(tme_ieee754_ops_quad_to_int32,
        !           523:                               fpreg_rs2, (tme_int32_t *) &fpreg_rd.tme_float_value_ieee754_single);
        !           524:     break;
        !           525: 
        !           526:   default: _TME_SPARC_FPU_UNIMPL; fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL; break;
        !           527: 
        !           528: #undef _TME_SPARC_FPU_FORMAT_RS1
        !           529: #undef _TME_SPARC_FPU_FORMAT_RS2
        !           530: #undef _TME_SPARC_FPU_FORMAT_RD
        !           531:   }
        !           532: 
        !           533:   /* store any destination: */
        !           534:   if (fpreg_rd_format != TME_IEEE754_FPREG_FORMAT_NULL) {
        !           535:     tme_sparc_fpu_fpreg_format(ic, fpreg_rd_number, fpreg_rd_format);
        !           536:     ic->tme_sparc_fpu_fpregs[fpreg_rd_number] = fpreg_rd;
        !           537:   }
        !           538: 
        !           539: }
        !           540: 
        !           541: void
        !           542: tme_sparc_fpu_fpop2(struct tme_sparc *ic)
        !           543: {
        !           544:   tme_uint8_t rounding_mode;
        !           545:   unsigned int opf;
        !           546:   unsigned int fpreg_rd_number;
        !           547:   const struct tme_float *fpreg_rs1;
        !           548:   const struct tme_float *fpreg_rs2;
        !           549:   struct tme_float fpreg_rd;
        !           550:   unsigned int fpreg_rd_format;
        !           551: 
        !           552:   /* set the rounding mode: */
        !           553:   switch (ic->tme_sparc_fpu_fsr & TME_SPARC_FSR_RND) {
        !           554:   default: assert(FALSE);
        !           555:   case TME_SPARC_FSR_RND_RN: rounding_mode = TME_FLOAT_ROUND_NEAREST_EVEN; break;
        !           556:   case TME_SPARC_FSR_RND_RZ: rounding_mode = TME_FLOAT_ROUND_TO_ZERO; break;
        !           557:   case TME_SPARC_FSR_RND_RM: rounding_mode = TME_FLOAT_ROUND_DOWN; break;
        !           558:   case TME_SPARC_FSR_RND_RP: rounding_mode = TME_FLOAT_ROUND_UP; break;
        !           559:   }
        !           560:   ic->tme_sparc_fpu_ieee754_ctl.tme_ieee754_ctl_rounding_mode = rounding_mode;
        !           561: 
        !           562:   /* decode the rd and opf fields: */
        !           563:   fpreg_rd_number = TME_FIELD_MASK_EXTRACTU(TME_SPARC_INSN, TME_SPARC_FORMAT3_MASK_RD);
        !           564:   opf = TME_FIELD_MASK_EXTRACTU(TME_SPARC_INSN, (0x1ff << 5));
        !           565: 
        !           566:   /* dispatch on the opf field: */
        !           567:   switch (opf) {
        !           568: #define _TME_SPARC_FPU_FORMAT_RS1(format) fpreg_rs1 = tme_sparc_fpu_fpreg_read(ic, TME_SPARC_FORMAT3_MASK_RS1, (format))
        !           569: #define _TME_SPARC_FPU_FORMAT_RS2(format) fpreg_rs2 = tme_sparc_fpu_fpreg_read(ic, TME_SPARC_FORMAT3_MASK_RS2, (format))
        !           570: #define _TME_SPARC_FPU_FORMAT_RD(format) do { fpreg_rd_format = (format) | TME_IEEE754_FPREG_FORMAT_BUILTIN; tme_sparc_fpu_fpreg_aligned(ic, fpreg_rd_number, fpreg_rd_format); } while (/* CONSTCOND */ 0)
        !           571: 
        !           572:   case 81:  /* 001010001 FCMPs: */
        !           573:     _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           574:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           575:     _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_single_sub,
        !           576:                              fpreg_rs1, fpreg_rs2, &fpreg_rd);
        !           577:     _tme_sparc_fpu_fcc_single(ic, &fpreg_rd, FALSE);
        !           578:     fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;
        !           579:     break;
        !           580: 
        !           581:   case 82:  /* 001010010 FCMPd: */
        !           582:     _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           583:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           584:     _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_double_sub,
        !           585:                              fpreg_rs1, fpreg_rs2, &fpreg_rd);
        !           586:     _tme_sparc_fpu_fcc_double(ic, &fpreg_rd, FALSE);
        !           587:     fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;
        !           588:     break;
        !           589: 
        !           590:   case 83:  /* 001010011 FCMPq: */
        !           591:     _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_QUAD);
        !           592:     _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           593:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           594:     _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_quad_sub,
        !           595:                              fpreg_rs1, fpreg_rs2, &fpreg_rd);
        !           596:     _tme_sparc_fpu_fcc_quad(ic, &fpreg_rd, FALSE);
        !           597:     fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;
        !           598:     break;
        !           599: 
        !           600:   case 85:  /* 001010101 FCMPEs: */
        !           601:     _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           602:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_SINGLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           603:     _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_single_sub,
        !           604:                              fpreg_rs1, fpreg_rs2, &fpreg_rd);
        !           605:     _tme_sparc_fpu_fcc_single(ic, &fpreg_rd, TRUE);
        !           606:     fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;
        !           607:     break;
        !           608: 
        !           609:   case 86:  /* 001010110 FCMPEd: */
        !           610:     _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           611:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_DOUBLE | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           612:     _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_double_sub,
        !           613:                              fpreg_rs1, fpreg_rs2, &fpreg_rd);
        !           614:     _tme_sparc_fpu_fcc_double(ic, &fpreg_rd, TRUE);
        !           615:     fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;
        !           616:     break;
        !           617: 
        !           618:   case 87:  /* 001010111 FCMPEq: */
        !           619:     _TME_SPARC_FPU_UNIMPL_IF(TME_SPARC_FPU_FLAG_NO_QUAD);
        !           620:     _TME_SPARC_FPU_FORMAT_RS1(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           621:     _TME_SPARC_FPU_FORMAT_RS2(TME_IEEE754_FPREG_FORMAT_QUAD | TME_IEEE754_FPREG_FORMAT_BUILTIN);
        !           622:     _TME_SPARC_FPU_OP_DYADIC(tme_ieee754_ops_quad_sub,
        !           623:                              fpreg_rs1, fpreg_rs2, &fpreg_rd);
        !           624:     _tme_sparc_fpu_fcc_quad(ic, &fpreg_rd, TRUE);
        !           625:     fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL;
        !           626:     break;
        !           627: 
        !           628:   default: _TME_SPARC_FPU_UNIMPL; fpreg_rd_format = TME_IEEE754_FPREG_FORMAT_NULL; break;
        !           629: 
        !           630: #undef _TME_SPARC_FPU_FORMAT_RS1
        !           631: #undef _TME_SPARC_FPU_FORMAT_RS2
        !           632: #undef _TME_SPARC_FPU_FORMAT_RD
        !           633:   }
        !           634: 
        !           635:   /* store any destination: */
        !           636:   if (fpreg_rd_format != TME_IEEE754_FPREG_FORMAT_NULL) {
        !           637:     tme_sparc_fpu_fpreg_format(ic, fpreg_rd_number, fpreg_rd_format);
        !           638:     ic->tme_sparc_fpu_fpregs[fpreg_rd_number] = fpreg_rd;
        !           639:   }
        !           640: 
        !           641: }

unix.superglobalmegacorp.com

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