|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.