Revision ec6469a3

b/target-ppc/translate.c
1288 1288
#endif
1289 1289

  
1290 1290
/* neg neg. nego nego. */
1291
static always_inline void gen_op_neg (DisasContext *ctx, TCGv ret, TCGv arg1, int ov_check)
1291
static always_inline void gen_op_arith_neg (DisasContext *ctx, TCGv ret, TCGv arg1, int ov_check)
1292 1292
{
1293
    int l1, l2;
1294

  
1295
    l1 = gen_new_label();
1296
    l2 = gen_new_label();
1293
    int l1 = gen_new_label();
1294
    int l2 = gen_new_label();
1295
    TCGv t0 = tcg_temp_local_new(TCG_TYPE_TL);
1297 1296
#if defined(TARGET_PPC64)
1298 1297
    if (ctx->sf_mode) {
1299
        tcg_gen_brcondi_tl(TCG_COND_EQ, arg1, INT64_MIN, l1);
1300
    } else {
1301
        TCGv t0 = tcg_temp_new(TCG_TYPE_TL);
1302
	tcg_gen_ext32s_tl(t0, arg1);
1298
        tcg_gen_movi_tl(t0, arg1);
1299
        tcg_gen_brcondi_tl(TCG_COND_EQ, t0, INT64_MIN, l1);
1300
    } else
1301
#endif
1302
    {
1303
        tcg_gen_ext32s_tl(t0, arg1);
1303 1304
        tcg_gen_brcondi_tl(TCG_COND_EQ, t0, INT32_MIN, l1);
1304 1305
    }
1305
#else
1306
        tcg_gen_brcondi_tl(TCG_COND_EQ, arg1, INT32_MIN, l1);
1307
#endif
1308 1306
    tcg_gen_neg_tl(ret, arg1);
1309 1307
    if (ov_check) {
1310 1308
        tcg_gen_andi_tl(cpu_xer, cpu_xer, ~(1 << XER_OV));
1311 1309
    }
1312 1310
    tcg_gen_br(l2);
1313 1311
    gen_set_label(l1);
1314
    tcg_gen_mov_tl(ret, arg1);
1312
    tcg_gen_mov_tl(ret, t0);
1315 1313
    if (ov_check) {
1316 1314
        tcg_gen_ori_tl(cpu_xer, cpu_xer, (1 << XER_OV) | (1 << XER_SO));
1317 1315
    }
1318 1316
    gen_set_label(l2);
1317
    tcg_temp_free(t0);
1319 1318
    if (unlikely(Rc(ctx->opcode) != 0))
1320 1319
        gen_set_Rc0(ctx, ret);
1321 1320
}
1322 1321
GEN_HANDLER(neg, 0x1F, 0x08, 0x03, 0x0000F800, PPC_INTEGER)
1323 1322
{
1324
    gen_op_neg(ctx, cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)], 0);
1323
    gen_op_arith_neg(ctx, cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)], 0);
1325 1324
}
1326 1325
GEN_HANDLER(nego, 0x1F, 0x08, 0x13, 0x0000F800, PPC_INTEGER)
1327 1326
{
1328
    gen_op_neg(ctx, cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)], 1);
1327
    gen_op_arith_neg(ctx, cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)], 1);
1329 1328
}
1330 1329

  
1331 1330
/* Common subf function */

Also available in: Unified diff