@@ -2257,26 +2257,14 @@ bool ppc_device::generate_opcode(drcuml_block &block, compiler_state *compiler,
2257
2257
UML_MAPVAR (block, MAPVAR_DSISR, DSISR_IMMU (op)); // mapvar dsisr,DSISR_IMMU(op)
2258
2258
UML_MOV (block, mem (&m_core->tempaddr ), R32Z (G_RA (op))); // mov [tempaddr],ra
2259
2259
2260
- if ( G_RD (op) <= G_RA (op) && !(m_cap & PPCCAP_4XX) && m_flavor != PPC_MODEL_601 )
2260
+ for ( int regnum = G_RD (op); regnum < 32 ; regnum++ )
2261
2261
{
2262
- // RA being in the range is an invalid form
2263
- // 403 and 405 manual allows writes where regnum != RA || regnum == 31, regnum == RA is skipped
2264
- // 601 user manual lists no special rules for R31 being valid but regnum == RA is skipped
2265
- // 603 and above just says it's an invalid form
2266
- // tropchnc (403GA) is known to use this behavior
2267
- UML_EXH (block, *m_exception[EXCEPTION_PROGRAM], 0x80000 ); // exh exception_program,0x80000
2268
- }
2269
- else
2270
- {
2271
- for (int regnum = G_RD (op); regnum < 32 ; regnum++)
2272
- {
2273
- UML_ADD (block, I0, mem (&m_core->tempaddr ), (int16_t )G_SIMM (op) + 4 * (regnum - G_RD (op)));
2274
- // add i0,[tempaddr],simm + 4*(regnum-rd)
2275
- UML_CALLH (block, *m_read32align[m_core->mode ]); // callh read32align
2262
+ UML_ADD (block, I0, mem (&m_core->tempaddr ), (int16_t )G_SIMM (op) + 4 * (regnum - G_RD (op)));
2263
+ // add i0,[tempaddr],simm + 4*(regnum-rd)
2264
+ UML_CALLH (block, *m_read32align[m_core->mode ]); // callh read32align
2276
2265
2277
- if (regnum != G_RA (op) || ((m_cap & PPCCAP_4XX) && regnum == 31 ))
2278
- UML_MOV (block, R32 (regnum), I0); // mov regnum,i0
2279
- }
2266
+ if (regnum != G_RA (op) || ((m_cap & PPCCAP_4XX) && regnum == 31 ))
2267
+ UML_MOV (block, R32 (regnum), I0); // mov regnum,i0
2280
2268
}
2281
2269
generate_update_cycles (block, compiler, desc->pc + 4 , true ); // <update cycles>
2282
2270
return true ;
0 commit comments