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