[pypy-commit] pypy s390x-backend: added regalloc_push/regalloc_pop

plan_rich noreply at buildbot.pypy.org
Mon Nov 23 09:14:19 EST 2015


Author: Richard Plangger <planrichi at gmail.com>
Branch: s390x-backend
Changeset: r80857:91919df0fc41
Date: 2015-11-23 15:14 +0100
http://bitbucket.org/pypy/pypy/changeset/91919df0fc41/

Log:	added regalloc_push/regalloc_pop

diff --git a/rpython/jit/backend/zarch/assembler.py b/rpython/jit/backend/zarch/assembler.py
--- a/rpython/jit/backend/zarch/assembler.py
+++ b/rpython/jit/backend/zarch/assembler.py
@@ -376,6 +376,41 @@
             self.mc.BRC(condition, l.imm(off)) # branch over LGHI
             self.mc.XGR(result_loc, result_loc)
 
+    def regalloc_push(self, loc, already_pushed):
+        """Pushes the value stored in loc to the stack
+        Can trash the current value of SCRATCH when pushing a stack
+        loc"""
+
+        index = WORD * (~already_pushed)
+
+        if loc.type == FLOAT:
+            if not loc.is_fp_reg():
+                self.regalloc_mov(loc, r.FP_SCRATCH)
+                loc = r.FP_SCRATCH
+            self.mc.STD(loc, l.addr(index, r.SP))
+        else:
+            if not loc.is_core_reg():
+                self.regalloc_mov(loc, r.SCRATCH)
+                loc = r.SCRATCH
+            self.mc.SG(loc, l.addr(index, r.SP))
+
+    def regalloc_pop(self, loc, already_pushed):
+        """Pops the value on top of the stack to loc. Can trash the current
+        value of SCRATCH when popping to a stack loc"""
+        index = WORD * (~already_pushed)
+
+        if loc.type == FLOAT:
+            if loc.is_fp_reg():
+                self.mc.LD(loc, l.addr(index, r.SP))
+            else:
+                self.mc.LD(r.FP_SCRATCH, l.addr(index, r.SP))
+                self.regalloc_mov(r.FP_SCRATCH, loc)
+        else:
+            if loc.is_core_reg():
+                self.mc.LG(loc, l.addr(index, r.SP))
+            else:
+                self.mc.LG(r.SCRATCH, l.addr(index, r.SP))
+                self.regalloc_mov(r.SCRATCH, loc)
 
     def _assemble(self, regalloc, inputargs, operations):
         self._regalloc = regalloc
diff --git a/rpython/jit/backend/zarch/locations.py b/rpython/jit/backend/zarch/locations.py
--- a/rpython/jit/backend/zarch/locations.py
+++ b/rpython/jit/backend/zarch/locations.py
@@ -15,6 +15,9 @@
         return False
 
     def is_reg(self):
+        return self.is_core_reg()
+
+    def is_core_reg(self):
         return False
 
     def is_fp_reg(self):
@@ -45,7 +48,7 @@
     def __repr__(self):
         return 'r%d' % self.value
 
-    def is_reg(self):
+    def is_core_reg(self):
         return True
 
     def is_even(self):
@@ -66,7 +69,7 @@
     def __repr__(self):
         return 'f%d' % self.value
 
-    def is_reg(self):
+    def is_core_reg(self):
         return False
 
     def is_fp_reg(self):
diff --git a/rpython/jit/backend/zarch/regalloc.py b/rpython/jit/backend/zarch/regalloc.py
--- a/rpython/jit/backend/zarch/regalloc.py
+++ b/rpython/jit/backend/zarch/regalloc.py
@@ -377,7 +377,7 @@
                 loc = r.SPP
             arg = inputargs[i]
             i += 1
-            if loc.is_reg():
+            if loc.is_core_reg():
                 if loc is r.SPP:
                     self.rm.bindings_to_frame_reg[arg] = None
                 else:
@@ -514,7 +514,7 @@
                 continue
             if box.type == REF and self.rm.is_still_alive(box):
                 assert not noregs
-                assert loc.is_reg()
+                assert loc.is_core_reg()
                 val = self.assembler.cpu.all_reg_indexes[loc.value]
                 gcmap[val // WORD // 8] |= r_uint(1) << (val % (WORD * 8))
         for box, loc in self.fm.bindings.iteritems():
@@ -787,7 +787,7 @@
             loc = self.loc(arg)
             assert loc is not r.SPP
             arglocs[i] = loc
-            if loc.is_reg():
+            if loc.is_core_reg():
                 self.fm.mark_as_free(arg)
         #
         # if we are too close to the start of the loop, the label's target may
diff --git a/rpython/jit/backend/zarch/registers.py b/rpython/jit/backend/zarch/registers.py
--- a/rpython/jit/backend/zarch/registers.py
+++ b/rpython/jit/backend/zarch/registers.py
@@ -19,7 +19,7 @@
 [f0,f1,f2,f3,f4,f5,f6,f7,f8,
  f9,f10,f11,f12,f13,f14,f15] = fpregisters
 
-FSCRATCH = f0
+FP_SCRATCH = f0
 
 MANAGED_FP_REGS = fpregisters[1:]
 VOLATILES_FLOAT = []
diff --git a/rpython/jit/backend/zarch/runner.py b/rpython/jit/backend/zarch/runner.py
--- a/rpython/jit/backend/zarch/runner.py
+++ b/rpython/jit/backend/zarch/runner.py
@@ -19,6 +19,7 @@
 class CPU_S390_64(AbstractZARCHCPU):
     dont_keepalive_stuff = True
     supports_floats = True
+    from rpython.jit.backend.zarch.registers import JITFRAME_FIXED_SIZE
 
     IS_64_BIT = True
 


More information about the pypy-commit mailing list