Revision e98a6e40 target-ppc/op.c
b/target-ppc/op.c | ||
---|---|---|
473 | 473 |
} |
474 | 474 |
|
475 | 475 |
/* Branch */ |
476 |
#if 0 |
|
477 | 476 |
#define EIP regs->nip |
478 |
#define TB_DO_JUMP(name, tb, n, target) JUMP_TB(name, tb, n, target) |
|
479 |
#else |
|
480 |
#define TB_DO_JUMP(name, tb, n, target) regs->nip = target; |
|
481 |
#endif |
|
482 | 477 |
|
483 |
#define __PPC_OP_B(name, target) \ |
|
484 |
PPC_OP(name) \ |
|
485 |
{ \ |
|
486 |
TB_DO_JUMP(glue(op_, name), T1, 0, (target)); \ |
|
487 |
RETURN(); \ |
|
488 |
} |
|
489 |
|
|
490 |
#define __PPC_OP_BL(name, target, link) \ |
|
491 |
PPC_OP(name) \ |
|
492 |
{ \ |
|
493 |
regs->lr = (link); \ |
|
494 |
TB_DO_JUMP(glue(op_, name), T1, 0, (target)); \ |
|
495 |
RETURN(); \ |
|
496 |
} |
|
497 |
|
|
498 |
#define PPC_OP_B(name, target, link) \ |
|
499 |
__PPC_OP_B(name, target); \ |
|
500 |
__PPC_OP_BL(glue(name, l), target, link) |
|
501 |
|
|
502 |
#define __PPC_OP_BC(name, cond, target) \ |
|
503 |
PPC_OP(name) \ |
|
504 |
{ \ |
|
505 |
if (cond) { \ |
|
506 |
TB_DO_JUMP(glue(op_, name), T1, 1, (target)); \ |
|
507 |
} else { \ |
|
508 |
TB_DO_JUMP(glue(op_, name), T1, 0, PARAM(1)); \ |
|
509 |
} \ |
|
510 |
RETURN(); \ |
|
511 |
} |
|
512 |
|
|
513 |
#define __PPC_OP_BCL(name, cond, target) \ |
|
514 |
PPC_OP(name) \ |
|
515 |
{ \ |
|
516 |
regs->lr = PARAM(1); \ |
|
517 |
if (cond) { \ |
|
518 |
TB_DO_JUMP(glue(op_, name), T1, 1, (target)); \ |
|
519 |
} else { \ |
|
520 |
TB_DO_JUMP(glue(op_, name), T1, 0, PARAM(1)); \ |
|
521 |
} \ |
|
522 |
RETURN(); \ |
|
523 |
} |
|
524 |
|
|
525 |
#define __PPC_OP_BCLRL(name, cond, target) \ |
|
526 |
PPC_OP(name) \ |
|
527 |
{ \ |
|
528 |
T2 = (target); \ |
|
529 |
regs->lr = PARAM(1); \ |
|
530 |
if (cond) { \ |
|
531 |
TB_DO_JUMP(glue(op_, name), T1, 1, T2); \ |
|
532 |
} else { \ |
|
533 |
TB_DO_JUMP(glue(op_, name), T1, 0, PARAM(1)); \ |
|
534 |
} \ |
|
535 |
RETURN(); \ |
|
536 |
} |
|
537 |
|
|
538 |
#define _PPC_OP_BC(name, namel, cond, target) \ |
|
539 |
__PPC_OP_BC(name, cond, target); \ |
|
540 |
__PPC_OP_BCL(namel, cond, target) |
|
541 |
|
|
542 |
/* Branch to target */ |
|
543 |
#define PPC_OP_BC(name, cond) \ |
|
544 |
_PPC_OP_BC(b_##name, bl_##name, cond, PARAM(2)) |
|
545 |
|
|
546 |
PPC_OP_B(b, PARAM(1), PARAM(2)); |
|
547 |
PPC_OP_BC(ctr, (regs->ctr != 0)); |
|
548 |
PPC_OP_BC(ctr_true, (regs->ctr != 0 && (T0 & PARAM(3)) != 0)); |
|
549 |
PPC_OP_BC(ctr_false, (regs->ctr != 0 && (T0 & PARAM(3)) == 0)); |
|
550 |
PPC_OP_BC(ctrz, (regs->ctr == 0)); |
|
551 |
PPC_OP_BC(ctrz_true, (regs->ctr == 0 && (T0 & PARAM(3)) != 0)); |
|
552 |
PPC_OP_BC(ctrz_false, (regs->ctr == 0 && (T0 & PARAM(3)) == 0)); |
|
553 |
PPC_OP_BC(true, ((T0 & PARAM(3)) != 0)); |
|
554 |
PPC_OP_BC(false, ((T0 & PARAM(3)) == 0)); |
|
555 |
|
|
556 |
/* Branch to CTR */ |
|
557 |
#define PPC_OP_BCCTR(name, cond) \ |
|
558 |
_PPC_OP_BC(bctr_##name, bctrl_##name, cond, regs->ctr & ~0x03) |
|
559 |
|
|
560 |
PPC_OP_B(bctr, regs->ctr & ~0x03, PARAM(1)); |
|
561 |
PPC_OP_BCCTR(ctr, (regs->ctr != 0)); |
|
562 |
PPC_OP_BCCTR(ctr_true, (regs->ctr != 0 && (T0 & PARAM(2)) != 0)); |
|
563 |
PPC_OP_BCCTR(ctr_false, (regs->ctr != 0 && (T0 & PARAM(2)) == 0)); |
|
564 |
PPC_OP_BCCTR(ctrz, (regs->ctr == 0)); |
|
565 |
PPC_OP_BCCTR(ctrz_true, (regs->ctr == 0 && (T0 & PARAM(2)) != 0)); |
|
566 |
PPC_OP_BCCTR(ctrz_false, (regs->ctr == 0 && (T0 & PARAM(2)) == 0)); |
|
567 |
PPC_OP_BCCTR(true, ((T0 & PARAM(2)) != 0)); |
|
568 |
PPC_OP_BCCTR(false, ((T0 & PARAM(2)) == 0)); |
|
569 |
|
|
570 |
/* Branch to LR */ |
|
571 |
#define PPC_OP_BCLR(name, cond) \ |
|
572 |
__PPC_OP_BC(blr_##name, cond, regs->lr & ~0x03); \ |
|
573 |
__PPC_OP_BCLRL(blrl_##name, cond, regs->lr & ~0x03) |
|
574 |
|
|
575 |
__PPC_OP_B(blr, regs->lr & ~0x03); |
|
576 |
PPC_OP(blrl) |
|
577 |
{ |
|
578 |
T0 = regs->lr & ~0x03; |
|
579 |
regs->lr = PARAM(1); |
|
580 |
TB_DO_JUMP(op_blrl, T1, 0, T0); |
|
581 |
RETURN(); |
|
582 |
} |
|
583 |
PPC_OP_BCLR(ctr, (regs->ctr != 0)); |
|
584 |
PPC_OP_BCLR(ctr_true, (regs->ctr != 0 && (T0 & PARAM(2)) != 0)); |
|
585 |
PPC_OP_BCLR(ctr_false, (regs->ctr != 0 && (T0 & PARAM(2)) == 0)); |
|
586 |
PPC_OP_BCLR(ctrz, (regs->ctr == 0)); |
|
587 |
PPC_OP_BCLR(ctrz_true, (regs->ctr == 0 && (T0 & PARAM(2)) != 0)); |
|
588 |
PPC_OP_BCLR(ctrz_false, (regs->ctr == 0 && (T0 & PARAM(2)) == 0)); |
|
589 |
PPC_OP_BCLR(true, ((T0 & PARAM(2)) != 0)); |
|
590 |
PPC_OP_BCLR(false, ((T0 & PARAM(2)) == 0)); |
|
478 |
PPC_OP(setlr) |
|
479 |
{ |
|
480 |
regs->lr = PARAM1; |
|
481 |
} |
|
482 |
|
|
483 |
PPC_OP(b) |
|
484 |
{ |
|
485 |
JUMP_TB(b1, PARAM1, 0, PARAM2); |
|
486 |
} |
|
487 |
|
|
488 |
PPC_OP(b_T1) |
|
489 |
{ |
|
490 |
regs->nip = T1; |
|
491 |
} |
|
492 |
|
|
493 |
PPC_OP(btest) |
|
494 |
{ |
|
495 |
if (T0) { |
|
496 |
JUMP_TB(btest, PARAM1, 0, PARAM2); |
|
497 |
} else { |
|
498 |
JUMP_TB(btest, PARAM1, 1, PARAM3); |
|
499 |
} |
|
500 |
RETURN(); |
|
501 |
} |
|
502 |
|
|
503 |
PPC_OP(btest_T1) |
|
504 |
{ |
|
505 |
if (T0) { |
|
506 |
regs->nip = T1 & ~3; |
|
507 |
} else { |
|
508 |
regs->nip = PARAM1; |
|
509 |
} |
|
510 |
RETURN(); |
|
511 |
} |
|
512 |
|
|
513 |
PPC_OP(movl_T1_ctr) |
|
514 |
{ |
|
515 |
T1 = regs->ctr; |
|
516 |
} |
|
517 |
|
|
518 |
PPC_OP(movl_T1_lr) |
|
519 |
{ |
|
520 |
T1 = regs->lr; |
|
521 |
} |
|
522 |
|
|
523 |
/* tests with result in T0 */ |
|
524 |
|
|
525 |
PPC_OP(test_ctr) |
|
526 |
{ |
|
527 |
T0 = (regs->ctr != 0); |
|
528 |
} |
|
529 |
|
|
530 |
PPC_OP(test_ctr_true) |
|
531 |
{ |
|
532 |
T0 = (regs->ctr != 0 && (T0 & PARAM(1)) != 0); |
|
533 |
} |
|
534 |
|
|
535 |
PPC_OP(test_ctr_false) |
|
536 |
{ |
|
537 |
T0 = (regs->ctr != 0 && (T0 & PARAM(1)) == 0); |
|
538 |
} |
|
539 |
|
|
540 |
PPC_OP(test_ctrz) |
|
541 |
{ |
|
542 |
T0 = (regs->ctr == 0); |
|
543 |
} |
|
544 |
|
|
545 |
PPC_OP(test_ctrz_true) |
|
546 |
{ |
|
547 |
T0 = (regs->ctr == 0 && (T0 & PARAM(1)) != 0); |
|
548 |
} |
|
549 |
|
|
550 |
PPC_OP(test_ctrz_false) |
|
551 |
{ |
|
552 |
T0 = (regs->ctr == 0 && (T0 & PARAM(1)) == 0); |
|
553 |
} |
|
554 |
|
|
555 |
PPC_OP(test_true) |
|
556 |
{ |
|
557 |
T0 = ((T0 & PARAM(1)) != 0); |
|
558 |
} |
|
559 |
|
|
560 |
PPC_OP(test_false) |
|
561 |
{ |
|
562 |
T0 = ((T0 & PARAM(1)) == 0); |
|
563 |
} |
|
591 | 564 |
|
592 | 565 |
/* CTR maintenance */ |
593 | 566 |
PPC_OP(dec_ctr) |
Also available in: Unified diff