floatingpoint.c
来自「ppc750 system design simulator using sys」· C语言 代码 · 共 1,640 行 · 第 1/3 页
C
1,640 行
/*************************************************************************** floatingpoint.c - description ------------------- begin : Wed Sep 26 2001 copyright : (C) 2001 Universite Paris Sud and CEA author : Gilles Mouchard email : gilles.mouchard@lri.fr, gilles.mouchard@cea.fr ***************************************************************************//*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/#include <floatingpoint.h>#include <ppcemul.h>#include <string.h>#include <stdlib.h>#include <math.h>#include <xmlize.h>#define COMPUTE_CR1 (CR = (CR & 0xf0ffffff) | ((FPSCR >> 4) & 0x0f000000))#define SET_FPSCR_FPCC(c) (FPSCR = (FPSCR & 0xffff0fff) | ((c) << 12))#define SET_FPSCR_VSXNAN (FPSCR = FPSCR | 0x01000000)#define IS_NAN(x) (((x) & 0x7ff0000000000000) == 0x7ff0000000000000 && ((x) & 0x000fffffffffffff) != 0)#define IS_SNAN(x) (((x) & 0x7ff0000000000000) == 0x7ff0000000000000 && ((x) & 0x000fffffffffffff) != 0 && ((x) & 0x0008000000000000) == 0)BOOL IsNan(UInt64 x){ return IS_NAN(x);}BOOL IsSNan(UInt64 x){ return IS_SNAN(x);}void faddsx_impl(ppc_inst_t inst){ double a = FPR_DBL(FA); double b = FPR_DBL(FB); double result = (float)(a + b); FPR_DBL(FD) = result; if(Rc) COMPUTE_CR1; }void fdivsx_impl(ppc_inst_t inst){ double a = FPR_DBL(FA); double b = FPR_DBL(FB); double result = (float)(a / b); FPR_DBL(FD) = result; if(Rc) COMPUTE_CR1;}void fmaddsx_impl(ppc_inst_t inst){ double a = FPR_DBL(FA); double b = FPR_DBL(FB); double c = FPR_DBL(FC); double result = (float)((a * c) + b); FPR_DBL(FD) = result; if(Rc) COMPUTE_CR1;}void fmsubsx_impl(ppc_inst_t inst){ double a = FPR_DBL(FA); double b = FPR_DBL(FB); double c = FPR_DBL(FC); double result = (float)((a * c) - b); FPR_DBL(FD) = result; if(Rc) COMPUTE_CR1;}void fmulsx_impl(ppc_inst_t inst){ double a = FPR_DBL(FA); double c = FPR_DBL(FC); double result = (float)(a * c); FPR_DBL(FD) = result; if(Rc) COMPUTE_CR1; }void fnmaddsx_impl(ppc_inst_t inst){ double a = FPR_DBL(FA); double b = FPR_DBL(FB); double c = FPR_DBL(FC); double result = (float)(-((a * c) + b)); FPR_DBL(FD) = result; if(Rc) COMPUTE_CR1;}void fnmsubsx_impl(ppc_inst_t inst){ double a = FPR_DBL(FA); double b = FPR_DBL(FB); double c = FPR_DBL(FC); double result = (float)(-((a * c) - b)); FPR_DBL(FD) = result; if(Rc) COMPUTE_CR1;}void fresx_impl(ppc_inst_t inst) { abort(); }void fsqrtsx_impl(ppc_inst_t inst) { abort(); }void fsubsx_impl(ppc_inst_t inst){ double a = FPR_DBL(FA); double b = FPR_DBL(FB); double result = (float)(a - b); FPR_DBL(FD) = result; if(Rc) COMPUTE_CR1;}void fabsx_impl(ppc_inst_t inst){ double b = FPR_DBL(FB); double result = fabs(b); FPR_DBL(FD) = result; if(Rc) COMPUTE_CR1;}void fcmpo_impl(ppc_inst_t inst) { abort(); }void fcmpu_impl(ppc_inst_t inst){ double fa = FPR_DBL(FA); double fb = FPR_DBL(FB); dword_t a = FPR_DW(FA); dword_t b = FPR_DW(FB); word_t c; if(IS_NAN(a) || IS_NAN(b)) c = 1; else if(fa < fb) c = 8; else if(fa > fb) c = 4; else c =2; // SET_FPSCR_FPCC(c); CR = (CR & (~(0xf << ((7 - CRFD) * 4)))) | (c << ((7 - CRFD) * 4)); if(IS_SNAN(a) || IS_SNAN(b)) {// SET_FPSCR_VSXNAN; }}void fctiwx_impl(ppc_inst_t inst) { abort(); }void fctiwzx_impl(ppc_inst_t inst){ double b = FPR_DBL(FB); sword_t res = (sword_t) b; FPR_DW(FD) = (dword_t)(word_t) res;}void fmrx_impl(ppc_inst_t inst){ FPR_DW(FD) = FPR_DW(FB); if(Rc) COMPUTE_CR1;}void fnabsx_impl(ppc_inst_t inst){ double b = FPR_DBL(FB); double result = -fabs(b); FPR_DBL(FD) = result; if(Rc) COMPUTE_CR1;}void fnegx_impl(ppc_inst_t inst){ double b = FPR_DBL(FB); double result = -b; FPR_DBL(FD) = result; if(Rc) COMPUTE_CR1;}void frspx_impl(ppc_inst_t inst){ FPR_DBL(FD) = (float) FPR_DBL(FB); if(Rc) COMPUTE_CR1;}void faddx_impl(ppc_inst_t inst){ double a = FPR_DBL(FA); double b = FPR_DBL(FB); double result = a + b; FPR_DBL(FD) = result; if(Rc) COMPUTE_CR1;}void fdivx_impl(ppc_inst_t inst){ double a = FPR_DBL(FA); double b = FPR_DBL(FB); double result = a / b; FPR_DBL(FD) = result; if(Rc) COMPUTE_CR1;}void fmaddx_impl(ppc_inst_t inst){ double a = FPR_DBL(FA); double b = FPR_DBL(FB); double c = FPR_DBL(FC); double result = (a * c) + b; FPR_DBL(FD) = result; if(Rc) COMPUTE_CR1;}void fmsubx_impl(ppc_inst_t inst){ double a = FPR_DBL(FA); double b = FPR_DBL(FB); double c = FPR_DBL(FC); double result = (a * c) - b; FPR_DBL(FD) = result; if(Rc) COMPUTE_CR1; }void fmulx_impl(ppc_inst_t inst){ double a = FPR_DBL(FA); double c = FPR_DBL(FC); double result = a * c; FPR_DBL(FD) = result; if(Rc) COMPUTE_CR1; }void fnmaddx_impl(ppc_inst_t inst){ double a = FPR_DBL(FA); double b = FPR_DBL(FB); double c = FPR_DBL(FC); double result = -((a * c) + b); FPR_DBL(FD) = result; if(Rc) COMPUTE_CR1;}void fnmsubx_impl(ppc_inst_t inst){ double a = FPR_DBL(FA); double b = FPR_DBL(FB); double c = FPR_DBL(FC); double result = -((a * c) - b); FPR_DBL(FD) = result; if(Rc) COMPUTE_CR1;}void frsqrtex_impl(ppc_inst_t inst) { abort(); }void fselx_impl(ppc_inst_t inst) { abort(); }void fsqrtx_impl(ppc_inst_t inst) { abort(); }void fsubx_impl(ppc_inst_t inst){ double a = FPR_DBL(FA); double b = FPR_DBL(FB); double result = a - b; FPR_DBL(FD) = result; if(Rc) COMPUTE_CR1;}char *faddsx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tdouble a = FPR_DBL(%u);\n", FA); buf += sprintf(buf, "\tdouble b = FPR_DBL(%u);\n", FB); buf += sprintf(buf, "\tdouble result = (float)(a + b);\n"); buf += sprintf(buf, "\tFPR_DBL(%u) = result;\n", FD); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR1;\n"); return buf;}char *fdivsx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tdouble a = FPR_DBL(%u);\n", FA); buf += sprintf(buf, "\tdouble b = FPR_DBL(%u);\n", FB); buf += sprintf(buf, "\tdouble result = (float)(a / b);\n"); buf += sprintf(buf, "\tFPR_DBL(%u) = result;\n", FD); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR1;\n"); return buf;}char *fmaddsx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tdouble a = FPR_DBL(%u);\n", FA); buf += sprintf(buf, "\tdouble b = FPR_DBL(%u);\n", FB); buf += sprintf(buf, "\tdouble c = FPR_DBL(%u);\n", FC); buf += sprintf(buf, "\tdouble result = (float)((a * c) + b);\n"); buf += sprintf(buf, "\tFPR_DBL(%u) = result\n", FD); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR1;\n"); return buf;}char *fmsubsx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tdouble a = FPR_DBL(%u);\n", FA); buf += sprintf(buf, "\tdouble b = FPR_DBL(%u);\n", FB); buf += sprintf(buf, "\tdouble c = FPR_DBL(%u);\n", FC); buf += sprintf(buf, "\tdouble result = (float)((a * c) - b);\n"); buf += sprintf(buf, "\tFPR_DBL(%u) = result;\n", FD); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR1;\n"); return buf;}char *fmulsx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tdouble a = FPR_DBL(%u);\n", FA); buf += sprintf(buf, "\tdouble c = FPR_DBL(%u);\n", FC); buf += sprintf(buf, "\tdouble result = (float)(a * c);\n"); buf += sprintf(buf, "\tFPR_DBL(%u) = result;\n", FD); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR1;\n"); return buf;}char *fnmaddsx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tdouble a = FPR_DBL(%u);\n", FA); buf += sprintf(buf, "\tdouble b = FPR_DBL(%u);\n", FB); buf += sprintf(buf, "\tdouble c = FPR_DBL(%u);\n", FC); buf += sprintf(buf, "\tdouble result = (float)(-((a * c) + b));\n"); buf += sprintf(buf, "\tFPR_DBL(%u) = result;\n", FD); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR1;\n"); return buf;}char *fnmsubsx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tdouble a = FPR_DBL(%u);\n", FA); buf += sprintf(buf, "\tdouble b = FPR_DBL(%u);\n", FB); buf += sprintf(buf, "\tdouble c = FPR_DBL(%u);\n", FC); buf += sprintf(buf, "\tdouble result = (float)(-((a * c) - b));\n"); buf += sprintf(buf, "\tFPR_DBL(%u) = result;\n", FD); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR1;\n"); return buf;}char *fresx_bin2c(ppc_inst_t inst,addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }char *fsqrtsx_bin2c(ppc_inst_t inst,addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }char *fsubsx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tdouble a = FPR_DBL(%u);\n", FA); buf += sprintf(buf, "\tdouble b = FPR_DBL(%u);\n", FB); buf += sprintf(buf, "\tdouble result = (float)(a - b);\n"); buf += sprintf(buf, "\tFPR_DBL(%u) = result;\n", FD); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR1;\n"); return buf;}char *fabsx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tdouble b = FPR_DBL(%u);\n", FB); buf += sprintf(buf, "\tdouble result = fabs(b);\n"); buf += sprintf(buf, "\tFPR_DBL(%u) = result;\n", FD); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR1;\n"); return buf;}char *fcmpo_bin2c(ppc_inst_t inst,addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }char *fcmpu_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tdouble fa = FPR_DBL(%u);\n", FA); buf += sprintf(buf, "\tdouble fb = FPR_DBL(%u);\n", FB); buf += sprintf(buf, "\tdword_t a = FPR_DW(%u);\n", FA); buf += sprintf(buf, "\tdword_t b = FPR_DW(%u);\n", FB); buf += sprintf(buf, "\tword_t c\n"); buf += sprintf(buf, "\tif(IS_NAN(a) || IS_NAN(b)) c = 1; else\n"); buf += sprintf(buf, "\tif(fa < fb) c = 8; else\n"); buf += sprintf(buf, "\tif(fa > fb) c = 4; else c =2\n"); // SET_FPSCR_FPCC(c);\n"); buf += sprintf(buf, "\tCR = (CR & (~(0xf << ((7 - %u) * 4)))) | (c << ((7 - %u) * 4));\n", CRFD, CRFD);//if(IS_SNAN(a) || IS_SNAN(b))// {// SET_FPSCR_VSXNAN\n");// } return buf;}char *fctiwx_bin2c(ppc_inst_t inst,addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }char *fctiwzx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tdouble b = FPR_DBL(%u);\n", FB); buf += sprintf(buf, "\tsword_t res = (sword_t) b;\n"); buf += sprintf(buf, "\tFPR_DW(%u) = (dword_t)(word_t) res;\n", FD); return buf;}char *fmrx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tFPR_DW(%u) = FPR_DW(%u);\n", FD, FB); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR1;\n"); return buf;}char *fnabsx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tdouble b = FPR_DBL(%u);\n", FB); buf += sprintf(buf, "\tdouble result = -fabs(b);\n"); buf += sprintf(buf, "\tFPR_DBL(%u) = result;\n", FD); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR1;\n"); return buf;}char *fnegx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tdouble b = FPR_DBL(%u);\n", FB); buf += sprintf(buf, "\tdouble result = -b;\n"); buf += sprintf(buf, "\tFPR_DBL(%u) = result;\n", FD); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR1;\n"); return buf;}char *frspx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tFPR_DBL(%u) = (float) FPR_DBL(%u);\n", FD, FB); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR1;\n"); return buf;}char *faddx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tdouble a = FPR_DBL(%u);\n", FA); buf += sprintf(buf, "\tdouble b = FPR_DBL(%u);\n", FB); buf += sprintf(buf, "\tdouble result = a + b;\n"); buf += sprintf(buf, "\tFPR_DBL(%u) = result;\n", FD); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR1;\n"); return buf;}char *fdivx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tdouble a = FPR_DBL(%u);\n", FA); buf += sprintf(buf, "\tdouble b = FPR_DBL(%u);\n", FB); buf += sprintf(buf, "\tdouble result = a / b;\n"); buf += sprintf(buf, "\tFPR_DBL(%u) = result;\n", FD); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR1;\n"); return buf;}char *fmaddx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tdouble a = FPR_DBL(%u);\n", FA); buf += sprintf(buf, "\tdouble b = FPR_DBL(%u);\n", FB); buf += sprintf(buf, "\tdouble c = FPR_DBL(%u);\n", FC); buf += sprintf(buf, "\tdouble result = (a * c) + b;\n"); buf += sprintf(buf, "\tFPR_DBL(%u) = result;\n", FD); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR1;\n"); return buf;}char *fmsubx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tdouble a = FPR_DBL(%u);\n", FA); buf += sprintf(buf, "\tdouble b = FPR_DBL(%u);\n", FB); buf += sprintf(buf, "\tdouble c = FPR_DBL(%u);\n", FC); buf += sprintf(buf, "\tdouble result = (a * c) - b;\n"); buf += sprintf(buf, "\tFPR_DBL(%u) = result;\n", FD); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR1;\n"); return buf;}char *fmulx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tdouble a = FPR_DBL(%u);\n", FA); buf += sprintf(buf, "\tdouble c = FPR_DBL(%u);\n", FC); buf += sprintf(buf, "\tdouble result = a * c;\n"); buf += sprintf(buf, "\tFPR_DBL(%u) = result;\n", FD); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR1;\n"); return buf;}char *fnmaddx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tdouble a = FPR_DBL(%u);\n", FA); buf += sprintf(buf, "\tdouble b = FPR_DBL(%u);\n", FB); buf += sprintf(buf, "\tdouble c = FPR_DBL(%u);\n", FC); buf += sprintf(buf, "\tdouble result = -((a * c) + b);\n"); buf += sprintf(buf, "\tFPR_DBL(%u) = result;\n", FD); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR1;\n"); return buf;}char *fnmsubx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tdouble a = FPR_DBL(%u);\n", FA); buf += sprintf(buf, "\tdouble b = FPR_DBL(%u);\n", FB); buf += sprintf(buf, "\tdouble c = FPR_DBL(%u);\n", FC); buf += sprintf(buf, "\tdouble result = -((a * c) - b);\n"); buf += sprintf(buf, "\tFPR_DBL(%u) = result;\n", FD); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR1;\n"); return buf;}char *frsqrtex_bin2c(ppc_inst_t inst,addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }char *fselx_bin2c(ppc_inst_t inst,addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }char *fsqrtx_bin2c(ppc_inst_t inst,addr_t pc, char *buf) { buf += sprintf(buf, "\tabort();\n"); return buf; }char *fsubx_bin2c(ppc_inst_t inst,addr_t pc, char *buf){ buf += sprintf(buf, "\tdouble a = FPR_DBL(%u);\n", FA); buf += sprintf(buf, "\tdouble b = FPR_DBL(%u);\n", FB); buf += sprintf(buf, "\tdouble result = a - b;\n"); buf += sprintf(buf, "\tFPR_DBL(%u) = result;\n", FD); if(Rc) buf += sprintf(buf, "\tCOMPUTE_CR1;\n"); return buf;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?