Revision fd4a04eb target-mips/translate.c

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

  
493 493
#define FOP_CONDS(type, fmt)                                            \
494
static GenOpFunc1 * cond ## type ## _ ## fmt ## _table[16] = {          \
494
static GenOpFunc1 * gen_op_cmp ## type ## _ ## fmt ## _table[16] = {    \
495 495
    gen_op_cmp ## type ## _ ## fmt ## _f,                               \
496 496
    gen_op_cmp ## type ## _ ## fmt ## _un,                              \
497 497
    gen_op_cmp ## type ## _ ## fmt ## _eq,                              \
......
511 511
};                                                                      \
512 512
static inline void gen_cmp ## type ## _ ## fmt(int n, long cc)          \
513 513
{                                                                       \
514
    cond ## type ## _ ## fmt ## _table[n](cc);                          \
514
    gen_op_cmp ## type ## _ ## fmt ## _table[n](cc);                    \
515 515
}
516 516

  
517 517
FOP_CONDS(, d)
......
525 525
    struct TranslationBlock *tb;
526 526
    target_ulong pc, saved_pc;
527 527
    uint32_t opcode;
528
    uint32_t fp_status, saved_fp_status;
528
    uint32_t fp_status;
529 529
    /* Routine used to access memory */
530 530
    int mem_idx;
531 531
    uint32_t hflags, saved_hflags;
532
    uint32_t CP0_Status;
533 532
    int bstate;
534 533
    target_ulong btarget;
535 534
} DisasContext;
......
628 627
    }
629 628
}
630 629

  
631
static inline void save_fpu_state (DisasContext *ctx)
630
static inline void restore_cpu_state (CPUState *env, DisasContext *ctx)
632 631
{
633
    if (ctx->fp_status != ctx->saved_fp_status) {
634
        gen_op_save_fp_status(ctx->fp_status);
635
        ctx->saved_fp_status = ctx->fp_status;
632
    ctx->saved_hflags = ctx->hflags;
633
    switch (ctx->hflags & MIPS_HFLAG_BMASK) {
634
    case MIPS_HFLAG_BR:
635
        gen_op_restore_breg_target();
636
        break;
637
    case MIPS_HFLAG_B:
638
        ctx->btarget = env->btarget;
639
        break;
640
    case MIPS_HFLAG_BC:
641
    case MIPS_HFLAG_BL:
642
        ctx->btarget = env->btarget;
643
        gen_op_restore_bcond();
644
        break;
636 645
    }
637 646
}
638 647

  
......
4293 4302
        gen_op_save_bcond();
4294 4303
        break;
4295 4304
    case OPC_BC1FANY2:
4296
        gen_op_bc1fany2(cc);
4297
        opn = "bc1fany2";
4305
        gen_op_bc1any2f(cc);
4306
        opn = "bc1any2f";
4298 4307
        goto not_likely;
4299 4308
    case OPC_BC1TANY2:
4300
        gen_op_bc1tany2(cc);
4301
        opn = "bc1tany2";
4309
        gen_op_bc1any2t(cc);
4310
        opn = "bc1any2t";
4302 4311
        goto not_likely;
4303 4312
    case OPC_BC1FANY4:
4304
        gen_op_bc1fany4(cc);
4305
        opn = "bc1fany4";
4313
        gen_op_bc1any4f(cc);
4314
        opn = "bc1any4f";
4306 4315
        goto not_likely;
4307 4316
    case OPC_BC1TANY4:
4308
        gen_op_bc1tany4(cc);
4309
        opn = "bc1tany4";
4317
        gen_op_bc1any4t(cc);
4318
        opn = "bc1any4t";
4310 4319
    not_likely:
4311 4320
        ctx->hflags |= MIPS_HFLAG_BC;
4312 4321
        gen_op_set_bcond();
......
4323 4332

  
4324 4333
/* Coprocessor 1 (FPU) */
4325 4334

  
4326
/* verify if floating point register is valid; an operation is not defined
4327
 * if bit 0 of any register specification is set and the FR bit in the
4328
 * Status register equals zero, since the register numbers specify an
4329
 * even-odd pair of adjacent coprocessor general registers. When the FR bit
4330
 * in the Status register equals one, both even and odd register numbers
4331
 * are valid. This limitation exists only for 64 bit wide (d,l,ps) registers.
4332
 * 
4333
 * Multiple 64 bit wide registers can be checked by calling
4334
 * CHECK_FR(ctx, freg1 | freg2 | ... | fregN);
4335
 * 
4336
 * FIXME: This is broken for R2, it needs to be checked at runtime, not
4337
 * at translation time.
4338
 */
4339
#define CHECK_FR(ctx, freg) do {                                      \
4340
        if (!((ctx)->CP0_Status & (1 << CP0St_FR)) && ((freg) & 1)) { \
4341
            MIPS_INVAL("FPU mode");                                   \
4342
            generate_exception (ctx, EXCP_RI);                        \
4343
            return;                                                   \
4344
        }                                                             \
4345
    } while(0)
