From 7b54c0078640584b82d93ad445537a9b069dfeb0 Mon Sep 17 00:00:00 2001 From: "coadde [Márcio Alexandre Silva Delgado]" Date: Wed, 7 Oct 2015 03:14:31 -0300 Subject: pcr/reicast-git: update pkg --- pcr/reicast-git/fix-dyna-constprop.patch | 63 ++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 pcr/reicast-git/fix-dyna-constprop.patch (limited to 'pcr/reicast-git/fix-dyna-constprop.patch') 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); -- cgit v1.2.3