Commit 5747c0733dd7ebbaa7a719d5cb1cd22565cb0cb0

Authored by pbrook
1 parent 02ce600c

Fix int/float inconsistencies.


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