Commit e2ea21b39660eb6938cb26a36248e23361d9534d

Authored by blueswir1
1 parent 1d01299d

Convert basic 64 bit VIS ops to TCG

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5191 c046a42c-6fe2-441c-8c8c-71466251a162
target-sparc/TODO
@@ -39,8 +39,6 @@ Sparc64 CPUs: @@ -39,8 +39,6 @@ Sparc64 CPUs:
39 - Full hypervisor support 39 - Full hypervisor support
40 - SMP/CMT 40 - SMP/CMT
41 - Sun4v CPUs 41 - Sun4v CPUs
42 -- Optimizations/improvements:  
43 - - Use TCG logic ops for VIS when possible  
44 42
45 Sun4: 43 Sun4:
46 - To be added 44 - To be added
target-sparc/helper.h
@@ -139,15 +139,6 @@ F_HELPER_0_0(dtox); @@ -139,15 +139,6 @@ F_HELPER_0_0(dtox);
139 F_HELPER_0_0(qtox); 139 F_HELPER_0_0(qtox);
140 F_HELPER_0_0(aligndata); 140 F_HELPER_0_0(aligndata);
141 141
142 -F_HELPER_0_0(not);  
143 -F_HELPER_0_0(nor);  
144 -F_HELPER_0_0(or);  
145 -F_HELPER_0_0(xor);  
146 -F_HELPER_0_0(and);  
147 -F_HELPER_0_0(ornot);  
148 -F_HELPER_0_0(andnot);  
149 -F_HELPER_0_0(nand);  
150 -F_HELPER_0_0(xnor);  
151 F_HELPER_0_0(pmerge); 142 F_HELPER_0_0(pmerge);
152 F_HELPER_0_0(mul8x16); 143 F_HELPER_0_0(mul8x16);
153 F_HELPER_0_0(mul8x16al); 144 F_HELPER_0_0(mul8x16al);
target-sparc/op_helper.c
@@ -246,51 +246,6 @@ void helper_faligndata(void) @@ -246,51 +246,6 @@ void helper_faligndata(void)
246 *((uint64_t *)&DT0) = tmp; 246 *((uint64_t *)&DT0) = tmp;
247 } 247 }
248 248
249 -void helper_fnot(void)  
250 -{  
251 - *(uint64_t *)&DT0 = ~*(uint64_t *)&DT1;  
252 -}  
253 -  
254 -void helper_fnor(void)  
255 -{  
256 - *(uint64_t *)&DT0 = ~(*(uint64_t *)&DT0 | *(uint64_t *)&DT1);  
257 -}  
258 -  
259 -void helper_for(void)  
260 -{  
261 - *(uint64_t *)&DT0 |= *(uint64_t *)&DT1;  
262 -}  
263 -  
264 -void helper_fxor(void)  
265 -{  
266 - *(uint64_t *)&DT0 ^= *(uint64_t *)&DT1;  
267 -}  
268 -  
269 -void helper_fand(void)  
270 -{  
271 - *(uint64_t *)&DT0 &= *(uint64_t *)&DT1;  
272 -}  
273 -  
274 -void helper_fornot(void)  
275 -{  
276 - *(uint64_t *)&DT0 = *(uint64_t *)&DT0 | ~*(uint64_t *)&DT1;  
277 -}  
278 -  
279 -void helper_fandnot(void)  
280 -{  
281 - *(uint64_t *)&DT0 = *(uint64_t *)&DT0 & ~*(uint64_t *)&DT1;  
282 -}  
283 -  
284 -void helper_fnand(void)  
285 -{  
286 - *(uint64_t *)&DT0 = ~(*(uint64_t *)&DT0 & *(uint64_t *)&DT1);  
287 -}  
288 -  
289 -void helper_fxnor(void)  
290 -{  
291 - *(uint64_t *)&DT0 ^= ~*(uint64_t *)&DT1;  
292 -}  
293 -  
294 #ifdef WORDS_BIGENDIAN 249 #ifdef WORDS_BIGENDIAN
295 #define VIS_B64(n) b[7 - (n)] 250 #define VIS_B64(n) b[7 - (n)]
296 #define VIS_W64(n) w[3 - (n)] 251 #define VIS_W64(n) w[3 - (n)]
target-sparc/translate.c
@@ -3886,10 +3886,12 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3886,10 +3886,12 @@ static void disas_sparc_insn(DisasContext * dc)
3886 break; 3886 break;
3887 case 0x062: /* VIS I fnor */ 3887 case 0x062: /* VIS I fnor */
3888 CHECK_FPU_FEATURE(dc, VIS1); 3888 CHECK_FPU_FEATURE(dc, VIS1);
3889 - gen_op_load_fpr_DT0(DFPREG(rs1));  
3890 - gen_op_load_fpr_DT1(DFPREG(rs2));  
3891 - tcg_gen_helper_0_0(helper_fnor);  
3892 - gen_op_store_DT0_fpr(DFPREG(rd)); 3889 + tcg_gen_or_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1)],
  3890 + cpu_fpr[DFPREG(rs2)]);
  3891 + tcg_gen_xori_i32(cpu_fpr[DFPREG(rd)], cpu_tmp32, -1);
  3892 + tcg_gen_or_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1) + 1],
  3893 + cpu_fpr[DFPREG(rs2) + 1]);
  3894 + tcg_gen_xori_i32(cpu_fpr[DFPREG(rd) + 1], cpu_tmp32, -1);
3893 break; 3895 break;
3894 case 0x063: /* VIS I fnors */ 3896 case 0x063: /* VIS I fnors */
3895 CHECK_FPU_FEATURE(dc, VIS1); 3897 CHECK_FPU_FEATURE(dc, VIS1);
@@ -3898,10 +3900,12 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3898,10 +3900,12 @@ static void disas_sparc_insn(DisasContext * dc)
3898 break; 3900 break;
3899 case 0x064: /* VIS I fandnot2 */ 3901 case 0x064: /* VIS I fandnot2 */
3900 CHECK_FPU_FEATURE(dc, VIS1); 3902 CHECK_FPU_FEATURE(dc, VIS1);
3901 - gen_op_load_fpr_DT1(DFPREG(rs1));  
3902 - gen_op_load_fpr_DT0(DFPREG(rs2));  
3903 - tcg_gen_helper_0_0(helper_fandnot);  
3904 - gen_op_store_DT0_fpr(DFPREG(rd)); 3903 + tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1)], -1);
  3904 + tcg_gen_and_i32(cpu_fpr[DFPREG(rd)], cpu_tmp32,
  3905 + cpu_fpr[DFPREG(rs2)]);
  3906 + tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1) + 1], -1);
  3907 + tcg_gen_and_i32(cpu_fpr[DFPREG(rd) + 1], cpu_tmp32,
  3908 + cpu_fpr[DFPREG(rs2) + 1]);
3905 break; 3909 break;
3906 case 0x065: /* VIS I fandnot2s */ 3910 case 0x065: /* VIS I fandnot2s */
3907 CHECK_FPU_FEATURE(dc, VIS1); 3911 CHECK_FPU_FEATURE(dc, VIS1);
@@ -3910,9 +3914,10 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3910,9 +3914,10 @@ static void disas_sparc_insn(DisasContext * dc)
3910 break; 3914 break;
3911 case 0x066: /* VIS I fnot2 */ 3915 case 0x066: /* VIS I fnot2 */
3912 CHECK_FPU_FEATURE(dc, VIS1); 3916 CHECK_FPU_FEATURE(dc, VIS1);
3913 - gen_op_load_fpr_DT1(DFPREG(rs2));  
3914 - tcg_gen_helper_0_0(helper_fnot);  
3915 - gen_op_store_DT0_fpr(DFPREG(rd)); 3917 + tcg_gen_xori_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs2)],
  3918 + -1);
  3919 + tcg_gen_xori_i32(cpu_fpr[DFPREG(rd) + 1],
  3920 + cpu_fpr[DFPREG(rs2) + 1], -1);
