Commit 7fc8105195fb154d219681b115ae1832c2a71c4b

Authored by aurel32
1 parent 515e2f7e

tcg: optimize logical operations

Simplify nand/nor/eqv and move their optimizations to and/or/xor

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

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6805 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 60 additions and 50 deletions
tcg/tcg-op.h
... ... @@ -436,7 +436,11 @@ static inline void tcg_gen_subi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
436 436  
437 437 static inline void tcg_gen_and_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
438 438 {
439   - tcg_gen_op3_i32(INDEX_op_and_i32, ret, arg1, arg2);
  439 + if (TCGV_EQUAL_I32(arg1, arg2)) {
  440 + tcg_gen_mov_i32(ret, arg1);
  441 + } else {
  442 + tcg_gen_op3_i32(INDEX_op_and_i32, ret, arg1, arg2);
  443 + }
440 444 }
441 445  
442 446 static inline void tcg_gen_andi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
... ... @@ -455,7 +459,11 @@ static inline void tcg_gen_andi_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
455 459  
456 460 static inline void tcg_gen_or_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
457 461 {
458   - tcg_gen_op3_i32(INDEX_op_or_i32, ret, arg1, arg2);
  462 + if (TCGV_EQUAL_I32(arg1, arg2)) {
  463 + tcg_gen_mov_i32(ret, arg1);
  464 + } else {
  465 + tcg_gen_op3_i32(INDEX_op_or_i32, ret, arg1, arg2);
  466 + }
459 467 }
460 468  
461 469 static inline void tcg_gen_ori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
... ... @@ -474,7 +482,11 @@ static inline void tcg_gen_ori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
474 482  
475 483 static inline void tcg_gen_xor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
476 484 {
477   - tcg_gen_op3_i32(INDEX_op_xor_i32, ret, arg1, arg2);
  485 + if (TCGV_EQUAL_I32(arg1, arg2)) {
  486 + tcg_gen_movi_i32(ret, 0);
  487 + } else {
  488 + tcg_gen_op3_i32(INDEX_op_xor_i32, ret, arg1, arg2);
  489 + }
478 490 }
479 491  
480 492 static inline void tcg_gen_xori_i32(TCGv_i32 ret, TCGv_i32 arg1, int32_t arg2)
... ... @@ -745,14 +757,22 @@ static inline void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
745 757  
746 758 static inline void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
747 759 {
748   - tcg_gen_andi_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
749   - tcg_gen_andi_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
  760 + if (TCGV_EQUAL_I64(arg1, arg2)) {
  761 + tcg_gen_mov_i64(ret, arg1);
  762 + } else {
  763 + tcg_gen_andi_i32(TCGV_LOW(ret), TCGV_LOW(arg1), arg2);
  764 + tcg_gen_andi_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), arg2 >> 32);
  765 + }
750 766 }
751 767  
752 768 static inline void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
753 769 {
754   - tcg_gen_or_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
755   - tcg_gen_or_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
  770 + if (TCGV_EQUAL_I64(arg1, arg2)) {
  771 + tcg_gen_mov_i64(ret, arg1);
  772 + } else {
  773 + tcg_gen_or_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
  774 + tcg_gen_or_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
  775 + }
756 776 }
757 777  
758 778 static inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
... ... @@ -763,8 +783,12 @@ static inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
763 783  
764 784 static inline void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
765 785 {
766   - tcg_gen_xor_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
767   - tcg_gen_xor_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
  786 + if (TCGV_EQUAL_I64(arg1, arg2)) {
  787 + tcg_gen_movi_i64(ret, 0);
  788 + } else {
  789 + tcg_gen_xor_i32(TCGV_LOW(ret), TCGV_LOW(arg1), TCGV_LOW(arg2));
  790 + tcg_gen_xor_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1), TCGV_HIGH(arg2));
  791 + }
