Revision fe6f943f tcg/ppc64/tcg-target.c

b/tcg/ppc64/tcg-target.c
22 22
 * THE SOFTWARE.
23 23
 */
24 24

  
25
#define TCG_CT_CONST_U32 0x100
26

  
25 27
static uint8_t *tb_ret_addr;
26 28

  
27 29
#define FAST_PATH
......
226 228
        tcg_regset_reset_reg (ct->u.regs, TCG_REG_R4);
227 229
        tcg_regset_reset_reg (ct->u.regs, TCG_REG_R5);
228 230
        break;
231
    case 'Z':
232
        ct->ct |= TCG_CT_CONST_U32;
233
        break;
229 234
    default:
230 235
        return -1;
231 236
    }
......
243 248
    ct = arg_ct->ct;
244 249
    if (ct & TCG_CT_CONST)
245 250
        return 1;
251
    else if ((ct & TCG_CT_CONST_U32) && (val == (uint32_t) val))
252
        return 1;
246 253
    return 0;
247 254
}
248 255

  
......
352 359
#define SLD    XO31( 27)
353 360
#define SRD    XO31(539)
354 361
#define SRAD   XO31(794)
362
#define SRADI  XO31(413<<1)
355 363

  
356 364
#define LMW    OPCD( 46)
357 365
#define STMW   OPCD( 47)
......
874 882

  
875 883
static void ppc_addi64 (TCGContext *s, int rt, int ra, tcg_target_long si)
876 884
{
877
    tcg_out_movi (s, TCG_TYPE_I64, 0, si);
878
    tcg_out32 (s, ADD | RT (rt) | RA (ra));
885
    /* XXX: suboptimal */
886
    if (si == (int16_t) si
887
        || (((uint64_t) si >> 31) == 0) && (si & 0x8000) == 0)
888
        ppc_addi32 (s, rt, ra, si);
889
    else {
890
        tcg_out_movi (s, TCG_TYPE_I64, 0, si);
891
        tcg_out32 (s, ADD | RT (rt) | RA (ra));
892
    }
879 893
}
880 894

  
881 895
static void tcg_out_addi (TCGContext *s, int reg, tcg_target_long val)
......
1102 1116
            tcg_out32 (s, SUBF | TAB (args[0], args[2], args[1]));
1103 1117
        break;
1104 1118

  
1119
    case INDEX_op_and_i64:
1105 1120
    case INDEX_op_and_i32:
1106 1121
        if (const_args[2]) {
1107 1122
            if ((args[2] & 0xffff) == args[2])
......
1110 1125
                tcg_out32 (s, ANDIS | RS (args[1]) | RA (args[0])
1111 1126
                           | ((args[2] >> 16) & 0xffff));
1112 1127
            else {
1113
                tcg_out_movi (s, TCG_TYPE_I32, 0, args[2]);
1128
                tcg_out_movi (s, (opc == INDEX_op_and_i32
1129
                                  ? TCG_TYPE_I32
1130
                                  : TCG_TYPE_I64),
1131
                              0, args[2]);
1114 1132
                tcg_out32 (s, AND | SAB (args[1], args[0], 0));
1115 1133
            }
1116 1134
        }
1117 1135
        else
1118 1136
            tcg_out32 (s, AND | SAB (args[1], args[0], args[2]));
1119 1137
        break;
1138
    case INDEX_op_or_i64:
1120 1139
    case INDEX_op_or_i32:
1121 1140
        if (const_args[2]) {
1122 1141
            if (args[2] & 0xffff) {
......
1134 1153
        else
1135 1154
            tcg_out32 (s, OR | SAB (args[1], args[0], args[2]));
1136 1155
        break;
1156
    case INDEX_op_xor_i64:
1137 1157
    case INDEX_op_xor_i32:
1138 1158
        if (const_args[2]) {
1139 1159
            if ((args[2] & 0xffff) == args[2])
......
1143 1163
                tcg_out32 (s, XORIS | RS (args[1])  | RA (args[0])
1144 1164
                           | ((args[2] >> 16) & 0xffff));
1145 1165
            else {
1146
                tcg_out_movi (s, TCG_TYPE_I32, 0, args[2]);
1166
                tcg_out_movi (s, (opc == INDEX_op_and_i32
1167
                                  ? TCG_TYPE_I32
1168
                                  : TCG_TYPE_I64),
1169
                              0, args[2]);
1147 1170
                tcg_out32 (s, XOR | SAB (args[1], args[0], 0));
1148 1171
            }
1149 1172
        }
......
1234 1257
        break;
1235 1258

  
1236 1259
    case INDEX_op_add_i64:
1237
        tcg_out32 (s, ADD | TAB (args[0], args[1], args[2]));
1260
        if (const_args[2])
1261
            ppc_addi64 (s, args[0], args[1], args[2]);
1262
        else
1263
            tcg_out32 (s, ADD | TAB (args[0], args[1], args[2]));
1238 1264
        break;
1239 1265
    case INDEX_op_sub_i64:
1240
        tcg_out32 (s, SUBF | TAB (args[0], args[2], args[1]));
1241
        break;
1242

  
1243
    case INDEX_op_and_i64:
1244
        tcg_out32 (s, AND | SAB (args[1], args[0], args[2]));
1245
        break;
1246
    case INDEX_op_or_i64:
1247
        tcg_out32 (s, OR | SAB (args[1], args[0], args[2]));
1248
        break;
1249
    case INDEX_op_xor_i64:
1250
        tcg_out32 (s, XOR | SAB (args[1], args[0], args[2]));
1266
        if (const_args[2])
1267
            ppc_addi64 (s, args[0], args[1], -args[2]);
1268
        else
1269
            tcg_out32 (s, SUBF | TAB (args[0], args[2], args[1]));
1251 1270
        break;
1252 1271

  
1253 1272
    case INDEX_op_shl_i64:
1254
        tcg_out32 (s, SLD | SAB (args[1], args[0], args[2]));
1273
        if (const_args[2])
1274
            tcg_out_rld (s, RLDICR, args[0], args[1], args[2], 63 - args[2]);
1275
        else
1276
            tcg_out32 (s, SLD | SAB (args[1], args[0], args[2]));
1255 1277
        break;
1256 1278
    case INDEX_op_shr_i64:
1257
        tcg_out32 (s, SRD | SAB (args[1], args[0], args[2]));
1279
        if (const_args[2])
1280
            tcg_out_rld (s, RLDICL, args[0], args[1], 64 - args[2], args[2]);
1281
        else
1282
            tcg_out32 (s, SRD | SAB (args[1], args[0], args[2]));
1258 1283
        break;
1259 1284
    case INDEX_op_sar_i64:
1260
        tcg_out32 (s, SRAD | SAB (args[1], args[0], args[2]));
1285
        if (const_args[2]) {
1286
            int sh = SH (args[2] & 0x1f) | (((args[2] >> 5) & 1) << 1);
1287
            tcg_out32 (s, SRADI | RA (args[0]) | RS (args[1]) | sh);
1288
        }
1289
        else
1290
            tcg_out32 (s, SRAD | SAB (args[1], args[0], args[2]));
1261 1291
        break;
1262 1292

  
1263 1293
    case INDEX_op_mul_i64:
......
1389 1419

  
1390 1420
    { INDEX_op_neg_i32, { "r", "r" } },
1391 1421

  
1392
    { INDEX_op_add_i64, { "r", "r", "r" } },
1393
    { INDEX_op_sub_i64, { "r", "r", "r" } },
1394
    { INDEX_op_and_i64, { "r", "r", "r" } },
1395
    { INDEX_op_or_i64, { "r", "r", "r" } },
1396
    { INDEX_op_xor_i64, { "r", "r", "r" } },
1422
    { INDEX_op_add_i64, { "r", "r", "ri" } },
1423
    { INDEX_op_sub_i64, { "r", "r", "ri" } },
1424
    { INDEX_op_and_i64, { "r", "r", "rZ" } },
1425
    { INDEX_op_or_i64, { "r", "r", "rZ" } },
1426
    { INDEX_op_xor_i64, { "r", "r", "rZ" } },
1397 1427

  
1398
    { INDEX_op_shl_i64, { "r", "r", "r" } },
1399
    { INDEX_op_shr_i64, { "r", "r", "r" } },
1400
    { INDEX_op_sar_i64, { "r", "r", "r" } },
1428
    { INDEX_op_shl_i64, { "r", "r", "ri" } },
1429
    { INDEX_op_shr_i64, { "r", "r", "ri" } },
1430
    { INDEX_op_sar_i64, { "r", "r", "ri" } },
1401 1431

  
1402 1432
    { INDEX_op_mul_i64, { "r", "r", "r" } },
1403 1433
    { INDEX_op_div_i64, { "r", "r", "r" } },

Also available in: Unified diff