Commit 81b5b816e23450c4659411f77d9c7b54681e07dc
1 parent
741a7444
Use andc, orc, nor and nand
Also fix which argument gets negated in fandnot[12] and fornot[12] git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5662 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
36 additions
and
52 deletions
target-sparc/translate.c
... | ... | @@ -3079,14 +3079,12 @@ static void disas_sparc_insn(DisasContext * dc) |
3079 | 3079 | tcg_gen_sub_tl(cpu_dst, cpu_src1, cpu_src2); |
3080 | 3080 | break; |
3081 | 3081 | case 0x5: |
3082 | - tcg_gen_xori_tl(cpu_tmp0, cpu_src2, -1); | |
3083 | - tcg_gen_and_tl(cpu_dst, cpu_src1, cpu_tmp0); | |
3082 | + tcg_gen_andc_tl(cpu_dst, cpu_src1, cpu_src2); | |
3084 | 3083 | if (xop & 0x10) |
3085 | 3084 | gen_op_logic_cc(cpu_dst); |
3086 | 3085 | break; |
3087 | 3086 | case 0x6: |
3088 | - tcg_gen_xori_tl(cpu_tmp0, cpu_src2, -1); | |
3089 | - tcg_gen_or_tl(cpu_dst, cpu_src1, cpu_tmp0); | |
3087 | + tcg_gen_orc_tl(cpu_dst, cpu_src1, cpu_src2); | |
3090 | 3088 | if (xop & 0x10) |
3091 | 3089 | gen_op_logic_cc(cpu_dst); |
3092 | 3090 | break; |
... | ... | @@ -3907,31 +3905,26 @@ static void disas_sparc_insn(DisasContext * dc) |
3907 | 3905 | break; |
3908 | 3906 | case 0x062: /* VIS I fnor */ |
3909 | 3907 | CHECK_FPU_FEATURE(dc, VIS1); |
3910 | - tcg_gen_or_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1)], | |
3911 | - cpu_fpr[DFPREG(rs2)]); | |
3912 | - tcg_gen_xori_i32(cpu_fpr[DFPREG(rd)], cpu_tmp32, -1); | |
3913 | - tcg_gen_or_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1) + 1], | |
3914 | - cpu_fpr[DFPREG(rs2) + 1]); | |
3915 | - tcg_gen_xori_i32(cpu_fpr[DFPREG(rd) + 1], cpu_tmp32, -1); | |
3908 | + tcg_gen_nor_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1)], | |
3909 | + cpu_fpr[DFPREG(rs2)]); | |
3910 | + tcg_gen_nor_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1) + 1], | |
3911 | + cpu_fpr[DFPREG(rs2) + 1]); | |
3916 | 3912 | break; |
3917 | 3913 | case 0x063: /* VIS I fnors */ |
3918 | 3914 | CHECK_FPU_FEATURE(dc, VIS1); |
3919 | - tcg_gen_or_i32(cpu_tmp32, cpu_fpr[rs1], cpu_fpr[rs2]); | |
3920 | - tcg_gen_xori_i32(cpu_fpr[rd], cpu_tmp32, -1); | |
3915 | + tcg_gen_nor_i32(cpu_tmp32, cpu_fpr[rs1], cpu_fpr[rs2]); | |
3921 | 3916 | break; |
3922 | 3917 | case 0x064: /* VIS I fandnot2 */ |
3923 | 3918 | CHECK_FPU_FEATURE(dc, VIS1); |
3924 | - tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1)], -1); | |
3925 | - tcg_gen_and_i32(cpu_fpr[DFPREG(rd)], cpu_tmp32, | |
3926 | - cpu_fpr[DFPREG(rs2)]); | |
3927 | - tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1) + 1], -1); | |
3928 | - tcg_gen_and_i32(cpu_fpr[DFPREG(rd) + 1], cpu_tmp32, | |
3929 | - cpu_fpr[DFPREG(rs2) + 1]); | |
3919 | + tcg_gen_andc_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs1)], | |
3920 | + cpu_fpr[DFPREG(rs2)]); | |
3921 | + tcg_gen_andc_i32(cpu_fpr[DFPREG(rd) + 1], | |
3922 | + cpu_fpr[DFPREG(rs1) + 1], | |
3923 | + cpu_fpr[DFPREG(rs2) + 1]); | |
3930 | 3924 | break; |
3931 | 3925 | case 0x065: /* VIS I fandnot2s */ |
3932 | 3926 | CHECK_FPU_FEATURE(dc, VIS1); |
3933 | - tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[rs1], -1); | |
3934 | - tcg_gen_and_i32(cpu_fpr[rd], cpu_tmp32, cpu_fpr[rs2]); | |
3927 | + tcg_gen_andc_i32(cpu_fpr[rd], cpu_fpr[rs1], cpu_fpr[rs2]); | |
3935 | 3928 | break; |
3936 | 3929 | case 0x066: /* VIS I fnot2 */ |
3937 | 3930 | CHECK_FPU_FEATURE(dc, VIS1); |
... | ... | @@ -3946,17 +3939,15 @@ static void disas_sparc_insn(DisasContext * dc) |
3946 | 3939 | break; |
3947 | 3940 | case 0x068: /* VIS I fandnot1 */ |
3948 | 3941 | CHECK_FPU_FEATURE(dc, VIS1); |
3949 | - tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs2)], -1); | |
3950 | - tcg_gen_and_i32(cpu_fpr[DFPREG(rd)], cpu_tmp32, | |
3951 | - cpu_fpr[DFPREG(rs1)]); | |
3952 | - tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs2)], -1); | |
3953 | - tcg_gen_and_i32(cpu_fpr[DFPREG(rd) + 1], cpu_tmp32, | |
3954 | - cpu_fpr[DFPREG(rs1) + 1]); | |
3942 | + tcg_gen_andc_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs2)], | |
3943 | + cpu_fpr[DFPREG(rs1)]); | |
3944 | + tcg_gen_andc_i32(cpu_fpr[DFPREG(rd) + 1], | |
3945 | + cpu_fpr[DFPREG(rs2) + 1], | |
3946 | + cpu_fpr[DFPREG(rs1) + 1]); | |
3955 | 3947 | break; |
3956 | 3948 | case 0x069: /* VIS I fandnot1s */ |
3957 | 3949 | CHECK_FPU_FEATURE(dc, VIS1); |
3958 | - tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[rs2], -1); | |
3959 | - tcg_gen_and_i32(cpu_fpr[rd], cpu_tmp32, cpu_fpr[rs1]); | |
3950 | + tcg_gen_andc_i32(cpu_fpr[rd], cpu_fpr[rs2], cpu_fpr[rs1]); | |
3960 | 3951 | break; |
3961 | 3952 | case 0x06a: /* VIS I fnot1 */ |
3962 | 3953 | CHECK_FPU_FEATURE(dc, VIS1); |
... | ... | @@ -3983,17 +3974,14 @@ static void disas_sparc_insn(DisasContext * dc) |
3983 | 3974 | break; |
3984 | 3975 | case 0x06e: /* VIS I fnand */ |
3985 | 3976 | CHECK_FPU_FEATURE(dc, VIS1); |
3986 | - tcg_gen_and_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1)], | |
3987 | - cpu_fpr[DFPREG(rs2)]); | |
3988 | - tcg_gen_xori_i32(cpu_fpr[DFPREG(rd)], cpu_tmp32, -1); | |
3989 | - tcg_gen_and_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1) + 1], | |
3990 | - cpu_fpr[DFPREG(rs2) + 1]); | |
3991 | - tcg_gen_xori_i32(cpu_fpr[DFPREG(rd) + 1], cpu_tmp32, -1); | |
3977 | + tcg_gen_nand_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1)], | |
3978 | + cpu_fpr[DFPREG(rs2)]); | |
3979 | + tcg_gen_nand_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1) + 1], | |
3980 | + cpu_fpr[DFPREG(rs2) + 1]); | |
3992 | 3981 | break; |
3993 | 3982 | case 0x06f: /* VIS I fnands */ |
3994 | 3983 | CHECK_FPU_FEATURE(dc, VIS1); |
3995 | - tcg_gen_and_i32(cpu_tmp32, cpu_fpr[rs1], cpu_fpr[rs2]); | |
3996 | - tcg_gen_xori_i32(cpu_fpr[rd], cpu_tmp32, -1); | |
3984 | + tcg_gen_nand_i32(cpu_tmp32, cpu_fpr[rs1], cpu_fpr[rs2]); | |
3997 | 3985 | break; |
3998 | 3986 | case 0x070: /* VIS I fand */ |
3999 | 3987 | CHECK_FPU_FEATURE(dc, VIS1); |
... | ... | @@ -4033,17 +4021,15 @@ static void disas_sparc_insn(DisasContext * dc) |
4033 | 4021 | break; |
4034 | 4022 | case 0x076: /* VIS I fornot2 */ |
4035 | 4023 | CHECK_FPU_FEATURE(dc, VIS1); |
4036 | - tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1)], -1); | |
4037 | - tcg_gen_or_i32(cpu_fpr[DFPREG(rd)], cpu_tmp32, | |
4038 | - cpu_fpr[DFPREG(rs2)]); | |
4039 | - tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1) + 1], -1); | |
4040 | - tcg_gen_or_i32(cpu_fpr[DFPREG(rd) + 1], cpu_tmp32, | |
4041 | - cpu_fpr[DFPREG(rs2) + 1]); | |
4024 | + tcg_gen_orc_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs1)], | |
4025 | + cpu_fpr[DFPREG(rs2)]); | |
4026 | + tcg_gen_orc_i32(cpu_fpr[DFPREG(rd) + 1], | |
4027 | + cpu_fpr[DFPREG(rs1) + 1], | |
4028 | + cpu_fpr[DFPREG(rs2) + 1]); | |
4042 | 4029 | break; |
4043 | 4030 | case 0x077: /* VIS I fornot2s */ |
4044 | 4031 | CHECK_FPU_FEATURE(dc, VIS1); |
4045 | - tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[rs1], -1); | |
4046 | - tcg_gen_or_i32(cpu_fpr[rd], cpu_tmp32, cpu_fpr[rs2]); | |
4032 | + tcg_gen_orc_i32(cpu_fpr[rd], cpu_fpr[rs1], cpu_fpr[rs2]); | |
4047 | 4033 | break; |
4048 | 4034 | case 0x078: /* VIS I fsrc2 */ |
4049 | 4035 | CHECK_FPU_FEATURE(dc, VIS1); |
... | ... | @@ -4056,17 +4042,15 @@ static void disas_sparc_insn(DisasContext * dc) |
4056 | 4042 | break; |
4057 | 4043 | case 0x07a: /* VIS I fornot1 */ |
4058 | 4044 | CHECK_FPU_FEATURE(dc, VIS1); |
4059 | - tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs2)], -1); | |
4060 | - tcg_gen_or_i32(cpu_fpr[DFPREG(rd)], cpu_tmp32, | |
4061 | - cpu_fpr[DFPREG(rs1)]); | |
4062 | - tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs2) + 1], -1); | |
4063 | - tcg_gen_or_i32(cpu_fpr[DFPREG(rd) + 1], cpu_tmp32, | |
4064 | - cpu_fpr[DFPREG(rs1) + 1]); | |
4045 | + tcg_gen_orc_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs2)], | |
4046 | + cpu_fpr[DFPREG(rs1)]); | |
4047 | + tcg_gen_orc_i32(cpu_fpr[DFPREG(rd) + 1], | |
4048 | + cpu_fpr[DFPREG(rs2) + 1], | |
4049 | + cpu_fpr[DFPREG(rs1) + 1]); | |
4065 | 4050 | break; |
4066 | 4051 | case 0x07b: /* VIS I fornot1s */ |
4067 | 4052 | CHECK_FPU_FEATURE(dc, VIS1); |
4068 | - tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[rs2], -1); | |
4069 | - tcg_gen_or_i32(cpu_fpr[rd], cpu_tmp32, cpu_fpr[rs1]); | |
4053 | + tcg_gen_orc_i32(cpu_fpr[rd], cpu_fpr[rs2], cpu_fpr[rs1]); | |
4070 | 4054 | break; |
4071 | 4055 | case 0x07c: /* VIS I for */ |
4072 | 4056 | CHECK_FPU_FEATURE(dc, VIS1); | ... | ... |