Commit dc99a3f2e856e6d2c2142538b756eb72de0af51a

Authored by blueswir1
1 parent 02cb1585

Convert condition code changing versions of add, sub, logic, and div to TCG


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4052 c046a42c-6fe2-441c-8c8c-71466251a162
target-sparc/cpu.h
@@ -184,6 +184,11 @@ typedef struct CPUSPARCState { @@ -184,6 +184,11 @@ typedef struct CPUSPARCState {
184 target_ulong pc; /* program counter */ 184 target_ulong pc; /* program counter */
185 target_ulong npc; /* next program counter */ 185 target_ulong npc; /* next program counter */
186 target_ulong y; /* multiply/divide register */ 186 target_ulong y; /* multiply/divide register */
  187 +
  188 + /* emulator internal flags handling */
  189 + target_ulong cc_src;
  190 + target_ulong cc_dst;
  191 +
187 uint32_t psr; /* processor state register */ 192 uint32_t psr; /* processor state register */
188 target_ulong fsr; /* FPU state register */ 193 target_ulong fsr; /* FPU state register */
189 uint32_t cwp; /* index of current register window (extracted 194 uint32_t cwp; /* index of current register window (extracted
target-sparc/op.c
@@ -171,389 +171,6 @@ @@ -171,389 +171,6 @@
171 171
172 #define FLAG_SET(x) ((env->psr&x)?1:0) 172 #define FLAG_SET(x) ((env->psr&x)?1:0)
173 173
174 -void OPPROTO op_add_T1_T0_cc(void)  
175 -{  
176 - target_ulong src1;  
177 -  
178 - src1 = T0;  
179 - T0 += T1;  
180 - env->psr = 0;  
181 -#ifdef TARGET_SPARC64  
182 - if (!(T0 & 0xffffffff))  
183 - env->psr |= PSR_ZERO;  
184 - if ((int32_t) T0 < 0)  
185 - env->psr |= PSR_NEG;  
186 - if ((T0 & 0xffffffff) < (src1 & 0xffffffff))  
187 - env->psr |= PSR_CARRY;  
188 - if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) &  
189 - ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))  
190 - env->psr |= PSR_OVF;  
191 -  
192 - env->xcc = 0;  
193 - if (!T0)  
194 - env->xcc |= PSR_ZERO;  
195 - if ((int64_t) T0 < 0)  
196 - env->xcc |= PSR_NEG;  
197 - if (T0 < src1)  
198 - env->xcc |= PSR_CARRY;  
199 - if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63))  
200 - env->xcc |= PSR_OVF;  
201 -#else  
202 - if (!T0)  
203 - env->psr |= PSR_ZERO;  
204 - if ((int32_t) T0 < 0)  
205 - env->psr |= PSR_NEG;  
206 - if (T0 < src1)  
207 - env->psr |= PSR_CARRY;  
208 - if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))  
209 - env->psr |= PSR_OVF;  
210 -#endif  
211 - FORCE_RET();  
212 -}  
213 -  
214 -void OPPROTO op_addx_T1_T0_cc(void)  
215 -{  
216 - target_ulong src1;  
217 - src1 = T0;  
218 - if (FLAG_SET(PSR_CARRY))  
219 - {  
220 - T0 += T1 + 1;  
221 - env->psr = 0;  
222 -#ifdef TARGET_SPARC64  
223 - if ((T0 & 0xffffffff) <= (src1 & 0xffffffff))  
224 - env->psr |= PSR_CARRY;  
225 - env->xcc = 0;  
226 - if (T0 <= src1)  
227 - env->xcc |= PSR_CARRY;  
228 -#else  
229 - if (T0 <= src1)  
230 - env->psr |= PSR_CARRY;  
231 -#endif  
232 - }  
233 - else  
234 - {  
235 - T0 += T1;  
236 - env->psr = 0;  
237 -#ifdef TARGET_SPARC64  
238 - if ((T0 & 0xffffffff) < (src1 & 0xffffffff))  
239 - env->psr |= PSR_CARRY;  
240 - env->xcc = 0;  
241 - if (T0 < src1)  
242 - env->xcc |= PSR_CARRY;  
243 -#else  
244 - if (T0 < src1)  
245 - env->psr |= PSR_CARRY;  
246 -#endif  
247 - }  
248 -#ifdef TARGET_SPARC64  
249 - if (!(T0 & 0xffffffff))  
250 - env->psr |= PSR_ZERO;  
251 - if ((int32_t) T0 < 0)  
252 - env->psr |= PSR_NEG;  
253 - if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) &  
254 - ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))  
255 - env->psr |= PSR_OVF;  
256 -  
257 - if (!T0)  
258 - env->xcc |= PSR_ZERO;  
259 - if ((int64_t) T0 < 0)  
260 - env->xcc |= PSR_NEG;  
261 - if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63))  
262 - env->xcc |= PSR_OVF;  
263 -#else  
264 - if (!T0)  
265 - env->psr |= PSR_ZERO;  
266 - if ((int32_t) T0 < 0)  
267 - env->psr |= PSR_NEG;  
268 - if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))  
269 - env->psr |= PSR_OVF;  
270 -#endif  
271 - FORCE_RET();  
272 -}  
273 -  
274 -void OPPROTO op_tadd_T1_T0_cc(void)  
275 -{  
276 - target_ulong src1;  
277 -  
278 - src1 = T0;  
279 - T0 += T1;  
280 - env->psr = 0;  
281 -#ifdef TARGET_SPARC64  
282 - if (!(T0 & 0xffffffff))  
283 - env->psr |= PSR_ZERO;  
284 - if ((int32_t) T0 < 0)  
285 - env->psr |= PSR_NEG;  
286 - if ((T0 & 0xffffffff) < (src1 & 0xffffffff))  
287 - env->psr |= PSR_CARRY;  
288 - if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) &  
289 - ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))  
290 - env->psr |= PSR_OVF;  
291 - if ((src1 & 0x03) || (T1 & 0x03))  
292 - env->psr |= PSR_OVF;  
293 -  
294 - env->xcc = 0;  
295 - if (!T0)  
296 - env->xcc |= PSR_ZERO;  
297 - if ((int64_t) T0 < 0)  
298 - env->xcc |= PSR_NEG;  
299 - if (T0 < src1)  
300 - env->xcc |= PSR_CARRY;  
301 - if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63))  
302 - env->xcc |= PSR_OVF;  
303 -#else  
304 - if (!T0)  
305 - env->psr |= PSR_ZERO;  
306 - if ((int32_t) T0 < 0)  
307 - env->psr |= PSR_NEG;  
308 - if (T0 < src1)  
309 - env->psr |= PSR_CARRY;  
310 - if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))  
311 - env->psr |= PSR_OVF;  
312 - if ((src1 & 0x03) || (T1 & 0x03))  
313 - env->psr |= PSR_OVF;  
314 -#endif  
315 - FORCE_RET();  
316 -}  
317 -  
318 -void OPPROTO op_tadd_T1_T0_ccTV(void)  
319 -{  
320 - target_ulong src1;  
321 -  
322 - if ((T0 & 0x03) || (T1 & 0x03)) {  
323 - raise_exception(TT_TOVF);  
324 - FORCE_RET();  
325 - return;  
326 - }  
327 -  
328 - src1 = T0;  
329 - T0 += T1;  
330 -  
331 -#ifdef TARGET_SPARC64  
332 - if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) &  
333 - ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))  
334 - raise_exception(TT_TOVF);  
335 -#else  
336 - if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))  
337 - raise_exception(TT_TOVF);  
338 -#endif  
339 -  
340 - env->psr = 0;  
341 -#ifdef TARGET_SPARC64  
342 - if (!(T0 & 0xffffffff))  
343 - env->psr |= PSR_ZERO;  
344 - if ((int32_t) T0 < 0)  
345 - env->psr |= PSR_NEG;  
346 - if ((T0 & 0xffffffff) < (src1 & 0xffffffff))  
347 - env->psr |= PSR_CARRY;  
348 -  
349 - env->xcc = 0;  
350 - if (!T0)  
351 - env->xcc |= PSR_ZERO;  
352 - if ((int64_t) T0 < 0)  
353 - env->xcc |= PSR_NEG;  
354 - if (T0 < src1)  
355 - env->xcc |= PSR_CARRY;  
356 -#else  
357 - if (!T0)  
358 - env->psr |= PSR_ZERO;  
359 - if ((int32_t) T0 < 0)  
360 - env->psr |= PSR_NEG;  
361 - if (T0 < src1)  
362 - env->psr |= PSR_CARRY;  
363 -#endif  
364 - FORCE_RET();  
365 -}  
366 -  
367 -void OPPROTO op_sub_T1_T0_cc(void)  
368 -{  
369 - target_ulong src1;  
370 -  
371 - src1 = T0;  
372 - T0 -= T1;  
373 - env->psr = 0;  
374 -#ifdef TARGET_SPARC64  
375 - if (!(T0 & 0xffffffff))  
376 - env->psr |= PSR_ZERO;  
377 - if ((int32_t) T0 < 0)  
378 - env->psr |= PSR_NEG;  
379 - if ((src1 & 0xffffffff) < (T1 & 0xffffffff))  
380 - env->psr |= PSR_CARRY;  
381 - if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) &  
382 - ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))  
383 - env->psr |= PSR_OVF;  
384 -  
385 - env->xcc = 0;  
386 - if (!T0)  
387 - env->xcc |= PSR_ZERO;  
388 - if ((int64_t) T0 < 0)  
389 - env->xcc |= PSR_NEG;  
390 - if (src1 < T1)  
391 - env->xcc |= PSR_CARRY;  
392 - if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63))  
393 - env->xcc |= PSR_OVF;  
394 -#else  
395 - if (!T0)  
396 - env->psr |= PSR_ZERO;  
397 - if ((int32_t) T0 < 0)  
398 - env->psr |= PSR_NEG;  
399 - if (src1 < T1)  
400 - env->psr |= PSR_CARRY;  
401 - if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))  
402 - env->psr |= PSR_OVF;  
403 -#endif  
404 - FORCE_RET();  
405 -}  
406 -  
407 -void OPPROTO op_subx_T1_T0_cc(void)  
408 -{  
409 - target_ulong src1;  
410 - src1 = T0;  
411 - if (FLAG_SET(PSR_CARRY))  
412 - {  
413 - T0 -= T1 + 1;  
414 - env->psr = 0;  
415 -#ifdef TARGET_SPARC64  
416 - if ((src1 & 0xffffffff) <= (T1 & 0xffffffff))  
417 - env->psr |= PSR_CARRY;  
418 - env->xcc = 0;  
419 - if (src1 <= T1)  
420 - env->xcc |= PSR_CARRY;  
421 -#else  
422 - if (src1 <= T1)  
423 - env->psr |= PSR_CARRY;  
424 -#endif  
425 - }  
426 - else  
427 - {  
428 - T0 -= T1;  
429 - env->psr = 0;  
430 -#ifdef TARGET_SPARC64  
431 - if ((src1 & 0xffffffff) < (T1 & 0xffffffff))  
432 - env->psr |= PSR_CARRY;  
433 - env->xcc = 0;  
434 - if (src1 < T1)  
435 - env->xcc |= PSR_CARRY;  
436 -#else  
437 - if (src1 < T1)  
438 - env->psr |= PSR_CARRY;  
439 -#endif  
440 - }  
441 -#ifdef TARGET_SPARC64  
442 - if (!(T0 & 0xffffffff))  
443 - env->psr |= PSR_ZERO;  
444 - if ((int32_t) T0 < 0)  
445 - env->psr |= PSR_NEG;  
446 - if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) &  
447 - ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))  
448 - env->psr |= PSR_OVF;  
449 -  
450 - if (!T0)  
451 - env->xcc |= PSR_ZERO;  
452 - if ((int64_t) T0 < 0)  
453 - env->xcc |= PSR_NEG;  
454 - if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63))  
455 - env->xcc |= PSR_OVF;  
456 -#else  
457 - if (!T0)  
458 - env->psr |= PSR_ZERO;  
459 - if ((int32_t) T0 < 0)  
460 - env->psr |= PSR_NEG;  
461 - if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))  
462 - env->psr |= PSR_OVF;  
463 -#endif  
464 - FORCE_RET();  
465 -}  
466 -  
467 -void OPPROTO op_tsub_T1_T0_cc(void)  
468 -{  
469 - target_ulong src1;  
470 -  
471 - src1 = T0;  
472 - T0 -= T1;  
473 - env->psr = 0;  
474 -#ifdef TARGET_SPARC64  
475 - if (!(T0 & 0xffffffff))  
476 - env->psr |= PSR_ZERO;  
477 - if ((int32_t) T0 < 0)  
478 - env->psr |= PSR_NEG;  
479 - if ((src1 & 0xffffffff) < (T1 & 0xffffffff))  
480 - env->psr |= PSR_CARRY;  
481 - if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) &  
482 - ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))  
483 - env->psr |= PSR_OVF;  
484 - if ((src1 & 0x03) || (T1 & 0x03))  
485 - env->psr |= PSR_OVF;  
486 -  
487 - env->xcc = 0;  
488 - if (!T0)  
489 - env->xcc |= PSR_ZERO;  
490 - if ((int64_t) T0 < 0)  
491 - env->xcc |= PSR_NEG;  
492 - if (src1 < T1)  
493 - env->xcc |= PSR_CARRY;  
494 - if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63))  
495 - env->xcc |= PSR_OVF;  
496 -#else  
497 - if (!T0)  
498 - env->psr |= PSR_ZERO;  
499 - if ((int32_t) T0 < 0)  
500 - env->psr |= PSR_NEG;  
501 - if (src1 < T1)  
502 - env->psr |= PSR_CARRY;  
503 - if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))  
504 - env->psr |= PSR_OVF;  
505 - if ((src1 & 0x03) || (T1 & 0x03))  
506 - env->psr |= PSR_OVF;  
507 -#endif  
508 - FORCE_RET();  
509 -}  
510 -  
511 -void OPPROTO op_tsub_T1_T0_ccTV(void)  
512 -{  
513 - target_ulong src1;  
514 -  
515 - if ((T0 & 0x03) || (T1 & 0x03))  
516 - raise_exception(TT_TOVF);  
517 -  
518 - src1 = T0;  
519 - T0 -= T1;  
520 -  
521 -#ifdef TARGET_SPARC64  
522 - if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) &  
523 - ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))  
524 - raise_exception(TT_TOVF);  
525 -#else  
526 - if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))  
527 - raise_exception(TT_TOVF);  
528 -#endif  
529 -  
530 - env->psr = 0;  
531 -#ifdef TARGET_SPARC64  
532 - if (!(T0 & 0xffffffff))  
533 - env->psr |= PSR_ZERO;  
534 - if ((int32_t) T0 < 0)  
535 - env->psr |= PSR_NEG;  
536 - if ((src1 & 0xffffffff) < (T1 & 0xffffffff))  
537 - env->psr |= PSR_CARRY;  
538 -  
539 - env->xcc = 0;  
540 - if (!T0)  
541 - env->xcc |= PSR_ZERO;  
542 - if ((int64_t) T0 < 0)  
543 - env->xcc |= PSR_NEG;  
544 - if (src1 < T1)  
545 - env->xcc |= PSR_CARRY;  
546 -#else  
547 - if (!T0)  
548 - env->psr |= PSR_ZERO;  
549 - if ((int32_t) T0 < 0)  
550 - env->psr |= PSR_NEG;  
551 - if (src1 < T1)  
552 - env->psr |= PSR_CARRY;  
553 -#endif  
554 - FORCE_RET();  
555 -}  
556 -  
557 void OPPROTO op_umul_T1_T0(void) 174 void OPPROTO op_umul_T1_T0(void)
558 { 175 {
559 uint64_t res; 176 uint64_t res;
@@ -652,33 +269,6 @@ void OPPROTO op_sdiv_T1_T0(void) @@ -652,33 +269,6 @@ void OPPROTO op_sdiv_T1_T0(void)
652 FORCE_RET(); 269 FORCE_RET();
653 } 270 }
654 271
655 -void OPPROTO op_div_cc(void)  
656 -{  
657 - env->psr = 0;  
658 -#ifdef TARGET_SPARC64  
659 - if (!T0)  
660 - env->psr |= PSR_ZERO;  
661 - if ((int32_t) T0 < 0)  
662 - env->psr |= PSR_NEG;  
663 - if (T1)  
664 - env->psr |= PSR_OVF;  
665 -  
666 - env->xcc = 0;  
667 - if (!T0)  
668 - env->xcc |= PSR_ZERO;  
669 - if ((int64_t) T0 < 0)  
670 - env->xcc |= PSR_NEG;  
671 -#else  
672 - if (!T0)  
673 - env->psr |= PSR_ZERO;  
674 - if ((int32_t) T0 < 0)  
675 - env->psr |= PSR_NEG;  
676 - if (T1)  
677 - env->psr |= PSR_OVF;  
678 -#endif  
679 - FORCE_RET();  
680 -}  
681 -  
682 #ifdef TARGET_SPARC64 272 #ifdef TARGET_SPARC64
683 void OPPROTO op_udivx_T1_T0(void) 273 void OPPROTO op_udivx_T1_T0(void)
684 { 274 {
@@ -702,29 +292,6 @@ void OPPROTO op_sdivx_T1_T0(void) @@ -702,29 +292,6 @@ void OPPROTO op_sdivx_T1_T0(void)
702 } 292 }
703 #endif 293 #endif
704 294
705 -void OPPROTO op_logic_T0_cc(void)  
706 -{  
707 - env->psr = 0;  
708 -#ifdef TARGET_SPARC64  
709 - if (!(T0 & 0xffffffff))  
710 - env->psr |= PSR_ZERO;  
711 - if ((int32_t) T0 < 0)  
712 - env->psr |= PSR_NEG;  
713 -  
714 - env->xcc = 0;  
715 - if (!T0)  
716 - env->xcc |= PSR_ZERO;  
717 - if ((int64_t) T0 < 0)  
718 - env->xcc |= PSR_NEG;  
719 -#else  
720 - if (!T0)  
721 - env->psr |= PSR_ZERO;  
722 - if ((int32_t) T0 < 0)  
723 - env->psr |= PSR_NEG;  
724 -#endif  
725 - FORCE_RET();  
726 -}  
727 -  
728 /* Load and store */ 295 /* Load and store */
729 #define MEMSUFFIX _raw 296 #define MEMSUFFIX _raw
730 #include "op_mem.h" 297 #include "op_mem.h"
target-sparc/translate.c
@@ -46,7 +46,10 @@ @@ -46,7 +46,10 @@
46 according to jump_pc[T2] */ 46 according to jump_pc[T2] */
47 47
48 /* global register indexes */ 48 /* global register indexes */
49 -static TCGv cpu_env, cpu_T[3], cpu_regwptr; 49 +static TCGv cpu_env, cpu_T[3], cpu_regwptr, cpu_cc_src, cpu_cc_dst, cpu_psr;
  50 +#ifdef TARGET_SPARC64
  51 +static TCGv cpu_xcc;
  52 +#endif
50 /* local register indexes (only used inside old micro ops) */ 53 /* local register indexes (only used inside old micro ops) */
51 static TCGv cpu_tmp0; 54 static TCGv cpu_tmp0;
52 55
@@ -356,6 +359,407 @@ static inline void gen_mov_reg_C(TCGv reg, TCGv src) @@ -356,6 +359,407 @@ static inline void gen_mov_reg_C(TCGv reg, TCGv src)
356 tcg_gen_andi_tl(reg, reg, 0x1); 359 tcg_gen_andi_tl(reg, reg, 0x1);
357 } 360 }
358 361
  362 +static inline void gen_op_exception(int exception)
  363 +{
  364 + TCGv r_except;
  365 +
  366 + r_except = tcg_temp_new(TCG_TYPE_I32);
  367 + tcg_gen_movi_i32(r_except, exception);
  368 + tcg_gen_helper_0_1(raise_exception, r_except);
  369 +}
  370 +
  371 +static inline void gen_cc_clear(void)
  372 +{
  373 + tcg_gen_movi_i32(cpu_psr, 0);
  374 +#ifdef TARGET_SPARC64
  375 + tcg_gen_movi_i32(cpu_xcc, 0);
  376 +#endif
  377 +}
  378 +
  379 +/* old op:
  380 + if (!T0)
  381 + env->psr |= PSR_ZERO;
  382 + if ((int32_t) T0 < 0)
  383 + env->psr |= PSR_NEG;
  384 +*/
  385 +static inline void gen_cc_NZ(TCGv dst)
  386 +{
  387 + int l1, l2;
  388 + TCGv r_zero;
  389 +
  390 + l1 = gen_new_label();
  391 + l2 = gen_new_label();
  392 + r_zero = tcg_temp_new(TCG_TYPE_TL);
  393 + tcg_gen_movi_tl(r_zero, 0);
  394 + tcg_gen_brcond_i32(TCG_COND_NE, dst, r_zero, l1);
  395 + tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_ZERO);
  396 + gen_set_label(l1);
  397 + tcg_gen_brcond_i32(TCG_COND_GE, dst, r_zero, l2);
  398 + tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_NEG);
  399 + gen_set_label(l2);
  400 +#ifdef TARGET_SPARC64
  401 + {
  402 + int l3, l4;
  403 +
  404 + l3 = gen_new_label();
  405 + l4 = gen_new_label();
  406 + tcg_gen_brcond_tl(TCG_COND_NE, dst, r_zero, l3);
  407 + tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_ZERO);
  408 + gen_set_label(l3);
  409 + tcg_gen_brcond_tl(TCG_COND_GE, dst, r_zero, l4);
  410 + tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_NEG);
  411 + gen_set_label(l4);
  412 + }
  413 +#endif
  414 +}
  415 +
  416 +/* old op:
  417 + if (T0 < src1)
  418 + env->psr |= PSR_CARRY;
  419 +*/
  420 +static inline void gen_cc_C_add(TCGv dst, TCGv src1)
  421 +{
  422 + int l1;
  423 +
  424 + l1 = gen_new_label();
  425 + tcg_gen_brcond_i32(TCG_COND_GEU, dst, src1, l1);
  426 + tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_CARRY);
  427 + gen_set_label(l1);
  428 +#ifdef TARGET_SPARC64
  429 + {
  430 + int l2;
  431 +
  432 + l2 = gen_new_label();
  433 + tcg_gen_brcond_tl(TCG_COND_GEU, dst, src1, l2);
  434 + tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_CARRY);
  435 + gen_set_label(l2);
  436 + }
  437 +#endif
  438 +}
  439 +
  440 +/* old op:
  441 + if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
  442 + env->psr |= PSR_OVF;
  443 +*/
  444 +static inline void gen_cc_V_add(TCGv dst, TCGv src1, TCGv src2)
  445 +{
  446 + TCGv r_temp, r_temp2, r_temp3, r_zero;
  447 + int l1;
  448 +
  449 + l1 = gen_new_label();
  450 +
  451 + r_temp = tcg_temp_new(TCG_TYPE_TL);
  452 + r_temp2 = tcg_temp_new(TCG_TYPE_TL);
  453 + r_temp3 = tcg_temp_new(TCG_TYPE_TL);
  454 + r_zero = tcg_temp_new(TCG_TYPE_TL);
  455 + tcg_gen_movi_tl(r_zero, 0);
  456 + tcg_gen_xor_tl(r_temp, src1, src2);
  457 + tcg_gen_xori_tl(r_temp, r_temp, -1);
  458 + tcg_gen_xor_tl(r_temp2, src1, dst);
  459 + tcg_gen_and_tl(r_temp, r_temp, r_temp2);
  460 + tcg_gen_andi_tl(r_temp3, r_temp, (1 << 31));
  461 + tcg_gen_brcond_i32(TCG_COND_EQ, r_temp3, r_zero, l1);
  462 + tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_OVF);
  463 + gen_set_label(l1);
  464 +#ifdef TARGET_SPARC64
  465 + {
  466 + int l2;
  467 +
  468 + l2 = gen_new_label();
  469 + tcg_gen_movi_tl(r_zero, 0);
  470 + tcg_gen_xor_tl(r_temp, src1, src2);
  471 + tcg_gen_xori_tl(r_temp, r_temp, -1);
  472 + tcg_gen_xor_tl(r_temp2, src1, dst);
  473 + tcg_gen_and_tl(r_temp, r_temp, r_temp2);
  474 + tcg_gen_andi_tl(r_temp3, r_temp, (1ULL << 63));
  475 + tcg_gen_brcond_tl(TCG_COND_EQ, r_temp3, r_zero, l2);
  476 + tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_OVF);
  477 + gen_set_label(l2);
  478 + }
  479 +#endif
  480 +}
  481 +
  482 +static inline void gen_add_tv(TCGv dst, TCGv src1, TCGv src2)
  483 +{
  484 + TCGv r_temp, r_temp2, r_temp3, r_zero;
  485 + int l1;
  486 +
  487 + l1 = gen_new_label();
  488 +
  489 + r_temp = tcg_temp_new(TCG_TYPE_TL);
  490 + r_temp2 = tcg_temp_new(TCG_TYPE_TL);
  491 + r_temp3 = tcg_temp_new(TCG_TYPE_TL);
  492 + r_zero = tcg_temp_new(TCG_TYPE_TL);
  493 + tcg_gen_movi_tl(r_zero, 0);
  494 + tcg_gen_xor_tl(r_temp, src1, src2);
  495 + tcg_gen_xori_tl(r_temp, r_temp, -1);
  496 + tcg_gen_xor_tl(r_temp2, src1, dst);
  497 + tcg_gen_and_tl(r_temp, r_temp, r_temp2);
  498 + tcg_gen_andi_tl(r_temp3, r_temp, (1 << 31));
  499 + tcg_gen_brcond_i32(TCG_COND_EQ, r_temp3, r_zero, l1);
  500 + gen_op_exception(TT_TOVF);
  501 + gen_set_label(l1);
  502 +#ifdef TARGET_SPARC64
  503 + {
  504 + int l2;
  505 +
  506 + l2 = gen_new_label();
  507 + tcg_gen_movi_tl(r_zero, 0);
  508 + tcg_gen_xor_tl(r_temp, src1, src2);
  509 + tcg_gen_xori_tl(r_temp, r_temp, -1);
  510 + tcg_gen_xor_tl(r_temp2, src1, dst);
  511 + tcg_gen_and_tl(r_temp, r_temp, r_temp2);
  512 + tcg_gen_andi_tl(r_temp3, r_temp, (1ULL << 63));
  513 + tcg_gen_brcond_tl(TCG_COND_EQ, r_temp3, r_zero, l2);
  514 + gen_op_exception(TT_TOVF);
  515 + gen_set_label(l2);
  516 + }
  517 +#endif
  518 +}
  519 +
  520 +static inline void gen_cc_V_tag(TCGv src1, TCGv src2)
  521 +{
  522 + int l1;
  523 + TCGv r_zero, r_temp;
  524 +
  525 + l1 = gen_new_label();
  526 + r_zero = tcg_temp_new(TCG_TYPE_TL);
  527 + r_temp = tcg_temp_new(TCG_TYPE_TL);
  528 + tcg_gen_movi_tl(r_zero, 0);
  529 + tcg_gen_or_tl(r_temp, src1, src2);
  530 + tcg_gen_andi_tl(r_temp, r_temp, 0x3);
  531 + tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, r_zero, l1);
  532 + tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_OVF);
  533 + gen_set_label(l1);
  534 +}
  535 +
  536 +static inline void gen_tag_tv(TCGv src1, TCGv src2)
  537 +{
  538 + int l1;
  539 + TCGv r_zero, r_temp;
  540 +
  541 + l1 = gen_new_label();
  542 + r_zero = tcg_temp_new(TCG_TYPE_TL);
  543 + r_temp = tcg_temp_new(TCG_TYPE_TL);
  544 + tcg_gen_movi_tl(r_zero, 0);
  545 + tcg_gen_or_tl(r_temp, src1, src2);
  546 + tcg_gen_andi_tl(r_temp, r_temp, 0x3);
  547 + tcg_gen_brcond_tl(TCG_COND_EQ, r_temp, r_zero, l1);
  548 + gen_op_exception(TT_TOVF);
  549 + gen_set_label(l1);
  550 +}
  551 +
  552 +static inline void gen_op_add_T1_T0_cc(void)
  553 +{
  554 + tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
  555 + tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
  556 + gen_cc_clear();
  557 + gen_cc_NZ(cpu_T[0]);
  558 + gen_cc_C_add(cpu_T[0], cpu_cc_src);
  559 + gen_cc_V_add(cpu_T[0], cpu_cc_src, cpu_T[1]);
  560 +}
  561 +
  562 +static inline void gen_op_addx_T1_T0_cc(void)
  563 +{
  564 + tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
  565 + gen_mov_reg_C(cpu_tmp0, cpu_psr);
  566 + tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_tmp0);
  567 + gen_cc_clear();
  568 + gen_cc_C_add(cpu_T[0], cpu_cc_src);
  569 + tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
  570 + gen_cc_C_add(cpu_T[0], cpu_cc_src);
  571 + gen_cc_NZ(cpu_T[0]);
  572 + gen_cc_V_add(cpu_T[0], cpu_cc_src, cpu_T[1]);
  573 +}
  574 +
  575 +static inline void gen_op_tadd_T1_T0_cc(void)
  576 +{
  577 + tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
  578 + tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
  579 + gen_cc_clear();
  580 + gen_cc_NZ(cpu_T[0]);
  581 + gen_cc_C_add(cpu_T[0], cpu_cc_src);
  582 + gen_cc_V_add(cpu_T[0], cpu_cc_src, cpu_T[1]);
  583 + gen_cc_V_tag(cpu_cc_src, cpu_T[1]);
  584 +}
  585 +
  586 +static inline void gen_op_tadd_T1_T0_ccTV(void)
  587 +{
  588 + gen_tag_tv(cpu_T[0], cpu_T[1]);
  589 + tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
  590 + tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
  591 + gen_add_tv(cpu_T[0], cpu_cc_src, cpu_T[1]);
  592 + gen_cc_clear();
  593 + gen_cc_NZ(cpu_T[0]);
  594 + gen_cc_C_add(cpu_T[0], cpu_cc_src);
  595 +}
  596 +
  597 +/* old op:
  598 + if (src1 < T1)
  599 + env->psr |= PSR_CARRY;
  600 +*/
  601 +static inline void gen_cc_C_sub(TCGv src1, TCGv src2)
  602 +{
  603 + int l1;
  604 +
  605 + l1 = gen_new_label();
  606 + tcg_gen_brcond_i32(TCG_COND_GEU, src1, src2, l1);
  607 + tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_CARRY);
  608 + gen_set_label(l1);
  609 +#ifdef TARGET_SPARC64
  610 + {
  611 + int l2;
  612 +
  613 + l2 = gen_new_label();
  614 + tcg_gen_brcond_tl(TCG_COND_GEU, src1, src2, l2);
  615 + tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_CARRY);
  616 + gen_set_label(l2);
  617 + }
  618 +#endif
  619 +}
  620 +
  621 +/* old op:
  622 + if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))
  623 + env->psr |= PSR_OVF;
  624 +*/
  625 +static inline void gen_cc_V_sub(TCGv dst, TCGv src1, TCGv src2)
  626 +{
  627 + TCGv r_temp, r_temp2, r_temp3, r_zero;
  628 + int l1;
  629 +
  630 + l1 = gen_new_label();
  631 +
  632 + r_temp = tcg_temp_new(TCG_TYPE_TL);
  633 + r_temp2 = tcg_temp_new(TCG_TYPE_TL);
  634 + r_temp3 = tcg_temp_new(TCG_TYPE_TL);
  635 + r_zero = tcg_temp_new(TCG_TYPE_TL);
  636 + tcg_gen_movi_tl(r_zero, 0);
  637 + tcg_gen_xor_tl(r_temp, src1, src2);
  638 + tcg_gen_xor_tl(r_temp2, src1, dst);
  639 + tcg_gen_and_tl(r_temp, r_temp, r_temp2);
  640 + tcg_gen_andi_tl(r_temp3, r_temp, (1 << 31));
  641 + tcg_gen_brcond_i32(TCG_COND_EQ, r_temp3, r_zero, l1);
  642 + tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_OVF);
  643 + gen_set_label(l1);
  644 +#ifdef TARGET_SPARC64
  645 + {
  646 + int l2;
  647 +
  648 + l2 = gen_new_label();
  649 + tcg_gen_movi_tl(r_zero, 0);
  650 + tcg_gen_xor_tl(r_temp, src1, src2);
  651 + tcg_gen_xor_tl(r_temp2, src1, dst);
  652 + tcg_gen_and_tl(r_temp, r_temp, r_temp2);
  653 + tcg_gen_andi_tl(r_temp3, r_temp, (1ULL << 63));
  654 + tcg_gen_brcond_tl(TCG_COND_EQ, r_temp3, r_zero, l2);
  655 + tcg_gen_ori_i32(cpu_xcc, cpu_xcc, PSR_OVF);
  656 + gen_set_label(l2);
  657 + }
  658 +#endif
  659 +}
  660 +
  661 +static inline void gen_sub_tv(TCGv dst, TCGv src1, TCGv src2)
  662 +{
  663 + TCGv r_temp, r_temp2, r_temp3, r_zero;
  664 + int l1;
  665 +
  666 + l1 = gen_new_label();
  667 +
  668 + r_temp = tcg_temp_new(TCG_TYPE_TL);
  669 + r_temp2 = tcg_temp_new(TCG_TYPE_TL);
  670 + r_temp3 = tcg_temp_new(TCG_TYPE_TL);
  671 + r_zero = tcg_temp_new(TCG_TYPE_TL);
  672 + tcg_gen_movi_tl(r_zero, 0);
  673 + tcg_gen_xor_tl(r_temp, src1, src2);
  674 + tcg_gen_xor_tl(r_temp2, src1, dst);
  675 + tcg_gen_and_tl(r_temp, r_temp, r_temp2);
  676 + tcg_gen_andi_tl(r_temp3, r_temp, (1 << 31));
  677 + tcg_gen_brcond_i32(TCG_COND_EQ, r_temp3, r_zero, l1);
  678 + gen_op_exception(TT_TOVF);
  679 + gen_set_label(l1);
  680 +#ifdef TARGET_SPARC64
  681 + {
  682 + int l2;
  683 +
  684 + l2 = gen_new_label();
  685 + tcg_gen_movi_tl(r_zero, 0);
  686 + tcg_gen_xor_tl(r_temp, src1, src2);
  687 + tcg_gen_xor_tl(r_temp2, src1, dst);
  688 + tcg_gen_and_tl(r_temp, r_temp, r_temp2);
  689 + tcg_gen_andi_tl(r_temp3, r_temp, (1ULL << 63));
  690 + tcg_gen_brcond_tl(TCG_COND_EQ, r_temp3, r_zero, l2);
  691 + gen_op_exception(TT_TOVF);
  692 + gen_set_label(l2);
  693 + }
  694 +#endif
  695 +}
  696 +
  697 +static inline void gen_op_sub_T1_T0_cc(void)
  698 +{
  699 + tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
  700 + tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
  701 + gen_cc_clear();
  702 + gen_cc_NZ(cpu_T[0]);
  703 + gen_cc_C_sub(cpu_cc_src, cpu_T[1]);
  704 + gen_cc_V_sub(cpu_T[0], cpu_cc_src, cpu_T[1]);
  705 +}
  706 +
  707 +static inline void gen_op_subx_T1_T0_cc(void)
  708 +{
  709 + tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
  710 + gen_mov_reg_C(cpu_tmp0, cpu_psr);
  711 + tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_tmp0);
  712 + gen_cc_clear();
  713 + gen_cc_C_sub(cpu_T[0], cpu_cc_src);
  714 + tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
  715 + gen_cc_C_sub(cpu_T[0], cpu_cc_src);
  716 + gen_cc_NZ(cpu_T[0]);
  717 + gen_cc_V_sub(cpu_T[0], cpu_cc_src, cpu_T[1]);
  718 +}
  719 +
  720 +static inline void gen_op_tsub_T1_T0_cc(void)
  721 +{
  722 + tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
  723 + tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
  724 + gen_cc_clear();
  725 + gen_cc_NZ(cpu_T[0]);
  726 + gen_cc_C_sub(cpu_cc_src, cpu_T[1]);
  727 + gen_cc_V_sub(cpu_T[0], cpu_cc_src, cpu_T[1]);
  728 + gen_cc_V_tag(cpu_cc_src, cpu_T[1]);
  729 +}
  730 +
  731 +static inline void gen_op_tsub_T1_T0_ccTV(void)
  732 +{
  733 + gen_tag_tv(cpu_T[0], cpu_T[1]);
  734 + tcg_gen_mov_tl(cpu_cc_src, cpu_T[0]);
  735 + tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
  736 + gen_sub_tv(cpu_T[0], cpu_cc_src, cpu_T[1]);
  737 + gen_cc_clear();
  738 + gen_cc_NZ(cpu_T[0]);
  739 + gen_cc_C_sub(cpu_cc_src, cpu_T[1]);
  740 +}
  741 +
  742 +static inline void gen_op_div_cc(void)
  743 +{
  744 + int l1;
  745 + TCGv r_zero;
  746 +
  747 + gen_cc_clear();
  748 + gen_cc_NZ(cpu_T[0]);
  749 + l1 = gen_new_label();
  750 + r_zero = tcg_temp_new(TCG_TYPE_TL);
  751 + tcg_gen_movi_tl(r_zero, 0);
  752 + tcg_gen_brcond_i32(TCG_COND_EQ, cpu_T[1], r_zero, l1);
  753 + tcg_gen_ori_i32(cpu_psr, cpu_psr, PSR_OVF);
  754 + gen_set_label(l1);
  755 +}
  756 +
  757 +static inline void gen_op_logic_T0_cc(void)
  758 +{
  759 + gen_cc_clear();
  760 + gen_cc_NZ(cpu_T[0]);
  761 +}
  762 +