4346

  
4347 4335
#define FOP(func, fmt) (((fmt) << 21) | (func))
4348 4336

  
4349 4337
static void gen_cp1 (DisasContext *ctx, uint32_t opc, int rt, int fs)
......
4388 4376
        opn = "dmtc1";
4389 4377
        break;
4390 4378
    case OPC_MFHC1:
4391
        CHECK_FR(ctx, fs);
4379
        gen_op_cp1_registers(fs);
4392 4380
        GEN_LOAD_FREG_FTN(WTH0, fs);
4393 4381
        gen_op_mfhc1();
4394 4382
        GEN_STORE_TN_REG(rt, T0);
4395 4383
        opn = "mfhc1";
4396 4384
        break;
4397 4385
    case OPC_MTHC1:
4398
        CHECK_FR(ctx, fs);
4386
        gen_op_cp1_registers(fs);
4399 4387
        GEN_LOAD_REG_TN(T0, rt);
4400 4388
        gen_op_mthc1();
4401 4389
        GEN_STORE_FTN_FREG(fs, WTH0);
......
4546 4534
        opn = "neg.s";
4547 4535
        break;
4548 4536
    case FOP(8, 16):
4549
        CHECK_FR(ctx, fs);
4537
        gen_op_cp1_registers(fs);
4550 4538
        GEN_LOAD_FREG_FTN(WT0, fs);
4551 4539
        gen_op_float_roundl_s();
4552 4540
        GEN_STORE_FTN_FREG(fd, DT2);
4553 4541
        opn = "round.l.s";
4554 4542
        break;
4555 4543
    case FOP(9, 16):
4556
        CHECK_FR(ctx, fs);
4544
        gen_op_cp1_registers(fs);
4557 4545
        GEN_LOAD_FREG_FTN(WT0, fs);
4558 4546
        gen_op_float_truncl_s();
4559 4547
        GEN_STORE_FTN_FREG(fd, DT2);
4560 4548
        opn = "trunc.l.s";
4561 4549
        break;
4562 4550
    case FOP(10, 16):
4563
        CHECK_FR(ctx, fs);
4551
        gen_op_cp1_registers(fs);
4564 4552
        GEN_LOAD_FREG_FTN(WT0, fs);
4565 4553
        gen_op_float_ceill_s();
4566 4554
        GEN_STORE_FTN_FREG(fd, DT2);
4567 4555
        opn = "ceil.l.s";
4568 4556
        break;
4569 4557
    case FOP(11, 16):
4570
        CHECK_FR(ctx, fs);
4558
        gen_op_cp1_registers(fs);
4571 4559
        GEN_LOAD_FREG_FTN(WT0, fs);
4572 4560
        gen_op_float_floorl_s();
4573 4561
        GEN_STORE_FTN_FREG(fd, DT2);
......
4622 4610
        opn = "movn.s";
4623 4611
        break;
4624 4612
    case FOP(33, 16):
4625
        CHECK_FR(ctx, fd);
4613
        gen_op_cp1_registers(fd);
4626 4614
        GEN_LOAD_FREG_FTN(WT0, fs);
4627 4615
        gen_op_float_cvtd_s();
