diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-05 11:12:48 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-05 11:12:48 +0100 |
| commit | 386479f408e4e9c0b103e511c1d23c32ae9cf4be (patch) | |
| tree | 8727b9e76fc648222605ae1c6a491defccf4a5e2 /src/emu/modrm.h | |
| parent | 0bf9a5af347778ed1e6d7f20bf684259573794be (diff) | |
| download | box64-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.h | 121 |
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; |