diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-04-02 14:25:47 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-04-02 14:25:47 +0200 |
| commit | be6104c2edabf682d8f66feccf93157824b64ada (patch) | |
| tree | 1e7a003ba91d7629b63c955bd13252540701988d /src | |
| parent | 3f90221b18f4da5dbecdf60f7d7deb7fa6e60e39 (diff) | |
| download | box64-be6104c2edabf682d8f66feccf93157824b64ada.tar.gz box64-be6104c2edabf682d8f66feccf93157824b64ada.zip | |
[ARM64_DYNAREC] Small optim for VBLENDPS opcode
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c index 004eaf59..330f7acd 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c @@ -279,11 +279,15 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip } else { if(q0!=q2) VMOVQ(q0, q2); - if((u8&15)==0b0011) { + if((u8&0b0011)==0b0011) { VMOVeD(q0, 0, q1, 0); - } else if((u8&15)==0b1100) { + u8&=~0b0011; + } + if((u8&0b1100)==0b1100) { VMOVeD(q0, 1, q1, 1); - } else for(int i=0; i<4; ++i) + u8&=~0b1100; + } + for(int i=0; i<4; ++i) if(u8&(1<<i)) { VMOVeS(q0, i, q1, i); } @@ -301,11 +305,15 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip } else { if(q0!=q2) VMOVQ(q0, q2); - if((u8>>4)==0b0011) { + if(((u8>>4)&0b0011)==0b0011) { VMOVeD(q0, 0, q1, 0); - } else if((u8>>4)==0b1100) { + u8&=~0b00110000; + } + if(((u8>>4)&0b1100)==0b1100) { VMOVeD(q0, 1, q1, 1); - } else for(int i=0; i<4; ++i) + u8&=~0b11000000; + } + for(int i=0; i<4; ++i) if(u8&(1<<(i+4))) { VMOVeS(q0, i, q1, i); } |