diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-23 20:27:14 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-23 20:27:14 +0100 |
| commit | 1517177668a2faa310b78af09b09b4cc45cbbca9 (patch) | |
| tree | 606088aeb2f8074c1f17ca5ea60ccf7602c617fd /src | |
| parent | 2487fb4d980003f567ff78bf10ba06a95bd9d1b4 (diff) | |
| download | box64-1517177668a2faa310b78af09b09b4cc45cbbca9.tar.gz box64-1517177668a2faa310b78af09b09b4cc45cbbca9.zip | |
[DYNAREC] Added 66 0F 71/72 opcodes
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/dynarec_arm64_660f.c | 100 |
1 files changed, 99 insertions, 1 deletions
diff --git a/src/dynarec/dynarec_arm64_660f.c b/src/dynarec/dynarec_arm64_660f.c index 3429049c..7837bfa6 100755 --- a/src/dynarec/dynarec_arm64_660f.c +++ b/src/dynarec/dynarec_arm64_660f.c @@ -338,7 +338,105 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n } } break; - + case 0x71: + nextop = F8; + switch((nextop>>3)&7) { + case 2: + INST_NAME("PSRLW Ex, Ib"); + GETEX(q0, 1); + u8 = F8; + if(u8) { + if (u8>15) { + VEORQ(q0, q0, q0); + } else if(u8) { + VSHRQ_16(q0, q0, u8); + } + if(!MODREG) { + VSTR128_U12(q0, ed, fixedaddress); + } + } + break; + case 4: + INST_NAME("PSRAW Ex, Ib"); + GETEX(q0, 1); + u8 = F8; + if(u8>15) u8=15; + if(u8) { + VSSHRQ_16(q0, q0, u8); + } + if(!MODREG) { + VSTR128_U12(q0, ed, fixedaddress); + } + break; + case 6: + INST_NAME("PSLLW Ex, Ib"); + GETEX(q0, 1); + u8 = F8; + if(u8) { + if (u8>15) { + VEORQ(q0, q0, q0); + } else { + VSHLQ_16(q0, q0, u8); + } + if(!MODREG) { + VSTR128_U12(q0, ed, fixedaddress); + } + } + break; + default: + *ok = 0; + DEFAULT; + } + break; + case 0x72: + nextop = F8; + switch((nextop>>3)&7) { + case 2: + INST_NAME("PSRLD Ex, Ib"); + GETEX(q0, 1); + u8 = F8; + if(u8) { + if (u8>31) { + VEORQ(q0, q0, q0); + } else if(u8) { + VSHRQ_32(q0, q0, u8); + } + if(!MODREG) { + VSTR128_U12(q0, ed, fixedaddress); + } + } + break; + case 4: + INST_NAME("PSRAD Ex, Ib"); + GETEX(q0, 1); + u8 = F8; + if(u8>31) u8=31; + if(u8) { + VSSHRQ_32(q0, q0, u8); + } + if(!MODREG) { + VSTR128_U12(q0, ed, fixedaddress); + } + break; + case 6: + INST_NAME("PSLLD Ex, Ib"); + GETEX(q0, 1); + u8 = F8; + if(u8) { + if (u8>31) { + VEORQ(q0, q0, q0); + } else { + VSHLQ_32(q0, q0, u8); + } + if(!MODREG) { + VSTR128_U12(q0, ed, fixedaddress); + } + } + break; + default: + DEFAULT; + } + break; case 0x73: nextop = F8; switch((nextop>>3)&7) { |