Annotation of qemu/linux-user/arm/nwfpe/single_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: float32 float32_exp(float32 Fm);
                     27: float32 float32_ln(float32 Fm);
                     28: float32 float32_sin(float32 rFm);
                     29: float32 float32_cos(float32 rFm);
                     30: float32 float32_arcsin(float32 rFm);
                     31: float32 float32_arctan(float32 rFm);
                     32: float32 float32_log(float32 rFm);
                     33: float32 float32_tan(float32 rFm);
                     34: float32 float32_arccos(float32 rFm);
                     35: float32 float32_pow(float32 rFn,float32 rFm);
                     36: float32 float32_pol(float32 rFn,float32 rFm);
                     37: 
                     38: unsigned int SingleCPDO(const unsigned int opcode)
                     39: {
                     40:    FPA11 *fpa11 = GET_FPA11();
                     41:    float32 rFm, rFn = float32_zero;
                     42:    unsigned int Fd, Fm, Fn, nRc = 1;
                     43: 
                     44:    Fm = getFm(opcode);
                     45:    if (CONSTANT_FM(opcode))
                     46:    {
                     47:      rFm = getSingleConstant(Fm);
                     48:    }
                     49:    else
                     50:    {
                     51:      switch (fpa11->fType[Fm])
                     52:      {
                     53:         case typeSingle:
                     54:           rFm = fpa11->fpreg[Fm].fSingle;
                     55:         break;
                     56: 
                     57:         default: return 0;
                     58:      }
                     59:    }
                     60: 
                     61:    if (!MONADIC_INSTRUCTION(opcode))
                     62:    {
                     63:       Fn = getFn(opcode);
                     64:       switch (fpa11->fType[Fn])
                     65:       {
                     66:         case typeSingle:
                     67:           rFn = fpa11->fpreg[Fn].fSingle;
                     68:         break;
                     69: 
                     70:         default: return 0;
                     71:       }
                     72:    }
                     73: 
                     74:    Fd = getFd(opcode);
                     75:    switch (opcode & MASK_ARITHMETIC_OPCODE)
                     76:    {
                     77:       /* dyadic opcodes */
                     78:       case ADF_CODE:
                     79:          fpa11->fpreg[Fd].fSingle = float32_add(rFn,rFm, &fpa11->fp_status);
                     80:       break;
                     81: 
                     82:       case MUF_CODE:
                     83:       case FML_CODE:
                     84:         fpa11->fpreg[Fd].fSingle = float32_mul(rFn,rFm, &fpa11->fp_status);
                     85:       break;
                     86: 
                     87:       case SUF_CODE:
                     88:          fpa11->fpreg[Fd].fSingle = float32_sub(rFn,rFm, &fpa11->fp_status);
                     89:       break;
                     90: 
                     91:       case RSF_CODE:
                     92:          fpa11->fpreg[Fd].fSingle = float32_sub(rFm,rFn, &fpa11->fp_status);
                     93:       break;
                     94: 
                     95:       case DVF_CODE:
                     96:       case FDV_CODE:
                     97:          fpa11->fpreg[Fd].fSingle = float32_div(rFn,rFm, &fpa11->fp_status);
                     98:       break;
                     99: 
                    100:       case RDF_CODE:
                    101:       case FRD_CODE:
                    102:          fpa11->fpreg[Fd].fSingle = float32_div(rFm,rFn, &fpa11->fp_status);
                    103:       break;
                    104: 
                    105: #if 0
                    106:       case POW_CODE:
                    107:          fpa11->fpreg[Fd].fSingle = float32_pow(rFn,rFm);
                    108:       break;
                    109: 
                    110:       case RPW_CODE:
                    111:          fpa11->fpreg[Fd].fSingle = float32_pow(rFm,rFn);
                    112:       break;
                    113: #endif
                    114: 
                    115:       case RMF_CODE:
                    116:          fpa11->fpreg[Fd].fSingle = float32_rem(rFn,rFm, &fpa11->fp_status);
                    117:       break;
                    118: 
                    119: #if 0
                    120:       case POL_CODE:
                    121:          fpa11->fpreg[Fd].fSingle = float32_pol(rFn,rFm);
                    122:       break;
                    123: #endif
                    124: 
                    125:       /* monadic opcodes */
                    126:       case MVF_CODE:
                    127:          fpa11->fpreg[Fd].fSingle = rFm;
                    128:       break;
                    129: 
                    130:       case MNF_CODE:
                    131:          fpa11->fpreg[Fd].fSingle = float32_chs(rFm);
                    132:       break;
                    133: 
                    134:       case ABS_CODE:
                    135:          fpa11->fpreg[Fd].fSingle = float32_abs(rFm);
                    136:       break;
                    137: 
                    138:       case RND_CODE:
                    139:       case URD_CODE:
                    140:          fpa11->fpreg[Fd].fSingle = float32_round_to_int(rFm, &fpa11->fp_status);
                    141:       break;
                    142: 
                    143:       case SQT_CODE:
                    144:          fpa11->fpreg[Fd].fSingle = float32_sqrt(rFm, &fpa11->fp_status);
                    145:       break;
                    146: 
                    147: #if 0
                    148:       case LOG_CODE:
                    149:          fpa11->fpreg[Fd].fSingle = float32_log(rFm);
                    150:       break;
                    151: 
                    152:       case LGN_CODE:
                    153:          fpa11->fpreg[Fd].fSingle = float32_ln(rFm);
                    154:       break;
                    155: 
                    156:       case EXP_CODE:
                    157:          fpa11->fpreg[Fd].fSingle = float32_exp(rFm);
                    158:       break;
                    159: 
                    160:       case SIN_CODE:
                    161:          fpa11->fpreg[Fd].fSingle = float32_sin(rFm);
                    162:       break;
                    163: 
                    164:       case COS_CODE:
                    165:          fpa11->fpreg[Fd].fSingle = float32_cos(rFm);
                    166:       break;
                    167: 
                    168:       case TAN_CODE:
                    169:          fpa11->fpreg[Fd].fSingle = float32_tan(rFm);
                    170:       break;
                    171: 
                    172:       case ASN_CODE:
                    173:          fpa11->fpreg[Fd].fSingle = float32_arcsin(rFm);
                    174:       break;
                    175: 
                    176:       case ACS_CODE:
                    177:          fpa11->fpreg[Fd].fSingle = float32_arccos(rFm);
                    178:       break;
                    179: 
                    180:       case ATN_CODE:
                    181:          fpa11->fpreg[Fd].fSingle = float32_arctan(rFm);
                    182:       break;
                    183: #endif
                    184: 
                    185:       case NRM_CODE:
                    186:       break;
                    187: 
                    188:       default:
                    189:       {
                    190:         nRc = 0;
                    191:       }
                    192:    }
                    193: 
                    194:    if (0 != nRc) fpa11->fType[Fd] = typeSingle;
                    195:    return nRc;
                    196: }
                    197: 
                    198: #if 0
                    199: float32 float32_exp(float32 Fm)
                    200: {
                    201: //series
                    202: }
                    203: 
                    204: float32 float32_ln(float32 Fm)
                    205: {
                    206: //series
                    207: }
                    208: 
                    209: float32 float32_sin(float32 rFm)
                    210: {
                    211: //series
                    212: }
                    213: 
                    214: float32 float32_cos(float32 rFm)
                    215: {
                    216: //series
                    217: }
                    218: 
                    219: float32 float32_arcsin(float32 rFm)
                    220: {
                    221: //series
                    222: }
                    223: 
                    224: float32 float32_arctan(float32 rFm)
                    225: {
                    226:   //series
                    227: }
                    228: 
                    229: float32 float32_arccos(float32 rFm)
                    230: {
                    231:    //return float32_sub(halfPi,float32_arcsin(rFm));
                    232: }
                    233: 
                    234: float32 float32_log(float32 rFm)
                    235: {
                    236:   return float32_div(float32_ln(rFm),getSingleConstant(7));
                    237: }
                    238: 
                    239: float32 float32_tan(float32 rFm)
                    240: {
                    241:   return float32_div(float32_sin(rFm),float32_cos(rFm));
                    242: }
                    243: 
                    244: float32 float32_pow(float32 rFn,float32 rFm)
                    245: {
                    246:   return float32_exp(float32_mul(rFm,float32_ln(rFn)));
                    247: }
                    248: 
                    249: float32 float32_pol(float32 rFn,float32 rFm)
                    250: {
                    251:   return float32_arctan(float32_div(rFn,rFm));
                    252: }
                    253: #endif

unix.superglobalmegacorp.com

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