diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-07-02 10:17:28 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-07-02 10:17:28 +0200 |
| commit | 140254f311eead840969229040c807ad3da3f177 (patch) | |
| tree | 9aa0454f457504de7967c3d3522ad29ed580264a /src | |
| parent | 56401f667525063eac16081d19395527d3403e60 (diff) | |
| download | box64-140254f311eead840969229040c807ad3da3f177.tar.gz box64-140254f311eead840969229040c807ad3da3f177.zip | |
[DYNAREC] Fixed DIV opcode, and added test17 about div/idiv
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_arm64_00.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c index 31605840..6e1c67e7 100755 --- a/src/dynarec/dynarec_arm64_00.c +++ b/src/dynarec/dynarec_arm64_00.c @@ -2237,7 +2237,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } else { GETEDH(x1, 0); // get edd changed addr, so cannot be called 2 times for same op... CBZxw_MARK(xRDX); - if(ed!=x1) {MOVxw_REG(x1, ed);} + if(ed!=x1) {MOVx_REG(x1, ed);} CALL(div64, -1); B_NEXT_nocond; MARK; @@ -2263,24 +2263,25 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } else { if(ninst && dyn->insts && dyn->insts[ninst-1].x64.addr - && *(uint8_t*)(dyn->insts[ninst-1].x64.addr)==0x99) { + && *(uint8_t*)(dyn->insts[ninst-1].x64.addr)==0x48 + && *(uint8_t*)(dyn->insts[ninst-1].x64.addr+1)==0x99) { SET_DFNONE(x2) GETED(0); SDIVx(x2, xRAX, ed); MSUBx(xRDX, x2, ed, xRAX); - MOVw_REG(xRAX, x2); + MOVx_REG(xRAX, x2); } else { GETEDH(x1, 0); // get edd changed addr, so cannot be called 2 times for same op... CBZxw_MARK(xRDX); MVNx_REG(x2, xRDX); CBZxw_MARK(x2); - if(ed!=x1) {MOVxw_REG(x1, ed);} + if(ed!=x1) {MOVx_REG(x1, ed);} CALL((void*)idiv64, -1); B_NEXT_nocond; MARK; SDIVx(x2, xRAX, ed); MSUBx(xRDX, x2, ed, xRAX); - MOVw_REG(xRAX, x2); + MOVx_REG(xRAX, x2); SET_DFNONE(x2) } } |