📄 fpatest.c
字号:
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 + -