Skip to content

Commit f9bc4a4

Browse files
authored
[RV64_DYNAREC] Ported up32 and rsp merge optimization (#4554)
1 parent 8497266 commit f9bc4a4

43 files changed

Lines changed: 944 additions & 298 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎src/dynarec/dynarec_native.c‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1155,7 +1155,7 @@ dynablock_t* FillBlock64(uintptr_t addr, int is32bits, int inst_max, int is_new,
11551155
int pos = helper.size-1;
11561156
while (pos>=0)
11571157
pos = updateNeed(&helper, pos, 0);
1158-
#if defined(LA64)
1158+
#if defined(LA64) || defined(RV64)
11591159
updateUpperLiveness(&helper);
11601160
updateRspMerge(&helper, is32bits);
11611161
#endif

‎src/dynarec/dynarec_native_pass.c‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int
250250
MESSAGE(LOG_DUMP, "TEST STEP ----\n");
251251
extcache_native_t save;
252252
fpu_save_and_unwind(dyn, ninst, &save);
253-
#ifdef LA64
253+
#if defined(LA64) || defined(RV64)
254254
UP32_READALL();
255255
#endif
256256
fpu_reflectcache(dyn, ninst, x1, x2, x3);
@@ -267,7 +267,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int
267267
#if defined (SPILL_NF_REGISTERS)
268268
if (BOX64ENV(dynarec_nativeflags)) SPILL_NF_REGISTERS;
269269
#endif
270-
#ifdef LA64
270+
#if defined(LA64) || defined(RV64)
271271
UP32_READALL();
272272
#endif
273273
fpu_reflectcache(dyn, ninst, x1, x2, x3);

‎src/dynarec/rv64/dynarec_rv64_00_0.c‎

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
6565
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
6666
nextop = F8;
6767
GETGD;
68-
GETED(0);
68+
GETEDsd(0);
6969
emit_add32(dyn, ninst, rex, ed, gd, x3, x4, x5);
7070
WBACK;
7171
break;
@@ -83,7 +83,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
8383
INST_NAME("ADD Gd, Ed");
8484
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
8585
nextop = F8;
86-
GETGD;
86+
GETGDsd;
8787
GETED(0);
8888
emit_add32(dyn, ninst, rex, gd, ed, x3, x4, x5);
8989
break;
@@ -99,6 +99,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
9999
case 0x05:
100100
INST_NAME("ADD EAX, Id");
101101
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
102+
MARKREGsd(xRAX);
102103
i64 = F32S;
103104
emit_add32c(dyn, ninst, rex, xRAX, i64, x3, x4, x5, x6);
104105
break;
@@ -155,7 +156,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
155156
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
156157
nextop = F8;
157158
GETGD;
158-
GETED(0);
159+
GETEDsd(0);
159160
emit_or32(dyn, ninst, rex, ed, gd, x3, x4);
160161
WBACK;
161162
break;
@@ -173,7 +174,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
173174
INST_NAME("OR Gd, Ed");
174175
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
175176
nextop = F8;
176-
GETGD;
177+
GETGDsd;
177178
GETED(0);
178179
emit_or32(dyn, ninst, rex, gd, ed, x3, x4);
179180
break;
@@ -189,6 +190,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
189190
case 0x0D:
190191
INST_NAME("OR EAX, Id");
191192
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
193+
MARKREGsd(xRAX);
192194
i64 = F32S;
193195
emit_or32c(dyn, ninst, rex, xRAX, i64, x3, x4);
194196
break;
@@ -255,7 +257,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
255257
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
256258
nextop = F8;
257259
GETGD;
258-
GETED(0);
260+
GETEDsd(0);
259261
emit_adc32(dyn, ninst, rex, ed, gd, x3, x4, x5, x6);
260262
WBACK;
261263
break;
@@ -280,7 +282,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
280282
READFLAGS(X_CF);
281283
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
282284
nextop = F8;
283-
GETGD;
285+
GETGDsd;
284286
GETED(0);
285287
emit_adc32(dyn, ninst, rex, gd, ed, x3, x4, x5, x6);
286288
break;
@@ -298,6 +300,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
298300
INST_NAME("ADC EAX, Id");
299301
READFLAGS(X_CF);
300302
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
303+
MARKREGsd(xRAX);
301304
i64 = F32S;
302305
MOV64xw(x1, i64);
303306
emit_adc32(dyn, ninst, rex, xRAX, x1, x3, x4, x5, x6);
@@ -364,7 +367,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
364367
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
365368
nextop = F8;
366369
GETGD;
367-
GETED(0);
370+
GETEDsd(0);
368371
emit_sbb32(dyn, ninst, rex, ed, gd, x3, x4, x5);
369372
WBACK;
370373
break;
@@ -389,7 +392,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
389392
READFLAGS(X_CF);
390393
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
391394
nextop = F8;
392-
GETGD;
395+
GETGDsd;
393396
GETED(0);
394397
emit_sbb32(dyn, ninst, rex, gd, ed, x3, x4, x5);
395398
break;
@@ -407,6 +410,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
407410
INST_NAME("SBB EAX, Id");
408411
READFLAGS(X_CF);
409412
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
413+
MARKREGsd(xRAX);
410414
i64 = F32S;
411415
MOV64xw(x2, i64);
412416
emit_sbb32(dyn, ninst, rex, xRAX, x2, x3, x4, x5);
@@ -465,7 +469,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
465469
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
466470
nextop = F8;
467471
GETGD;
468-
GETED(0);
472+
GETEDsd(0);
469473
emit_and32(dyn, ninst, rex, ed, gd, x3, x4);
470474
WBACK;
471475
break;
@@ -482,7 +486,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
482486
INST_NAME("AND Gd, Ed");
483487
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
484488
nextop = F8;
485-
GETGD;
489+
GETGDsd;
486490
GETED(0);
487491
emit_and32(dyn, ninst, rex, gd, ed, x3, x4);
488492
break;
@@ -498,6 +502,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
498502
case 0x25:
499503
INST_NAME("AND EAX, Id");
500504
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
505+
MARKREGsd(xRAX);
501506
i64 = F32S;
502507
emit_and32c(dyn, ninst, rex, xRAX, i64, x3, x4);
503508
break;
@@ -516,7 +521,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
516521
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
517522
nextop = F8;
518523
GETGD;
519-
GETED(0);
524+
GETEDsd(0);
520525
emit_sub32(dyn, ninst, rex, ed, gd, x3, x4, x5);
521526
WBACK;
522527
break;
@@ -534,7 +539,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
534539
INST_NAME("SUB Gd, Ed");
535540
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
536541
nextop = F8;
537-
GETGD;
542+
GETGDsd;
538543
GETED(0);
539544
emit_sub32(dyn, ninst, rex, gd, ed, x3, x4, x5);
540545
break;
@@ -550,6 +555,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
550555
case 0x2D:
551556
INST_NAME("SUB EAX, Id");
552557
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
558+
MARKREGsd(xRAX);
553559
i64 = F32S;
554560
emit_sub32c(dyn, ninst, rex, xRAX, i64, x2, x3, x4, x5);
555561
break;
@@ -571,7 +577,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
571577
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
572578
nextop = F8;
573579
GETGD;
574-
GETED(0);
580+
GETEDsd(0);
575581
emit_xor32(dyn, ninst, rex, ed, gd, x3, x4);
576582
if (ed != gd) {
577583
WBACK;
@@ -591,7 +597,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
591597
INST_NAME("XOR Gd, Ed");
592598
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
593599
nextop = F8;
594-
GETGD;
600+
GETGDsd;
595601
GETED(0);
596602
emit_xor32(dyn, ninst, rex, gd, ed, x3, x4);
597603
break;
@@ -607,6 +613,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
607613
case 0x35:
608614
INST_NAME("XOR EAX, Id");
609615
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
616+
MARKREGsd(xRAX);
610617
i64 = F32S;
611618
emit_xor32c(dyn, ninst, rex, xRAX, i64, x3, x4);
612619
break;
@@ -661,6 +668,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
661668
INST_NAME("CMP EAX, Id");
662669
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
663670
i64 = F32S;
671+
MARKREGs(xRAX);
664672
if (i64) {
665673
MOV64x(x2, i64);
666674
emit_cmp32(dyn, ninst, rex, xRAX, x2, x3, x4, x5, x6);

0 commit comments

Comments
 (0)