Annotation of qemu/linux-user/arm/nwfpe/extended_cpdo.c, revision 1.1.1.1

1.1       root        1: /*
                      2:     NetWinder Floating Point Emulator
                      3:     (c) Rebel.COM, 1998,1999
                      4: 
                      5:     Direct questions, comments to Scott Bambrough <[email protected]>
                      6: 
                      7:     This program is free software; you can redistribute it and/or modify
                      8:     it under the terms of the GNU General Public License as published by
                      9:     the Free Software Foundation; either version 2 of the License, or
                     10:     (at your option) any later version.
                     11: 
                     12:     This program is distributed in the hope that it will be useful,
                     13:     but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14:     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     15:     GNU General Public License for more details.
                     16: 
                     17:     You should have received a copy of the GNU General Public License
                     18:     along with this program; if not, write to the Free Software
                     19:     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                     20: */
                     21: 
                     22: #include "fpa11.h"
                     23: #include "softfloat.h"
                     24: #include "fpopcode.h"
                     25: 
                     26: floatx80 floatx80_exp(floatx80 Fm);
                     27: floatx80 floatx80_ln(floatx80 Fm);
                     28: floatx80 floatx80_sin(floatx80 rFm);
                     29: floatx80 floatx80_cos(floatx80 rFm);
                     30: floatx80 floatx80_arcsin(floatx80 rFm);
                     31: floatx80 floatx80_arctan(floatx80 rFm);
                     32: floatx80 floatx80_log(floatx80 rFm);
                     33: floatx80 floatx80_tan(floatx80 rFm);
                     34: floatx80 floatx80_arccos(floatx80 rFm);
                     35: floatx80 floatx80_pow(floatx80 rFn,floatx80 rFm);
                     36: floatx80 floatx80_pol(floatx80 rFn,floatx80 rFm);
                     37: 
                     38: unsigned int ExtendedCPDO(const unsigned int opcode)
                     39: {
                     40:    FPA11 *fpa11 = GET_FPA11();
                     41:    floatx80 rFm, rFn;
                     42:    unsigned int Fd, Fm, Fn, nRc = 1;
                     43: 
                     44:    //printk("ExtendedCPDO(0x%08x)\n",opcode);
                     45: 
                     46:    Fm = getFm(opcode);
                     47:    if (CONSTANT_FM(opcode))
                     48:    {
                     49:      rFm = getExtendedConstant(Fm);
                     50:    }
                     51:    else
                     52:    {
                     53:      switch (fpa11->fType[Fm])
                     54:      {
                     55:         case typeSingle:
                     56:           rFm = float32_to_floatx80(fpa11->fpreg[Fm].fSingle, &fpa11->fp_status);
                     57:         break;
                     58: 
                     59:         case typeDouble:
                     60:           rFm = float64_to_floatx80(fpa11->fpreg[Fm].fDouble, &fpa11->fp_status);
                     61:         break;
                     62: 
                     63:         case typeExtended:
                     64:           rFm = fpa11->fpreg[Fm].fExtended;
                     65:         break;
                     66: 
                     67:         default: return 0;
                     68:      }
                     69:    }
                     70: 
                     71:    if (!MONADIC_INSTRUCTION(opcode))
                     72:    {
                     73:       Fn = getFn(opcode);
                     74:       switch (fpa11->fType[Fn])
                     75:       {
                     76:         case typeSingle:
                     77:           rFn = float32_to_floatx80(fpa11->fpreg[Fn].fSingle, &fpa11->fp_status);
                     78:         break;
                     79: 
                     80:         case typeDouble:
                     81:           rFn = float64_to_floatx80(fpa11->fpreg[Fn].fDouble, &fpa11->fp_status);
                     82:         break;
                     83: 
                     84:         case typeExtended:
                     85:           rFn = fpa11->fpreg[Fn].fExtended;
                     86:         break;
                     87: 
                     88:         default: return 0;
                     89:       }
                     90:    }
                     91: 
                     92:    Fd = getFd(opcode);
                     93:    switch (opcode & MASK_ARITHMETIC_OPCODE)
                     94:    {
                     95:       /* dyadic opcodes */
                     96:       case ADF_CODE:
                     97:          fpa11->fpreg[Fd].fExtended = floatx80_add(rFn,rFm, &fpa11->fp_status);
                     98:       break;
                     99: 
                    100:       case MUF_CODE:
                    101:       case FML_CODE:
                    102:          fpa11->fpreg[Fd].fExtended = floatx80_mul(rFn,rFm, &fpa11->fp_status);
                    103:       break;
                    104: 
                    105:       case SUF_CODE:
                    106:          fpa11->fpreg[Fd].fExtended = floatx80_sub(rFn,rFm, &fpa11->fp_status);
                    107:       break;
                    108: 
                    109:       case RSF_CODE:
                    110:          fpa11->fpreg[Fd].fExtended = floatx80_sub(rFm,rFn, &fpa11->fp_status);
                    111:       break;
                    112: 
                    113:       case DVF_CODE:
                    114:       case FDV_CODE:
                    115:          fpa11->fpreg[Fd].fExtended = floatx80_div(rFn,rFm, &fpa11->fp_status);
                    116:       break;
                    117: 
                    118:       case RDF_CODE:
                    119:       case FRD_CODE:
                    120:          fpa11->fpreg[Fd].fExtended = floatx80_div(rFm,rFn, &fpa11->fp_status);
                    121:       break;
                    122: 
                    123: #if 0
                    124:       case POW_CODE:
                    125:          fpa11->fpreg[Fd].fExtended = floatx80_pow(rFn,rFm);
                    126:       break;
                    127: 
                    128:       case RPW_CODE:
                    129:          fpa11->fpreg[Fd].fExtended = floatx80_pow(rFm,rFn);
                    130:       break;
                    131: #endif
                    132: 
                    133:       case RMF_CODE:
                    134:          fpa11->fpreg[Fd].fExtended = floatx80_rem(rFn,rFm, &fpa11->fp_status);
                    135:       break;
                    136: 
                    137: #if 0
                    138:       case POL_CODE:
                    139:          fpa11->fpreg[Fd].fExtended = floatx80_pol(rFn,rFm);
                    140:       break;
                    141: #endif
                    142: 
                    143:       /* monadic opcodes */
                    144:       case MVF_CODE:
                    145:          fpa11->fpreg[Fd].fExtended = rFm;
                    146:       break;
                    147: 
                    148:       case MNF_CODE:
                    149:          rFm.high ^= 0x8000;
                    150:          fpa11->fpreg[Fd].fExtended = rFm;
                    151:       break;
                    152: 
                    153:       case ABS_CODE:
                    154:          rFm.high &= 0x7fff;
                    155:          fpa11->fpreg[Fd].fExtended = rFm;
                    156:       break;
                    157: 
                    158:       case RND_CODE:
                    159:       case URD_CODE:
                    160:          fpa11->fpreg[Fd].fExtended = floatx80_round_to_int(rFm, &fpa11->fp_status);
                    161:       break;
                    162: 
                    163:       case SQT_CODE:
                    164:          fpa11->fpreg[Fd].fExtended = floatx80_sqrt(rFm, &fpa11->fp_status);
                    165:       break;
                    166: 
                    167: #if 0
                    168:       case LOG_CODE:
                    169:          fpa11->fpreg[Fd].fExtended = floatx80_log(rFm);
                    170:       break;
                    171: 
                    172:       case LGN_CODE:
                    173:          fpa11->fpreg[Fd].fExtended = floatx80_ln(rFm);
                    174:       break;
                    175: 
                    176:       case EXP_CODE:
                    177:          fpa11->fpreg[Fd].fExtended = floatx80_exp(rFm);
                    178:       break;
                    179: 
                    180:       case SIN_CODE:
                    181:          fpa11->fpreg[Fd].fExtended = floatx80_sin(rFm);
                    182:       break;
                    183: 
                    184:       case COS_CODE:
                    185:          fpa11->fpreg[Fd].fExtended = floatx80_cos(rFm);
                    186:       break;
                    187: 
                    188:       case TAN_CODE:
                    189:          fpa11->fpreg[Fd].fExtended = floatx80_tan(rFm);
                    190:       break;
                    191: 
                    192:       case ASN_CODE:
                    193:          fpa11->fpreg[Fd].fExtended = floatx80_arcsin(rFm);
                    194:       break;
                    195: 
                    196:       case ACS_CODE:
                    197:          fpa11->fpreg[Fd].fExtended = floatx80_arccos(rFm);
                    198:       break;
                    199: 
                    200:       case ATN_CODE:
                    201:          fpa11->fpreg[Fd].fExtended = floatx80_arctan(rFm);
                    202:       break;
                    203: #endif
                    204: 
                    205:       case NRM_CODE:
                    206:       break;
                    207: 
                    208:       default:
                    209:       {
                    210:         nRc = 0;
                    211:       }
                    212:    }
                    213: 
                    214:    if (0 != nRc) fpa11->fType[Fd] = typeExtended;
                    215:    return nRc;
                    216: }
                    217: 
                    218: #if 0
                    219: floatx80 floatx80_exp(floatx80 Fm)
                    220: {
                    221: //series
                    222: }
                    223: 
                    224: floatx80 floatx80_ln(floatx80 Fm)
                    225: {
                    226: //series
                    227: }
                    228: 
                    229: floatx80 floatx80_sin(floatx80 rFm)
                    230: {
                    231: //series
                    232: }
                    233: 
                    234: floatx80 floatx80_cos(floatx80 rFm)
                    235: {
                    236: //series
                    237: }
                    238: 
                    239: floatx80 floatx80_arcsin(floatx80 rFm)
                    240: {
                    241: //series
                    242: }
                    243: 
                    244: floatx80 floatx80_arctan(floatx80 rFm)
                    245: {
                    246:   //series
                    247: }
                    248: 
                    249: floatx80 floatx80_log(floatx80 rFm)
                    250: {
                    251:   return floatx80_div(floatx80_ln(rFm),getExtendedConstant(7));
                    252: }
                    253: 
                    254: floatx80 floatx80_tan(floatx80 rFm)
                    255: {
                    256:   return floatx80_div(floatx80_sin(rFm),floatx80_cos(rFm));
                    257: }
                    258: 
                    259: floatx80 floatx80_arccos(floatx80 rFm)
                    260: {
                    261:    //return floatx80_sub(halfPi,floatx80_arcsin(rFm));
                    262: }
                    263: 
                    264: floatx80 floatx80_pow(floatx80 rFn,floatx80 rFm)
                    265: {
                    266:   return floatx80_exp(floatx80_mul(rFm,floatx80_ln(rFn)));
                    267: }
                    268: 
                    269: floatx80 floatx80_pol(floatx80 rFn,floatx80 rFm)
                    270: {
                    271:   return floatx80_arctan(floatx80_div(rFn,rFm));
                    272: }
                    273: #endif

unix.superglobalmegacorp.com

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