Commit ae8ecd423150456e238a9d45f107b97e94957b78

Authored by aurel32
1 parent ac509d88

target-alpha: convert arith2 instructions to TCG

Replace gen_arith2 generic macro and dyngon ops by instruction specific
optimized TCG code.

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5235 c046a42c-6fe2-441c-8c8c-71466251a162
target-alpha/helper.h
@@ -3,3 +3,9 @@ @@ -3,3 +3,9 @@
3 #endif 3 #endif
4 4
5 DEF_HELPER(void, helper_tb_flush, (void)) 5 DEF_HELPER(void, helper_tb_flush, (void))
  6 +
  7 +DEF_HELPER(uint64_t, helper_amask, (uint64_t))
  8 +
  9 +DEF_HELPER(uint64_t, helper_ctpop, (uint64_t))
  10 +DEF_HELPER(uint64_t, helper_ctlz, (uint64_t))
  11 +DEF_HELPER(uint64_t, helper_cttz, (uint64_t))
target-alpha/op.c
@@ -155,12 +155,6 @@ void OPPROTO op_excp (void) @@ -155,12 +155,6 @@ void OPPROTO op_excp (void)
155 RETURN(); 155 RETURN();
156 } 156 }
157 157
158 -void OPPROTO op_load_amask (void)  
159 -{  
160 - helper_amask();  
161 - RETURN();  
162 -}  
163 -  
164 void OPPROTO op_load_pcc (void) 158 void OPPROTO op_load_pcc (void)
165 { 159 {
166 helper_load_pcc(); 160 helper_load_pcc();
@@ -340,37 +334,6 @@ void OPPROTO op_sra (void) @@ -340,37 +334,6 @@ void OPPROTO op_sra (void)
340 RETURN(); 334 RETURN();
341 } 335 }
342 336
343 -void OPPROTO op_sextb (void)  
344 -{  
345 - T0 = (int64_t)((int8_t)T0);  
346 - RETURN();  
347 -}  
348 -  
349 -void OPPROTO op_sextw (void)  
350 -{  
351 - T0 = (int64_t)((int16_t)T0);  
352 - RETURN();  
353 -  
354 -}  
355 -  
356 -void OPPROTO op_ctpop (void)  
357 -{  
358 - helper_ctpop();  
359 - RETURN();  
360 -}  
361 -  
362 -void OPPROTO op_ctlz (void)  
363 -{  
364 - helper_ctlz();  
365 - RETURN();  
366 -}  
367 -  
368 -void OPPROTO op_cttz (void)  
369 -{  
370 - helper_cttz();  
371 - RETURN();  
372 -}  
373 -  
374 void OPPROTO op_mskbl (void) 337 void OPPROTO op_mskbl (void)
375 { 338 {
376 helper_mskbl(); 339 helper_mskbl();
target-alpha/op_helper.c
@@ -65,7 +65,7 @@ void helper_excp (uint32_t excp, uint32_t error) @@ -65,7 +65,7 @@ void helper_excp (uint32_t excp, uint32_t error)
65 cpu_loop_exit(); 65 cpu_loop_exit();
66 } 66 }
67 67
68 -void helper_amask (void) 68 +uint64_t helper_amask (uint64_t arg)
69 { 69 {
70 switch (env->implver) { 70 switch (env->implver) {
71 case IMPLVER_2106x: 71 case IMPLVER_2106x:
@@ -74,9 +74,10 @@ void helper_amask (void) @@ -74,9 +74,10 @@ void helper_amask (void)
74 case IMPLVER_21164: 74 case IMPLVER_21164:
75 case IMPLVER_21264: 75 case IMPLVER_21264:
76 case IMPLVER_21364: 76 case IMPLVER_21364:
77 - T0 &= ~env->amask; 77 + arg &= ~env->amask;
78 break; 78 break;
79 } 79 }
  80 + return arg;
80 } 81 }
81 82
82 void helper_load_pcc (void) 83 void helper_load_pcc (void)
@@ -210,19 +211,19 @@ void helper_mulqv () @@ -210,19 +211,19 @@ void helper_mulqv ()
210 T0 = tl; 211 T0 = tl;
211 } 212 }
212 213
213 -void helper_ctpop (void) 214 +uint64_t helper_ctpop (uint64_t arg)
214 { 215 {
215 - T0 = ctpop64(T0); 216 + return ctpop64(arg);
216 } 217 }
217 218
218 -void helper_ctlz (void) 219 +uint64_t helper_ctlz (uint64_t arg)
219 { 220 {
220 - T0 = clz64(T0); 221 + return clz64(arg);
221 } 222 }
222 223
223 -void helper_cttz (void) 224 +uint64_t helper_cttz (uint64_t arg)
224 { 225 {
225 - T0 = ctz64(T0); 226 + return ctz64(arg);
226 } 227 }
227 228
228 static always_inline uint64_t byte_zap (uint64_t op, uint8_t mskb) 229 static always_inline uint64_t byte_zap (uint64_t op, uint8_t mskb)
target-alpha/op_helper.h
@@ -20,7 +20,6 @@ @@ -20,7 +20,6 @@
20 20
21 void helper_call_pal (uint32_t palcode); 21 void helper_call_pal (uint32_t palcode);
22 void helper_excp (uint32_t excp, uint32_t error); 22 void helper_excp (uint32_t excp, uint32_t error);
23 -void helper_amask (void);  
24 void helper_load_pcc (void); 23 void helper_load_pcc (void);
25 void helper_load_implver (void); 24 void helper_load_implver (void);
26 void helper_load_fpcr (void); 25 void helper_load_fpcr (void);
@@ -34,9 +33,6 @@ void helper_subqv (void); @@ -34,9 +33,6 @@ void helper_subqv (void);
34 void helper_sublv (void); 33 void helper_sublv (void);
35 void helper_mullv (void); 34 void helper_mullv (void);
36 void helper_mulqv (void); 35 void helper_mulqv (void);
37 -void helper_ctpop (void);  
38 -void helper_ctlz (void);  
39 -void helper_cttz (void);  
40 void helper_mskbl (void); 36 void helper_mskbl (void);
41 void helper_extbl (void); 37 void helper_extbl (void);
42 void helper_insbl (void); 38 void helper_insbl (void);
target-alpha/translate.c
@@ -25,6 +25,7 @@ @@ -25,6 +25,7 @@
25 #include "cpu.h" 25 #include "cpu.h"
26 #include "exec-all.h" 26 #include "exec-all.h"
27 #include "disas.h" 27 #include "disas.h"
  28 +#include "host-utils.h"
