summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/emu/cpu/drcbec.c304
-rw-r--r--src/emu/cpu/drcbex64.c192
-rw-r--r--src/emu/cpu/drcbex86.c178
-rw-r--r--src/emu/cpu/drcuml.c26
-rw-r--r--src/emu/cpu/drcuml.h22
-rw-r--r--src/emu/cpu/drcumlsh.h12
6 files changed, 536 insertions, 198 deletions
diff --git a/src/emu/cpu/drcbec.c b/src/emu/cpu/drcbec.c
index e3e4ec40d94..8cc3a8a6264 100644
--- a/src/emu/cpu/drcbec.c
+++ b/src/emu/cpu/drcbec.c
@@ -49,16 +49,52 @@
enum
{
DRCUML_OP_LOAD1 = DRCUML_OP_MAX,
+ DRCUML_OP_LOAD1x2,
+ DRCUML_OP_LOAD1x4,
+ DRCUML_OP_LOAD1x8,
+ DRCUML_OP_LOAD2x1,
DRCUML_OP_LOAD2,
+ DRCUML_OP_LOAD2x4,
+ DRCUML_OP_LOAD2x8,
+ DRCUML_OP_LOAD4x1,
+ DRCUML_OP_LOAD4x2,
DRCUML_OP_LOAD4,
+ DRCUML_OP_LOAD4x8,
+ DRCUML_OP_LOAD8x1,
+ DRCUML_OP_LOAD8x2,
+ DRCUML_OP_LOAD8x4,
DRCUML_OP_LOAD8,
DRCUML_OP_LOADS1,
+ DRCUML_OP_LOADS1x2,
+ DRCUML_OP_LOADS1x4,
+ DRCUML_OP_LOADS1x8,
+ DRCUML_OP_LOADS2x1,
DRCUML_OP_LOADS2,
+ DRCUML_OP_LOADS2x4,
+ DRCUML_OP_LOADS2x8,
+ DRCUML_OP_LOADS4x1,
+ DRCUML_OP_LOADS4x2,
DRCUML_OP_LOADS4,
+ DRCUML_OP_LOADS4x8,
+ DRCUML_OP_LOADS8x1,
+ DRCUML_OP_LOADS8x2,
+ DRCUML_OP_LOADS8x4,
DRCUML_OP_LOADS8,
DRCUML_OP_STORE1,
+ DRCUML_OP_STORE1x2,
+ DRCUML_OP_STORE1x4,
+ DRCUML_OP_STORE1x8,
+ DRCUML_OP_STORE2x1,
DRCUML_OP_STORE2,
+ DRCUML_OP_STORE2x4,
+ DRCUML_OP_STORE2x8,
+ DRCUML_OP_STORE4x1,
+ DRCUML_OP_STORE4x2,
DRCUML_OP_STORE4,
+ DRCUML_OP_STORE4x8,
+ DRCUML_OP_STORE8x1,
+ DRCUML_OP_STORE8x2,
+ DRCUML_OP_STORE8x4,
DRCUML_OP_STORE8,
DRCUML_OP_READ1,
DRCUML_OP_READ2,
@@ -473,13 +509,13 @@ static void drcbec_generate(drcbe_state *drcbe, drcuml_block *block, const drcum
if (opcode == DRCUML_OP_FFRINT || opcode == DRCUML_OP_FFRFLT)
psize[1] = 1 << inst->param[2].value;
- /* pre-expand opcodes that encode size in them */
+ /* pre-expand opcodes that encode size/scale in them */
if (opcode == DRCUML_OP_LOAD)
- opcode = (drcuml_opcode)(DRCUML_OP_LOAD1 + (inst->param[3].value & 3));
+ opcode = (drcuml_opcode)(DRCUML_OP_LOAD1 + (inst->param[3].value & 3) * 4 + ((inst->param[3].value >> 4) & 3));
if (opcode == DRCUML_OP_LOADS)
- opcode = (drcuml_opcode)(DRCUML_OP_LOADS1 + (inst->param[3].value & 3));
+ opcode = (drcuml_opcode)(DRCUML_OP_LOADS1 + (inst->param[3].value & 3) * 4 + ((inst->param[3].value >> 4) & 3));
if (opcode == DRCUML_OP_STORE)
- opcode = (drcuml_opcode)(DRCUML_OP_STORE1 + (inst->param[3].value & 3));
+ opcode = (drcuml_opcode)(DRCUML_OP_STORE1 + (inst->param[3].value & 3) * 4 + ((inst->param[3].value >> 4) & 3));
if (opcode == DRCUML_OP_READ)
opcode = (drcuml_opcode)(DRCUML_OP_READ1 + (inst->param[2].value & 3));
if (opcode == DRCUML_OP_READM)
@@ -728,38 +764,146 @@ static int drcbec_execute(drcbe_state *drcbe, drcuml_codehandle *entry)
PARAM0 = inst[1].puint8[PARAM2];
break;
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD1x2, 4, 0): /* LOAD dst,base,index,BYTE_x2 */
+ PARAM0 = *(UINT8 *)&inst[1].puint16[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD1x4, 4, 0): /* LOAD dst,base,index,BYTE_x4 */
+ PARAM0 = *(UINT8 *)&inst[1].puint32[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD1x8, 4, 0): /* LOAD dst,base,index,BYTE_x8 */
+ PARAM0 = *(UINT8 *)&inst[1].puint64[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD2x1, 4, 0): /* LOAD dst,base,index,WORD_x1 */
+ PARAM0 = *(UINT16 *)&inst[1].puint8[PARAM2];
+ break;
+
case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD2, 4, 0): /* LOAD dst,base,index,WORD */
PARAM0 = inst[1].puint16[PARAM2];
break;
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD2x4, 4, 0): /* LOAD dst,base,index,WORD_x4 */
+ PARAM0 = *(UINT16 *)&inst[1].puint32[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD2x8, 4, 0): /* LOAD dst,base,index,WORD_x8 */
+ PARAM0 = *(UINT16 *)&inst[1].puint64[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD4x1, 4, 0): /* LOAD dst,base,index,DWORD_x1 */
+ PARAM0 = *(UINT32 *)&inst[1].puint8[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD4x2, 4, 0): /* LOAD dst,base,index,DWORD_x2 */
+ PARAM0 = *(UINT32 *)&inst[1].puint16[PARAM2];
+ break;
+
case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD4, 4, 0): /* LOAD dst,base,index,DWORD */
PARAM0 = inst[1].puint32[PARAM2];
break;
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD4x8, 4, 0): /* LOAD dst,base,index,DWORD_x8 */
+ PARAM0 = *(UINT32 *)&inst[1].puint64[PARAM2];
+ break;
+
case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS1, 4, 0): /* LOADS dst,base,index,BYTE */
PARAM0 = inst[1].pint8[PARAM2];
break;
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS1x2, 4, 0): /* LOADS dst,base,index,BYTE_x2 */
+ PARAM0 = *(INT8 *)&inst[1].pint16[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS1x4, 4, 0): /* LOADS dst,base,index,BYTE_x4 */
+ PARAM0 = *(INT8 *)&inst[1].pint32[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS1x8, 4, 0): /* LOADS dst,base,index,BYTE_x8 */
+ PARAM0 = *(INT8 *)&inst[1].pint64[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS2x1, 4, 0): /* LOADS dst,base,index,WORD_x1 */
+ PARAM0 = *(INT16 *)&inst[1].pint8[PARAM2];
+ break;
+
case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS2, 4, 0): /* LOADS dst,base,index,WORD */
PARAM0 = inst[1].pint16[PARAM2];
break;
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS2x4, 4, 0): /* LOADS dst,base,index,WORD_x4 */
+ PARAM0 = *(INT16 *)&inst[1].pint32[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS2x8, 4, 0): /* LOADS dst,base,index,WORD_x8 */
+ PARAM0 = *(INT16 *)&inst[1].pint64[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS4x1, 4, 0): /* LOADS dst,base,index,DWORD_x1 */
+ PARAM0 = *(INT32 *)&inst[1].pint8[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS4x2, 4, 0): /* LOADS dst,base,index,DWORD_x2 */
+ PARAM0 = *(INT32 *)&inst[1].pint16[PARAM2];
+ break;
+
case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS4, 4, 0): /* LOADS dst,base,index,DWORD */
PARAM0 = inst[1].pint32[PARAM2];
break;
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS4x8, 4, 0): /* LOADS dst,base,index,DWORD_x8 */
+ PARAM0 = *(INT32 *)&inst[1].pint64[PARAM2];
+ break;
+
case MAKE_OPCODE_SHORT(DRCUML_OP_STORE1, 4, 0): /* STORE dst,base,index,BYTE */
inst[0].puint8[PARAM1] = PARAM2;
break;
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE1x2, 4, 0): /* STORE dst,base,index,BYTE_x2 */
+ *(UINT8 *)&inst[0].puint16[PARAM1] = PARAM2;
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE1x4, 4, 0): /* STORE dst,base,index,BYTE_x4 */
+ *(UINT8 *)&inst[0].puint32[PARAM1] = PARAM2;
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE1x8, 4, 0): /* STORE dst,base,index,BYTE_x8 */
+ *(UINT8 *)&inst[0].puint64[PARAM1] = PARAM2;
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE2x1, 4, 0): /* STORE dst,base,index,WORD_x1 */
+ *(UINT16 *)&inst[0].puint8[PARAM1] = PARAM2;
+ break;
+
case MAKE_OPCODE_SHORT(DRCUML_OP_STORE2, 4, 0): /* STORE dst,base,index,WORD */
inst[0].puint16[PARAM1] = PARAM2;
break;
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE2x4, 4, 0): /* STORE dst,base,index,WORD_x4 */
+ *(UINT16 *)&inst[0].puint32[PARAM1] = PARAM2;
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE2x8, 4, 0): /* STORE dst,base,index,WORD_x8 */
+ *(UINT16 *)&inst[0].puint64[PARAM1] = PARAM2;
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE4x1, 4, 0): /* STORE dst,base,index,DWORD_x1 */
+ *(UINT32 *)&inst[0].puint8[PARAM1] = PARAM2;
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE4x2, 4, 0): /* STORE dst,base,index,DWORD_x2 */
+ *(UINT32 *)&inst[0].puint16[PARAM1] = PARAM2;
+ break;
+
case MAKE_OPCODE_SHORT(DRCUML_OP_STORE4, 4, 0): /* STORE dst,base,index,DWORD */
inst[0].puint32[PARAM1] = PARAM2;
break;
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE4x8, 4, 0): /* STORE dst,base,index,DWORD_x8 */
+ *(UINT32 *)&inst[0].puint64[PARAM1] = PARAM2;
+ break;
+
case MAKE_OPCODE_SHORT(DRCUML_OP_READ1, 4, 0): /* READ dst,src1,space_BYTE */
PARAM0 = memory_read_byte(drcbe->space[PARAM2 / 16], PARAM1);
break;
@@ -1151,15 +1295,63 @@ static int drcbec_execute(drcbe_state *drcbe, drcuml_codehandle *entry)
DPARAM0 = inst[1].puint8[PARAM2];
break;
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD1x2, 8, 0): /* DLOAD dst,base,index,BYTE_x2 */
+ DPARAM0 = *(UINT8 *)&inst[1].puint16[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD1x4, 8, 0): /* DLOAD dst,base,index,BYTE_x4 */
+ DPARAM0 = *(UINT8 *)&inst[1].puint32[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD1x8, 8, 0): /* DLOAD dst,base,index,BYTE_x8 */
+ DPARAM0 = *(UINT8 *)&inst[1].puint64[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD2x1, 8, 0): /* DLOAD dst,base,index,WORD_x1 */
+ DPARAM0 = *(UINT16 *)&inst[1].puint8[PARAM2];
+ break;
+
case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD2, 8, 0): /* DLOAD dst,base,index,WORD */
DPARAM0 = inst[1].puint16[PARAM2];
break;
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD2x4, 8, 0): /* DLOAD dst,base,index,WORD_x4 */
+ DPARAM0 = *(UINT16 *)&inst[1].puint32[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD2x8, 8, 0): /* DLOAD dst,base,index,WORD_x8 */
+ DPARAM0 = *(UINT16 *)&inst[1].puint64[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD4x1, 8, 0): /* DLOAD dst,base,index,DWORD_x1 */
+ DPARAM0 = *(UINT32 *)&inst[1].puint8[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD4x2, 8, 0): /* DLOAD dst,base,index,DWORD_x2 */
+ DPARAM0 = *(UINT32 *)&inst[1].puint16[PARAM2];
+ break;
+
case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD4, 8, 0): /* DLOAD dst,base,index,DWORD */
DPARAM0 = inst[1].puint32[PARAM2];
break;
- case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD8, 8, 0): /* DLOAD dst,base,index,QWORD */
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD4x8, 8, 0): /* DLOAD dst,base,index,DWORD_x8 */
+ DPARAM0 = *(UINT32 *)&inst[1].puint64[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD8x1, 8, 0): /* DLOAD dst,base,index,QWORD_x1 */
+ DPARAM0 = *(UINT64 *)&inst[1].puint8[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD8x2, 8, 0): /* DLOAD dst,base,index,QWORD_x2 */
+ DPARAM0 = *(UINT64 *)&inst[1].puint16[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD8x4, 8, 0): /* DLOAD dst,base,index,QWORD_x4 */
+ DPARAM0 = *(UINT64 *)&inst[1].puint32[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOAD8, 8, 0): /* DLOAD dst,base,index,QWORD */
DPARAM0 = inst[1].puint64[PARAM2];
break;
@@ -1167,27 +1359,127 @@ static int drcbec_execute(drcbe_state *drcbe, drcuml_codehandle *entry)
DPARAM0 = inst[1].pint8[PARAM2];
break;
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS1x2, 8, 0): /* DLOADS dst,base,index,BYTE_x2 */
+ DPARAM0 = *(INT8 *)&inst[1].pint16[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS1x4, 8, 0): /* DLOADS dst,base,index,BYTE_x4 */
+ DPARAM0 = *(INT8 *)&inst[1].pint32[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS1x8, 8, 0): /* DLOADS dst,base,index,BYTE_x8 */
+ DPARAM0 = *(INT8 *)&inst[1].pint64[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS2x1, 8, 0): /* DLOADS dst,base,index,WORD_x1 */
+ DPARAM0 = *(INT16 *)&inst[1].pint8[PARAM2];
+ break;
+
case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS2, 8, 0): /* DLOADS dst,base,index,WORD */
DPARAM0 = inst[1].pint16[PARAM2];
break;
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS2x4, 8, 0): /* DLOADS dst,base,index,WORD_x4 */
+ DPARAM0 = *(INT16 *)&inst[1].pint32[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS2x8, 8, 0): /* DLOADS dst,base,index,WORD_x8 */
+ DPARAM0 = *(INT16 *)&inst[1].pint64[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS4x1, 8, 0): /* DLOADS dst,base,index,DWORD_x1 */
+ DPARAM0 = *(INT32 *)&inst[1].pint8[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS4x2, 8, 0): /* DLOADS dst,base,index,DWORD_x2 */
+ DPARAM0 = *(INT32 *)&inst[1].pint16[PARAM2];
+ break;
+
case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS4, 8, 0): /* DLOADS dst,base,index,DWORD */
DPARAM0 = inst[1].pint32[PARAM2];
break;
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS4x8, 8, 0): /* DLOADS dst,base,index,DWORD_x8 */
+ DPARAM0 = *(INT32 *)&inst[1].pint64[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS8x1, 8, 0): /* DLOADS dst,base,index,QWORD_x1 */
+ DPARAM0 = *(INT64 *)&inst[1].pint8[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS8x2, 8, 0): /* DLOADS dst,base,index,QWORD_x2 */
+ DPARAM0 = *(INT64 *)&inst[1].pint16[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS8x4, 8, 0): /* DLOADS dst,base,index,QWORD_x4 */
+ DPARAM0 = *(INT64 *)&inst[1].pint32[PARAM2];
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_LOADS8, 8, 0): /* DLOADS dst,base,index,QWORD */
+ DPARAM0 = inst[1].pint64[PARAM2];
+ break;
+
case MAKE_OPCODE_SHORT(DRCUML_OP_STORE1, 8, 0): /* DSTORE dst,base,index,BYTE */
inst[0].puint8[PARAM1] = DPARAM2;
break;
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE1x2, 8, 0): /* DSTORE dst,base,index,BYTE_x2 */
+ *(UINT8 *)&inst[0].puint16[PARAM1] = DPARAM2;
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE1x4, 8, 0): /* DSTORE dst,base,index,BYTE_x4 */
+ *(UINT8 *)&inst[0].puint32[PARAM1] = DPARAM2;
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE1x8, 8, 0): /* DSTORE dst,base,index,BYTE_x8 */
+ *(UINT8 *)&inst[0].puint64[PARAM1] = DPARAM2;
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE2x1, 8, 0): /* DSTORE dst,base,index,WORD_x1 */
+ *(UINT16 *)&inst[0].puint8[PARAM1] = DPARAM2;
+ break;
+
case MAKE_OPCODE_SHORT(DRCUML_OP_STORE2, 8, 0): /* DSTORE dst,base,index,WORD */
inst[0].puint16[PARAM1] = DPARAM2;
break;
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE2x4, 8, 0): /* DSTORE dst,base,index,WORD_x4 */
+ *(UINT16 *)&inst[0].puint32[PARAM1] = DPARAM2;
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE2x8, 8, 0): /* DSTORE dst,base,index,WORD_x8 */
+ *(UINT16 *)&inst[0].puint64[PARAM1] = DPARAM2;
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE4x1, 8, 0): /* DSTORE dst,base,index,DWORD_x1 */
+ *(UINT32 *)&inst[0].puint8[PARAM1] = DPARAM2;
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE4x2, 8, 0): /* DSTORE dst,base,index,DWORD_x2 */
+ *(UINT32 *)&inst[0].puint16[PARAM1] = DPARAM2;
+ break;
+
case MAKE_OPCODE_SHORT(DRCUML_OP_STORE4, 8, 0): /* DSTORE dst,base,index,DWORD */
inst[0].puint32[PARAM1] = DPARAM2;
break;
- case MAKE_OPCODE_SHORT(DRCUML_OP_STORE8, 8, 0): /* DSTORE dst,base,index,QWORD */
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE4x8, 8, 0): /* DSTORE dst,base,index,DWORD_x8 */
+ *(UINT32 *)&inst[0].puint64[PARAM1] = DPARAM2;
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE8x1, 8, 0): /* DSTORE dst,base,index,QWORD_x1 */
+ *(UINT64 *)&inst[0].puint8[PARAM1] = DPARAM2;
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE8x2, 8, 0): /* DSTORE dst,base,index,QWORD_x2 */
+ *(UINT64 *)&inst[0].puint16[PARAM1] = DPARAM2;
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE8x4, 8, 0): /* DSTORE dst,base,index,QWORD_x4 */
+ *(UINT64 *)&inst[0].puint32[PARAM1] = DPARAM2;
+ break;
+
+ case MAKE_OPCODE_SHORT(DRCUML_OP_STORE8, 8, 0): /* DSTORE dst,base,index,QWORD */
inst[0].puint64[PARAM1] = DPARAM2;
break;
diff --git a/src/emu/cpu/drcbex64.c b/src/emu/cpu/drcbex64.c
index bcfe8f15530..ca885246193 100644
--- a/src/emu/cpu/drcbex64.c
+++ b/src/emu/cpu/drcbex64.c
@@ -3808,8 +3808,8 @@ static x86code *op_restore(drcbe_state *drcbe, x86code *dst, const drcuml_instru
static x86code *op_load(drcbe_state *drcbe, x86code *dst, const drcuml_instruction *inst)
{
- drcuml_parameter dstp, basep, indp, sizep;
- int basereg, dstreg;
+ drcuml_parameter dstp, basep, indp, scalesizep;
+ int basereg, dstreg, scale, size;
INT32 baseoffs;
/* validate instruction */
@@ -3818,7 +3818,9 @@ static x86code *op_load(drcbe_state *drcbe, x86code *dst, const drcuml_instructi
assert_no_flags(inst);
/* normalize parameters */
- param_normalize_4(drcbe, inst, &dstp, PTYPE_MR, &basep, PTYPE_M, &indp, PTYPE_MRI, &sizep, PTYPE_I);
+ param_normalize_4(drcbe, inst, &dstp, PTYPE_MR, &basep, PTYPE_M, &indp, PTYPE_MRI, &scalesizep, PTYPE_I);
+ scale = 1 << (scalesizep.value / 16);
+ size = scalesizep.value % 16;
/* determine the pointer base */
basereg = get_base_register_and_offset(drcbe, &dst, basep.value, REG_RDX, &baseoffs);
@@ -3829,14 +3831,14 @@ static x86code *op_load(drcbe_state *drcbe, x86code *dst, const drcuml_instructi
/* immediate index */
if (indp.type == DRCUML_PTYPE_IMMEDIATE)
{
- if (sizep.value == DRCUML_SIZE_BYTE)
- emit_movzx_r32_m8(&dst, dstreg, MBD(basereg, baseoffs + 1*indp.value)); // movzx dstreg,[basep + 1*indp]
- else if (sizep.value == DRCUML_SIZE_WORD)
- emit_movzx_r32_m16(&dst, dstreg, MBD(basereg, baseoffs + 2*indp.value)); // movzx dstreg,[basep + 2*indp]
- else if (sizep.value == DRCUML_SIZE_DWORD)
- emit_mov_r32_m32(&dst, dstreg, MBD(basereg, baseoffs + 4*indp.value)); // mov dstreg,[basep + 4*indp]
- else if (sizep.value == DRCUML_SIZE_QWORD)
- emit_mov_r64_m64(&dst, dstreg, MBD(basereg, baseoffs + 8*indp.value)); // mov dstreg,[basep + 8*indp]
+ if (size == DRCUML_SIZE_BYTE)
+ emit_movzx_r32_m8(&dst, dstreg, MBD(basereg, baseoffs + scale*indp.value)); // movzx dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_WORD)
+ emit_movzx_r32_m16(&dst, dstreg, MBD(basereg, baseoffs + scale*indp.value));// movzx dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_DWORD)
+ emit_mov_r32_m32(&dst, dstreg, MBD(basereg, baseoffs + scale*indp.value)); // mov dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_QWORD)
+ emit_mov_r64_m64(&dst, dstreg, MBD(basereg, baseoffs + scale*indp.value)); // mov dstreg,[basep + scale*indp]
}
/* other index */
@@ -3844,14 +3846,14 @@ static x86code *op_load(drcbe_state *drcbe, x86code *dst, const drcuml_instructi
{
int indreg = param_select_register(REG_ECX, &indp, NULL);
emit_mov_r32_p32(drcbe, &dst, indreg, &indp);
- if (sizep.value == DRCUML_SIZE_BYTE)
- emit_movzx_r32_m8(&dst, dstreg, MBISD(basereg, indreg, 1, baseoffs)); // movzx dstreg,[basep + 1*indp]
- else if (sizep.value == DRCUML_SIZE_WORD)
- emit_movzx_r32_m16(&dst, dstreg, MBISD(basereg, indreg, 2, baseoffs)); // movzx dstreg,[basep + 2*indp]
- else if (sizep.value == DRCUML_SIZE_DWORD)
- emit_mov_r32_m32(&dst, dstreg, MBISD(basereg, indreg, 4, baseoffs)); // mov dstreg,[basep + 4*indp]
- else if (sizep.value == DRCUML_SIZE_QWORD)
- emit_mov_r64_m64(&dst, dstreg, MBISD(basereg, indreg, 8, baseoffs)); // mov dstreg,[basep + 8*indp]
+ if (size == DRCUML_SIZE_BYTE)
+ emit_movzx_r32_m8(&dst, dstreg, MBISD(basereg, indreg, scale, baseoffs)); // movzx dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_WORD)
+ emit_movzx_r32_m16(&dst, dstreg, MBISD(basereg, indreg, scale, baseoffs)); // movzx dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_DWORD)
+ emit_mov_r32_m32(&dst, dstreg, MBISD(basereg, indreg, scale, baseoffs)); // mov dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_QWORD)
+ emit_mov_r64_m64(&dst, dstreg, MBISD(basereg, indreg, scale, baseoffs)); // mov dstreg,[basep + scale*indp]
}
/* store result */
@@ -3870,8 +3872,8 @@ static x86code *op_load(drcbe_state *drcbe, x86code *dst, const drcuml_instructi
static x86code *op_loads(drcbe_state *drcbe, x86code *dst, const drcuml_instruction *inst)
{
- drcuml_parameter dstp, basep, indp, sizep;
- int basereg, dstreg;
+ drcuml_parameter dstp, basep, indp, scalesizep;
+ int basereg, dstreg, scale, size;
INT32 baseoffs;
/* validate instruction */
@@ -3880,7 +3882,9 @@ static x86code *op_loads(drcbe_state *drcbe, x86code *dst, const drcuml_instruct
assert_no_flags(inst);
/* normalize parameters */
- param_normalize_4(drcbe, inst, &dstp, PTYPE_MR, &basep, PTYPE_M, &indp, PTYPE_MRI, &sizep, PTYPE_I);
+ param_normalize_4(drcbe, inst, &dstp, PTYPE_MR, &basep, PTYPE_M, &indp, PTYPE_MRI, &scalesizep, PTYPE_I);
+ scale = 1 << (scalesizep.value / 16);
+ size = scalesizep.value % 16;
/* determine the pointer base */
basereg = get_base_register_and_offset(drcbe, &dst, basep.value, REG_RDX, &baseoffs);
@@ -3893,23 +3897,23 @@ static x86code *op_loads(drcbe_state *drcbe, x86code *dst, const drcuml_instruct
{
if (inst->size == 4)
{
- if (sizep.value == DRCUML_SIZE_BYTE)
- emit_movsx_r32_m8(&dst, dstreg, MBD(basereg, baseoffs + 1*indp.value)); // movsx dstreg,[basep + 1*indp]
- else if (sizep.value == DRCUML_SIZE_WORD)
- emit_movsx_r32_m16(&dst, dstreg, MBD(basereg, baseoffs + 2*indp.value));// movsx dstreg,[basep + 2*indp]
- else if (sizep.value == DRCUML_SIZE_DWORD)
- emit_mov_r32_m32(&dst, dstreg, MBD(basereg, baseoffs + 4*indp.value)); // mov dstreg,[basep + 4*indp]
+ if (size == DRCUML_SIZE_BYTE)
+ emit_movsx_r32_m8(&dst, dstreg, MBD(basereg, baseoffs + scale*indp.value)); // movsx dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_WORD)
+ emit_movsx_r32_m16(&dst, dstreg, MBD(basereg, baseoffs + scale*indp.value));// movsx dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_DWORD)
+ emit_mov_r32_m32(&dst, dstreg, MBD(basereg, baseoffs + scale*indp.value)); // mov dstreg,[basep + scale*indp]
}
else if (inst->size == 8)
{
- if (sizep.value == DRCUML_SIZE_BYTE)
- emit_movsx_r64_m8(&dst, dstreg, MBD(basereg, baseoffs + 1*indp.value)); // movzx dstreg,[basep + 1*indp]
- else if (sizep.value == DRCUML_SIZE_WORD)
- emit_movsx_r64_m16(&dst, dstreg, MBD(basereg, baseoffs + 2*indp.value));// movzx dstreg,[basep + 2*indp]
- else if (sizep.value == DRCUML_SIZE_DWORD)
- emit_movsxd_r64_m32(&dst, dstreg, MBD(basereg, baseoffs + 4*indp.value));// movsxd dstreg,[basep + 4*indp]
- else if (sizep.value == DRCUML_SIZE_QWORD)
- emit_mov_r64_m64(&dst, dstreg, MBD(basereg, baseoffs + 8*indp.value)); // mov dstreg,[basep + 8*indp]
+ if (size == DRCUML_SIZE_BYTE)
+ emit_movsx_r64_m8(&dst, dstreg, MBD(basereg, baseoffs + scale*indp.value)); // movzx dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_WORD)
+ emit_movsx_r64_m16(&dst, dstreg, MBD(basereg, baseoffs + scale*indp.value));// movzx dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_DWORD)
+ emit_movsxd_r64_m32(&dst, dstreg, MBD(basereg, baseoffs + scale*indp.value));// movsxd dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_QWORD)
+ emit_mov_r64_m64(&dst, dstreg, MBD(basereg, baseoffs + scale*indp.value)); // mov dstreg,[basep + scale*indp]
}
}
@@ -3920,23 +3924,23 @@ static x86code *op_loads(drcbe_state *drcbe, x86code *dst, const drcuml_instruct
emit_mov_r32_p32(drcbe, &dst, indreg, &indp);
if (inst->size == 4)
{
- if (sizep.value == DRCUML_SIZE_BYTE)
- emit_movsx_r32_m8(&dst, dstreg, MBISD(basereg, indreg, 1, baseoffs)); // movsx dstreg,[basep + 1*indp]
- else if (sizep.value == DRCUML_SIZE_WORD)
- emit_movsx_r32_m16(&dst, dstreg, MBISD(basereg, indreg, 2, baseoffs)); // movsx dstreg,[basep + 2*indp]
- else if (sizep.value == DRCUML_SIZE_DWORD)
- emit_mov_r32_m32(&dst, dstreg, MBISD(basereg, indreg, 4, baseoffs)); // mov dstreg,[basep + 4*indp]
+ if (size == DRCUML_SIZE_BYTE)
+ emit_movsx_r32_m8(&dst, dstreg, MBISD(basereg, indreg, scale, baseoffs)); // movsx dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_WORD)
+ emit_movsx_r32_m16(&dst, dstreg, MBISD(basereg, indreg, scale, baseoffs)); // movsx dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_DWORD)
+ emit_mov_r32_m32(&dst, dstreg, MBISD(basereg, indreg, scale, baseoffs)); // mov dstreg,[basep + scale*indp]
}
else if (inst->size == 8)
{
- if (sizep.value == DRCUML_SIZE_BYTE)
- emit_movsx_r64_m8(&dst, dstreg, MBISD(basereg, indreg, 1, baseoffs)); // movsx dstreg,[basep + 1*indp]
- else if (sizep.value == DRCUML_SIZE_WORD)
- emit_movsx_r64_m16(&dst, dstreg, MBISD(basereg, indreg, 2, baseoffs)); // movsx dstreg,[basep + 2*indp]
- else if (sizep.value == DRCUML_SIZE_DWORD)
- emit_movsxd_r64_m32(&dst, dstreg, MBISD(basereg, indreg, 4, baseoffs)); // movsxd dstreg,[basep + 4*indp]
- else if (sizep.value == DRCUML_SIZE_QWORD)
- emit_mov_r64_m64(&dst, dstreg, MBISD(basereg, indreg, 8, baseoffs)); // mov dstreg,[basep + 8*indp]
+ if (size == DRCUML_SIZE_BYTE)
+ emit_movsx_r64_m8(&dst, dstreg, MBISD(basereg, indreg, scale, baseoffs)); // movsx dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_WORD)
+ emit_movsx_r64_m16(&dst, dstreg, MBISD(basereg, indreg, scale, baseoffs)); // movsx dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_DWORD)
+ emit_movsxd_r64_m32(&dst, dstreg, MBISD(basereg, indreg, scale, baseoffs)); // movsxd dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_QWORD)
+ emit_mov_r64_m64(&dst, dstreg, MBISD(basereg, indreg, scale, baseoffs)); // mov dstreg,[basep + scale*indp]
}
}
@@ -3956,8 +3960,8 @@ static x86code *op_loads(drcbe_state *drcbe, x86code *dst, const drcuml_instruct
static x86code *op_store(drcbe_state *drcbe, x86code *dst, const drcuml_instruction *inst)
{
- drcuml_parameter srcp, basep, indp, sizep;
- int srcreg, basereg;
+ drcuml_parameter srcp, basep, indp, scalesizep;
+ int srcreg, basereg, scale, size;
INT32 baseoffs;
/* validate instruction */
@@ -3966,7 +3970,9 @@ static x86code *op_store(drcbe_state *drcbe, x86code *dst, const drcuml_instruct
assert_no_flags(inst);
/* normalize parameters */
- param_normalize_4(drcbe, inst, &basep, PTYPE_M, &indp, PTYPE_MRI, &srcp, PTYPE_MRI, &sizep, PTYPE_I);
+ param_normalize_4(drcbe, inst, &basep, PTYPE_M, &indp, PTYPE_MRI, &srcp, PTYPE_MRI, &scalesizep, PTYPE_I);
+ scale = 1 << (scalesizep.value / 16);
+ size = scalesizep.value % 16;
/* determine the pointer base */
basereg = get_base_register_and_offset(drcbe, &dst, basep.value, REG_RDX, &baseoffs);
@@ -3980,21 +3986,21 @@ static x86code *op_store(drcbe_state *drcbe, x86code *dst, const drcuml_instruct
/* immediate source */
if (srcp.type == DRCUML_PTYPE_IMMEDIATE)
{
- if (sizep.value == DRCUML_SIZE_BYTE)
- emit_mov_m8_imm(&dst, MBD(basereg, baseoffs + 1*indp.value), srcp.value); // mov [basep + 1*indp],srcp
- else if (sizep.value == DRCUML_SIZE_WORD)
- emit_mov_m16_imm(&dst, MBD(basereg, baseoffs + 2*indp.value), srcp.value); // mov [basep + 2*indp],srcp
- else if (sizep.value == DRCUML_SIZE_DWORD)
- emit_mov_m32_imm(&dst, MBD(basereg, baseoffs + 4*indp.value), srcp.value); // mov [basep + 4*indp],srcp
- else if (sizep.value == DRCUML_SIZE_QWORD)
+ if (size == DRCUML_SIZE_BYTE)
+ emit_mov_m8_imm(&dst, MBD(basereg, baseoffs + scale*indp.value), srcp.value); // mov [basep + scale*indp],srcp
+ else if (size == DRCUML_SIZE_WORD)
+ emit_mov_m16_imm(&dst, MBD(basereg, baseoffs + scale*indp.value), srcp.value); // mov [basep + scale*indp],srcp
+ else if (size == DRCUML_SIZE_DWORD)
+ emit_mov_m32_imm(&dst, MBD(basereg, baseoffs + scale*indp.value), srcp.value); // mov [basep + scale*indp],srcp
+ else if (size == DRCUML_SIZE_QWORD)
{
if (short_immediate(srcp.value))
- emit_mov_m64_imm(&dst, MBD(basereg, baseoffs + 8*indp.value), srcp.value);// mov [basep + 8*indp],srcp
+ emit_mov_m64_imm(&dst, MBD(basereg, baseoffs + scale*indp.value), srcp.value);// mov [basep + scale*indp],srcp
else
{
- emit_mov_m32_imm(&dst, MBD(basereg, baseoffs + 8*indp.value), srcp.value);// mov [basep + 8*indp],srcp
- emit_mov_m32_imm(&dst, MBD(basereg, baseoffs + 8*indp.value + 4), srcp.value >> 32);
- // mov [basep + 8*indp + 4],srcp >> 32
+ emit_mov_m32_imm(&dst, MBD(basereg, baseoffs + scale*indp.value), srcp.value);// mov [basep + scale*indp],srcp
+ emit_mov_m32_imm(&dst, MBD(basereg, baseoffs + scale*indp.value + 4), srcp.value >> 32);
+ // mov [basep + scale*indp + 4],srcp >> 32
}
}
}
@@ -4002,18 +4008,18 @@ static x86code *op_store(drcbe_state *drcbe, x86code *dst, const drcuml_instruct
/* variable source */
else
{
- if (sizep.value != DRCUML_SIZE_QWORD)
+ if (size != DRCUML_SIZE_QWORD)
emit_mov_r32_p32(drcbe, &dst, srcreg, &srcp); // mov srcreg,srcp
else
emit_mov_r64_p64(drcbe, &dst, srcreg, &srcp); // mov srcreg,srcp
- if (sizep.value == DRCUML_SIZE_BYTE)
- emit_mov_m8_r8(&dst, MBD(basereg, baseoffs + 1*indp.value), srcreg); // mov [basep + 1*indp],srcreg
- else if (sizep.value == DRCUML_SIZE_WORD)
- emit_mov_m16_r16(&dst, MBD(basereg, baseoffs + 2*indp.value), srcreg); // mov [basep + 2*indp],srcreg
- else if (sizep.value == DRCUML_SIZE_DWORD)
- emit_mov_m32_r32(&dst, MBD(basereg, baseoffs + 4*indp.value), srcreg); // mov [basep + 4*indp],srcreg
- else if (sizep.value == DRCUML_SIZE_QWORD)
- emit_mov_m64_r64(&dst, MBD(basereg, baseoffs + 8*indp.value), srcreg); // mov [basep + 8*indp],srcreg
+ if (size == DRCUML_SIZE_BYTE)
+ emit_mov_m8_r8(&dst, MBD(basereg, baseoffs + scale*indp.value), srcreg); // mov [basep + scale*indp],srcreg
+ else if (size == DRCUML_SIZE_WORD)
+ emit_mov_m16_r16(&dst, MBD(basereg, baseoffs + scale*indp.value), srcreg); // mov [basep + scale*indp],srcreg
+ else if (size == DRCUML_SIZE_DWORD)
+ emit_mov_m32_r32(&dst, MBD(basereg, baseoffs + scale*indp.value), srcreg); // mov [basep + scale*indp],srcreg
+ else if (size == DRCUML_SIZE_QWORD)
+ emit_mov_m64_r64(&dst, MBD(basereg, baseoffs + scale*indp.value), srcreg); // mov [basep + scale*indp],srcreg
}
}
@@ -4026,21 +4032,21 @@ static x86code *op_store(drcbe_state *drcbe, x86code *dst, const drcuml_instruct
/* immediate source */
if (srcp.type == DRCUML_PTYPE_IMMEDIATE)
{
- if (sizep.value == DRCUML_SIZE_BYTE)
- emit_mov_m8_imm(&dst, MBISD(basereg, indreg, 1, baseoffs), srcp.value); // mov [basep + 1*ecx],srcp
- else if (sizep.value == DRCUML_SIZE_WORD)
- emit_mov_m16_imm(&dst, MBISD(basereg, indreg, 2, baseoffs), srcp.value);// mov [basep + 2*ecx],srcp
- else if (sizep.value == DRCUML_SIZE_DWORD)
- emit_mov_m32_imm(&dst, MBISD(basereg, indreg, 4, baseoffs), srcp.value);// mov [basep + 4*ecx],srcp
- else if (sizep.value == DRCUML_SIZE_QWORD)
+ if (size == DRCUML_SIZE_BYTE)
+ emit_mov_m8_imm(&dst, MBISD(basereg, indreg, scale, baseoffs), srcp.value); // mov [basep + scale*ecx],srcp
+ else if (size == DRCUML_SIZE_WORD)
+ emit_mov_m16_imm(&dst, MBISD(basereg, indreg, scale, baseoffs), srcp.value);// mov [basep + scale*ecx],srcp
+ else if (size == DRCUML_SIZE_DWORD)
+ emit_mov_m32_imm(&dst, MBISD(basereg, indreg, scale, baseoffs), srcp.value);// mov [basep + scale*ecx],srcp
+ else if (size == DRCUML_SIZE_QWORD)
{
if (short_immediate(srcp.value))
- emit_mov_m64_imm(&dst, MBISD(basereg, indreg, 8, baseoffs), srcp.value);// mov [basep + 8*indp],srcp
+ emit_mov_m64_imm(&dst, MBISD(basereg, indreg, scale, baseoffs), srcp.value);// mov [basep + scale*indp],srcp
else
{
- emit_mov_m32_imm(&dst, MBISD(basereg, indreg, 8, baseoffs), srcp.value);// mov [basep + 8*ecx],srcp
- emit_mov_m32_imm(&dst, MBISD(basereg, indreg, 8, baseoffs + 4), srcp.value >> 32);
- // mov [basep + 8*ecx + 4],srcp >> 32
+ emit_mov_m32_imm(&dst, MBISD(basereg, indreg, scale, baseoffs), srcp.value);// mov [basep + scale*ecx],srcp
+ emit_mov_m32_imm(&dst, MBISD(basereg, indreg, scale, baseoffs + 4), srcp.value >> 32);
+ // mov [basep + scale*ecx + 4],srcp >> 32
}
}
}
@@ -4048,18 +4054,18 @@ static x86code *op_store(drcbe_state *drcbe, x86code *dst, const drcuml_instruct
/* variable source */
else
{
- if (sizep.value != DRCUML_SIZE_QWORD)
+ if (size != DRCUML_SIZE_QWORD)
emit_mov_r32_p32(drcbe, &dst, srcreg, &srcp); // mov srcreg,srcp
else
emit_mov_r64_p64(drcbe, &dst, srcreg, &srcp); // mov edx:srcreg,srcp
- if (sizep.value == DRCUML_SIZE_BYTE)
- emit_mov_m8_r8(&dst, MBISD(basereg, indreg, 1, baseoffs), srcreg); // mov [basep + 1*ecx],srcreg
- else if (sizep.value == DRCUML_SIZE_WORD)
- emit_mov_m16_r16(&dst, MBISD(basereg, indreg, 2, baseoffs), srcreg); // mov [basep + 2*ecx],srcreg
- else if (sizep.value == DRCUML_SIZE_DWORD)
- emit_mov_m32_r32(&dst, MBISD(basereg, indreg, 4, baseoffs), srcreg); // mov [basep + 4*ecx],srcreg
- else if (sizep.value == DRCUML_SIZE_QWORD)
- emit_mov_m64_r64(&dst, MBISD(basereg, indreg, 8, baseoffs), srcreg); // mov [basep + 8*ecx],srcreg
+ if (size == DRCUML_SIZE_BYTE)
+ emit_mov_m8_r8(&dst, MBISD(basereg, indreg, scale, baseoffs), srcreg); // mov [basep + scale*ecx],srcreg
+ else if (size == DRCUML_SIZE_WORD)
+ emit_mov_m16_r16(&dst, MBISD(basereg, indreg, scale, baseoffs), srcreg);// mov [basep + scale*ecx],srcreg
+ else if (size == DRCUML_SIZE_DWORD)
+ emit_mov_m32_r32(&dst, MBISD(basereg, indreg, scale, baseoffs), srcreg);// mov [basep + scale*ecx],srcreg
+ else if (size == DRCUML_SIZE_QWORD)
+ emit_mov_m64_r64(&dst, MBISD(basereg, indreg, scale, baseoffs), srcreg);// mov [basep + scale*ecx],srcreg
}
}
return dst;
diff --git a/src/emu/cpu/drcbex86.c b/src/emu/cpu/drcbex86.c
index d8848f8329a..d099527dace 100644
--- a/src/emu/cpu/drcbex86.c
+++ b/src/emu/cpu/drcbex86.c
@@ -3856,8 +3856,8 @@ static x86code *op_restore(drcbe_state *drcbe, x86code *dst, const drcuml_instru
static x86code *op_load(drcbe_state *drcbe, x86code *dst, const drcuml_instruction *inst)
{
- drcuml_parameter dstp, basep, indp, sizep;
- int dstreg;
+ drcuml_parameter dstp, basep, indp, scalesizep;
+ int dstreg, scale, size;
/* validate instruction */
assert(inst->size == 4 || inst->size == 8);
@@ -3865,7 +3865,9 @@ static x86code *op_load(drcbe_state *drcbe, x86code *dst, const drcuml_instructi
assert_no_flags(inst);
/* normalize parameters */
- param_normalize_4(drcbe, inst, &dstp, PTYPE_MR, &basep, PTYPE_M, &indp, PTYPE_MRI, &sizep, PTYPE_I);
+ param_normalize_4(drcbe, inst, &dstp, PTYPE_MR, &basep, PTYPE_M, &indp, PTYPE_MRI, &scalesizep, PTYPE_I);
+ scale = 1 << (scalesizep.value / 16);
+ size = scalesizep.value % 16;
/* pick a target register for the general case */
dstreg = param_select_register(REG_EAX, &dstp, NULL);
@@ -3873,16 +3875,16 @@ static x86code *op_load(drcbe_state *drcbe, x86code *dst, const drcuml_instructi
/* immediate index */
if (indp.type == DRCUML_PTYPE_IMMEDIATE)
{
- if (sizep.value == DRCUML_SIZE_BYTE)
- emit_movzx_r32_m8(&dst, dstreg, MABS(basep.value + 1*indp.value)); // movzx dstreg,[basep + 1*indp]
- else if (sizep.value == DRCUML_SIZE_WORD)
- emit_movzx_r32_m16(&dst, dstreg, MABS(basep.value + 2*indp.value)); // movzx dstreg,[basep + 2*indp]
- else if (sizep.value == DRCUML_SIZE_DWORD)
- emit_mov_r32_m32(&dst, dstreg, MABS(basep.value + 4*indp.value)); // mov dstreg,[basep + 4*indp]
- else if (sizep.value == DRCUML_SIZE_QWORD)
+ if (size == DRCUML_SIZE_BYTE)
+ emit_movzx_r32_m8(&dst, dstreg, MABS(basep.value + scale*indp.value)); // movzx dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_WORD)
+ emit_movzx_r32_m16(&dst, dstreg, MABS(basep.value + scale*indp.value)); // movzx dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_DWORD)
+ emit_mov_r32_m32(&dst, dstreg, MABS(basep.value + scale*indp.value)); // mov dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_QWORD)
{
- emit_mov_r32_m32(&dst, REG_EDX, MABS(basep.value + 8*indp.value + 4)); // mov edx,[basep + 8*indp + 4]
- emit_mov_r32_m32(&dst, dstreg, MABS(basep.value + 8*indp.value)); // mov dstreg,[basep + 8*indp]
+ emit_mov_r32_m32(&dst, REG_EDX, MABS(basep.value + scale*indp.value + 4)); // mov edx,[basep + scale*indp + 4]
+ emit_mov_r32_m32(&dst, dstreg, MABS(basep.value + scale*indp.value)); // mov dstreg,[basep + scale*indp]
}
}
@@ -3891,16 +3893,16 @@ static x86code *op_load(drcbe_state *drcbe, x86code *dst, const drcuml_instructi
{
int indreg = param_select_register(REG_ECX, &indp, NULL);
emit_mov_r32_p32(drcbe, &dst, indreg, &indp);
- if (sizep.value == DRCUML_SIZE_BYTE)
- emit_movzx_r32_m8(&dst, dstreg, MISD(indreg, 1, basep.value)); // movzx dstreg,[basep + 1*indp]
- else if (sizep.value == DRCUML_SIZE_WORD)
- emit_movzx_r32_m16(&dst, dstreg, MISD(indreg, 2, basep.value)); // movzx dstreg,[basep + 2*indp]
- else if (sizep.value == DRCUML_SIZE_DWORD)
- emit_mov_r32_m32(&dst, dstreg, MISD(indreg, 4, basep.value)); // mov dstreg,[basep + 4*indp]
- else if (sizep.value == DRCUML_SIZE_QWORD)
+ if (size == DRCUML_SIZE_BYTE)
+ emit_movzx_r32_m8(&dst, dstreg, MISD(indreg, scale, basep.value)); // movzx dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_WORD)
+ emit_movzx_r32_m16(&dst, dstreg, MISD(indreg, scale, basep.value)); // movzx dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_DWORD)
+ emit_mov_r32_m32(&dst, dstreg, MISD(indreg, scale, basep.value)); // mov dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_QWORD)
{
- emit_mov_r32_m32(&dst, REG_EDX, MISD(indreg, 8, basep.value + 4)); // mov edx,[basep + 8*indp + 4]
- emit_mov_r32_m32(&dst, dstreg, MISD(indreg, 8, basep.value)); // mov dstreg,[basep + 8*indp]
+ emit_mov_r32_m32(&dst, REG_EDX, MISD(indreg, scale, basep.value + 4)); // mov edx,[basep + scale*indp + 4]
+ emit_mov_r32_m32(&dst, dstreg, MISD(indreg, scale, basep.value)); // mov dstreg,[basep + scale*indp]
}
}
@@ -3911,7 +3913,7 @@ static x86code *op_load(drcbe_state *drcbe, x86code *dst, const drcuml_instructi
if (inst->size == 8)
{
/* 1, 2, or 4-byte case */
- if (sizep.value != DRCUML_SIZE_QWORD)
+ if (size != DRCUML_SIZE_QWORD)
{
if (dstp.type == DRCUML_PTYPE_MEMORY)
emit_mov_m32_imm(&dst, MABS(dstp.value + 4), 0); // mov [dstp+4],0
@@ -3938,8 +3940,8 @@ static x86code *op_load(drcbe_state *drcbe, x86code *dst, const drcuml_instructi
static x86code *op_loads(drcbe_state *drcbe, x86code *dst, const drcuml_instruction *inst)
{
- drcuml_parameter dstp, basep, indp, sizep;
- int dstreg;
+ drcuml_parameter dstp, basep, indp, scalesizep;
+ int dstreg, scale, size;
/* validate instruction */
assert(inst->size == 4 || inst->size == 8);
@@ -3947,7 +3949,9 @@ static x86code *op_loads(drcbe_state *drcbe, x86code *dst, const drcuml_instruct
assert_no_flags(inst);
/* normalize parameters */
- param_normalize_4(drcbe, inst, &dstp, PTYPE_MR, &basep, PTYPE_M, &indp, PTYPE_MRI, &sizep, PTYPE_I);
+ param_normalize_4(drcbe, inst, &dstp, PTYPE_MR, &basep, PTYPE_M, &indp, PTYPE_MRI, &scalesizep, PTYPE_I);
+ scale = 1 << (scalesizep.value / 16);
+ size = scalesizep.value % 16;
/* pick a target register for the general case */
dstreg = param_select_register(REG_EAX, &dstp, NULL);
@@ -3955,16 +3959,16 @@ static x86code *op_loads(drcbe_state *drcbe, x86code *dst, const drcuml_instruct
/* immediate index */
if (indp.type == DRCUML_PTYPE_IMMEDIATE)
{
- if (sizep.value == DRCUML_SIZE_BYTE)
- emit_movsx_r32_m8(&dst, dstreg, MABS(basep.value + 1*indp.value)); // movsx dstreg,[basep + 1*indp]
- else if (sizep.value == DRCUML_SIZE_WORD)
- emit_movsx_r32_m16(&dst, dstreg, MABS(basep.value + 2*indp.value)); // movsx dstreg,[basep + 2*indp]
- else if (sizep.value == DRCUML_SIZE_DWORD)
- emit_mov_r32_m32(&dst, dstreg, MABS(basep.value + 4*indp.value)); // mov dstreg,[basep + 4*indp]
- else if (sizep.value == DRCUML_SIZE_QWORD)
+ if (size == DRCUML_SIZE_BYTE)
+ emit_movsx_r32_m8(&dst, dstreg, MABS(basep.value + scale*indp.value)); // movsx dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_WORD)
+ emit_movsx_r32_m16(&dst, dstreg, MABS(basep.value + scale*indp.value)); // movsx dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_DWORD)
+ emit_mov_r32_m32(&dst, dstreg, MABS(basep.value + scale*indp.value)); // mov dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_QWORD)
{
- emit_mov_r32_m32(&dst, REG_EDX, MABS(basep.value + 8*indp.value + 4)); // mov edx,[basep + 8*indp + 4]
- emit_mov_r32_m32(&dst, dstreg, MABS(basep.value + 8*indp.value)); // mov dstreg,[basep + 8*indp]
+ emit_mov_r32_m32(&dst, REG_EDX, MABS(basep.value + scale*indp.value + 4)); // mov edx,[basep + scale*indp + 4]
+ emit_mov_r32_m32(&dst, dstreg, MABS(basep.value + scale*indp.value)); // mov dstreg,[basep + scale*indp]
}
}
@@ -3973,16 +3977,16 @@ static x86code *op_loads(drcbe_state *drcbe, x86code *dst, const drcuml_instruct
{
int indreg = param_select_register(REG_ECX, &indp, NULL);
emit_mov_r32_p32(drcbe, &dst, indreg, &indp);
- if (sizep.value == DRCUML_SIZE_BYTE)
- emit_movsx_r32_m8(&dst, dstreg, MISD(indreg, 1, basep.value)); // movsx dstreg,[basep + 1*indp]
- else if (sizep.value == DRCUML_SIZE_WORD)
- emit_movsx_r32_m16(&dst, dstreg, MISD(indreg, 2, basep.value)); // movsx dstreg,[basep + 2*indp]
- else if (sizep.value == DRCUML_SIZE_DWORD)
- emit_mov_r32_m32(&dst, dstreg, MISD(indreg, 4, basep.value)); // mov dstreg,[basep + 4*indp]
- else if (sizep.value == DRCUML_SIZE_QWORD)
+ if (size == DRCUML_SIZE_BYTE)
+ emit_movsx_r32_m8(&dst, dstreg, MISD(indreg, scale, basep.value)); // movsx dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_WORD)
+ emit_movsx_r32_m16(&dst, dstreg, MISD(indreg, scale, basep.value)); // movsx dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_DWORD)
+ emit_mov_r32_m32(&dst, dstreg, MISD(indreg, scale, basep.value)); // mov dstreg,[basep + scale*indp]
+ else if (size == DRCUML_SIZE_QWORD)
{
- emit_mov_r32_m32(&dst, REG_EDX, MISD(indreg, 8, basep.value + 4)); // mov edx,[basep + 8*indp + 4]
- emit_mov_r32_m32(&dst, dstreg, MISD(indreg, 8, basep.value)); // mov dstreg,[basep + 8*indp]
+ emit_mov_r32_m32(&dst, REG_EDX, MISD(indreg, scale, basep.value + 4)); // mov edx,[basep + scale*indp + 4]
+ emit_mov_r32_m32(&dst, dstreg, MISD(indreg, scale, basep.value)); // mov dstreg,[basep + scale*indp]
}
}
@@ -4008,8 +4012,8 @@ static x86code *op_loads(drcbe_state *drcbe, x86code *dst, const drcuml_instruct
static x86code *op_store(drcbe_state *drcbe, x86code *dst, const drcuml_instruction *inst)
{
- drcuml_parameter srcp, basep, indp, sizep;
- int srcreg;
+ drcuml_parameter srcp, basep, indp, scalesizep;
+ int srcreg, scale, size;
/* validate instruction */
assert(inst->size == 4 || inst->size == 8);
@@ -4017,11 +4021,13 @@ static x86code *op_store(drcbe_state *drcbe, x86code *dst, const drcuml_instruct
assert_no_flags(inst);
/* normalize parameters */
- param_normalize_4(drcbe, inst, &basep, PTYPE_M, &indp, PTYPE_MRI, &srcp, PTYPE_MRI, &sizep, PTYPE_I);
+ param_normalize_4(drcbe, inst, &basep, PTYPE_M, &indp, PTYPE_MRI, &srcp, PTYPE_MRI, &scalesizep, PTYPE_I);
+ scale = 1 << (scalesizep.value / 16);
+ size = scalesizep.value % 16;
/* pick a source register for the general case */
srcreg = param_select_register(REG_EAX, &srcp, NULL);
- if (sizep.value == DRCUML_SIZE_BYTE && (srcreg & 4))
+ if (size == DRCUML_SIZE_BYTE && (srcreg & 4))
srcreg = REG_EAX;
/* degenerate case: constant index */
@@ -4030,37 +4036,37 @@ static x86code *op_store(drcbe_state *drcbe, x86code *dst, const drcuml_instruct
/* immediate source */
if (srcp.type == DRCUML_PTYPE_IMMEDIATE)
{
- if (sizep.value == DRCUML_SIZE_BYTE)
- emit_mov_m8_imm(&dst, MABS(basep.value + 1*indp.value), srcp.value); // mov [basep + 1*indp],srcp
- else if (sizep.value == DRCUML_SIZE_WORD)
- emit_mov_m16_imm(&dst, MABS(basep.value + 2*indp.value), srcp.value); // mov [basep + 2*indp],srcp
- else if (sizep.value == DRCUML_SIZE_DWORD)
- emit_mov_m32_imm(&dst, MABS(basep.value + 4*indp.value), srcp.value); // mov [basep + 4*indp],srcp
- else if (sizep.value == DRCUML_SIZE_QWORD)
+ if (size == DRCUML_SIZE_BYTE)
+ emit_mov_m8_imm(&dst, MABS(basep.value + scale*indp.value), srcp.value); // mov [basep + scale*indp],srcp
+ else if (size == DRCUML_SIZE_WORD)
+ emit_mov_m16_imm(&dst, MABS(basep.value + scale*indp.value), srcp.value); // mov [basep + scale*indp],srcp
+ else if (size == DRCUML_SIZE_DWORD)
+ emit_mov_m32_imm(&dst, MABS(basep.value + scale*indp.value), srcp.value); // mov [basep + scale*indp],srcp
+ else if (size == DRCUML_SIZE_QWORD)
{
- emit_mov_m32_imm(&dst, MABS(basep.value + 8*indp.value), srcp.value); // mov [basep + 8*indp],srcp
- emit_mov_m32_imm(&dst, MABS(basep.value + 8*indp.value + 4), srcp.value >> 32);
- // mov [basep + 8*indp + 4],srcp >> 32
+ emit_mov_m32_imm(&dst, MABS(basep.value + scale*indp.value), srcp.value); // mov [basep + scale*indp],srcp
+ emit_mov_m32_imm(&dst, MABS(basep.value + scale*indp.value + 4), srcp.value >> 32);
+ // mov [basep + scale*indp + 4],srcp >> 32
}
}
/* variable source */
else
{
- if (sizep.value != DRCUML_SIZE_QWORD)
+ if (size != DRCUML_SIZE_QWORD)
emit_mov_r32_p32(drcbe, &dst, srcreg, &srcp); // mov srcreg,srcp
else
emit_mov_r64_p64(drcbe, &dst, srcreg, REG_EDX, &srcp); // mov edx:srcreg,srcp
- if (sizep.value == DRCUML_SIZE_BYTE)
- emit_mov_m8_r8(&dst, MABS(basep.value + 1*indp.value), srcreg); // mov [basep + 1*indp],srcreg
- else if (sizep.value == DRCUML_SIZE_WORD)
- emit_mov_m16_r16(&dst, MABS(basep.value + 2*indp.value), srcreg); // mov [basep + 2*indp],srcreg
- else if (sizep.value == DRCUML_SIZE_DWORD)
- emit_mov_m32_r32(&dst, MABS(basep.value + 4*indp.value), srcreg); // mov [basep + 4*indp],srcreg
- else if (sizep.value == DRCUML_SIZE_QWORD)
+ if (size == DRCUML_SIZE_BYTE)
+ emit_mov_m8_r8(&dst, MABS(basep.value + scale*indp.value), srcreg); // mov [basep + scale*indp],srcreg
+ else if (size == DRCUML_SIZE_WORD)
+ emit_mov_m16_r16(&dst, MABS(basep.value + scale*indp.value), srcreg); // mov [basep + scale*indp],srcreg
+ else if (size == DRCUML_SIZE_DWORD)
+ emit_mov_m32_r32(&dst, MABS(basep.value + scale*indp.value), srcreg); // mov [basep + scale*indp],srcreg
+ else if (size == DRCUML_SIZE_QWORD)
{
- emit_mov_m32_r32(&dst, MABS(basep.value + 8*indp.value), srcreg); // mov [basep + 8*indp],srcreg
- emit_mov_m32_r32(&dst, MABS(basep.value + 8*indp.value + 4), REG_EDX); // mov [basep + 8*indp + 4],edx
+ emit_mov_m32_r32(&dst, MABS(basep.value + scale*indp.value), srcreg); // mov [basep + scale*indp],srcreg
+ emit_mov_m32_r32(&dst, MABS(basep.value + scale*indp.value + 4), REG_EDX); // mov [basep + scale*indp + 4],edx
}
}
}
@@ -4074,16 +4080,16 @@ static x86code *op_store(drcbe_state *drcbe, x86code *dst, const drcuml_instruct
/* immediate source */
if (srcp.type == DRCUML_PTYPE_IMMEDIATE)
{
- if (sizep.value == DRCUML_SIZE_BYTE)
- emit_mov_m8_imm(&dst, MISD(indreg, 1, basep.value), srcp.value); // mov [basep + 1*ecx],srcp
- else if (sizep.value == DRCUML_SIZE_WORD)
- emit_mov_m16_imm(&dst, MISD(indreg, 2, basep.value), srcp.value); // mov [basep + 2*ecx],srcp
- else if (sizep.value == DRCUML_SIZE_DWORD)
- emit_mov_m32_imm(&dst, MISD(indreg, 4, basep.value), srcp.value); // mov [basep + 4*ecx],srcp
- else if (sizep.value == DRCUML_SIZE_QWORD)
+ if (size == DRCUML_SIZE_BYTE)
+ emit_mov_m8_imm(&dst, MISD(indreg, scale, basep.value), srcp.value); // mov [basep + 1*ecx],srcp
+ else if (size == DRCUML_SIZE_WORD)
+ emit_mov_m16_imm(&dst, MISD(indreg, scale, basep.value), srcp.value); // mov [basep + 2*ecx],srcp
+ else if (size == DRCUML_SIZE_DWORD)
+ emit_mov_m32_imm(&dst, MISD(indreg, scale, basep.value), srcp.value); // mov [basep + 4*ecx],srcp
+ else if (size == DRCUML_SIZE_QWORD)
{
- emit_mov_m32_imm(&dst, MISD(indreg, 8, basep.value), srcp.value); // mov [basep + 8*ecx],srcp
- emit_mov_m32_imm(&dst, MISD(indreg, 8, basep.value + 4), srcp.value >> 32);
+ emit_mov_m32_imm(&dst, MISD(indreg, scale, basep.value), srcp.value); // mov [basep + 8*ecx],srcp
+ emit_mov_m32_imm(&dst, MISD(indreg, scale, basep.value + 4), srcp.value >> 32);
// mov [basep + 8*ecx + 4],srcp >> 32
}
}
@@ -4091,20 +4097,20 @@ static x86code *op_store(drcbe_state *drcbe, x86code *dst, const drcuml_instruct
/* variable source */
else
{
- if (sizep.value != DRCUML_SIZE_QWORD)
+ if (size != DRCUML_SIZE_QWORD)
emit_mov_r32_p32(drcbe, &dst, srcreg, &srcp); // mov srcreg,srcp
else
emit_mov_r64_p64(drcbe, &dst, srcreg, REG_EDX, &srcp); // mov edx:srcreg,srcp
- if (sizep.value == DRCUML_SIZE_BYTE)
- emit_mov_m8_r8(&dst, MISD(indreg, 1, basep.value), srcreg); // mov [basep + 1*ecx],srcreg
- else if (sizep.value == DRCUML_SIZE_WORD)
- emit_mov_m16_r16(&dst, MISD(indreg, 2, basep.value), srcreg); // mov [basep + 2*ecx],srcreg
- else if (sizep.value == DRCUML_SIZE_DWORD)
- emit_mov_m32_r32(&dst, MISD(indreg, 4, basep.value), srcreg); // mov [basep + 4*ecx],srcreg
- else if (sizep.value == DRCUML_SIZE_QWORD)
+ if (size == DRCUML_SIZE_BYTE)
+ emit_mov_m8_r8(&dst, MISD(indreg, scale, basep.value), srcreg); // mov [basep + 1*ecx],srcreg
+ else if (size == DRCUML_SIZE_WORD)
+ emit_mov_m16_r16(&dst, MISD(indreg, scale, basep.value), srcreg); // mov [basep + 2*ecx],srcreg
+ else if (size == DRCUML_SIZE_DWORD)
+ emit_mov_m32_r32(&dst, MISD(indreg, scale, basep.value), srcreg); // mov [basep + 4*ecx],srcreg
+ else if (size == DRCUML_SIZE_QWORD)
{
- emit_mov_m32_r32(&dst, MISD(indreg, 8, basep.value), srcreg); // mov [basep + 8*ecx],srcreg
- emit_mov_m32_r32(&dst, MISD(indreg, 8, basep.value + 4), REG_EDX); // mov [basep + 8*ecx],edx
+ emit_mov_m32_r32(&dst, MISD(indreg, scale, basep.value), srcreg); // mov [basep + 8*ecx],srcreg
+ emit_mov_m32_r32(&dst, MISD(indreg, scale, basep.value + 4), REG_EDX); // mov [basep + 8*ecx],edx
}
}
}
diff --git a/src/emu/cpu/drcuml.c b/src/emu/cpu/drcuml.c
index 46ecc958c9f..cd42eae0510 100644
--- a/src/emu/cpu/drcuml.c
+++ b/src/emu/cpu/drcuml.c
@@ -100,10 +100,11 @@
#define PTYPES_CFUNC (PTYPES_MEM | 0x4000)
#define PTYPES_HAND (PTYPES_MEM | 0x5000)
#define PTYPES_SIZE (PTYPES_IMM | 0x8000)
-#define PTYPES_SPACE (PTYPES_IMM | 0x9000)
-#define PTYPES_SPSZ (PTYPES_IMM | 0xa000)
-#define PTYPES_FMOD (PTYPES_IMM | 0xb000)
-#define PTYPES_LAB (PTYPES_IMM | 0xc000)
+#define PTYPES_SCSZ (PTYPES_IMM | 0x9000)
+#define PTYPES_SPACE (PTYPES_IMM | 0xa000)
+#define PTYPES_SPSZ (PTYPES_IMM | 0xb000)
+#define PTYPES_FMOD (PTYPES_IMM | 0xc000)
+#define PTYPES_LAB (PTYPES_IMM | 0xd000)
/* combinations of types */
#define PTYPES_IRM (PTYPES_IREG | PTYPES_MEM)
@@ -227,9 +228,9 @@ static const drcuml_opcode_info opcode_info_source[] =
OPINFO1(RESTORE, "restore", 4, FALSE, NONE, ALL, ALL, PINFO(IN, OP, STATE))
/* Integer Operations */
- OPINFO4(LOAD, "!load", 4|8, FALSE, NONE, NONE, ALL, PINFO(OUT, OP, IRM), PINFO(IN, OP, PTR), PINFO(IN, 4, IANY), PINFO(IN, OP, SIZE))
- OPINFO4(LOADS, "!loads", 4|8, FALSE, NONE, NONE, ALL, PINFO(OUT, OP, IRM), PINFO(IN, OP, PTR), PINFO(IN, 4, IANY), PINFO(IN, OP, SIZE))
- OPINFO4(STORE, "!store", 4|8, FALSE, NONE, NONE, ALL, PINFO(IN, OP, PTR), PINFO(IN, 4, IANY), PINFO(IN, OP, IANY), PINFO(IN, OP, SIZE))
+ OPINFO4(LOAD, "!load", 4|8, FALSE, NONE, NONE, ALL, PINFO(OUT, OP, IRM), PINFO(IN, OP, PTR), PINFO(IN, 4, IANY), PINFO(IN, OP, SCSZ))
+ OPINFO4(LOADS, "!loads", 4|8, FALSE, NONE, NONE, ALL, PINFO(OUT, OP, IRM), PINFO(IN, OP, PTR), PINFO(IN, 4, IANY), PINFO(IN, OP, SCSZ))
+ OPINFO4(STORE, "!store", 4|8, FALSE, NONE, NONE, ALL, PINFO(IN, OP, PTR), PINFO(IN, 4, IANY), PINFO(IN, OP, IANY), PINFO(IN, OP, SCSZ))
OPINFO3(READ, "!read", 4|8, FALSE, NONE, NONE, ALL, PINFO(OUT, OP, IRM), PINFO(IN, 4, IANY), PINFO(IN, OP, SPSZ))
OPINFO4(READM, "!readm", 4|8, FALSE, NONE, NONE, ALL, PINFO(OUT, OP, IRM), PINFO(IN, 4, IANY), PINFO(IN, OP, IANY), PINFO(IN, OP, SPSZ))
OPINFO3(WRITE, "!write", 4|8, FALSE, NONE, NONE, ALL, PINFO(IN, 4, IANY), PINFO(IN, OP, IANY), PINFO(IN, OP, SPSZ))
@@ -1193,6 +1194,17 @@ void drcuml_disasm(const drcuml_instruction *inst, char *buffer, drcuml_state *d
else if (typemask == PTYPES_SPSZ)
dest += sprintf(dest, "%s_%s", address_space_names[param->value / 16], sizes[param->value % 16]);
+ /* size + scale immediate */
+ else if (typemask == PTYPES_SCSZ)
+ {
+ int scale = param->value / 16;
+ int size = param->value % 16;
+ if (scale == size)
+ dest += sprintf(dest, "%s", sizes[size]);
+ else
+ dest += sprintf(dest, "%s_x%d", sizes[size], 1 << scale);
+ }
+
/* fmod immediate */
else if (typemask == PTYPES_FMOD)
dest += sprintf(dest, "%s", fmods[param->value]);
diff --git a/src/emu/cpu/drcuml.h b/src/emu/cpu/drcuml.h
index 2fca1928410..b59ce37dc52 100644
--- a/src/emu/cpu/drcuml.h
+++ b/src/emu/cpu/drcuml.h
@@ -163,6 +163,28 @@ enum
};
+/* scale/space combinations */
+enum
+{
+ DRCUML_SCSIZE_BYTE = (0 * 16) + DRCUML_SIZE_BYTE,
+ DRCUML_SCSIZE_BYTE_x2 = (1 * 16) + DRCUML_SIZE_BYTE,
+ DRCUML_SCSIZE_BYTE_x4 = (2 * 16) + DRCUML_SIZE_BYTE,
+ DRCUML_SCSIZE_BYTE_x8 = (3 * 16) + DRCUML_SIZE_BYTE,
+ DRCUML_SCSIZE_WORD_x1 = (0 * 16) + DRCUML_SIZE_WORD,
+ DRCUML_SCSIZE_WORD = (1 * 16) + DRCUML_SIZE_WORD,
+ DRCUML_SCSIZE_WORD_x4 = (2 * 16) + DRCUML_SIZE_WORD,
+ DRCUML_SCSIZE_WORD_x8 = (3 * 16) + DRCUML_SIZE_WORD,
+ DRCUML_SCSIZE_DWORD_x1 = (0 * 16) + DRCUML_SIZE_DWORD,
+ DRCUML_SCSIZE_DWORD_x2 = (1 * 16) + DRCUML_SIZE_DWORD,
+ DRCUML_SCSIZE_DWORD = (2 * 16) + DRCUML_SIZE_DWORD,
+ DRCUML_SCSIZE_DWORD_x8 = (3 * 16) + DRCUML_SIZE_DWORD,
+ DRCUML_SCSIZE_QWORD_x1 = (0 * 16) + DRCUML_SIZE_QWORD,
+ DRCUML_SCSIZE_QWORD_x2 = (1 * 16) + DRCUML_SIZE_QWORD,
+ DRCUML_SCSIZE_QWORD_x4 = (2 * 16) + DRCUML_SIZE_QWORD,
+ DRCUML_SCSIZE_QWORD = (3 * 16) + DRCUML_SIZE_QWORD
+};
+
+
/* size/space combinations */
enum
{
diff --git a/src/emu/cpu/drcumlsh.h b/src/emu/cpu/drcumlsh.h
index 89c29beb676..f83ca6b7cfc 100644
--- a/src/emu/cpu/drcumlsh.h
+++ b/src/emu/cpu/drcumlsh.h
@@ -106,9 +106,9 @@
/* ----- 32-Bit Integer Operations ----- */
-#define UML_LOAD(block, dst, base, index, size) do { drcuml_block_append_4(block, DRCUML_OP_LOAD, 4, IF_ALWAYS, dst, MEM(base), index, IMM(DRCUML_SIZE_##size)); } while (0)
-#define UML_LOADS(block, dst, base, index, size) do { drcuml_block_append_4(block, DRCUML_OP_LOADS, 4, IF_ALWAYS, dst, MEM(base), index, IMM(DRCUML_SIZE_##size)); } while (0)
-#define UML_STORE(block, base, index, src1, size) do { drcuml_block_append_4(block, DRCUML_OP_STORE, 4, IF_ALWAYS, MEM(base), index, src1, IMM(DRCUML_SIZE_##size)); } while (0)
+#define UML_LOAD(block, dst, base, index, size) do { drcuml_block_append_4(block, DRCUML_OP_LOAD, 4, IF_ALWAYS, dst, MEM(base), index, IMM(DRCUML_SCSIZE_##size)); } while (0)
+#define UML_LOADS(block, dst, base, index, size) do { drcuml_block_append_4(block, DRCUML_OP_LOADS, 4, IF_ALWAYS, dst, MEM(base), index, IMM(DRCUML_SCSIZE_##size)); } while (0)
+#define UML_STORE(block, base, index, src1, size) do { drcuml_block_append_4(block, DRCUML_OP_STORE, 4, IF_ALWAYS, MEM(base), index, src1, IMM(DRCUML_SCSIZE_##size)); } while (0)
#define UML_READ(block, dst, src1, spsize) do { drcuml_block_append_3(block, DRCUML_OP_READ, 4, IF_ALWAYS, dst, src1, IMM(DRCUML_SPSIZE_##spsize)); } while (0)
#define UML_READM(block, dst, src1, mask, spsize) do { drcuml_block_append_4(block, DRCUML_OP_READM, 4, IF_ALWAYS, dst, src1, mask, IMM(DRCUML_SPSIZE_##spsize)); } while (0)
#define UML_WRITE(block, dst, src1, spsize) do { drcuml_block_append_3(block, DRCUML_OP_WRITE, 4, IF_ALWAYS, dst, src1, IMM(DRCUML_SPSIZE_##spsize)); } while (0)
@@ -145,9 +145,9 @@
/* ----- 64-Bit Integer Operations ----- */
-#define UML_DLOAD(block, dst, base, index, size) do { drcuml_block_append_4(block, DRCUML_OP_LOAD, 8, IF_ALWAYS, dst, MEM(base), index, IMM(DRCUML_SIZE_##size)); } while (0)
-#define UML_DLOADS(block, dst, base, index, size) do { drcuml_block_append_4(block, DRCUML_OP_LOADS, 8, IF_ALWAYS, dst, MEM(base), index, IMM(DRCUML_SIZE_##size)); } while (0)
-#define UML_DSTORE(block, base, index, src1, size) do { drcuml_block_append_4(block, DRCUML_OP_STORE, 8, IF_ALWAYS, MEM(base), index, src1, IMM(DRCUML_SIZE_##size)); } while (0)
+#define UML_DLOAD(block, dst, base, index, size) do { drcuml_block_append_4(block, DRCUML_OP_LOAD, 8, IF_ALWAYS, dst, MEM(base), index, IMM(DRCUML_SCSIZE_##size)); } while (0)
+#define UML_DLOADS(block, dst, base, index, size) do { drcuml_block_append_4(block, DRCUML_OP_LOADS, 8, IF_ALWAYS, dst, MEM(base), index, IMM(DRCUML_SCSIZE_##size)); } while (0)
+#define UML_DSTORE(block, base, index, src1, size) do { drcuml_block_append_4(block, DRCUML_OP_STORE, 8, IF_ALWAYS, MEM(base), index, src1, IMM(DRCUML_SCSIZE_##size)); } while (0)
#define UML_DREAD(block, dst, src1, spsize) do { drcuml_block_append_3(block, DRCUML_OP_READ, 8, IF_ALWAYS, dst, src1, IMM(DRCUML_SPSIZE_##spsize)); } while (0)
#define UML_DREADM(block, dst, src1, mask, spsize) do { drcuml_block_append_4(block, DRCUML_OP_READM, 8, IF_ALWAYS, dst, src1, mask, IMM(DRCUML_SPSIZE_##spsize)); } while (0)
#define UML_DWRITE(block, dst, src1, spsize) do { drcuml_block_append_3(block, DRCUML_OP_WRITE, 8, IF_ALWAYS, dst, src1, IMM(DRCUML_SPSIZE_##spsize)); } while (0)