1 #include <stdio.h> 2 #include <math.h> 3 #include "rounding_mode.h" 4 #include "macro_fpu.h" 5 6 int arithmeticOperations(flt_art_op_t op) 7 { 8 double fd_d = 0; 9 float fd_f = 0; 10 int i = 0; 11 int fcsr = 0; 12 round_mode_t rm; 13 for (rm = TO_NEAREST; rm <= TO_MINUS_INFINITY; rm ++) { 14 set_rounding_mode(rm); 15 printf("roundig mode: %s\n", round_mode_name[rm]); 16 for (i = 0; i < MAX_ARR; i++) { 17 switch(op) { 18 case ABSS: 19 UNOPff("abs.s"); 20 printf("%s %f %f\n", flt_art_op_names[op], fd_f, fs_f[i]); 21 break; 22 case ABSD: 23 UNOPdd("abs.d"); 24 printf("%s %lf %lf\n", flt_art_op_names[op], fd_d, fs_d[i]); 25 break; 26 case ADDS: 27 BINOPf("add.s"); 28 printf("%s %f %f %f\n", 29 flt_art_op_names[op], fd_f, fs_f[i], ft_f[i]); 30 break; 31 case ADDD: 32 BINOPd("add.d"); 33 printf("%s %lf %lf %lf\n", 34 flt_art_op_names[op], fd_d, fs_d[i], ft_d[i]); 35 break; 36 case DIVS: 37 BINOPf("div.s"); 38 printf("%s %f %f %f\n", 39 flt_art_op_names[op], roundf(fd_f), fs_f[i], ft_f[i]); 40 break; 41 case DIVD: 42 BINOPd("div.d"); 43 printf("%s %lf %lf %lf\n", 44 flt_art_op_names[op], round(fd_d), fs_d[i], ft_d[i]); 45 break; 46 case MULS: 47 BINOPf("mul.s"); 48 printf("%s %f %f %f\n", 49 flt_art_op_names[op], roundf(fd_f), fs_f[i], ft_f[i]); 50 break; 51 case MULD: 52 BINOPd("mul.d"); 53 printf("%s %lf %lf %lf\n", 54 flt_art_op_names[op], round(fd_d), fs_d[i], ft_d[i]); 55 break; 56 case NEGS: 57 UNOPff("neg.s"); 58 printf("%s %f %f\n", flt_art_op_names[op], fd_f, fs_f[i]); 59 break; 60 case NEGD: 61 UNOPdd("neg.d"); 62 printf("%s %lf %lf\n", flt_art_op_names[op], fd_d, fs_d[i]); 63 break; 64 case SQRTS: 65 UNOPff("sqrt.s"); 66 printf("%s %f %f\n", 67 flt_art_op_names[op], roundf(fd_f), fs_f[i]); 68 break; 69 case SQRTD: 70 UNOPdd("sqrt.d"); 71 printf("%s %lf %lf\n", 72 flt_art_op_names[op], round(fd_d), fs_d[i]); 73 break; 74 case SUBS: 75 BINOPf("sub.s"); 76 printf("%s %f %f %f\n", 77 flt_art_op_names[op], fd_f, fs_f[i], ft_f[i]); 78 break; 79 case SUBD: 80 BINOPd("sub.d"); 81 printf("%s %lf %lf %lf\n", 82 flt_art_op_names[op], fd_d, fs_d[i], ft_d[i]); 83 break; 84 case RECIPS: 85 UNOPff("recip.s"); 86 printf("%s %f %f\n", 87 flt_art_op_names[op], roundf(fd_f), fs_f[i]); 88 break; 89 case RECIPD: 90 UNOPdd("recip.d"); 91 printf("%s %lf %lf\n", 92 flt_art_op_names[op], round(fd_d), fs_d[i]); 93 break; 94 case RSQRTS: 95 if (fs_f[i] >= 0) { 96 UNOPff("rsqrt.s"); 97 printf("%s %f %f\n", 98 flt_art_op_names[op], roundf(fd_f), fs_f[i]); 99 } 100 break; 101 case RSQRTD: 102 if (fs_d[i] >= 0) { 103 UNOPdd("rsqrt.d"); 104 printf("%s %lf %lf\n", 105 flt_art_op_names[op], round(fd_d), fs_d[i]); 106 } 107 break; 108 case MSUBS: 109 TRIOPf("msub.s"); 110 printf("%s %f %f %f %f\n",flt_art_op_names[op], roundf(fd_f), 111 fr_f[i], fs_f[i], ft_f[i]); 112 break; 113 case MSUBD: 114 TRIOPd("msub.d"); 115 printf("%s %lf %lf %lf %lf\n", flt_art_op_names[op], round(fd_d), 116 fr_d[i], fs_d[i], ft_d[i]); 117 break; 118 case MADDS: 119 TRIOPf("madd.s"); 120 printf("%s %f %f %f %f\n", flt_art_op_names[op], roundf(fd_f), 121 fr_f[i], fs_f[i], ft_f[i]); 122 break; 123 case MADDD: 124 TRIOPd("madd.d"); 125 printf("%s %lf %lf %lf %lf\n", flt_art_op_names[op], round(fd_d), 126 fr_d[i], fs_d[i], ft_d[i]); 127 break; 128 case NMADDS: 129 TRIOPf("nmadd.s"); 130 printf("%s %f %f %f %f\n", flt_art_op_names[op], roundf(fd_f), 131 fr_f[i], fs_f[i], ft_f[i]); 132 break; 133 case NMADDD: 134 TRIOPd("nmadd.d"); 135 printf("%s %lf %lf %lf %lf\n", flt_art_op_names[op], round(fd_d), 136 fr_d[i], fs_d[i], ft_d[i]); 137 break; 138 case NMSUBS: 139 TRIOPf("nmsub.s"); 140 printf("%s %f %f %f %f\n", flt_art_op_names[op], roundf(fd_f), 141 fr_f[i], fs_f[i], ft_f[i]); 142 break; 143 case NMSUBD: 144 TRIOPd("nmsub.d"); 145 printf("%s 0x%lf %lf %lf %lf\n", flt_art_op_names[op], 146 round(fd_d), fr_d[i], fs_d[i], 147 ft_d[i]); 148 break; 149 default: 150 printf("error\n"); 151 break; 152 } 153 } 154 } 155 return 0; 156 } 157 158 int main() 159 { 160 flt_art_op_t op; 161 162 printf("-------------------------- %s --------------------------\n", 163 "test FPU Arithmetic Operations"); 164 for (op = ABSS; op <= NMSUBD; op++) { 165 arithmeticOperations(op); 166 } 167 168 return 0; 169 } 170