diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-11-04 16:06:17 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-11-04 16:06:17 +0100 |
| commit | 5ef9ea35d62a4281917d3d747298bfff399f1e97 (patch) | |
| tree | 6a35aca0565c7e7f2de29bcd1b132d89750531d5 /src | |
| parent | 901bb488772bf167b3cf4321369c5f7609620648 (diff) | |
| download | box64-5ef9ea35d62a4281917d3d747298bfff399f1e97.tar.gz box64-5ef9ea35d62a4281917d3d747298bfff399f1e97.zip | |
[ARM64_DYNAREC] Added 66 0F F2 38 F1 opcode
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_66f20f.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_66f20f.c b/src/dynarec/arm64/dynarec_arm64_66f20f.c index 3039c944..869cf308 100644 --- a/src/dynarec/arm64/dynarec_arm64_66f20f.c +++ b/src/dynarec/arm64/dynarec_arm64_66f20f.c @@ -56,6 +56,35 @@ uintptr_t dynarec64_66F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int switch(opcode) { + case 0x38: // SSE 4.x + opcode = F8; + switch(opcode) { + + case 0xF1: + INST_NAME("CRC32 Gd, Ew"); + nextop = F8; + GETEW(x1, 0); + GETGD; + if(arm64_crc32) { + CRC32CH(gd, gd, ed); + } else { + MOV32w(x2, 0x82f63b78); + for(int j=0; j<2; ++j) { + UBFXxw(x3, ed, 8*j, 8); + EORw_REG(gd, gd, x3); + for(int i=0; i<8; ++i) { + LSRw_IMM((i&1)?gd:x4, (i&1)?x4:gd, 1); + TBZ((i&1)?x4:gd, 0, 4+4); + EORw_REG((i&1)?gd:x4, (i&1)?gd:x4, x2); + } + } + } + break; + + default: + DEFAULT; + } + break; default: DEFAULT; |