Revision e9c71dd1 target-mips/translate.c
b/target-mips/translate.c | ||
---|---|---|
214 | 214 |
OPC_SPECIAL3D_RESERVED = 0x3D | OPC_SPECIAL, |
215 | 215 |
}; |
216 | 216 |
|
217 |
/* Multiplication variants of the vr54xx. */ |
|
218 |
#define MASK_MUL_VR54XX(op) MASK_SPECIAL(op) | (op & (0x1F << 6)) |
|
219 |
|
|
220 |
enum { |
|
221 |
OPC_VR54XX_MULS = (0x03 << 6) | OPC_MULT, |
|
222 |
OPC_VR54XX_MULSU = (0x03 << 6) | OPC_MULTU, |
|
223 |
OPC_VR54XX_MACC = (0x05 << 6) | OPC_MULT, |
|
224 |
OPC_VR54XX_MACCU = (0x05 << 6) | OPC_MULTU, |
|
225 |
OPC_VR54XX_MSAC = (0x07 << 6) | OPC_MULT, |
|
226 |
OPC_VR54XX_MSACU = (0x07 << 6) | OPC_MULTU, |
|
227 |
OPC_VR54XX_MULHI = (0x09 << 6) | OPC_MULT, |
|
228 |
OPC_VR54XX_MULHIU = (0x09 << 6) | OPC_MULTU, |
|
229 |
OPC_VR54XX_MULSHI = (0x0B << 6) | OPC_MULT, |
|
230 |
OPC_VR54XX_MULSHIU = (0x0B << 6) | OPC_MULTU, |
|
231 |
OPC_VR54XX_MACCHI = (0x0D << 6) | OPC_MULT, |
|
232 |
OPC_VR54XX_MACCHIU = (0x0D << 6) | OPC_MULTU, |
|
233 |
OPC_VR54XX_MSACHI = (0x0F << 6) | OPC_MULT, |
|
234 |
OPC_VR54XX_MSACHIU = (0x0F << 6) | OPC_MULTU, |
|
235 |
}; |
|
236 |
|
|
217 | 237 |
/* REGIMM (rt field) opcodes */ |
218 | 238 |
#define MASK_REGIMM(op) MASK_OP_MAJOR(op) | (op & (0x1F << 16)) |
219 | 239 |
|
... | ... | |
1530 | 1550 |
MIPS_DEBUG("%s %s %s", opn, regnames[rs], regnames[rt]); |
1531 | 1551 |
} |
1532 | 1552 |
|
1553 |
static void gen_mul_vr54xx (DisasContext *ctx, uint32_t opc, |
|
1554 |
int rd, int rs, int rt) |
|
1555 |
{ |
|
1556 |
const char *opn = "mul vr54xx"; |
|
1557 |
|
|
1558 |
GEN_LOAD_REG_T0(rs); |
|
1559 |
GEN_LOAD_REG_T1(rt); |
|
1560 |
|
|
1561 |
switch (opc) { |
|
1562 |
case OPC_VR54XX_MULS: |
|
1563 |
gen_op_muls(); |
|
1564 |
opn = "muls"; |
|
1565 |
break; |
|
1566 |
case OPC_VR54XX_MULSU: |
|
1567 |
gen_op_mulsu(); |
|
1568 |
opn = "mulsu"; |
|
1569 |
break; |
|
1570 |
case OPC_VR54XX_MACC: |
|
1571 |
gen_op_macc(); |
|
1572 |
opn = "macc"; |
|
1573 |
break; |
|
1574 |
case OPC_VR54XX_MACCU: |
|
1575 |
gen_op_maccu(); |
|
1576 |
opn = "maccu"; |
|
1577 |
break; |
|
1578 |
case OPC_VR54XX_MSAC: |
|
1579 |
gen_op_msac(); |
|
1580 |
opn = "msac"; |
|
1581 |
break; |
|
1582 |
case OPC_VR54XX_MSACU: |
|
1583 |
gen_op_msacu(); |
|
1584 |
opn = "msacu"; |
|
1585 |
break; |
|
1586 |
case OPC_VR54XX_MULHI: |
|
1587 |
gen_op_mulhi(); |
|
1588 |
opn = "mulhi"; |
|
1589 |
break; |
|
1590 |
case OPC_VR54XX_MULHIU: |
|
1591 |
gen_op_mulhiu(); |
|
1592 |
opn = "mulhiu"; |
|
1593 |
break; |
|
1594 |
case OPC_VR54XX_MULSHI: |
|
1595 |
gen_op_mulshi(); |
|
1596 |
opn = "mulshi"; |
|
1597 |
break; |
|
1598 |
case OPC_VR54XX_MULSHIU: |
|
1599 |
gen_op_mulshiu(); |
|
1600 |
opn = "mulshiu"; |
|
1601 |
break; |
|
1602 |
case OPC_VR54XX_MACCHI: |
|
1603 |
gen_op_macchi(); |
|
1604 |
opn = "macchi"; |
|
1605 |
break; |
|
1606 |
case OPC_VR54XX_MACCHIU: |
|
1607 |
gen_op_macchiu(); |
|
1608 |
opn = "macchiu"; |
|
1609 |
break; |
|
1610 |
case OPC_VR54XX_MSACHI: |
|
1611 |
gen_op_msachi(); |
|
1612 |
opn = "msachi"; |
|
1613 |
break; |
|
1614 |
case OPC_VR54XX_MSACHIU: |
|
1615 |
gen_op_msachiu(); |
|
1616 |
opn = "msachiu"; |
|
1617 |
break; |
|
1618 |
default: |
|
1619 |
MIPS_INVAL("mul vr54xx"); |
|
1620 |
generate_exception(ctx, EXCP_RI); |
|
1621 |
return; |
|
1622 |
} |
|
1623 |
GEN_STORE_T0_REG(rd); |
|
1624 |
MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]); |
|
1625 |
} |
|
1626 |
|
|
1533 | 1627 |
static void gen_cl (DisasContext *ctx, uint32_t opc, |
1534 | 1628 |
int rd, int rs) |
1535 | 1629 |
{ |
... | ... | |
5973 | 6067 |
gen_arith(env, ctx, op1, rd, rs, rt); |
5974 | 6068 |
break; |
5975 | 6069 |
case OPC_MULT ... OPC_DIVU: |
5976 |
gen_muldiv(ctx, op1, rs, rt); |
|
6070 |
if (sa) { |
|
6071 |
check_insn(env, ctx, INSN_VR54XX); |
|
6072 |
op1 = MASK_MUL_VR54XX(ctx->opcode); |
|
6073 |
gen_mul_vr54xx(ctx, op1, rd, rs, rt); |
|
6074 |
} else |
|
6075 |
gen_muldiv(ctx, op1, rs, rt); |
|
5977 | 6076 |
break; |
5978 | 6077 |
case OPC_JR ... OPC_JALR: |
5979 | 6078 |
gen_compute_branch(ctx, op1, rs, rd, sa); |
Also available in: Unified diff