Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r90984:aeca854b1b83 Date: 2017-04-06 15:39 +0200 http://bitbucket.org/pypy/pypy/changeset/aeca854b1b83/
Log: Allow propagating the known value of r11 a bit more often 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 @@ -250,7 +250,7 @@ return self.rawstart def overwrite(self, index, char): - assert 0 <= index < self.get_relative_pos() + assert 0 <= index < self.get_relative_pos(break_basic_block=False) block = self._cursubblock index -= self._baserelpos while index < 0: @@ -264,7 +264,8 @@ self.overwrite(index + 2, chr((val >> 16) & 0xff)) self.overwrite(index + 3, chr((val >> 24) & 0xff)) - def get_relative_pos(self): + def get_relative_pos(self, break_basic_block=True): + # 'break_basic_block' is only used in x86 return self._baserelpos + self._cursubindex def copy_to_raw_memory(self, addr): @@ -288,7 +289,7 @@ HEX = '0123456789ABCDEF' dump = [] src = rffi.cast(rffi.CCHARP, addr) - end = self.get_relative_pos() + end = self.get_relative_pos(break_basic_block=False) if count != -1: end = offset + count for p in range(offset, end): @@ -336,17 +337,20 @@ def _become_a_plain_block_builder(self): # hack purely for speed of tests - self._data = [] - self.writechar = self._data.append - self.overwrite = self._data.__setitem__ - self.get_relative_pos = self._data.__len__ + self._data = _data = [] + self.writechar = _data.append + self.overwrite = _data.__setitem__ + def get_relative_pos(break_basic_block=True): + return len(_data) + self.get_relative_pos = get_relative_pos def plain_copy_to_raw_memory(addr): dst = rffi.cast(rffi.CCHARP, addr) - for i, c in enumerate(self._data): + for i, c in enumerate(_data): dst[i] = c self._copy_to_raw_memory = plain_copy_to_raw_memory def insert_gcroot_marker(self, mark): if self.gcroot_markers is None: self.gcroot_markers = [] - self.gcroot_markers.append((self.get_relative_pos(), mark)) + self.gcroot_markers.append( + (self.get_relative_pos(break_basic_block=False), mark)) diff --git a/rpython/jit/backend/llsupport/assembler.py b/rpython/jit/backend/llsupport/assembler.py --- a/rpython/jit/backend/llsupport/assembler.py +++ b/rpython/jit/backend/llsupport/assembler.py @@ -265,14 +265,16 @@ def enter_portal_frame(self, op): if self.cpu.HAS_CODEMAP: + pos = self.mc.get_relative_pos(break_basic_block=False) self.codemap_builder.enter_portal_frame(op.getarg(0).getint(), op.getarg(1).getint(), - self.mc.get_relative_pos()) + pos) def leave_portal_frame(self, op): if self.cpu.HAS_CODEMAP: + pos = self.mc.get_relative_pos(break_basic_block=False) self.codemap_builder.leave_portal_frame(op.getarg(0).getint(), - self.mc.get_relative_pos()) + pos) def call_assembler(self, op, argloc, vloc, result_loc, tmploc): """ diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py --- a/rpython/jit/backend/x86/assembler.py +++ b/rpython/jit/backend/x86/assembler.py @@ -1713,6 +1713,8 @@ pos = self.mc.get_relative_pos(break_basic_block=False) pos += 1 # after potential jmp guard_token.pos_jump_offset = pos + saved = self.mc.get_scratch_register_known_value() + guard_token.known_scratch_value = saved self.pending_guard_tokens.append(guard_token) def genop_guard_guard_exception(self, guard_op, guard_token, locs, resloc): @@ -1908,6 +1910,8 @@ """ self.mc.force_frame_size(DEFAULT_FRAME_BYTES) startpos = self.mc.get_relative_pos() + self.mc.restore_scratch_register_known_value( + guardtok.known_scratch_value) # self._update_at_exit(guardtok.fail_locs, guardtok.failargs, guardtok.faildescr, regalloc) @@ -2069,6 +2073,8 @@ self.guard_success_cc = rx86.cond_none pos = self.mc.get_relative_pos(break_basic_block=False) guard_token.pos_jump_offset = pos - 4 + saved = self.mc.get_scratch_register_known_value() + guard_token.known_scratch_value = saved self.pending_guard_tokens.append(guard_token) def _genop_real_call(self, op, arglocs, resloc): diff --git a/rpython/jit/backend/x86/regloc.py b/rpython/jit/backend/x86/regloc.py --- a/rpython/jit/backend/x86/regloc.py +++ b/rpython/jit/backend/x86/regloc.py @@ -621,6 +621,12 @@ def forget_scratch_register(self): self._scratch_register_value = 0 + def get_scratch_register_known_value(self): + return self._scratch_register_value + + def restore_scratch_register_known_value(self, saved_value): + self._scratch_register_value = saved_value + def trap(self): self.INT3() _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit