Commit 5e755519ac9d867f7da13f58a9d0c262db82e14c
1 parent
acf930aa
Don't check the FPU state for each FPU instruction, use hflags to
handle this per-tb. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2896 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
126 additions
and
126 deletions
target-mips/cpu.h
| @@ -258,9 +258,11 @@ struct CPUMIPSState { | @@ -258,9 +258,11 @@ struct CPUMIPSState { | ||
| 258 | #define MIPS_HFLAG_TMASK 0x007F | 258 | #define MIPS_HFLAG_TMASK 0x007F |
| 259 | #define MIPS_HFLAG_MODE 0x001F /* execution modes */ | 259 | #define MIPS_HFLAG_MODE 0x001F /* execution modes */ |
| 260 | #define MIPS_HFLAG_UM 0x0001 /* user mode */ | 260 | #define MIPS_HFLAG_UM 0x0001 /* user mode */ |
| 261 | -#define MIPS_HFLAG_DM 0x0008 /* Debug mode */ | ||
| 262 | -#define MIPS_HFLAG_SM 0x0010 /* Supervisor mode */ | ||
| 263 | -#define MIPS_HFLAG_64 0x0020 /* 64-bit instructions enabled */ | 261 | +#define MIPS_HFLAG_DM 0x0002 /* Debug mode */ |
| 262 | +#define MIPS_HFLAG_SM 0x0004 /* Supervisor mode */ | ||
| 263 | +#define MIPS_HFLAG_64 0x0008 /* 64-bit instructions enabled */ | ||
| 264 | +#define MIPS_HFLAG_FPU 0x0010 /* FPU enabled */ | ||
| 265 | +#define MIPS_HFLAG_F64 0x0020 /* 64-bit FPU enabled */ | ||
| 264 | #define MIPS_HFLAG_RE 0x0040 /* Reversed endianness */ | 266 | #define MIPS_HFLAG_RE 0x0040 /* Reversed endianness */ |
| 265 | /* If translation is interrupted between the branch instruction and | 267 | /* If translation is interrupted between the branch instruction and |
| 266 | * the delay slot, record what type of branch it is so that we can | 268 | * the delay slot, record what type of branch it is so that we can |
target-mips/fop_template.c
| @@ -49,7 +49,7 @@ OP_WSTORE_FREG(WT2, WT2_fpr, FREG) | @@ -49,7 +49,7 @@ OP_WSTORE_FREG(WT2, WT2_fpr, FREG) | ||
| 49 | #define OP_DLOAD_FREG(treg, tregname, FREG) \ | 49 | #define OP_DLOAD_FREG(treg, tregname, FREG) \ |
| 50 | void glue(glue(op_load_fpr_,tregname), FREG) (void) \ | 50 | void glue(glue(op_load_fpr_,tregname), FREG) (void) \ |
| 51 | { \ | 51 | { \ |
| 52 | - if (env->CP0_Status & (1 << CP0St_FR)) \ | 52 | + if (env->hflags & MIPS_HFLAG_F64) \ |
| 53 | treg = env->fpr[FREG].fd; \ | 53 | treg = env->fpr[FREG].fd; \ |
| 54 | else \ | 54 | else \ |
| 55 | treg = (uint64_t)(env->fpr[FREG | 1].fs[FP_ENDIAN_IDX]) << 32 | \ | 55 | treg = (uint64_t)(env->fpr[FREG | 1].fs[FP_ENDIAN_IDX]) << 32 | \ |
| @@ -60,7 +60,7 @@ OP_WSTORE_FREG(WT2, WT2_fpr, FREG) | @@ -60,7 +60,7 @@ OP_WSTORE_FREG(WT2, WT2_fpr, FREG) | ||
| 60 | #define OP_DSTORE_FREG(treg, tregname, FREG) \ | 60 | #define OP_DSTORE_FREG(treg, tregname, FREG) \ |
| 61 | void glue(glue(op_store_fpr_,tregname), FREG) (void) \ | 61 | void glue(glue(op_store_fpr_,tregname), FREG) (void) \ |
| 62 | { \ | 62 | { \ |
| 63 | - if (env->CP0_Status & (1 << CP0St_FR)) \ | 63 | + if (env->hflags & MIPS_HFLAG_F64) \ |
| 64 | env->fpr[FREG].fd = treg; \ | 64 | env->fpr[FREG].fd = treg; \ |
| 65 | else { \ | 65 | else { \ |
| 66 | env->fpr[FREG | 1].fs[FP_ENDIAN_IDX] = treg >> 32; \ | 66 | env->fpr[FREG | 1].fs[FP_ENDIAN_IDX] = treg >> 32; \ |
target-mips/op.c
| @@ -1349,8 +1349,7 @@ void op_mtc0_status (void) | @@ -1349,8 +1349,7 @@ void op_mtc0_status (void) | ||
| 1349 | uint32_t val, old; | 1349 | uint32_t val, old; |
| 1350 | uint32_t mask = env->Status_rw_bitmask; | 1350 | uint32_t mask = env->Status_rw_bitmask; |
| 1351 | 1351 | ||
| 1352 | - /* No reverse endianness, no MDMX/DSP, no 64bit ops | ||
| 1353 | - implemented. */ | 1352 | + /* No reverse endianness, no MDMX/DSP implemented. */ |
| 1354 | val = T0 & mask; | 1353 | val = T0 & mask; |
| 1355 | old = env->CP0_Status; | 1354 | old = env->CP0_Status; |
| 1356 | if (!(val & (1 << CP0St_EXL)) && | 1355 | if (!(val & (1 << CP0St_EXL)) && |
| @@ -1364,6 +1363,14 @@ void op_mtc0_status (void) | @@ -1364,6 +1363,14 @@ void op_mtc0_status (void) | ||
| 1364 | !(val & (1 << CP0St_UX))) | 1363 | !(val & (1 << CP0St_UX))) |
| 1365 | env->hflags &= ~MIPS_HFLAG_64; | 1364 | env->hflags &= ~MIPS_HFLAG_64; |
| 1366 | #endif | 1365 | #endif |
| 1366 | + if (val & (1 << CP0St_CU1)) | ||
| 1367 | + env->hflags |= MIPS_HFLAG_FPU; | ||
| 1368 | + else | ||
| 1369 | + env->hflags &= ~MIPS_HFLAG_FPU; | ||
| 1370 | + if (val & (1 << CP0St_FR)) | ||
| 1371 | + env->hflags |= MIPS_HFLAG_F64; | ||
| 1372 | + else | ||
| 1373 | + env->hflags &= ~MIPS_HFLAG_F64; | ||
| 1367 | env->CP0_Status = (env->CP0_Status & ~mask) | val; | 1374 | env->CP0_Status = (env->CP0_Status & ~mask) | val; |
| 1368 | if (loglevel & CPU_LOG_EXEC) | 1375 | if (loglevel & CPU_LOG_EXEC) |
| 1369 | CALL_FROM_TB2(do_mtc0_status_debug, old, val); | 1376 | CALL_FROM_TB2(do_mtc0_status_debug, old, val); |
| @@ -1606,41 +1613,6 @@ void op_cp0_enabled(void) | @@ -1606,41 +1613,6 @@ void op_cp0_enabled(void) | ||
| 1606 | RETURN(); | 1613 | RETURN(); |
| 1607 | } | 1614 | } |
| 1608 | 1615 | ||
| 1609 | -void op_cp1_enabled(void) | ||
| 1610 | -{ | ||
| 1611 | - if (!(env->CP0_Status & (1 << CP0St_CU1))) { | ||
| 1612 | - CALL_FROM_TB2(do_raise_exception_err, EXCP_CpU, 1); | ||
| 1613 | - } | ||
| 1614 | - RETURN(); | ||
| 1615 | -} | ||
| 1616 | - | ||
| 1617 | -void op_cp1_64bitmode(void) | ||
| 1618 | -{ | ||
| 1619 | - if (!(env->CP0_Status & (1 << CP0St_FR))) { | ||
| 1620 | - CALL_FROM_TB1(do_raise_exception, EXCP_RI); | ||
| 1621 | - } | ||
| 1622 | - RETURN(); | ||
| 1623 | -} | ||
| 1624 | - | ||
| 1625 | -/* | ||
| 1626 | - * Verify if floating point register is valid; an operation is not defined | ||
| 1627 | - * if bit 0 of any register specification is set and the FR bit in the | ||
| 1628 | - * Status register equals zero, since the register numbers specify an | ||
| 1629 | - * even-odd pair of adjacent coprocessor general registers. When the FR bit | ||
| 1630 | - * in the Status register equals one, both even and odd register numbers | ||
| 1631 | - * are valid. This limitation exists only for 64 bit wide (d,l,ps) registers. | ||
| 1632 | - * | ||
| 1633 | - * Multiple 64 bit wide registers can be checked by calling | ||
| 1634 | - * gen_op_cp1_registers(freg1 | freg2 | ... | fregN); | ||
| 1635 | - */ | ||
| 1636 | -void op_cp1_registers(void) | ||
| 1637 | -{ | ||
| 1638 | - if (!(env->CP0_Status & (1 << CP0St_FR)) && (PARAM1 & 1)) { | ||
| 1639 | - CALL_FROM_TB1(do_raise_exception, EXCP_RI); | ||
| 1640 | - } | ||
| 1641 | - RETURN(); | ||
| 1642 | -} | ||
| 1643 | - | ||
| 1644 | void op_cfc1 (void) | 1616 | void op_cfc1 (void) |
| 1645 | { | 1617 | { |
| 1646 | switch (T1) { | 1618 | switch (T1) { |
target-mips/translate.c
| @@ -703,6 +703,35 @@ static inline void generate_exception (DisasContext *ctx, int excp) | @@ -703,6 +703,35 @@ static inline void generate_exception (DisasContext *ctx, int excp) | ||
| 703 | generate_exception_err (ctx, excp, 0); | 703 | generate_exception_err (ctx, excp, 0); |
| 704 | } | 704 | } |
| 705 | 705 | ||
| 706 | +static inline void check_cp1_enabled(DisasContext *ctx) | ||
| 707 | +{ | ||
| 708 | + if (!(ctx->hflags & MIPS_HFLAG_FPU)) | ||
| 709 | + generate_exception_err(ctx, EXCP_CpU, 1); | ||
| 710 | +} | ||
| 711 | + | ||
| 712 | +static inline void check_cp1_64bitmode(DisasContext *ctx) | ||
| 713 | +{ | ||
| 714 | + if (!(ctx->hflags & MIPS_HFLAG_F64)) | ||
| 715 | + generate_exception(ctx, EXCP_RI); | ||
| 716 | +} | ||
| 717 | + | ||
| 718 | +/* | ||
| 719 | + * Verify if floating point register is valid; an operation is not defined | ||
| 720 | + * if bit 0 of any register specification is set and the FR bit in the | ||
| 721 | + * Status register equals zero, since the register numbers specify an | ||
| 722 | + * even-odd pair of adjacent coprocessor general registers. When the FR bit | ||
| 723 | + * in the Status register equals one, both even and odd register numbers | ||
| 724 | + * are valid. This limitation exists only for 64 bit wide (d,l,ps) registers. | ||
| 725 | + * | ||
| 726 | + * Multiple 64 bit wide registers can be checked by calling | ||
| 727 | + * gen_op_cp1_registers(freg1 | freg2 | ... | fregN); | ||
| 728 | + */ | ||
| 729 | +void check_cp1_registers(DisasContext *ctx, int regs) | ||
| 730 | +{ | ||
| 731 | + if (!(ctx->hflags & MIPS_HFLAG_F64) && (regs & 1)) | ||
| 732 | + generate_exception(ctx, EXCP_RI); | ||
| 733 | +} | ||
| 734 | + | ||
| 706 | #if defined(CONFIG_USER_ONLY) | 735 | #if defined(CONFIG_USER_ONLY) |
| 707 | #define op_ldst(name) gen_op_##name##_raw() | 736 | #define op_ldst(name) gen_op_##name##_raw() |
| 708 | #define OP_LD_TABLE(width) | 737 | #define OP_LD_TABLE(width) |
| @@ -4243,8 +4272,8 @@ GEN_MOVCF(s); | @@ -4243,8 +4272,8 @@ GEN_MOVCF(s); | ||
| 4243 | GEN_MOVCF(ps); | 4272 | GEN_MOVCF(ps); |
| 4244 | #undef GEN_MOVCF | 4273 | #undef GEN_MOVCF |
| 4245 | 4274 | ||
| 4246 | -static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4247 | - int fs, int fd, int cc) | 4275 | +static void gen_farith (DisasContext *ctx, uint32_t op1, |
| 4276 | + int ft, int fs, int fd, int cc) | ||
| 4248 | { | 4277 | { |
| 4249 | const char *opn = "farith"; | 4278 | const char *opn = "farith"; |
| 4250 | const char *condnames[] = { | 4279 | const char *condnames[] = { |
| @@ -4344,28 +4373,28 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4344,28 +4373,28 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4344 | opn = "neg.s"; | 4373 | opn = "neg.s"; |
| 4345 | break; | 4374 | break; |
| 4346 | case FOP(8, 16): | 4375 | case FOP(8, 16): |
| 4347 | - gen_op_cp1_64bitmode(); | 4376 | + check_cp1_64bitmode(ctx); |
| 4348 | GEN_LOAD_FREG_FTN(WT0, fs); | 4377 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4349 | gen_op_float_roundl_s(); | 4378 | gen_op_float_roundl_s(); |
| 4350 | GEN_STORE_FTN_FREG(fd, DT2); | 4379 | GEN_STORE_FTN_FREG(fd, DT2); |
| 4351 | opn = "round.l.s"; | 4380 | opn = "round.l.s"; |
| 4352 | break; | 4381 | break; |
| 4353 | case FOP(9, 16): | 4382 | case FOP(9, 16): |
| 4354 | - gen_op_cp1_64bitmode(); | 4383 | + check_cp1_64bitmode(ctx); |
| 4355 | GEN_LOAD_FREG_FTN(WT0, fs); | 4384 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4356 | gen_op_float_truncl_s(); | 4385 | gen_op_float_truncl_s(); |
| 4357 | GEN_STORE_FTN_FREG(fd, DT2); | 4386 | GEN_STORE_FTN_FREG(fd, DT2); |
| 4358 | opn = "trunc.l.s"; | 4387 | opn = "trunc.l.s"; |
| 4359 | break; | 4388 | break; |
| 4360 | case FOP(10, 16): | 4389 | case FOP(10, 16): |
| 4361 | - gen_op_cp1_64bitmode(); | 4390 | + check_cp1_64bitmode(ctx); |
| 4362 | GEN_LOAD_FREG_FTN(WT0, fs); | 4391 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4363 | gen_op_float_ceill_s(); | 4392 | gen_op_float_ceill_s(); |
| 4364 | GEN_STORE_FTN_FREG(fd, DT2); | 4393 | GEN_STORE_FTN_FREG(fd, DT2); |
| 4365 | opn = "ceil.l.s"; | 4394 | opn = "ceil.l.s"; |
| 4366 | break; | 4395 | break; |
| 4367 | case FOP(11, 16): | 4396 | case FOP(11, 16): |
| 4368 | - gen_op_cp1_64bitmode(); | 4397 | + check_cp1_64bitmode(ctx); |
| 4369 | GEN_LOAD_FREG_FTN(WT0, fs); | 4398 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4370 | gen_op_float_floorl_s(); | 4399 | gen_op_float_floorl_s(); |
| 4371 | GEN_STORE_FTN_FREG(fd, DT2); | 4400 | GEN_STORE_FTN_FREG(fd, DT2); |
| @@ -4432,7 +4461,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4432,7 +4461,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4432 | opn = "rsqrt.s"; | 4461 | opn = "rsqrt.s"; |
| 4433 | break; | 4462 | break; |
| 4434 | case FOP(28, 16): | 4463 | case FOP(28, 16): |
| 4435 | - gen_op_cp1_64bitmode(); | 4464 | + check_cp1_64bitmode(ctx); |
| 4436 | GEN_LOAD_FREG_FTN(WT0, fs); | 4465 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4437 | GEN_LOAD_FREG_FTN(WT2, fd); | 4466 | GEN_LOAD_FREG_FTN(WT2, fd); |
| 4438 | gen_op_float_recip2_s(); | 4467 | gen_op_float_recip2_s(); |
| @@ -4440,21 +4469,21 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4440,21 +4469,21 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4440 | opn = "recip2.s"; | 4469 | opn = "recip2.s"; |
| 4441 | break; | 4470 | break; |
| 4442 | case FOP(29, 16): | 4471 | case FOP(29, 16): |
| 4443 | - gen_op_cp1_64bitmode(); | 4472 | + check_cp1_64bitmode(ctx); |
| 4444 | GEN_LOAD_FREG_FTN(WT0, fs); | 4473 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4445 | gen_op_float_recip1_s(); | 4474 | gen_op_float_recip1_s(); |
| 4446 | GEN_STORE_FTN_FREG(fd, WT2); | 4475 | GEN_STORE_FTN_FREG(fd, WT2); |
| 4447 | opn = "recip1.s"; | 4476 | opn = "recip1.s"; |
| 4448 | break; | 4477 | break; |
| 4449 | case FOP(30, 16): | 4478 | case FOP(30, 16): |
| 4450 | - gen_op_cp1_64bitmode(); | 4479 | + check_cp1_64bitmode(ctx); |
| 4451 | GEN_LOAD_FREG_FTN(WT0, fs); | 4480 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4452 | gen_op_float_rsqrt1_s(); | 4481 | gen_op_float_rsqrt1_s(); |
| 4453 | GEN_STORE_FTN_FREG(fd, WT2); | 4482 | GEN_STORE_FTN_FREG(fd, WT2); |
| 4454 | opn = "rsqrt1.s"; | 4483 | opn = "rsqrt1.s"; |
| 4455 | break; | 4484 | break; |
| 4456 | case FOP(31, 16): | 4485 | case FOP(31, 16): |
| 4457 | - gen_op_cp1_64bitmode(); | 4486 | + check_cp1_64bitmode(ctx); |
| 4458 | GEN_LOAD_FREG_FTN(WT0, fs); | 4487 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4459 | GEN_LOAD_FREG_FTN(WT2, fd); | 4488 | GEN_LOAD_FREG_FTN(WT2, fd); |
| 4460 | gen_op_float_rsqrt2_s(); | 4489 | gen_op_float_rsqrt2_s(); |
| @@ -4462,7 +4491,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4462,7 +4491,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4462 | opn = "rsqrt2.s"; | 4491 | opn = "rsqrt2.s"; |
| 4463 | break; | 4492 | break; |
| 4464 | case FOP(33, 16): | 4493 | case FOP(33, 16): |
| 4465 | - gen_op_cp1_registers(fd); | 4494 | + check_cp1_registers(ctx, fd); |
| 4466 | GEN_LOAD_FREG_FTN(WT0, fs); | 4495 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4467 | gen_op_float_cvtd_s(); | 4496 | gen_op_float_cvtd_s(); |
| 4468 | GEN_STORE_FTN_FREG(fd, DT2); | 4497 | GEN_STORE_FTN_FREG(fd, DT2); |
| @@ -4475,14 +4504,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4475,14 +4504,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4475 | opn = "cvt.w.s"; | 4504 | opn = "cvt.w.s"; |
| 4476 | break; | 4505 | break; |
| 4477 | case FOP(37, 16): | 4506 | case FOP(37, 16): |
| 4478 | - gen_op_cp1_64bitmode(); | 4507 | + check_cp1_64bitmode(ctx); |
| 4479 | GEN_LOAD_FREG_FTN(WT0, fs); | 4508 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4480 | gen_op_float_cvtl_s(); | 4509 | gen_op_float_cvtl_s(); |
| 4481 | GEN_STORE_FTN_FREG(fd, DT2); | 4510 | GEN_STORE_FTN_FREG(fd, DT2); |
| 4482 | opn = "cvt.l.s"; | 4511 | opn = "cvt.l.s"; |
| 4483 | break; | 4512 | break; |
| 4484 | case FOP(38, 16): | 4513 | case FOP(38, 16): |
| 4485 | - gen_op_cp1_64bitmode(); | 4514 | + check_cp1_64bitmode(ctx); |
| 4486 | GEN_LOAD_FREG_FTN(WT1, fs); | 4515 | GEN_LOAD_FREG_FTN(WT1, fs); |
| 4487 | GEN_LOAD_FREG_FTN(WT0, ft); | 4516 | GEN_LOAD_FREG_FTN(WT0, ft); |
| 4488 | gen_op_float_cvtps_s(); | 4517 | gen_op_float_cvtps_s(); |
| @@ -4508,7 +4537,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4508,7 +4537,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4508 | GEN_LOAD_FREG_FTN(WT0, fs); | 4537 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4509 | GEN_LOAD_FREG_FTN(WT1, ft); | 4538 | GEN_LOAD_FREG_FTN(WT1, ft); |
| 4510 | if (ctx->opcode & (1 << 6)) { | 4539 | if (ctx->opcode & (1 << 6)) { |
| 4511 | - gen_op_cp1_64bitmode(); | 4540 | + check_cp1_64bitmode(ctx); |
| 4512 | gen_cmpabs_s(func-48, cc); | 4541 | gen_cmpabs_s(func-48, cc); |
| 4513 | opn = condnames_abs[func-48]; | 4542 | opn = condnames_abs[func-48]; |
| 4514 | } else { | 4543 | } else { |
| @@ -4517,7 +4546,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4517,7 +4546,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4517 | } | 4546 | } |
| 4518 | break; | 4547 | break; |
| 4519 | case FOP(0, 17): | 4548 | case FOP(0, 17): |
| 4520 | - gen_op_cp1_registers(fs | ft | fd); | 4549 | + check_cp1_registers(ctx, fs | ft | fd); |
| 4521 | GEN_LOAD_FREG_FTN(DT0, fs); | 4550 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4522 | GEN_LOAD_FREG_FTN(DT1, ft); | 4551 | GEN_LOAD_FREG_FTN(DT1, ft); |
| 4523 | gen_op_float_add_d(); | 4552 | gen_op_float_add_d(); |
| @@ -4526,7 +4555,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4526,7 +4555,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4526 | optype = BINOP; | 4555 | optype = BINOP; |
| 4527 | break; | 4556 | break; |
| 4528 | case FOP(1, 17): | 4557 | case FOP(1, 17): |
| 4529 | - gen_op_cp1_registers(fs | ft | fd); | 4558 | + check_cp1_registers(ctx, fs | ft | fd); |
| 4530 | GEN_LOAD_FREG_FTN(DT0, fs); | 4559 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4531 | GEN_LOAD_FREG_FTN(DT1, ft); | 4560 | GEN_LOAD_FREG_FTN(DT1, ft); |
| 4532 | gen_op_float_sub_d(); | 4561 | gen_op_float_sub_d(); |
| @@ -4535,7 +4564,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4535,7 +4564,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4535 | optype = BINOP; | 4564 | optype = BINOP; |
| 4536 | break; | 4565 | break; |
| 4537 | case FOP(2, 17): | 4566 | case FOP(2, 17): |
| 4538 | - gen_op_cp1_registers(fs | ft | fd); | 4567 | + check_cp1_registers(ctx, fs | ft | fd); |
| 4539 | GEN_LOAD_FREG_FTN(DT0, fs); | 4568 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4540 | GEN_LOAD_FREG_FTN(DT1, ft); | 4569 | GEN_LOAD_FREG_FTN(DT1, ft); |
| 4541 | gen_op_float_mul_d(); | 4570 | gen_op_float_mul_d(); |
| @@ -4544,7 +4573,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4544,7 +4573,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4544 | optype = BINOP; | 4573 | optype = BINOP; |
| 4545 | break; | 4574 | break; |
| 4546 | case FOP(3, 17): | 4575 | case FOP(3, 17): |
| 4547 | - gen_op_cp1_registers(fs | ft | fd); | 4576 | + check_cp1_registers(ctx, fs | ft | fd); |
| 4548 | GEN_LOAD_FREG_FTN(DT0, fs); | 4577 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4549 | GEN_LOAD_FREG_FTN(DT1, ft); | 4578 | GEN_LOAD_FREG_FTN(DT1, ft); |
| 4550 | gen_op_float_div_d(); | 4579 | gen_op_float_div_d(); |
| @@ -4553,84 +4582,84 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4553,84 +4582,84 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4553 | optype = BINOP; | 4582 | optype = BINOP; |
| 4554 | break; | 4583 | break; |
| 4555 | case FOP(4, 17): | 4584 | case FOP(4, 17): |
| 4556 | - gen_op_cp1_registers(fs | fd); | 4585 | + check_cp1_registers(ctx, fs | fd); |
| 4557 | GEN_LOAD_FREG_FTN(DT0, fs); | 4586 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4558 | gen_op_float_sqrt_d(); | 4587 | gen_op_float_sqrt_d(); |
| 4559 | GEN_STORE_FTN_FREG(fd, DT2); | 4588 | GEN_STORE_FTN_FREG(fd, DT2); |
| 4560 | opn = "sqrt.d"; | 4589 | opn = "sqrt.d"; |
| 4561 | break; | 4590 | break; |
| 4562 | case FOP(5, 17): | 4591 | case FOP(5, 17): |
| 4563 | - gen_op_cp1_registers(fs | fd); | 4592 | + check_cp1_registers(ctx, fs | fd); |
| 4564 | GEN_LOAD_FREG_FTN(DT0, fs); | 4593 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4565 | gen_op_float_abs_d(); | 4594 | gen_op_float_abs_d(); |
| 4566 | GEN_STORE_FTN_FREG(fd, DT2); | 4595 | GEN_STORE_FTN_FREG(fd, DT2); |
| 4567 | opn = "abs.d"; | 4596 | opn = "abs.d"; |
| 4568 | break; | 4597 | break; |
| 4569 | case FOP(6, 17): | 4598 | case FOP(6, 17): |
| 4570 | - gen_op_cp1_registers(fs | fd); | 4599 | + check_cp1_registers(ctx, fs | fd); |
| 4571 | GEN_LOAD_FREG_FTN(DT0, fs); | 4600 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4572 | gen_op_float_mov_d(); | 4601 | gen_op_float_mov_d(); |
| 4573 | GEN_STORE_FTN_FREG(fd, DT2); | 4602 | GEN_STORE_FTN_FREG(fd, DT2); |
| 4574 | opn = "mov.d"; | 4603 | opn = "mov.d"; |
| 4575 | break; | 4604 | break; |
| 4576 | case FOP(7, 17): | 4605 | case FOP(7, 17): |
| 4577 | - gen_op_cp1_registers(fs | fd); | 4606 | + check_cp1_registers(ctx, fs | fd); |
| 4578 | GEN_LOAD_FREG_FTN(DT0, fs); | 4607 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4579 | gen_op_float_chs_d(); | 4608 | gen_op_float_chs_d(); |
| 4580 | GEN_STORE_FTN_FREG(fd, DT2); | 4609 | GEN_STORE_FTN_FREG(fd, DT2); |
| 4581 | opn = "neg.d"; | 4610 | opn = "neg.d"; |
| 4582 | break; | 4611 | break; |
| 4583 | case FOP(8, 17): | 4612 | case FOP(8, 17): |
| 4584 | - gen_op_cp1_64bitmode(); | 4613 | + check_cp1_64bitmode(ctx); |
| 4585 | GEN_LOAD_FREG_FTN(DT0, fs); | 4614 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4586 | gen_op_float_roundl_d(); | 4615 | gen_op_float_roundl_d(); |
| 4587 | GEN_STORE_FTN_FREG(fd, DT2); | 4616 | GEN_STORE_FTN_FREG(fd, DT2); |
| 4588 | opn = "round.l.d"; | 4617 | opn = "round.l.d"; |
| 4589 | break; | 4618 | break; |
| 4590 | case FOP(9, 17): | 4619 | case FOP(9, 17): |
| 4591 | - gen_op_cp1_64bitmode(); | 4620 | + check_cp1_64bitmode(ctx); |
| 4592 | GEN_LOAD_FREG_FTN(DT0, fs); | 4621 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4593 | gen_op_float_truncl_d(); | 4622 | gen_op_float_truncl_d(); |
| 4594 | GEN_STORE_FTN_FREG(fd, DT2); | 4623 | GEN_STORE_FTN_FREG(fd, DT2); |
| 4595 | opn = "trunc.l.d"; | 4624 | opn = "trunc.l.d"; |
| 4596 | break; | 4625 | break; |
| 4597 | case FOP(10, 17): | 4626 | case FOP(10, 17): |
| 4598 | - gen_op_cp1_64bitmode(); | 4627 | + check_cp1_64bitmode(ctx); |
| 4599 | GEN_LOAD_FREG_FTN(DT0, fs); | 4628 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4600 | gen_op_float_ceill_d(); | 4629 | gen_op_float_ceill_d(); |
| 4601 | GEN_STORE_FTN_FREG(fd, DT2); | 4630 | GEN_STORE_FTN_FREG(fd, DT2); |
| 4602 | opn = "ceil.l.d"; | 4631 | opn = "ceil.l.d"; |
| 4603 | break; | 4632 | break; |
| 4604 | case FOP(11, 17): | 4633 | case FOP(11, 17): |
| 4605 | - gen_op_cp1_64bitmode(); | 4634 | + check_cp1_64bitmode(ctx); |
| 4606 | GEN_LOAD_FREG_FTN(DT0, fs); | 4635 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4607 | gen_op_float_floorl_d(); | 4636 | gen_op_float_floorl_d(); |
| 4608 | GEN_STORE_FTN_FREG(fd, DT2); | 4637 | GEN_STORE_FTN_FREG(fd, DT2); |
| 4609 | opn = "floor.l.d"; | 4638 | opn = "floor.l.d"; |
| 4610 | break; | 4639 | break; |
| 4611 | case FOP(12, 17): | 4640 | case FOP(12, 17): |
| 4612 | - gen_op_cp1_registers(fs); | 4641 | + check_cp1_registers(ctx, fs); |
| 4613 | GEN_LOAD_FREG_FTN(DT0, fs); | 4642 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4614 | gen_op_float_roundw_d(); | 4643 | gen_op_float_roundw_d(); |
| 4615 | GEN_STORE_FTN_FREG(fd, WT2); | 4644 | GEN_STORE_FTN_FREG(fd, WT2); |
| 4616 | opn = "round.w.d"; | 4645 | opn = "round.w.d"; |
| 4617 | break; | 4646 | break; |
| 4618 | case FOP(13, 17): | 4647 | case FOP(13, 17): |
| 4619 | - gen_op_cp1_registers(fs); | 4648 | + check_cp1_registers(ctx, fs); |
| 4620 | GEN_LOAD_FREG_FTN(DT0, fs); | 4649 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4621 | gen_op_float_truncw_d(); | 4650 | gen_op_float_truncw_d(); |
| 4622 | GEN_STORE_FTN_FREG(fd, WT2); | 4651 | GEN_STORE_FTN_FREG(fd, WT2); |
| 4623 | opn = "trunc.w.d"; | 4652 | opn = "trunc.w.d"; |
| 4624 | break; | 4653 | break; |
| 4625 | case FOP(14, 17): | 4654 | case FOP(14, 17): |
| 4626 | - gen_op_cp1_registers(fs); | 4655 | + check_cp1_registers(ctx, fs); |
| 4627 | GEN_LOAD_FREG_FTN(DT0, fs); | 4656 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4628 | gen_op_float_ceilw_d(); | 4657 | gen_op_float_ceilw_d(); |
| 4629 | GEN_STORE_FTN_FREG(fd, WT2); | 4658 | GEN_STORE_FTN_FREG(fd, WT2); |
| 4630 | opn = "ceil.w.d"; | 4659 | opn = "ceil.w.d"; |
| 4631 | break; | 4660 | break; |
| 4632 | case FOP(15, 17): | 4661 | case FOP(15, 17): |
| 4633 | - gen_op_cp1_registers(fs); | 4662 | + check_cp1_registers(ctx, fs); |
| 4634 | GEN_LOAD_FREG_FTN(DT0, fs); | 4663 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4635 | gen_op_float_floorw_d(); | 4664 | gen_op_float_floorw_d(); |
| 4636 | GEN_STORE_FTN_FREG(fd, WT2); | 4665 | GEN_STORE_FTN_FREG(fd, WT2); |
| @@ -4661,21 +4690,21 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4661,21 +4690,21 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4661 | opn = "movn.d"; | 4690 | opn = "movn.d"; |
| 4662 | break; | 4691 | break; |
| 4663 | case FOP(21, 17): | 4692 | case FOP(21, 17): |
| 4664 | - gen_op_cp1_registers(fs | fd); | 4693 | + check_cp1_registers(ctx, fs | fd); |
| 4665 | GEN_LOAD_FREG_FTN(DT0, fs); | 4694 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4666 | gen_op_float_recip_d(); | 4695 | gen_op_float_recip_d(); |
| 4667 | GEN_STORE_FTN_FREG(fd, DT2); | 4696 | GEN_STORE_FTN_FREG(fd, DT2); |
| 4668 | opn = "recip.d"; | 4697 | opn = "recip.d"; |
| 4669 | break; | 4698 | break; |
| 4670 | case FOP(22, 17): | 4699 | case FOP(22, 17): |
| 4671 | - gen_op_cp1_registers(fs | fd); | 4700 | + check_cp1_registers(ctx, fs | fd); |
| 4672 | GEN_LOAD_FREG_FTN(DT0, fs); | 4701 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4673 | gen_op_float_rsqrt_d(); | 4702 | gen_op_float_rsqrt_d(); |
| 4674 | GEN_STORE_FTN_FREG(fd, DT2); | 4703 | GEN_STORE_FTN_FREG(fd, DT2); |
| 4675 | opn = "rsqrt.d"; | 4704 | opn = "rsqrt.d"; |
| 4676 | break; | 4705 | break; |
| 4677 | case FOP(28, 17): | 4706 | case FOP(28, 17): |
| 4678 | - gen_op_cp1_64bitmode(); | 4707 | + check_cp1_64bitmode(ctx); |
| 4679 | GEN_LOAD_FREG_FTN(DT0, fs); | 4708 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4680 | GEN_LOAD_FREG_FTN(DT2, ft); | 4709 | GEN_LOAD_FREG_FTN(DT2, ft); |
| 4681 | gen_op_float_recip2_d(); | 4710 | gen_op_float_recip2_d(); |
| @@ -4683,21 +4712,21 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4683,21 +4712,21 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4683 | opn = "recip2.d"; | 4712 | opn = "recip2.d"; |
| 4684 | break; | 4713 | break; |
| 4685 | case FOP(29, 17): | 4714 | case FOP(29, 17): |
| 4686 | - gen_op_cp1_64bitmode(); | 4715 | + check_cp1_64bitmode(ctx); |
| 4687 | GEN_LOAD_FREG_FTN(DT0, fs); | 4716 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4688 | gen_op_float_recip1_d(); | 4717 | gen_op_float_recip1_d(); |
| 4689 | GEN_STORE_FTN_FREG(fd, DT2); | 4718 | GEN_STORE_FTN_FREG(fd, DT2); |
| 4690 | opn = "recip1.d"; | 4719 | opn = "recip1.d"; |
| 4691 | break; | 4720 | break; |
| 4692 | case FOP(30, 17): | 4721 | case FOP(30, 17): |
| 4693 | - gen_op_cp1_64bitmode(); | 4722 | + check_cp1_64bitmode(ctx); |
| 4694 | GEN_LOAD_FREG_FTN(DT0, fs); | 4723 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4695 | gen_op_float_rsqrt1_d(); | 4724 | gen_op_float_rsqrt1_d(); |
| 4696 | GEN_STORE_FTN_FREG(fd, DT2); | 4725 | GEN_STORE_FTN_FREG(fd, DT2); |
| 4697 | opn = "rsqrt1.d"; | 4726 | opn = "rsqrt1.d"; |
| 4698 | break; | 4727 | break; |
| 4699 | case FOP(31, 17): | 4728 | case FOP(31, 17): |
| 4700 | - gen_op_cp1_64bitmode(); | 4729 | + check_cp1_64bitmode(ctx); |
| 4701 | GEN_LOAD_FREG_FTN(DT0, fs); | 4730 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4702 | GEN_LOAD_FREG_FTN(DT2, ft); | 4731 | GEN_LOAD_FREG_FTN(DT2, ft); |
| 4703 | gen_op_float_rsqrt2_d(); | 4732 | gen_op_float_rsqrt2_d(); |
| @@ -4723,31 +4752,31 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4723,31 +4752,31 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4723 | GEN_LOAD_FREG_FTN(DT0, fs); | 4752 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4724 | GEN_LOAD_FREG_FTN(DT1, ft); | 4753 | GEN_LOAD_FREG_FTN(DT1, ft); |
| 4725 | if (ctx->opcode & (1 << 6)) { | 4754 | if (ctx->opcode & (1 << 6)) { |
| 4726 | - gen_op_cp1_64bitmode(); | 4755 | + check_cp1_64bitmode(ctx); |
| 4727 | gen_cmpabs_d(func-48, cc); | 4756 | gen_cmpabs_d(func-48, cc); |
| 4728 | opn = condnames_abs[func-48]; | 4757 | opn = condnames_abs[func-48]; |
| 4729 | } else { | 4758 | } else { |
| 4730 | - gen_op_cp1_registers(fs | ft); | 4759 | + check_cp1_registers(ctx, fs | ft); |
| 4731 | gen_cmp_d(func-48, cc); | 4760 | gen_cmp_d(func-48, cc); |
| 4732 | opn = condnames[func-48]; | 4761 | opn = condnames[func-48]; |
| 4733 | } | 4762 | } |
| 4734 | break; | 4763 | break; |
| 4735 | case FOP(32, 17): | 4764 | case FOP(32, 17): |
| 4736 | - gen_op_cp1_registers(fs); | 4765 | + check_cp1_registers(ctx, fs); |
| 4737 | GEN_LOAD_FREG_FTN(DT0, fs); | 4766 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4738 | gen_op_float_cvts_d(); | 4767 | gen_op_float_cvts_d(); |
| 4739 | GEN_STORE_FTN_FREG(fd, WT2); | 4768 | GEN_STORE_FTN_FREG(fd, WT2); |
| 4740 | opn = "cvt.s.d"; | 4769 | opn = "cvt.s.d"; |
| 4741 | break; | 4770 | break; |
| 4742 | case FOP(36, 17): | 4771 | case FOP(36, 17): |
| 4743 | - gen_op_cp1_registers(fs); | 4772 | + check_cp1_registers(ctx, fs); |
| 4744 | GEN_LOAD_FREG_FTN(DT0, fs); | 4773 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4745 | gen_op_float_cvtw_d(); | 4774 | gen_op_float_cvtw_d(); |
| 4746 | GEN_STORE_FTN_FREG(fd, WT2); | 4775 | GEN_STORE_FTN_FREG(fd, WT2); |
| 4747 | opn = "cvt.w.d"; | 4776 | opn = "cvt.w.d"; |
| 4748 | break; | 4777 | break; |
| 4749 | case FOP(37, 17): | 4778 | case FOP(37, 17): |
| 4750 | - gen_op_cp1_64bitmode(); | 4779 | + check_cp1_64bitmode(ctx); |
| 4751 | GEN_LOAD_FREG_FTN(DT0, fs); | 4780 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4752 | gen_op_float_cvtl_d(); | 4781 | gen_op_float_cvtl_d(); |
| 4753 | GEN_STORE_FTN_FREG(fd, DT2); | 4782 | GEN_STORE_FTN_FREG(fd, DT2); |
| @@ -4760,21 +4789,21 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4760,21 +4789,21 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4760 | opn = "cvt.s.w"; | 4789 | opn = "cvt.s.w"; |
| 4761 | break; | 4790 | break; |
| 4762 | case FOP(33, 20): | 4791 | case FOP(33, 20): |
| 4763 | - gen_op_cp1_registers(fd); | 4792 | + check_cp1_registers(ctx, fd); |
| 4764 | GEN_LOAD_FREG_FTN(WT0, fs); | 4793 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4765 | gen_op_float_cvtd_w(); | 4794 | gen_op_float_cvtd_w(); |
| 4766 | GEN_STORE_FTN_FREG(fd, DT2); | 4795 | GEN_STORE_FTN_FREG(fd, DT2); |
| 4767 | opn = "cvt.d.w"; | 4796 | opn = "cvt.d.w"; |
| 4768 | break; | 4797 | break; |
| 4769 | case FOP(32, 21): | 4798 | case FOP(32, 21): |
| 4770 | - gen_op_cp1_64bitmode(); | 4799 | + check_cp1_64bitmode(ctx); |
| 4771 | GEN_LOAD_FREG_FTN(DT0, fs); | 4800 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4772 | gen_op_float_cvts_l(); | 4801 | gen_op_float_cvts_l(); |
| 4773 | GEN_STORE_FTN_FREG(fd, WT2); | 4802 | GEN_STORE_FTN_FREG(fd, WT2); |
| 4774 | opn = "cvt.s.l"; | 4803 | opn = "cvt.s.l"; |
| 4775 | break; | 4804 | break; |
| 4776 | case FOP(33, 21): | 4805 | case FOP(33, 21): |
| 4777 | - gen_op_cp1_64bitmode(); | 4806 | + check_cp1_64bitmode(ctx); |
| 4778 | GEN_LOAD_FREG_FTN(DT0, fs); | 4807 | GEN_LOAD_FREG_FTN(DT0, fs); |
| 4779 | gen_op_float_cvtd_l(); | 4808 | gen_op_float_cvtd_l(); |
| 4780 | GEN_STORE_FTN_FREG(fd, DT2); | 4809 | GEN_STORE_FTN_FREG(fd, DT2); |
| @@ -4782,7 +4811,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4782,7 +4811,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4782 | break; | 4811 | break; |
| 4783 | case FOP(38, 20): | 4812 | case FOP(38, 20): |
| 4784 | case FOP(38, 21): | 4813 | case FOP(38, 21): |
| 4785 | - gen_op_cp1_64bitmode(); | 4814 | + check_cp1_64bitmode(ctx); |
| 4786 | GEN_LOAD_FREG_FTN(WT0, fs); | 4815 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4787 | GEN_LOAD_FREG_FTN(WTH0, fs); | 4816 | GEN_LOAD_FREG_FTN(WTH0, fs); |
| 4788 | gen_op_float_cvtps_pw(); | 4817 | gen_op_float_cvtps_pw(); |
| @@ -4791,7 +4820,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4791,7 +4820,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4791 | opn = "cvt.ps.pw"; | 4820 | opn = "cvt.ps.pw"; |
| 4792 | break; | 4821 | break; |
| 4793 | case FOP(0, 22): | 4822 | case FOP(0, 22): |
| 4794 | - gen_op_cp1_64bitmode(); | 4823 | + check_cp1_64bitmode(ctx); |
| 4795 | GEN_LOAD_FREG_FTN(WT0, fs); | 4824 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4796 | GEN_LOAD_FREG_FTN(WTH0, fs); | 4825 | GEN_LOAD_FREG_FTN(WTH0, fs); |
| 4797 | GEN_LOAD_FREG_FTN(WT1, ft); | 4826 | GEN_LOAD_FREG_FTN(WT1, ft); |
| @@ -4802,7 +4831,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4802,7 +4831,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4802 | opn = "add.ps"; | 4831 | opn = "add.ps"; |
| 4803 | break; | 4832 | break; |
| 4804 | case FOP(1, 22): | 4833 | case FOP(1, 22): |
| 4805 | - gen_op_cp1_64bitmode(); | 4834 | + check_cp1_64bitmode(ctx); |
| 4806 | GEN_LOAD_FREG_FTN(WT0, fs); | 4835 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4807 | GEN_LOAD_FREG_FTN(WTH0, fs); | 4836 | GEN_LOAD_FREG_FTN(WTH0, fs); |
| 4808 | GEN_LOAD_FREG_FTN(WT1, ft); | 4837 | GEN_LOAD_FREG_FTN(WT1, ft); |
| @@ -4813,7 +4842,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4813,7 +4842,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4813 | opn = "sub.ps"; | 4842 | opn = "sub.ps"; |
| 4814 | break; | 4843 | break; |
| 4815 | case FOP(2, 22): | 4844 | case FOP(2, 22): |
| 4816 | - gen_op_cp1_64bitmode(); | 4845 | + check_cp1_64bitmode(ctx); |
| 4817 | GEN_LOAD_FREG_FTN(WT0, fs); | 4846 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4818 | GEN_LOAD_FREG_FTN(WTH0, fs); | 4847 | GEN_LOAD_FREG_FTN(WTH0, fs); |
| 4819 | GEN_LOAD_FREG_FTN(WT1, ft); | 4848 | GEN_LOAD_FREG_FTN(WT1, ft); |
| @@ -4824,7 +4853,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4824,7 +4853,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4824 | opn = "mul.ps"; | 4853 | opn = "mul.ps"; |
| 4825 | break; | 4854 | break; |
| 4826 | case FOP(5, 22): | 4855 | case FOP(5, 22): |
| 4827 | - gen_op_cp1_64bitmode(); | 4856 | + check_cp1_64bitmode(ctx); |
| 4828 | GEN_LOAD_FREG_FTN(WT0, fs); | 4857 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4829 | GEN_LOAD_FREG_FTN(WTH0, fs); | 4858 | GEN_LOAD_FREG_FTN(WTH0, fs); |
| 4830 | gen_op_float_abs_ps(); | 4859 | gen_op_float_abs_ps(); |
| @@ -4833,7 +4862,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4833,7 +4862,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4833 | opn = "abs.ps"; | 4862 | opn = "abs.ps"; |
| 4834 | break; | 4863 | break; |
| 4835 | case FOP(6, 22): | 4864 | case FOP(6, 22): |
| 4836 | - gen_op_cp1_64bitmode(); | 4865 | + check_cp1_64bitmode(ctx); |
| 4837 | GEN_LOAD_FREG_FTN(WT0, fs); | 4866 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4838 | GEN_LOAD_FREG_FTN(WTH0, fs); | 4867 | GEN_LOAD_FREG_FTN(WTH0, fs); |
| 4839 | gen_op_float_mov_ps(); | 4868 | gen_op_float_mov_ps(); |
| @@ -4842,7 +4871,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4842,7 +4871,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4842 | opn = "mov.ps"; | 4871 | opn = "mov.ps"; |
| 4843 | break; | 4872 | break; |
| 4844 | case FOP(7, 22): | 4873 | case FOP(7, 22): |
| 4845 | - gen_op_cp1_64bitmode(); | 4874 | + check_cp1_64bitmode(ctx); |
| 4846 | GEN_LOAD_FREG_FTN(WT0, fs); | 4875 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4847 | GEN_LOAD_FREG_FTN(WTH0, fs); | 4876 | GEN_LOAD_FREG_FTN(WTH0, fs); |
| 4848 | gen_op_float_chs_ps(); | 4877 | gen_op_float_chs_ps(); |
| @@ -4851,7 +4880,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4851,7 +4880,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4851 | opn = "neg.ps"; | 4880 | opn = "neg.ps"; |
| 4852 | break; | 4881 | break; |
| 4853 | case FOP(17, 22): | 4882 | case FOP(17, 22): |
| 4854 | - gen_op_cp1_64bitmode(); | 4883 | + check_cp1_64bitmode(ctx); |
| 4855 | GEN_LOAD_REG_TN(T0, ft); | 4884 | GEN_LOAD_REG_TN(T0, ft); |
| 4856 | GEN_LOAD_FREG_FTN(WT0, fs); | 4885 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4857 | GEN_LOAD_FREG_FTN(WTH0, fs); | 4886 | GEN_LOAD_FREG_FTN(WTH0, fs); |
| @@ -4863,7 +4892,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4863,7 +4892,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4863 | opn = "movcf.ps"; | 4892 | opn = "movcf.ps"; |
| 4864 | break; | 4893 | break; |
| 4865 | case FOP(18, 22): | 4894 | case FOP(18, 22): |
| 4866 | - gen_op_cp1_64bitmode(); | 4895 | + check_cp1_64bitmode(ctx); |
| 4867 | GEN_LOAD_REG_TN(T0, ft); | 4896 | GEN_LOAD_REG_TN(T0, ft); |
| 4868 | GEN_LOAD_FREG_FTN(WT0, fs); | 4897 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4869 | GEN_LOAD_FREG_FTN(WTH0, fs); | 4898 | GEN_LOAD_FREG_FTN(WTH0, fs); |
| @@ -4875,7 +4904,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4875,7 +4904,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4875 | opn = "movz.ps"; | 4904 | opn = "movz.ps"; |
| 4876 | break; | 4905 | break; |
| 4877 | case FOP(19, 22): | 4906 | case FOP(19, 22): |
| 4878 | - gen_op_cp1_64bitmode(); | 4907 | + check_cp1_64bitmode(ctx); |
| 4879 | GEN_LOAD_REG_TN(T0, ft); | 4908 | GEN_LOAD_REG_TN(T0, ft); |
| 4880 | GEN_LOAD_FREG_FTN(WT0, fs); | 4909 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4881 | GEN_LOAD_FREG_FTN(WTH0, fs); | 4910 | GEN_LOAD_FREG_FTN(WTH0, fs); |
| @@ -4887,7 +4916,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4887,7 +4916,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4887 | opn = "movn.ps"; | 4916 | opn = "movn.ps"; |
| 4888 | break; | 4917 | break; |
| 4889 | case FOP(24, 22): | 4918 | case FOP(24, 22): |
| 4890 | - gen_op_cp1_64bitmode(); | 4919 | + check_cp1_64bitmode(ctx); |
| 4891 | GEN_LOAD_FREG_FTN(WT0, ft); | 4920 | GEN_LOAD_FREG_FTN(WT0, ft); |
| 4892 | GEN_LOAD_FREG_FTN(WTH0, ft); | 4921 | GEN_LOAD_FREG_FTN(WTH0, ft); |
| 4893 | GEN_LOAD_FREG_FTN(WT1, fs); | 4922 | GEN_LOAD_FREG_FTN(WT1, fs); |
| @@ -4898,7 +4927,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4898,7 +4927,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4898 | opn = "addr.ps"; | 4927 | opn = "addr.ps"; |
| 4899 | break; | 4928 | break; |
| 4900 | case FOP(26, 22): | 4929 | case FOP(26, 22): |
| 4901 | - gen_op_cp1_64bitmode(); | 4930 | + check_cp1_64bitmode(ctx); |
| 4902 | GEN_LOAD_FREG_FTN(WT0, ft); | 4931 | GEN_LOAD_FREG_FTN(WT0, ft); |
| 4903 | GEN_LOAD_FREG_FTN(WTH0, ft); | 4932 | GEN_LOAD_FREG_FTN(WTH0, ft); |
| 4904 | GEN_LOAD_FREG_FTN(WT1, fs); | 4933 | GEN_LOAD_FREG_FTN(WT1, fs); |
| @@ -4909,7 +4938,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4909,7 +4938,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4909 | opn = "mulr.ps"; | 4938 | opn = "mulr.ps"; |
| 4910 | break; | 4939 | break; |
| 4911 | case FOP(28, 22): | 4940 | case FOP(28, 22): |
| 4912 | - gen_op_cp1_64bitmode(); | 4941 | + check_cp1_64bitmode(ctx); |
| 4913 | GEN_LOAD_FREG_FTN(WT0, fs); | 4942 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4914 | GEN_LOAD_FREG_FTN(WTH0, fs); | 4943 | GEN_LOAD_FREG_FTN(WTH0, fs); |
| 4915 | GEN_LOAD_FREG_FTN(WT2, fd); | 4944 | GEN_LOAD_FREG_FTN(WT2, fd); |
| @@ -4920,7 +4949,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4920,7 +4949,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4920 | opn = "recip2.ps"; | 4949 | opn = "recip2.ps"; |
| 4921 | break; | 4950 | break; |
| 4922 | case FOP(29, 22): | 4951 | case FOP(29, 22): |
| 4923 | - gen_op_cp1_64bitmode(); | 4952 | + check_cp1_64bitmode(ctx); |
| 4924 | GEN_LOAD_FREG_FTN(WT0, fs); | 4953 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4925 | GEN_LOAD_FREG_FTN(WTH0, fs); | 4954 | GEN_LOAD_FREG_FTN(WTH0, fs); |
| 4926 | gen_op_float_recip1_ps(); | 4955 | gen_op_float_recip1_ps(); |
| @@ -4929,7 +4958,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4929,7 +4958,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4929 | opn = "recip1.ps"; | 4958 | opn = "recip1.ps"; |
| 4930 | break; | 4959 | break; |
| 4931 | case FOP(30, 22): | 4960 | case FOP(30, 22): |
| 4932 | - gen_op_cp1_64bitmode(); | 4961 | + check_cp1_64bitmode(ctx); |
| 4933 | GEN_LOAD_FREG_FTN(WT0, fs); | 4962 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4934 | GEN_LOAD_FREG_FTN(WTH0, fs); | 4963 | GEN_LOAD_FREG_FTN(WTH0, fs); |
| 4935 | gen_op_float_rsqrt1_ps(); | 4964 | gen_op_float_rsqrt1_ps(); |
| @@ -4938,7 +4967,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4938,7 +4967,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4938 | opn = "rsqrt1.ps"; | 4967 | opn = "rsqrt1.ps"; |
| 4939 | break; | 4968 | break; |
| 4940 | case FOP(31, 22): | 4969 | case FOP(31, 22): |
| 4941 | - gen_op_cp1_64bitmode(); | 4970 | + check_cp1_64bitmode(ctx); |
| 4942 | GEN_LOAD_FREG_FTN(WT0, fs); | 4971 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4943 | GEN_LOAD_FREG_FTN(WTH0, fs); | 4972 | GEN_LOAD_FREG_FTN(WTH0, fs); |
| 4944 | GEN_LOAD_FREG_FTN(WT2, fd); | 4973 | GEN_LOAD_FREG_FTN(WT2, fd); |
| @@ -4949,14 +4978,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4949,14 +4978,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4949 | opn = "rsqrt2.ps"; | 4978 | opn = "rsqrt2.ps"; |
| 4950 | break; | 4979 | break; |
| 4951 | case FOP(32, 22): | 4980 | case FOP(32, 22): |
| 4952 | - gen_op_cp1_64bitmode(); | 4981 | + check_cp1_64bitmode(ctx); |
| 4953 | GEN_LOAD_FREG_FTN(WTH0, fs); | 4982 | GEN_LOAD_FREG_FTN(WTH0, fs); |
| 4954 | gen_op_float_cvts_pu(); | 4983 | gen_op_float_cvts_pu(); |
| 4955 | GEN_STORE_FTN_FREG(fd, WT2); | 4984 | GEN_STORE_FTN_FREG(fd, WT2); |
| 4956 | opn = "cvt.s.pu"; | 4985 | opn = "cvt.s.pu"; |
| 4957 | break; | 4986 | break; |
| 4958 | case FOP(36, 22): | 4987 | case FOP(36, 22): |
| 4959 | - gen_op_cp1_64bitmode(); | 4988 | + check_cp1_64bitmode(ctx); |
| 4960 | GEN_LOAD_FREG_FTN(WT0, fs); | 4989 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4961 | GEN_LOAD_FREG_FTN(WTH0, fs); | 4990 | GEN_LOAD_FREG_FTN(WTH0, fs); |
| 4962 | gen_op_float_cvtpw_ps(); | 4991 | gen_op_float_cvtpw_ps(); |
| @@ -4965,14 +4994,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4965,14 +4994,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4965 | opn = "cvt.pw.ps"; | 4994 | opn = "cvt.pw.ps"; |
| 4966 | break; | 4995 | break; |
| 4967 | case FOP(40, 22): | 4996 | case FOP(40, 22): |
| 4968 | - gen_op_cp1_64bitmode(); | 4997 | + check_cp1_64bitmode(ctx); |
| 4969 | GEN_LOAD_FREG_FTN(WT0, fs); | 4998 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4970 | gen_op_float_cvts_pl(); | 4999 | gen_op_float_cvts_pl(); |
| 4971 | GEN_STORE_FTN_FREG(fd, WT2); | 5000 | GEN_STORE_FTN_FREG(fd, WT2); |
| 4972 | opn = "cvt.s.pl"; | 5001 | opn = "cvt.s.pl"; |
| 4973 | break; | 5002 | break; |
| 4974 | case FOP(44, 22): | 5003 | case FOP(44, 22): |
| 4975 | - gen_op_cp1_64bitmode(); | 5004 | + check_cp1_64bitmode(ctx); |
| 4976 | GEN_LOAD_FREG_FTN(WT0, fs); | 5005 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4977 | GEN_LOAD_FREG_FTN(WT1, ft); | 5006 | GEN_LOAD_FREG_FTN(WT1, ft); |
| 4978 | gen_op_float_pll_ps(); | 5007 | gen_op_float_pll_ps(); |
| @@ -4980,7 +5009,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4980,7 +5009,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4980 | opn = "pll.ps"; | 5009 | opn = "pll.ps"; |
| 4981 | break; | 5010 | break; |
| 4982 | case FOP(45, 22): | 5011 | case FOP(45, 22): |
| 4983 | - gen_op_cp1_64bitmode(); | 5012 | + check_cp1_64bitmode(ctx); |
| 4984 | GEN_LOAD_FREG_FTN(WT0, fs); | 5013 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 4985 | GEN_LOAD_FREG_FTN(WTH1, ft); | 5014 | GEN_LOAD_FREG_FTN(WTH1, ft); |
| 4986 | gen_op_float_plu_ps(); | 5015 | gen_op_float_plu_ps(); |
| @@ -4988,7 +5017,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4988,7 +5017,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4988 | opn = "plu.ps"; | 5017 | opn = "plu.ps"; |
| 4989 | break; | 5018 | break; |
| 4990 | case FOP(46, 22): | 5019 | case FOP(46, 22): |
| 4991 | - gen_op_cp1_64bitmode(); | 5020 | + check_cp1_64bitmode(ctx); |
| 4992 | GEN_LOAD_FREG_FTN(WTH0, fs); | 5021 | GEN_LOAD_FREG_FTN(WTH0, fs); |
| 4993 | GEN_LOAD_FREG_FTN(WT1, ft); | 5022 | GEN_LOAD_FREG_FTN(WT1, ft); |
| 4994 | gen_op_float_pul_ps(); | 5023 | gen_op_float_pul_ps(); |
| @@ -4996,7 +5025,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -4996,7 +5025,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 4996 | opn = "pul.ps"; | 5025 | opn = "pul.ps"; |
| 4997 | break; | 5026 | break; |
| 4998 | case FOP(47, 22): | 5027 | case FOP(47, 22): |
| 4999 | - gen_op_cp1_64bitmode(); | 5028 | + check_cp1_64bitmode(ctx); |
| 5000 | GEN_LOAD_FREG_FTN(WTH0, fs); | 5029 | GEN_LOAD_FREG_FTN(WTH0, fs); |
| 5001 | GEN_LOAD_FREG_FTN(WTH1, ft); | 5030 | GEN_LOAD_FREG_FTN(WTH1, ft); |
| 5002 | gen_op_float_puu_ps(); | 5031 | gen_op_float_puu_ps(); |
| @@ -5019,7 +5048,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -5019,7 +5048,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 5019 | case FOP(61, 22): | 5048 | case FOP(61, 22): |
| 5020 | case FOP(62, 22): | 5049 | case FOP(62, 22): |
| 5021 | case FOP(63, 22): | 5050 | case FOP(63, 22): |
| 5022 | - gen_op_cp1_64bitmode(); | 5051 | + check_cp1_64bitmode(ctx); |
| 5023 | GEN_LOAD_FREG_FTN(WT0, fs); | 5052 | GEN_LOAD_FREG_FTN(WT0, fs); |
| 5024 | GEN_LOAD_FREG_FTN(WTH0, fs); | 5053 | GEN_LOAD_FREG_FTN(WTH0, fs); |
| 5025 | GEN_LOAD_FREG_FTN(WT1, ft); | 5054 | GEN_LOAD_FREG_FTN(WT1, ft); |
| @@ -5051,14 +5080,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | @@ -5051,14 +5080,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, | ||
| 5051 | } | 5080 | } |
| 5052 | 5081 | ||
| 5053 | /* Coprocessor 3 (FPU) */ | 5082 | /* Coprocessor 3 (FPU) */ |
| 5054 | -static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc, int fd, | ||
| 5055 | - int fs, int base, int index) | 5083 | +static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc, |
| 5084 | + int fd, int fs, int base, int index) | ||
| 5056 | { | 5085 | { |
| 5057 | const char *opn = "extended float load/store"; | 5086 | const char *opn = "extended float load/store"; |
| 5058 | int store = 0; | 5087 | int store = 0; |
| 5059 | 5088 | ||
| 5060 | /* All of those work only on 64bit FPUs. */ | 5089 | /* All of those work only on 64bit FPUs. */ |
| 5061 | - gen_op_cp1_64bitmode(); | 5090 | + check_cp1_64bitmode(ctx); |
| 5062 | if (base == 0) { | 5091 | if (base == 0) { |
| 5063 | if (index == 0) | 5092 | if (index == 0) |
| 5064 | gen_op_reset_T0(); | 5093 | gen_op_reset_T0(); |
| @@ -5117,13 +5146,13 @@ static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc, int fd, | @@ -5117,13 +5146,13 @@ static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc, int fd, | ||
| 5117 | regnames[index], regnames[base]); | 5146 | regnames[index], regnames[base]); |
| 5118 | } | 5147 | } |
| 5119 | 5148 | ||
| 5120 | -static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, int fd, | ||
| 5121 | - int fr, int fs, int ft) | 5149 | +static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, |
| 5150 | + int fd, int fr, int fs, int ft) | ||
| 5122 | { | 5151 | { |
| 5123 | const char *opn = "flt3_arith"; | 5152 | const char *opn = "flt3_arith"; |
| 5124 | 5153 | ||
| 5125 | /* All of those work only on 64bit FPUs. */ | 5154 | /* All of those work only on 64bit FPUs. */ |
| 5126 | - gen_op_cp1_64bitmode(); | 5155 | + check_cp1_64bitmode(ctx); |
| 5127 | switch (opc) { | 5156 | switch (opc) { |
| 5128 | case OPC_ALNV_PS: | 5157 | case OPC_ALNV_PS: |
| 5129 | GEN_LOAD_REG_TN(T0, fr); | 5158 | GEN_LOAD_REG_TN(T0, fr); |
| @@ -5363,7 +5392,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx) | @@ -5363,7 +5392,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx) | ||
| 5363 | case OPC_MOVCI: | 5392 | case OPC_MOVCI: |
| 5364 | if (env->CP0_Config1 & (1 << CP0C1_FP)) { | 5393 | if (env->CP0_Config1 & (1 << CP0C1_FP)) { |
| 5365 | save_cpu_state(ctx, 1); | 5394 | save_cpu_state(ctx, 1); |
| 5366 | - gen_op_cp1_enabled(); | 5395 | + check_cp1_enabled(ctx); |
| 5367 | gen_movci(ctx, rd, rs, (ctx->opcode >> 18) & 0x7, | 5396 | gen_movci(ctx, rd, rs, (ctx->opcode >> 18) & 0x7, |
| 5368 | (ctx->opcode >> 16) & 1); | 5397 | (ctx->opcode >> 16) & 1); |
| 5369 | } else { | 5398 | } else { |
| @@ -5634,7 +5663,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx) | @@ -5634,7 +5663,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx) | ||
| 5634 | case OPC_SDC1: | 5663 | case OPC_SDC1: |
| 5635 | if (env->CP0_Config1 & (1 << CP0C1_FP)) { | 5664 | if (env->CP0_Config1 & (1 << CP0C1_FP)) { |
| 5636 | save_cpu_state(ctx, 1); | 5665 | save_cpu_state(ctx, 1); |
| 5637 | - gen_op_cp1_enabled(); | 5666 | + check_cp1_enabled(ctx); |
| 5638 | gen_flt_ldst(ctx, op, rt, rs, imm); | 5667 | gen_flt_ldst(ctx, op, rt, rs, imm); |
| 5639 | } else { | 5668 | } else { |
| 5640 | generate_exception_err(ctx, EXCP_CpU, 1); | 5669 | generate_exception_err(ctx, EXCP_CpU, 1); |
| @@ -5644,7 +5673,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx) | @@ -5644,7 +5673,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx) | ||
| 5644 | case OPC_CP1: | 5673 | case OPC_CP1: |
| 5645 | if (env->CP0_Config1 & (1 << CP0C1_FP)) { | 5674 | if (env->CP0_Config1 & (1 << CP0C1_FP)) { |
| 5646 | save_cpu_state(ctx, 1); | 5675 | save_cpu_state(ctx, 1); |
| 5647 | - gen_op_cp1_enabled(); | 5676 | + check_cp1_enabled(ctx); |
| 5648 | op1 = MASK_CP1(ctx->opcode); | 5677 | op1 = MASK_CP1(ctx->opcode); |
| 5649 | switch (op1) { | 5678 | switch (op1) { |
| 5650 | case OPC_MFC1: | 5679 | case OPC_MFC1: |
| @@ -5696,7 +5725,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx) | @@ -5696,7 +5725,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx) | ||
| 5696 | case OPC_CP3: | 5725 | case OPC_CP3: |
| 5697 | if (env->CP0_Config1 & (1 << CP0C1_FP)) { | 5726 | if (env->CP0_Config1 & (1 << CP0C1_FP)) { |
| 5698 | save_cpu_state(ctx, 1); | 5727 | save_cpu_state(ctx, 1); |
| 5699 | - gen_op_cp1_enabled(); | 5728 | + check_cp1_enabled(ctx); |
| 5700 | op1 = MASK_CP3(ctx->opcode); | 5729 | op1 = MASK_CP3(ctx->opcode); |
| 5701 | switch (op1) { | 5730 | switch (op1) { |
| 5702 | case OPC_LWXC1: | 5731 | case OPC_LWXC1: |
| @@ -5960,7 +5989,7 @@ void fpu_dump_state(CPUState *env, FILE *f, | @@ -5960,7 +5989,7 @@ void fpu_dump_state(CPUState *env, FILE *f, | ||
| 5960 | int flags) | 5989 | int flags) |
| 5961 | { | 5990 | { |
| 5962 | int i; | 5991 | int i; |
| 5963 | - int is_fpu64 = !!(env->CP0_Status & (1 << CP0St_FR)); | 5992 | + int is_fpu64 = !!(env->hflags & MIPS_HFLAG_F64); |
| 5964 | 5993 | ||
| 5965 | #define printfpr(fp) \ | 5994 | #define printfpr(fp) \ |
| 5966 | do { \ | 5995 | do { \ |
| @@ -6038,7 +6067,6 @@ void cpu_dump_state (CPUState *env, FILE *f, | @@ -6038,7 +6067,6 @@ void cpu_dump_state (CPUState *env, FILE *f, | ||
| 6038 | int (*cpu_fprintf)(FILE *f, const char *fmt, ...), | 6067 | int (*cpu_fprintf)(FILE *f, const char *fmt, ...), |
| 6039 | int flags) | 6068 | int flags) |
| 6040 | { | 6069 | { |
| 6041 | - uint32_t c0_status; | ||
| 6042 | int i; | 6070 | int i; |
| 6043 | 6071 | ||
| 6044 | cpu_fprintf(f, "pc=0x" TARGET_FMT_lx " HI=0x" TARGET_FMT_lx " LO=0x" TARGET_FMT_lx " ds %04x " TARGET_FMT_lx " %d\n", | 6072 | cpu_fprintf(f, "pc=0x" TARGET_FMT_lx " HI=0x" TARGET_FMT_lx " LO=0x" TARGET_FMT_lx " ds %04x " TARGET_FMT_lx " %d\n", |
| @@ -6051,13 +6079,11 @@ void cpu_dump_state (CPUState *env, FILE *f, | @@ -6051,13 +6079,11 @@ void cpu_dump_state (CPUState *env, FILE *f, | ||
| 6051 | cpu_fprintf(f, "\n"); | 6079 | cpu_fprintf(f, "\n"); |
| 6052 | } | 6080 | } |
| 6053 | 6081 | ||
| 6054 | - c0_status = env->CP0_Status; | ||
| 6055 | - | ||
| 6056 | cpu_fprintf(f, "CP0 Status 0x%08x Cause 0x%08x EPC 0x" TARGET_FMT_lx "\n", | 6082 | cpu_fprintf(f, "CP0 Status 0x%08x Cause 0x%08x EPC 0x" TARGET_FMT_lx "\n", |
| 6057 | - c0_status, env->CP0_Cause, env->CP0_EPC); | 6083 | + env->CP0_Status, env->CP0_Cause, env->CP0_EPC); |
| 6058 | cpu_fprintf(f, " Config0 0x%08x Config1 0x%08x LLAddr 0x" TARGET_FMT_lx "\n", | 6084 | cpu_fprintf(f, " Config0 0x%08x Config1 0x%08x LLAddr 0x" TARGET_FMT_lx "\n", |
| 6059 | env->CP0_Config0, env->CP0_Config1, env->CP0_LLAddr); | 6085 | env->CP0_Config0, env->CP0_Config1, env->CP0_LLAddr); |
| 6060 | - if (c0_status & (1 << CP0St_CU1)) | 6086 | + if (env->hflags & MIPS_HFLAG_FPU) |
| 6061 | fpu_dump_state(env, f, cpu_fprintf, flags); | 6087 | fpu_dump_state(env, f, cpu_fprintf, flags); |
| 6062 | #if defined(TARGET_MIPS64) && defined(MIPS_DEBUG_SIGN_EXTENSIONS) | 6088 | #if defined(TARGET_MIPS64) && defined(MIPS_DEBUG_SIGN_EXTENSIONS) |
| 6063 | cpu_mips_check_sign_extensions(env, f, cpu_fprintf, flags); | 6089 | cpu_mips_check_sign_extensions(env, f, cpu_fprintf, flags); |