[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