Revision 5a1e8ffb target-mips/translate.c

b/target-mips/translate.c
490 490
FGEN32(gen_op_load_fpr_WTH2,  gen_op_load_fpr_WTH2_fpr);
491 491
FGEN32(gen_op_store_fpr_WTH2, gen_op_store_fpr_WTH2_fpr);
492 492

  
493
#define FOP_CONDS(fmt) \
494
static GenOpFunc1 * cond_ ## fmt ## _table[16] = {                      \
495
    gen_op_cmp_ ## fmt ## _f,                                           \
496
    gen_op_cmp_ ## fmt ## _un,                                          \
497
    gen_op_cmp_ ## fmt ## _eq,                                          \
498
    gen_op_cmp_ ## fmt ## _ueq,                                         \
499
    gen_op_cmp_ ## fmt ## _olt,                                         \
500
    gen_op_cmp_ ## fmt ## _ult,                                         \
501
    gen_op_cmp_ ## fmt ## _ole,                                         \
502
    gen_op_cmp_ ## fmt ## _ule,                                         \
503
    gen_op_cmp_ ## fmt ## _sf,                                          \
504
    gen_op_cmp_ ## fmt ## _ngle,                                        \
505
    gen_op_cmp_ ## fmt ## _seq,                                         \
506
    gen_op_cmp_ ## fmt ## _ngl,                                         \
507
    gen_op_cmp_ ## fmt ## _lt,                                          \
508
    gen_op_cmp_ ## fmt ## _nge,                                         \
509
    gen_op_cmp_ ## fmt ## _le,                                          \
510
    gen_op_cmp_ ## fmt ## _ngt,                                         \
493
#define FOP_CONDS(type, fmt)                                            \
494
static GenOpFunc1 * cond ## type ## _ ## fmt ## _table[16] = {          \
495
    gen_op_cmp ## type ## _ ## fmt ## _f,                               \
496
    gen_op_cmp ## type ## _ ## fmt ## _un,                              \
497
    gen_op_cmp ## type ## _ ## fmt ## _eq,                              \
498
    gen_op_cmp ## type ## _ ## fmt ## _ueq,                             \
499
    gen_op_cmp ## type ## _ ## fmt ## _olt,                             \
500
    gen_op_cmp ## type ## _ ## fmt ## _ult,                             \
501
    gen_op_cmp ## type ## _ ## fmt ## _ole,                             \
502
    gen_op_cmp ## type ## _ ## fmt ## _ule,                             \
503
    gen_op_cmp ## type ## _ ## fmt ## _sf,                              \
504
    gen_op_cmp ## type ## _ ## fmt ## _ngle,                            \
505
    gen_op_cmp ## type ## _ ## fmt ## _seq,                             \
506
    gen_op_cmp ## type ## _ ## fmt ## _ngl,                             \
507
    gen_op_cmp ## type ## _ ## fmt ## _lt,                              \
508
    gen_op_cmp ## type ## _ ## fmt ## _nge,                             \
509
    gen_op_cmp ## type ## _ ## fmt ## _le,                              \
510
    gen_op_cmp ## type ## _ ## fmt ## _ngt,                             \
511 511
};                                                                      \
512
static inline void gen_cmp_ ## fmt(int n, long cc)                      \
512
static inline void gen_cmp ## type ## _ ## fmt(int n, long cc)          \
513 513
{                                                                       \
514
    cond_ ## fmt ## _table[n](cc);                                      \
514
    cond ## type ## _ ## fmt ## _table[n](cc);                          \
515 515
}
516 516

  
517
FOP_CONDS(d)
518
FOP_CONDS(s)
519
FOP_CONDS(ps)
517
FOP_CONDS(, d)
518
FOP_CONDS(abs, d)
519
FOP_CONDS(, s)
520
FOP_CONDS(abs, s)
521
FOP_CONDS(, ps)
522
FOP_CONDS(abs, ps)
520 523

  
521 524
typedef struct DisasContext {
522 525
    struct TranslationBlock *tb;
......
4453 4456
            "c.le",
4454 4457
            "c.ngt",
4455 4458
    };
4456
    int binary = 0;
4459
    const char *condnames_abs[] = {
4460
            "cabs.f",
4461
            "cabs.un",
4462
            "cabs.eq",
4463
            "cabs.ueq",
4464
            "cabs.olt",
4465
            "cabs.ult",
4466
            "cabs.ole",
4467
            "cabs.ule",
4468
            "cabs.sf",
4469
            "cabs.ngle",
4470
            "cabs.seq",
4471
            "cabs.ngl",
4472
            "cabs.lt",
4473
            "cabs.nge",
4474
            "cabs.le",
4475
            "cabs.ngt",
4476
    };
4477
    enum { BINOP, CMPOP, OTHEROP } optype = OTHEROP;
4457 4478
    uint32_t func = ctx->opcode & 0x3f;
