Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: fast-slowpath
Changeset: r65605:26be63cd3453
Date: 2013-07-24 16:03 +0200
http://bitbucket.org/pypy/pypy/changeset/26be63cd3453/

Log:    be clear about conditional_call limitations. Also try to support
        32bit (untested so far)

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
@@ -155,11 +155,19 @@
         """
         mc = codebuf.MachineCodeBlockWrapper()
         self._push_all_regs_to_frame(mc, [], supports_floats, callee_only)
-        mc.SUB(esp, imm(WORD))
+        if self.cpu.IS_X86_64:
+            mc.SUB(esp, imm(WORD))
+        else:
+            # we want space for 3 arguments + call + alignment
+            # the caller is responsible for putting arguments in the right spot
+            mc.SUB(esp, imm(WORD * 7))
         self.set_extra_stack_depth(mc, 2 * WORD)
         # args are in their respective positions
         mc.CALL(eax)
-        mc.ADD(esp, imm(WORD))
+        if self.cpu.IS_X86_64:
+            mc.ADD(esp, imm(WORD))
+        else:
+            mc.ADD(esp, imm(WORD * 7))
         self.set_extra_stack_depth(mc, 0)
         self._reload_frame_if_necessary(mc, align_stack=True)
         self._pop_all_regs_from_frame(mc, [], supports_floats,
@@ -2144,7 +2152,7 @@
     def label(self):
         self._check_frame_depth_debug(self.mc)
 
-    def cond_call(self, op, gcmap, cond_loc, call_loc):
+    def cond_call(self, op, gcmap, cond_loc, call_loc, arglocs):
         self.mc.TEST(cond_loc, cond_loc)
         self.mc.J_il8(rx86.Conditions['Z'], 0) # patched later
         jmp_adr = self.mc.get_relative_pos()
@@ -2160,6 +2168,12 @@
             if self._regalloc.xrm.reg_bindings:
                 floats = True
         cond_call_adr = self.cond_call_slowpath[floats * 2 + callee_only]
+        if self.cpu.IS_X86_32:
+            p = -7 * WORD
+            for i in range(len(arglocs) - 1, -1, -1):
+                loc = arglocs[i]
+                self.mc.MOV(RawEspLoc(p), loc)
+                p += WORD
         self.mc.CALL(imm(cond_call_adr))
         self.pop_gcmap(self.mc)
         # never any result value
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
@@ -809,12 +809,18 @@
         imm = self.rm.convert_to_imm(v)
         self.assembler.regalloc_mov(imm, eax)
         args_so_far = [tmpbox]
+        locs = []
         for i in range(2, len(args)):
-            reg = self.rm.register_arguments[i - 2]
-            self.make_sure_var_in_reg(args[i], args_so_far, selected_reg=reg)
+            if self.cpu.IS_X86_64:
+                reg = self.rm.register_arguments[i - 2]
+                self.make_sure_var_in_reg(args[i], args_so_far, 
selected_reg=reg)
+            else:
+                loc = self.make_sure_var_in_reg(args[i], args_so_far)
+                locs.append(loc)
             args_so_far.append(args[i])
         loc_cond = self.make_sure_var_in_reg(args[0], args)
-        self.assembler.cond_call(op, self.get_gcmap([eax]), loc_cond, eax)
+        self.assembler.cond_call(op, self.get_gcmap([eax]), loc_cond, eax,
+                                 locs)
         self.rm.possibly_free_var(tmpbox)
 
     def consider_call_malloc_nursery(self, op):
diff --git a/rpython/jit/codewriter/jtransform.py 
b/rpython/jit/codewriter/jtransform.py
--- a/rpython/jit/codewriter/jtransform.py
+++ b/rpython/jit/codewriter/jtransform.py
@@ -1355,6 +1355,13 @@
         return getattr(self, 'handle_jit_marker__%s' % key)(op, jitdriver)
 
     def rewrite_op_jit_conditional_call(self, op):
+        have_floats = False
+        for arg in op.args:
+            if getkind(arg.concretetype) == 'float':
+                have_floats = True
+                break
+        if len(op.args) > 4 + 2 or have_floats:
+            raise Exception("Conditional call does not support floats or more 
than 4 arguments")
         callop = SpaceOperation('direct_call', op.args[1:], op.result)
         calldescr = self.callcontrol.getcalldescr(callop)
         assert not 
calldescr.get_extra_info().check_forces_virtual_or_virtualizable()
diff --git a/rpython/rtyper/lltypesystem/lloperation.py 
b/rpython/rtyper/lltypesystem/lloperation.py
--- a/rpython/rtyper/lltypesystem/lloperation.py
+++ b/rpython/rtyper/lltypesystem/lloperation.py
@@ -350,7 +350,7 @@
     'lllong_lshift':         LLOp(canfold=True),  # args (r_longlonglong, int)
     'lllong_rshift':         LLOp(canfold=True),  # args (r_longlonglong, int)
     'lllong_xor':            LLOp(canfold=True),
-    
+
     'cast_primitive':       LLOp(canfold=True),
     'cast_bool_to_int':     LLOp(canfold=True),
     'cast_bool_to_uint':    LLOp(canfold=True),
@@ -457,6 +457,7 @@
     'jit_force_quasi_immutable': LLOp(canrun=True),
     'jit_record_known_class'  : LLOp(canrun=True),
     'jit_ffi_save_result':  LLOp(canrun=True),
+    'jit_conditional_call': LLOp(),
     'get_exception_addr':   LLOp(),
     'get_exc_value_addr':   LLOp(),
     'do_malloc_fixedsize_clear':LLOp(canmallocgc=True),
diff --git a/rpython/translator/c/funcgen.py b/rpython/translator/c/funcgen.py
--- a/rpython/translator/c/funcgen.py
+++ b/rpython/translator/c/funcgen.py
@@ -29,7 +29,7 @@
         __slots__ = """graph db gcpolicy
                        exception_policy
                        more_ll_values
