Author: Maciej Fijalkowski <[email protected]>
Branch: vmprof
Changeset: r75341:3d101135a1f5
Date: 2015-01-15 13:15 +0200
http://bitbucket.org/pypy/pypy/changeset/3d101135a1f5/
Log: add rbisect
diff --git a/rpython/jit/backend/llsupport/asmmemmgr.py
b/rpython/jit/backend/llsupport/asmmemmgr.py
--- a/rpython/jit/backend/llsupport/asmmemmgr.py
+++ b/rpython/jit/backend/llsupport/asmmemmgr.py
@@ -24,6 +24,10 @@
self.free_blocks = {} # map {start: stop}
self.free_blocks_end = {} # map {stop: start}
self.blocks_by_size = [[] for i in range(self.num_indices)]
+ # two lists of jit addresses (sorted) and the corresponding stack
+ # depths
+ self.jit_addr_map = []
+ self.jit_frame_depth_map = []
def malloc(self, minsize, maxsize):
"""Allocate executable memory, between minsize and maxsize bytes,
@@ -151,6 +155,18 @@
del self.free_blocks_end[stop]
return (start, stop)
+ def register_frame_depth_map(self, rawstart, frame_positions,
+ frame_assignments):
+ if not self.jit_addr_map or rawstart > self.jit_addr_map[-1]:
+ start = len(self.jit_addr_map)
+ self.jit_addr_map += [0] * len(frame_positions)
+ self.jit_frame_depth_map += [0] * len(frame_positions)
+ for i, pos in enumerate(frame_positions):
+ self.jit_addr_map[i + start] = pos + rawstart
+ self.jit_frame_depth_map[i + start] = frame_assignments[i]
+ else:
+ xxx
+
def _delete(self):
"NOT_RPYTHON"
if self._allocated:
@@ -311,6 +327,10 @@
assert gcrootmap is not None
for pos, mark in self.gcroot_markers:
gcrootmap.register_asm_addr(rawstart + pos, mark)
+ asmmemmgr.register_frame_depth_map(rawstart, self.frame_positions,
+ self.frame_assignments)
+ self.frame_positions = None
+ self.frame_assignments = None
return rawstart
def _become_a_plain_block_builder(self):
diff --git a/rpython/jit/backend/llsupport/llmodel.py
b/rpython/jit/backend/llsupport/llmodel.py
--- a/rpython/jit/backend/llsupport/llmodel.py
+++ b/rpython/jit/backend/llsupport/llmodel.py
@@ -16,7 +16,7 @@
FieldDescr, ArrayDescr, CallDescr, InteriorFieldDescr,
FLAG_POINTER, FLAG_FLOAT)
from rpython.jit.backend.llsupport.memcpy import memset_fn
-from rpython.jit.backend.llsupport.asmmemmgr import AsmMemoryManager
+from rpython.jit.backend.llsupport import asmmemmgr
from rpython.rlib.unroll import unrolling_iterable
@@ -48,7 +48,8 @@
self._setup_exception_handling_translated()
else:
self._setup_exception_handling_untranslated()
- self.asmmemmgr = AsmMemoryManager()
+ self.asmmemmgr = asmmemmgr.AsmMemoryManager()
+ asmmemmgr._memmngr = self.asmmemmgr
self._setup_frame_realloc(translate_support_code)
ad = self.gc_ll_descr.getframedescrs(self).arraydescr
self.signedarraydescr = ad
diff --git a/rpython/jit/backend/x86/codebuf.py
b/rpython/jit/backend/x86/codebuf.py
--- a/rpython/jit/backend/x86/codebuf.py
+++ b/rpython/jit/backend/x86/codebuf.py
@@ -22,8 +22,8 @@
LocationCodeBuilder,
codebuilder_cls):
def __init__(self):
+ self.init_block_builder()
codebuilder_cls.__init__(self)
- self.init_block_builder()
# a list of relative positions; for each position p, the bytes
# at [p-4:p] encode an absolute address that will need to be
# made relative. Only works on 32-bit!
diff --git a/rpython/jit/backend/x86/rx86.py b/rpython/jit/backend/x86/rx86.py
--- a/rpython/jit/backend/x86/rx86.py
+++ b/rpython/jit/backend/x86/rx86.py
@@ -448,6 +448,8 @@
"""Abstract base class."""
def __init__(self):
+ self.frame_positions = []
+ self.frame_assignments = []
self.force_frame_size(self.WORD)
def writechar(self, char):
@@ -468,11 +470,15 @@
self.writechar(chr((imm >> 24) & 0xFF))
def force_frame_size(self, frame_size):
+ self.frame_positions.append(self.get_relative_pos())
+ self.frame_assignments.append(frame_size)
self._frame_size = frame_size
def stack_frame_size_delta(self, delta):
"Called when we generate an instruction that changes the value of ESP"
self._frame_size += delta
+ self.frame_positions.append(self.get_relative_pos())
+ self.frame_assignments.append(self._frame_size)
assert self._frame_size >= self.WORD
def check_stack_size_at_ret(self):
diff --git a/rpython/rlib/rbisect.py b/rpython/rlib/rbisect.py
new file mode 100644
--- /dev/null
+++ b/rpython/rlib/rbisect.py
@@ -0,0 +1,9 @@
+
+def bisect(a, x):
+ lo = 0
+ hi = len(a)
+ while lo < hi:
+ mid = (lo+hi)//2
+ if x < a[mid]: hi = mid
+ else: lo = mid+1
+ return lo
diff --git a/rpython/rlib/test/test_rbisect.py
b/rpython/rlib/test/test_rbisect.py
new file mode 100644
--- /dev/null
+++ b/rpython/rlib/test/test_rbisect.py
@@ -0,0 +1,47 @@
+
+from rpython.rlib.rbisect import bisect
+
+def test_bisect():
+ cases = [
+ ([], 1, 0),
+ ([1], 0, 0),
+ ([1], 1, 1),
+ ([1], 2, 1),
+ ([1, 1], 0, 0),
+ ([1, 1], 1, 2),
+ ([1, 1], 2, 2),
+ ([1, 1, 1], 0, 0),
+ ([1, 1, 1], 1, 3),
+ ([1, 1, 1], 2, 3),
+ ([1, 1, 1, 1], 0, 0),
+ ([1, 1, 1, 1], 1, 4),
+ ([1, 1, 1, 1], 2, 4),
+ ([1, 2], 0, 0),
+ ([1, 2], 1, 1),
+ ([1, 2], 1.5, 1),
+ ([1, 2], 2, 2),
+ ([1, 2], 3, 2),
+ ([1, 1, 2, 2], 0, 0),
+ ([1, 1, 2, 2], 1, 2),
+ ([1, 1, 2, 2], 1.5, 2),
+ ([1, 1, 2, 2], 2, 4),
+ ([1, 1, 2, 2], 3, 4),
+ ([1, 2, 3], 0, 0),
+ ([1, 2, 3], 1, 1),
+ ([1, 2, 3], 1.5, 1),
+ ([1, 2, 3], 2, 2),
+ ([1, 2, 3], 2.5, 2),
+ ([1, 2, 3], 3, 3),
+ ([1, 2, 3], 4, 3),
+ ([1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 0, 0),
+ ([1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 1, 1),
+ ([1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 1.5, 1),
+ ([1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 2, 3),
+ ([1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 2.5, 3),
+ ([1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 3, 6),
+ ([1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 3.5, 6),
+ ([1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 4, 10),
+ ([1, 2, 2, 3, 3, 3, 4, 4, 4, 4], 5, 10),
+ ]
+ for lst, elem, exp in cases:
+ assert bisect(lst, elem) == exp
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit