Revision 7487953d target-ppc/translate.c

b/target-ppc/translate.c
4626 4626
/* rlmi - rlmi. */
4627 4627
GEN_HANDLER(rlmi, 0x16, 0xFF, 0xFF, 0x00000000, PPC_POWER_BR)
4628 4628
{
4629
    uint32_t mb, me;
4630

  
4631
    mb = MB(ctx->opcode);
4632
    me = ME(ctx->opcode);
4633
    tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]);
4634
    tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rA(ctx->opcode)]);
4635
    tcg_gen_mov_tl(cpu_T[2], cpu_gpr[rB(ctx->opcode)]);
4636
    gen_op_POWER_rlmi(MASK(mb, me), ~MASK(mb, me));
4637
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]);
4629
    uint32_t mb = MB(ctx->opcode);
4630
    uint32_t me = ME(ctx->opcode);
4631
    TCGv t0 = tcg_temp_new();
4632
    tcg_gen_andi_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x1F);
4633
    tcg_gen_rotl_tl(t0, cpu_gpr[rS(ctx->opcode)], t0);
4634
    tcg_gen_andi_tl(t0, t0, MASK(mb, me));
4635
    tcg_gen_andi_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rA(ctx->opcode)], ~MASK(mb, me));
4636
    tcg_gen_or_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rA(ctx->opcode)], t0);
4637
    tcg_temp_free(t0);
4638 4638
    if (unlikely(Rc(ctx->opcode) != 0))
4639
        gen_set_Rc0(ctx, cpu_T[0]);
4639
        gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
4640 4640
}
4641 4641

  
4642 4642
/* rrib - rrib. */
4643 4643
GEN_HANDLER(rrib, 0x1F, 0x19, 0x10, 0x00000000, PPC_POWER_BR)
4644 4644
{
4645
    tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]);
4646
    tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rA(ctx->opcode)]);
4647
    tcg_gen_mov_tl(cpu_T[2], cpu_gpr[rB(ctx->opcode)]);
4648
    gen_op_POWER_rrib();
4649
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]);
4645
    TCGv t0 = tcg_temp_new();
4646
    TCGv t1 = tcg_temp_new();
4647
    tcg_gen_andi_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x1F);
4648
    tcg_gen_movi_tl(t1, 0x80000000);
4649
    tcg_gen_shr_tl(t1, t1, t0);
4650
    tcg_gen_shr_tl(t0, cpu_gpr[rS(ctx->opcode)], t0);
4651
    tcg_gen_and_tl(t0, t0, t1);
4652
    tcg_gen_andc_tl(t1, cpu_gpr[rA(ctx->opcode)], t1);
4653
    tcg_gen_or_tl(cpu_gpr[rA(ctx->opcode)], t0, t1);
4654
    tcg_temp_free(t0);
4655
    tcg_temp_free(t1);
4650 4656
    if (unlikely(Rc(ctx->opcode) != 0))
4651
        gen_set_Rc0(ctx, cpu_T[0]);
4657
        gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
4652 4658
}
4653 4659

  
4654 4660
/* sle - sle. */
4655 4661
GEN_HANDLER(sle, 0x1F, 0x19, 0x04, 0x00000000, PPC_POWER_BR)
4656 4662
{
4657
    tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]);
4658
    tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rB(ctx->opcode)]);
4659
    gen_op_POWER_sle();
4660
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]);
4663
    TCGv t0 = tcg_temp_new();
4664
    TCGv t1 = tcg_temp_new();
4665
    tcg_gen_andi_tl(t1, cpu_gpr[rB(ctx->opcode)], 0x1F);
4666
    tcg_gen_shl_tl(t0, cpu_gpr[rS(ctx->opcode)], t1);
4667
    tcg_gen_subfi_tl(t1, 32, t1);
4668
    tcg_gen_shr_tl(t1, cpu_gpr[rS(ctx->opcode)], t1);
4669
    tcg_gen_or_tl(t1, t0, t1);
4670
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], t0);
4671
    gen_store_spr(SPR_MQ, t1);
4672
    tcg_temp_free(t0);
4673
    tcg_temp_free(t1);
4661 4674
    if (unlikely(Rc(ctx->opcode) != 0))
4662
        gen_set_Rc0(ctx, cpu_T[0]);
4675
        gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
4663 4676
}
4664 4677

  
4665 4678
/* sleq - sleq. */
4666 4679
GEN_HANDLER(sleq, 0x1F, 0x19, 0x06, 0x00000000, PPC_POWER_BR)
4667 4680
{
4668
    tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]);
4669
    tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rB(ctx->opcode)]);
4670
    gen_op_POWER_sleq();
4671
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]);
4681
    TCGv t0 = tcg_temp_new();
4682
    TCGv t1 = tcg_temp_new();
4683
    TCGv t2 = tcg_temp_new();
4684
    tcg_gen_andi_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x1F);
4685
    tcg_gen_movi_tl(t2, 0xFFFFFFFF);
4686
    tcg_gen_shl_tl(t2, t2, t0);
4687
    tcg_gen_rotl_tl(t0, cpu_gpr[rS(ctx->opcode)], t0);
4688
    gen_load_spr(t1, SPR_MQ);
4689
    gen_store_spr(SPR_MQ, t0);
4690
    tcg_gen_and_tl(t0, t0, t2);
4691
    tcg_gen_andc_tl(t1, t1, t2);
4692
    tcg_gen_or_tl(cpu_gpr[rA(ctx->opcode)], t0, t1);
4693
    tcg_temp_free(t0);
4694
    tcg_temp_free(t1);
4695
    tcg_temp_free(t2);
4672 4696
    if (unlikely(Rc(ctx->opcode) != 0))
4673
        gen_set_Rc0(ctx, cpu_T[0]);
4697
        gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
4674 4698
}
4675 4699

  
4676 4700
/* sliq - sliq. */
4677 4701
GEN_HANDLER(sliq, 0x1F, 0x18, 0x05, 0x00000000, PPC_POWER_BR)
4678 4702
{
4679
    tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]);
4680
    tcg_gen_movi_tl(cpu_T[1], SH(ctx->opcode));
4681
    gen_op_POWER_sle();
4682
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]);
4703
    int sh = SH(ctx->opcode);
4704
    TCGv t0 = tcg_temp_new();
4705
    TCGv t1 = tcg_temp_new();
4706
    tcg_gen_shli_tl(t0, cpu_gpr[rS(ctx->opcode)], sh);
4707
    tcg_gen_shri_tl(t1, cpu_gpr[rS(ctx->opcode)], 32 - sh);
4708
    tcg_gen_or_tl(t1, t0, t1);
4709
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], t0);
4710
    gen_store_spr(SPR_MQ, t1);
4711
    tcg_temp_free(t0);
4712
    tcg_temp_free(t1);
4683 4713
    if (unlikely(Rc(ctx->opcode) != 0))
4684
        gen_set_Rc0(ctx, cpu_T[0]);
4714
        gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
4685 4715
}
4686 4716

  
4687 4717
/* slliq - slliq. */
4688 4718
GEN_HANDLER(slliq, 0x1F, 0x18, 0x07, 0x00000000, PPC_POWER_BR)
4689 4719
{
4690
    tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]);
4691
    tcg_gen_movi_tl(cpu_T[1], SH(ctx->opcode));
4692
    gen_op_POWER_sleq();
4693
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]);
4720
    int sh = SH(ctx->opcode);
4721
    TCGv t0 = tcg_temp_new();
4722
    TCGv t1 = tcg_temp_new();
4723
    tcg_gen_rotli_tl(t0, cpu_gpr[rS(ctx->opcode)], sh);
4724
    gen_load_spr(t1, SPR_MQ);
4725
    gen_store_spr(SPR_MQ, t0);
4726
    tcg_gen_andi_tl(t0, t0,  (0xFFFFFFFFU << sh));
4727
    tcg_gen_andi_tl(t1, t1, ~(0xFFFFFFFFU << sh));
4728
    tcg_gen_or_tl(cpu_gpr[rA(ctx->opcode)], t0, t1);
4729
    tcg_temp_free(t0);
4730
    tcg_temp_free(t1);
4694 4731
    if (unlikely(Rc(ctx->opcode) != 0))
4695
        gen_set_Rc0(ctx, cpu_T[0]);
4732
        gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
4696 4733
}
4697 4734

  
4698 4735
/* sllq - sllq. */
4699 4736
GEN_HANDLER(sllq, 0x1F, 0x18, 0x06, 0x00000000, PPC_POWER_BR)
4700 4737
{
4701
    tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]);
4702
    tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rB(ctx->opcode)]);
4703
    gen_op_POWER_sllq();
4704
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]);
4738
    int l1 = gen_new_label();
4739
    int l2 = gen_new_label();
4740
    TCGv t0 = tcg_temp_local_new();
4741
    TCGv t1 = tcg_temp_local_new();
4742
    TCGv t2 = tcg_temp_local_new();
4743
    tcg_gen_andi_tl(t2, cpu_gpr[rB(ctx->opcode)], 0x1F);
4744
    tcg_gen_movi_tl(t1, 0xFFFFFFFF);
4745
    tcg_gen_shl_tl(t1, t1, t2);
4746
    tcg_gen_andi_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x20);
4747
    tcg_gen_brcondi_tl(TCG_COND_EQ, t0, 0, l1);
4748
    gen_load_spr(t0, SPR_MQ);
4749
    tcg_gen_and_tl(cpu_gpr[rA(ctx->opcode)], t0, t1);
4750
    tcg_gen_br(l2);
4751
    gen_set_label(l1);
4752
    tcg_gen_shl_tl(t0, cpu_gpr[rS(ctx->opcode)], t2);
4753
    gen_load_spr(t2, SPR_MQ);
4754
    tcg_gen_andc_tl(t1, t2, t1);
4755
    tcg_gen_or_tl(cpu_gpr[rA(ctx->opcode)], t0, t1);
4756
    gen_set_label(l2);
4757
    tcg_temp_free(t0);
4758
    tcg_temp_free(t1);
4759
    tcg_temp_free(t2);
4705 4760
    if (unlikely(Rc(ctx->opcode) != 0))
4706
        gen_set_Rc0(ctx, cpu_T[0]);
4761
        gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
4707 4762
}
4708 4763

  
4709 4764
/* slq - slq. */
4710 4765
GEN_HANDLER(slq, 0x1F, 0x18, 0x04, 0x00000000, PPC_POWER_BR)
4711 4766
{
4712
    tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]);
4713
    tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rB(ctx->opcode)]);
4714
    gen_op_POWER_slq();
4715
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]);
4767
    int l1 = gen_new_label();
4768
    TCGv t0 = tcg_temp_new();
4769
    TCGv t1 = tcg_temp_new();
4770
    tcg_gen_andi_tl(t1, cpu_gpr[rB(ctx->opcode)], 0x1F);
4771
    tcg_gen_shl_tl(t0, cpu_gpr[rS(ctx->opcode)], t1);
4772
    tcg_gen_subfi_tl(t1, 32, t1);
4773
    tcg_gen_shr_tl(t1, cpu_gpr[rS(ctx->opcode)], t1);
4774
    tcg_gen_or_tl(t1, t0, t1);
4775
    gen_store_spr(SPR_MQ, t1);
4776
    tcg_gen_andi_tl(t1, cpu_gpr[rB(ctx->opcode)], 0x20);
4777
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], t0);
4778
    tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
4779
    tcg_gen_movi_tl(cpu_gpr[rA(ctx->opcode)], 0);
4780
    gen_set_label(l1);
4781
    tcg_temp_free(t0);
4782
    tcg_temp_free(t1);
4716 4783
    if (unlikely(Rc(ctx->opcode) != 0))
4717
        gen_set_Rc0(ctx, cpu_T[0]);
4784
        gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
4718 4785
}
4719 4786

  
4720 4787
/* sraiq - sraiq. */
4721 4788
GEN_HANDLER(sraiq, 0x1F, 0x18, 0x1D, 0x00000000, PPC_POWER_BR)
4722 4789
{
4723
    tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]);
4724
    tcg_gen_movi_tl(cpu_T[1], SH(ctx->opcode));
4725
    gen_op_POWER_sraq();
4726
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]);
4790
    int sh = SH(ctx->opcode);
4791
    int l1 = gen_new_label();
4792
    TCGv t0 = tcg_temp_new();
4793
    TCGv t1 = tcg_temp_new();
4794
    tcg_gen_shri_tl(t0, cpu_gpr[rS(ctx->opcode)], sh);
4795
    tcg_gen_shli_tl(t1, cpu_gpr[rS(ctx->opcode)], 32 - sh);
4796
    tcg_gen_or_tl(t0, t0, t1);
4797
    gen_store_spr(SPR_MQ, t0);
4798
    tcg_gen_andi_tl(cpu_xer, cpu_xer, ~(1 << XER_CA));
4799
    tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
4800
    tcg_gen_brcondi_tl(TCG_COND_GE, cpu_gpr[rS(ctx->opcode)], 0, l1);
4801
    tcg_gen_ori_tl(cpu_xer, cpu_xer, (1 << XER_CA));
4802
    gen_set_label(l1);
4803
    tcg_gen_sari_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)], sh);
4804
    tcg_temp_free(t0);
4805
    tcg_temp_free(t1);
4727 4806
    if (unlikely(Rc(ctx->opcode) != 0))
4728
        gen_set_Rc0(ctx, cpu_T[0]);
4807
        gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
4729 4808
}
4730 4809

  
4731 4810
/* sraq - sraq. */
4732 4811
GEN_HANDLER(sraq, 0x1F, 0x18, 0x1C, 0x00000000, PPC_POWER_BR)
4733 4812
{
4734
    tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]);
4735
    tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rB(ctx->opcode)]);
4736
    gen_op_POWER_sraq();
4737
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]);
4813
    int l1 = gen_new_label();
4814
    int l2 = gen_new_label();
4815
    TCGv t0 = tcg_temp_new();
4816
    TCGv t1 = tcg_temp_local_new();
4817
    TCGv t2 = tcg_temp_local_new();
4818
    tcg_gen_andi_tl(t2, cpu_gpr[rB(ctx->opcode)], 0x1F);
4819
    tcg_gen_shr_tl(t0, cpu_gpr[rS(ctx->opcode)], t2);
4820
    tcg_gen_sar_tl(t1, cpu_gpr[rS(ctx->opcode)], t2);
4821
    tcg_gen_subfi_tl(t2, 32, t2);
4822
    tcg_gen_shl_tl(t2, cpu_gpr[rS(ctx->opcode)], t2);
4823
    tcg_gen_or_tl(t0, t0, t2);
4824
    gen_store_spr(SPR_MQ, t0);
4825
    tcg_gen_andi_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x20);
4826
    tcg_gen_brcondi_tl(TCG_COND_EQ, t2, 0, l1);
4827
    tcg_gen_mov_tl(t2, cpu_gpr[rS(ctx->opcode)]);
4828
    tcg_gen_sari_tl(t1, cpu_gpr[rS(ctx->opcode)], 31);
4829
    gen_set_label(l1);
4830
    tcg_temp_free(t0);
4831
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], t1);
4832
    tcg_gen_andi_tl(cpu_xer, cpu_xer, ~(1 << XER_CA));
4833
    tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l2);
4834
    tcg_gen_brcondi_tl(TCG_COND_EQ, t2, 0, l2);
4835
    tcg_gen_ori_tl(cpu_xer, cpu_xer, (1 << XER_CA));
4836
    gen_set_label(l2);
4837
    tcg_temp_free(t1);
4838
    tcg_temp_free(t2);
4738 4839
    if (unlikely(Rc(ctx->opcode) != 0))
4739
        gen_set_Rc0(ctx, cpu_T[0]);
4840
        gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
4740 4841
}
4741 4842

  
4742 4843
/* sre - sre. */
4743 4844
GEN_HANDLER(sre, 0x1F, 0x19, 0x14, 0x00000000, PPC_POWER_BR)
4744 4845
{
4745
    tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]);
4746
    tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rB(ctx->opcode)]);
4747
    gen_op_POWER_sre();
4748
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]);
4846
    TCGv t0 = tcg_temp_new();
4847
    TCGv t1 = tcg_temp_new();
4848
    tcg_gen_andi_tl(t1, cpu_gpr[rB(ctx->opcode)], 0x1F);
4849
    tcg_gen_shr_tl(t0, cpu_gpr[rS(ctx->opcode)], t1);
4850
    tcg_gen_subfi_tl(t1, 32, t1);
4851
    tcg_gen_shl_tl(t1, cpu_gpr[rS(ctx->opcode)], t1);
4852
    tcg_gen_or_tl(t1, t0, t1);
4853
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], t0);
4854
    gen_store_spr(SPR_MQ, t1);
4855
    tcg_temp_free(t0);
4856
    tcg_temp_free(t1);
4749 4857
    if (unlikely(Rc(ctx->opcode) != 0))
4750
        gen_set_Rc0(ctx, cpu_T[0]);
4858
        gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
4751 4859
}
4752 4860

  
4753 4861
/* srea - srea. */
4754 4862
GEN_HANDLER(srea, 0x1F, 0x19, 0x1C, 0x00000000, PPC_POWER_BR)
4755 4863
{
4756
    tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]);
4757
    tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rB(ctx->opcode)]);
4758
    gen_op_POWER_srea();
4759
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]);
4864
    TCGv t0 = tcg_temp_new();
4865
    TCGv t1 = tcg_temp_new();
4866
    tcg_gen_andi_tl(t1, cpu_gpr[rB(ctx->opcode)], 0x1F);
4867
    tcg_gen_rotr_tl(t0, cpu_gpr[rS(ctx->opcode)], t1);
4868
    gen_store_spr(SPR_MQ, t0);
4869
    tcg_gen_sar_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)], t1);
4870
    tcg_temp_free(t0);
4871
    tcg_temp_free(t1);
4760 4872
    if (unlikely(Rc(ctx->opcode) != 0))
4761
        gen_set_Rc0(ctx, cpu_T[0]);
4873
        gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
4762 4874
}
4763 4875

  
4764 4876
/* sreq */
4765 4877
GEN_HANDLER(sreq, 0x1F, 0x19, 0x16, 0x00000000, PPC_POWER_BR)
4766 4878
{
4767
    tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]);
4768
    tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rB(ctx->opcode)]);
4769
    gen_op_POWER_sreq();
4770
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]);
4879
    TCGv t0 = tcg_temp_new();
4880
    TCGv t1 = tcg_temp_new();
4881
    TCGv t2 = tcg_temp_new();
4882
    tcg_gen_andi_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x1F);
4883
    tcg_gen_movi_tl(t1, 0xFFFFFFFF);
4884
    tcg_gen_shr_tl(t1, t1, t0);
4885
    tcg_gen_rotr_tl(t0, cpu_gpr[rS(ctx->opcode)], t0);
4886
    gen_load_spr(t2, SPR_MQ);
4887
    gen_store_spr(SPR_MQ, t0);
4888
    tcg_gen_and_tl(t0, t0, t1);
4889
    tcg_gen_andc_tl(t2, t2, t1);
4890
    tcg_gen_or_tl(cpu_gpr[rA(ctx->opcode)], t0, t2);
4891
    tcg_temp_free(t0);
4892
    tcg_temp_free(t1);
4893
    tcg_temp_free(t2);
4771 4894
    if (unlikely(Rc(ctx->opcode) != 0))
4772
        gen_set_Rc0(ctx, cpu_T[0]);
4895
        gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
4773 4896
}
4774 4897

  
4775 4898
/* sriq */
4776 4899
GEN_HANDLER(sriq, 0x1F, 0x18, 0x15, 0x00000000, PPC_POWER_BR)
4777 4900
{
4778
    tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]);
4779
    tcg_gen_movi_tl(cpu_T[1], SH(ctx->opcode));
4780
    gen_op_POWER_srq();
4781
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]);
4901
    int sh = SH(ctx->opcode);
4902
    TCGv t0 = tcg_temp_new();
4903
    TCGv t1 = tcg_temp_new();
4904
    tcg_gen_shri_tl(t0, cpu_gpr[rS(ctx->opcode)], sh);
4905
    tcg_gen_shli_tl(t1, cpu_gpr[rS(ctx->opcode)], 32 - sh);
4906
    tcg_gen_or_tl(t1, t0, t1);
4907
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], t0);
4908
    gen_store_spr(SPR_MQ, t1);
4909
    tcg_temp_free(t0);
4910
    tcg_temp_free(t1);
4782 4911
    if (unlikely(Rc(ctx->opcode) != 0))
4783
        gen_set_Rc0(ctx, cpu_T[0]);
4912
        gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
4784 4913
}
4785 4914

  
4786 4915
/* srliq */
4787 4916
GEN_HANDLER(srliq, 0x1F, 0x18, 0x17, 0x00000000, PPC_POWER_BR)
4788 4917
{
4789
    tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]);
4790
    tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rB(ctx->opcode)]);
4791
    tcg_gen_movi_tl(cpu_T[1], SH(ctx->opcode));
4792
    gen_op_POWER_srlq();
4793
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]);
4918
    int sh = SH(ctx->opcode);
4919
    TCGv t0 = tcg_temp_new();
4920
    TCGv t1 = tcg_temp_new();
4921
    tcg_gen_rotri_tl(t0, cpu_gpr[rS(ctx->opcode)], sh);
4922
    gen_load_spr(t1, SPR_MQ);
4923
    gen_store_spr(SPR_MQ, t0);
4924
    tcg_gen_andi_tl(t0, t0,  (0xFFFFFFFFU >> sh));
4925
    tcg_gen_andi_tl(t1, t1, ~(0xFFFFFFFFU >> sh));
