Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: optresult
Changeset: r75240:035392d23801
Date: 2015-01-05 11:04 +0200
http://bitbucket.org/pypy/pypy/changeset/035392d23801/

Log:    start whacking at the backend

diff --git a/rpython/jit/backend/llsupport/regalloc.py 
b/rpython/jit/backend/llsupport/regalloc.py
--- a/rpython/jit/backend/llsupport/regalloc.py
+++ b/rpython/jit/backend/llsupport/regalloc.py
@@ -734,7 +734,7 @@
     # any instance field, we can use a fake object
     class Fake(cls):
         pass
-    op = Fake(None)
+    op = Fake()
     return op.is_comparison() or op.is_ovf()
 
 def valid_addressing_size(size):
diff --git a/rpython/jit/backend/llsupport/rewrite.py 
b/rpython/jit/backend/llsupport/rewrite.py
--- a/rpython/jit/backend/llsupport/rewrite.py
+++ b/rpython/jit/backend/llsupport/rewrite.py
@@ -2,8 +2,8 @@
 from rpython.rlib.rarithmetic import ovfcheck
 from rpython.rtyper.lltypesystem import llmemory, lltype
 from rpython.jit.metainterp import history
-from rpython.jit.metainterp.history import ConstInt, BoxPtr, ConstPtr, BoxInt
-from rpython.jit.metainterp.resoperation import ResOperation, rop
+from rpython.jit.metainterp.history import ConstInt, ConstPtr
+from rpython.jit.metainterp.resoperation import ResOperation, rop, OpHelpers
 from rpython.jit.codewriter import heaptracker
 from rpython.jit.backend.llsupport.symbolic import WORD
 from rpython.jit.backend.llsupport.descr import SizeDescr, ArrayDescr,\
@@ -96,7 +96,7 @@
                 elif op.getopnum() == rop.SETARRAYITEM_GC:
                     self.consider_setarrayitem_gc(op)
             # ---------- call assembler -----------
-            if op.getopnum() == rop.CALL_ASSEMBLER:
+            if OpHelpers.is_call_assembler(op.getopnum()):
                 self.handle_call_assembler(op)
                 continue
             if op.getopnum() == rop.JUMP or op.getopnum() == rop.FINISH:
@@ -199,11 +199,11 @@
     def handle_new_fixedsize(self, descr, op):
         assert isinstance(descr, SizeDescr)
         size = descr.size
-        if self.gen_malloc_nursery(size, op.result):
+        if self.gen_malloc_nursery(size, op):
             self.gen_initialize_tid(op.result, descr.tid)
         else:
-            self.gen_malloc_fixedsize(size, descr.tid, op.result)
-        self.clear_gc_fields(descr, op.result)
+            self.gen_malloc_fixedsize(size, descr.tid, op)
+        self.clear_gc_fields(descr, op)
 
     def handle_new_array(self, arraydescr, op, kind=FLAG_ARRAY):
         v_length = op.getarg(0)
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
@@ -1257,10 +1257,13 @@
         self.mc.SET_ir(rx86.Conditions['E'], rl.value)
         self.mc.MOVZX8(resloc, rl)
 
-    def genop_same_as(self, op, arglocs, resloc):
+    def _genop_same_as(self, op, arglocs, resloc):
         self.mov(arglocs[0], resloc)
-    genop_cast_ptr_to_int = genop_same_as
-    genop_cast_int_to_ptr = genop_same_as
+    genop_same_as_i = _genop_same_as
+    genop_same_as_r = _genop_same_as
+    genop_same_as_f = _genop_same_as
+    genop_cast_ptr_to_int = _genop_same_as
+    genop_cast_int_to_ptr = _genop_same_as
 
     def genop_int_force_ge_zero(self, op, arglocs, resloc):
         self.mc.TEST(arglocs[0], arglocs[0])
@@ -1417,17 +1420,24 @@
         else:
             not_implemented("save_into_mem size = %d" % size)
 
