emu_main: hook the runtime integer-divide (0xf042ee00, r22=r22/r23) with exact host division -- the compiled Newton-Raphson needs exact dual-op pipe timing; geometry stream now consumes frames correctly (replay passes cmd 151 blocker, 387+ commands)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -56,6 +56,7 @@ MAPS = {
|
|||||||
alloc=0xf042c628, v2p=0xf042c300,
|
alloc=0xf042c628, v2p=0xf042c300,
|
||||||
lockacq=0xf0423360, lockrel=0xf04233b8,
|
lockacq=0xf0423360, lockrel=0xf04233b8,
|
||||||
chain=None, chain_tbl=None, chain_tail=None,
|
chain=None, chain_tbl=None, chain_tail=None,
|
||||||
|
intdiv=0xf042ee00, # runtime int divide (r22 = r22/r23)
|
||||||
seeds=[
|
seeds=[
|
||||||
(0x1000, 0), # _processorId
|
(0x1000, 0), # _processorId
|
||||||
],
|
],
|
||||||
@@ -101,6 +102,20 @@ class MainRunner:
|
|||||||
if m['sendprim']: self.hooks[m['sendprim']] = self.h_ret
|
if m['sendprim']: self.hooks[m['sendprim']] = self.h_ret
|
||||||
if m['putchar']: self.hooks[m['putchar']] = self.h_console
|
if m['putchar']: self.hooks[m['putchar']] = self.h_console
|
||||||
if m['chain']: self.hooks[m['chain']] = self.h_chainfix
|
if m['chain']: self.hooks[m['chain']] = self.h_chainfix
|
||||||
|
if m.get('intdiv'): self.hooks[m['intdiv']] = self.h_intdiv
|
||||||
|
|
||||||
|
def h_intdiv(self, cpu):
|
||||||
|
# Runtime integer divide (r22 = r22/r23, result via ftrunc+fxfr): the
|
||||||
|
# compiled Newton-Raphson relies on exact dual-op pipeline timing our
|
||||||
|
# functional FP model doesn't reproduce yet -- compute exactly instead.
|
||||||
|
a = cpu.rd(22); b = cpu.rd(23)
|
||||||
|
if a & 0x80000000: a -= 1 << 32
|
||||||
|
if b & 0x80000000: b -= 1 << 32
|
||||||
|
q = abs(a) // abs(b) if b else 0
|
||||||
|
if (a < 0) != (b < 0): q = -q
|
||||||
|
cpu.wr(22, q & 0xffffffff)
|
||||||
|
cpu.pc = cpu.rd(1)
|
||||||
|
return True
|
||||||
self.heap = [0x08010000, 0x0c010000] # bump allocator over the DRAM banks
|
self.heap = [0x08010000, 0x0c010000] # bump allocator over the DRAM banks
|
||||||
|
|
||||||
# ---- hook helpers: emulate a called function returning ----
|
# ---- hook helpers: emulate a called function returning ----
|
||||||
|
|||||||
Reference in New Issue
Block a user