[pypy-svn] r63006 - pypy/trunk/pypy/lang/gameboy
tverwaes at codespeak.net
tverwaes at codespeak.net
Tue Mar 17 17:45:16 CET 2009
Author: tverwaes
Date: Tue Mar 17 17:45:15 2009
New Revision: 63006
Modified:
pypy/trunk/pypy/lang/gameboy/cpu.py
pypy/trunk/pypy/lang/gameboy/cpu_register.py
Log:
optimizing by specializing on use_cycles. highlights bug in malloc_removal
Modified: pypy/trunk/pypy/lang/gameboy/cpu.py
==============================================================================
--- pypy/trunk/pypy/lang/gameboy/cpu.py (original)
+++ pypy/trunk/pypy/lang/gameboy/cpu.py Tue Mar 17 17:45:15 2009
@@ -1,4 +1,4 @@
-from pypy.rlib.objectmodel import we_are_translated
+from pypy.rlib.objectmodel import we_are_translated, specialize
from pypy.lang.gameboy import constants
from pypy.lang.gameboy.interrupt import Interrupt
from pypy.lang.gameboy.cpu_register import Register, DoubleRegister,\
@@ -236,6 +236,7 @@
self.memory.write(address, data)
self.cycles -= 2
+ @specialize.arg(-1)
def fetch(self, use_cycles=True):
# Fetching 1 cycle
if use_cycles:
@@ -256,16 +257,19 @@
def fetch_double_register(self, register):
self.double_register_inverse_call(CPUFetchCaller(self), register)
+ @specialize.arg(-1)
def push(self, data, use_cycles=True):
# Stack, 2 cycles
self.sp.dec(use_cycles) # 2 cycles
self.memory.write(self.sp.get(use_cycles), data)
+ @specialize.arg(-1)
def push_double_register(self, register, use_cycles=True):
# PUSH rr 4 cycles
self.push(register.get_hi(), use_cycles) # 2 cycles
self.push(register.get_lo(), use_cycles) # 2 cycles
+ @specialize.arg(-1)
def pop(self, use_cycles=True):
# 1 cycle
data = self.memory.read(self.sp.get())
@@ -283,6 +287,7 @@
register.set_hi_lo(a, b) # 2 cycles
self.cycles += 1
+ @specialize.arg(-1)
def call(self, address, use_cycles=True):
# 4 cycles
self.push_double_register(self.pc, use_cycles)
@@ -740,9 +745,11 @@
# Call Wrappers --------------------------------------------------------------
class CallWrapper(object):
+ @specialize.arg(-1)
def get(self, use_cycles=True):
raise Exception("called CallWrapper.get")
+ @specialize.arg(-1)
def set(self, value, use_cycles=True):
raise Exception("called CallWrapper.set")
@@ -750,9 +757,11 @@
def __init__(self, number):
self.number = number
+ @specialize.arg(-1)
def get(self, use_cycles=True):
return self.number
+ @specialize.arg(-1)
def set(self, value, use_cycles=True):
raise Exception("called CallWrapper.set")
@@ -760,9 +769,11 @@
def __init__(self, register):
self.register = register
+ @specialize.arg(-1)
def get(self, use_cycles=True):
return self.register.get(use_cycles)
+ @specialize.arg(-1)
def set(self, value, use_cycles=True):
return self.register.set(value, use_cycles)
@@ -771,9 +782,11 @@
def __init__(self, register):
self.register = register
+ @specialize.arg(-1)
def get(self, use_cycles=True):
return self.register.get(use_cycles)
+ @specialize.arg(-1)
def set(self, value, use_cycles=True):
return self.register.set(value, use_cycles)
@@ -782,6 +795,7 @@
def __init__(self, cpu):
self.cpu = cpu
+ @specialize.arg(-1)
def get(self, use_cycles=True):
return self.cpu.pop(use_cycles)
@@ -790,6 +804,7 @@
def __init__(self, cpu):
self.cpu = cpu
+ @specialize.arg(-1)
def get(self, use_cycles=True):
return self.cpu.fetch(use_cycles)
Modified: pypy/trunk/pypy/lang/gameboy/cpu_register.py
==============================================================================
--- pypy/trunk/pypy/lang/gameboy/cpu_register.py (original)
+++ pypy/trunk/pypy/lang/gameboy/cpu_register.py Tue Mar 17 17:45:15 2009
@@ -1,7 +1,8 @@
-
+from pypy.rlib.objectmodel import specialize
# ---------------------------------------------------------------------------
class AbstractRegister(object):
+ @specialize.arg(-1)
def get(self, use_cycles=True):
return 0xFF
@@ -17,17 +18,21 @@
def reset(self):
self.value = self.reset_value
+ @specialize.arg(-1)
def set(self, value, use_cycles=True):
self.value = value & 0xFF
if use_cycles:
self.cpu.cycles -= 1
+ @specialize.arg(-1)
def get(self, use_cycles=True):
return self.value
+ @specialize.arg(-1)
def add(self, value, use_cycles=True):
self.set(self.get(use_cycles)+value, use_cycles)
+ @specialize.arg(-1)
def sub(self, value, use_cycles=True):
self.set(self.get(use_cycles)-value, use_cycles)
@@ -39,10 +44,12 @@
self.cpu = cpu
self.reset_value = reset_value
+ @specialize.arg(-1)
def set(self, value, use_cycles=True):
# 1 Cycle
raise Exception("Not Implemented")
+ @specialize.arg(-1)
def set_hi_lo(self, hi, lo, use_cycles=True):
# 2 Cycles
raise Exception("Not Implemented")
@@ -50,36 +57,44 @@
def reset(self):
self.set(self.reset_value, use_cycles=False)
+ @specialize.arg(-1)
def set_hi(self, hi=0, use_cycles=True):
# 1 Cycle
raise Exception("Not Implemented")
+ @specialize.arg(-1)
def set_lo(self, lo=0, use_cycles=True):
# 1 Cycle
raise Exception("Not Implemented")
+ @specialize.arg(-1)
def get(self, use_cycles=True):
# 0 Cycles TODO: Check entanglement of cycles in CPU class.
raise Exception("Not Implemented")
+ @specialize.arg(-1)
def get_hi(self, use_cycles=True):
# 0 Cycles
raise Exception("Not Implemented")
+ @specialize.arg(-1)
def get_lo(self, use_cycles=True):
# 0 Cycles
raise Exception("Not Implemented")
+ @specialize.arg(-1)
def inc(self, use_cycles=True):
self.add(1, use_cycles)
if use_cycles:
self.cpu.cycles += 1
+ @specialize.arg(-1)
def dec(self, use_cycles=True):
self.add(-1, use_cycles)
if use_cycles:
self.cpu.cycles += 1
+ @specialize.arg(-1)
def add(self, value, use_cycles=True):
self.set(self.get(use_cycles) + value, use_cycles=use_cycles)
if use_cycles:
@@ -93,6 +108,7 @@
self.hi = hi
self.lo = lo
+ @specialize.arg(-1)
def set(self, value, use_cycles=True):
value = value & 0xFFFF
self.set_hi(value >> 8, use_cycles)
@@ -100,22 +116,28 @@
if use_cycles:
self.cpu.cycles += 1
+ @specialize.arg(-1)
def set_hi_lo(self, hi, lo, use_cycles=True):
self.set_hi(hi, use_cycles)
self.set_lo(lo, use_cycles)
+ @specialize.arg(-1)
def set_hi(self, hi=0, use_cycles=True):
self.hi.set(hi, use_cycles)
+ @specialize.arg(-1)
def set_lo(self, lo=0, use_cycles=True):
self.lo.set(lo, use_cycles)
+ @specialize.arg(-1)
def get(self, use_cycles=True):
return (self.hi.get(use_cycles)<<8) + self.lo.get(use_cycles)
+ @specialize.arg(-1)
def get_hi(self, use_cycles=True):
return self.hi.get(use_cycles)
+ @specialize.arg(-1)
def get_lo(self, use_cycles=True):
return self.lo.get(use_cycles)
@@ -126,11 +148,13 @@
AbstractDoubleRegister.__init__(self, cpu, reset_value)
self.value = 0x0000
+ @specialize.arg(-1)
def set(self, value, use_cycles=True):
self.value = value & 0xFFFF
if use_cycles:
self.cpu.cycles -= 1
+ @specialize.arg(-1)
def set_hi_lo(self, hi, lo, use_cycles=True):
hi &= 0xFF
lo &= 0xFF
@@ -138,37 +162,45 @@
if use_cycles:
self.cpu.cycles -= 1
+ @specialize.arg(-1)
def set_hi(self, hi=0, use_cycles=True):
self.set_hi_lo(hi, self.get_lo(False), use_cycles)
if use_cycles:
self.cpu.cycles += 1
+ @specialize.arg(-1)
def set_lo(self, lo=0, use_cycles=True):
self.set_hi_lo(self.get_hi(False), lo, use_cycles)
if use_cycles:
self.cpu.cycles += 1
+ @specialize.arg(-1)
def get(self, use_cycles=True):
return self.value
+ @specialize.arg(-1)
def get_hi(self, use_cycles=True):
return (self.value >> 8)
+ @specialize.arg(-1)
def get_lo(self, use_cycles=True):
return (self.value & 0xFF)
+ @specialize.arg(-1)
def inc(self, use_cycles=True):
self.value += 1
self.value &= 0xFFFF
if use_cycles:
self.cpu.cycles -= 2
+ @specialize.arg(-1)
def dec(self, use_cycles=True):
self.value -= 1
self.value &= 0xFFFF
if use_cycles:
self.cpu.cycles -= 2
+ @specialize.arg(-1)
def add(self, value, use_cycles=True):
self.value += value
self.value &= 0xFFFF
@@ -179,21 +211,23 @@
class ImmediatePseudoRegister(Register):
- def __init__(self, cpu, hl):
- #assert isinstance(cpu, CPU)
- self.cpu = cpu
- self.hl = hl
-
- def set(self, value, use_cycles=True):
- self.cpu.write(self.hl.get(use_cycles=use_cycles), value) # 2 + 0
- if not use_cycles:
- self.cpu.cycles += 2
-
- def get(self, use_cycles=True):
- if not use_cycles:
- self.cpu.cycles += 1
- result = self.cpu.read(self.hl.get(use_cycles=use_cycles)) # 1
- return result
+ def __init__(self, cpu, hl):
+ #assert isinstance(cpu, CPU)
+ self.cpu = cpu
+ self.hl = hl
+
+ @specialize.arg(-1)
+ def set(self, value, use_cycles=True):
+ self.cpu.write(self.hl.get(use_cycles=use_cycles), value) # 2 + 0
+ if not use_cycles:
+ self.cpu.cycles += 2
+
+ @specialize.arg(-1)
+ def get(self, use_cycles=True):
+ if not use_cycles:
+ self.cpu.cycles += 1
+ result = self.cpu.read(self.hl.get(use_cycles=use_cycles)) # 1
+ return result
# ------------------------------------------------------------------------------
@@ -259,6 +293,7 @@
self.s_flag = False
self.lower = 0x00
+ @specialize.arg(-1)
def get(self, use_cycles=True):
value = 0
value += (int(self.is_carry) << 4)
@@ -267,6 +302,7 @@
value += (int(self.is_zero) << 7)
return value + self.lower
+ @specialize.arg(-1)
def set(self, value, use_cycles=True):
self.is_carry = bool(value & (1 << 4))
self.is_half_carry = bool(value & (1 << 5))
More information about the Pypy-commit
mailing list