Skip to content

Commit 62ab624

Browse files
authored
[DYNAREC] Small optimization for PUSH imm opcodes (#3426)
1 parent 627b857 commit 62ab624

File tree

6 files changed

+72
-24
lines changed

6 files changed

+72
-24
lines changed

src/dynarec/arm64/dynarec_arm64_00.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,8 +1015,12 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
10151015
LDRSW_U12(x1, x3, 0);
10161016
PUSH1z(x1);
10171017
} else {
1018-
MOV64z(x3, i64);
1019-
PUSH1z(x3);
1018+
if (!i64) {
1019+
PUSH1z(xZR);
1020+
} else {
1021+
MOV64z(x3, i64);
1022+
PUSH1z(x3);
1023+
}
10201024
SMWRITE();
10211025
}
10221026
break;
@@ -1083,8 +1087,12 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
10831087
case 0x6A:
10841088
INST_NAME("PUSH Ib");
10851089
i64 = F8S;
1086-
MOV64z(x3, i64);
1087-
PUSH1z(x3);
1090+
if (!i64) {
1091+
PUSH1z(xZR);
1092+
} else {
1093+
MOV64z(x3, i64);
1094+
PUSH1z(x3);
1095+
}
10881096
SMWRITE();
10891097
break;
10901098
case 0x6B:

src/dynarec/arm64/dynarec_arm64_66.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -409,8 +409,12 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
409409
case 0x68:
410410
INST_NAME("PUSH Iw");
411411
u16 = F16;
412-
MOV32w(x2, u16);
413-
PUSH1_16(x2);
412+
if (!u16) {
413+
PUSH1_16(xZR);
414+
} else {
415+
MOV32w(x2, u16);
416+
PUSH1_16(x2);
417+
}
414418
break;
415419
case 0x69:
416420
case 0x6B:
@@ -454,8 +458,12 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
454458
case 0x6A:
455459
INST_NAME("PUSH Ib");
456460
i16 = F8S;
457-
MOV32w(x2, (uint16_t)i16);
458-
PUSH1_16(x2);
461+
if (!i16) {
462+
PUSH1_16(xZR);
463+
} else {
464+
MOV32w(x2, (uint16_t)i16);
465+
PUSH1_16(x2);
466+
}
459467
break;
460468
case 0x6C:
461469
case 0x6E:

src/dynarec/la64/dynarec_la64_00.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -771,8 +771,12 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
771771
LD_W(x1, x3, 0);
772772
PUSH1z(x1);
773773
} else {
774-
MOV64z(x3, i64);
775-
PUSH1z(x3);
774+
if (!i64) {
775+
PUSH1z(xZR);
776+
} else {
777+
MOV64z(x3, i64);
778+
PUSH1z(x3);
779+
}
776780
SMWRITE();
777781
}
778782
break;
@@ -828,8 +832,12 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
828832
case 0x6A:
829833
INST_NAME("PUSH Ib");
830834
i64 = F8S;
831-
MOV64z(x3, i64);
832-
PUSH1z(x3);
835+
if (!i64) {
836+
PUSH1z(xZR);
837+
} else {
838+
MOV64z(x3, i64);
839+
PUSH1z(x3);
840+
}
833841
SMWRITE();
834842
break;
835843
case 0x6B:

src/dynarec/la64/dynarec_la64_66.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -376,8 +376,12 @@ uintptr_t dynarec64_66(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
376376
case 0x68:
377377
INST_NAME("PUSH Iw");
378378
u16 = F16;
379-
MOV32w(x2, u16);
380-
PUSH1_16(x2);
379+
if (!u16) {
380+
PUSH1_16(xZR);
381+
} else {
382+
MOV32w(x2, u16);
383+
PUSH1_16(x2);
384+
}
381385
break;
382386
case 0x69:
383387
case 0x6B:
@@ -417,8 +421,12 @@ uintptr_t dynarec64_66(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
417421
case 0x6A:
418422
INST_NAME("PUSH Ib");
419423
i16 = F8S;
420-
MOV32w(x2, (uint16_t)i16);
421-
PUSH1_16(x2);
424+
if (!i16) {
425+
PUSH1_16(xZR);
426+
} else {
427+
MOV32w(x2, (uint16_t)i16);
428+
PUSH1_16(x2);
429+
}
422430
break;
423431
case 0x6C:
424432
case 0x6E:

src/dynarec/rv64/dynarec_rv64_00_1.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,8 +211,12 @@ uintptr_t dynarec64_00_1(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
211211
LW(x1, x3, 0);
212212
PUSH1z(x1);
213213
} else {
214-
MOV64z(x3, i64);
215-
PUSH1z(x3);
214+
if (!i64) {
215+
PUSH1z(xZR);
216+
} else {
217+
MOV64z(x3, i64);
218+
PUSH1z(x3);
219+
}
216220
}
217221
break;
218222
case 0x69:
@@ -252,8 +256,12 @@ uintptr_t dynarec64_00_1(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
252256
case 0x6A:
253257
INST_NAME("PUSH Ib");
254258
i64 = F8S;
255-
MOV64z(x3, i64);
256-
PUSH1z(x3);
259+
if (!i64) {
260+
PUSH1z(xZR);
261+
} else {
262+
MOV64z(x3, i64);
263+
PUSH1z(x3);
264+
}
257265
break;
258266
case 0x6B:
259267
INST_NAME("IMUL Gd, Ed, Ib");

src/dynarec/rv64/dynarec_rv64_66.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -447,8 +447,12 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
447447
case 0x68:
448448
INST_NAME("PUSH Iw");
449449
u16 = F16;
450-
MOV32w(x2, u16);
451-
PUSH1_16(x2);
450+
if (!u16) {
451+
PUSH1_16(xZR);
452+
} else {
453+
MOV32w(x2, u16);
454+
PUSH1_16(x2);
455+
}
452456
break;
453457
case 0x69:
454458
case 0x6B:
@@ -488,8 +492,12 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
488492
case 0x6A:
489493
INST_NAME("PUSH Ib");
490494
i16 = F8S;
491-
MOV32w(x2, (uint16_t)i16);
492-
PUSH1_16(x2);
495+
if (!i16) {
496+
PUSH1_16(xZR);
497+
} else {
498+
MOV32w(x2, (uint16_t)i16);
499+
PUSH1_16(x2);
500+
}
493501
break;
494502
case 0x6C:
495503
case 0x6E:

0 commit comments

Comments
 (0)