Revision d8299bcc target-sh4/translate.c

b/target-sh4/translate.c
447 447
#define DREG(x) FREG(x) /* Assumes lsb of (x) is always 0 */
448 448

  
449 449
#define CHECK_NOT_DELAY_SLOT \
450
  if (ctx->flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL)) \
451
  {gen_helper_raise_slot_illegal_instruction(); ctx->bstate = BS_EXCP; \
452
   return;}
450
  if (ctx->flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL))     \
451
  {                                                           \
452
      tcg_gen_movi_i32(cpu_pc, ctx->pc-2);                    \
453
      gen_helper_raise_slot_illegal_instruction();            \
454
      ctx->bstate = BS_EXCP;                                  \
455
      return;                                                 \
456
  }
453 457

  
454 458
#define CHECK_PRIVILEGED                                      \
455 459
  if (IS_USER(ctx)) {                                         \
460
      tcg_gen_movi_i32(cpu_pc, ctx->pc);                      \
456 461
      gen_helper_raise_illegal_instruction();                 \
457 462
      ctx->bstate = BS_EXCP;                                  \
458 463
      return;                                                 \
459 464
  }
460 465

  
466
#define CHECK_FPU_ENABLED                                       \
467
  if (ctx->flags & SR_FD) {                                     \
468
      if (ctx->flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL)) { \
469
          tcg_gen_movi_i32(cpu_pc, ctx->pc-2);                  \
470
          gen_helper_raise_slot_fpu_disable();                  \
471
      } else {                                                  \
472
          tcg_gen_movi_i32(cpu_pc, ctx->pc);                    \
473
          gen_helper_raise_fpu_disable();                       \
474
      }                                                         \
475
      ctx->bstate = BS_EXCP;                                    \
476
      return;                                                   \
477
  }
478

  
461 479
static void _decode_opc(DisasContext * ctx)
462 480
{
463 481
#if 0
......
1454 1472
	LDST(mach, 0x400a, 0x4006, 0x000a, 0x4002, {})
1455 1473
	LDST(macl, 0x401a, 0x4016, 0x001a, 0x4012, {})
1456 1474
	LDST(pr,   0x402a, 0x4026, 0x002a, 0x4022, {})
1457
	LDST(fpul, 0x405a, 0x4056, 0x005a, 0x4052, {})
1475
	LDST(fpul, 0x405a, 0x4056, 0x005a, 0x4052, {CHECK_FPU_ENABLED})
1458 1476
    case 0x406a:		/* lds Rm,FPSCR */
1477
	CHECK_FPU_ENABLED
1459 1478
	gen_helper_ld_fpscr(REG(B11_8));
1460 1479
	ctx->bstate = BS_STOP;
1461 1480
	return;
1462 1481
    case 0x4066:		/* lds.l @Rm+,FPSCR */
1482
	CHECK_FPU_ENABLED
1463 1483
	{
1464 1484
	    TCGv addr = tcg_temp_new();
1465 1485
	    tcg_gen_qemu_ld32s(addr, REG(B11_8), ctx->memidx);
......
1470 1490
	}
1471 1491
	return;
1472 1492
    case 0x006a:		/* sts FPSCR,Rn */
1493
	CHECK_FPU_ENABLED
1473 1494
	tcg_gen_andi_i32(REG(B11_8), cpu_fpscr, 0x003fffff);
1474 1495
	return;
1475 1496
    case 0x4062:		/* sts FPSCR,@-Rn */
1497
	CHECK_FPU_ENABLED
1476 1498
	{
1477 1499
	    TCGv addr, val;
1478 1500
	    val = tcg_temp_new();

Also available in: Unified diff