diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-07-06 09:44:07 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-07-06 09:44:07 +0200 |
| commit | bb38d8d1ca3289422b52b2eb3a89a305afd88436 (patch) | |
| tree | 86f8444d52266a99b3a9d245ee6280ad882fbc7a | |
| parent | cc269337f2178844da1c8103efb1bb9197019ef7 (diff) | |
| download | box64-bb38d8d1ca3289422b52b2eb3a89a305afd88436.tar.gz box64-bb38d8d1ca3289422b52b2eb3a89a305afd88436.zip | |
[DYNAREC] Added 66 0F 50 opcode, and changed a bit 66 0F D7 (for CB15)
| -rwxr-xr-x | src/dynarec/dynarec_arm64_660f.c | 56 |
1 files changed, 32 insertions, 24 deletions
diff --git a/src/dynarec/dynarec_arm64_660f.c b/src/dynarec/dynarec_arm64_660f.c index 490c206d..308bd897 100755 --- a/src/dynarec/dynarec_arm64_660f.c +++ b/src/dynarec/dynarec_arm64_660f.c @@ -447,6 +447,18 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n GOCOND(0x40, "CMOV", "Gw, Ew"); #undef GO + case 0x50: + nextop = F8; + INST_NAME("PMOVMSKD Gd, Ex"); + GETEX(q0, 0); + GETGD; + VMOVQDto(x1, q0, 1); + VMOVQDto(gd, q0, 0); + LSRx(x1, x1, 63); + LSRx(gd, gd, 63); + BFIx(gd, x1, 1, 1); + break; + case 0x54: INST_NAME("ANDPD Gx, Ex"); nextop = F8; @@ -1372,30 +1384,26 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n break; case 0xD7: nextop = F8; - if(MODREG) { - INST_NAME("PMOVMSKB Gd, Ex"); - v0 = fpu_get_scratch(dyn); - v1 = fpu_get_scratch(dyn); - q1 = fpu_get_scratch(dyn); - GETEX(q0, 0); - GETGD; - TABLE64(x1, (uintptr_t)&mask_shift8); - VLDR64_U12(v0, x1, 0); // load shift - MOVI_8(v1, 0x80); // load mask - VAND(q1, v1, q0); - USHL_8(q1, q1, v0); // shift - UADDLV_8(q1, q1); // accumalte - VMOVBto(gd, q1, 0); - // and now the high part - VMOVeD(q1, 0, q0, 1); - VAND(q1, v1, q1); // keep highest bit - USHL_8(q1, q1, v0); // shift - UADDLV_8(q1, q1); // accumalte - VMOVBto(x1, q1, 0); - BFIx(gd, x1, 8, 8); - } else { - DEFAULT; - } + INST_NAME("PMOVMSKB Gd, Ex"); + v0 = fpu_get_scratch(dyn); + v1 = fpu_get_scratch(dyn); + q1 = fpu_get_scratch(dyn); + GETEX(q0, 0); + GETGD; + TABLE64(x1, (uintptr_t)&mask_shift8); + VLDR64_U12(v0, x1, 0); // load shift + MOVI_8(v1, 0x80); // load mask + VAND(q1, v1, q0); + USHL_8(q1, q1, v0); // shift + UADDLV_8(q1, q1); // accumalte + VMOVBto(gd, q1, 0); + // and now the high part + VMOVeD(q1, 0, q0, 1); + VAND(q1, v1, q1); // keep highest bit + USHL_8(q1, q1, v0); // shift + UADDLV_8(q1, q1); // accumalte + VMOVBto(x1, q1, 0); + BFIx(gd, x1, 8, 8); break; case 0xD8: INST_NAME("PSUBUSB Gx, Ex"); |