4628 4616
        GEN_STORE_FTN_FREG(fd, DT2);
......
4635 4623
        opn = "cvt.w.s";
4636 4624
        break;
4637 4625
    case FOP(37, 16):
4638
        CHECK_FR(ctx, fs | fd);
4626
        gen_op_cp1_registers(fs | fd);
4639 4627
        GEN_LOAD_FREG_FTN(WT0, fs);
4640 4628
        gen_op_float_cvtl_s();
4641 4629
        GEN_STORE_FTN_FREG(fd, DT2);
4642 4630
        opn = "cvt.l.s";
4643 4631
        break;
4644 4632
    case FOP(38, 16):
4645
        CHECK_FR(ctx, fs | ft | fd);
4633
        gen_op_cp1_registers(fs | ft | fd);
4646 4634
        GEN_LOAD_FREG_FTN(WT1, fs);
4647 4635
        GEN_LOAD_FREG_FTN(WT0, ft);
4648 4636
        gen_op_float_cvtps_s();
......
4676 4664
        }
4677 4665
        break;
4678 4666
    case FOP(0, 17):
4679
        CHECK_FR(ctx, fs | ft | fd);
4667
        gen_op_cp1_registers(fs | ft | fd);
4680 4668
        GEN_LOAD_FREG_FTN(DT0, fs);
4681 4669
        GEN_LOAD_FREG_FTN(DT1, ft);
4682 4670
        gen_op_float_add_d();
......
4685 4673
        optype = BINOP;
4686 4674
        break;
4687 4675
    case FOP(1, 17):
4688
        CHECK_FR(ctx, fs | ft | fd);
4676
        gen_op_cp1_registers(fs | ft | fd);
4689 4677
        GEN_LOAD_FREG_FTN(DT0, fs);
4690 4678
        GEN_LOAD_FREG_FTN(DT1, ft);
4691 4679
        gen_op_float_sub_d();
......
4694 4682
        optype = BINOP;
4695 4683
        break;
4696 4684
    case FOP(2, 17):
4697
        CHECK_FR(ctx, fs | ft | fd);
4685
        gen_op_cp1_registers(fs | ft | fd);
4698 4686
        GEN_LOAD_FREG_FTN(DT0, fs);
4699 4687
        GEN_LOAD_FREG_FTN(DT1, ft);
4700 4688
        gen_op_float_mul_d();
......
4703 4691
        optype = BINOP;
4704 4692
        break;
4705 4693
    case FOP(3, 17):
4706
        CHECK_FR(ctx, fs | ft | fd);
4694
        gen_op_cp1_registers(fs | ft | fd);
4707 4695
        GEN_LOAD_FREG_FTN(DT0, fs);
4708 4696
        GEN_LOAD_FREG_FTN(DT1, ft);
4709 4697
        gen_op_float_div_d();
......
4712 4700
        optype = BINOP;
4713 4701
        break;
4714 4702
    case FOP(4, 17):
4715
        CHECK_FR(ctx, fs | fd);
4703
        gen_op_cp1_registers(fs | fd);
4716 4704
        GEN_LOAD_FREG_FTN(DT0, fs);
4717 4705
        gen_op_float_sqrt_d();
4718 4706
        GEN_STORE_FTN_FREG(fd, DT2);
4719 4707
        opn = "sqrt.d";
4720 4708
        break;
4721 4709
    case FOP(5, 17):
4722
        CHECK_FR(ctx, fs | fd);
4710
        gen_op_cp1_registers(fs | fd);
4723 4711
        GEN_LOAD_FREG_FTN(DT0, fs);
4724 4712
        gen_op_float_abs_d();
4725 4713
        GEN_STORE_FTN_FREG(fd, DT2);
4726 4714
        opn = "abs.d";
4727 4715
        break;
4728 4716
    case FOP(6, 17):
4729
        CHECK_FR(ctx, fs | fd);
4717
        gen_op_cp1_registers(fs | fd);
4730 4718
        GEN_LOAD_FREG_FTN(DT0, fs);
4731 4719
        gen_op_float_mov_d();
4732 4720
        GEN_STORE_FTN_FREG(fd, DT2);
