extended_cpdo.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:6k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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