mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-12 02:16:13 +00:00
173 lines
6.0 KiB
C
173 lines
6.0 KiB
C
#include <stdio.h>
|
|
#include <math.h>
|
|
#include "rounding_mode.h"
|
|
#include "macro_fpu.h"
|
|
|
|
#if defined(__mips_hard_float)
|
|
int arithmeticOperations(flt_art_op_t op)
|
|
{
|
|
double fd_d = 0;
|
|
float fd_f = 0;
|
|
int i = 0;
|
|
int fcsr = 0;
|
|
round_mode_t rm;
|
|
for (rm = TO_NEAREST; rm <= TO_MINUS_INFINITY; rm ++) {
|
|
set_rounding_mode(rm);
|
|
printf("roundig mode: %s\n", round_mode_name[rm]);
|
|
for (i = 0; i < MAX_ARR; i++) {
|
|
switch(op) {
|
|
case ABSS:
|
|
UNOPff("abs.s");
|
|
printf("%s %f %f\n", flt_art_op_names[op], fd_f, fs_f[i]);
|
|
break;
|
|
case ABSD:
|
|
UNOPdd("abs.d");
|
|
printf("%s %lf %lf\n", flt_art_op_names[op], fd_d, fs_d[i]);
|
|
break;
|
|
case ADDS:
|
|
BINOPf("add.s");
|
|
printf("%s %f %f %f\n",
|
|
flt_art_op_names[op], fd_f, fs_f[i], ft_f[i]);
|
|
break;
|
|
case ADDD:
|
|
BINOPd("add.d");
|
|
printf("%s %lf %lf %lf\n",
|
|
flt_art_op_names[op], fd_d, fs_d[i], ft_d[i]);
|
|
break;
|
|
case DIVS:
|
|
BINOPf("div.s");
|
|
printf("%s %f %f %f\n",
|
|
flt_art_op_names[op], roundf(fd_f), fs_f[i], ft_f[i]);
|
|
break;
|
|
case DIVD:
|
|
BINOPd("div.d");
|
|
printf("%s %lf %lf %lf\n",
|
|
flt_art_op_names[op], round(fd_d), fs_d[i], ft_d[i]);
|
|
break;
|
|
case MULS:
|
|
BINOPf("mul.s");
|
|
printf("%s %f %f %f\n",
|
|
flt_art_op_names[op], roundf(fd_f), fs_f[i], ft_f[i]);
|
|
break;
|
|
case MULD:
|
|
BINOPd("mul.d");
|
|
printf("%s %lf %lf %lf\n",
|
|
flt_art_op_names[op], round(fd_d), fs_d[i], ft_d[i]);
|
|
break;
|
|
case NEGS:
|
|
UNOPff("neg.s");
|
|
printf("%s %f %f\n", flt_art_op_names[op], fd_f, fs_f[i]);
|
|
break;
|
|
case NEGD:
|
|
UNOPdd("neg.d");
|
|
printf("%s %lf %lf\n", flt_art_op_names[op], fd_d, fs_d[i]);
|
|
break;
|
|
case SQRTS:
|
|
UNOPff("sqrt.s");
|
|
printf("%s %f %f\n",
|
|
flt_art_op_names[op], roundf(fd_f), fs_f[i]);
|
|
break;
|
|
case SQRTD:
|
|
UNOPdd("sqrt.d");
|
|
printf("%s %lf %lf\n",
|
|
flt_art_op_names[op], round(fd_d), fs_d[i]);
|
|
break;
|
|
case SUBS:
|
|
BINOPf("sub.s");
|
|
printf("%s %f %f %f\n",
|
|
flt_art_op_names[op], fd_f, fs_f[i], ft_f[i]);
|
|
break;
|
|
case SUBD:
|
|
BINOPd("sub.d");
|
|
printf("%s %lf %lf %lf\n",
|
|
flt_art_op_names[op], fd_d, fs_d[i], ft_d[i]);
|
|
break;
|
|
case RECIPS:
|
|
UNOPff("recip.s");
|
|
printf("%s %f %f\n",
|
|
flt_art_op_names[op], roundf(fd_f), fs_f[i]);
|
|
break;
|
|
case RECIPD:
|
|
UNOPdd("recip.d");
|
|
printf("%s %lf %lf\n",
|
|
flt_art_op_names[op], round(fd_d), fs_d[i]);
|
|
break;
|
|
case RSQRTS:
|
|
if (fs_f[i] >= 0) {
|
|
UNOPff("rsqrt.s");
|
|
printf("%s %f %f\n",
|
|
flt_art_op_names[op], roundf(fd_f), fs_f[i]);
|
|
}
|
|
break;
|
|
case RSQRTD:
|
|
if (fs_d[i] >= 0) {
|
|
UNOPdd("rsqrt.d");
|
|
printf("%s %lf %lf\n",
|
|
flt_art_op_names[op], round(fd_d), fs_d[i]);
|
|
}
|
|
break;
|
|
case MSUBS:
|
|
TRIOPf("msub.s");
|
|
printf("%s %f %f %f %f\n",flt_art_op_names[op], roundf(fd_f),
|
|
fr_f[i], fs_f[i], ft_f[i]);
|
|
break;
|
|
case MSUBD:
|
|
TRIOPd("msub.d");
|
|
printf("%s %lf %lf %lf %lf\n", flt_art_op_names[op], round(fd_d),
|
|
fr_d[i], fs_d[i], ft_d[i]);
|
|
break;
|
|
case MADDS:
|
|
TRIOPf("madd.s");
|
|
printf("%s %f %f %f %f\n", flt_art_op_names[op], roundf(fd_f),
|
|
fr_f[i], fs_f[i], ft_f[i]);
|
|
break;
|
|
case MADDD:
|
|
TRIOPd("madd.d");
|
|
printf("%s %lf %lf %lf %lf\n", flt_art_op_names[op], round(fd_d),
|
|
fr_d[i], fs_d[i], ft_d[i]);
|
|
break;
|
|
case NMADDS:
|
|
TRIOPf("nmadd.s");
|
|
printf("%s %f %f %f %f\n", flt_art_op_names[op], roundf(fd_f),
|
|
fr_f[i], fs_f[i], ft_f[i]);
|
|
break;
|
|
case NMADDD:
|
|
TRIOPd("nmadd.d");
|
|
printf("%s %lf %lf %lf %lf\n", flt_art_op_names[op], round(fd_d),
|
|
fr_d[i], fs_d[i], ft_d[i]);
|
|
break;
|
|
case NMSUBS:
|
|
TRIOPf("nmsub.s");
|
|
printf("%s %f %f %f %f\n", flt_art_op_names[op], roundf(fd_f),
|
|
fr_f[i], fs_f[i], ft_f[i]);
|
|
break;
|
|
case NMSUBD:
|
|
TRIOPd("nmsub.d");
|
|
printf("%s 0x%lf %lf %lf %lf\n", flt_art_op_names[op],
|
|
round(fd_d), fr_d[i], fs_d[i],
|
|
ft_d[i]);
|
|
break;
|
|
default:
|
|
printf("error\n");
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
int main()
|
|
{
|
|
#if defined(__mips_hard_float)
|
|
flt_art_op_t op;
|
|
|
|
printf("-------------------------- %s --------------------------\n",
|
|
"test FPU Arithmetic Operations");
|
|
for (op = ABSS; op <= NMSUBD; op++) {
|
|
arithmeticOperations(op);
|
|
}
|
|
#endif
|
|
return 0;
|
|
}
|