4926
    tcg_gen_or_tl(cpu_gpr[rA(ctx->opcode)], t0, t1);
4927
    tcg_temp_free(t0);
4928
    tcg_temp_free(t1);
4794 4929
    if (unlikely(Rc(ctx->opcode) != 0))
4795
        gen_set_Rc0(ctx, cpu_T[0]);
4930
        gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
4796 4931
}
4797 4932

  
4798 4933
/* srlq */
4799 4934
GEN_HANDLER(srlq, 0x1F, 0x18, 0x16, 0x00000000, PPC_POWER_BR)
4800 4935
{
4801
    tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]);
4802
    tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rB(ctx->opcode)]);
4803
    gen_op_POWER_srlq();
4804
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]);
4936
    int l1 = gen_new_label();
4937
    int l2 = gen_new_label();
4938
    TCGv t0 = tcg_temp_local_new();
4939
    TCGv t1 = tcg_temp_local_new();
4940
    TCGv t2 = tcg_temp_local_new();
4941
    tcg_gen_andi_tl(t2, cpu_gpr[rB(ctx->opcode)], 0x1F);
4942
    tcg_gen_movi_tl(t1, 0xFFFFFFFF);
4943
    tcg_gen_shr_tl(t2, t1, t2);
4944
    tcg_gen_andi_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x20);
4945
    tcg_gen_brcondi_tl(TCG_COND_EQ, t0, 0, l1);
4946
    gen_load_spr(t0, SPR_MQ);
4947
    tcg_gen_and_tl(cpu_gpr[rA(ctx->opcode)], t0, t2);
4948
    tcg_gen_br(l2);
4949
    gen_set_label(l1);
4950
    tcg_gen_shr_tl(t0, cpu_gpr[rS(ctx->opcode)], t2);
4951
    tcg_gen_and_tl(t0, t0, t2);
4952
    gen_load_spr(t1, SPR_MQ);
4953
    tcg_gen_andc_tl(t1, t1, t2);
4954
    tcg_gen_or_tl(cpu_gpr[rA(ctx->opcode)], t0, t1);
4955
    gen_set_label(l2);
4956
    tcg_temp_free(t0);
4957
    tcg_temp_free(t1);
4958
    tcg_temp_free(t2);
4805 4959
    if (unlikely(Rc(ctx->opcode) != 0))
4806
        gen_set_Rc0(ctx, cpu_T[0]);
4960
        gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
4807 4961
}
4808 4962

  
4809 4963
/* srq */
4810 4964
GEN_HANDLER(srq, 0x1F, 0x18, 0x14, 0x00000000, PPC_POWER_BR)
4811 4965
{
4812
    tcg_gen_mov_tl(cpu_T[0], cpu_gpr[rS(ctx->opcode)]);
4813
    tcg_gen_mov_tl(cpu_T[1], cpu_gpr[rB(ctx->opcode)]);
4814
    gen_op_POWER_srq();
4815
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], cpu_T[0]);
4966
    int l1 = gen_new_label();
4967
    TCGv t0 = tcg_temp_new();
4968
    TCGv t1 = tcg_temp_new();
4969
    tcg_gen_andi_tl(t1, cpu_gpr[rB(ctx->opcode)], 0x1F);
4970
    tcg_gen_shr_tl(t0, cpu_gpr[rS(ctx->opcode)], t1);
4971
    tcg_gen_subfi_tl(t1, 32, t1);
4972
    tcg_gen_shl_tl(t1, cpu_gpr[rS(ctx->opcode)], t1);
4973
    tcg_gen_or_tl(t1, t0, t1);
4974
    gen_store_spr(SPR_MQ, t1);
4975
    tcg_gen_andi_tl(t1, cpu_gpr[rB(ctx->opcode)], 0x20);
4976
    tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], t0);
4977
    tcg_gen_brcondi_tl(TCG_COND_EQ, t0, 0, l1);
4978
    tcg_gen_movi_tl(cpu_gpr[rA(ctx->opcode)], 0);
4979
    gen_set_label(l1);
4980
    tcg_temp_free(t0);
4981
    tcg_temp_free(t1);
4816 4982
    if (unlikely(Rc(ctx->opcode) != 0))
4817
        gen_set_Rc0(ctx, cpu_T[0]);
4983
        gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]);
4818 4984
}
4819 4985

  
4820 4986
/* PowerPC 602 specific instructions */

Also available in: Unified diff