13ebdd119Saurel32 /* 23ebdd119Saurel32 NetWinder Floating Point Emulator 33ebdd119Saurel32 (c) Rebel.COM, 1998,1999 43ebdd119Saurel32 53ebdd119Saurel32 Direct questions, comments to Scott Bambrough <scottb@netwinder.org> 63ebdd119Saurel32 73ebdd119Saurel32 This program is free software; you can redistribute it and/or modify 83ebdd119Saurel32 it under the terms of the GNU General Public License as published by 93ebdd119Saurel32 the Free Software Foundation; either version 2 of the License, or 103ebdd119Saurel32 (at your option) any later version. 113ebdd119Saurel32 123ebdd119Saurel32 This program is distributed in the hope that it will be useful, 133ebdd119Saurel32 but WITHOUT ANY WARRANTY; without even the implied warranty of 143ebdd119Saurel32 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 153ebdd119Saurel32 GNU General Public License for more details. 163ebdd119Saurel32 173ebdd119Saurel32 You should have received a copy of the GNU General Public License 18*70539e18SBlue Swirl along with this program; if not, see <http://www.gnu.org/licenses/>. 193ebdd119Saurel32 */ 203ebdd119Saurel32 213ebdd119Saurel32 #include "fpa11.h" 223ebdd119Saurel32 #include "softfloat.h" 233ebdd119Saurel32 #include "fpopcode.h" 243ebdd119Saurel32 253ebdd119Saurel32 float32 float32_exp(float32 Fm); 263ebdd119Saurel32 float32 float32_ln(float32 Fm); 273ebdd119Saurel32 float32 float32_sin(float32 rFm); 283ebdd119Saurel32 float32 float32_cos(float32 rFm); 293ebdd119Saurel32 float32 float32_arcsin(float32 rFm); 303ebdd119Saurel32 float32 float32_arctan(float32 rFm); 313ebdd119Saurel32 float32 float32_log(float32 rFm); 323ebdd119Saurel32 float32 float32_tan(float32 rFm); 333ebdd119Saurel32 float32 float32_arccos(float32 rFm); 343ebdd119Saurel32 float32 float32_pow(float32 rFn,float32 rFm); 353ebdd119Saurel32 float32 float32_pol(float32 rFn,float32 rFm); 363ebdd119Saurel32 373ebdd119Saurel32 unsigned int SingleCPDO(const unsigned int opcode) 383ebdd119Saurel32 { 393ebdd119Saurel32 FPA11 *fpa11 = GET_FPA11(); 403ebdd119Saurel32 float32 rFm, rFn = float32_zero; 413ebdd119Saurel32 unsigned int Fd, Fm, Fn, nRc = 1; 423ebdd119Saurel32 433ebdd119Saurel32 Fm = getFm(opcode); 443ebdd119Saurel32 if (CONSTANT_FM(opcode)) 453ebdd119Saurel32 { 463ebdd119Saurel32 rFm = getSingleConstant(Fm); 473ebdd119Saurel32 } 483ebdd119Saurel32 else 493ebdd119Saurel32 { 503ebdd119Saurel32 switch (fpa11->fType[Fm]) 513ebdd119Saurel32 { 523ebdd119Saurel32 case typeSingle: 533ebdd119Saurel32 rFm = fpa11->fpreg[Fm].fSingle; 543ebdd119Saurel32 break; 553ebdd119Saurel32 563ebdd119Saurel32 default: return 0; 573ebdd119Saurel32 } 583ebdd119Saurel32 } 593ebdd119Saurel32 603ebdd119Saurel32 if (!MONADIC_INSTRUCTION(opcode)) 613ebdd119Saurel32 { 623ebdd119Saurel32 Fn = getFn(opcode); 633ebdd119Saurel32 switch (fpa11->fType[Fn]) 643ebdd119Saurel32 { 653ebdd119Saurel32 case typeSingle: 663ebdd119Saurel32 rFn = fpa11->fpreg[Fn].fSingle; 673ebdd119Saurel32 break; 683ebdd119Saurel32 693ebdd119Saurel32 default: return 0; 703ebdd119Saurel32 } 713ebdd119Saurel32 } 723ebdd119Saurel32 733ebdd119Saurel32 Fd = getFd(opcode); 743ebdd119Saurel32 switch (opcode & MASK_ARITHMETIC_OPCODE) 753ebdd119Saurel32 { 763ebdd119Saurel32 /* dyadic opcodes */ 773ebdd119Saurel32 case ADF_CODE: 783ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_add(rFn,rFm, &fpa11->fp_status); 793ebdd119Saurel32 break; 803ebdd119Saurel32 813ebdd119Saurel32 case MUF_CODE: 823ebdd119Saurel32 case FML_CODE: 833ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_mul(rFn,rFm, &fpa11->fp_status); 843ebdd119Saurel32 break; 853ebdd119Saurel32 863ebdd119Saurel32 case SUF_CODE: 873ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_sub(rFn,rFm, &fpa11->fp_status); 883ebdd119Saurel32 break; 893ebdd119Saurel32 903ebdd119Saurel32 case RSF_CODE: 913ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_sub(rFm,rFn, &fpa11->fp_status); 923ebdd119Saurel32 break; 933ebdd119Saurel32 943ebdd119Saurel32 case DVF_CODE: 953ebdd119Saurel32 case FDV_CODE: 963ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_div(rFn,rFm, &fpa11->fp_status); 973ebdd119Saurel32 break; 983ebdd119Saurel32 993ebdd119Saurel32 case RDF_CODE: 1003ebdd119Saurel32 case FRD_CODE: 1013ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_div(rFm,rFn, &fpa11->fp_status); 1023ebdd119Saurel32 break; 1033ebdd119Saurel32 1043ebdd119Saurel32 #if 0 1053ebdd119Saurel32 case POW_CODE: 1063ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_pow(rFn,rFm); 1073ebdd119Saurel32 break; 1083ebdd119Saurel32 1093ebdd119Saurel32 case RPW_CODE: 1103ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_pow(rFm,rFn); 1113ebdd119Saurel32 break; 1123ebdd119Saurel32 #endif 1133ebdd119Saurel32 1143ebdd119Saurel32 case RMF_CODE: 1153ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_rem(rFn,rFm, &fpa11->fp_status); 1163ebdd119Saurel32 break; 1173ebdd119Saurel32 1183ebdd119Saurel32 #if 0 1193ebdd119Saurel32 case POL_CODE: 1203ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_pol(rFn,rFm); 1213ebdd119Saurel32 break; 1223ebdd119Saurel32 #endif 1233ebdd119Saurel32 1243ebdd119Saurel32 /* monadic opcodes */ 1253ebdd119Saurel32 case MVF_CODE: 1263ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = rFm; 1273ebdd119Saurel32 break; 1283ebdd119Saurel32 1293ebdd119Saurel32 case MNF_CODE: 1303ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_chs(rFm); 1313ebdd119Saurel32 break; 1323ebdd119Saurel32 1333ebdd119Saurel32 case ABS_CODE: 1343ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_abs(rFm); 1353ebdd119Saurel32 break; 1363ebdd119Saurel32 1373ebdd119Saurel32 case RND_CODE: 1383ebdd119Saurel32 case URD_CODE: 1393ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_round_to_int(rFm, &fpa11->fp_status); 1403ebdd119Saurel32 break; 1413ebdd119Saurel32 1423ebdd119Saurel32 case SQT_CODE: 1433ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_sqrt(rFm, &fpa11->fp_status); 1443ebdd119Saurel32 break; 1453ebdd119Saurel32 1463ebdd119Saurel32 #if 0 1473ebdd119Saurel32 case LOG_CODE: 1483ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_log(rFm); 1493ebdd119Saurel32 break; 1503ebdd119Saurel32 1513ebdd119Saurel32 case LGN_CODE: 1523ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_ln(rFm); 1533ebdd119Saurel32 break; 1543ebdd119Saurel32 1553ebdd119Saurel32 case EXP_CODE: 1563ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_exp(rFm); 1573ebdd119Saurel32 break; 1583ebdd119Saurel32 1593ebdd119Saurel32 case SIN_CODE: 1603ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_sin(rFm); 1613ebdd119Saurel32 break; 1623ebdd119Saurel32 1633ebdd119Saurel32 case COS_CODE: 1643ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_cos(rFm); 1653ebdd119Saurel32 break; 1663ebdd119Saurel32 1673ebdd119Saurel32 case TAN_CODE: 1683ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_tan(rFm); 1693ebdd119Saurel32 break; 1703ebdd119Saurel32 1713ebdd119Saurel32 case ASN_CODE: 1723ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_arcsin(rFm); 1733ebdd119Saurel32 break; 1743ebdd119Saurel32 1753ebdd119Saurel32 case ACS_CODE: 1763ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_arccos(rFm); 1773ebdd119Saurel32 break; 1783ebdd119Saurel32 1793ebdd119Saurel32 case ATN_CODE: 1803ebdd119Saurel32 fpa11->fpreg[Fd].fSingle = float32_arctan(rFm); 1813ebdd119Saurel32 break; 1823ebdd119Saurel32 #endif 1833ebdd119Saurel32 1843ebdd119Saurel32 case NRM_CODE: 1853ebdd119Saurel32 break; 1863ebdd119Saurel32 1873ebdd119Saurel32 default: 1883ebdd119Saurel32 { 1893ebdd119Saurel32 nRc = 0; 1903ebdd119Saurel32 } 1913ebdd119Saurel32 } 1923ebdd119Saurel32 1933ebdd119Saurel32 if (0 != nRc) fpa11->fType[Fd] = typeSingle; 1943ebdd119Saurel32 return nRc; 1953ebdd119Saurel32 } 1963ebdd119Saurel32 1973ebdd119Saurel32 #if 0 1983ebdd119Saurel32 float32 float32_exp(float32 Fm) 1993ebdd119Saurel32 { 2003ebdd119Saurel32 //series 2013ebdd119Saurel32 } 2023ebdd119Saurel32 2033ebdd119Saurel32 float32 float32_ln(float32 Fm) 2043ebdd119Saurel32 { 2053ebdd119Saurel32 //series 2063ebdd119Saurel32 } 2073ebdd119Saurel32 2083ebdd119Saurel32 float32 float32_sin(float32 rFm) 2093ebdd119Saurel32 { 2103ebdd119Saurel32 //series 2113ebdd119Saurel32 } 2123ebdd119Saurel32 2133ebdd119Saurel32 float32 float32_cos(float32 rFm) 2143ebdd119Saurel32 { 2153ebdd119Saurel32 //series 2163ebdd119Saurel32 } 2173ebdd119Saurel32 2183ebdd119Saurel32 float32 float32_arcsin(float32 rFm) 2193ebdd119Saurel32 { 2203ebdd119Saurel32 //series 2213ebdd119Saurel32 } 2223ebdd119Saurel32 2233ebdd119Saurel32 float32 float32_arctan(float32 rFm) 2243ebdd119Saurel32 { 2253ebdd119Saurel32 //series 2263ebdd119Saurel32 } 2273ebdd119Saurel32 2283ebdd119Saurel32 float32 float32_arccos(float32 rFm) 2293ebdd119Saurel32 { 2303ebdd119Saurel32 //return float32_sub(halfPi,float32_arcsin(rFm)); 2313ebdd119Saurel32 } 2323ebdd119Saurel32 2333ebdd119Saurel32 float32 float32_log(float32 rFm) 2343ebdd119Saurel32 { 2353ebdd119Saurel32 return float32_div(float32_ln(rFm),getSingleConstant(7)); 2363ebdd119Saurel32 } 2373ebdd119Saurel32 2383ebdd119Saurel32 float32 float32_tan(float32 rFm) 2393ebdd119Saurel32 { 2403ebdd119Saurel32 return float32_div(float32_sin(rFm),float32_cos(rFm)); 2413ebdd119Saurel32 } 2423ebdd119Saurel32 2433ebdd119Saurel32 float32 float32_pow(float32 rFn,float32 rFm) 2443ebdd119Saurel32 { 2453ebdd119Saurel32 return float32_exp(float32_mul(rFm,float32_ln(rFn))); 2463ebdd119Saurel32 } 2473ebdd119Saurel32 2483ebdd119Saurel32 float32 float32_pol(float32 rFn,float32 rFm) 2493ebdd119Saurel32 { 2503ebdd119Saurel32 return float32_arctan(float32_div(rFn,rFm)); 2513ebdd119Saurel32 } 2523ebdd119Saurel32 #endif 253