Commit 5747c0733dd7ebbaa7a719d5cb1cd22565cb0cb0
1 parent
02ce600c
Fix int/float inconsistencies.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3672 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
34 additions
and
36 deletions
target-mips/fop_template.c
... | ... | @@ -24,14 +24,14 @@ |
24 | 24 | #define OP_WLOAD_FREG(treg, tregname, FREG) \ |
25 | 25 | void glue(glue(op_load_fpr_,tregname), FREG) (void) \ |
26 | 26 | { \ |
27 | - treg = env->fpu->fpr[FREG].fs[FP_ENDIAN_IDX]; \ | |
27 | + treg = env->fpu->fpr[FREG].w[FP_ENDIAN_IDX]; \ | |
28 | 28 | FORCE_RET(); \ |
29 | 29 | } |
30 | 30 | |
31 | 31 | #define OP_WSTORE_FREG(treg, tregname, FREG) \ |
32 | 32 | void glue(glue(op_store_fpr_,tregname), FREG) (void) \ |
33 | 33 | { \ |
34 | - env->fpu->fpr[FREG].fs[FP_ENDIAN_IDX] = treg; \ | |
34 | + env->fpu->fpr[FREG].w[FP_ENDIAN_IDX] = treg; \ | |
35 | 35 | FORCE_RET(); \ |
36 | 36 | } |
37 | 37 | |
... | ... | @@ -50,10 +50,10 @@ OP_WSTORE_FREG(WT2, WT2_fpr, FREG) |
50 | 50 | void glue(glue(op_load_fpr_,tregname), FREG) (void) \ |
51 | 51 | { \ |
52 | 52 | if (env->hflags & MIPS_HFLAG_F64) \ |
53 | - treg = env->fpu->fpr[FREG].fd; \ | |
53 | + treg = env->fpu->fpr[FREG].d; \ | |
54 | 54 | else \ |
55 | - treg = (uint64_t)(env->fpu->fpr[FREG | 1].fs[FP_ENDIAN_IDX]) << 32 | \ | |
56 | - env->fpu->fpr[FREG & ~1].fs[FP_ENDIAN_IDX]; \ | |
55 | + treg = (uint64_t)(env->fpu->fpr[FREG | 1].w[FP_ENDIAN_IDX]) << 32 | \ | |
56 | + env->fpu->fpr[FREG & ~1].w[FP_ENDIAN_IDX]; \ | |
57 | 57 | FORCE_RET(); \ |
58 | 58 | } |
59 | 59 | |
... | ... | @@ -61,10 +61,10 @@ OP_WSTORE_FREG(WT2, WT2_fpr, FREG) |
61 | 61 | void glue(glue(op_store_fpr_,tregname), FREG) (void) \ |
62 | 62 | { \ |
63 | 63 | if (env->hflags & MIPS_HFLAG_F64) \ |
64 | - env->fpu->fpr[FREG].fd = treg; \ | |
64 | + env->fpu->fpr[FREG].d = treg; \ | |
65 | 65 | else { \ |
66 | - env->fpu->fpr[FREG | 1].fs[FP_ENDIAN_IDX] = treg >> 32; \ | |
67 | - env->fpu->fpr[FREG & ~1].fs[FP_ENDIAN_IDX] = treg; \ | |
66 | + env->fpu->fpr[FREG | 1].w[FP_ENDIAN_IDX] = treg >> 32; \ | |
67 | + env->fpu->fpr[FREG & ~1].w[FP_ENDIAN_IDX] = treg; \ | |
68 | 68 | } \ |
69 | 69 | FORCE_RET(); \ |
70 | 70 | } |
... | ... | @@ -81,14 +81,14 @@ OP_DSTORE_FREG(DT2, DT2_fpr, FREG) |
81 | 81 | #define OP_PSLOAD_FREG(treg, tregname, FREG) \ |
82 | 82 | void glue(glue(op_load_fpr_,tregname), FREG) (void) \ |
83 | 83 | { \ |
84 | - treg = env->fpu->fpr[FREG].fs[!FP_ENDIAN_IDX]; \ | |
84 | + treg = env->fpu->fpr[FREG].w[!FP_ENDIAN_IDX]; \ | |
85 | 85 | FORCE_RET(); \ |
86 | 86 | } |
87 | 87 | |
88 | 88 | #define OP_PSSTORE_FREG(treg, tregname, FREG) \ |
89 | 89 | void glue(glue(op_store_fpr_,tregname), FREG) (void) \ |
90 | 90 | { \ |
91 | - env->fpu->fpr[FREG].fs[!FP_ENDIAN_IDX] = treg; \ | |
91 | + env->fpu->fpr[FREG].w[!FP_ENDIAN_IDX] = treg; \ | |
92 | 92 | FORCE_RET(); \ |
93 | 93 | } |
94 | 94 | ... | ... |
target-mips/op.c
... | ... | @@ -2682,7 +2682,7 @@ FLOAT_OP(n ## name1 ## name2, d) \ |
2682 | 2682 | { \ |
2683 | 2683 | FDT0 = float64_ ## name1 (FDT0, FDT1, &env->fpu->fp_status); \ |
2684 | 2684 | FDT2 = float64_ ## name2 (FDT0, FDT2, &env->fpu->fp_status); \ |
2685 | - FDT2 ^= 1ULL << 63; \ | |
2685 | + FDT2 = float64_chs(FDT2); \ | |
2686 | 2686 | DEBUG_FPU_STATE(); \ |
2687 | 2687 | FORCE_RET(); \ |
2688 | 2688 | } \ |
... | ... | @@ -2690,7 +2690,7 @@ FLOAT_OP(n ## name1 ## name2, s) \ |
2690 | 2690 | { \ |
2691 | 2691 | FST0 = float32_ ## name1 (FST0, FST1, &env->fpu->fp_status); \ |
2692 | 2692 | FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \ |
2693 | - FST2 ^= 1 << 31; \ | |
2693 | + FST2 = float32_chs(FST2); \ | |
2694 | 2694 | DEBUG_FPU_STATE(); \ |
2695 | 2695 | FORCE_RET(); \ |
2696 | 2696 | } \ |
... | ... | @@ -2700,8 +2700,8 @@ FLOAT_OP(n ## name1 ## name2, ps) \ |
2700 | 2700 | FSTH0 = float32_ ## name1 (FSTH0, FSTH1, &env->fpu->fp_status); \ |
2701 | 2701 | FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \ |
2702 | 2702 | FSTH2 = float32_ ## name2 (FSTH0, FSTH2, &env->fpu->fp_status); \ |
2703 | - FST2 ^= 1 << 31; \ | |
2704 | - FSTH2 ^= 1 << 31; \ | |
2703 | + FST2 = float32_chs(FST2); \ | |
2704 | + FSTH2 = float32_chs(FSTH2); \ | |
2705 | 2705 | DEBUG_FPU_STATE(); \ |
2706 | 2706 | FORCE_RET(); \ |
2707 | 2707 | } | ... | ... |
target-mips/op_helper.c
... | ... | @@ -626,8 +626,6 @@ void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec, |
626 | 626 | |
627 | 627 | /* Complex FPU operations which may need stack space. */ |
628 | 628 | |
629 | -#define FLOAT_SIGN32 (1 << 31) | |
630 | -#define FLOAT_SIGN64 (1ULL << 63) | |
631 | 629 | #define FLOAT_ONE32 (0x3f8 << 20) |
632 | 630 | #define FLOAT_ONE64 (0x3ffULL << 52) |
633 | 631 | #define FLOAT_TWO32 (1 << 30) |
... | ... | @@ -1054,7 +1052,7 @@ FLOAT_OP(name, d) \ |
1054 | 1052 | FDT2 = float64_ ## name (FDT0, FDT1, &env->fpu->fp_status); \ |
1055 | 1053 | update_fcr31(); \ |
1056 | 1054 | if (GET_FP_CAUSE(env->fpu->fcr31) & FP_INVALID) \ |
1057 | - FDT2 = FLOAT_QNAN64; \ | |
1055 | + DT2 = FLOAT_QNAN64; \ | |
1058 | 1056 | } \ |
1059 | 1057 | FLOAT_OP(name, s) \ |
1060 | 1058 | { \ |
... | ... | @@ -1062,7 +1060,7 @@ FLOAT_OP(name, s) \ |
1062 | 1060 | FST2 = float32_ ## name (FST0, FST1, &env->fpu->fp_status); \ |
1063 | 1061 | update_fcr31(); \ |
1064 | 1062 | if (GET_FP_CAUSE(env->fpu->fcr31) & FP_INVALID) \ |
1065 | - FST2 = FLOAT_QNAN32; \ | |
1063 | + WT2 = FLOAT_QNAN32; \ | |
1066 | 1064 | } \ |
1067 | 1065 | FLOAT_OP(name, ps) \ |
1068 | 1066 | { \ |
... | ... | @@ -1071,8 +1069,8 @@ FLOAT_OP(name, ps) \ |
1071 | 1069 | FSTH2 = float32_ ## name (FSTH0, FSTH1, &env->fpu->fp_status); \ |
1072 | 1070 | update_fcr31(); \ |
1073 | 1071 | if (GET_FP_CAUSE(env->fpu->fcr31) & FP_INVALID) { \ |
1074 | - FST2 = FLOAT_QNAN32; \ | |
1075 | - FSTH2 = FLOAT_QNAN32; \ | |
1072 | + WT2 = FLOAT_QNAN32; \ | |
1073 | + WTH2 = FLOAT_QNAN32; \ | |
1076 | 1074 | } \ |
1077 | 1075 | } |
1078 | 1076 | FLOAT_BINOP(add) |
... | ... | @@ -1086,14 +1084,14 @@ FLOAT_OP(recip2, d) |
1086 | 1084 | { |
1087 | 1085 | set_float_exception_flags(0, &env->fpu->fp_status); |
1088 | 1086 | FDT2 = float64_mul(FDT0, FDT2, &env->fpu->fp_status); |
1089 | - FDT2 = float64_sub(FDT2, FLOAT_ONE64, &env->fpu->fp_status) ^ FLOAT_SIGN64; | |
1087 | + FDT2 = float64_chs(float64_sub(FDT2, FLOAT_ONE64, &env->fpu->fp_status)); | |
1090 | 1088 | update_fcr31(); |
1091 | 1089 | } |
1092 | 1090 | FLOAT_OP(recip2, s) |
1093 | 1091 | { |
1094 | 1092 | set_float_exception_flags(0, &env->fpu->fp_status); |
1095 | 1093 | FST2 = float32_mul(FST0, FST2, &env->fpu->fp_status); |
1096 | - FST2 = float32_sub(FST2, FLOAT_ONE32, &env->fpu->fp_status) ^ FLOAT_SIGN32; | |
1094 | + FST2 = float32_chs(float32_sub(FST2, FLOAT_ONE32, &env->fpu->fp_status)); | |
1097 | 1095 | update_fcr31(); |
1098 | 1096 | } |
1099 | 1097 | FLOAT_OP(recip2, ps) |
... | ... | @@ -1101,8 +1099,8 @@ FLOAT_OP(recip2, ps) |
1101 | 1099 | set_float_exception_flags(0, &env->fpu->fp_status); |
1102 | 1100 | FST2 = float32_mul(FST0, FST2, &env->fpu->fp_status); |
1103 | 1101 | FSTH2 = float32_mul(FSTH0, FSTH2, &env->fpu->fp_status); |
1104 | - FST2 = float32_sub(FST2, FLOAT_ONE32, &env->fpu->fp_status) ^ FLOAT_SIGN32; | |
1105 | - FSTH2 = float32_sub(FSTH2, FLOAT_ONE32, &env->fpu->fp_status) ^ FLOAT_SIGN32; | |
1102 | + FST2 = float32_chs(float32_sub(FST2, FLOAT_ONE32, &env->fpu->fp_status)); | |
1103 | + FSTH2 = float32_chs(float32_sub(FSTH2, FLOAT_ONE32, &env->fpu->fp_status)); | |
1106 | 1104 | update_fcr31(); |
1107 | 1105 | } |
1108 | 1106 | |
... | ... | @@ -1111,7 +1109,7 @@ FLOAT_OP(rsqrt2, d) |
1111 | 1109 | set_float_exception_flags(0, &env->fpu->fp_status); |
1112 | 1110 | FDT2 = float64_mul(FDT0, FDT2, &env->fpu->fp_status); |
1113 | 1111 | FDT2 = float64_sub(FDT2, FLOAT_ONE64, &env->fpu->fp_status); |
1114 | - FDT2 = float64_div(FDT2, FLOAT_TWO64, &env->fpu->fp_status) ^ FLOAT_SIGN64; | |
1112 | + FDT2 = float64_chs(float64_div(FDT2, FLOAT_TWO64, &env->fpu->fp_status)); | |
1115 | 1113 | update_fcr31(); |
1116 | 1114 | } |
1117 | 1115 | FLOAT_OP(rsqrt2, s) |
... | ... | @@ -1119,7 +1117,7 @@ FLOAT_OP(rsqrt2, s) |
1119 | 1117 | set_float_exception_flags(0, &env->fpu->fp_status); |
1120 | 1118 | FST2 = float32_mul(FST0, FST2, &env->fpu->fp_status); |
1121 | 1119 | FST2 = float32_sub(FST2, FLOAT_ONE32, &env->fpu->fp_status); |
1122 | - FST2 = float32_div(FST2, FLOAT_TWO32, &env->fpu->fp_status) ^ FLOAT_SIGN32; | |
1120 | + FST2 = float32_chs(float32_div(FST2, FLOAT_TWO32, &env->fpu->fp_status)); | |
1123 | 1121 | update_fcr31(); |
1124 | 1122 | } |
1125 | 1123 | FLOAT_OP(rsqrt2, ps) |
... | ... | @@ -1129,8 +1127,8 @@ FLOAT_OP(rsqrt2, ps) |
1129 | 1127 | FSTH2 = float32_mul(FSTH0, FSTH2, &env->fpu->fp_status); |
1130 | 1128 | FST2 = float32_sub(FST2, FLOAT_ONE32, &env->fpu->fp_status); |
1131 | 1129 | FSTH2 = float32_sub(FSTH2, FLOAT_ONE32, &env->fpu->fp_status); |
1132 | - FST2 = float32_div(FST2, FLOAT_TWO32, &env->fpu->fp_status) ^ FLOAT_SIGN32; | |
1133 | - FSTH2 = float32_div(FSTH2, FLOAT_TWO32, &env->fpu->fp_status) ^ FLOAT_SIGN32; | |
1130 | + FST2 = float32_chs(float32_div(FST2, FLOAT_TWO32, &env->fpu->fp_status)); | |
1131 | + FSTH2 = float32_chs(float32_div(FSTH2, FLOAT_TWO32, &env->fpu->fp_status)); | |
1134 | 1132 | update_fcr31(); |
1135 | 1133 | } |
1136 | 1134 | |
... | ... | @@ -1164,8 +1162,8 @@ void do_cmp_d_ ## op (long cc) \ |
1164 | 1162 | void do_cmpabs_d_ ## op (long cc) \ |
1165 | 1163 | { \ |
1166 | 1164 | int c; \ |
1167 | - FDT0 &= ~FLOAT_SIGN64; \ | |
1168 | - FDT1 &= ~FLOAT_SIGN64; \ | |
1165 | + FDT0 = float64_chs(FDT0); \ | |
1166 | + FDT1 = float64_chs(FDT1); \ | |
1169 | 1167 | c = cond; \ |
1170 | 1168 | update_fcr31(); \ |
1171 | 1169 | if (c) \ |
... | ... | @@ -1222,8 +1220,8 @@ void do_cmp_s_ ## op (long cc) \ |
1222 | 1220 | void do_cmpabs_s_ ## op (long cc) \ |
1223 | 1221 | { \ |
1224 | 1222 | int c; \ |
1225 | - FST0 &= ~FLOAT_SIGN32; \ | |
1226 | - FST1 &= ~FLOAT_SIGN32; \ | |
1223 | + FST0 = float32_abs(FST0); \ | |
1224 | + FST1 = float32_abs(FST1); \ | |
1227 | 1225 | c = cond; \ |
1228 | 1226 | update_fcr31(); \ |
1229 | 1227 | if (c) \ |
... | ... | @@ -1285,10 +1283,10 @@ void do_cmp_ps_ ## op (long cc) \ |
1285 | 1283 | void do_cmpabs_ps_ ## op (long cc) \ |
1286 | 1284 | { \ |
1287 | 1285 | int cl, ch; \ |
1288 | - FST0 &= ~FLOAT_SIGN32; \ | |
1289 | - FSTH0 &= ~FLOAT_SIGN32; \ | |
1290 | - FST1 &= ~FLOAT_SIGN32; \ | |
1291 | - FSTH1 &= ~FLOAT_SIGN32; \ | |
1286 | + FST0 = float32_abs(FST0); \ | |
1287 | + FSTH0 = float32_abs(FSTH0); \ | |
1288 | + FST1 = float32_abs(FST1); \ | |
1289 | + FSTH1 = float32_abs(FSTH1); \ | |
1292 | 1290 | cl = condl; \ |
1293 | 1291 | ch = condh; \ |
1294 | 1292 | update_fcr31(); \ | ... | ... |