-    def genop_getfield_gc(self, op, arglocs, resloc):
+    def _genop_getfield_gc(self, op, arglocs, resloc):
         base_loc, ofs_loc, size_loc, sign_loc = arglocs
         assert isinstance(size_loc, ImmedLoc)
         source_addr = AddressLoc(base_loc, ofs_loc)
         self.load_from_mem(resloc, source_addr, size_loc, sign_loc)
 
-    genop_getfield_raw = genop_getfield_gc
-    genop_getfield_raw_pure = genop_getfield_gc
-    genop_getfield_gc_pure = genop_getfield_gc
+    genop_getfield_gc_i = _genop_getfield_gc
+    genop_getfield_gc_r = _genop_getfield_gc
+    genop_getfield_gc_f = _genop_getfield_gc
+    genop_getfield_raw_i = _genop_getfield_gc
+    genop_getfield_raw_f = _genop_getfield_gc
+    genop_getfield_raw_pure_i = _genop_getfield_gc
+    genop_getfield_raw_pure_f = _genop_getfield_gc
+    genop_getfield_gc_pure_i = _genop_getfield_gc
+    genop_getfield_gc_pure_r = _genop_getfield_gc
+    genop_getfield_gc_pure_f = _genop_getfield_gc
 
-    def genop_getarrayitem_gc(self, op, arglocs, resloc):
+    def _genop_getarrayitem_gc(self, op, arglocs, resloc):
         base_loc, ofs_loc, size_loc, ofs, sign_loc = arglocs
         assert isinstance(ofs, ImmedLoc)
         assert isinstance(size_loc, ImmedLoc)
@@ -1435,15 +1445,24 @@
         src_addr = addr_add(base_loc, ofs_loc, ofs.value, scale)
         self.load_from_mem(resloc, src_addr, size_loc, sign_loc)
 
-    genop_getarrayitem_gc_pure = genop_getarrayitem_gc
-    genop_getarrayitem_raw = genop_getarrayitem_gc
-    genop_getarrayitem_raw_pure = genop_getarrayitem_gc
+    genop_getarrayitem_gc_i = _genop_getarrayitem_gc
+    genop_getarrayitem_gc_r = _genop_getarrayitem_gc
+    genop_getarrayitem_gc_f = _genop_getarrayitem_gc
+    genop_getarrayitem_gc_pure_i = _genop_getarrayitem_gc
+    genop_getarrayitem_gc_pure_r = _genop_getarrayitem_gc
+    genop_getarrayitem_gc_pure_f = _genop_getarrayitem_gc
+    genop_getarrayitem_raw_i = _genop_getarrayitem_gc
+    genop_getarrayitem_raw_f = _genop_getarrayitem_gc
+    genop_getarrayitem_raw_pure_i = _genop_getarrayitem_gc
+    genop_getarrayitem_raw_pure_f = _genop_getarrayitem_gc
 
-    def genop_raw_load(self, op, arglocs, resloc):
+    def _genop_raw_load(self, op, arglocs, resloc):
         base_loc, ofs_loc, size_loc, ofs, sign_loc = arglocs
         assert isinstance(ofs, ImmedLoc)
         src_addr = addr_add(base_loc, ofs_loc, ofs.value, 0)
         self.load_from_mem(resloc, src_addr, size_loc, sign_loc)