4733 4721
        opn = "mov.d";
4734 4722
        break;
4735 4723
    case FOP(7, 17):
4736
        CHECK_FR(ctx, fs | fd);
4724
        gen_op_cp1_registers(fs | fd);
4737 4725
        GEN_LOAD_FREG_FTN(DT0, fs);
4738 4726
        gen_op_float_chs_d();
4739 4727
        GEN_STORE_FTN_FREG(fd, DT2);
4740 4728
        opn = "neg.d";
4741 4729
        break;
4742 4730
    case FOP(8, 17):
4743
        CHECK_FR(ctx, fs);
4731
        gen_op_cp1_registers(fs);
4744 4732
        GEN_LOAD_FREG_FTN(DT0, fs);
4745 4733
        gen_op_float_roundl_d();
4746 4734
        GEN_STORE_FTN_FREG(fd, DT2);
4747 4735
        opn = "round.l.d";
4748 4736
        break;
4749 4737
    case FOP(9, 17):
4750
        CHECK_FR(ctx, fs);
4738
        gen_op_cp1_registers(fs);
4751 4739
        GEN_LOAD_FREG_FTN(DT0, fs);
4752 4740
        gen_op_float_truncl_d();
4753 4741
        GEN_STORE_FTN_FREG(fd, DT2);
4754 4742
        opn = "trunc.l.d";
4755 4743
        break;
4756 4744
    case FOP(10, 17):
4757
        CHECK_FR(ctx, fs);
4745
        gen_op_cp1_registers(fs);
4758 4746
        GEN_LOAD_FREG_FTN(DT0, fs);
4759 4747
        gen_op_float_ceill_d();
4760 4748
        GEN_STORE_FTN_FREG(fd, DT2);
4761 4749
        opn = "ceil.l.d";
4762 4750
        break;
4763 4751
    case FOP(11, 17):
4764
        CHECK_FR(ctx, fs);
4752
        gen_op_cp1_registers(fs);
4765 4753
        GEN_LOAD_FREG_FTN(DT0, fs);
4766 4754
        gen_op_float_floorl_d();
4767 4755
        GEN_STORE_FTN_FREG(fd, DT2);
4768 4756
        opn = "floor.l.d";
4769 4757
        break;
4770 4758
    case FOP(12, 17):
4771
        CHECK_FR(ctx, fs);
4759
        gen_op_cp1_registers(fs);
4772 4760
        GEN_LOAD_FREG_FTN(DT0, fs);
4773 4761
        gen_op_float_roundw_d();
4774 4762
        GEN_STORE_FTN_FREG(fd, WT2);
4775 4763
        opn = "round.w.d";
4776 4764
        break;
4777 4765
    case FOP(13, 17):
4778
        CHECK_FR(ctx, fs);
4766
        gen_op_cp1_registers(fs);
4779 4767
        GEN_LOAD_FREG_FTN(DT0, fs);
4780 4768
        gen_op_float_truncw_d();
4781 4769
        GEN_STORE_FTN_FREG(fd, WT2);
4782 4770
        opn = "trunc.w.d";
4783 4771
        break;
4784 4772
    case FOP(14, 17):
4785
        CHECK_FR(ctx, fs);
4773
        gen_op_cp1_registers(fs);
4786 4774
        GEN_LOAD_FREG_FTN(DT0, fs);
4787 4775
        gen_op_float_ceilw_d();
4788 4776
        GEN_STORE_FTN_FREG(fd, WT2);
4789 4777
        opn = "ceil.w.d";
4790 4778
        break;
4791 4779
    case FOP(15, 17):
4792
        CHECK_FR(ctx, fs);
4780
        gen_op_cp1_registers(fs);
4793 4781
        GEN_LOAD_FREG_FTN(DT0, fs);
4794 4782
        gen_op_float_floorw_d();
4795 4783
        GEN_STORE_FTN_FREG(fd, WT2);
......
4835 4823
    case FOP(61, 17):
4836 4824
    case FOP(62, 17):
4837 4825
    case FOP(63, 17):
4838
        CHECK_FR(ctx, fs | ft);
