1 #include <stdio.h> 2 #include "rounding_mode.h" 3 #include "macro_fpu.h" 4 5 #if defined(__mips_hard_float) 6 int directedRoundingMode(flt_dir_op_t op) { 7 int fd_w = 0; 8 long long int fd_l = 0; 9 int i; 10 int fcsr = 0; 11 for (i = 0; i < MAX_ARR; i++) { 12 clear_fcc(); 13 switch(op) { 14 case CEILWS: 15 UNOPfw("ceil.w.s"); 16 printf("%s %d %f\n", flt_dir_op_names[op], fd_w, fs_f[i]); 17 printf("fcsr: 0x%x\n", fcsr); 18 break; 19 case CEILWD: 20 UNOPdw("ceil.w.d"); 21 printf("%s %d %lf\n", flt_dir_op_names[op], fd_w, fs_d[i]); 22 printf("fcsr: 0x%x\n", fcsr); 23 break; 24 case FLOORWS: 25 UNOPfw("floor.w.s"); 26 printf("%s %d %f\n", flt_dir_op_names[op], fd_w, fs_f[i]); 27 printf("fcsr: 0x%x\n", fcsr); 28 break; 29 case FLOORWD: 30 UNOPdw("floor.w.d"); 31 printf("%s %d %lf\n", flt_dir_op_names[op], fd_w, fs_d[i]); 32 printf("fcsr: 0x%x\n", fcsr); 33 break; 34 case ROUNDWS: 35 UNOPfw("round.w.s"); 36 printf("%s %d %f\n", flt_dir_op_names[op], fd_w, fs_f[i]); 37 printf("fcsr: 0x%x\n", fcsr); 38 break; 39 case ROUNDWD: 40 UNOPdw("round.w.d"); 41 printf("%s %d %lf\n", flt_dir_op_names[op], fd_w, fs_d[i]); 42 printf("fcsr: 0x%x\n", fcsr); 43 break; 44 case TRUNCWS: 45 UNOPfw("trunc.w.s"); 46 printf("%s %d %f\n", flt_dir_op_names[op], fd_w, fs_f[i]); 47 printf("fcsr: 0x%x\n", fcsr); 48 break; 49 case TRUNCWD: 50 UNOPdw("trunc.w.d"); 51 printf("%s %d %lf\n", flt_dir_op_names[op], fd_w, fs_d[i]); 52 printf("fcsr: 0x%x\n", fcsr); 53 break; 54 case CEILLS: 55 UNOPsl("ceil.l.s"); 56 printf("%s %lld %f\n", flt_dir_op_names[op], fd_l, fs_f[i]); 57 printf("fcsr: 0x%x\n", fcsr); 58 break; 59 case CEILLD: 60 UNOPdl("ceil.l.d"); 61 printf("%s %lld %lf\n", flt_dir_op_names[op], fd_l, fs_d[i]); 62 printf("fcsr: 0x%x\n", fcsr); 63 break; 64 case FLOORLS: 65 UNOPsl("floor.l.s"); 66 printf("%s %lld %f\n", flt_dir_op_names[op], fd_l, fs_f[i]); 67 printf("fcsr: 0x%x\n", fcsr); 68 break; 69 case FLOORLD: 70 UNOPdl("floor.l.d"); 71 printf("%s %lld %lf\n", flt_dir_op_names[op], fd_l, fs_d[i]); 72 printf("fcsr: 0x%x\n", fcsr); 73 break; 74 case ROUNDLS: 75 UNOPsl("round.l.s"); 76 printf("%s %lld %f\n", flt_dir_op_names[op], fd_l, fs_f[i]); 77 printf("fcsr: 0x%x\n", fcsr); 78 break; 79 case ROUNDLD: 80 UNOPdl("round.l.d"); 81 printf("%s %lld %lf\n", flt_dir_op_names[op], fd_l, fs_d[i]); 82 printf("fcsr: 0x%x\n", fcsr); 83 break; 84 case TRUNCLS: 85 UNOPsl("trunc.l.s"); 86 printf("%s %lld %f\n", flt_dir_op_names[op], fd_l, fs_f[i]); 87 printf("fcsr: 0x%x\n", fcsr); 88 break; 89 case TRUNCLD: 90 UNOPdl("trunc.l.d"); 91 printf("%s %lld %lf\n", flt_dir_op_names[op], fd_l, fs_d[i]); 92 printf("fcsr: 0x%x\n", fcsr); 93 break; 94 default: 95 printf("error\n"); 96 break; 97 } 98 } 99 return 0; 100 } 101 102 int FCSRRoundingMode(flt_round_op_t op1) 103 { 104 double fd_d = 0; 105 float fd_f = 0; 106 int fd_w = 0; 107 long long int fd_l = 0; 108 int i; 109 int fcsr = 0; 110 round_mode_t rm; 111 for (rm = TO_NEAREST; rm <= TO_MINUS_INFINITY; rm ++) { 112 set_rounding_mode(rm); 113 printf("roundig mode: %s\n", round_mode_name[rm]); 114 for (i = 0; i < MAX_ARR; i++) { 115 clear_fcc(); 116 set_rounding_mode(rm); 117 switch(op1) { 118 case CVTDS: 119 UNOPfd("cvt.d.s"); 120 printf("%s %lf %lf\n", flt_round_op_names[op1], fd_d, fs_f[i]); 121 printf("fcsr: 0x%x\n", fcsr); 122 break; 123 case CVTDW: 124 UNOPwd("cvt.d.w"); 125 printf("%s %lf %d\n", flt_round_op_names[op1], fd_d, fs_w[i]); 126 printf("fcsr: 0x%x\n", fcsr); 127 break; 128 case CVTSD: 129 UNOPdf("cvt.s.d"); 130 printf("%s %f %lf\n", flt_round_op_names[op1], fd_f, fs_d[i]); 131 printf("fcsr: 0x%x\n", fcsr); 132 break; 133 case CVTSW: 134 UNOPwf("cvt.s.w"); 135 printf("%s %f %d\n", flt_round_op_names[op1], fd_f, fs_w[i]); 136 printf("fcsr: 0x%x\n", fcsr); 137 break; 138 case CVTWS: 139 UNOPfw("cvt.w.s"); 140 printf("%s %d %f\n", flt_round_op_names[op1], fd_w, fs_f[i]); 141 printf("fcsr: 0x%x\n", fcsr); 142 break; 143 case CVTWD: 144 UNOPdw("cvt.w.d"); 145 printf("%s %d %lf\n", flt_round_op_names[op1], fd_w, fs_d[i]); 146 printf("fcsr: 0x%x\n", fcsr); 147 break; 148 case CVTDL: 149 UNOPld("cvt.d.l"); 150 printf("%s %lf %ld\n", flt_round_op_names[op1], fd_d, fs_l[i]); 151 printf("fcsr: 0x%x\n", fcsr); 152 break; 153 case CVTLS: 154 UNOPsl("cvt.l.s"); 155 printf("%s %lld %f\n", flt_round_op_names[op1], fd_l, fs_f[i]); 156 printf("fcsr: 0x%x\n", fcsr); 157 break; 158 case CVTLD: 159 UNOPdl("cvt.l.d"); 160 printf("%s %lld %lf\n", flt_round_op_names[op1], fd_l, fs_d[i]); 161 printf("fcsr: 0x%x\n", fcsr); 162 break; 163 case CVTSL: 164 UNOPls("cvt.s.l"); 165 printf("%s %f %ld\n", flt_round_op_names[op1], fd_f, fs_l[i]); 166 printf("fcsr: 0x%x\n", fcsr); 167 break; 168 default: 169 printf("error\n"); 170 break; 171 } 172 } 173 } 174 return 0; 175 } 176 #endif 177 178 int main() 179 { 180 #if defined(__mips_hard_float) 181 flt_dir_op_t op; 182 flt_round_op_t op1; 183 184 printf("-------------------------- %s --------------------------\n", 185 "test FPU Conversion Operations Using a Directed Rounding Mode"); 186 for (op = CEILWS; op <= TRUNCLS; op++) { 187 directedRoundingMode(op); 188 } 189 190 printf("-------------------------- %s --------------------------\n", 191 "test FPU Conversion Operations Using the FCSR Rounding Mode"); 192 for (op1 = CVTDS; op1 <= CVTSL; op1++) { 193 FCSRRoundingMode(op1); 194 } 195 #endif 196 return 0; 197 } 198