qemu/linux-user/arm/nwfpe/single_cpdo.c
<<
>>
Prefs
   1/*
   2    NetWinder Floating Point Emulator
   3    (c) Rebel.COM, 1998,1999
   4
   5    Direct questions, comments to Scott Bambrough <scottb@netwinder.org>
   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, see <http://www.gnu.org/licenses/>.
  19*/
  20
  21#include "qemu/osdep.h"
  22#include "fpa11.h"
  23#include "fpu/softfloat.h"
  24#include "fpopcode.h"
  25
  26float32 float32_exp(float32 Fm);
  27float32 float32_ln(float32 Fm);
  28float32 float32_sin(float32 rFm);
  29float32 float32_cos(float32 rFm);
  30float32 float32_arcsin(float32 rFm);
  31float32 float32_arctan(float32 rFm);
  32float32 float32_log(float32 rFm);
  33float32 float32_tan(float32 rFm);
  34float32 float32_arccos(float32 rFm);
  35float32 float32_pow(float32 rFn,float32 rFm);
  36float32 float32_pol(float32 rFn,float32 rFm);
  37
  38unsigned 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
 199float32 float32_exp(float32 Fm)
 200{
 201//series
 202}
 203
 204float32 float32_ln(float32 Fm)
 205{
 206//series
 207}
 208
 209float32 float32_sin(float32 rFm)
 210{
 211//series
 212}
 213
 214float32 float32_cos(float32 rFm)
 215{
 216//series
 217}
 218
 219float32 float32_arcsin(float32 rFm)
 220{
 221//series
 222}
 223
 224float32 float32_arctan(float32 rFm)
 225{
 226  //series
 227}
 228
 229float32 float32_arccos(float32 rFm)
 230{
 231   //return float32_sub(halfPi,float32_arcsin(rFm));
 232}
 233
 234float32 float32_log(float32 rFm)
 235{
 236  return float32_div(float32_ln(rFm),getSingleConstant(7));
 237}
 238
 239float32 float32_tan(float32 rFm)
 240{
 241  return float32_div(float32_sin(rFm),float32_cos(rFm));
 242}
 243
 244float32 float32_pow(float32 rFn,float32 rFm)
 245{
 246  return float32_exp(float32_mul(rFm,float32_ln(rFn)));
 247}
 248
 249float32 float32_pol(float32 rFn,float32 rFm)
 250{
 251  return float32_arctan(float32_div(rFn,rFm));
 252}
 253#endif
 254