28 #include "helper.h" 29 #include "helper.h"
29 #include "tcg-op.h" 30 #include "tcg-op.h"
30 #include "qemu-common.h" 31 #include "qemu-common.h"
@@ -349,21 +350,6 @@ static always_inline void gen_fbcond (DisasContext *ctx, @@ -349,21 +350,6 @@ static always_inline void gen_fbcond (DisasContext *ctx,
349 _gen_op_bcond(ctx); 350 _gen_op_bcond(ctx);
350 } 351 }
351 352
352 -static always_inline void gen_arith2 (DisasContext *ctx,  
353 - void (*gen_arith_op)(void),  
354 - int rb, int rc, int islit, uint8_t lit)  
355 -{  
356 - if (islit)  
357 - tcg_gen_movi_i64(cpu_T[0], lit);  
358 - else if (rb != 31)  
359 - tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);  
360 - else  
361 - tcg_gen_movi_i64(cpu_T[0], 0);  
362 - (*gen_arith_op)();  
363 - if (rc != 31)  
364 - tcg_gen_mov_i64(cpu_ir[rc], cpu_T[0]);  
365 -}  
366 -  
367 static always_inline void gen_arith3 (DisasContext *ctx, 353 static always_inline void gen_arith3 (DisasContext *ctx,
368 void (*gen_arith_op)(void), 354 void (*gen_arith_op)(void),
369 int ra, int rb, int rc, 355 int ra, int rb, int rc,
@@ -502,12 +488,6 @@ static always_inline void gen_s8subq (void) @@ -502,12 +488,6 @@ static always_inline void gen_s8subq (void)
502 tcg_gen_sub_i64(cpu_T[0], cpu_T[0], cpu_T[1]); 488 tcg_gen_sub_i64(cpu_T[0], cpu_T[0], cpu_T[1]);
503 } 489 }
504 490
505 -static always_inline void gen_amask (void)  
506 -{  
507 - gen_op_load_amask();  
508 - gen_op_bic();  
509 -}  
510 -  
511 static always_inline int translate_one (DisasContext *ctx, uint32_t insn) 491 static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
512 { 492 {
513 uint32_t palcode; 493 uint32_t palcode;
@@ -793,7 +773,14 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) @@ -793,7 +773,14 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
793 break; 773 break;
794 case 0x61: 774 case 0x61:
795 /* AMASK */ 775 /* AMASK */
796 - gen_arith2(ctx, &gen_amask, rb, rc, islit, lit); 776 + if (likely(rc != 31)) {
  777 + if (islit)
  778 + tcg_gen_movi_i64(cpu_ir[rc], helper_amask(lit));
  779 + else if (rb != 31)
  780 + tcg_gen_helper_1_1(helper_amask, cpu_ir[rc], cpu_ir[rb]);
  781 + else
  782 + tcg_gen_movi_i64(cpu_ir[rc], 0);
  783 + }
797 break; 784 break;
798 case 0x64: 785 case 0x64:
799 /* CMOVLE */ 786 /* CMOVLE */
@@ -1446,19 +1433,40 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) @@ -1446,19 +1433,40 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
1446 /* SEXTB */ 1433 /* SEXTB */
1447 if (!(ctx->amask & AMASK_BWX)) 1434 if (!(ctx->amask & AMASK_BWX))
1448 goto invalid_opc; 1435 goto invalid_opc;
1449 - gen_arith2(ctx, &gen_op_sextb, rb, rc, islit, lit); 1436 + if (likely(rc != 31)) {
  1437 + if (islit)
  1438 + tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int8_t)lit));
  1439 + else if (rb != 31)
  1440 + tcg_gen_ext8s_i64(cpu_ir[rc], cpu_ir[rb]);
  1441 + else
  1442 + tcg_gen_movi_i64(cpu_ir[rc], 0);
  1443 + }
