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 #endif
4 4  
5 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 155 RETURN();
156 156 }
157 157  
158   -void OPPROTO op_load_amask (void)
159   -{
160   - helper_amask();
161   - RETURN();
162   -}
163   -
164 158 void OPPROTO op_load_pcc (void)
165 159 {
166 160 helper_load_pcc();
... ... @@ -340,37 +334,6 @@ void OPPROTO op_sra (void)
340 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 337 void OPPROTO op_mskbl (void)
375 338 {
376 339 helper_mskbl();
... ...
target-alpha/op_helper.c
... ... @@ -65,7 +65,7 @@ void helper_excp (uint32_t excp, uint32_t error)
65 65 cpu_loop_exit();
66 66 }
67 67  
68   -void helper_amask (void)
  68 +uint64_t helper_amask (uint64_t arg)
69 69 {
70 70 switch (env->implver) {
71 71 case IMPLVER_2106x:
... ... @@ -74,9 +74,10 @@ void helper_amask (void)
74 74 case IMPLVER_21164:
75 75 case IMPLVER_21264:
76 76 case IMPLVER_21364:
77   - T0 &= ~env->amask;
  77 + arg &= ~env->amask;
78 78 break;
79 79 }
  80 + return arg;
80 81 }
81 82  
82 83 void helper_load_pcc (void)
... ... @@ -210,19 +211,19 @@ void helper_mulqv ()
210 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 229 static always_inline uint64_t byte_zap (uint64_t op, uint8_t mskb)
... ...
target-alpha/op_helper.h
... ... @@ -20,7 +20,6 @@
20 20  
21 21 void helper_call_pal (uint32_t palcode);
22 22 void helper_excp (uint32_t excp, uint32_t error);
23   -void helper_amask (void);
24 23 void helper_load_pcc (void);
25 24 void helper_load_implver (void);
26 25 void helper_load_fpcr (void);
... ... @@ -34,9 +33,6 @@ void helper_subqv (void);
34 33 void helper_sublv (void);
35 34 void helper_mullv (void);
36 35 void helper_mulqv (void);
37   -void helper_ctpop (void);
38   -void helper_ctlz (void);
39   -void helper_cttz (void);
40 36 void helper_mskbl (void);
41 37 void helper_extbl (void);
42 38 void helper_insbl (void);
... ...
target-alpha/translate.c
... ... @@ -25,6 +25,7 @@
25 25 #include "cpu.h"
26 26 #include "exec-all.h"
27 27 #include "disas.h"
  28 +#include "host-utils.h"
28 29 #include "helper.h"
29 30 #include "tcg-op.h"
30 31 #include "qemu-common.h"
... ... @@ -349,21 +350,6 @@ static always_inline void gen_fbcond (DisasContext *ctx,
349 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 353 static always_inline void gen_arith3 (DisasContext *ctx,
368 354 void (*gen_arith_op)(void),
369 355 int ra, int rb, int rc,
... ... @@ -502,12 +488,6 @@ static always_inline void gen_s8subq (void)
502 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 491 static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
512 492 {
513 493 uint32_t palcode;
... ... @@ -793,7 +773,14 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
793 773 break;
794 774 case 0x61:
795 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 784 break;
798 785 case 0x64:
799 786 /* CMOVLE */
... ... @@ -1446,19 +1433,40 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
1446 1433 /* SEXTB */
1447 1434 if (!(ctx->amask & AMASK_BWX))
1448 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 1444 break;
1451 1445 case 0x01:
1452 1446 /* SEXTW */
1453 1447 if (!(ctx->amask & AMASK_BWX))
1454 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 1457 break;
1457 1458 case 0x30:
1458 1459 /* CTPOP */
1459 1460 if (!(ctx->amask & AMASK_CIX))
1460 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 1470 break;
1463 1471 case 0x31:
1464 1472 /* PERR */
... ... @@ -1471,13 +1479,27 @@ static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
1471 1479 /* CTLZ */
1472 1480 if (!(ctx->amask & AMASK_CIX))
1473 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 1490 break;
1476 1491 case 0x33:
1477 1492 /* CTTZ */
1478 1493 if (!(ctx->amask & AMASK_CIX))
1479 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 1503 break;
1482 1504 case 0x34:
1483 1505 /* UNPKBW */
... ...