4826
        gen_op_cp1_registers(fs | ft);
4839 4827
        GEN_LOAD_FREG_FTN(DT0, fs);
4840 4828
        GEN_LOAD_FREG_FTN(DT1, ft);
4841 4829
        if (ctx->opcode & (1 << 6)) {
......
4847 4835
        }
4848 4836
        break;
4849 4837
    case FOP(32, 17):
4850
        CHECK_FR(ctx, fs);
4838
        gen_op_cp1_registers(fs);
4851 4839
        GEN_LOAD_FREG_FTN(DT0, fs);
4852 4840
        gen_op_float_cvts_d();
4853 4841
        GEN_STORE_FTN_FREG(fd, WT2);
4854 4842
        opn = "cvt.s.d";
4855 4843
        break;
4856 4844
    case FOP(36, 17):
4857
        CHECK_FR(ctx, fs);
4845
        gen_op_cp1_registers(fs);
4858 4846
        GEN_LOAD_FREG_FTN(DT0, fs);
4859 4847
        gen_op_float_cvtw_d();
4860 4848
        GEN_STORE_FTN_FREG(fd, WT2);
4861 4849
        opn = "cvt.w.d";
4862 4850
        break;
4863 4851
    case FOP(37, 17):
4864
        CHECK_FR(ctx, fs | fd);
4852
        gen_op_cp1_registers(fs | fd);
4865 4853
        GEN_LOAD_FREG_FTN(DT0, fs);
4866 4854
        gen_op_float_cvtl_d();
4867 4855
        GEN_STORE_FTN_FREG(fd, DT2);
......
4874 4862
        opn = "cvt.s.w";
4875 4863
        break;
4876 4864
    case FOP(33, 20):
4877
        CHECK_FR(ctx, fd);
4865
        gen_op_cp1_registers(fd);
4878 4866
        GEN_LOAD_FREG_FTN(WT0, fs);
4879 4867
        gen_op_float_cvtd_w();
4880 4868
        GEN_STORE_FTN_FREG(fd, DT2);
4881 4869
        opn = "cvt.d.w";
4882 4870
        break;
4883 4871
    case FOP(32, 21):
4884
        CHECK_FR(ctx, fs);
4872
        gen_op_cp1_registers(fs);
4885 4873
        GEN_LOAD_FREG_FTN(DT0, fs);
4886 4874
        gen_op_float_cvts_l();
4887 4875
        GEN_STORE_FTN_FREG(fd, WT2);
4888 4876
        opn = "cvt.s.l";
4889 4877
        break;
4890 4878
    case FOP(33, 21):
4891
        CHECK_FR(ctx, fs | fd);
4879
        gen_op_cp1_registers(fs | fd);
4892 4880
        GEN_LOAD_FREG_FTN(DT0, fs);
4893 4881
        gen_op_float_cvtd_l();
4894 4882
        GEN_STORE_FTN_FREG(fd, DT2);
......
4896 4884
        break;
4897 4885
    case FOP(38, 20):
4898 4886
    case FOP(38, 21):
4899
        CHECK_FR(ctx, fs | fd);
4887
        gen_op_cp1_registers(fs | fd);
4900 4888
        GEN_LOAD_FREG_FTN(WT0, fs);
4901 4889
        GEN_LOAD_FREG_FTN(WTH0, fs);
4902 4890
        gen_op_float_cvtps_pw();
......
4905 4893
        opn = "cvt.ps.pw";
4906 4894
        break;
4907 4895
    case FOP(0, 22):
4908
        CHECK_FR(ctx, fs | ft | fd);
4896
        gen_op_cp1_registers(fs | ft | fd);
4909 4897
        GEN_LOAD_FREG_FTN(WT0, fs);
4910 4898
        GEN_LOAD_FREG_FTN(WTH0, fs);
4911 4899
        GEN_LOAD_FREG_FTN(WT1, ft);
......
4916 4904
        opn = "add.ps";
4917 4905
        break;
4918 4906
    case FOP(1, 22):
4919
        CHECK_FR(ctx, fs | ft | fd);
4907
        gen_op_cp1_registers(fs | ft | fd);
