gameboy superoptimizer
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

36 lines
980 B

from dataclasses import dataclass
from gbso.cpu.regs import R8
from gbso.program.program import Program
from gbso.cpu.state import CPUState
@dataclass
class TestCase:
__test__ = False
state: CPUState
def eq_on_testcase(p: Program, q: Program, case: TestCase) -> int:
p_cpu = p.execute(case.state)
q_cpu = q.execute(case.state)
delta = 0
for o in p.outputs:
if type(o) == R8:
delta += eq_8bit(p_cpu.state.reg8[o], q_cpu.state.reg8[o])
elif type(o) == int:
delta += eq_8bit(p_cpu.state.memory[o], q_cpu.state.memory[o])
else:
raise TypeError(f"unknown output type {type(o)}")
# TODO: Add penalty for undefined behavior (uninitialized register/memory reads)
return delta
# Counts differing bits between two 8-bit values
def eq_8bit(x: int, y: int) -> int:
delta = 0
for i in range(8):
mask = 1 << i
if x & mask != y & mask:
delta += 1
return 0