diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-06 11:57:40 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-06 11:57:40 +0100 |
| commit | 91b5c27fd9f87db6782446e9f0f782c41af0588f (patch) | |
| tree | eb3e2e1d5fbfbcb7b3b4d790327e453c40c9f9f3 /src | |
| parent | 943eb97f06d5da96e8592dc9edc486c11c09ae67 (diff) | |
| download | box64-91b5c27fd9f87db6782446e9f0f782c41af0588f.tar.gz box64-91b5c27fd9f87db6782446e9f0f782c41af0588f.zip | |
Stop inlining all the GetE and GetG
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/modrm.h | 2 | ||||
| -rwxr-xr-x | src/emu/x64run_private.c | 148 | ||||
| -rwxr-xr-x | src/emu/x64run_private.h | 158 |
3 files changed, 161 insertions, 147 deletions
diff --git a/src/emu/modrm.h b/src/emu/modrm.h index d5479a1d..b95273b3 100644 --- a/src/emu/modrm.h +++ b/src/emu/modrm.h @@ -18,7 +18,7 @@ #define GETEB oped=GetEb(emu, rex, nextop) #define GETGB opgd=GetGb(emu, rex, nextop) #define GETEW oped=GetEw(emu, rex, nextop) -#define GETGW opgd=GetGd(emu, rex, nextop) +#define GETGW opgd=GetGw(emu, rex, nextop) #define GETEX opex=GetEx(emu, rex, nextop) #define GETGX opgx=GetGx(emu, rex, nextop) #define ED oped diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c index 9d8dfd25..34fed61f 100755 --- a/src/emu/x64run_private.c +++ b/src/emu/x64run_private.c @@ -993,3 +993,151 @@ void PrintTrace(x64emu_t* emu, uintptr_t ip, int dynarec) } #endif + +reg64_t* GetECommon(x64emu_t* emu, rex_t rex, uint8_t m) +{ + if (m<=7) { + if(m==0x4) { + uint8_t sib = Fetch8(emu); + uintptr_t base = ((sib&0x7)==5)?((uint64_t)(int64_t)Fetch32s(emu)):(emu->regs[(sib&0x7)+(rex.b<<3)].q[0]); // base + base += (emu->sbiidx[((sib>>3)&7)+(rex.x<<3)]->sq[0] << (sib>>6)); + return (reg64_t*)base; + } else if (m==0x5) { //disp32 + int32_t base = Fetch32s(emu); + return (reg64_t*)(base+R_RIP); + } + return (reg64_t*)(emu->regs[m+(rex.b<<3)].q[0]); + } else { + uintptr_t base; + if((m&7)==4) { + uint8_t sib = Fetch8(emu); + base = emu->regs[(sib&0x7)+(rex.b<<3)].q[0]; // base + base += (emu->sbiidx[((sib>>3)&7)+(rex.x<<3)]->sq[0] << (sib>>6)); + } else { + base = emu->regs[(m&0x7)+(rex.b<<3)].q[0]; + } + base+=(m&0x80)?Fetch32s(emu):Fetch8s(emu); + return (reg64_t*)base; + } +} + +reg64_t* GetEb(x64emu_t *emu, rex_t rex, uint8_t v) +{ + // rex ignored here + uint8_t m = v&0xC7; // filter Eb + if(m>=0xC0) { + if(rex.rex) { + return &emu->regs[(m&0x07)+(rex.b<<3)]; + } else { + int lowhigh = (m&4)>>2; + return (reg64_t *)(((char*)(&emu->regs[(m&0x03)]))+lowhigh); //? + } + } else return GetECommon(emu, rex, m); +} + +reg64_t* GetEd(x64emu_t *emu, rex_t rex, uint8_t v) +{ + uint8_t m = v&0xC7; // filter Ed + if(m>=0xC0) { + return &emu->regs[(m&0x07)+(rex.b<<3)]; + } else return GetECommon(emu, rex, m); +} + +#define GetEw GetEd + +reg64_t* GetEw16(x64emu_t *emu, rex_t rex, uint8_t v) +{ + uint8_t m = v&0xC7; // filter Ed + if(m>=0xC0) { + return &emu->regs[(m&0x07)]; + } else { + uintptr_t base = 0; + switch(m&7) { + case 0: base = R_BX+R_SI; break; + case 1: base = R_BX+R_DI; break; + case 2: base = R_BP+R_SI; break; + case 3: base = R_BP+R_DI; break; + case 4: base = R_SI; break; + case 5: base = R_DI; break; + case 6: base = R_BP; break; + case 7: base = R_BX; break; + } + switch((m>>6)&3) { + case 0: if(m==6) base = Fetch16(emu); break; + case 1: base += Fetch8s(emu); break; + case 2: base += Fetch16s(emu); break; + // case 3 is C0..C7, already dealt with + } + return (reg64_t*)base; + } +} + +reg64_t* GetEw16off(x64emu_t *emu, rex_t rex, uint8_t v, uintptr_t offset) +{ + uint32_t m = v&0xC7; // filter Ed + if(m>=0xC0) { + return &emu->regs[(m&0x07)]; + } else { + uint32_t base = 0; + switch(m&7) { + case 0: base = R_BX+R_SI; break; + case 1: base = R_BX+R_DI; break; + case 2: base = R_BP+R_SI; break; + case 3: base = R_BP+R_DI; break; + case 4: base = R_SI; break; + case 5: base = R_DI; break; + case 6: base = R_BP; break; + case 7: base = R_BX; break; + } + switch((m>>6)&3) { + case 0: if(m==6) base = Fetch16(emu); break; + case 1: base += Fetch8s(emu); break; + case 2: base += Fetch16s(emu); break; + // case 3 is C0..C7, already dealt with + } + return (reg64_t*)(base+offset); + } +} + +mmx_regs_t* GetEm(x64emu_t *emu, rex_t rex, uint8_t v) +{ + uint8_t m = v&0xC7; // filter Ed + if(m>=0xC0) { + return &emu->mmx[m&0x07]; + } else return (mmx_regs_t*)GetECommon(emu, rex, m); +} + +sse_regs_t* GetEx(x64emu_t *emu, rex_t rex, uint8_t v) +{ + uint8_t m = v&0xC7; // filter Ed + if(m>=0xC0) { + return &emu->xmm[(m&0x07)+(rex.b<<4)]; + } else return (sse_regs_t*)GetECommon(emu, rex, m); +} + + +reg64_t* GetGd(x64emu_t *emu, rex_t rex, uint8_t v) +{ + return &emu->regs[((v&0x38)>>3)+(rex.r<<3)]; +} + +reg64_t* GetGb(x64emu_t *emu, rex_t rex, uint8_t v) +{ + uint8_t m = (v&0x38)>>3; + if(rex.rex) { + return &emu->regs[(m&7)+(rex.r<<3)]; + } else + return (reg64_t*)&emu->regs[m&3].byte[m>>2]; +} + +mmx_regs_t* GetGm(x64emu_t *emu, rex_t rex, uint8_t v) +{ + uint8_t m = (v&0x38)>>3; + return &emu->mmx[m&7]; +} + +sse_regs_t* GetGx(x64emu_t *emu, rex_t rex, uint8_t v) +{ + uint8_t m = (v&0x38)>>3; + return &emu->xmm[(m&7)+(rex.r<<3)]; +} diff --git a/src/emu/x64run_private.h b/src/emu/x64run_private.h index 44e39598..e52e0c62 100755 --- a/src/emu/x64run_private.h +++ b/src/emu/x64run_private.h @@ -73,153 +73,19 @@ static inline void Push(x64emu_t *emu, uint64_t v) // the op code definition can be found here: http://ref.x86asm.net/geek32.html -static inline reg64_t* GetECommon(x64emu_t* emu, rex_t rex, uint8_t m) -{ - if (m<=7) { - if(m==0x4) { - uint8_t sib = Fetch8(emu); - uintptr_t base = ((sib&0x7)==5)?((uint64_t)(int64_t)Fetch32s(emu)):(emu->regs[(sib&0x7)+(rex.b<<3)].q[0]); // base - base += (emu->sbiidx[((sib>>3)&7)+(rex.x<<3)]->sq[0] << (sib>>6)); - return (reg64_t*)base; - } else if (m==0x5) { //disp32 - int32_t base = Fetch32s(emu); - return (reg64_t*)(base+R_RIP); - } - return (reg64_t*)(emu->regs[m+(rex.b<<3)].q[0]); - } else { - uintptr_t base; - if((m&7)==4) { - uint8_t sib = Fetch8(emu); - base = emu->regs[(sib&0x7)+(rex.b<<3)].q[0]; // base - base += (emu->sbiidx[((sib>>3)&7)+(rex.x<<3)]->sq[0] << (sib>>6)); - } else { - base = emu->regs[(m&0x7)+(rex.b<<3)].q[0]; - } - base+=(m&0x80)?Fetch32s(emu):Fetch8s(emu); - return (reg64_t*)base; - } -} - -static inline reg64_t* GetEb(x64emu_t *emu, rex_t rex, uint8_t v) -{ - // rex ignored here - uint8_t m = v&0xC7; // filter Eb - if(m>=0xC0) { - if(rex.rex) { - return &emu->regs[(m&0x07)+(rex.b<<3)]; - } else { - int lowhigh = (m&4)>>2; - return (reg64_t *)(((char*)(&emu->regs[(m&0x03)]))+lowhigh); //? - } - } else return GetECommon(emu, rex, m); -} - -static inline reg64_t* GetEd(x64emu_t *emu, rex_t rex, uint8_t v) -{ - uint8_t m = v&0xC7; // filter Ed - if(m>=0xC0) { - return &emu->regs[(m&0x07)+(rex.b<<3)]; - } else return GetECommon(emu, rex, m); -} - +reg64_t* GetECommon(x64emu_t* emu, rex_t rex, uint8_t m); +reg64_t* GetEb(x64emu_t *emu, rex_t rex, uint8_t v); +reg64_t* GetEd(x64emu_t *emu, rex_t rex, uint8_t v); #define GetEw GetEd - -static inline reg64_t* GetEw16(x64emu_t *emu, rex_t rex, uint8_t v) -{ - uint8_t m = v&0xC7; // filter Ed - if(m>=0xC0) { - return &emu->regs[(m&0x07)]; - } else { - uintptr_t base = 0; - switch(m&7) { - case 0: base = R_BX+R_SI; break; - case 1: base = R_BX+R_DI; break; - case 2: base = R_BP+R_SI; break; - case 3: base = R_BP+R_DI; break; - case 4: base = R_SI; break; - case 5: base = R_DI; break; - case 6: base = R_BP; break; - case 7: base = R_BX; break; - } - switch((m>>6)&3) { - case 0: if(m==6) base = Fetch16(emu); break; - case 1: base += Fetch8s(emu); break; - case 2: base += Fetch16s(emu); break; - // case 3 is C0..C7, already dealt with - } - return (reg64_t*)base; - } -} - -static inline reg64_t* GetEw16off(x64emu_t *emu, rex_t rex, uint8_t v, uintptr_t offset) -{ - uint32_t m = v&0xC7; // filter Ed - if(m>=0xC0) { - return &emu->regs[(m&0x07)]; - } else { - uint32_t base = 0; - switch(m&7) { - case 0: base = R_BX+R_SI; break; - case 1: base = R_BX+R_DI; break; - case 2: base = R_BP+R_SI; break; - case 3: base = R_BP+R_DI; break; - case 4: base = R_SI; break; - case 5: base = R_DI; break; - case 6: base = R_BP; break; - case 7: base = R_BX; break; - } - switch((m>>6)&3) { - case 0: if(m==6) base = Fetch16(emu); break; - case 1: base += Fetch8s(emu); break; - case 2: base += Fetch16s(emu); break; - // case 3 is C0..C7, already dealt with - } - return (reg64_t*)(base+offset); - } -} - -static inline mmx_regs_t* GetEm(x64emu_t *emu, rex_t rex, uint8_t v) -{ - uint8_t m = v&0xC7; // filter Ed - if(m>=0xC0) { - return &emu->mmx[m&0x07]; - } else return (mmx_regs_t*)GetECommon(emu, rex, m); -} - -static inline sse_regs_t* GetEx(x64emu_t *emu, rex_t rex, uint8_t v) -{ - uint8_t m = v&0xC7; // filter Ed - if(m>=0xC0) { - return &emu->xmm[(m&0x07)+(rex.b<<4)]; - } else return (sse_regs_t*)GetECommon(emu, rex, m); -} - - -static inline reg64_t* GetGd(x64emu_t *emu, rex_t rex, uint8_t v) -{ - return &emu->regs[((v&0x38)>>3)+(rex.r<<3)]; -} - -static inline reg64_t* GetGb(x64emu_t *emu, rex_t rex, uint8_t v) -{ - uint8_t m = (v&0x38)>>3; - if(rex.rex) { - return &emu->regs[(m&7)+(rex.r<<3)]; - } else - return (reg64_t*)&emu->regs[m&3].byte[m>>2]; -} - -static inline mmx_regs_t* GetGm(x64emu_t *emu, rex_t rex, uint8_t v) -{ - uint8_t m = (v&0x38)>>3; - return &emu->mmx[m&7]; -} - -static inline sse_regs_t* GetGx(x64emu_t *emu, rex_t rex, uint8_t v) -{ - uint8_t m = (v&0x38)>>3; - return &emu->xmm[(m&7)+(rex.r<<3)]; -} +reg64_t* GetEw16(x64emu_t *emu, rex_t rex, uint8_t v); +reg64_t* GetEw16off(x64emu_t *emu, rex_t rex, uint8_t v, uintptr_t offset); +mmx_regs_t* GetEm(x64emu_t *emu, rex_t rex, uint8_t v); +sse_regs_t* GetEx(x64emu_t *emu, rex_t rex, uint8_t v); +reg64_t* GetGd(x64emu_t *emu, rex_t rex, uint8_t v); +#define GetGw GetGd +reg64_t* GetGb(x64emu_t *emu, rex_t rex, uint8_t v); +mmx_regs_t* GetGm(x64emu_t *emu, rex_t rex, uint8_t v); +sse_regs_t* GetGx(x64emu_t *emu, rex_t rex, uint8_t v); void UpdateFlags(x64emu_t *emu); |