Revision d84763bc
b/target-sparc/cpu.h | ||
---|---|---|
303 | 303 |
uint64_t prom_addr; |
304 | 304 |
#endif |
305 | 305 |
/* temporary float registers */ |
306 |
float32 ft0, ft1; |
|
307 | 306 |
float64 dt0, dt1; |
308 | 307 |
float128 qt0, qt1; |
309 | 308 |
float_status fp_status; |
b/target-sparc/exec.h | ||
---|---|---|
5 | 5 |
|
6 | 6 |
register struct CPUSPARCState *env asm(AREG0); |
7 | 7 |
|
8 |
#define FT0 (env->ft0) |
|
9 |
#define FT1 (env->ft1) |
|
10 | 8 |
#define DT0 (env->dt0) |
11 | 9 |
#define DT1 (env->dt1) |
12 | 10 |
#define QT0 (env->qt0) |
b/target-sparc/helper.h | ||
---|---|---|
93 | 93 |
#endif |
94 | 94 |
DEF_HELPER(void, raise_exception, (int tt)) |
95 | 95 |
#define F_HELPER_0_0(name) DEF_HELPER(void, helper_f ## name, (void)) |
96 |
#define F_HELPER_SDQ_0_0(name) \ |
|
97 |
F_HELPER_0_0(name ## s); \ |
|
98 |
F_HELPER_0_0(name ## d); \ |
|
99 |
F_HELPER_0_0(name ## q) |
|
100 | 96 |
#define F_HELPER_DQ_0_0(name) \ |
101 | 97 |
F_HELPER_0_0(name ## d); \ |
102 | 98 |
F_HELPER_0_0(name ## q) |
... | ... | |
111 | 107 |
DEF_HELPER(float32, helper_fmuls, (float32 src1, float32 src2)) |
112 | 108 |
DEF_HELPER(float32, helper_fdivs, (float32 src1, float32 src2)) |
113 | 109 |
|
114 |
F_HELPER_0_0(smuld);
|
|
110 |
DEF_HELPER(void, helper_fsmuld, (float32 src1, float32 src2))
|
|
115 | 111 |
F_HELPER_0_0(dmulq); |
116 | 112 |
|
117 | 113 |
DEF_HELPER(float32, helper_fnegs, (float32 src)) |
118 |
F_HELPER_0_0(itod);
|
|
114 |
DEF_HELPER(void, helper_fitod, (int32_t src))
|
|
119 | 115 |
DEF_HELPER(void, helper_fitoq, (int32_t src)) |
120 | 116 |
|
121 | 117 |
DEF_HELPER(float32, helper_fitos, (int32_t src)) |
... | ... | |
123 | 119 |
#ifdef TARGET_SPARC64 |
124 | 120 |
DEF_HELPER(void, helper_fnegd, (void)) |
125 | 121 |
DEF_HELPER(void, helper_fnegq, (void)) |
126 |
F_HELPER_SDQ_0_0(xto); |
|
122 |
DEF_HELPER(uint32_t, helper_fxtos, (void)) |
|
123 |
F_HELPER_DQ_0_0(xto); |
|
127 | 124 |
#endif |
128 |
F_HELPER_0_0(dtos);
|
|
129 |
F_HELPER_0_0(stod);
|
|
125 |
DEF_HELPER(float32, helper_fdtos, (void))
|
|
126 |
DEF_HELPER(void, helper_fstod, (float32 src))
|
|
130 | 127 |
DEF_HELPER(float32, helper_fqtos, (void)) |
131 | 128 |
DEF_HELPER(void, helper_fstoq, (float32 src)) |
132 | 129 |
F_HELPER_0_0(qtod); |
133 | 130 |
F_HELPER_0_0(dtoq); |
134 | 131 |
DEF_HELPER(int32_t, helper_fstoi, (float32 src)) |
135 |
F_HELPER_0_0(dtoi);
|
|
132 |
DEF_HELPER(int32_t, helper_fdtoi, (void))
|
|
136 | 133 |
DEF_HELPER(int32_t, helper_fqtoi, (void)) |
137 | 134 |
#ifdef TARGET_SPARC64 |
138 |
F_HELPER_0_0(stox);
|
|
135 |
DEF_HELPER(void, helper_fstox, (uint32_t src))
|
|
139 | 136 |
F_HELPER_0_0(dtox); |
140 | 137 |
F_HELPER_0_0(qtox); |
141 | 138 |
F_HELPER_0_0(aligndata); |
b/target-sparc/op_helper.c | ||
---|---|---|
106 | 106 |
F_BINOP(div); |
107 | 107 |
#undef F_BINOP |
108 | 108 |
|
109 |
void helper_fsmuld(void)
|
|
109 |
void helper_fsmuld(float32 src1, float32 src2)
|
|
110 | 110 |
{ |
111 |
DT0 = float64_mul(float32_to_float64(FT0, &env->fp_status),
|
|
112 |
float32_to_float64(FT1, &env->fp_status),
|
|
111 |
DT0 = float64_mul(float32_to_float64(src1, &env->fp_status),
|
|
112 |
float32_to_float64(src2, &env->fp_status),
|
|
113 | 113 |
&env->fp_status); |
114 | 114 |
} |
115 | 115 |
|
... | ... | |
143 | 143 |
return int32_to_float32(src, &env->fp_status); |
144 | 144 |
} |
145 | 145 |
|
146 |
F_HELPER(ito, d)
|
|
146 |
void helper_fitod(int32_t src)
|
|
147 | 147 |
{ |
148 |
DT0 = int32_to_float64(*((int32_t *)&FT1), &env->fp_status);
|
|
148 |
DT0 = int32_to_float64(src, &env->fp_status);
|
|
149 | 149 |
} |
150 | 150 |
|
151 | 151 |
void helper_fitoq(int32_t src) |
... | ... | |
154 | 154 |
} |
155 | 155 |
|
156 | 156 |
#ifdef TARGET_SPARC64 |
157 |
F_HELPER(xto, s)
|
|
157 |
float32 helper_fxtos(void)
|
|
158 | 158 |
{ |
159 |
FT0 = int64_to_float32(*((int64_t *)&DT1), &env->fp_status);
|
|
159 |
return int64_to_float32(*((int64_t *)&DT1), &env->fp_status);
|
|
160 | 160 |
} |
161 | 161 |
|
162 | 162 |
F_HELPER(xto, d) |
... | ... | |
172 | 172 |
#undef F_HELPER |
173 | 173 |
|
174 | 174 |
/* floating point conversion */ |
175 |
void helper_fdtos(void)
|
|
175 |
float32 helper_fdtos(void)
|
|
176 | 176 |
{ |
177 |
FT0 = float64_to_float32(DT1, &env->fp_status);
|
|
177 |
return float64_to_float32(DT1, &env->fp_status);
|
|
178 | 178 |
} |
179 | 179 |
|
180 |
void helper_fstod(void)
|
|
180 |
void helper_fstod(float32 src)
|
|
181 | 181 |
{ |
182 |
DT0 = float32_to_float64(FT1, &env->fp_status);
|
|
182 |
DT0 = float32_to_float64(src, &env->fp_status);
|
|
183 | 183 |
} |
184 | 184 |
|
185 | 185 |
float32 helper_fqtos(void) |
... | ... | |
208 | 208 |
return float32_to_int32_round_to_zero(src, &env->fp_status); |
209 | 209 |
} |
210 | 210 |
|
211 |
void helper_fdtoi(void)
|
|
211 |
int32_t helper_fdtoi(void)
|
|
212 | 212 |
{ |
213 |
*((int32_t *)&FT0) = float64_to_int32_round_to_zero(DT1, &env->fp_status);
|
|
213 |
return float64_to_int32_round_to_zero(DT1, &env->fp_status);
|
|
214 | 214 |
} |
215 | 215 |
|
216 | 216 |
int32_t helper_fqtoi(void) |
... | ... | |
219 | 219 |
} |
220 | 220 |
|
221 | 221 |
#ifdef TARGET_SPARC64 |
222 |
void helper_fstox(void)
|
|
222 |
void helper_fstox(float32 src)
|
|
223 | 223 |
{ |
224 |
*((int64_t *)&DT0) = float32_to_int64_round_to_zero(FT1, &env->fp_status);
|
|
224 |
*((int64_t *)&DT0) = float32_to_int64_round_to_zero(src, &env->fp_status);
|
|
225 | 225 |
} |
226 | 226 |
|
227 | 227 |
void helper_fdtox(void) |
b/target-sparc/translate.c | ||
---|---|---|
102 | 102 |
#define IS_IMM (insn & (1<<13)) |
103 | 103 |
|
104 | 104 |
/* floating point registers moves */ |
105 |
static void gen_op_load_fpr_FT0(unsigned int src) |
|
106 |
{ |
|
107 |
tcg_gen_st_i32(cpu_fpr[src], cpu_env, offsetof(CPUSPARCState, ft0)); |
|
108 |
} |
|
109 |
|
|
110 |
static void gen_op_load_fpr_FT1(unsigned int src) |
|
111 |
{ |
|
112 |
tcg_gen_st_i32(cpu_fpr[src], cpu_env, offsetof(CPUSPARCState, ft1)); |
|
113 |
} |
|
114 |
|
|
115 |
static void gen_op_store_FT0_fpr(unsigned int dst) |
|
116 |
{ |
|
117 |
tcg_gen_ld_i32(cpu_fpr[dst], cpu_env, offsetof(CPUSPARCState, ft0)); |
|
118 |
} |
|
119 |
|
|
120 | 105 |
static void gen_op_load_fpr_DT0(unsigned int src) |
121 | 106 |
{ |
122 | 107 |
tcg_gen_st_i32(cpu_fpr[src], cpu_env, offsetof(CPUSPARCState, dt0) + |
... | ... | |
2475 | 2460 |
tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
2476 | 2461 |
gen_op_store_QT0_fpr(QFPREG(rd)); |
2477 | 2462 |
break; |
2478 |
case 0x69: |
|
2463 |
case 0x69: /* fsmuld */
|
|
2479 | 2464 |
CHECK_FPU_FEATURE(dc, FSMULD); |
2480 |
gen_op_load_fpr_FT0(rs1); |
|
2481 |
gen_op_load_fpr_FT1(rs2); |
|
2482 | 2465 |
gen_clear_float_exceptions(); |
2483 |
tcg_gen_helper_0_0(helper_fsmuld); |
|
2466 |
tcg_gen_helper_0_2(helper_fsmuld, cpu_fpr[rs1], |
|
2467 |
cpu_fpr[rs2]); |
|
2484 | 2468 |
tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
2485 | 2469 |
gen_op_store_DT0_fpr(DFPREG(rd)); |
2486 | 2470 |
break; |
... | ... | |
2500 | 2484 |
tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
2501 | 2485 |
tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32); |
2502 | 2486 |
break; |
2503 |
case 0xc6: |
|
2487 |
case 0xc6: /* fdtos */
|
|
2504 | 2488 |
gen_op_load_fpr_DT1(DFPREG(rs2)); |
2505 | 2489 |
gen_clear_float_exceptions(); |
2506 |
tcg_gen_helper_0_0(helper_fdtos);
|
|
2490 |
tcg_gen_helper_1_0(helper_fdtos, cpu_tmp32);
|
|
2507 | 2491 |
tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
2508 |
gen_op_store_FT0_fpr(rd);
|
|
2492 |
tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
|
|
2509 | 2493 |
break; |
2510 | 2494 |
case 0xc7: /* fqtos */ |
2511 | 2495 |
CHECK_FPU_FEATURE(dc, FLOAT128); |
... | ... | |
2515 | 2499 |
tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
2516 | 2500 |
tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32); |
2517 | 2501 |
break; |
2518 |
case 0xc8: |
|
2519 |
gen_op_load_fpr_FT1(rs2); |
|
2520 |
tcg_gen_helper_0_0(helper_fitod); |
|
2502 |
case 0xc8: /* fitod */ |
|
2503 |
tcg_gen_helper_0_1(helper_fitod, cpu_fpr[rs2]); |
|
2521 | 2504 |
gen_op_store_DT0_fpr(DFPREG(rd)); |
2522 | 2505 |
break; |
2523 |
case 0xc9: |
|
2524 |
gen_op_load_fpr_FT1(rs2); |
|
2525 |
tcg_gen_helper_0_0(helper_fstod); |
|
2506 |
case 0xc9: /* fstod */ |
|
2507 |
tcg_gen_helper_0_1(helper_fstod, cpu_fpr[rs2]); |
|
2526 | 2508 |
gen_op_store_DT0_fpr(DFPREG(rd)); |
2527 | 2509 |
break; |
2528 | 2510 |
case 0xcb: /* fqtod */ |
... | ... | |
2556 | 2538 |
tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
2557 | 2539 |
tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32); |
2558 | 2540 |
break; |
2559 |
case 0xd2: |
|
2541 |
case 0xd2: /* fdtoi */
|
|
2560 | 2542 |
gen_op_load_fpr_DT1(DFPREG(rs2)); |
2561 | 2543 |
gen_clear_float_exceptions(); |
2562 |
tcg_gen_helper_0_0(helper_fdtoi);
|
|
2544 |
tcg_gen_helper_1_0(helper_fdtoi, cpu_tmp32);
|
|
2563 | 2545 |
tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
2564 |
gen_op_store_FT0_fpr(rd);
|
|
2546 |
tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
|
|
2565 | 2547 |
break; |
2566 | 2548 |
case 0xd3: /* fqtoi */ |
2567 | 2549 |
CHECK_FPU_FEATURE(dc, FLOAT128); |
... | ... | |
2612 | 2594 |
gen_op_store_QT0_fpr(QFPREG(rd)); |
2613 | 2595 |
break; |
2614 | 2596 |
case 0x81: /* V9 fstox */ |
2615 |
gen_op_load_fpr_FT1(rs2); |
|
2616 | 2597 |
gen_clear_float_exceptions(); |
2617 |
tcg_gen_helper_0_0(helper_fstox);
|
|
2598 |
tcg_gen_helper_0_1(helper_fstox, cpu_fpr[rs2]);
|
|
2618 | 2599 |
tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
2619 | 2600 |
gen_op_store_DT0_fpr(DFPREG(rd)); |
2620 | 2601 |
break; |
... | ... | |
2636 | 2617 |
case 0x84: /* V9 fxtos */ |
2637 | 2618 |
gen_op_load_fpr_DT1(DFPREG(rs2)); |
2638 | 2619 |
gen_clear_float_exceptions(); |
2639 |
tcg_gen_helper_0_0(helper_fxtos);
|
|
2620 |
tcg_gen_helper_1_0(helper_fxtos, cpu_tmp32);
|
|
2640 | 2621 |
tcg_gen_helper_0_0(helper_check_ieee_exceptions); |
2641 |
gen_op_store_FT0_fpr(rd);
|
|
2622 |
tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
|
|
2642 | 2623 |
break; |
2643 | 2624 |
case 0x88: /* V9 fxtod */ |
2644 | 2625 |
gen_op_load_fpr_DT1(DFPREG(rs2)); |
Also available in: Unified diff