about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-23 20:27:14 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-23 20:27:14 +0100
commit1517177668a2faa310b78af09b09b4cc45cbbca9 (patch)
tree606088aeb2f8074c1f17ca5ea60ccf7602c617fd
parent2487fb4d980003f567ff78bf10ba06a95bd9d1b4 (diff)
downloadbox64-1517177668a2faa310b78af09b09b4cc45cbbca9.tar.gz
box64-1517177668a2faa310b78af09b09b4cc45cbbca9.zip
[DYNAREC] Added 66 0F 71/72 opcodes
-rwxr-xr-xsrc/dynarec/dynarec_arm64_660f.c100
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) {