1450 break; 1444 break;
1451 case 0x01: 1445 case 0x01:
1452 /* SEXTW */ 1446 /* SEXTW */
1453 if (!(ctx->amask & AMASK_BWX)) 1447 if (!(ctx->amask & AMASK_BWX))
1454 goto invalid_opc; 1448 goto invalid_opc;
1455 - gen_arith2(ctx, &gen_op_sextw, rb, rc, islit, lit); 1449 + if (likely(rc != 31)) {
  1450 + if (islit)
  1451 + tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int16_t)lit));
  1452 + else if (rb != 31)
  1453 + tcg_gen_ext16s_i64(cpu_ir[rc], cpu_ir[rb]);
  1454 + else
  1455 + tcg_gen_movi_i64(cpu_ir[rc], 0);
  1456 + }
1456 break; 1457 break;
1457 case 0x30: 1458 case 0x30:
1458 /* CTPOP */ 1459 /* CTPOP */
1459 if (!(ctx->amask & AMASK_CIX)) 1460 if (!(ctx->amask & AMASK_CIX))
1460 goto invalid_opc; 1461 goto invalid_opc;
1461 - gen_arith2(ctx, &gen_op_ctpop, rb, rc, 0, 0); 1462 + if (likely(rc != 31)) {
  1463 + if (islit)
  1464 + tcg_gen_movi_i64(cpu_ir[rc], ctpop64(lit));
  1465 + else if (rb != 31)
  1466 + tcg_gen_helper_1_1(helper_ctpop, cpu_ir[rc], cpu_ir[rb]);
  1467 + else
  1468 + tcg_gen_movi_i64(cpu_ir[rc], 0);
  1469 + }
1462 break; 1470 break;
1463 case 0x31: 1471 case 0x31:
1464 /* PERR */ 1472 /* PERR */
@@ -1471,13 +1479,27 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn) @@ -1471,13 +1479,27 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
1471 /* CTLZ */ 1479 /* CTLZ */
1472 if (!(ctx->amask & AMASK_CIX)) 1480 if (!(ctx->amask & AMASK_CIX))
1473 goto invalid_opc; 1481 goto invalid_opc;
1474 - gen_arith2(ctx, &gen_op_ctlz, rb, rc, 0, 0); 1482 + if (likely(rc != 31)) {
  1483 + if (islit)
  1484 + tcg_gen_movi_i64(cpu_ir[rc], clz64(lit));
  1485 + else if (rb != 31)
  1486 + tcg_gen_helper_1_1(helper_ctlz, cpu_ir[rc], cpu_ir[rb]);
  1487 + else
  1488 + tcg_gen_movi_i64(cpu_ir[rc], 0);
  1489 + }
1475 break; 1490 break;
1476 case 0x33: 1491 case 0x33:
1477 /* CTTZ */ 1492 /* CTTZ */
1478 if (!(ctx->amask & AMASK_CIX)) 1493 if (!(ctx->amask & AMASK_CIX))
1479 goto invalid_opc; 1494 goto invalid_opc;
1480 - gen_arith2(ctx, &gen_op_cttz, rb, rc, 0, 0); 1495 + if (likely(rc != 31)) {
  1496 + if (islit)
  1497 + tcg_gen_movi_i64(cpu_ir[rc], ctz64(lit));
  1498 + else if (rb != 31)
  1499 + tcg_gen_helper_1_1(helper_cttz, cpu_ir[rc], cpu_ir[rb]);
  1500 + else
  1501 + tcg_gen_movi_i64(cpu_ir[rc], 0);
  1502 + }
1481 break; 1503 break;
1482 case 0x34: 1504 case 0x34:
1483 /* UNPKBW */ 1505 /* UNPKBW */