about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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) {