Revision 5a1e8ffb target-mips/translate.c
b/target-mips/translate.c | ||
---|---|---|
490 | 490 |
FGEN32(gen_op_load_fpr_WTH2, gen_op_load_fpr_WTH2_fpr); |
491 | 491 |
FGEN32(gen_op_store_fpr_WTH2, gen_op_store_fpr_WTH2_fpr); |
492 | 492 |
|
493 |
#define FOP_CONDS(fmt) \
|
|
494 |
static GenOpFunc1 * cond_ ## fmt ## _table[16] = { \
|
|
495 |
gen_op_cmp_ ## fmt ## _f, \
|
|
496 |
gen_op_cmp_ ## fmt ## _un, \
|
|
497 |
gen_op_cmp_ ## fmt ## _eq, \
|
|
498 |
gen_op_cmp_ ## fmt ## _ueq, \
|
|
499 |
gen_op_cmp_ ## fmt ## _olt, \
|
|
500 |
gen_op_cmp_ ## fmt ## _ult, \
|
|
501 |
gen_op_cmp_ ## fmt ## _ole, \
|
|
502 |
gen_op_cmp_ ## fmt ## _ule, \
|
|
503 |
gen_op_cmp_ ## fmt ## _sf, \
|
|
504 |
gen_op_cmp_ ## fmt ## _ngle, \
|
|
505 |
gen_op_cmp_ ## fmt ## _seq, \
|
|
506 |
gen_op_cmp_ ## fmt ## _ngl, \
|
|
507 |
gen_op_cmp_ ## fmt ## _lt, \
|
|
508 |
gen_op_cmp_ ## fmt ## _nge, \
|
|
509 |
gen_op_cmp_ ## fmt ## _le, \
|
|
510 |
gen_op_cmp_ ## fmt ## _ngt, \
|
|
493 |
#define FOP_CONDS(type, fmt) \
|
|
494 |
static GenOpFunc1 * cond ## 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, \
|
|
511 | 511 |
}; \ |
512 |
static inline void gen_cmp_ ## fmt(int n, long cc) \
|
|
512 |
static inline void gen_cmp ## type ## _ ## fmt(int n, long cc) \
|
|
513 | 513 |
{ \ |
514 |
cond_ ## fmt ## _table[n](cc); \
|
|
514 |
cond ## type ## _ ## fmt ## _table[n](cc); \
|
|
515 | 515 |
} |
516 | 516 |
|
517 |
FOP_CONDS(d) |
|
518 |
FOP_CONDS(s) |
|
519 |
FOP_CONDS(ps) |
|
517 |
FOP_CONDS(, d) |
|
518 |
FOP_CONDS(abs, d) |
|
519 |
FOP_CONDS(, s) |
|
520 |
FOP_CONDS(abs, s) |
|
521 |
FOP_CONDS(, ps) |
|
522 |
FOP_CONDS(abs, ps) |
|
520 | 523 |
|
521 | 524 |
typedef struct DisasContext { |
522 | 525 |
struct TranslationBlock *tb; |
... | ... | |
4453 | 4456 |
"c.le", |
4454 | 4457 |
"c.ngt", |
4455 | 4458 |
}; |
4456 |
int binary = 0; |
|
4459 |
const char *condnames_abs[] = { |
|
4460 |
"cabs.f", |
|
4461 |
"cabs.un", |
|
4462 |
"cabs.eq", |
|
4463 |
"cabs.ueq", |
|
4464 |
"cabs.olt", |
|
4465 |
"cabs.ult", |
|
4466 |
"cabs.ole", |
|
4467 |
"cabs.ule", |
|
4468 |
"cabs.sf", |
|
4469 |
"cabs.ngle", |
|
4470 |
"cabs.seq", |
|
4471 |
"cabs.ngl", |
|
4472 |
"cabs.lt", |
|
4473 |
"cabs.nge", |
|
4474 |
"cabs.le", |
|
4475 |
"cabs.ngt", |
|
4476 |
}; |
|
4477 |
enum { BINOP, CMPOP, OTHEROP } optype = OTHEROP; |
|
4457 | 4478 |
uint32_t func = ctx->opcode & 0x3f; |
4458 | 4479 |
|
4459 | 4480 |
switch (ctx->opcode & FOP(0x3f, 0x1f)) { |
... | ... | |
4463 | 4484 |
gen_op_float_add_s(); |
4464 | 4485 |
GEN_STORE_FTN_FREG(fd, WT2); |
4465 | 4486 |
opn = "add.s"; |
4466 |
binary = 1;
|
|
4487 |
optype = BINOP;
|
|
4467 | 4488 |
break; |
4468 | 4489 |
case FOP(1, 16): |
4469 | 4490 |
GEN_LOAD_FREG_FTN(WT0, fs); |
... | ... | |
4471 | 4492 |
gen_op_float_sub_s(); |
4472 | 4493 |
GEN_STORE_FTN_FREG(fd, WT2); |
4473 | 4494 |
opn = "sub.s"; |
4474 |
binary = 1;
|
|
4495 |
optype = BINOP;
|
|
4475 | 4496 |
break; |
4476 | 4497 |
case FOP(2, 16): |
4477 | 4498 |
GEN_LOAD_FREG_FTN(WT0, fs); |
... | ... | |
4479 | 4500 |
gen_op_float_mul_s(); |
4480 | 4501 |
GEN_STORE_FTN_FREG(fd, WT2); |
4481 | 4502 |
opn = "mul.s"; |
4482 |
binary = 1;
|
|
4503 |
optype = BINOP;
|
|
4483 | 4504 |
break; |
4484 | 4505 |
case FOP(3, 16): |
4485 | 4506 |
GEN_LOAD_FREG_FTN(WT0, fs); |
... | ... | |
4487 | 4508 |
gen_op_float_div_s(); |
4488 | 4509 |
GEN_STORE_FTN_FREG(fd, WT2); |
4489 | 4510 |
opn = "div.s"; |
4490 |
binary = 1;
|
|
4511 |
optype = BINOP;
|
|
4491 | 4512 |
break; |
4492 | 4513 |
case FOP(4, 16): |
4493 | 4514 |
GEN_LOAD_FREG_FTN(WT0, fs); |
... | ... | |
4635 | 4656 |
case FOP(63, 16): |
4636 | 4657 |
GEN_LOAD_FREG_FTN(WT0, fs); |
4637 | 4658 |
GEN_LOAD_FREG_FTN(WT1, ft); |
4638 |
gen_cmp_s(func-48, cc); |
|
4639 |
opn = condnames[func-48]; |
|
4659 |
if (ctx->opcode & (1 << 6)) { |
|
4660 |
gen_cmpabs_s(func-48, cc); |
|
4661 |
opn = condnames_abs[func-48]; |
|
4662 |
} else { |
|
4663 |
gen_cmp_s(func-48, cc); |
|
4664 |
opn = condnames[func-48]; |
|
4665 |
} |
|
4640 | 4666 |
break; |
4641 | 4667 |
case FOP(0, 17): |
4642 | 4668 |
CHECK_FR(ctx, fs | ft | fd); |
... | ... | |
4645 | 4671 |
gen_op_float_add_d(); |
4646 | 4672 |
GEN_STORE_FTN_FREG(fd, DT2); |
4647 | 4673 |
opn = "add.d"; |
4648 |
binary = 1;
|
|
4674 |
optype = BINOP;
|
|
4649 | 4675 |
break; |
4650 | 4676 |
case FOP(1, 17): |
4651 | 4677 |
CHECK_FR(ctx, fs | ft | fd); |
... | ... | |
4654 | 4680 |
gen_op_float_sub_d(); |
4655 | 4681 |
GEN_STORE_FTN_FREG(fd, DT2); |
4656 | 4682 |
opn = "sub.d"; |
4657 |
binary = 1;
|
|
4683 |
optype = BINOP;
|
|
4658 | 4684 |
break; |
4659 | 4685 |
case FOP(2, 17): |
4660 | 4686 |
CHECK_FR(ctx, fs | ft | fd); |
... | ... | |
4663 | 4689 |
gen_op_float_mul_d(); |
4664 | 4690 |
GEN_STORE_FTN_FREG(fd, DT2); |
4665 | 4691 |
opn = "mul.d"; |
4666 |
binary = 1;
|
|
4692 |
optype = BINOP;
|
|
4667 | 4693 |
break; |
4668 | 4694 |
case FOP(3, 17): |
4669 | 4695 |
CHECK_FR(ctx, fs | ft | fd); |
... | ... | |
4672 | 4698 |
gen_op_float_div_d(); |
4673 | 4699 |
GEN_STORE_FTN_FREG(fd, DT2); |
4674 | 4700 |
opn = "div.d"; |
4675 |
binary = 1;
|
|
4701 |
optype = BINOP;
|
|
4676 | 4702 |
break; |
4677 | 4703 |
case FOP(4, 17): |
4678 | 4704 |
CHECK_FR(ctx, fs | fd); |
... | ... | |
4801 | 4827 |
CHECK_FR(ctx, fs | ft); |
4802 | 4828 |
GEN_LOAD_FREG_FTN(DT0, fs); |
4803 | 4829 |
GEN_LOAD_FREG_FTN(DT1, ft); |
4804 |
gen_cmp_d(func-48, cc); |
|
4805 |
opn = condnames[func-48]; |
|
4830 |
if (ctx->opcode & (1 << 6)) { |
|
4831 |
gen_cmpabs_d(func-48, cc); |
|
4832 |
opn = condnames_abs[func-48]; |
|
4833 |
} else { |
|
4834 |
gen_cmp_d(func-48, cc); |
|
4835 |
opn = condnames[func-48]; |
|
4836 |
} |
|
4806 | 4837 |
break; |
4807 | 4838 |
case FOP(32, 17): |
4808 | 4839 |
CHECK_FR(ctx, fs); |
... | ... | |
5042 | 5073 |
GEN_LOAD_FREG_FTN(WTH0, fs); |
5043 | 5074 |
GEN_LOAD_FREG_FTN(WT1, ft); |
5044 | 5075 |
GEN_LOAD_FREG_FTN(WTH1, ft); |
5045 |
gen_cmp_ps(func-48, cc); |
|
5046 |
opn = condnames[func-48]; |
|
5076 |
if (ctx->opcode & (1 << 6)) { |
|
5077 |
gen_cmpabs_ps(func-48, cc); |
|
5078 |
opn = condnames_abs[func-48]; |
|
5079 |
} else { |
|
5080 |
gen_cmp_ps(func-48, cc); |
|
5081 |
opn = condnames[func-48]; |
|
5082 |
} |
|
5047 | 5083 |
break; |
5048 | 5084 |
default: |
5049 | 5085 |
MIPS_INVAL(opn); |
5050 | 5086 |
generate_exception (ctx, EXCP_RI); |
5051 | 5087 |
return; |
5052 | 5088 |
} |
5053 |
if (binary) |
|
5089 |
switch (optype) { |
|
5090 |
case BINOP: |
|
5054 | 5091 |
MIPS_DEBUG("%s %s, %s, %s", opn, fregnames[fd], fregnames[fs], fregnames[ft]); |
5055 |
else |
|
5092 |
break; |
|
5093 |
case CMPOP: |
|
5094 |
MIPS_DEBUG("%s %s,%s", opn, fregnames[fs], fregnames[ft]); |
|
5095 |
break; |
|
5096 |
default: |
|
5056 | 5097 |
MIPS_DEBUG("%s %s,%s", opn, fregnames[fd], fregnames[fs]); |
5098 |
break; |
|
5099 |
} |
|
5057 | 5100 |
} |
5058 | 5101 |
|
5059 | 5102 |
/* Coprocessor 3 (FPU) */ |
Also available in: Unified diff