Virtualmips: implement CLO instruction.
This commit is contained in:
@@ -543,6 +543,23 @@ static int clz_op (cpu_mips_t * cpu, mips_insn_t insn)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int clo_op (cpu_mips_t * cpu, mips_insn_t insn)
|
||||||
|
{
|
||||||
|
int rs = bits (insn, 21, 25);
|
||||||
|
int rd = bits (insn, 11, 15);
|
||||||
|
int i;
|
||||||
|
m_uint32_t val;
|
||||||
|
val = 32;
|
||||||
|
for (i = 31; i >= 0; i--) {
|
||||||
|
if (! (cpu->gpr[rs] & (1 << i))) {
|
||||||
|
val = 31 - i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cpu->reg_set (cpu, rd, val);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
static int cop0_op (cpu_mips_t * cpu, mips_insn_t insn)
|
static int cop0_op (cpu_mips_t * cpu, mips_insn_t insn)
|
||||||
{
|
{
|
||||||
uint16_t special_func = bits (insn, 21, 25);
|
uint16_t special_func = bits (insn, 21, 25);
|
||||||
@@ -2126,8 +2143,8 @@ static const struct mips_op_desc mips_spec2_opcodes[] = {
|
|||||||
{"?spec2", undef_spec2,0x1d},
|
{"?spec2", undef_spec2,0x1d},
|
||||||
{"?spec2", undef_spec2,0x1e},
|
{"?spec2", undef_spec2,0x1e},
|
||||||
{"?spec2", undef_spec2,0x1f},
|
{"?spec2", undef_spec2,0x1f},
|
||||||
{"clz", clz_op, 0x20},
|
{"clz", clz_op, 0x20},
|
||||||
{"?spec2", undef_spec2,0x21},
|
{"clo", clo_op, 0x21},
|
||||||
{"?spec2", undef_spec2,0x22},
|
{"?spec2", undef_spec2,0x22},
|
||||||
{"?spec2", undef_spec2,0x23},
|
{"?spec2", undef_spec2,0x23},
|
||||||
{"?spec2", undef_spec2,0x24},
|
{"?spec2", undef_spec2,0x24},
|
||||||
|
|||||||
Reference in New Issue
Block a user