summaryrefslogtreecommitdiff
path: root/pcr/reicast-git/fix-dyna-constprop.patch
diff options
context:
space:
mode:
authorcoadde [Márcio Alexandre Silva Delgado] <coadde@parabola.nu>2015-10-07 03:14:31 -0300
committercoadde [Márcio Alexandre Silva Delgado] <coadde@parabola.nu>2015-10-07 03:18:49 -0300
commit7b54c0078640584b82d93ad445537a9b069dfeb0 (patch)
tree25e3ac69ae0e24d4c57837e9b6a5944405e3272f /pcr/reicast-git/fix-dyna-constprop.patch
parentb35d45f979dc2c511e94d5ad33bba43425fa45a0 (diff)
downloadabslibre-7b54c0078640584b82d93ad445537a9b069dfeb0.tar.gz
abslibre-7b54c0078640584b82d93ad445537a9b069dfeb0.tar.bz2
abslibre-7b54c0078640584b82d93ad445537a9b069dfeb0.zip
pcr/reicast-git: update pkg
Diffstat (limited to 'pcr/reicast-git/fix-dyna-constprop.patch')
-rw-r--r--pcr/reicast-git/fix-dyna-constprop.patch63
1 files changed, 63 insertions, 0 deletions
diff --git a/pcr/reicast-git/fix-dyna-constprop.patch b/pcr/reicast-git/fix-dyna-constprop.patch
new file mode 100644
index 000000000..c7c89b5e2
--- /dev/null
+++ b/pcr/reicast-git/fix-dyna-constprop.patch
@@ -0,0 +1,63 @@
+diff -Nur a/core/hw/sh4/dyna/shil.cpp b/core/hw/sh4/dyna/shil.cpp
+--- a/core/hw/sh4/dyna/shil.cpp 2015-10-06 21:43:53.031336322 -0300
++++ b/core/hw/sh4/dyna/shil.cpp 2015-10-06 21:45:06.558863627 -0300
+@@ -521,20 +521,39 @@
+ rv[op->rd._reg]=op->rs1._imm;
+ }
+
+- //NOT WORKING
+- //WE NEED PROPER PAGELOCKS
+- if (op->op==shop_readm && op->rs1.is_imm() && op->rd.is_r32i() && op->rd._reg<16 && op->flags==0x4 && op->rs3.is_null())
+- {
+- u32 baddr=blk->addr&0x0FFFFFFF;
++ if (0) {
++ //a more minimalistic but still broken approach for this.
++ //this is clearly a hack
++ if (op->op == shop_readm && op->rs1.is_imm() && IsOnRam(op->rs1.imm_value()))
++ {
++ u32 round = op->rs1.imm_value() & ~PAGE_MASK;
++ bool optmize_away = round == (blk->addr & ~PAGE_MASK) && (blk->addr & 0x007FFFFF) > 0x200000;
++
++ if (optmize_away && op->flags == 4) {
++ u32 data = _vmem_ReadMem32(op->rs1.imm_value());
++ op->op = shop_mov32;
++ op->rs1.type = FMT_IMM;
++ op->rs1._imm = data;
++ }
++ }
++ }
+
+- if (/*baddr==0xC158400 &&*/ blk->addr/PAGE_SIZE == op->rs1._imm/PAGE_SIZE)
++ if (0) {
++ //NOT WORKING
++ //WE NEED PROPER PAGELOCKS
++ if (op->op == shop_readm && op->rs1.is_imm() && op->rd.is_r32i() && op->rd._reg<16 && op->flags == 0x4 && op->rs3.is_null())
+ {
+- isi[op->rd._reg]=true;
+- rv[op->rd._reg]= ReadMem32(op->rs1._imm);
+- printf("IMM MOVE: %08X -> %08X\n",op->rs1._imm,rv[op->rd._reg]);
++ u32 baddr = blk->addr & 0x0FFFFFFF;
+
+- op->op=shop_mov32;
+- op->rs1._imm=rv[op->rd._reg];
++ if (/*baddr==0xC158400 &&*/ blk->addr / PAGE_SIZE == op->rs1._imm / PAGE_SIZE)
++ {
++ isi[op->rd._reg] = true;
++ rv[op->rd._reg] = ReadMem32(op->rs1._imm);
++ printf("IMM MOVE: %08X -> %08X\n", op->rs1._imm, rv[op->rd._reg]);
++
++ op->op = shop_mov32;
++ op->rs1._imm = rv[op->rd._reg];
++ }
+ }
+ }
+ }
+@@ -925,7 +944,7 @@
+ */
+ if (settings.dynarec.unstable_opt)
+ sq_pref(blk);
+- //constprop(blk); // crashes on ip
++ constprop(blk); // maybe it works w/o the readm parts?
+ #if HOST_CPU==CPU_X86
+ // rdgrp(blk);
+ // wtgrp(blk);