⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fpatest.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	printf("	-q: quiet (no output for successful completion)\n");	printf("	-v: verbose\n");	printf("	-l: loop (infinitely)\n");	printf("	-c: continue (after error)\n");	printf("	-t: specify tests\n");	printf("	-h or -th: help\n");	exit(-1);	/* NOTREACHED */}init_fpa(){	c_wrt_fp_op(INIT, 0, 0, 0, 0);	fpa->fp_restore_mode3_0 = 0x2;	fpa->fp_imask = 0;}/* *	Test Single Precision Format Instructions */sp_test(){int i, j;long temp;long stat;	if(!quiet_flag)		printf("Starting  Test of Single Precision Operations\n");	init_fpa();	for(fpa->fp_imask &= ~FPA_INEXACT, j = 0; j < 2; j++ , fpa->fp_imask |= FPA_INEXACT)	{		for(i = 0; sp_table[i].name; i++)		{			if(verbose_flag)				printf("  Testing single precision %s\n", sp_table[i].name);			wrt_fp_op(PUT_REG_SP, 0, sp_table[i].r1);			ck_stat(ST_DONTCARE);			wrt_fp_op(sp_table[i].op, 0, sp_table[i].data);			stat = ck_stat(sp_table[i].status);			if(stat != sp_table[i].status)			{				printf("Incorrect Status for %s, Expected: %01lx, Returned: %01lx\n", sp_table[i].name, sp_table[i].status, stat);				if(stop_on_error)					exit(-1);			}			rd_fp_op(GET_REG_SP, 0, &temp);			ck_stat(ST_DONTCARE);			if((stat > ST_FINITEINEXACT) || ((stat == ST_FINITEINEXACT) && (fpa->fp_imask & FPA_INEXACT)))			{				if(temp != sp_table[i].r1)				{					printf("SP Inexact Restore Failure: %s\n", sp_table[i].name);					printf("    Expected: %08lx, Returned: %08lx\n", sp_table[i].r1, temp);				}			} else			{				if(temp != sp_table[i].result)				{					printf("SP Comparison Failure: %s\n", sp_table[i].name);					printf("    Expected: %08lx, Returned: %08lx\n", sp_table[i].result, temp);					if(stop_on_error)						exit(-1);				}			}		}	}	if(!quiet_flag)		printf("Finishing Test of Single Precision Operations\n");}/* *	Test Double Precision Format Instructions */dp_test(){int i, j;long temp1, temp2;long stat;	if(!quiet_flag)		printf("Starting  Test of Double Precision Operations\n");	init_fpa();	for(fpa->fp_imask &= ~FPA_INEXACT, j = 0; j < 2; j++ , fpa->fp_imask |= FPA_INEXACT)	{		for(i = 0; dp_table[i].name; i++)		{			if(verbose_flag)				printf("  Testing double precision %s\n", dp_table[i].name);			wrt_fp_op(PUT_REG_MS, 0, dp_table[i].r1_ms);			ck_stat(ST_DONTCARE);			wrt_fp_op(PUT_REG_LS, 0, dp_table[i].r1_ls);			ck_stat(ST_DONTCARE);			wrt_fp_op(dp_table[i].op1, 0, dp_table[i].data_ms);			ck_stat(ST_DONTCARE);			wrt_fp_op(dp_table[i].op2, 0, dp_table[i].data_ls);			stat = ck_stat(dp_table[i].status);			if(stat != dp_table[i].status)			{				printf("Incorrect Status for %s, Expected: %01lx, Returned: %01lx\n", dp_table[i].name, dp_table[i].status, stat);				if(stop_on_error)					exit(-1);			}			rd_fp_op(GET_REG_MS, 0, &temp1);			rd_fp_op(GET_REG_LS, 0, &temp2);			ck_stat(ST_DONTCARE);			if((stat > ST_FINITEINEXACT) || ((stat == ST_FINITEINEXACT) && (fpa->fp_imask & FPA_INEXACT)))			{				if((temp1 != dp_table[i].r1_ms) || (temp2 != dp_table[i].r1_ls))				{got_error++;					printf("DP Inexact Restore Failure: %s\n", dp_table[i].name);					printf("    Expected: %08lx(ms), %08lx(ls)\n", dp_table[i].r1_ms, dp_table[i].r1_ls);					printf("    Returned: %08lx(ms), %08lx(ls)\n", temp1, temp2);					if(stop_on_error)						exit(-1);				}			} else			{				if((temp1 != dp_table[i].result_ms) || (temp2 != dp_table[i].result_ls))				{got_error++;					printf("DP Comparison Failure: %s\n", dp_table[i].name);					printf("    Expected: %08lx(ms), %08lx(ls)\n", dp_table[i].result_ms, dp_table[i].result_ls);					printf("    Returned: %08lx(ms), %08lx(ls)\n", temp1, temp2);					if(stop_on_error)						exit(-1);				}			}		}	}	if(!quiet_flag)		printf("Finishing Test of Double Precision Operations\n");}/* *	Test Single Precision Format Convert Instructions */sd_test(){int i;long temp1, temp2;long stat;	if(!quiet_flag)		printf("Starting  Test of Single Precision Convert Operations\n");	init_fpa();	for(i = 0; sd_table[i].name; i++)	{		if(verbose_flag)			printf("  Testing single precision %s\n", sd_table[i].name);		wrt_fp_op(PUT_REG_MS, 0, sd_table[i].r1_ms);		ck_stat(ST_DONTCARE);		wrt_fp_op(PUT_REG_LS, 0, sd_table[i].r1_ls);		ck_stat(ST_DONTCARE);		wrt_fp_op(sd_table[i].op, 0, sd_table[i].data);		stat = ck_stat(sd_table[i].status);		if(stat != sd_table[i].status)		{			printf("Incorrect Status for %s, Expected: %01lx, Returned: %01lx\n", sd_table[i].name, sd_table[i].status, stat);			if(stop_on_error)				exit(-1);		}		rd_fp_op(GET_REG_MS, 0, &temp1);		rd_fp_op(GET_REG_LS, 0, &temp2);		if((temp1 != sd_table[i].result_ms) || (temp2 != sd_table[i].result_ls))		{			printf("SP Comparison Failure: %s\n", sd_table[i].name);			printf("    Expected: %08lx(ms), %08lx(ls)\n", sd_table[i].result_ms, sd_table[i].result_ls);			printf("    Returned: %08lx(ms), %08lx(ls)\n", temp1, temp2);			if(stop_on_error)				exit(-1);		}	}	if(!quiet_flag)		printf("Finishing Test of Single Precision Convert Operations\n");}/* *	Test Extended Format Instructions */x_test(){int i, j;long temp, temp1, temp2;long stat;	if(!quiet_flag)		printf("Starting  Test of Single Precision Extended Operations\n");	init_fpa();	for(fpa->fp_imask &= ~FPA_INEXACT, j = 0; j < 2; j++ , fpa->fp_imask |= FPA_INEXACT)	{		for(i = 0; x_table[i].name; i++)		{			if(x_table[i].op_sp == 0)				continue;			if(verbose_flag)				printf("  Testing single precision %s\n", x_table[i].name);			wrt_fp_op(PUT_REG_MS, 1, x_table[i].r1_sp);			ck_stat(ST_DONTCARE);			wrt_fp_op(PUT_REG_LS, 1, 0x55555555);			ck_stat(ST_DONTCARE);			wrt_fp_op(PUT_REG_MS, 2, x_table[i].r2_sp);			ck_stat(ST_DONTCARE);			wrt_fp_op(PUT_REG_LS, 2, 0xaaaaaaaa);			ck_stat(ST_DONTCARE);			wrt_fp_op(PUT_REG_MS, 3, x_table[i].r3_sp);			ck_stat(ST_DONTCARE);			wrt_fp_op(PUT_REG_LS, 3, 0xaaaaaaaa);			ck_stat(ST_DONTCARE);			x_wrt_fp_op(x_table[i].op_sp, 1, 2, 3, x_table[i].data_sp, 0xeeeeeeee);			stat = ck_stat(x_table[i].status);			if(stat != x_table[i].status)			{				printf("Incorrect Status for %s, Expected: %01lx, Returned: %01lx\n", x_table[i].name, x_table[i].status, stat);				if(stop_on_error)					exit(-1);			}			rd_fp_op(GET_REG_MS, 1, &temp1);			rd_fp_op(GET_REG_LS, 1, &temp2);			if((stat > ST_FINITEINEXACT) || ((stat == ST_FINITEINEXACT) && (fpa->fp_imask & FPA_INEXACT)))			{				if((temp1 != x_table[i].r1_sp) || (temp2 != 0x55555555))				{					printf("SP Comparison Failure: %s\n", x_table[i].name);					printf("    Expected: %08lx(ms), %08lx(ls)\n", x_table[i].r1_sp, 0x55555555);					printf("    Returned: %08lx(ms), %08lx(ls)\n", temp1, temp2);					if(stop_on_error)						exit(-1);				}			} else			{				if((temp1 != x_table[i].result_sp) || (temp2 != 0x55555555))				{					printf("SP Comparison Failure: %s\n", x_table[i].name);					printf("    Expected: %08lx(ms), %08lx(ls)\n", x_table[i].result_sp, 0x55555555);					printf("    Returned: %08lx(ms), %08lx(ls)\n", temp1, temp2);					if(stop_on_error)						exit(-1);				}			}		}	}	if(!quiet_flag)		printf("Finishing Test of Single Precision Extended Operations\n");	if(!quiet_flag)		printf("Starting  Test of Double Precision Extended Operations\n");	for(fpa->fp_imask &= ~FPA_INEXACT, j = 0; j < 2; j++ , fpa->fp_imask |= FPA_INEXACT)	{		for(i = 0; x_table[i].name; i++)		{			if(x_table[i].op_dp == 0)				continue;			if(verbose_flag)				printf("  Testing double precision %s\n", x_table[i].name);			wrt_fp_op(PUT_REG_MS, 1, x_table[i].r1_ms);			ck_stat(ST_DONTCARE);			wrt_fp_op(PUT_REG_LS, 1, x_table[i].r1_ls);			ck_stat(ST_DONTCARE);			wrt_fp_op(PUT_REG_MS, 2, x_table[i].r2_ms);			ck_stat(ST_DONTCARE);			wrt_fp_op(PUT_REG_LS, 2, x_table[i].r2_ls);			ck_stat(ST_DONTCARE);			wrt_fp_op(PUT_REG_MS, 3, x_table[i].r3_ms);			ck_stat(ST_DONTCARE);			wrt_fp_op(PUT_REG_LS, 3, x_table[i].r3_ls);			ck_stat(ST_DONTCARE);			x_wrt_fp_op(x_table[i].op_dp, 1, 2, 3, x_table[i].data_ms, x_table[i].data_ls);			stat = ck_stat(x_table[i].status);			if(stat != x_table[i].status)			{				printf("Incorrect Status for %s, Expected: %01lx, Returned: %01lx\n", x_table[i].name, x_table[i].status, stat);				if(stop_on_error)					exit(-1);			}			rd_fp_op(GET_REG_MS, 1, &temp1);			rd_fp_op(GET_REG_LS, 1, &temp2);			if((stat > ST_FINITEINEXACT) || ((stat == ST_FINITEINEXACT) && (fpa->fp_imask & FPA_INEXACT)))			{				if((temp1 != x_table[i].r1_ms) || (temp2 != x_table[i].r1_ls))				{					printf("DP Comparison Failure: %s\n", x_table[i].name);					printf("    Expected: %08lx(ms), %08lx(ls)\n", x_table[i].r1_ms, x_table[i].r1_ls);					printf("    Returned: %08lx(ms), %08lx(ls)\n", temp1, temp2);					if(stop_on_error)						exit(-1);				}			} else			{				if((temp1 != x_table[i].result_ms) || (temp2 != x_table[i].result_ls))				{					printf("DP Comparison Failure: %s\n", x_table[i].name);					printf("    Expected: %08lx(ms), %08lx(ls)\n", x_table[i].result_ms, x_table[i].result_ls);					printf("    Returned: %08lx(ms), %08lx(l

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -