diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-06-24 13:17:22 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-06-24 13:18:10 +0200 |
| commit | 2f42eb02d444b770a44d1720d6f9726b0159eaa7 (patch) | |
| tree | 72bfb1eb2932cd161de58853a62cc6ac430701df /src | |
| parent | 08e48239175ab06edba5753a3d4ee478c3263d06 (diff) | |
| download | box64-2f42eb02d444b770a44d1720d6f9726b0159eaa7.tar.gz box64-2f42eb02d444b770a44d1720d6f9726b0159eaa7.zip | |
[32BITS][ARM64_DYNAREC] Added 66 prefixed opcodes
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_66.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_66.c b/src/dynarec/arm64/dynarec_arm64_66.c index e7c6e857..65f123fb 100755 --- a/src/dynarec/arm64/dynarec_arm64_66.c +++ b/src/dynarec/arm64/dynarec_arm64_66.c @@ -43,11 +43,6 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin MAYUSE(j64); MAYUSE(lock); - if(rex.is32bits) { - DEFAULT; - return addr; - } - while((opcode==0x2E) || (opcode==0x36) || (opcode==0x66)) // ignoring CS:, SS: or multiple 0x66 opcode = F8; @@ -63,7 +58,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin opcode = F8; } - if(rex.w && opcode!=0x0f) // rex.w cancels "66", but not for 66 0f type of prefix + if(rex.w && !(opcode==0x0f || opcode==0xf0 || opcode==0x64 || opcode==0x65)) // rex.w cancels "66", but not for 66 0f type of prefix return dynarec64_00(dyn, addr-1, ip, ninst, rex, rep, ok, need_epilog); // addr-1, to "put back" opcode switch(opcode) { @@ -529,16 +524,22 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xA1: INST_NAME("MOV EAX,Od"); - u64 = F64; - MOV64x(x1, u64); + if(rex.is32bits) + u64 = F32; + else + u64 = F64; + MOV64z(x1, u64); LDRH_U12(x2, x1, 0); BFIx(xRAX, x2, 0, 16); break; case 0xA3: INST_NAME("MOV Od,EAX"); - u64 = F64; - MOV64x(x1, u64); + if(rex.is32bits) + u64 = F32; + else + u64 = F64; + MOV64z(x1, u64); STRH_U12(xRAX, x1, 0); SMWRITE(); break; |