4920 4908
        GEN_LOAD_FREG_FTN(WT0, fs);
4921 4909
        GEN_LOAD_FREG_FTN(WTH0, fs);
4922 4910
        GEN_LOAD_FREG_FTN(WT1, ft);
......
4927 4915
        opn = "sub.ps";
4928 4916
        break;
4929 4917
    case FOP(2, 22):
4930
        CHECK_FR(ctx, fs | ft | fd);
4918
        gen_op_cp1_registers(fs | ft | fd);
4931 4919
        GEN_LOAD_FREG_FTN(WT0, fs);
4932 4920
        GEN_LOAD_FREG_FTN(WTH0, fs);
4933 4921
        GEN_LOAD_FREG_FTN(WT1, ft);
......
4938 4926
        opn = "mul.ps";
4939 4927
        break;
4940 4928
    case FOP(5, 22):
4941
        CHECK_FR(ctx, fs | fd);
4929
        gen_op_cp1_registers(fs | fd);
4942 4930
        GEN_LOAD_FREG_FTN(WT0, fs);
4943 4931
        GEN_LOAD_FREG_FTN(WTH0, fs);
4944 4932
        gen_op_float_abs_ps();
......
4947 4935
        opn = "abs.ps";
4948 4936
        break;
4949 4937
    case FOP(6, 22):
4950
        CHECK_FR(ctx, fs | fd);
4938
        gen_op_cp1_registers(fs | fd);
4951 4939
        GEN_LOAD_FREG_FTN(WT0, fs);
4952 4940
        GEN_LOAD_FREG_FTN(WTH0, fs);
4953 4941
        gen_op_float_mov_ps();
......
4956 4944
        opn = "mov.ps";
4957 4945
        break;
4958 4946
    case FOP(7, 22):
4959
        CHECK_FR(ctx, fs | fd);
4947
        gen_op_cp1_registers(fs | fd);
4960 4948
        GEN_LOAD_FREG_FTN(WT0, fs);
4961 4949
        GEN_LOAD_FREG_FTN(WTH0, fs);
4962 4950
        gen_op_float_chs_ps();
......
4998 4986
        opn = "movn.ps";
4999 4987
        break;
5000 4988
    case FOP(24, 22):
5001
        CHECK_FR(ctx, fs | fd | ft);
4989
        gen_op_cp1_registers(fs | fd | ft);
5002 4990
        GEN_LOAD_FREG_FTN(WT0, fs);
5003 4991
        GEN_LOAD_FREG_FTN(WTH0, fs);
5004 4992
        GEN_LOAD_FREG_FTN(WT1, ft);
......
5009 4997
        opn = "addr.ps";
5010 4998
        break;
5011 4999
    case FOP(32, 22):
5012
        CHECK_FR(ctx, fs);
5000
        gen_op_cp1_registers(fs);
5013 5001
        GEN_LOAD_FREG_FTN(WTH0, fs);
5014 5002
        gen_op_float_cvts_pu();
5015 5003
        GEN_STORE_FTN_FREG(fd, WT2);
5016 5004
        opn = "cvt.s.pu";
5017 5005
        break;
5018 5006
    case FOP(36, 22):
5019
        CHECK_FR(ctx, fs | fd);
5007
        gen_op_cp1_registers(fs | fd);
5020 5008
        GEN_LOAD_FREG_FTN(WT0, fs);
5021 5009
        GEN_LOAD_FREG_FTN(WTH0, fs);
5022 5010
        gen_op_float_cvtpw_ps();
......
5025 5013
        opn = "cvt.pw.ps";
5026 5014
        break;
5027 5015
    case FOP(40, 22):
5028
        CHECK_FR(ctx, fs);
5016
        gen_op_cp1_registers(fs);
5029 5017
        GEN_LOAD_FREG_FTN(WT0, fs);
5030 5018
        gen_op_float_cvts_pl();
5031 5019
        GEN_STORE_FTN_FREG(fd, WT2);
5032 5020
        opn = "cvt.s.pl";
5033 5021
        break;
5034 5022
    case FOP(44, 22):
5035
        CHECK_FR(ctx, fs | ft | fd);