3916 break; 3921 break;
3917 case 0x067: /* VIS I fnot2s */ 3922 case 0x067: /* VIS I fnot2s */
3918 CHECK_FPU_FEATURE(dc, VIS1); 3923 CHECK_FPU_FEATURE(dc, VIS1);
@@ -3920,10 +3925,12 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3920,10 +3925,12 @@ static void disas_sparc_insn(DisasContext * dc)
3920 break; 3925 break;
3921 case 0x068: /* VIS I fandnot1 */ 3926 case 0x068: /* VIS I fandnot1 */
3922 CHECK_FPU_FEATURE(dc, VIS1); 3927 CHECK_FPU_FEATURE(dc, VIS1);
3923 - gen_op_load_fpr_DT0(DFPREG(rs1));  
3924 - gen_op_load_fpr_DT1(DFPREG(rs2));  
3925 - tcg_gen_helper_0_0(helper_fandnot);  
3926 - gen_op_store_DT0_fpr(DFPREG(rd)); 3928 + tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs2)], -1);
  3929 + tcg_gen_and_i32(cpu_fpr[DFPREG(rd)], cpu_tmp32,
  3930 + cpu_fpr[DFPREG(rs1)]);
  3931 + tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs2)], -1);
  3932 + tcg_gen_and_i32(cpu_fpr[DFPREG(rd) + 1], cpu_tmp32,
  3933 + cpu_fpr[DFPREG(rs1) + 1]);
3927 break; 3934 break;
3928 case 0x069: /* VIS I fandnot1s */ 3935 case 0x069: /* VIS I fandnot1s */
3929 CHECK_FPU_FEATURE(dc, VIS1); 3936 CHECK_FPU_FEATURE(dc, VIS1);
@@ -3932,9 +3939,10 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3932,9 +3939,10 @@ static void disas_sparc_insn(DisasContext * dc)
3932 break; 3939 break;
3933 case 0x06a: /* VIS I fnot1 */ 3940 case 0x06a: /* VIS I fnot1 */
3934 CHECK_FPU_FEATURE(dc, VIS1); 3941 CHECK_FPU_FEATURE(dc, VIS1);
3935 - gen_op_load_fpr_DT1(DFPREG(rs1));  
3936 - tcg_gen_helper_0_0(helper_fnot);  
3937 - gen_op_store_DT0_fpr(DFPREG(rd)); 3942 + tcg_gen_xori_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs1)],
  3943 + -1);
  3944 + tcg_gen_xori_i32(cpu_fpr[DFPREG(rd) + 1],
  3945 + cpu_fpr[DFPREG(rs1) + 1], -1);
3938 break; 3946 break;
3939 case 0x06b: /* VIS I fnot1s */ 3947 case 0x06b: /* VIS I fnot1s */
3940 CHECK_FPU_FEATURE(dc, VIS1); 3948 CHECK_FPU_FEATURE(dc, VIS1);
@@ -3942,10 +3950,11 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3942,10 +3950,11 @@ static void disas_sparc_insn(DisasContext * dc)
3942 break; 3950 break;
3943 case 0x06c: /* VIS I fxor */ 3951 case 0x06c: /* VIS I fxor */
3944 CHECK_FPU_FEATURE(dc, VIS1); 3952 CHECK_FPU_FEATURE(dc, VIS1);
3945 - gen_op_load_fpr_DT0(DFPREG(rs1));  
3946 - gen_op_load_fpr_DT1(DFPREG(rs2));  
3947 - tcg_gen_helper_0_0(helper_fxor);  
3948 - gen_op_store_DT0_fpr(DFPREG(rd)); 3953 + tcg_gen_xor_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs1)],
  3954 + cpu_fpr[DFPREG(rs2)]);
  3955 + tcg_gen_xor_i32(cpu_fpr[DFPREG(rd) + 1],
  3956 + cpu_fpr[DFPREG(rs1) + 1],
  3957 + cpu_fpr[DFPREG(rs2) + 1]);
