Revision 148bdd23

b/tcg/ppc64/tcg-target.c
329 329
#define MULLI  OPCD(  7)
330 330
#define CMPLI  OPCD( 10)
331 331
#define CMPI   OPCD( 11)
332
#define SUBFIC OPCD( 8)
332 333

  
333 334
#define LWZU   OPCD( 33)
334 335
#define STWU   OPCD( 37)
......
1314 1315
        break;
1315 1316
    case INDEX_op_sub_i32:
1316 1317
        a0 = args[0], a1 = args[1], a2 = args[2];
1317
        if (const_args[2]) {
1318
        if (const_args[1]) {
1319
            if (const_args[2]) {
1320
                tcg_out_movi(s, TCG_TYPE_I32, a0, a1 - a2);
1321
            } else {
1322
                tcg_out32(s, SUBFIC | TAI(a0, a2, a1));
1323
            }
1324
        } else if (const_args[2]) {
1318 1325
            a2 = -a2;
1319 1326
            goto do_addi_32;
1320 1327
        } else {
......
1483 1490
        break;
1484 1491
    case INDEX_op_sub_i64:
1485 1492
        a0 = args[0], a1 = args[1], a2 = args[2];
1486
        if (const_args[2]) {
1493
        if (const_args[1]) {
1494
            if (const_args[2]) {
1495
                tcg_out_movi(s, TCG_TYPE_I64, a0, a1 - a2);
1496
            } else {
1497
                tcg_out32(s, SUBFIC | TAI(a0, a2, a1));
1498
            }
1499
        } else if (const_args[2]) {
1487 1500
            a2 = -a2;
1488 1501
            goto do_addi_64;
1489 1502
        } else {
......
1639 1652
    { INDEX_op_divu_i32, { "r", "r", "r" } },
1640 1653
    { INDEX_op_rem_i32, { "r", "r", "r" } },
1641 1654
    { INDEX_op_remu_i32, { "r", "r", "r" } },
1642
    { INDEX_op_sub_i32, { "r", "r", "ri" } },
1655
    { INDEX_op_sub_i32, { "r", "rI", "ri" } },
1643 1656
    { INDEX_op_and_i32, { "r", "r", "ri" } },
1644 1657
    { INDEX_op_or_i32, { "r", "r", "ri" } },
1645 1658
    { INDEX_op_xor_i32, { "r", "r", "ri" } },
......
1655 1668
    { INDEX_op_not_i32, { "r", "r" } },
1656 1669

  
1657 1670
    { INDEX_op_add_i64, { "r", "r", "rT" } },
1658
    { INDEX_op_sub_i64, { "r", "r", "rT" } },
1671
    { INDEX_op_sub_i64, { "r", "rI", "rT" } },
1659 1672
    { INDEX_op_and_i64, { "r", "r", "rU" } },
1660 1673
    { INDEX_op_or_i64, { "r", "r", "rU" } },
1661 1674
    { INDEX_op_xor_i64, { "r", "r", "rU" } },

Also available in: Unified diff