about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-07-07 23:10:40 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-07-07 23:10:40 +0200
commit401071c40a5c9c71c92fea6dfaf7ec321445f6c7 (patch)
treef39ef60495b67b9b10f72949fba4316e638fd60c /src
parent928eb2a32b9430c786cdfe7313112f6f6ea9dd25 (diff)
downloadbox64-401071c40a5c9c71c92fea6dfaf7ec321445f6c7.tar.gz
box64-401071c40a5c9c71c92fea6dfaf7ec321445f6c7.zip
[DYNAREC] Better handling of SHL/SHR/SAR Eb, 0 (for obfuscated code)
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/dynarec_arm64_00.c66
1 files changed, 39 insertions, 27 deletions
diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c
index 66f508d9..e9f6f8af 100755
--- a/src/dynarec/dynarec_arm64_00.c
+++ b/src/dynarec/dynarec_arm64_00.c
@@ -1368,49 +1368,61 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 case 4:
                 case 6:
                     INST_NAME("SHL Eb, Ib");
-                    SETFLAGS(X_ALL, SF_PENDING);
                     GETEB(x1, 1);
                     u8 = (F8)&0x1f;
-                    UFLAG_IF{
-                        MOV32w(x4, u8); UFLAG_OP2(x4);
-                    };
-                    UFLAG_OP1(ed);
-                    LSLw(ed, ed, u8);
-                    EBBACK;
-                    UFLAG_RES(ed);
-                    UFLAG_DF(x3, d_shl8);
+                    if(u8) {
+                        SETFLAGS(X_ALL, SF_PENDING);
+                        UFLAG_IF{
+                            MOV32w(x4, u8); UFLAG_OP2(x4);
+                        };
+                        UFLAG_OP1(ed);
+                        LSLw(ed, ed, u8);
+                        EBBACK;
+                        UFLAG_RES(ed);
+                        UFLAG_DF(x3, d_shl8);
+                    } else {
+                        NOP;
+                    }
                     break;
                 case 5:
                     INST_NAME("SHR Eb, Ib");
-                    SETFLAGS(X_ALL, SF_PENDING);
                     GETEB(x1, 1);
                     u8 = (F8)&0x1f;
-                    UFLAG_IF{
-                        MOV32w(x4, u8); UFLAG_OP2(x4);
-                    };
-                    UFLAG_OP1(ed);
                     if(u8) {
-                        LSRw(ed, ed, u8);
-                        EBBACK;
+                        SETFLAGS(X_ALL, SF_PENDING);
+                        UFLAG_IF{
+                            MOV32w(x4, u8); UFLAG_OP2(x4);
+                        };
+                        UFLAG_OP1(ed);
+                        if(u8) {
+                            LSRw(ed, ed, u8);
+                            EBBACK;
+                        }
+                        UFLAG_RES(ed);
+                        UFLAG_DF(x3, d_shr8);
+                    } else {
+                        NOP;
                     }
-                    UFLAG_RES(ed);
-                    UFLAG_DF(x3, d_shr8);
                     break;
                 case 7:
                     INST_NAME("SAR Eb, Ib");
-                    SETFLAGS(X_ALL, SF_PENDING);
                     GETSEB(x1, 1);
                     u8 = (F8)&0x1f;
-                    UFLAG_IF{
-                        MOV32w(x4, u8); UFLAG_OP2(x4);
-                    };
-                    UFLAG_OP1(ed);
                     if(u8) {
-                        ASRw(ed, ed, u8);
-                        EBBACK;
+                        SETFLAGS(X_ALL, SF_PENDING);
+                        UFLAG_IF{
+                            MOV32w(x4, u8); UFLAG_OP2(x4);
+                        };
+                        UFLAG_OP1(ed);
+                        if(u8) {
+                            ASRw(ed, ed, u8);
+                            EBBACK;
+                        }
+                        UFLAG_RES(ed);
+                        UFLAG_DF(x3, d_sar8);
+                    } else {
+                        NOP;
                     }
-                    UFLAG_RES(ed);
-                    UFLAG_DF(x3, d_sar8);
                     break;
             }
             break;