3949 break; 3958 break;
3950 case 0x06d: /* VIS I fxors */ 3959 case 0x06d: /* VIS I fxors */
3951 CHECK_FPU_FEATURE(dc, VIS1); 3960 CHECK_FPU_FEATURE(dc, VIS1);
@@ -3953,10 +3962,12 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3953,10 +3962,12 @@ static void disas_sparc_insn(DisasContext * dc)
3953 break; 3962 break;
3954 case 0x06e: /* VIS I fnand */ 3963 case 0x06e: /* VIS I fnand */
3955 CHECK_FPU_FEATURE(dc, VIS1); 3964 CHECK_FPU_FEATURE(dc, VIS1);
3956 - gen_op_load_fpr_DT0(DFPREG(rs1));  
3957 - gen_op_load_fpr_DT1(DFPREG(rs2));  
3958 - tcg_gen_helper_0_0(helper_fnand);  
3959 - gen_op_store_DT0_fpr(DFPREG(rd)); 3965 + tcg_gen_and_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1)],
  3966 + cpu_fpr[DFPREG(rs2)]);
  3967 + tcg_gen_xori_i32(cpu_fpr[DFPREG(rd)], cpu_tmp32, -1);
  3968 + tcg_gen_and_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1) + 1],
  3969 + cpu_fpr[DFPREG(rs2) + 1]);
  3970 + tcg_gen_xori_i32(cpu_fpr[DFPREG(rd) + 1], cpu_tmp32, -1);
3960 break; 3971 break;
3961 case 0x06f: /* VIS I fnands */ 3972 case 0x06f: /* VIS I fnands */
3962 CHECK_FPU_FEATURE(dc, VIS1); 3973 CHECK_FPU_FEATURE(dc, VIS1);
@@ -3965,10 +3976,11 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3965,10 +3976,11 @@ static void disas_sparc_insn(DisasContext * dc)
3965 break; 3976 break;
3966 case 0x070: /* VIS I fand */ 3977 case 0x070: /* VIS I fand */
3967 CHECK_FPU_FEATURE(dc, VIS1); 3978 CHECK_FPU_FEATURE(dc, VIS1);
3968 - gen_op_load_fpr_DT0(DFPREG(rs1));  
3969 - gen_op_load_fpr_DT1(DFPREG(rs2));  
3970 - tcg_gen_helper_0_0(helper_fand);  
3971 - gen_op_store_DT0_fpr(DFPREG(rd)); 3979 + tcg_gen_and_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs1)],
  3980 + cpu_fpr[DFPREG(rs2)]);
  3981 + tcg_gen_and_i32(cpu_fpr[DFPREG(rd) + 1],
  3982 + cpu_fpr[DFPREG(rs1) + 1],
  3983 + cpu_fpr[DFPREG(rs2) + 1]);
3972 break; 3984 break;
3973 case 0x071: /* VIS I fands */ 3985 case 0x071: /* VIS I fands */
3974 CHECK_FPU_FEATURE(dc, VIS1); 3986 CHECK_FPU_FEATURE(dc, VIS1);
@@ -3976,10 +3988,12 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3976,10 +3988,12 @@ static void disas_sparc_insn(DisasContext * dc)
3976 break; 3988 break;
3977 case 0x072: /* VIS I fxnor */ 3989 case 0x072: /* VIS I fxnor */
3978 CHECK_FPU_FEATURE(dc, VIS1); 3990 CHECK_FPU_FEATURE(dc, VIS1);
3979 - gen_op_load_fpr_DT0(DFPREG(rs1));  
3980 - gen_op_load_fpr_DT1(DFPREG(rs2));  
3981 - tcg_gen_helper_0_0(helper_fxnor);  
3982 - gen_op_store_DT0_fpr(DFPREG(rd)); 3991 + tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs2)], -1);
  3992 + tcg_gen_xor_i32(cpu_fpr[DFPREG(rd)], cpu_tmp32,
  3993 + cpu_fpr[DFPREG(rs1)]);
  3994 + tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs2) + 1], -1);
  3995 + tcg_gen_xor_i32(cpu_fpr[DFPREG(rd) + 1], cpu_tmp32,
  3996 + cpu_fpr[DFPREG(rs1) + 1]);
