| #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; |
| } |