[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