3983 break; 3997 break;
3984 case 0x073: /* VIS I fxnors */ 3998 case 0x073: /* VIS I fxnors */
3985 CHECK_FPU_FEATURE(dc, VIS1); 3999 CHECK_FPU_FEATURE(dc, VIS1);
@@ -3998,10 +4012,12 @@ static void disas_sparc_insn(DisasContext * dc) @@ -3998,10 +4012,12 @@ static void disas_sparc_insn(DisasContext * dc)
3998 break; 4012 break;
3999 case 0x076: /* VIS I fornot2 */ 4013 case 0x076: /* VIS I fornot2 */
4000 CHECK_FPU_FEATURE(dc, VIS1); 4014 CHECK_FPU_FEATURE(dc, VIS1);
4001 - gen_op_load_fpr_DT1(DFPREG(rs1));  
4002 - gen_op_load_fpr_DT0(DFPREG(rs2));  
4003 - tcg_gen_helper_0_0(helper_fornot);  
4004 - gen_op_store_DT0_fpr(DFPREG(rd)); 4015 + tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1)], -1);
  4016 + tcg_gen_or_i32(cpu_fpr[DFPREG(rd)], cpu_tmp32,
  4017 + cpu_fpr[DFPREG(rs2)]);
  4018 + tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1) + 1], -1);
  4019 + tcg_gen_or_i32(cpu_fpr[DFPREG(rd) + 1], cpu_tmp32,
  4020 + cpu_fpr[DFPREG(rs2) + 1]);
4005 break; 4021 break;
4006 case 0x077: /* VIS I fornot2s */ 4022 case 0x077: /* VIS I fornot2s */
4007 CHECK_FPU_FEATURE(dc, VIS1); 4023 CHECK_FPU_FEATURE(dc, VIS1);
@@ -4019,10 +4035,12 @@ static void disas_sparc_insn(DisasContext * dc) @@ -4019,10 +4035,12 @@ static void disas_sparc_insn(DisasContext * dc)
4019 break; 4035 break;
4020 case 0x07a: /* VIS I fornot1 */ 4036 case 0x07a: /* VIS I fornot1 */
4021 CHECK_FPU_FEATURE(dc, VIS1); 4037 CHECK_FPU_FEATURE(dc, VIS1);
4022 - gen_op_load_fpr_DT0(DFPREG(rs1));  
4023 - gen_op_load_fpr_DT1(DFPREG(rs2));  
4024 - tcg_gen_helper_0_0(helper_fornot);  
4025 - gen_op_store_DT0_fpr(DFPREG(rd)); 4038 + tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs2)], -1);
  4039 + tcg_gen_or_i32(cpu_fpr[DFPREG(rd)], cpu_tmp32,
  4040 + cpu_fpr[DFPREG(rs1)]);
  4041 + tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs2) + 1], -1);
  4042 + tcg_gen_or_i32(cpu_fpr[DFPREG(rd) + 1], cpu_tmp32,
  4043 + cpu_fpr[DFPREG(rs1) + 1]);
4026 break; 4044 break;
4027 case 0x07b: /* VIS I fornot1s */ 4045 case 0x07b: /* VIS I fornot1s */
4028 CHECK_FPU_FEATURE(dc, VIS1); 4046 CHECK_FPU_FEATURE(dc, VIS1);
@@ -4031,10 +4049,11 @@ static void disas_sparc_insn(DisasContext * dc) @@ -4031,10 +4049,11 @@ static void disas_sparc_insn(DisasContext * dc)
4031 break; 4049 break;
4032 case 0x07c: /* VIS I for */ 4050 case 0x07c: /* VIS I for */
4033 CHECK_FPU_FEATURE(dc, VIS1); 4051 CHECK_FPU_FEATURE(dc, VIS1);
4034 - gen_op_load_fpr_DT0(DFPREG(rs1));  
4035 - gen_op_load_fpr_DT1(DFPREG(rs2));  
4036 - tcg_gen_helper_0_0(helper_for);  
4037 - gen_op_store_DT0_fpr(DFPREG(rd)); 4052 + tcg_gen_or_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs1)],
  4053 + cpu_fpr[DFPREG(rs2)]);
  4054 + tcg_gen_or_i32(cpu_fpr[DFPREG(rd) + 1],
  4055 + cpu_fpr[DFPREG(rs1) + 1],
  4056 + cpu_fpr[DFPREG(rs2) + 1]);
4038 break; 4057 break;
4039 case 0x07d: /* VIS I fors */ 4058 case 0x07d: /* VIS I fors */
4040 CHECK_FPU_FEATURE(dc, VIS1); 4059 CHECK_FPU_FEATURE(dc, VIS1);