-                       vars all_cached_consts 
+                       vars all_cached_consts
                        illtypes
                        functionname
                        blocknum
@@ -59,7 +59,7 @@
             if isinstance(T, Ptr) and T.TO.__class__ == ForwardReference:
                 continue
             db.gettype(T)  # force the type to be considered by the database
-       
+
         self.illtypes = None
 
     def collect_var_and_types(self):
@@ -90,7 +90,7 @@
             for cleanupop in exc_cleanup_ops:
                 mix.extend(cleanupop.args)
                 mix.append(cleanupop.result)
-             
+
         uniquemix = []
         seen = identity_dict()
         for v in mix:
@@ -454,6 +454,9 @@
         fnexpr = '((%s)%s)' % (cdecl(typename, ''), self.expr(fnaddr))
         return self.generic_call(FUNC, fnexpr, op.args[1:], op.result)
 
+    def OP_JIT_CONDITIONAL_CALL(self, op):
+        return ''
+
     # low-level operations
     def generic_get(self, op, sourceexpr):
         T = self.lltypemap(op.result)
@@ -580,7 +583,7 @@
     def OP_PTR_ISZERO(self, op):
         return '%s = (%s == NULL);' % (self.expr(op.result),
                                        self.expr(op.args[0]))
-    
+
     def OP_PTR_EQ(self, op):
         return '%s = (%s == %s);' % (self.expr(op.result),
                                      self.expr(op.args[0]),
@@ -627,7 +630,7 @@
         ARRAY = self.lltypemap(op.args[0]).TO
         if ARRAY._hints.get("render_as_void"):
             return '%s = (char *)%s + %s;' % (
-                self.expr(op.result), 
+                self.expr(op.result),
                 self.expr(op.args[0]),
                 self.expr(op.args[1]))
         else:
@@ -652,7 +655,7 @@
     def OP_CAST_INT_TO_PTR(self, op):
         TYPE = self.lltypemap(op.result)
         typename = self.db.gettype(TYPE)
-        return "%s = (%s)%s;" % (self.expr(op.result), cdecl(typename, ""), 
+        return "%s = (%s)%s;" % (self.expr(op.result), cdecl(typename, ""),
                                  self.expr(op.args[0]))
 
     def OP_SAME_AS(self, op):
@@ -711,7 +714,7 @@
             val = "(unsigned char)%s" % val
         elif ORIG is UniChar:
             val = "(unsigned long)%s" % val
-        typename = cdecl(self.db.gettype(TYPE), '')        
+        typename = cdecl(self.db.gettype(TYPE), '')
         return "%(result)s = (%(typename)s)(%(val)s);" % locals()
 
     OP_FORCE_CAST = OP_CAST_PRIMITIVE   # xxx the same logic works
@@ -823,7 +826,7 @@
                                           counter_label+1)
         counter_label = self.expr(op.args[1])
         return 'PYPY_INSTRUMENT_COUNT(%s);' % counter_label
-            
+
     def OP_IS_EARLY_CONSTANT(self, op):
         return '%s = 0; /* IS_EARLY_CONSTANT */' % (self.expr(op.result),)
 
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to