亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? maverick.c

?? skyeye是一個可以模擬嵌入式硬件開發板的系統軟件
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*  maverick.c -- Cirrus/DSP co-processor interface.    Copyright (C) 2003 Free Software Foundation, Inc.    Contributed by Aldy Hernandez (aldyh@redhat.com).     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.     This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    GNU General Public License for more details.     You should have received a copy of the GNU General Public License    along with this program; if not, write to the Free Software    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */#include <assert.h>#include "armdefs.h"#include "ansidecl.h"#include "armemu.h"/*#define CIRRUS_DEBUG 1	*/#if CIRRUS_DEBUG#  define printfdbg printf#else#  define printfdbg printf_nothing#endif#define POS64(i) ( (~(i)) >> 63 )#define NEG64(i) ( (i) >> 63 )/* Define Co-Processor instruction handlers here.  *//* Here's ARMulator's DSP definition.  A few things to note:   1) it has 16 64-bit registers and 4 72-bit accumulators   2) you can only access its registers with MCR and MRC.  *//* We can't define these in here because this file might not be linked   unless the target is arm9e-*.  They are defined in wrapper.c.   Eventually the simulator should be made to handle any coprocessor   at run time.  */struct maverick_regs{	union	{		int i;		float f;	} upper;	union	{		int i;		float f;	} lower;};union maverick_acc_regs{	long double ld;		/* Acc registers are 72-bits.  */};struct maverick_regs DSPregs[16];union maverick_acc_regs DSPacc[4];ARMword DSPsc;#define DEST_REG	(BITS (12, 15))#define SRC1_REG	(BITS (16, 19))#define SRC2_REG	(BITS (0, 3))static int lsw_int_index, msw_int_index;static int lsw_float_index, msw_float_index;static double mv_getRegDouble (int);static long long mv_getReg64int (int);static void mv_setRegDouble (int, double val);static void mv_setReg64int (int, long long val);static union{	double d;	long long ll;	int ints[2];} reg_conv;static voidprintf_nothing (void *foo, ...){}static voidcirrus_not_implemented (char *insn){	fprintf (stderr, "Cirrus instruction '%s' not implemented.\n", insn);	fprintf (stderr, "aborting!\n");	skyeye_exit (1);}static unsignedDSPInit (ARMul_State * state){	ARMul_ConsolePrint (state, ", DSP present");	return TRUE;}unsignedDSPMRC4 (ARMul_State * state ATTRIBUTE_UNUSED,	 unsigned type ATTRIBUTE_UNUSED, ARMword instr, ARMword * value){	switch (BITS (5, 7)) {	case 0:		/* cfmvrdl */		/* Move lower half of a DF stored in a DSP reg into an Arm reg.  */		printfdbg ("cfmvrdl\n");		printfdbg ("\tlower half=0x%x\n", DSPregs[SRC1_REG].lower.i);		printfdbg ("\tentire thing=%g\n", mv_getRegDouble (SRC1_REG));		*value = (ARMword) DSPregs[SRC1_REG].lower.i;		break;	case 1:		/* cfmvrdh */		/* Move upper half of a DF stored in a DSP reg into an Arm reg.  */		printfdbg ("cfmvrdh\n");		printfdbg ("\tupper half=0x%x\n", DSPregs[SRC1_REG].upper.i);		printfdbg ("\tentire thing=%g\n", mv_getRegDouble (SRC1_REG));		*value = (ARMword) DSPregs[SRC1_REG].upper.i;		break;	case 2:		/* cfmvrs */		/* Move SF from upper half of a DSP register to an Arm register.  */		*value = (ARMword) DSPregs[SRC1_REG].upper.i;		printfdbg ("cfmvrs = mvf%d <-- %f\n",			   SRC1_REG, DSPregs[SRC1_REG].upper.f);		break;#ifdef doesnt_work	case 4:		/* cfcmps */		{			float a, b;			int n, z, c, v;			a = DSPregs[SRC1_REG].upper.f;			b = DSPregs[SRC2_REG].upper.f;			printfdbg ("cfcmps\n");			printfdbg ("\tcomparing %f and %f\n", a, b);			z = a == b;	/* zero */			n = a != b;	/* negative */			v = a > b;	/* overflow */			c = 0;	/* carry */			*value = (n << 31) | (z << 30) | (c << 29) | (v <<								      28);			break;		}	case 5:		/* cfcmpd */		{			double a, b;			int n, z, c, v;			a = mv_getRegDouble (SRC1_REG);			b = mv_getRegDouble (SRC2_REG);			printfdbg ("cfcmpd\n");			printfdbg ("\tcomparing %g and %g\n", a, b);			z = a == b;	/* zero */			n = a != b;	/* negative */			v = a > b;	/* overflow */			c = 0;	/* carry */			*value = (n << 31) | (z << 30) | (c << 29) | (v <<								      28);			break;		}#else	case 4:		/* cfcmps */		{			float a, b;			int n, z, c, v;			a = DSPregs[SRC1_REG].upper.f;			b = DSPregs[SRC2_REG].upper.f;			printfdbg ("cfcmps\n");			printfdbg ("\tcomparing %f and %f\n", a, b);			z = a == b;	/* zero */			n = a < b;	/* negative */			c = a > b;	/* carry */			v = 0;	/* fixme */			printfdbg ("\tz = %d, n = %d\n", z, n);			*value = (n << 31) | (z << 30) | (c << 29) | (v <<								      28);			break;		}	case 5:		/* cfcmpd */		{			double a, b;			int n, z, c, v;			a = mv_getRegDouble (SRC1_REG);			b = mv_getRegDouble (SRC2_REG);			printfdbg ("cfcmpd\n");			printfdbg ("\tcomparing %g and %g\n", a, b);			z = a == b;	/* zero */			n = a < b;	/* negative */			c = a > b;	/* carry */			v = 0;	/* fixme */			*value = (n << 31) | (z << 30) | (c << 29) | (v <<								      28);			break;		}#endif	default:		fprintf (stderr, "unknown opcode in DSPMRC4 0x%x\n", instr);		cirrus_not_implemented ("unknown");		break;	}	return ARMul_DONE;}unsignedDSPMRC5 (ARMul_State * state ATTRIBUTE_UNUSED,	 unsigned type ATTRIBUTE_UNUSED, ARMword instr, ARMword * value){	switch (BITS (5, 7)) {	case 0:		/* cfmvr64l */		/* Move lower half of 64bit int from Cirrus to Arm.  */		*value = (ARMword) DSPregs[SRC1_REG].lower.i;		printfdbg ("cfmvr64l ARM_REG = mvfx%d <-- %d\n",			   DEST_REG, (int) *value);		break;	case 1:		/* cfmvr64h */		/* Move upper half of 64bit int from Cirrus to Arm.  */		*value = (ARMword) DSPregs[SRC1_REG].upper.i;		printfdbg ("cfmvr64h <-- %d\n", (int) *value);		break;	case 4:		/* cfcmp32 */		{			int res;			int n, z, c, v;			unsigned int a, b;			printfdbg ("cfcmp32 mvfx%d - mvfx%d\n", SRC1_REG,				   SRC2_REG);			/* FIXME: see comment for cfcmps.  */			a = DSPregs[SRC1_REG].lower.i;			b = DSPregs[SRC2_REG].lower.i;			res = DSPregs[SRC1_REG].lower.i -				DSPregs[SRC2_REG].lower.i;			/* zero */			z = res == 0;			/* negative */			n = res < 0;			/* overflow */			v = SubOverflow (DSPregs[SRC1_REG].lower.i,					 DSPregs[SRC2_REG].lower.i, res);			/* carry */			c = (NEG (a) && POS (b) ||			     (NEG (a) && POS (res)) || (POS (b)							&& POS (res)));			*value = (n << 31) | (z << 30) | (c << 29) | (v <<								      28);			break;		}	case 5:		/* cfcmp64 */		{			long long res;			int n, z, c, v;			unsigned long long a, b;			printfdbg ("cfcmp64 mvdx%d - mvdx%d\n", SRC1_REG,				   SRC2_REG);			/* fixme: see comment for cfcmps.  */			a = mv_getReg64int (SRC1_REG);			b = mv_getReg64int (SRC2_REG);			res = mv_getReg64int (SRC1_REG) -				mv_getReg64int (SRC2_REG);			/* zero */			z = res == 0;			/* negative */			n = res < 0;			/* overflow */			v = ((NEG64 (a) && POS64 (b) && POS64 (res))			     || (POS64 (a) && NEG64 (b) && NEG64 (res)));			/* carry */			c = (NEG64 (a) && POS64 (b) ||			     (NEG64 (a) && POS64 (res)) || (POS64 (b)							    && POS64 (res)));			*value = (n << 31) | (z << 30) | (c << 29) | (v <<								      28);			break;		}	default:		fprintf (stderr, "unknown opcode in DSPMRC5 0x%x\n", instr);		cirrus_not_implemented ("unknown");		break;	}	return ARMul_DONE;}unsignedDSPMRC6 (ARMul_State * state ATTRIBUTE_UNUSED,	 unsigned type ATTRIBUTE_UNUSED, ARMword instr, ARMword * value){	switch (BITS (5, 7)) {	case 0:		/* cfmval32 */		cirrus_not_implemented ("cfmval32");		break;	case 1:		/* cfmvam32 */		cirrus_not_implemented ("cfmvam32");		break;	case 2:		/* cfmvah32 */		cirrus_not_implemented ("cfmvah32");		break;	case 3:		/* cfmva32 */		cirrus_not_implemented ("cfmva32");		break;	case 4:		/* cfmva64 */		cirrus_not_implemented ("cfmva64");		break;	case 5:		/* cfmvsc32 */		cirrus_not_implemented ("cfmvsc32");		break;	default:		fprintf (stderr, "unknown opcode in DSPMRC6 0x%x\n", instr);		cirrus_not_implemented ("unknown");		break;	}	return ARMul_DONE;}unsignedDSPMCR4 (ARMul_State * state,	 unsigned type ATTRIBUTE_UNUSED, ARMword instr, ARMword value){	switch (BITS (5, 7)) {	case 0:		/* cfmvdlr */		/* Move the lower half of a DF value from an Arm register into		   the lower half of a Cirrus register.  */		printfdbg ("cfmvdlr <-- 0x%x\n", (int) value);		DSPregs[SRC1_REG].lower.i = (int) value;		break;	case 1:		/* cfmvdhr */		/* Move the upper half of a DF value from an Arm register into		   the upper half of a Cirrus register.  */		printfdbg ("cfmvdhr <-- 0x%x\n", (int) value);		DSPregs[SRC1_REG].upper.i = (int) value;		break;	case 2:		/* cfmvsr */		/* Move SF from Arm register into upper half of Cirrus register.  */		printfdbg ("cfmvsr <-- 0x%x\n", (int) value);		DSPregs[SRC1_REG].upper.i = (int) value;		break;	default:		fprintf (stderr, "unknown opcode in DSPMCR4 0x%x\n", instr);		cirrus_not_implemented ("unknown");		break;	}	return ARMul_DONE;}unsignedDSPMCR5 (ARMul_State * state,	 unsigned type ATTRIBUTE_UNUSED, ARMword instr, ARMword value){	union	{		int s;		unsigned int us;	} val;	switch (BITS (5, 7)) {	case 0:		/* cfmv64lr */		/* Move lower half of a 64bit int from an ARM register into the		   lower half of a DSP register and sign extend it.  */		printfdbg ("cfmv64lr mvdx%d <-- 0x%x\n", SRC1_REG,			   (int) value);		DSPregs[SRC1_REG].lower.i = (int) value;		break;	case 1:		/* cfmv64hr */		/* Move upper half of a 64bit int from an ARM register into the		   upper half of a DSP register.  */		printfdbg ("cfmv64hr ARM_REG = mvfx%d <-- 0x%x\n",			   SRC1_REG, (int) value);		DSPregs[SRC1_REG].upper.i = (int) value;		break;	case 2:		/* cfrshl32 */		printfdbg ("cfrshl32\n");		val.us = value;		if (val.s > 0)			DSPregs[SRC2_REG].lower.i =				DSPregs[SRC1_REG].lower.i << value;		else			DSPregs[SRC2_REG].lower.i =				DSPregs[SRC1_REG].lower.i >> -value;		break;	case 3:		/* cfrshl64 */		printfdbg ("cfrshl64\n");		val.us = value;		if (val.s > 0)			mv_setReg64int (SRC2_REG,					mv_getReg64int (SRC1_REG) << value);		else			mv_setReg64int (SRC2_REG,					mv_getReg64int (SRC1_REG) >> -value);		break;	default:		fprintf (stderr, "unknown opcode in DSPMCR5 0x%x\n", instr);		cirrus_not_implemented ("unknown");		break;	}	return ARMul_DONE;}unsignedDSPMCR6 (ARMul_State * state,	 unsigned type ATTRIBUTE_UNUSED, ARMword instr, ARMword value){	switch (BITS (5, 7)) {	case 0:		/* cfmv32al */		cirrus_not_implemented ("cfmv32al");		break;	case 1:		/* cfmv32am */		cirrus_not_implemented ("cfmv32am");		break;	case 2:		/* cfmv32ah */		cirrus_not_implemented ("cfmv32ah");		break;	case 3:		/* cfmv32a */		cirrus_not_implemented ("cfmv32a");		break;	case 4:		/* cfmv64a */		cirrus_not_implemented ("cfmv64a");		break;	case 5:		/* cfmv32sc */		cirrus_not_implemented ("cfmv32sc");		break;	default:		fprintf (stderr, "unknown opcode in DSPMCR6 0x%x\n", instr);		cirrus_not_implemented ("unknown");		break;	}	return ARMul_DONE;}unsignedDSPLDC4 (ARMul_State * state ATTRIBUTE_UNUSED,	 unsigned type, ARMword instr, ARMword data){	static unsigned words;	if (type != ARMul_DATA) {		words = 0;		return ARMul_DONE;	}	if (BIT (22)) {		/* it's a long access, get two words */		/* cfldrd */		printfdbg			("cfldrd: %x (words = %d) (bigend = %d) DESTREG = %d\n",			 data, words, state->bigendSig, DEST_REG);		if (words == 0) {			if (state->bigendSig)				DSPregs[DEST_REG].upper.i = (int) data;			else				DSPregs[DEST_REG].lower.i = (int) data;		}		else {			if (state->bigendSig)				DSPregs[DEST_REG].lower.i = (int) data;			else				DSPregs[DEST_REG].upper.i = (int) data;		}		++words;		if (words == 2) {			printfdbg ("\tmvd%d <-- mem = %g\n", DEST_REG,				   mv_getRegDouble (DEST_REG));			return ARMul_DONE;		}		else			return ARMul_INC;	}	else {		/* Get just one word.  */		/* cfldrs */		printfdbg ("cfldrs\n");		DSPregs[DEST_REG].upper.i = (int) data;		printfdbg ("\tmvf%d <-- mem = %f\n", DEST_REG,			   DSPregs[DEST_REG].upper.f);		return ARMul_DONE;	}}unsignedDSPLDC5 (ARMul_State * state ATTRIBUTE_UNUSED,	 unsigned type, ARMword instr, ARMword data){	static unsigned words;	if (type != ARMul_DATA) {		words = 0;		return ARMul_DONE;	}	if (BIT (22)) {		/* It's a long access, get two words.  */		/* cfldr64 */		printfdbg ("cfldr64: %d\n", data);		if (words == 0) {			if (state->bigendSig)				DSPregs[DEST_REG].upper.i = (int) data;			else				DSPregs[DEST_REG].lower.i = (int) data;		}		else {			if (state->bigendSig)				DSPregs[DEST_REG].lower.i = (int) data;			else				DSPregs[DEST_REG].upper.i = (int) data;		}		++words;		if (words == 2) {			printfdbg ("\tmvdx%d <-- mem = %lld\n", DEST_REG,				   mv_getReg64int (DEST_REG));			return ARMul_DONE;		}		else			return ARMul_INC;	}	else {		/* Get just one word.  */		/* cfldr32 */		printfdbg ("cfldr32 mvfx%d <-- %d\n", DEST_REG, (int) data);		/* 32bit ints should be sign extended to 64bits when loaded.  */		mv_setReg64int (DEST_REG, (long long) data);		return ARMul_DONE;	}}unsignedDSPSTC4 (ARMul_State * state ATTRIBUTE_UNUSED,	 unsigned type, ARMword instr, ARMword * data)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久www成人免费无遮挡大片| 亚洲色大成网站www久久九九| 国产欧美日韩不卡免费| 一级精品视频在线观看宜春院| 久久精品国产亚洲a| 99在线热播精品免费| 日韩欧美在线网站| 亚洲欧美一区二区久久| 国产精品白丝av| 日韩欧美中文字幕一区| 亚洲一区二区中文在线| www.日韩大片| 精品福利一区二区三区 | 色婷婷综合久久久中文一区二区| 日韩写真欧美这视频| 一二三四区精品视频| 盗摄精品av一区二区三区| 欧美mv日韩mv国产网站| 午夜精品视频一区| 欧美吻胸吃奶大尺度电影| 亚洲人xxxx| 99久久99久久精品国产片果冻| 国产亚洲精品福利| 国产一区二区三区四区五区美女| 91精品国模一区二区三区| 亚洲成av人片观看| 欧美猛男gaygay网站| 亚洲自拍偷拍图区| 91黄色免费网站| 亚洲欧美电影一区二区| www.亚洲人| 亚洲日本成人在线观看| 91免费版pro下载短视频| 成人欧美一区二区三区视频网页| av一二三不卡影片| 亚洲日本va午夜在线影院| 91麻豆免费看片| 一区二区三区欧美日| 在线精品亚洲一区二区不卡| 一区二区三区在线免费视频| 欧美色图片你懂的| 午夜av一区二区三区| 欧美一级欧美三级在线观看 | 亚洲视频 欧洲视频| 91小宝寻花一区二区三区| 亚洲精品国产精华液| 欧美性受xxxx黑人xyx| 日韩国产欧美三级| 久久综合色综合88| 波多野结衣一区二区三区| 亚洲女子a中天字幕| 欧美精品成人一区二区三区四区| 视频一区视频二区中文| 精品裸体舞一区二区三区| 国产一区二区看久久| 国产精品二三区| 在线观看亚洲精品| 免费在线成人网| 中文幕一区二区三区久久蜜桃| 99re热视频这里只精品| 亚洲福利视频导航| 久久夜色精品国产欧美乱极品| 成人激情动漫在线观看| 亚洲成人免费电影| 国产午夜亚洲精品午夜鲁丝片| 97久久人人超碰| 日本不卡视频一二三区| 国产欧美一区视频| 欧美日韩一区二区三区四区五区| 国模冰冰炮一区二区| 怡红院av一区二区三区| 亚洲精品一区二区三区影院| 色综合一区二区三区| 另类小说一区二区三区| 亚洲欧美日韩成人高清在线一区| 日韩一区二区精品在线观看| 成人精品国产一区二区4080 | 一区二区中文字幕在线| 91精品国产综合久久国产大片| 国产成人免费网站| 日韩高清国产一区在线| 日韩一区欧美小说| xnxx国产精品| 91精品国产福利在线观看| 99久久精品一区| 国产高清久久久| 免费久久99精品国产| 一区二区三区久久| 国产精品嫩草影院com| 欧美一区二区网站| 欧美日韩免费一区二区三区| 99久久99精品久久久久久| 国产原创一区二区三区| 日韩电影免费一区| 亚洲午夜激情av| 亚洲色图欧美偷拍| 国产精品视频在线看| 久久美女高清视频| 日韩欧美不卡在线观看视频| 欧美熟乱第一页| 91色.com| av一区二区三区在线| 国产福利不卡视频| 国产一区二区精品久久| 麻豆专区一区二区三区四区五区| 亚洲第一久久影院| 亚洲伊人色欲综合网| 亚洲精品欧美在线| 亚洲摸摸操操av| 一区二区三区四区亚洲| 亚洲精品网站在线观看| 亚洲欧美成人一区二区三区| 日韩美女视频19| 亚洲人精品一区| 亚洲美女精品一区| 亚洲一区二区偷拍精品| 一区二区三区不卡视频在线观看| 亚洲美女视频在线| 夜夜精品浪潮av一区二区三区| 亚洲精品国产精品乱码不99| 一区二区三区蜜桃| 天天免费综合色| 看片网站欧美日韩| 国产伦精品一区二区三区视频青涩| 国产一区二区三区最好精华液| 国产美女一区二区| 成人精品一区二区三区四区| 99视频精品在线| 91久久线看在观草草青青| 在线观看网站黄不卡| 欧美精品粉嫩高潮一区二区| 欧美mv日韩mv国产网站| 日本一区二区免费在线| 亚洲男同性视频| 五月天激情小说综合| 精品无人码麻豆乱码1区2区| 粉嫩aⅴ一区二区三区四区五区| 99精品在线观看视频| 欧美日韩国产大片| 久久综合狠狠综合| 中文字幕一区二区三区在线播放| 一区二区三区欧美久久| 老司机一区二区| 成人黄色av网站在线| 欧美性大战xxxxx久久久| 欧美大肚乱孕交hd孕妇| 中文字幕不卡一区| 婷婷夜色潮精品综合在线| 狠狠狠色丁香婷婷综合激情| 91猫先生在线| 日韩一区二区精品在线观看| 国产精品日产欧美久久久久| 亚洲高清免费观看高清完整版在线观看| 日韩精品视频网| 成人不卡免费av| 69p69国产精品| 亚洲三级久久久| 精品一区二区三区日韩| 色婷婷激情综合| 久久久91精品国产一区二区精品| 亚洲卡通欧美制服中文| 精品一区免费av| 91黄色免费观看| 国产欧美日韩另类视频免费观看| 亚洲一二三专区| 成人h精品动漫一区二区三区| 666欧美在线视频| 亚洲欧美日韩在线| 国产精品99久久久久| 欧美精品丝袜久久久中文字幕| 国产精品蜜臀av| 狠狠色伊人亚洲综合成人| 欧美在线啊v一区| 亚洲国产精品v| 看电影不卡的网站| 欧美日本乱大交xxxxx| 综合色天天鬼久久鬼色| 国产剧情一区二区| 日韩一级片网站| 午夜精品久久久久久久| 91蜜桃网址入口| 国产精品久久久久婷婷二区次| 九一九一国产精品| 91精品蜜臀在线一区尤物| 一区二区三国产精华液| 99在线精品观看| 亚洲国产高清不卡| 国产91综合一区在线观看| 精品99一区二区三区| 免费久久99精品国产| 欧美一区二区三区在线观看视频 | 欧美性videosxxxxx| 亚洲视频1区2区| 91女神在线视频| 国产精品美女久久久久高潮| 国产成人精品网址| 国产精品乱人伦中文| 成人一区二区三区视频| 国产精品美女久久久久久2018| 成人综合婷婷国产精品久久蜜臀|