768 792 }
769 793  
770 794 static inline void tcg_gen_xori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
... ... @@ -943,7 +967,11 @@ static inline void tcg_gen_sub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
943 967  
944 968 static inline void tcg_gen_and_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
945 969 {
946   - tcg_gen_op3_i64(INDEX_op_and_i64, ret, arg1, arg2);
  970 + if (TCGV_EQUAL_I64(arg1, arg2)) {
  971 + tcg_gen_mov_i64(ret, arg1);
  972 + } else {
  973 + tcg_gen_op3_i64(INDEX_op_and_i64, ret, arg1, arg2);
  974 + }
947 975 }
948 976  
949 977 static inline void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
... ... @@ -955,7 +983,11 @@ static inline void tcg_gen_andi_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
955 983  
956 984 static inline void tcg_gen_or_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
957 985 {
958   - tcg_gen_op3_i64(INDEX_op_or_i64, ret, arg1, arg2);
  986 + if (TCGV_EQUAL_I64(arg1, arg2)) {
  987 + tcg_gen_mov_i64(ret, arg1);
  988 + } else {
  989 + tcg_gen_op3_i64(INDEX_op_or_i64, ret, arg1, arg2);
  990 + }
959 991 }
960 992  
961 993 static inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
... ... @@ -967,7 +999,11 @@ static inline void tcg_gen_ori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
967 999  
968 1000 static inline void tcg_gen_xor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
969 1001 {
970   - tcg_gen_op3_i64(INDEX_op_xor_i64, ret, arg1, arg2);
  1002 + if (TCGV_EQUAL_I64(arg1, arg2)) {
  1003 + tcg_gen_movi_i64(ret, 0);
  1004 + } else {
  1005 + tcg_gen_op3_i64(INDEX_op_xor_i64, ret, arg1, arg2);
  1006 + }
971 1007 }
972 1008  
973 1009 static inline void tcg_gen_xori_i64(TCGv_i64 ret, TCGv_i64 arg1, int64_t arg2)
... ... @@ -1509,64 +1545,38 @@ static inline void tcg_gen_andc_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1509 1545  
1510 1546 static inline void tcg_gen_eqv_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1511 1547 {
1512   - TCGv_i32 t0;
1513   - t0 = tcg_temp_new_i32();
1514   - tcg_gen_xor_i32(t0, arg1, arg2);
1515   - tcg_gen_not_i32(ret, t0);
1516   - tcg_temp_free_i32(t0);
  1548 + tcg_gen_xor_i32(ret, arg1, arg2);
  1549 + tcg_gen_not_i32(ret, ret);
1517 1550 }
1518 1551  
1519 1552 static inline void tcg_gen_eqv_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1520 1553 {
1521   - TCGv_i64 t0;
1522   - t0 = tcg_temp_new_i64();
1523   - tcg_gen_xor_i64(t0, arg1, arg2);
1524   - tcg_gen_not_i64(ret, t0);
1525   - tcg_temp_free_i64(t0);
  1554 + tcg_gen_xor_i64(ret, arg1, arg2);
  1555 + tcg_gen_not_i64(ret, ret);
1526 1556 }
1527 1557  
1528 1558 static inline void tcg_gen_nand_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1529 1559 {
1530   - TCGv_i32 t0;
1531   - t0 = tcg_temp_new_i32();
1532   - tcg_gen_and_i32(t0, arg1, arg2);
1533   - tcg_gen_not_i32(ret, t0);
1534   - tcg_temp_free_i32(t0);
  1560 + tcg_gen_and_i32(ret, arg1, arg2);
  1561 + tcg_gen_not_i32(ret, ret);
1535 1562 }
1536 1563  
1537 1564 static inline void tcg_gen_nand_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1538 1565 {
1539   - TCGv_i64 t0;
1540   - t0 = tcg_temp_new_i64();
1541   - tcg_gen_and_i64(t0, arg1, arg2);
1542   - tcg_gen_not_i64(ret, t0);
1543   - tcg_temp_free_i64(t0);
  1566 + tcg_gen_and_i64(ret, arg1, arg2);
  1567 + tcg_gen_not_i64(ret, ret);
1544 1568 }
1545 1569  
1546 1570 static inline void tcg_gen_nor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
1547 1571 {
1548   - if (TCGV_EQUAL_I32(arg1, arg2)) {
1549   - tcg_gen_not_i32(ret, arg1);
1550   - } else {
1551   - TCGv_i32 t0;
1552   - t0 = tcg_temp_new_i32();
1553   - tcg_gen_or_i32(t0, arg1, arg2);
1554   - tcg_gen_not_i32(ret, t0);
1555   - tcg_temp_free_i32(t0);
1556   - }
  1572 + tcg_gen_or_i32(ret, arg1, arg2);
  1573 + tcg_gen_not_i32(ret, ret);
1557 1574 }
1558 1575  
1559 1576 static inline void tcg_gen_nor_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
1560 1577 {
1561   - if (TCGV_EQUAL_I64(arg1, arg2)) {
1562   - tcg_gen_not_i64(ret, arg1);
1563   - } else {
1564   - TCGv_i64 t0;
1565   - t0 = tcg_temp_new_i64();
1566   - tcg_gen_or_i64(t0, arg1, arg2);
1567   - tcg_gen_not_i64(ret, t0);
1568   - tcg_temp_free_i64(t0);
1569   - }
  1578 + tcg_gen_or_i64(ret, arg1, arg2);
  1579 + tcg_gen_not_i64(ret, ret);
1570 1580 }
1571 1581  
1572 1582 static inline void tcg_gen_orc_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
... ...