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 + -
显示快捷键?