+    genop_raw_load_i = _genop_raw_load
+    genop_raw_load_f = _genop_raw_load
 
     def _imul_const_scaled(self, mc, targetreg, sourcereg, itemsize):
         """Produce one operation to do roughly
@@ -1490,13 +1509,16 @@
         assert isinstance(ofs_loc, ImmedLoc)
         return AddressLoc(base_loc, temp_loc, shift, ofs_loc.value)
 
-    def genop_getinteriorfield_gc(self, op, arglocs, resloc):
+    def _genop_getinteriorfield_gc(self, op, arglocs, resloc):
         (base_loc, ofs_loc, itemsize_loc, fieldsize_loc,
             index_loc, temp_loc, sign_loc) = arglocs
         src_addr = self._get_interiorfield_addr(temp_loc, index_loc,
                                                 itemsize_loc, base_loc,
                                                 ofs_loc)
         self.load_from_mem(resloc, src_addr, fieldsize_loc, sign_loc)
+    genop_getinteriorfield_gc_i = _genop_getinteriorfield_gc
+    genop_getinteriorfield_gc_r = _genop_getinteriorfield_gc
+    genop_getinteriorfield_gc_f = _genop_getinteriorfield_gc
 
     def genop_discard_increment_debug_counter(self, op, arglocs):
         # The argument should be an immediate address.  This should
@@ -1919,8 +1941,12 @@
         guard_token.pos_jump_offset = self.mc.get_relative_pos() - 4
         self.pending_guard_tokens.append(guard_token)
 
-    def genop_call(self, op, arglocs, resloc):
+    def _genop_real_call(self, op, arglocs, resloc):
         self._genop_call(op, arglocs, resloc)
+    genop_call_i = _genop_real_call
+    genop_call_r = _genop_real_call
+    genop_call_f = _genop_real_call
+    genop_call_n = _genop_real_call
 
     def _genop_call(self, op, arglocs, resloc, is_call_release_gil=False):
         from rpython.jit.backend.llsupport.descr import CallDescr
@@ -1955,24 +1981,32 @@
         self.mc.CMP_bi(ofs, 0)
         self.implement_guard(guard_token, 'NE')
 
-    def genop_guard_call_may_force(self, op, guard_op, guard_token,
+    def _genop_guard_call_may_force(self, op, guard_op, guard_token,
                                    arglocs, result_loc):
         self._store_force_index(guard_op)
         self._genop_call(op, arglocs, result_loc)
         self._emit_guard_not_forced(guard_token)
+    genop_guard_call_may_force_i = _genop_guard_call_may_force
+    genop_guard_call_may_force_r = _genop_guard_call_may_force
+    genop_guard_call_may_force_f = _genop_guard_call_may_force
+    genop_guard_call_may_force_n = _genop_guard_call_may_force
 
-    def genop_guard_call_release_gil(self, op, guard_op, guard_token,
+    def _genop_guard_call_release_gil(self, op, guard_op, guard_token,
                                      arglocs, result_loc):
         self._store_force_index(guard_op)
         self._genop_call(op, arglocs, result_loc, is_call_release_gil=True)
         self._emit_guard_not_forced(guard_token)
+    genop_guard_call_release_gil_i = _genop_guard_call_release_gil
+    genop_guard_call_release_gil_r = _genop_guard_call_release_gil
+    genop_guard_call_release_gil_f = _genop_guard_call_release_gil
+    genop_guard_call_release_gil_n = _genop_guard_call_release_gil
 
     def imm(self, v):
         return imm(v)
 
     # ------------------- CALL ASSEMBLER --------------------------
 
-    def genop_guard_call_assembler(self, op, guard_op, guard_token,
+    def _genop_guard_call_assembler(self, op, guard_op, guard_token,
                                    arglocs, result_loc):
         if len(arglocs) == 2:
             [argloc, vloc] = arglocs
@@ -1981,6 +2015,10 @@
             vloc = self.imm(0)
         self.call_assembler(op, guard_op, argloc, vloc, result_loc, eax)
         self._emit_guard_not_forced(guard_token)
+    genop_guard_call_assembler_i = _genop_guard_call_assembler
+    genop_guard_call_assembler_r = _genop_guard_call_assembler
+    genop_guard_call_assembler_f = _genop_guard_call_assembler
+    genop_guard_call_assembler_n = _genop_guard_call_assembler
 
     def _call_assembler_emit_call(self, addr, argloc, _):
         threadlocal_loc = RawEspLoc(THREADLOCAL_OFS, INT)
diff --git a/rpython/jit/backend/x86/regalloc.py 
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -23,7 +23,7 @@
 from rpython.jit.codewriter.effectinfo import EffectInfo
 from rpython.jit.metainterp.history import (Box, Const, ConstInt, ConstPtr,
     ConstFloat, BoxInt, BoxFloat, INT, REF, FLOAT, TargetToken)
-from rpython.jit.metainterp.resoperation import rop, ResOperation
+from rpython.jit.metainterp.resoperation import rop, OpHelpers
 from rpython.rlib import rgc
 from rpython.rlib.objectmodel import we_are_translated
 from rpython.rlib.rarithmetic import r_longlong, r_uint
@@ -757,7 +757,7 @@
                        [self.loc(op.getarg(i)) for i in range(op.numargs())],
                    guard_not_forced_op=guard_not_forced_op)
 
-    def consider_call(self, op):
+    def _consider_real_call(self, op):
         effectinfo = op.getdescr().get_extra_info()
         oopspecindex = effectinfo.oopspecindex
         if oopspecindex != EffectInfo.OS_NONE:
@@ -789,21 +789,37 @@
             if oopspecindex == EffectInfo.OS_MATH_READ_TIMESTAMP:
                 return self._consider_math_read_timestamp(op)
         self._consider_call(op)
+    consider_call_i = _consider_real_call
+    consider_call_r = _consider_real_call
+    consider_call_f = _consider_real_call
+    consider_call_n = _consider_real_call
 
-    def consider_call_may_force(self, op, guard_op):
+    def _consider_call_may_force(self, op, guard_op):
         assert guard_op is not None
         self._consider_call(op, guard_op)
+    consider_call_may_force_i = _consider_call_may_force
+    consider_call_may_force_r = _consider_call_may_force
+    consider_call_may_force_f = _consider_call_may_force
+    consider_call_may_force_n = _consider_call_may_force
 
-    def consider_call_release_gil(self, op, guard_op):
+    def _consider_call_release_gil(self, op, guard_op):
         assert guard_op is not None
         self._consider_call(op, guard_op)
-
+    consider_call_release_gil_i = _consider_call_release_gil
+    consider_call_release_gil_r = _consider_call_release_gil
+    consider_call_release_gil_f = _consider_call_release_gil
+    consider_call_release_gil_n = _consider_call_release_gil
+    
     def consider_call_malloc_gc(self, op):
         self._consider_call(op)
 
-    def consider_call_assembler(self, op, guard_op):
+    def _consider_call_assembler(self, op, guard_op):
         locs = self.locs_for_call_assembler(op, guard_op)
         self._call(op, locs, guard_not_forced_op=guard_op)
+    consider_call_assembler_i = _consider_call_assembler
+    consider_call_assembler_r = _consider_call_assembler
+    consider_call_assembler_f = _consider_call_assembler
+    consider_call_assembler_n = _consider_call_assembler
 
     def consider_cond_call_gc_wb(self, op):
         assert op.result is None
@@ -1012,7 +1028,7 @@
     consider_setarrayitem_raw = consider_setarrayitem_gc
     consider_raw_store = consider_setarrayitem_gc
 
-    def consider_getfield_gc(self, op):
+    def _consider_getfield_gc(self, op):
         ofs, size, sign = unpack_fielddescr(op.getdescr())
         ofs_loc = imm(ofs)
         size_loc = imm(size)
@@ -1025,15 +1041,22 @@
             sign_loc = imm0
         self.perform(op, [base_loc, ofs_loc, size_loc, sign_loc], result_loc)
 
-    consider_getfield_raw = consider_getfield_gc
-    consider_getfield_raw_pure = consider_getfield_gc
-    consider_getfield_gc_pure = consider_getfield_gc
+    consider_getfield_gc_i = _consider_getfield_gc    
+    consider_getfield_gc_r = _consider_getfield_gc    
+    consider_getfield_gc_f = _consider_getfield_gc    
+    consider_getfield_raw_i = _consider_getfield_gc
+    consider_getfield_raw_f = _consider_getfield_gc
+    consider_getfield_raw_pure_i = _consider_getfield_gc
+    consider_getfield_raw_pure_f = _consider_getfield_gc
+    consider_getfield_gc_pure_i = _consider_getfield_gc
+    consider_getfield_gc_pure_r = _consider_getfield_gc
+    consider_getfield_gc_pure_f = _consider_getfield_gc
 
     def consider_increment_debug_counter(self, op):
         base_loc = self.loc(op.getarg(0))
         self.perform_discard(op, [base_loc])
 
-    def consider_getarrayitem_gc(self, op):
+    def _consider_getarrayitem_gc(self, op):
         itemsize, ofs, sign = unpack_arraydescr(op.getdescr())
         args = op.getarglist()
         base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args)
@@ -1046,12 +1069,20 @@
         self.perform(op, [base_loc, ofs_loc, imm(itemsize), imm(ofs),
                           sign_loc], result_loc)
 
-    consider_getarrayitem_raw = consider_getarrayitem_gc
-    consider_getarrayitem_gc_pure = consider_getarrayitem_gc
-    consider_getarrayitem_raw_pure = consider_getarrayitem_gc
-    consider_raw_load = consider_getarrayitem_gc
+    consider_getarrayitem_gc_i = _consider_getarrayitem_gc
+    consider_getarrayitem_gc_r = _consider_getarrayitem_gc
+    consider_getarrayitem_gc_f = _consider_getarrayitem_gc
+    consider_getarrayitem_raw_i = _consider_getarrayitem_gc
+    consider_getarrayitem_raw_f = _consider_getarrayitem_gc
+    consider_getarrayitem_gc_pure_i = _consider_getarrayitem_gc
+    consider_getarrayitem_gc_pure_r = _consider_getarrayitem_gc
+    consider_getarrayitem_gc_pure_f = _consider_getarrayitem_gc
+    consider_getarrayitem_raw_pure_i = _consider_getarrayitem_gc
+    consider_getarrayitem_raw_pure_f = _consider_getarrayitem_gc
+    consider_raw_load_i = _consider_getarrayitem_gc
+    consider_raw_load_f = _consider_getarrayitem_gc
 
-    def consider_getinteriorfield_gc(self, op):
+    def _consider_getinteriorfield_gc(self, op):
         t = unpack_interiorfielddescr(op.getdescr())
         ofs, itemsize, fieldsize, sign = imm(t[0]), imm(t[1]), imm(t[2]), t[3]
         if sign:
@@ -1079,6 +1110,10 @@
         self.perform(op, [base_loc, ofs, itemsize, fieldsize,
                           index_loc, temp_loc, sign_loc], result_loc)
 
+    consider_getinteriorfield_gc_i = _consider_getinteriorfield_gc
+    consider_getinteriorfield_gc_r = _consider_getinteriorfield_gc
+    consider_getinteriorfield_gc_f = _consider_getinteriorfield_gc
+
     def consider_int_is_true(self, op, guard_op):
         # doesn't need arg to be in a register
         argloc = self.loc(op.getarg(0))
@@ -1090,12 +1125,15 @@
 
     consider_int_is_zero = consider_int_is_true
 
-    def consider_same_as(self, op):
+    def _consider_same_as(self, op):
         argloc = self.loc(op.getarg(0))
         resloc = self.force_allocate_reg(op.result)
         self.perform(op, [argloc], resloc)
-    consider_cast_ptr_to_int = consider_same_as
-    consider_cast_int_to_ptr = consider_same_as
+    consider_cast_ptr_to_int = _consider_same_as
+    consider_cast_int_to_ptr = _consider_same_as
+    consider_same_as_i = _consider_same_as
+    consider_same_as_r = _consider_same_as
+    consider_same_as_f = _consider_same_as
 
     def consider_int_force_ge_zero(self, op):
         argloc = self.make_sure_var_in_reg(op.getarg(0))
@@ -1452,9 +1490,9 @@
         name = name[len('consider_'):]
         num = getattr(rop, name.upper())
         if (is_comparison_or_ovf_op(num)
-            or num == rop.CALL_MAY_FORCE
-            or num == rop.CALL_ASSEMBLER
-            or num == rop.CALL_RELEASE_GIL):
+            or OpHelpers.is_call_may_force(num)
+            or OpHelpers.is_call_assembler(num)
+            or OpHelpers.is_call_release_gil(num)):
             oplist_with_guard[num] = value
             oplist[num] = add_none_argument(value)
         else:
diff --git a/rpython/jit/metainterp/compile.py 
b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -139,9 +139,9 @@
     part = create_empty_loop(metainterp)
     part.inputargs = inputargs[:]
     h_ops = history.operations
-    label = ResOperation(rop.LABEL, inputargs, None,
+    label = ResOperation(rop.LABEL, inputargs,
                          descr=TargetToken(jitcell_token))
-    end_label = ResOperation(rop.LABEL, jumpargs, None, descr=jitcell_token)
+    end_label = ResOperation(rop.LABEL, jumpargs, descr=jitcell_token)
     part.operations = [label] + h_ops[start:] + [end_label]
 
     try:
@@ -165,7 +165,7 @@
         part.operations = [part.operations[-1]] + \
                           [inliner.inline_op(h_ops[i]) for i in range(start, 
len(h_ops))] + \
                           [ResOperation(rop.JUMP, [inliner.inline_arg(a) for a 
in jumpargs],
-                                        None, descr=jitcell_token)]
+                                        descr=jitcell_token)]
         target_token = part.operations[0].getdescr()
         assert isinstance(target_token, TargetToken)
         all_target_tokens.append(target_token)
@@ -222,7 +222,7 @@
 
     part.operations = [partial_trace.operations[-1]] + \
                       h_ops[start:] + \
-                      [ResOperation(rop.JUMP, jumpargs, None, 
descr=loop_jitcell_token)]
+                      [ResOperation(rop.JUMP, jumpargs, 
descr=loop_jitcell_token)]
     label = part.operations[0]
     orignial_label = label.clone()
     assert label.getopnum() == rop.LABEL
@@ -236,7 +236,7 @@
         assert isinstance(target_token, TargetToken)
         part.operations = [orignial_label] + \
                           [ResOperation(rop.JUMP, inputargs[:],
-                                        None, descr=loop_jitcell_token)]
+                                        descr=loop_jitcell_token)]
         try:
             optimize_trace(metainterp_sd, jitdriver_sd, part,
                            jitdriver_sd.warmstate.enable_opts,
@@ -275,6 +275,7 @@
     return target_token
 
 def patch_new_loop_to_load_virtualizable_fields(loop, jitdriver_sd):
+    xxx
     vinfo = jitdriver_sd.virtualizable_info
     extra_ops = []
     inputargs = loop.inputargs
diff --git a/rpython/jit/metainterp/optimizeopt/simplify.py 
b/rpython/jit/metainterp/optimizeopt/simplify.py
--- a/rpython/jit/metainterp/optimizeopt/simplify.py
+++ b/rpython/jit/metainterp/optimizeopt/simplify.py
@@ -48,7 +48,7 @@
         if not self.unroll:
             descr = op.getdescr()
             if isinstance(descr, JitCellToken):
-                return self.optimize_JUMP(op._copy_and_change(rop.JUMP))
+                return self.optimize_JUMP(op.copy_and_change(rop.JUMP))
             self.last_label_descr = op.getdescr()
         self.emit_operation(op)
 
diff --git a/rpython/jit/metainterp/resoperation.py 
b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -1020,3 +1020,24 @@
         elif tp == 'f':
             return rop.CALL_F
         return rop.CALL_N
+
+    @staticmethod
+    def is_call_assembler(opnum):
+        return (opnum == rop.CALL_ASSEMBLER_I or
+                opnum == rop.CALL_ASSEMBLER_R or
+                opnum == rop.CALL_ASSEMBLER_F or
+                opnum == rop.CALL_ASSEMBLER_N)
+
+    @staticmethod
+    def is_call_may_force(opnum):
+        return (opnum == rop.CALL_MAY_FORCE_I or
+                opnum == rop.CALL_MAY_FORCE_R or
+                opnum == rop.CALL_MAY_FORCE_F or
+                opnum == rop.CALL_MAY_FORCE_N)
+
+    @staticmethod
+    def is_call_release_gil(opnum):
+        return (opnum == rop.CALL_RELEASE_GIL_I or
+                opnum == rop.CALL_RELEASE_GIL_R or
+                opnum == rop.CALL_RELEASE_GIL_F or
+                opnum == rop.CALL_RELEASE_GIL_N)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to