4458 4479

  
4459 4480
    switch (ctx->opcode & FOP(0x3f, 0x1f)) {
......
4463 4484
        gen_op_float_add_s();
4464 4485
        GEN_STORE_FTN_FREG(fd, WT2);
4465 4486
        opn = "add.s";
4466
        binary = 1;
4487
        optype = BINOP;
4467 4488
        break;
4468 4489
    case FOP(1, 16):
4469 4490
        GEN_LOAD_FREG_FTN(WT0, fs);
......
4471 4492
        gen_op_float_sub_s();
4472 4493
        GEN_STORE_FTN_FREG(fd, WT2);
4473 4494
        opn = "sub.s";
4474
        binary = 1;
4495
        optype = BINOP;
4475 4496
        break;
4476 4497
    case FOP(2, 16):
4477 4498
        GEN_LOAD_FREG_FTN(WT0, fs);
......
4479 4500
        gen_op_float_mul_s();
4480 4501
        GEN_STORE_FTN_FREG(fd, WT2);
4481 4502
        opn = "mul.s";
4482
        binary = 1;
4503
        optype = BINOP;
4483 4504
        break;
4484 4505
    case FOP(3, 16):
4485 4506
        GEN_LOAD_FREG_FTN(WT0, fs);
......
4487 4508
        gen_op_float_div_s();
4488 4509
        GEN_STORE_FTN_FREG(fd, WT2);
4489 4510
        opn = "div.s";
4490
        binary = 1;
4511
        optype = BINOP;
4491 4512
        break;
4492 4513
    case FOP(4, 16):
4493 4514
        GEN_LOAD_FREG_FTN(WT0, fs);
......
4635 4656
    case FOP(63, 16):
4636 4657
        GEN_LOAD_FREG_FTN(WT0, fs);
4637 4658
        GEN_LOAD_FREG_FTN(WT1, ft);
4638
        gen_cmp_s(func-48, cc);
4639
        opn = condnames[func-48];
4659
        if (ctx->opcode & (1 << 6)) {
4660
            gen_cmpabs_s(func-48, cc);
4661
            opn = condnames_abs[func-48];
4662
        } else {
4663
            gen_cmp_s(func-48, cc);
4664
            opn = condnames[func-48];
4665
        }
4640 4666
        break;
4641 4667
    case FOP(0, 17):
4642 4668
        CHECK_FR(ctx, fs | ft | fd);
......
4645 4671
        gen_op_float_add_d();
4646 4672
        GEN_STORE_FTN_FREG(fd, DT2);
4647 4673
        opn = "add.d";
4648
        binary = 1;
4674
        optype = BINOP;
4649 4675
        break;
4650 4676
    case FOP(1, 17):
4651 4677
        CHECK_FR(ctx, fs | ft | fd);
......
4654 4680
        gen_op_float_sub_d();
4655 4681
        GEN_STORE_FTN_FREG(fd, DT2);
4656 4682
        opn = "sub.d";
4657
        binary = 1;
4683
        optype = BINOP;
4658 4684
        break;
4659 4685
    case FOP(2, 17):
4660 4686
        CHECK_FR(ctx, fs | ft | fd);
......
4663 4689
        gen_op_float_mul_d();
4664 4690
        GEN_STORE_FTN_FREG(fd, DT2);
4665 4691
        opn = "mul.d";
4666
        binary = 1;
4692
        optype = BINOP;
4667 4693
        break;
4668 4694
    case FOP(3, 17):
4669 4695
        CHECK_FR(ctx, fs | ft | fd);
......
4672 4698
        gen_op_float_div_d();
4673 4699
        GEN_STORE_FTN_FREG(fd, DT2);
4674 4700
        opn = "div.d";
4675
        binary = 1;
4701
        optype = BINOP;
4676 4702
        break;
4677 4703
    case FOP(4, 17):
4678 4704
        CHECK_FR(ctx, fs | fd);
......
4801 4827
        CHECK_FR(ctx, fs | ft);
4802 4828
        GEN_LOAD_FREG_FTN(DT0, fs);
4803 4829
        GEN_LOAD_FREG_FTN(DT1, ft);
4804
        gen_cmp_d(func-48, cc);
4805
        opn = condnames[func-48];
4830
        if (ctx->opcode & (1 << 6)) {
4831
            gen_cmpabs_d(func-48, cc);
4832
            opn = condnames_abs[func-48];
4833
        } else {
4834
            gen_cmp_d(func-48, cc);
4835
            opn = condnames[func-48];
4836
        }
4806 4837
        break;
4807 4838
    case FOP(32, 17):
4808 4839
        CHECK_FR(ctx, fs);
......
5042 5073
        GEN_LOAD_FREG_FTN(WTH0, fs);
5043 5074
        GEN_LOAD_FREG_FTN(WT1, ft);
5044 5075
        GEN_LOAD_FREG_FTN(WTH1, ft);
5045
        gen_cmp_ps(func-48, cc);
5046
        opn = condnames[func-48];
5076
        if (ctx->opcode & (1 << 6)) {
5077
            gen_cmpabs_ps(func-48, cc);
5078
            opn = condnames_abs[func-48];
5079
        } else {
5080
            gen_cmp_ps(func-48, cc);
5081
            opn = condnames[func-48];
5082
        }
5047 5083
        break;
5048 5084
    default:
5049 5085
        MIPS_INVAL(opn);
5050 5086
        generate_exception (ctx, EXCP_RI);
5051 5087
        return;
5052 5088
    }
5053
    if (binary)
5089
    switch (optype) {
5090
    case BINOP:
5054 5091
        MIPS_DEBUG("%s %s, %s, %s", opn, fregnames[fd], fregnames[fs], fregnames[ft]);
5055
    else
5092
        break;
5093
    case CMPOP:
5094
        MIPS_DEBUG("%s %s,%s", opn, fregnames[fs], fregnames[ft]);
5095
        break;
5096
    default:
5056 5097
        MIPS_DEBUG("%s %s,%s", opn, fregnames[fd], fregnames[fs]);
5098
        break;
5099
    }
5057 5100
}
5058 5101

  
5059 5102
/* Coprocessor 3 (FPU) */

Also available in: Unified diff