about summary refs log tree commit diff stats
path: root/src/emu/modrm.h
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-05 11:12:48 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-05 11:12:48 +0100
commit386479f408e4e9c0b103e511c1d23c32ae9cf4be (patch)
tree8727b9e76fc648222605ae1c6a491defccf4a5e2 /src/emu/modrm.h
parent0bf9a5af347778ed1e6d7f20bf684259573794be (diff)
downloadbox64-386479f408e4e9c0b103e511c1d23c32ae9cf4be.tar.gz
box64-386479f408e4e9c0b103e511c1d23c32ae9cf4be.zip
Added REX 0F 40..4F CMOVcc opcodes
Diffstat (limited to 'src/emu/modrm.h')
-rw-r--r--src/emu/modrm.h121
1 files changed, 121 insertions, 0 deletions
diff --git a/src/emu/modrm.h b/src/emu/modrm.h
new file mode 100644
index 00000000..7d1c5c76
--- /dev/null
+++ b/src/emu/modrm.h
@@ -0,0 +1,121 @@
+#define F8      *(uint8_t*)(R_RIP++)

+#define F8S     *(int8_t*)(R_RIP++)

+#define F16     *(uint16_t*)(R_RIP+=2, R_RIP-2)

+#define F32     *(uint32_t*)(R_RIP+=4, R_RIP-4)

+#define F32S    *(int32_t*)(R_RIP+=4, R_RIP-4)

+#define F32S64  (uint64_t)(int64_t)F32S

+#define F64     *(uint64_t*)(R_RIP+=8, R_RIP-8)

+#define F64S    *(int64_t*)(R_RIP+=8, R_RIP-8)

+#define PK(a)   *(uint8_t*)(R_RIP+a)

+#ifdef DYNAREC

+#define STEP if(step) return 0;

+#else

+#define STEP

+#endif

+

+#define GETED oped=GetEd(emu, rex, nextop)

+#define GETGD opgd=GetGd(emu, rex, nextop)

+#define GETEB oped=GetEb(emu, rex, nextop)

+#define GETGB oped=GetGb(emu, rex, nextop)

+#define ED  oped

+#define GD  opgd

+#define EB  oped

+#define GB  oped->byte[0]

+

+#define GOCOND(BASE, PREFIX, CONDITIONAL)       \

+    case BASE+0x0:                              \

+        PREFIX                                  \

+        if(ACCESS_FLAG(F_OF)) {                 \

+            CONDITIONAL                         \

+        }                                       \

+        break;                                  \

+    case BASE+0x1:                              \

+        PREFIX                                  \

+        if(!ACCESS_FLAG(F_OF)) {                \

+            CONDITIONAL                         \

+        }                                       \

+        break;                                  \

+    case BASE+0x2:                              \

+        PREFIX                                  \

+        if(ACCESS_FLAG(F_CF)) {                 \

+            CONDITIONAL                         \

+        }                                       \

+        break;                                  \

+    case BASE+0x3:                              \

+        PREFIX                                  \

+        if(!ACCESS_FLAG(F_CF)) {                \

+            CONDITIONAL                         \

+        }                                       \

+        break;                                  \

+    case BASE+0x4:                              \

+        PREFIX                                  \

+        if(ACCESS_FLAG(F_ZF)) {                 \

+            CONDITIONAL                         \

+        }                                       \

+        break;                                  \

+    case BASE+0x5:                              \

+        PREFIX                                  \

+        if(!ACCESS_FLAG(F_ZF)) {                \

+            CONDITIONAL                         \

+        }                                       \

+        break;                                  \

+    case BASE+0x6:                              \

+        PREFIX                                  \

+        if((ACCESS_FLAG(F_ZF) || ACCESS_FLAG(F_CF))) {  \

+            CONDITIONAL                         \

+        }                                       \

+        break;                                  \

+    case BASE+0x7:                              \

+        PREFIX                                  \

+        if(!(ACCESS_FLAG(F_ZF) || ACCESS_FLAG(F_CF))) { \

+            CONDITIONAL                         \

+        }                                       \

+        break;                                  \

+    case BASE+0x8:                              \

+        PREFIX                                  \

+        if(ACCESS_FLAG(F_SF)) {                 \

+            CONDITIONAL                         \

+        }                                       \

+        break;                                  \

+    case BASE+0x9:                              \

+        PREFIX                                  \

+        if(!ACCESS_FLAG(F_SF)) {                \

+            CONDITIONAL                         \

+        }                                       \

+        break;                                  \

+    case BASE+0xA:                              \

+        PREFIX                                  \

+        if(ACCESS_FLAG(F_PF)) {                 \

+            CONDITIONAL                         \

+        }                                       \

+        break;                                  \

+    case BASE+0xB:                              \

+        PREFIX                                  \

+        if(!ACCESS_FLAG(F_PF)) {                \

+            CONDITIONAL                         \

+        }                                       \

+        break;                                  \

+    case BASE+0xC:                              \

+        PREFIX                                  \

+        if(ACCESS_FLAG(F_SF) != ACCESS_FLAG(F_OF)) {\

+            CONDITIONAL                         \

+        }                                       \

+        break;                                  \

+    case BASE+0xD:                              \

+        PREFIX                                  \

+        if(ACCESS_FLAG(F_SF) == ACCESS_FLAG(F_OF)) {\

+            CONDITIONAL                         \

+        }                                       \

+        break;                                  \

+    case BASE+0xE:                              \

+        PREFIX                                  \

+        if(ACCESS_FLAG(F_ZF) || (ACCESS_FLAG(F_SF) != ACCESS_FLAG(F_OF))) {\

+            CONDITIONAL                         \

+        }                                       \

+        break;                                  \

+    case BASE+0xF:                              \

+        PREFIX                                  \

+        if(!ACCESS_FLAG(F_ZF) && (ACCESS_FLAG(F_SF) == ACCESS_FLAG(F_OF))) {\

+            CONDITIONAL                         \

+        }                                       \

+        break;