359 // 1 763 // 1
360 static inline void gen_op_eval_ba(TCGv dst) 764 static inline void gen_op_eval_ba(TCGv dst)
361 { 765 {
@@ -789,14 +1193,13 @@ static inline void gen_cond(TCGv r_dst, unsigned int cc, unsigned int cond) @@ -789,14 +1193,13 @@ static inline void gen_cond(TCGv r_dst, unsigned int cc, unsigned int cond)
789 { 1193 {
790 TCGv r_src; 1194 TCGv r_src;
791 1195
792 - r_src = tcg_temp_new(TCG_TYPE_TL);  
793 #ifdef TARGET_SPARC64 1196 #ifdef TARGET_SPARC64
794 if (cc) 1197 if (cc)
795 - tcg_gen_ld_i32(r_src, cpu_env, offsetof(CPUSPARCState, xcc)); 1198 + r_src = cpu_xcc;
796 else 1199 else
797 - tcg_gen_ld_i32(r_src, cpu_env, offsetof(CPUSPARCState, psr)); 1200 + r_src = cpu_psr;
798 #else 1201 #else
799 - tcg_gen_ld_i32(r_src, cpu_env, offsetof(CPUSPARCState, psr)); 1202 + r_src = cpu_psr;
800 #endif 1203 #endif
801 switch (cond) { 1204 switch (cond) {
802 case 0x0: 1205 case 0x0:
@@ -1170,15 +1573,6 @@ static inline void gen_op_fcmpeq(int fccno) @@ -1170,15 +1573,6 @@ static inline void gen_op_fcmpeq(int fccno)
1170 1573
1171 #endif 1574 #endif
1172 1575
1173 -static inline void gen_op_exception(int exception)  
1174 -{  
1175 - TCGv r_except;  
1176 -  
1177 - r_except = tcg_temp_new(TCG_TYPE_I32);  
1178 - tcg_gen_movi_i32(r_except, exception);  
1179 - tcg_gen_helper_0_1(raise_exception, r_except);  
1180 -}  
1181 -  
1182 static inline void gen_op_fpexception_im(int fsr_flags) 1576 static inline void gen_op_fpexception_im(int fsr_flags)
1183 { 1577 {
1184 tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fsr)); 1578 tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fsr));
@@ -2632,9 +3026,7 @@ static void disas_sparc_insn(DisasContext * dc) @@ -2632,9 +3026,7 @@ static void disas_sparc_insn(DisasContext * dc)
2632 if (xop & 0x10) 3026 if (xop & 0x10)
2633 gen_op_addx_T1_T0_cc(); 3027 gen_op_addx_T1_T0_cc();
2634 else { 3028 else {
2635 - tcg_gen_ld_i32(cpu_tmp0, cpu_env,  
2636 - offsetof(CPUSPARCState, psr));  
2637 - gen_mov_reg_C(cpu_tmp0, cpu_tmp0); 3029 + gen_mov_reg_C(cpu_tmp0, cpu_psr);
2638 tcg_gen_add_tl(cpu_T[1], cpu_T[1], cpu_tmp0); 3030 tcg_gen_add_tl(cpu_T[1], cpu_T[1], cpu_tmp0);
2639 tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); 3031 tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
2640 } 3032 }
@@ -2658,9 +3050,7 @@ static void disas_sparc_insn(DisasContext * dc) @@ -2658,9 +3050,7 @@ static void disas_sparc_insn(DisasContext * dc)
2658 if (xop & 0x10) 3050 if (xop & 0x10)
2659 gen_op_subx_T1_T0_cc(); 3051 gen_op_subx_T1_T0_cc();
2660 else { 3052 else {
2661 - tcg_gen_ld_i32(cpu_tmp0, cpu_env,  
2662 - offsetof(CPUSPARCState, psr));  
2663 - gen_mov_reg_C(cpu_tmp0, cpu_tmp0); 3053 + gen_mov_reg_C(cpu_tmp0, cpu_psr);
2664 tcg_gen_add_tl(cpu_T[1], cpu_T[1], cpu_tmp0); 3054 tcg_gen_add_tl(cpu_T[1], cpu_T[1], cpu_tmp0);
2665 tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]); 3055 tcg_gen_sub_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
2666 } 3056 }
@@ -4345,11 +4735,23 @@ CPUSPARCState *cpu_sparc_init(const char *cpu_model) @@ -4345,11 +4735,23 @@ CPUSPARCState *cpu_sparc_init(const char *cpu_model)
4345 TCG_AREG0, offsetof(CPUState, t1), "T1"); 4735 TCG_AREG0, offsetof(CPUState, t1), "T1");
4346 cpu_T[2] = tcg_global_mem_new(TCG_TYPE_TL, 4736 cpu_T[2] = tcg_global_mem_new(TCG_TYPE_TL,
4347 TCG_AREG0, offsetof(CPUState, t2), "T2"); 4737 TCG_AREG0, offsetof(CPUState, t2), "T2");
  4738 + cpu_xcc = tcg_global_mem_new(TCG_TYPE_I32,
  4739 + TCG_AREG0, offsetof(CPUState, xcc),
  4740 + "xcc");