5023
        gen_op_cp1_registers(fs | ft | fd);
5036 5024
        GEN_LOAD_FREG_FTN(WT0, fs);
5037 5025
        GEN_LOAD_FREG_FTN(WT1, ft);
5038 5026
        gen_op_float_pll_ps();
......
5040 5028
        opn = "pll.ps";
5041 5029
        break;
5042 5030
    case FOP(45, 22):
5043
        CHECK_FR(ctx, fs | ft | fd);
5031
        gen_op_cp1_registers(fs | ft | fd);
5044 5032
        GEN_LOAD_FREG_FTN(WT0, fs);
5045 5033
        GEN_LOAD_FREG_FTN(WTH1, ft);
5046 5034
        gen_op_float_plu_ps();
......
5048 5036
        opn = "plu.ps";
5049 5037
        break;
5050 5038
    case FOP(46, 22):
5051
        CHECK_FR(ctx, fs | ft | fd);
5039
        gen_op_cp1_registers(fs | ft | fd);
5052 5040
        GEN_LOAD_FREG_FTN(WTH0, fs);
5053 5041
        GEN_LOAD_FREG_FTN(WT1, ft);
5054 5042
        gen_op_float_pul_ps();
......
5056 5044
        opn = "pul.ps";
5057 5045
        break;
5058 5046
    case FOP(47, 22):
5059
        CHECK_FR(ctx, fs | ft | fd);
5047
        gen_op_cp1_registers(fs | ft | fd);
5060 5048
        GEN_LOAD_FREG_FTN(WTH0, fs);
5061 5049
        GEN_LOAD_FREG_FTN(WTH1, ft);
5062 5050
        gen_op_float_puu_ps();
......
5079 5067
    case FOP(61, 22):
5080 5068
    case FOP(62, 22):
5081 5069
    case FOP(63, 22):
5082
        CHECK_FR(ctx, fs | ft);
5070
        gen_op_cp1_registers(fs | ft);
5083 5071
        GEN_LOAD_FREG_FTN(WT0, fs);
5084 5072
        GEN_LOAD_FREG_FTN(WTH0, fs);
5085 5073
        GEN_LOAD_FREG_FTN(WT1, ft);
......
5166 5154
    const char *opn = "flt3_arith";
5167 5155

  
5168 5156
    /* All of those work only on 64bit FPUs. */
5169
    CHECK_FR(ctx, fd | fr | fs | ft);
5157
    gen_op_cp1_registers(fd | fr | fs | ft);
5170 5158
    switch (opc) {
5171 5159
    case OPC_ALNV_PS:
5172 5160
        GEN_LOAD_REG_TN(T0, fr);
......
5874 5862
    ctx.bstate = BS_NONE;
5875 5863
    /* Restore delay slot state from the tb context.  */
5876 5864
    ctx.hflags = tb->flags;
5877
    ctx.saved_hflags = ctx.hflags;
5878
    switch (ctx.hflags & MIPS_HFLAG_BMASK) {
5879
    case MIPS_HFLAG_BR:
5880
        gen_op_restore_breg_target();
5881
        break;
5882
    case MIPS_HFLAG_B:
5883
        ctx.btarget = env->btarget;
5884
        break;
5885
    case MIPS_HFLAG_BC:
5886
    case MIPS_HFLAG_BL:
5887
        ctx.btarget = env->btarget;
5888
        gen_op_restore_bcond();
5889
        break;
5890
    }
5865
    restore_cpu_state(env, &ctx);
5891 5866
#if defined(CONFIG_USER_ONLY)
5892 5867
    ctx.mem_idx = 0;
5893 5868
#else
5894 5869
    ctx.mem_idx = !((ctx.hflags & MIPS_HFLAG_MODE) == MIPS_HFLAG_UM);
5895 5870
#endif
5896
    ctx.CP0_Status = env->CP0_Status;
5897 5871
#ifdef DEBUG_DISAS
5898 5872
    if (loglevel & CPU_LOG_TB_CPU) {
5899 5873
        fprintf(logfile, "------------------------------------------------\n");

Also available in: Unified diff