Implemented IDT instructions. All invalid instruction asserts are now runtime-only.

This commit is contained in:
Aaron Giles 2008-05-20 00:22:50 +00:00
parent 50ec9b1076
commit fdf128e2d7

View File

@ -2820,63 +2820,45 @@ static int generate_regimm(drcuml_block *block, compiler_state *compiler, const
static int generate_idt(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) static int generate_idt(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
{ {
fatalerror("Unimplemented IDT instructions");
#if 0
UINT32 op = *desc->opptr.l; UINT32 op = *desc->opptr.l;
UINT8 opswitch = op & 0x1f; UINT8 opswitch = op & 0x1f;
/* only enabled on IDT processors */
if (mips3.core->flavor != MIPS3_TYPE_R4650)
return FALSE;
switch (opswitch) switch (opswitch)
{ {
case 0: /* MAD */ case 0: /* MAD */
if (RSREG != 0 && RTREG != 0) if (RSREG != 0 && RTREG != 0)
{ {
emit_mov_r32_m32(REG_EAX, REGADDR(RSREG)); // mov eax,[rsreg] UML_MULS(block, IREG(0), IREG(1), R32(RSREG), R32(RTREG)); // muls i0,i1,rsreg,rtreg
emit_mov_r32_m32(REG_EDX, REGADDR(RTREG)); // mov edx,[rtreg] UML_ADDf(block, FLAGS_C, IREG(0), IREG(0), LO32); // add i0,i0,lo
emit_imul_r32(DRCTOP, REG_EDX); // imul edx UML_ADDC(block, IREG(1), IREG(1), HI32); // addc i1,i1,hi
emit_add_r32_m32(DRCTOP, LOADDR); // add eax,[lo] UML_DSEXT4(block, LO64, IREG(0)); // dsext4 lo,i0
emit_adc_r32_m32(DRCTOP, HIADDR); // adc edx,[hi] UML_DSEXT4(block, HI64, IREG(1)); // dsext4 hi,i0
emit_mov_r32_r32(DRCTOP, REG_EBX, REG_EDX); // mov ebx,edx
emit_cdq(DRCTOP); // cdq
emit_mov_m64_r64(DRCTOP, LOADDR, REG_EAX); // mov [lo],edx:eax
emit_mov_r32_r32(DRCTOP, REG_EAX, REG_EBX); // mov eax,ebx
emit_cdq(DRCTOP); // cdq
emit_mov_m64_r64(DRCTOP, HIADDR, REG_EAX); // mov [hi],edx:eax
} }
return compile_SUCCESSFUL_CP(3,4); return TRUE;
case 1: /* MADU */ case 1: /* MADU */
if (RSREG != 0 && RTREG != 0) if (RSREG != 0 && RTREG != 0)
{ {
emit_mov_r32_m32(REG_EAX, REGADDR(RSREG)); // mov eax,[rsreg] UML_MULU(block, IREG(0), IREG(1), R32(RSREG), R32(RTREG)); // mulu i0,i1,rsreg,rtreg
emit_mov_r32_m32(REG_EDX, REGADDR(RTREG)); // mov edx,[rtreg] UML_ADDf(block, FLAGS_C, IREG(0), IREG(0), LO32); // add i0,i0,lo
emit_mul_r32(DRCTOP, REG_EDX); // mul edx UML_ADDC(block, IREG(1), IREG(1), HI32); // addc i1,i1,hi
emit_add_r32_m32(DRCTOP, LOADDR); // add eax,[lo] UML_DSEXT4(block, LO64, IREG(0)); // dsext4 lo,i0
emit_adc_r32_m32(DRCTOP, HIADDR); // adc edx,[hi] UML_DSEXT4(block, HI64, IREG(1)); // dsext4 hi,i0
emit_mov_r32_r32(DRCTOP, REG_EBX, REG_EDX); // mov ebx,edx
emit_cdq(DRCTOP); // cdq
emit_mov_m64_r64(DRCTOP, LOADDR, REG_EDX, REG_EAX); // mov [lo],edx:eax
emit_mov_r32_r32(DRCTOP, REG_EAX, REG_EBX); // mov eax,ebx
emit_cdq(DRCTOP); // cdq
emit_mov_m64_r64(DRCTOP, HIADDR, REG_EDX, REG_EAX); // mov [hi],edx:eax
} }
return compile_SUCCESSFUL_CP(3,4); return TRUE;
case 2: /* MUL */ case 2: /* MUL */
if (RDREG != 0) if (RDREG != 0)
{ {
if (RSREG != 0 && RTREG != 0) UML_MULS(block, IREG(0), IREG(0), R32(RSREG), R32(RTREG)); // muls i0,i0,rsreg,rtreg
{ UML_DSEXT4(block, R64(RDREG), IREG(0)); // dsext4 rdreg,i0
emit_mov_r32_m32(REG_EAX, REGADDR(RSREG)); // mov eax,[rsreg]
emit_imul_r32_m32(REG_EAX, REGADDR(RTREG)); // imul eax,[rtreg]
emit_cdq(DRCTOP); // cdq
emit_mov_m64_r64(REG_ESI, REGADDR(RDREG), REG_EDX, REG_EAX); // mov [rd],edx:eax
}
else
emit_zero_m64(REG_ESI, REGADDR(RDREG));
} }
return compile_SUCCESSFUL_CP(3,4); return TRUE;
} }
#endif
return FALSE; return FALSE;
} }