4348 #else 4741 #else
4349 cpu_T[0] = tcg_global_reg_new(TCG_TYPE_TL, TCG_AREG1, "T0"); 4742 cpu_T[0] = tcg_global_reg_new(TCG_TYPE_TL, TCG_AREG1, "T0");
4350 cpu_T[1] = tcg_global_reg_new(TCG_TYPE_TL, TCG_AREG2, "T1"); 4743 cpu_T[1] = tcg_global_reg_new(TCG_TYPE_TL, TCG_AREG2, "T1");
4351 cpu_T[2] = tcg_global_reg_new(TCG_TYPE_TL, TCG_AREG3, "T2"); 4744 cpu_T[2] = tcg_global_reg_new(TCG_TYPE_TL, TCG_AREG3, "T2");
4352 #endif 4745 #endif
  4746 + cpu_cc_src = tcg_global_mem_new(TCG_TYPE_TL,
  4747 + TCG_AREG0, offsetof(CPUState, cc_src),
  4748 + "cc_src");
  4749 + cpu_cc_dst = tcg_global_mem_new(TCG_TYPE_TL,
  4750 + TCG_AREG0, offsetof(CPUState, cc_dst),
  4751 + "cc_dst");
  4752 + cpu_psr = tcg_global_mem_new(TCG_TYPE_I32,
  4753 + TCG_AREG0, offsetof(CPUState, psr),
  4754 + "psr");
4353 } 4755 }
4354 4756
4355 cpu_reset(env); 4757 cpu_reset(env);