391
441
GEN32(gen_op_store_T0_gpr, gen_op_store_T0_gpr_gpr);
392
442
GEN32(gen_op_store_T1_gpr, gen_op_store_T1_gpr_gpr);
396
444
static const char *fregnames[] =
397
445
{ "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
398
446
"f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
399
447
"f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
400
448
"f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", };
402
# define SFGEN32(func, NAME) \
403
static GenOpFunc *NAME ## _table [32] = { \
404
NAME ## 0, NAME ## 1, NAME ## 2, NAME ## 3, \
405
NAME ## 4, NAME ## 5, NAME ## 6, NAME ## 7, \
406
NAME ## 8, NAME ## 9, NAME ## 10, NAME ## 11, \
407
NAME ## 12, NAME ## 13, NAME ## 14, NAME ## 15, \
408
NAME ## 16, NAME ## 17, NAME ## 18, NAME ## 19, \
409
NAME ## 20, NAME ## 21, NAME ## 22, NAME ## 23, \
410
NAME ## 24, NAME ## 25, NAME ## 26, NAME ## 27, \
411
NAME ## 28, NAME ## 29, NAME ## 30, NAME ## 31, \
413
static inline void func(int n) \
415
NAME ## _table[n](); \
418
# define DFGEN32(func, NAME) \
419
static GenOpFunc *NAME ## _table [32] = { \
420
NAME ## 0, 0, NAME ## 2, 0, \
421
NAME ## 4, 0, NAME ## 6, 0, \
422
NAME ## 8, 0, NAME ## 10, 0, \
423
NAME ## 12, 0, NAME ## 14, 0, \
424
NAME ## 16, 0, NAME ## 18, 0, \
425
NAME ## 20, 0, NAME ## 22, 0, \
426
NAME ## 24, 0, NAME ## 26, 0, \
427
NAME ## 28, 0, NAME ## 30, 0, \
429
static inline void func(int n) \
431
NAME ## _table[n](); \
434
SFGEN32(gen_op_load_fpr_WT0, gen_op_load_fpr_WT0_fpr);
435
SFGEN32(gen_op_store_fpr_WT0, gen_op_store_fpr_WT0_fpr);
437
SFGEN32(gen_op_load_fpr_WT1, gen_op_load_fpr_WT1_fpr);
438
SFGEN32(gen_op_store_fpr_WT1, gen_op_store_fpr_WT1_fpr);
440
SFGEN32(gen_op_load_fpr_WT2, gen_op_load_fpr_WT2_fpr);
441
SFGEN32(gen_op_store_fpr_WT2, gen_op_store_fpr_WT2_fpr);
443
DFGEN32(gen_op_load_fpr_DT0, gen_op_load_fpr_DT0_fpr);
444
DFGEN32(gen_op_store_fpr_DT0, gen_op_store_fpr_DT0_fpr);
446
DFGEN32(gen_op_load_fpr_DT1, gen_op_load_fpr_DT1_fpr);
447
DFGEN32(gen_op_store_fpr_DT1, gen_op_store_fpr_DT1_fpr);
449
DFGEN32(gen_op_load_fpr_DT2, gen_op_load_fpr_DT2_fpr);
450
DFGEN32(gen_op_store_fpr_DT2, gen_op_store_fpr_DT2_fpr);
452
#define FOP_CONDS(fmt) \
453
static GenOpFunc * cond_ ## fmt ## _table[16] = { \
454
gen_op_cmp_ ## fmt ## _f, \
455
gen_op_cmp_ ## fmt ## _un, \
456
gen_op_cmp_ ## fmt ## _eq, \
457
gen_op_cmp_ ## fmt ## _ueq, \
458
gen_op_cmp_ ## fmt ## _olt, \
459
gen_op_cmp_ ## fmt ## _ult, \
460
gen_op_cmp_ ## fmt ## _ole, \
461
gen_op_cmp_ ## fmt ## _ule, \
462
gen_op_cmp_ ## fmt ## _sf, \
463
gen_op_cmp_ ## fmt ## _ngle, \
464
gen_op_cmp_ ## fmt ## _seq, \
465
gen_op_cmp_ ## fmt ## _ngl, \
466
gen_op_cmp_ ## fmt ## _lt, \
467
gen_op_cmp_ ## fmt ## _nge, \
468
gen_op_cmp_ ## fmt ## _le, \
469
gen_op_cmp_ ## fmt ## _ngt, \
450
#define FGEN32(func, NAME) \
451
static GenOpFunc *NAME ## _table [32] = { \
452
NAME ## 0, NAME ## 1, NAME ## 2, NAME ## 3, \
453
NAME ## 4, NAME ## 5, NAME ## 6, NAME ## 7, \
454
NAME ## 8, NAME ## 9, NAME ## 10, NAME ## 11, \
455
NAME ## 12, NAME ## 13, NAME ## 14, NAME ## 15, \
456
NAME ## 16, NAME ## 17, NAME ## 18, NAME ## 19, \
457
NAME ## 20, NAME ## 21, NAME ## 22, NAME ## 23, \
458
NAME ## 24, NAME ## 25, NAME ## 26, NAME ## 27, \
459
NAME ## 28, NAME ## 29, NAME ## 30, NAME ## 31, \
461
static inline void func(int n) \
463
NAME ## _table[n](); \
466
FGEN32(gen_op_load_fpr_WT0, gen_op_load_fpr_WT0_fpr);
467
FGEN32(gen_op_store_fpr_WT0, gen_op_store_fpr_WT0_fpr);
469
FGEN32(gen_op_load_fpr_WT1, gen_op_load_fpr_WT1_fpr);
470
FGEN32(gen_op_store_fpr_WT1, gen_op_store_fpr_WT1_fpr);
472
FGEN32(gen_op_load_fpr_WT2, gen_op_load_fpr_WT2_fpr);
473
FGEN32(gen_op_store_fpr_WT2, gen_op_store_fpr_WT2_fpr);
475
FGEN32(gen_op_load_fpr_DT0, gen_op_load_fpr_DT0_fpr);
476
FGEN32(gen_op_store_fpr_DT0, gen_op_store_fpr_DT0_fpr);
478
FGEN32(gen_op_load_fpr_DT1, gen_op_load_fpr_DT1_fpr);
479
FGEN32(gen_op_store_fpr_DT1, gen_op_store_fpr_DT1_fpr);
481
FGEN32(gen_op_load_fpr_DT2, gen_op_load_fpr_DT2_fpr);
482
FGEN32(gen_op_store_fpr_DT2, gen_op_store_fpr_DT2_fpr);
484
FGEN32(gen_op_load_fpr_WTH0, gen_op_load_fpr_WTH0_fpr);
485
FGEN32(gen_op_store_fpr_WTH0, gen_op_store_fpr_WTH0_fpr);
487
FGEN32(gen_op_load_fpr_WTH1, gen_op_load_fpr_WTH1_fpr);
488
FGEN32(gen_op_store_fpr_WTH1, gen_op_store_fpr_WTH1_fpr);
490
FGEN32(gen_op_load_fpr_WTH2, gen_op_load_fpr_WTH2_fpr);
491
FGEN32(gen_op_store_fpr_WTH2, gen_op_store_fpr_WTH2_fpr);
493
#define FOP_CONDS(type, fmt) \
494
static GenOpFunc1 * gen_op_cmp ## type ## _ ## fmt ## _table[16] = { \
495
gen_op_cmp ## type ## _ ## fmt ## _f, \
496
gen_op_cmp ## type ## _ ## fmt ## _un, \
497
gen_op_cmp ## type ## _ ## fmt ## _eq, \
498
gen_op_cmp ## type ## _ ## fmt ## _ueq, \
499
gen_op_cmp ## type ## _ ## fmt ## _olt, \
500
gen_op_cmp ## type ## _ ## fmt ## _ult, \
501
gen_op_cmp ## type ## _ ## fmt ## _ole, \
502
gen_op_cmp ## type ## _ ## fmt ## _ule, \
503
gen_op_cmp ## type ## _ ## fmt ## _sf, \
504
gen_op_cmp ## type ## _ ## fmt ## _ngle, \
505
gen_op_cmp ## type ## _ ## fmt ## _seq, \
506
gen_op_cmp ## type ## _ ## fmt ## _ngl, \
507
gen_op_cmp ## type ## _ ## fmt ## _lt, \
508
gen_op_cmp ## type ## _ ## fmt ## _nge, \
509
gen_op_cmp ## type ## _ ## fmt ## _le, \
510
gen_op_cmp ## type ## _ ## fmt ## _ngt, \
471
static inline void gen_cmp_ ## fmt(int n) \
512
static inline void gen_cmp ## type ## _ ## fmt(int n, long cc) \
473
cond_ ## fmt ## _table[n](); \
514
gen_op_cmp ## type ## _ ## fmt ## _table[n](cc); \
479
#endif /* MIPS_USES_FPU */
481
524
typedef struct DisasContext {
482
525
struct TranslationBlock *tb;
483
526
target_ulong pc, saved_pc;
485
529
/* Routine used to access memory */
487
531
uint32_t hflags, saved_hflags;
490
533
target_ulong btarget;
1510
MIPS_DEBUG("beq %s, %s, %08x",
1726
MIPS_DEBUG("beq %s, %s, " TARGET_FMT_lx,
1511
1727
regnames[rs], regnames[rt], btarget);
1512
1728
goto not_likely;
1515
MIPS_DEBUG("beql %s, %s, %08x",
1731
MIPS_DEBUG("beql %s, %s, " TARGET_FMT_lx,
1516
1732
regnames[rs], regnames[rt], btarget);
1520
MIPS_DEBUG("bne %s, %s, %08x",
1736
MIPS_DEBUG("bne %s, %s, " TARGET_FMT_lx,
1521
1737
regnames[rs], regnames[rt], btarget);
1522
1738
goto not_likely;
1525
MIPS_DEBUG("bnel %s, %s, %08x",
1741
MIPS_DEBUG("bnel %s, %s, " TARGET_FMT_lx,
1526
1742
regnames[rs], regnames[rt], btarget);
1530
MIPS_DEBUG("bgez %s, %08x", regnames[rs], btarget);
1746
MIPS_DEBUG("bgez %s, " TARGET_FMT_lx, regnames[rs], btarget);
1531
1747
goto not_likely;
1532
1748
case OPC_BGEZL:
1534
MIPS_DEBUG("bgezl %s, %08x", regnames[rs], btarget);
1750
MIPS_DEBUG("bgezl %s, " TARGET_FMT_lx, regnames[rs], btarget);
1536
1752
case OPC_BGEZAL:
1538
MIPS_DEBUG("bgezal %s, %08x", regnames[rs], btarget);
1754
MIPS_DEBUG("bgezal %s, " TARGET_FMT_lx, regnames[rs], btarget);
1540
1756
goto not_likely;
1541
1757
case OPC_BGEZALL:
1544
MIPS_DEBUG("bgezall %s, %08x", regnames[rs], btarget);
1760
MIPS_DEBUG("bgezall %s, " TARGET_FMT_lx, regnames[rs], btarget);
1548
MIPS_DEBUG("bgtz %s, %08x", regnames[rs], btarget);
1764
MIPS_DEBUG("bgtz %s, " TARGET_FMT_lx, regnames[rs], btarget);
1549
1765
goto not_likely;
1550
1766
case OPC_BGTZL:
1552
MIPS_DEBUG("bgtzl %s, %08x", regnames[rs], btarget);
1768
MIPS_DEBUG("bgtzl %s, " TARGET_FMT_lx, regnames[rs], btarget);
1556
MIPS_DEBUG("blez %s, %08x", regnames[rs], btarget);
1772
MIPS_DEBUG("blez %s, " TARGET_FMT_lx, regnames[rs], btarget);
1557
1773
goto not_likely;
1558
1774
case OPC_BLEZL:
1560
MIPS_DEBUG("blezl %s, %08x", regnames[rs], btarget);
1776
MIPS_DEBUG("blezl %s, " TARGET_FMT_lx, regnames[rs], btarget);
1564
MIPS_DEBUG("bltz %s, %08x", regnames[rs], btarget);
1780
MIPS_DEBUG("bltz %s, " TARGET_FMT_lx, regnames[rs], btarget);
1565
1781
goto not_likely;
1566
1782
case OPC_BLTZL:
1568
MIPS_DEBUG("bltzl %s, %08x", regnames[rs], btarget);
1784
MIPS_DEBUG("bltzl %s, " TARGET_FMT_lx, regnames[rs], btarget);
1570
1786
case OPC_BLTZAL:
1573
MIPS_DEBUG("bltzal %s, %08x", regnames[rs], btarget);
1789
MIPS_DEBUG("bltzal %s, " TARGET_FMT_lx, regnames[rs], btarget);
1575
1791
ctx->hflags |= MIPS_HFLAG_BC;
1577
1794
case OPC_BLTZALL:
1580
MIPS_DEBUG("bltzall %s, %08x", regnames[rs], btarget);
1797
MIPS_DEBUG("bltzall %s, " TARGET_FMT_lx, regnames[rs], btarget);
1582
1799
ctx->hflags |= MIPS_HFLAG_BL;
1801
gen_op_save_bcond();
1804
MIPS_INVAL("conditional branch/jump");
1805
generate_exception(ctx, EXCP_RI);
1587
MIPS_DEBUG("enter ds: link %d cond %02x target %08x",
1809
MIPS_DEBUG("enter ds: link %d cond %02x target " TARGET_FMT_lx,
1588
1810
blink, ctx->hflags, btarget);
1589
1812
ctx->btarget = btarget;
1590
1813
if (blink > 0) {
1591
gen_op_set_T0(ctx->pc + 8);
1814
GEN_LOAD_IMM_TN(T0, ctx->pc + 8);
1592
1815
gen_op_store_T0_gpr(blink);
1597
1819
/* special3 bitfield operations */
4363
const char *condnames_abs[] = {
4381
enum { BINOP, CMPOP, OTHEROP } optype = OTHEROP;
4255
4382
uint32_t func = ctx->opcode & 0x3f;
4257
4384
switch (ctx->opcode & FOP(0x3f, 0x1f)) {
4386
GEN_LOAD_FREG_FTN(WT0, fs);
4387
GEN_LOAD_FREG_FTN(WT1, ft);
4388
gen_op_float_add_s();
4389
GEN_STORE_FTN_FREG(fd, WT2);
4394
GEN_LOAD_FREG_FTN(WT0, fs);
4395
GEN_LOAD_FREG_FTN(WT1, ft);
4396
gen_op_float_sub_s();
4397
GEN_STORE_FTN_FREG(fd, WT2);
4402
GEN_LOAD_FREG_FTN(WT0, fs);
4403
GEN_LOAD_FREG_FTN(WT1, ft);
4404
gen_op_float_mul_s();
4405
GEN_STORE_FTN_FREG(fd, WT2);
4410
GEN_LOAD_FREG_FTN(WT0, fs);
4411
GEN_LOAD_FREG_FTN(WT1, ft);
4412
gen_op_float_div_s();
4413
GEN_STORE_FTN_FREG(fd, WT2);
4418
GEN_LOAD_FREG_FTN(WT0, fs);
4419
gen_op_float_sqrt_s();
4420
GEN_STORE_FTN_FREG(fd, WT2);
4424
GEN_LOAD_FREG_FTN(WT0, fs);
4425
gen_op_float_abs_s();
4426
GEN_STORE_FTN_FREG(fd, WT2);
4430
GEN_LOAD_FREG_FTN(WT0, fs);
4431
gen_op_float_mov_s();
4432
GEN_STORE_FTN_FREG(fd, WT2);
4436
GEN_LOAD_FREG_FTN(WT0, fs);
4437
gen_op_float_chs_s();
4438
GEN_STORE_FTN_FREG(fd, WT2);
4442
check_cp1_64bitmode(ctx);
4443
GEN_LOAD_FREG_FTN(WT0, fs);
4444
gen_op_float_roundl_s();
4445
GEN_STORE_FTN_FREG(fd, DT2);
4449
check_cp1_64bitmode(ctx);
4450
GEN_LOAD_FREG_FTN(WT0, fs);
4451
gen_op_float_truncl_s();
4452
GEN_STORE_FTN_FREG(fd, DT2);
4456
check_cp1_64bitmode(ctx);
4457
GEN_LOAD_FREG_FTN(WT0, fs);
4458
gen_op_float_ceill_s();
4459
GEN_STORE_FTN_FREG(fd, DT2);
4463
check_cp1_64bitmode(ctx);
4464
GEN_LOAD_FREG_FTN(WT0, fs);
4465
gen_op_float_floorl_s();
4466
GEN_STORE_FTN_FREG(fd, DT2);
4470
GEN_LOAD_FREG_FTN(WT0, fs);
4471
gen_op_float_roundw_s();
4472
GEN_STORE_FTN_FREG(fd, WT2);
4476
GEN_LOAD_FREG_FTN(WT0, fs);
4477
gen_op_float_truncw_s();
4478
GEN_STORE_FTN_FREG(fd, WT2);
4482
GEN_LOAD_FREG_FTN(WT0, fs);
4483
gen_op_float_ceilw_s();
4484
GEN_STORE_FTN_FREG(fd, WT2);
4488
GEN_LOAD_FREG_FTN(WT0, fs);
4489
gen_op_float_floorw_s();
4490
GEN_STORE_FTN_FREG(fd, WT2);
4494
GEN_LOAD_REG_TN(T0, ft);
4495
GEN_LOAD_FREG_FTN(WT0, fs);
4496
GEN_LOAD_FREG_FTN(WT2, fd);
4497
gen_movcf_s(ctx, (ft >> 2) & 0x7, ft & 0x1);
4498
GEN_STORE_FTN_FREG(fd, WT2);
4502
GEN_LOAD_REG_TN(T0, ft);
4503
GEN_LOAD_FREG_FTN(WT0, fs);
4504
GEN_LOAD_FREG_FTN(WT2, fd);
4505
gen_op_float_movz_s();
4506
GEN_STORE_FTN_FREG(fd, WT2);
4510
GEN_LOAD_REG_TN(T0, ft);
4511
GEN_LOAD_FREG_FTN(WT0, fs);
4512
GEN_LOAD_FREG_FTN(WT2, fd);
4513
gen_op_float_movn_s();
4514
GEN_STORE_FTN_FREG(fd, WT2);
4518
GEN_LOAD_FREG_FTN(WT0, fs);
4519
gen_op_float_recip_s();
4520
GEN_STORE_FTN_FREG(fd, WT2);
4524
GEN_LOAD_FREG_FTN(WT0, fs);
4525
gen_op_float_rsqrt_s();
4526
GEN_STORE_FTN_FREG(fd, WT2);
4530
check_cp1_64bitmode(ctx);
4531
GEN_LOAD_FREG_FTN(WT0, fs);
4532
GEN_LOAD_FREG_FTN(WT2, fd);
4533
gen_op_float_recip2_s();
4534
GEN_STORE_FTN_FREG(fd, WT2);
4538
check_cp1_64bitmode(ctx);
4539
GEN_LOAD_FREG_FTN(WT0, fs);
4540
gen_op_float_recip1_s();
4541
GEN_STORE_FTN_FREG(fd, WT2);
4545
check_cp1_64bitmode(ctx);
4546
GEN_LOAD_FREG_FTN(WT0, fs);
4547
gen_op_float_rsqrt1_s();
4548
GEN_STORE_FTN_FREG(fd, WT2);
4552
check_cp1_64bitmode(ctx);
4553
GEN_LOAD_FREG_FTN(WT0, fs);
4554
GEN_LOAD_FREG_FTN(WT2, ft);
4555
gen_op_float_rsqrt2_s();
4556
GEN_STORE_FTN_FREG(fd, WT2);
4560
check_cp1_registers(ctx, fd);
4561
GEN_LOAD_FREG_FTN(WT0, fs);
4562
gen_op_float_cvtd_s();
4563
GEN_STORE_FTN_FREG(fd, DT2);
4567
GEN_LOAD_FREG_FTN(WT0, fs);
4568
gen_op_float_cvtw_s();
4569
GEN_STORE_FTN_FREG(fd, WT2);
4573
check_cp1_64bitmode(ctx);
4574
GEN_LOAD_FREG_FTN(WT0, fs);
4575
gen_op_float_cvtl_s();
4576
GEN_STORE_FTN_FREG(fd, DT2);
4580
check_cp1_64bitmode(ctx);
4581
GEN_LOAD_FREG_FTN(WT1, fs);
4582
GEN_LOAD_FREG_FTN(WT0, ft);
4583
gen_op_float_cvtps_s();
4584
GEN_STORE_FTN_FREG(fd, DT2);
4603
GEN_LOAD_FREG_FTN(WT0, fs);
4604
GEN_LOAD_FREG_FTN(WT1, ft);
4605
if (ctx->opcode & (1 << 6)) {
4606
check_cp1_64bitmode(ctx);
4607
gen_cmpabs_s(func-48, cc);
4608
opn = condnames_abs[func-48];
4610
gen_cmp_s(func-48, cc);
4611
opn = condnames[func-48];
4258
4614
case FOP(0, 17):
4259
CHECK_FR(ctx, fs | ft | fd);
4615
check_cp1_registers(ctx, fs | ft | fd);
4260
4616
GEN_LOAD_FREG_FTN(DT0, fs);
4261
4617
GEN_LOAD_FREG_FTN(DT1, ft);
4262
4618
gen_op_float_add_d();
4263
4619
GEN_STORE_FTN_FREG(fd, DT2);
4267
4623
case FOP(1, 17):
4268
CHECK_FR(ctx, fs | ft | fd);
4624
check_cp1_registers(ctx, fs | ft | fd);
4269
4625
GEN_LOAD_FREG_FTN(DT0, fs);
4270
4626
GEN_LOAD_FREG_FTN(DT1, ft);
4271
4627
gen_op_float_sub_d();
4272
4628
GEN_STORE_FTN_FREG(fd, DT2);
4276
4632
case FOP(2, 17):
4277
CHECK_FR(ctx, fs | ft | fd);
4633
check_cp1_registers(ctx, fs | ft | fd);
4278
4634
GEN_LOAD_FREG_FTN(DT0, fs);
4279
4635
GEN_LOAD_FREG_FTN(DT1, ft);
4280
4636
gen_op_float_mul_d();
4281
4637
GEN_STORE_FTN_FREG(fd, DT2);
4285
4641
case FOP(3, 17):
4286
CHECK_FR(ctx, fs | ft | fd);
4642
check_cp1_registers(ctx, fs | ft | fd);
4287
4643
GEN_LOAD_FREG_FTN(DT0, fs);
4288
4644
GEN_LOAD_FREG_FTN(DT1, ft);
4289
4645
gen_op_float_div_d();
4290
4646
GEN_STORE_FTN_FREG(fd, DT2);
4294
4650
case FOP(4, 17):
4295
CHECK_FR(ctx, fs | fd);
4651
check_cp1_registers(ctx, fs | fd);
4296
4652
GEN_LOAD_FREG_FTN(DT0, fs);
4297
4653
gen_op_float_sqrt_d();
4298
4654
GEN_STORE_FTN_FREG(fd, DT2);
4299
4655
opn = "sqrt.d";
4301
4657
case FOP(5, 17):
4302
CHECK_FR(ctx, fs | fd);
4658
check_cp1_registers(ctx, fs | fd);
4303
4659
GEN_LOAD_FREG_FTN(DT0, fs);
4304
4660
gen_op_float_abs_d();
4305
4661
GEN_STORE_FTN_FREG(fd, DT2);
4308
4664
case FOP(6, 17):
4309
CHECK_FR(ctx, fs | fd);
4665
check_cp1_registers(ctx, fs | fd);
4310
4666
GEN_LOAD_FREG_FTN(DT0, fs);
4311
4667
gen_op_float_mov_d();
4312
4668
GEN_STORE_FTN_FREG(fd, DT2);
4315
4671
case FOP(7, 17):
4316
CHECK_FR(ctx, fs | fd);
4672
check_cp1_registers(ctx, fs | fd);
4317
4673
GEN_LOAD_FREG_FTN(DT0, fs);
4318
4674
gen_op_float_chs_d();
4319
4675
GEN_STORE_FTN_FREG(fd, DT2);
4679
check_cp1_64bitmode(ctx);
4680
GEN_LOAD_FREG_FTN(DT0, fs);
4681
gen_op_float_roundl_d();
4682
GEN_STORE_FTN_FREG(fd, DT2);
4686
check_cp1_64bitmode(ctx);
4687
GEN_LOAD_FREG_FTN(DT0, fs);
4688
gen_op_float_truncl_d();
4689
GEN_STORE_FTN_FREG(fd, DT2);
4693
check_cp1_64bitmode(ctx);
4694
GEN_LOAD_FREG_FTN(DT0, fs);
4695
gen_op_float_ceill_d();
4696
GEN_STORE_FTN_FREG(fd, DT2);
4700
check_cp1_64bitmode(ctx);
4701
GEN_LOAD_FREG_FTN(DT0, fs);
4702
gen_op_float_floorl_d();
4703
GEN_STORE_FTN_FREG(fd, DT2);
4326
4706
case FOP(12, 17):
4327
CHECK_FR(ctx, fs | fd);
4707
check_cp1_registers(ctx, fs);
4328
4708
GEN_LOAD_FREG_FTN(DT0, fs);
4329
4709
gen_op_float_roundw_d();
4330
4710
GEN_STORE_FTN_FREG(fd, WT2);
4331
4711
opn = "round.w.d";
4333
4713
case FOP(13, 17):
4334
CHECK_FR(ctx, fs | fd);
4714
check_cp1_registers(ctx, fs);
4335
4715
GEN_LOAD_FREG_FTN(DT0, fs);
4336
4716
gen_op_float_truncw_d();
4337
4717
GEN_STORE_FTN_FREG(fd, WT2);
4338
4718
opn = "trunc.w.d";
4340
4720
case FOP(14, 17):
4341
CHECK_FR(ctx, fs | fd);
4721
check_cp1_registers(ctx, fs);
4342
4722
GEN_LOAD_FREG_FTN(DT0, fs);
4343
4723
gen_op_float_ceilw_d();
4344
4724
GEN_STORE_FTN_FREG(fd, WT2);
4345
4725
opn = "ceil.w.d";
4347
4727
case FOP(15, 17):
4348
CHECK_FR(ctx, fs | fd);
4728
check_cp1_registers(ctx, fs);
4349
4729
GEN_LOAD_FREG_FTN(DT0, fs);
4350
4730
gen_op_float_floorw_d();
4351
4731
GEN_STORE_FTN_FREG(fd, WT2);
4352
4732
opn = "floor.w.d";
4354
case FOP(33, 16): /* cvt.d.s */
4355
CHECK_FR(ctx, fs | fd);
4356
GEN_LOAD_FREG_FTN(WT0, fs);
4357
gen_op_float_cvtd_s();
4358
GEN_STORE_FTN_FREG(fd, DT2);
4361
case FOP(33, 20): /* cvt.d.w */
4362
CHECK_FR(ctx, fs | fd);
4363
GEN_LOAD_FREG_FTN(WT0, fs);
4364
gen_op_float_cvtd_w();
4365
GEN_STORE_FTN_FREG(fd, DT2);
4735
GEN_LOAD_REG_TN(T0, ft);
4736
GEN_LOAD_FREG_FTN(DT0, fs);
4737
GEN_LOAD_FREG_FTN(DT2, fd);
4738
gen_movcf_d(ctx, (ft >> 2) & 0x7, ft & 0x1);
4739
GEN_STORE_FTN_FREG(fd, DT2);
4743
GEN_LOAD_REG_TN(T0, ft);
4744
GEN_LOAD_FREG_FTN(DT0, fs);
4745
GEN_LOAD_FREG_FTN(DT2, fd);
4746
gen_op_float_movz_d();
4747
GEN_STORE_FTN_FREG(fd, DT2);
4751
GEN_LOAD_REG_TN(T0, ft);
4752
GEN_LOAD_FREG_FTN(DT0, fs);
4753
GEN_LOAD_FREG_FTN(DT2, fd);
4754
gen_op_float_movn_d();
4755
GEN_STORE_FTN_FREG(fd, DT2);
4759
check_cp1_registers(ctx, fs | fd);
4760
GEN_LOAD_FREG_FTN(DT0, fs);
4761
gen_op_float_recip_d();
4762
GEN_STORE_FTN_FREG(fd, DT2);
4766
check_cp1_registers(ctx, fs | fd);
4767
GEN_LOAD_FREG_FTN(DT0, fs);
4768
gen_op_float_rsqrt_d();
4769
GEN_STORE_FTN_FREG(fd, DT2);
4773
check_cp1_64bitmode(ctx);
4774
GEN_LOAD_FREG_FTN(DT0, fs);
4775
GEN_LOAD_FREG_FTN(DT2, ft);
4776
gen_op_float_recip2_d();
4777
GEN_STORE_FTN_FREG(fd, DT2);
4781
check_cp1_64bitmode(ctx);
4782
GEN_LOAD_FREG_FTN(DT0, fs);
4783
gen_op_float_recip1_d();
4784
GEN_STORE_FTN_FREG(fd, DT2);
4788
check_cp1_64bitmode(ctx);
4789
GEN_LOAD_FREG_FTN(DT0, fs);
4790
gen_op_float_rsqrt1_d();
4791
GEN_STORE_FTN_FREG(fd, DT2);
4795
check_cp1_64bitmode(ctx);
4796
GEN_LOAD_FREG_FTN(DT0, fs);
4797
GEN_LOAD_FREG_FTN(DT2, ft);
4798
gen_op_float_rsqrt2_d();
4799
GEN_STORE_FTN_FREG(fd, DT2);
4368
4802
case FOP(48, 17):
4369
4803
case FOP(49, 17):
4381
4815
case FOP(61, 17):
4382
4816
case FOP(62, 17):
4383
4817
case FOP(63, 17):
4384
CHECK_FR(ctx, fs | ft);
4385
4818
GEN_LOAD_FREG_FTN(DT0, fs);
4386
4819
GEN_LOAD_FREG_FTN(DT1, ft);
4388
opn = condnames[func-48];
4391
CHECK_FR(ctx, fs | ft | fd);
4392
GEN_LOAD_FREG_FTN(WT0, fs);
4393
GEN_LOAD_FREG_FTN(WT1, ft);
4394
gen_op_float_add_s();
4395
GEN_STORE_FTN_FREG(fd, WT2);
4400
CHECK_FR(ctx, fs | ft | fd);
4401
GEN_LOAD_FREG_FTN(WT0, fs);
4402
GEN_LOAD_FREG_FTN(WT1, ft);
4403
gen_op_float_sub_s();
4404
GEN_STORE_FTN_FREG(fd, WT2);
4409
CHECK_FR(ctx, fs | ft | fd);
4410
GEN_LOAD_FREG_FTN(WT0, fs);
4411
GEN_LOAD_FREG_FTN(WT1, ft);
4412
gen_op_float_mul_s();
4413
GEN_STORE_FTN_FREG(fd, WT2);
4418
CHECK_FR(ctx, fs | ft | fd);
4419
GEN_LOAD_FREG_FTN(WT0, fs);
4420
GEN_LOAD_FREG_FTN(WT1, ft);
4421
gen_op_float_div_s();
4422
GEN_STORE_FTN_FREG(fd, WT2);
4427
CHECK_FR(ctx, fs | fd);
4428
GEN_LOAD_FREG_FTN(WT0, fs);
4429
gen_op_float_sqrt_s();
4430
GEN_STORE_FTN_FREG(fd, WT2);
4434
CHECK_FR(ctx, fs | fd);
4435
GEN_LOAD_FREG_FTN(WT0, fs);
4436
gen_op_float_abs_s();
4437
GEN_STORE_FTN_FREG(fd, WT2);
4441
CHECK_FR(ctx, fs | fd);
4442
GEN_LOAD_FREG_FTN(WT0, fs);
4443
gen_op_float_mov_s();
4444
GEN_STORE_FTN_FREG(fd, WT2);
4448
CHECK_FR(ctx, fs | fd);
4449
GEN_LOAD_FREG_FTN(WT0, fs);
4450
gen_op_float_chs_s();
4451
GEN_STORE_FTN_FREG(fd, WT2);
4455
CHECK_FR(ctx, fs | fd);
4456
GEN_LOAD_FREG_FTN(WT0, fs);
4457
gen_op_float_roundw_s();
4458
GEN_STORE_FTN_FREG(fd, WT2);
4462
CHECK_FR(ctx, fs | fd);
4463
GEN_LOAD_FREG_FTN(WT0, fs);
4464
gen_op_float_truncw_s();
4465
GEN_STORE_FTN_FREG(fd, WT2);
4468
case FOP(32, 17): /* cvt.s.d */
4469
CHECK_FR(ctx, fs | fd);
4820
if (ctx->opcode & (1 << 6)) {
4821
check_cp1_64bitmode(ctx);
4822
gen_cmpabs_d(func-48, cc);
4823
opn = condnames_abs[func-48];
4825
check_cp1_registers(ctx, fs | ft);
4826
gen_cmp_d(func-48, cc);
4827
opn = condnames[func-48];
4831
check_cp1_registers(ctx, fs);
4470
4832
GEN_LOAD_FREG_FTN(DT0, fs);
4471
4833
gen_op_float_cvts_d();
4472
4834
GEN_STORE_FTN_FREG(fd, WT2);
4473
4835
opn = "cvt.s.d";
4475
case FOP(32, 20): /* cvt.s.w */
4476
CHECK_FR(ctx, fs | fd);
4838
check_cp1_registers(ctx, fs);
4839
GEN_LOAD_FREG_FTN(DT0, fs);
4840
gen_op_float_cvtw_d();
4841
GEN_STORE_FTN_FREG(fd, WT2);
4845
check_cp1_64bitmode(ctx);
4846
GEN_LOAD_FREG_FTN(DT0, fs);
4847
gen_op_float_cvtl_d();
4848
GEN_STORE_FTN_FREG(fd, DT2);
4477
4852
GEN_LOAD_FREG_FTN(WT0, fs);
4478
4853
gen_op_float_cvts_w();
4479
4854
GEN_STORE_FTN_FREG(fd, WT2);
4480
4855
opn = "cvt.s.w";
4482
case FOP(36, 16): /* cvt.w.s */
4483
CHECK_FR(ctx, fs | fd);
4484
GEN_LOAD_FREG_FTN(WT0, fs);
4485
gen_op_float_cvtw_s();
4486
GEN_STORE_FTN_FREG(fd, WT2);
4489
case FOP(36, 17): /* cvt.w.d */
4490
CHECK_FR(ctx, fs | fd);
4491
GEN_LOAD_FREG_FTN(DT0, fs);
4492
gen_op_float_cvtw_d();
4493
GEN_STORE_FTN_FREG(fd, WT2);
4512
CHECK_FR(ctx, fs | ft);
4513
GEN_LOAD_FREG_FTN(WT0, fs);
4514
GEN_LOAD_FREG_FTN(WT1, ft);
4516
opn = condnames[func-48];
4519
if (loglevel & CPU_LOG_TB_IN_ASM) {
4520
fprintf(logfile, "Invalid FP arith function: %08x %03x %03x %03x\n",
4521
ctx->opcode, ctx->opcode >> 26, ctx->opcode & 0x3F,
4522
((ctx->opcode >> 16) & 0x1F));
4858
check_cp1_registers(ctx, fd);
4859
GEN_LOAD_FREG_FTN(WT0, fs);
4860
gen_op_float_cvtd_w();
4861
GEN_STORE_FTN_FREG(fd, DT2);
4865
check_cp1_64bitmode(ctx);
4866
GEN_LOAD_FREG_FTN(DT0, fs);
4867
gen_op_float_cvts_l();
4868
GEN_STORE_FTN_FREG(fd, WT2);
4872
check_cp1_64bitmode(ctx);
4873
GEN_LOAD_FREG_FTN(DT0, fs);
4874
gen_op_float_cvtd_l();
4875
GEN_STORE_FTN_FREG(fd, DT2);
4880
check_cp1_64bitmode(ctx);
4881
GEN_LOAD_FREG_FTN(WT0, fs);
4882
GEN_LOAD_FREG_FTN(WTH0, fs);
4883
gen_op_float_cvtps_pw();
4884
GEN_STORE_FTN_FREG(fd, WT2);
4885
GEN_STORE_FTN_FREG(fd, WTH2);
4889
check_cp1_64bitmode(ctx);
4890
GEN_LOAD_FREG_FTN(WT0, fs);
4891
GEN_LOAD_FREG_FTN(WTH0, fs);
4892
GEN_LOAD_FREG_FTN(WT1, ft);
4893
GEN_LOAD_FREG_FTN(WTH1, ft);
4894
gen_op_float_add_ps();
4895
GEN_STORE_FTN_FREG(fd, WT2);
4896
GEN_STORE_FTN_FREG(fd, WTH2);
4900
check_cp1_64bitmode(ctx);
4901
GEN_LOAD_FREG_FTN(WT0, fs);
4902
GEN_LOAD_FREG_FTN(WTH0, fs);
4903
GEN_LOAD_FREG_FTN(WT1, ft);
4904
GEN_LOAD_FREG_FTN(WTH1, ft);
4905
gen_op_float_sub_ps();
4906
GEN_STORE_FTN_FREG(fd, WT2);
4907
GEN_STORE_FTN_FREG(fd, WTH2);
4911
check_cp1_64bitmode(ctx);
4912
GEN_LOAD_FREG_FTN(WT0, fs);
4913
GEN_LOAD_FREG_FTN(WTH0, fs);
4914
GEN_LOAD_FREG_FTN(WT1, ft);
4915
GEN_LOAD_FREG_FTN(WTH1, ft);
4916
gen_op_float_mul_ps();
4917
GEN_STORE_FTN_FREG(fd, WT2);
4918
GEN_STORE_FTN_FREG(fd, WTH2);
4922
check_cp1_64bitmode(ctx);
4923
GEN_LOAD_FREG_FTN(WT0, fs);
4924
GEN_LOAD_FREG_FTN(WTH0, fs);
4925
gen_op_float_abs_ps();
4926
GEN_STORE_FTN_FREG(fd, WT2);
4927
GEN_STORE_FTN_FREG(fd, WTH2);
4931
check_cp1_64bitmode(ctx);
4932
GEN_LOAD_FREG_FTN(WT0, fs);
4933
GEN_LOAD_FREG_FTN(WTH0, fs);
4934
gen_op_float_mov_ps();
4935
GEN_STORE_FTN_FREG(fd, WT2);
4936
GEN_STORE_FTN_FREG(fd, WTH2);
4940
check_cp1_64bitmode(ctx);
4941
GEN_LOAD_FREG_FTN(WT0, fs);
4942
GEN_LOAD_FREG_FTN(WTH0, fs);
4943
gen_op_float_chs_ps();
4944
GEN_STORE_FTN_FREG(fd, WT2);
4945
GEN_STORE_FTN_FREG(fd, WTH2);
4949
check_cp1_64bitmode(ctx);
4950
GEN_LOAD_REG_TN(T0, ft);
4951
GEN_LOAD_FREG_FTN(WT0, fs);
4952
GEN_LOAD_FREG_FTN(WTH0, fs);
4953
GEN_LOAD_FREG_FTN(WT2, fd);
4954
GEN_LOAD_FREG_FTN(WTH2, fd);
4955
gen_movcf_ps(ctx, (ft >> 2) & 0x7, ft & 0x1);
4956
GEN_STORE_FTN_FREG(fd, WT2);
4957
GEN_STORE_FTN_FREG(fd, WTH2);
4961
check_cp1_64bitmode(ctx);
4962
GEN_LOAD_REG_TN(T0, ft);
4963
GEN_LOAD_FREG_FTN(WT0, fs);
4964
GEN_LOAD_FREG_FTN(WTH0, fs);
4965
GEN_LOAD_FREG_FTN(WT2, fd);
4966
GEN_LOAD_FREG_FTN(WTH2, fd);
4967
gen_op_float_movz_ps();
4968
GEN_STORE_FTN_FREG(fd, WT2);
4969
GEN_STORE_FTN_FREG(fd, WTH2);
4973
check_cp1_64bitmode(ctx);
4974
GEN_LOAD_REG_TN(T0, ft);
4975
GEN_LOAD_FREG_FTN(WT0, fs);
4976
GEN_LOAD_FREG_FTN(WTH0, fs);
4977
GEN_LOAD_FREG_FTN(WT2, fd);
4978
GEN_LOAD_FREG_FTN(WTH2, fd);
4979
gen_op_float_movn_ps();
4980
GEN_STORE_FTN_FREG(fd, WT2);
4981
GEN_STORE_FTN_FREG(fd, WTH2);
4985
check_cp1_64bitmode(ctx);
4986
GEN_LOAD_FREG_FTN(WT0, ft);
4987
GEN_LOAD_FREG_FTN(WTH0, ft);
4988
GEN_LOAD_FREG_FTN(WT1, fs);
4989
GEN_LOAD_FREG_FTN(WTH1, fs);
4990
gen_op_float_addr_ps();
4991
GEN_STORE_FTN_FREG(fd, WT2);
4992
GEN_STORE_FTN_FREG(fd, WTH2);
4996
check_cp1_64bitmode(ctx);
4997
GEN_LOAD_FREG_FTN(WT0, ft);
4998
GEN_LOAD_FREG_FTN(WTH0, ft);
4999
GEN_LOAD_FREG_FTN(WT1, fs);
5000
GEN_LOAD_FREG_FTN(WTH1, fs);
5001
gen_op_float_mulr_ps();
5002
GEN_STORE_FTN_FREG(fd, WT2);
5003
GEN_STORE_FTN_FREG(fd, WTH2);
5007
check_cp1_64bitmode(ctx);
5008
GEN_LOAD_FREG_FTN(WT0, fs);
5009
GEN_LOAD_FREG_FTN(WTH0, fs);
5010
GEN_LOAD_FREG_FTN(WT2, fd);
5011
GEN_LOAD_FREG_FTN(WTH2, fd);
5012
gen_op_float_recip2_ps();
5013
GEN_STORE_FTN_FREG(fd, WT2);
5014
GEN_STORE_FTN_FREG(fd, WTH2);
5018
check_cp1_64bitmode(ctx);
5019
GEN_LOAD_FREG_FTN(WT0, fs);
5020
GEN_LOAD_FREG_FTN(WTH0, fs);
5021
gen_op_float_recip1_ps();
5022
GEN_STORE_FTN_FREG(fd, WT2);
5023
GEN_STORE_FTN_FREG(fd, WTH2);
5027
check_cp1_64bitmode(ctx);
5028
GEN_LOAD_FREG_FTN(WT0, fs);
5029
GEN_LOAD_FREG_FTN(WTH0, fs);
5030
gen_op_float_rsqrt1_ps();
5031
GEN_STORE_FTN_FREG(fd, WT2);
5032
GEN_STORE_FTN_FREG(fd, WTH2);
5036
check_cp1_64bitmode(ctx);
5037
GEN_LOAD_FREG_FTN(WT0, fs);
5038
GEN_LOAD_FREG_FTN(WTH0, fs);
5039
GEN_LOAD_FREG_FTN(WT2, ft);
5040
GEN_LOAD_FREG_FTN(WTH2, ft);
5041
gen_op_float_rsqrt2_ps();
5042
GEN_STORE_FTN_FREG(fd, WT2);
5043
GEN_STORE_FTN_FREG(fd, WTH2);
5047
check_cp1_64bitmode(ctx);
5048
GEN_LOAD_FREG_FTN(WTH0, fs);
5049
gen_op_float_cvts_pu();
5050
GEN_STORE_FTN_FREG(fd, WT2);
5054
check_cp1_64bitmode(ctx);
5055
GEN_LOAD_FREG_FTN(WT0, fs);
5056
GEN_LOAD_FREG_FTN(WTH0, fs);
5057
gen_op_float_cvtpw_ps();
5058
GEN_STORE_FTN_FREG(fd, WT2);
5059
GEN_STORE_FTN_FREG(fd, WTH2);
5063
check_cp1_64bitmode(ctx);
5064
GEN_LOAD_FREG_FTN(WT0, fs);
5065
gen_op_float_cvts_pl();
5066
GEN_STORE_FTN_FREG(fd, WT2);
5070
check_cp1_64bitmode(ctx);
5071
GEN_LOAD_FREG_FTN(WT0, fs);
5072
GEN_LOAD_FREG_FTN(WT1, ft);
5073
gen_op_float_pll_ps();
5074
GEN_STORE_FTN_FREG(fd, DT2);
5078
check_cp1_64bitmode(ctx);
5079
GEN_LOAD_FREG_FTN(WT0, fs);
5080
GEN_LOAD_FREG_FTN(WTH1, ft);
5081
gen_op_float_plu_ps();
5082
GEN_STORE_FTN_FREG(fd, DT2);
5086
check_cp1_64bitmode(ctx);
5087
GEN_LOAD_FREG_FTN(WTH0, fs);
5088
GEN_LOAD_FREG_FTN(WT1, ft);
5089
gen_op_float_pul_ps();
5090
GEN_STORE_FTN_FREG(fd, DT2);
5094
check_cp1_64bitmode(ctx);
5095
GEN_LOAD_FREG_FTN(WTH0, fs);
5096
GEN_LOAD_FREG_FTN(WTH1, ft);
5097
gen_op_float_puu_ps();
5098
GEN_STORE_FTN_FREG(fd, DT2);
5117
check_cp1_64bitmode(ctx);
5118
GEN_LOAD_FREG_FTN(WT0, fs);
5119
GEN_LOAD_FREG_FTN(WTH0, fs);
5120
GEN_LOAD_FREG_FTN(WT1, ft);
5121
GEN_LOAD_FREG_FTN(WTH1, ft);
5122
if (ctx->opcode & (1 << 6)) {
5123
gen_cmpabs_ps(func-48, cc);
5124
opn = condnames_abs[func-48];
5126
gen_cmp_ps(func-48, cc);
5127
opn = condnames[func-48];
4524
generate_exception_err (ctx, EXCP_RI, 1);
5132
generate_exception (ctx, EXCP_RI);
4528
5137
MIPS_DEBUG("%s %s, %s, %s", opn, fregnames[fd], fregnames[fs], fregnames[ft]);
5140
MIPS_DEBUG("%s %s,%s", opn, fregnames[fs], fregnames[ft]);
4530
5143
MIPS_DEBUG("%s %s,%s", opn, fregnames[fd], fregnames[fs]);
4533
static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf)
4538
ccbit = 1 << (24 + cc);
4542
gen_op_movf(ccbit, rd, rs);
4544
gen_op_movt(ccbit, rd, rs);
4547
#endif /* MIPS_USES_FPU */
5148
/* Coprocessor 3 (FPU) */
5149
static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc,
5150
int fd, int fs, int base, int index)
5152
const char *opn = "extended float load/store";
5155
/* All of those work only on 64bit FPUs. */
5156
check_cp1_64bitmode(ctx);
5161
GEN_LOAD_REG_TN(T0, index);
5162
} else if (index == 0) {
5163
GEN_LOAD_REG_TN(T0, base);
5165
GEN_LOAD_REG_TN(T0, base);
5166
GEN_LOAD_REG_TN(T1, index);
5169
/* Don't do NOP if destination is zero: we must perform the actual
5175
GEN_STORE_FTN_FREG(fd, WT0);
5180
GEN_STORE_FTN_FREG(fd, DT0);
5185
GEN_STORE_FTN_FREG(fd, DT0);
5189
GEN_LOAD_FREG_FTN(WT0, fs);
5195
GEN_LOAD_FREG_FTN(DT0, fs);
5201
GEN_LOAD_FREG_FTN(DT0, fs);
5208
generate_exception(ctx, EXCP_RI);
5211
MIPS_DEBUG("%s %s, %s(%s)", opn, fregnames[store ? fs : fd],
5212
regnames[index], regnames[base]);
5215
static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
5216
int fd, int fr, int fs, int ft)
5218
const char *opn = "flt3_arith";
5220
/* All of those work only on 64bit FPUs. */
5221
check_cp1_64bitmode(ctx);
5224
GEN_LOAD_REG_TN(T0, fr);
5225
GEN_LOAD_FREG_FTN(DT0, fs);
5226
GEN_LOAD_FREG_FTN(DT1, ft);
5227
gen_op_float_alnv_ps();
5228
GEN_STORE_FTN_FREG(fd, DT2);
5232
GEN_LOAD_FREG_FTN(WT0, fs);
5233
GEN_LOAD_FREG_FTN(WT1, ft);
5234
GEN_LOAD_FREG_FTN(WT2, fr);
5235
gen_op_float_muladd_s();
5236
GEN_STORE_FTN_FREG(fd, WT2);
5240
GEN_LOAD_FREG_FTN(DT0, fs);
5241
GEN_LOAD_FREG_FTN(DT1, ft);
5242
GEN_LOAD_FREG_FTN(DT2, fr);
5243
gen_op_float_muladd_d();
5244
GEN_STORE_FTN_FREG(fd, DT2);
5248
GEN_LOAD_FREG_FTN(WT0, fs);
5249
GEN_LOAD_FREG_FTN(WTH0, fs);
5250
GEN_LOAD_FREG_FTN(WT1, ft);
5251
GEN_LOAD_FREG_FTN(WTH1, ft);
5252
GEN_LOAD_FREG_FTN(WT2, fr);
5253
GEN_LOAD_FREG_FTN(WTH2, fr);
5254
gen_op_float_muladd_ps();
5255
GEN_STORE_FTN_FREG(fd, WT2);
5256
GEN_STORE_FTN_FREG(fd, WTH2);
5260
GEN_LOAD_FREG_FTN(WT0, fs);
5261
GEN_LOAD_FREG_FTN(WT1, ft);
5262
GEN_LOAD_FREG_FTN(WT2, fr);
5263
gen_op_float_mulsub_s();
5264
GEN_STORE_FTN_FREG(fd, WT2);
5268
GEN_LOAD_FREG_FTN(DT0, fs);
5269
GEN_LOAD_FREG_FTN(DT1, ft);
5270
GEN_LOAD_FREG_FTN(DT2, fr);
5271
gen_op_float_mulsub_d();
5272
GEN_STORE_FTN_FREG(fd, DT2);
5276
GEN_LOAD_FREG_FTN(WT0, fs);
5277
GEN_LOAD_FREG_FTN(WTH0, fs);
5278
GEN_LOAD_FREG_FTN(WT1, ft);
5279
GEN_LOAD_FREG_FTN(WTH1, ft);
5280
GEN_LOAD_FREG_FTN(WT2, fr);
5281
GEN_LOAD_FREG_FTN(WTH2, fr);
5282
gen_op_float_mulsub_ps();
5283
GEN_STORE_FTN_FREG(fd, WT2);
5284
GEN_STORE_FTN_FREG(fd, WTH2);
5288
GEN_LOAD_FREG_FTN(WT0, fs);
5289
GEN_LOAD_FREG_FTN(WT1, ft);
5290
GEN_LOAD_FREG_FTN(WT2, fr);
5291
gen_op_float_nmuladd_s();
5292
GEN_STORE_FTN_FREG(fd, WT2);
5296
GEN_LOAD_FREG_FTN(DT0, fs);
5297
GEN_LOAD_FREG_FTN(DT1, ft);
5298
GEN_LOAD_FREG_FTN(DT2, fr);
5299
gen_op_float_nmuladd_d();
5300
GEN_STORE_FTN_FREG(fd, DT2);
5304
GEN_LOAD_FREG_FTN(WT0, fs);
5305
GEN_LOAD_FREG_FTN(WTH0, fs);
5306
GEN_LOAD_FREG_FTN(WT1, ft);
5307
GEN_LOAD_FREG_FTN(WTH1, ft);
5308
GEN_LOAD_FREG_FTN(WT2, fr);
5309
GEN_LOAD_FREG_FTN(WTH2, fr);
5310
gen_op_float_nmuladd_ps();
5311
GEN_STORE_FTN_FREG(fd, WT2);
5312
GEN_STORE_FTN_FREG(fd, WTH2);
5316
GEN_LOAD_FREG_FTN(WT0, fs);
5317
GEN_LOAD_FREG_FTN(WT1, ft);
5318
GEN_LOAD_FREG_FTN(WT2, fr);
5319
gen_op_float_nmulsub_s();
5320
GEN_STORE_FTN_FREG(fd, WT2);
5324
GEN_LOAD_FREG_FTN(DT0, fs);
5325
GEN_LOAD_FREG_FTN(DT1, ft);
5326
GEN_LOAD_FREG_FTN(DT2, fr);
5327
gen_op_float_nmulsub_d();
5328
GEN_STORE_FTN_FREG(fd, DT2);
5332
GEN_LOAD_FREG_FTN(WT0, fs);
5333
GEN_LOAD_FREG_FTN(WTH0, fs);
5334
GEN_LOAD_FREG_FTN(WT1, ft);
5335
GEN_LOAD_FREG_FTN(WTH1, ft);
5336
GEN_LOAD_FREG_FTN(WT2, fr);
5337
GEN_LOAD_FREG_FTN(WTH2, fr);
5338
gen_op_float_nmulsub_ps();
5339
GEN_STORE_FTN_FREG(fd, WT2);
5340
GEN_STORE_FTN_FREG(fd, WTH2);
5345
generate_exception (ctx, EXCP_RI);
5348
MIPS_DEBUG("%s %s, %s, %s, %s", opn, fregnames[fd], fregnames[fr],
5349
fregnames[fs], fregnames[ft]);
4549
5352
/* ISA extensions (ASEs) */
4550
5353
/* MIPS16 extension to MIPS32 */
4551
5354
/* SmartMIPS extension to MIPS32 */
4553
#ifdef MIPS_HAS_MIPS64
4554
/* Coprocessor 3 (FPU) */
5356
#ifdef TARGET_MIPS64
4556
5358
/* MDMX extension to MIPS64 */
4557
5359
/* MIPS-3D extension to MIPS64 */
4561
static void gen_blikely(DisasContext *ctx)
4564
l1 = gen_new_label();
4566
gen_op_save_state(ctx->hflags & ~MIPS_HFLAG_BMASK);
4567
gen_goto_tb(ctx, 1, ctx->pc + 4);
4571
static void decode_opc (DisasContext *ctx)
5363
static void decode_opc (CPUState *env, DisasContext *ctx)
4573
5365
int32_t offset;
4574
5366
int rs, rt, rd, sa;