1663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdio.h> 2663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 3663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef enum { 4663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng CEILWS=0, CEILWD, 5663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng FLOORWS, FLOORWD, 6663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ROUNDWS, ROUNDWD, 7663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng TRUNCWS, TRUNCWD 8663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} flt_dir_op_t; 9663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 10663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef enum { 11663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng CVTDS, CVTDW, 12663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng CVTSD, CVTSW, 13663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng CVTWS, CVTWD 14663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} flt_round_op_t; 15663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 16663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef enum { 17663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng TO_NEAREST=0, TO_ZERO, TO_PLUS_INFINITY, TO_MINUS_INFINITY } round_mode_t; 18663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengchar *round_mode_name[] = { "near", "zero", "+inf", "-inf" }; 19663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 20663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 21663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengconst char *flt_dir_op_names[] = { 22663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "ceil.w.s", "ceil.w.d", 23663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "floor.w.s", "floor.w.d", 24663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "round.w.s", "round.w.d", 25663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "trunc.w.s", "trunc.w.d" 26663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}; 27663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 28663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengconst char *flt_round_op_names[] = { 29663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "cvt.d.s", "cvt.d.w", 30663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "cvt.s.d", "cvt.s.w", 31663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "cvt.w.s", "cvt.w.d" 32663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}; 33663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 34663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengconst double fs_d[] = { 35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 0, 456.25, 3, -1, 36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1384.5, -7.25, 1000000000, -5786.25, 37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1752, 0.015625, 0.03125, -248562.75, 38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov -45786.5, 456, 34.03125, 45786.75, 39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1752065, 107, -45667.25, -7, 40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov -347856.5, 356047, -1.25, 23.0625 41663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}; 42663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 43663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengconst float fs_f[] = { 44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 0, 456.25, 3, -1, 45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1384.5, -7.25, 1000000000, -5786.25, 46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1752, 0.015625, 0.03125, -248562.75, 47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov -45786.5, 456, 34.03125, 45786.75, 48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 1752065, 107, -45667.25, -7, 49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov -347856.5, 356047, -1.25, 23.0625 50663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}; 51663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 52663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengconst int fs_w[] = { 53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 0, 456, 3, -1, 54663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 0xffffffff, 356, 1000000000, -5786, 55663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1752, 24575, 10, -248562, 56663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng -45786, 456, 34, 45786, 57663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 1752065, 107, -45667, -7, 58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov -347856, 0x80000000, 0xFFFFFFF, 23 59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}; 60663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define BINOP(op) \ 62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ volatile(op" %1, %2, %3" "\n\t" \ 63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "cfc1 %0, $31" "\n\t" \ 64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=r" (fcsr), "=f"(fd) \ 65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "f"(f) , "f"(fB)); 66663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define UNOPdd(op) \ 68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fd_d = 0; \ 69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ volatile(op" %1, %2" "\n\t" \ 70436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "cfc1 %0, $31" "\n\t" \ 71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=r" (fcsr), "=f"(fd_d) \ 72436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "f"(fs_d[i])); 73663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 74436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define UNOPff(op) \ 75436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fd_f = 0; \ 76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ volatile(op" %1, %2" "\n\t" \ 77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "cfc1 %0, $31" "\n\t" \ 78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=r" (fcsr), "=f"(fd_f) \ 79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "f"(fs_f[i])); 80663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 81436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define UNOPfd(op) \ 82436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fd_d = 0; \ 83436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ volatile(op" %1, %2" "\n\t" \ 84436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "cfc1 %0, $31" "\n\t" \ 85436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=r" (fcsr), "=f"(fd_d) \ 86436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "f"(fs_f[i])); 87663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 88436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define UNOPdf(op) \ 89436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fd_f = 0; \ 90436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ volatile(op" %1, %2" "\n\t" \ 91436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "cfc1 %0, $31" "\n\t" \ 92436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=r" (fcsr), "=f"(fd_f) \ 93436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "f"(fs_d[i])); 94663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 95436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define UNOPfw(op) \ 96436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fd_w = 0; \ 97436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ volatile(op" $f0, %2" "\n\t" \ 98436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "mfc1 %1, $f0" "\n\t" \ 99436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "cfc1 %0, $31" "\n\t" \ 100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=r" (fcsr), "=r"(fd_w) \ 101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "f"(fs_f[i]) \ 102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "$f0"); 103663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define UNOPdw(op) \ 105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fd_w = 0; \ 106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ volatile(op" $f0, %2" "\n\t" \ 107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "mfc1 %1, $f0" "\n\t" \ 108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "cfc1 %0, $31" "\n\t" \ 109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=r" (fcsr), "=r"(fd_w) \ 110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "f"(fs_d[i]) \ 111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "$f0"); 112663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define UNOPwd(op) \ 114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fd_d = 0; \ 115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ volatile("mtc1 %2, $f0" "\n\t" \ 116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov op" %1, $f0" "\n\t" \ 117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "cfc1 %0, $31" "\n\t" \ 118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=r" (fcsr), "=f"(fd_d) \ 119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "r"(fs_w[i]) \ 120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "$f0", "$f1"); 121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define UNOPwf(op) \ 123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov fd_f = 0; \ 124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ volatile("mtc1 %2, $f0" "\n\t" \ 125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov op" %1, $f0" "\n\t" \ 126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "cfc1 %0, $31" "\n\t" \ 127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "=r" (fcsr), "=f"(fd_f) \ 128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "r"(fs_w[i]) \ 129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "$f0"); 130663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 131663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid set_rounding_mode(round_mode_t mode) 132663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov switch(mode) { 134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case TO_NEAREST: 135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ volatile("ctc1 $zero, $31" "\n\t"); 136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case TO_ZERO: 138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ volatile("li $t0, 0x1" "\n\t" 139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "ctc1 $t0, $31" "\n\t"); 140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case TO_PLUS_INFINITY: 142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ volatile("li $t0, 0x2" "\n\t" 143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "ctc1 $t0, $31" "\n\t"); 144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov case TO_MINUS_INFINITY: 146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov __asm__ volatile("li $t0, 0x3" "\n\t" 147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "ctc1 $t0, $31" "\n\t"); 148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov break; 149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov } 150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 152663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint directedRoundingMode(flt_dir_op_t op) { 153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int fd_w = 0; 154663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int i; 155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov int fcsr = 0; 156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov round_mode_t rm = TO_NEAREST; 157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (i = 0; i < 24; i++) { 158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov set_rounding_mode(rm); 159663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch(op) { 160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case CEILWS: 161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UNOPfw("ceil.w.s"); 162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%s %d %f\n", flt_dir_op_names[op], fd_w, fs_f[i]); 163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("fcsr: 0x%x\n", fcsr); 164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case CEILWD: 166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UNOPdw("ceil.w.d"); 167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%s %d %lf\n", flt_dir_op_names[op], fd_w, fs_d[i]); 168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("fcsr: 0x%x\n", fcsr); 169663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case FLOORWS: 171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UNOPfw("floor.w.s"); 172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%s %d %f\n", flt_dir_op_names[op], fd_w, fs_f[i]); 173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("fcsr: 0x%x\n", fcsr); 174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case FLOORWD: 176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UNOPdw("floor.w.d"); 177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%s %d %lf\n", flt_dir_op_names[op], fd_w, fs_d[i]); 178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("fcsr: 0x%x\n", fcsr); 179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case ROUNDWS: 181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UNOPfw("round.w.s"); 182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%s %d %f\n", flt_dir_op_names[op], fd_w, fs_f[i]); 183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("fcsr: 0x%x\n", fcsr); 184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case ROUNDWD: 186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UNOPdw("round.w.d"); 187663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%s %d %lf\n", flt_dir_op_names[op], fd_w, fs_d[i]); 188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("fcsr: 0x%x\n", fcsr); 189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 190663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case TRUNCWS: 191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UNOPfw("trunc.w.s"); 192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%s %d %f\n", flt_dir_op_names[op], fd_w, fs_f[i]); 193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("fcsr: 0x%x\n", fcsr); 194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case TRUNCWD: 196663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UNOPdw("trunc.w.d"); 197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%s %d %lf\n", flt_dir_op_names[op], fd_w, fs_d[i]); 198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("fcsr: 0x%x\n", fcsr); 199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("error\n"); 202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return 0; 206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint FCSRRoundingMode(flt_round_op_t op1) 209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng double fd_d = 0; 211663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng float fd_f = 0; 212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int fd_w = 0; 213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng int i; 214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov int fcsr = 0; 215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng round_mode_t rm; 216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov for (rm = TO_NEAREST; rm <= TO_MINUS_INFINITY; rm ++) { 217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng set_rounding_mode(rm); 218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("roundig mode: %s\n", round_mode_name[rm]); 219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov for (i = 0; i < 24; i++) { 220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng set_rounding_mode(rm); 221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng switch(op1) { 222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case CVTDS: 223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UNOPfd("cvt.d.s"); 224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%s %lf %lf\n", flt_round_op_names[op1], fd_d, fs_f[i]); 225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("fcsr: 0x%x\n", fcsr); 226663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case CVTDW: 228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UNOPwd("cvt.d.w"); 229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%s %lf %d\n", flt_round_op_names[op1], fd_d, fs_w[i]); 230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("fcsr: 0x%x\n", fcsr); 231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case CVTSD: 233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UNOPdf("cvt.s.d"); 234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%s %f %lf\n", flt_round_op_names[op1], fd_f, fs_d[i]); 235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("fcsr: 0x%x\n", fcsr); 236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 237663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case CVTSW: 238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UNOPwf("cvt.s.w"); 239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%s %f %d\n", flt_round_op_names[op1], fd_f, fs_w[i]); 240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("fcsr: 0x%x\n", fcsr); 241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case CVTWS: 243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UNOPfw("cvt.w.s"); 244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%s %d %f\n", flt_round_op_names[op1], fd_w, fs_f[i]); 245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("fcsr: 0x%x\n", fcsr); 246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng case CVTWD: 248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng UNOPdw("cvt.w.d"); 249663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%s %d %lf\n", flt_round_op_names[op1], fd_w, fs_d[i]); 250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("fcsr: 0x%x\n", fcsr); 251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng default: 253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("error\n"); 254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng break; 255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return 0; 259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint main() 262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng flt_dir_op_t op; 264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng flt_round_op_t op1; 265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("-------------------------- %s --------------------------\n", 267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "test FPU Conversion Operations Using a Directed Rounding Mode"); 268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (op = CEILWS; op <= TRUNCWD; op++) { 269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng directedRoundingMode(op); 270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("-------------------------- %s --------------------------\n", 273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng "test FPU Conversion Operations Using the FCSR Rounding Mode"); 274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng for (op1 = CVTDS; op1 <= CVTWD; op1++) { 275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng FCSRRoundingMode(op1); 276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return 0; 278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 280