diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_660f.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c index b54638d7..d994f865 100755 --- a/src/dynarec/arm64/dynarec_arm64_660f.c +++ b/src/dynarec/arm64/dynarec_arm64_660f.c @@ -650,6 +650,42 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n VMOVeD(q0, 0, v1, 0); break; + case 0x0E: + INST_NAME("PBLENDW Gx, Ex, Ib"); + nextop = F8; + GETGX(q0, 1); + GETEX(q1, 0, 1); + u8 = F8; + i32 = 0; + if(q0!=q1) + while(u8) { + if(u8&1) { + if(!(i32&1) && u8&2) { + if(!(i32&1) && (u8&0xf)==0xf) { + // whole 64bits + VMOVeD(q0, i32>>2, q1, i32>>2); + i32+=4; + u8>>=4; + } else { + // 32bits + VMOVeS(q0, i32>>1, q1, i32>>1); + i32+=2; + u8>>=2; + } + } else { + // 16 bits + VMOVeH(q0, i32, q1, i32); + i32++; + u8>>=1; + } + } else { + // nope + i32++; + u8>>=1; + } + + } + break; case 0x0F: INST_NAME("PALIGNR Gx, Ex, Ib"); nextop = F8; |