[pypy-commit] pypy default: A workaround: without adding "goto_if_not_float_lt" & friends, the JIT
arigo
noreply at buildbot.pypy.org
Thu Oct 8 11:28:20 CEST 2015
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r80042:6b8493305a9b
Date: 2015-10-08 11:28 +0200
http://bitbucket.org/pypy/pypy/changeset/6b8493305a9b/
Log: A workaround: without adding "goto_if_not_float_lt" & friends, the
JIT code systematically makes the boolean result of "float_lt"
survive across the following "goto_if_not". This means the JIT
backends can't use their more efficient fast-path encodings for a
float comparison followed by a guard, because the integer that
stores the result of the comparison is also used in some failargs.
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
@@ -205,6 +205,8 @@
if v is op.result:
if op.opname not in ('int_lt', 'int_le', 'int_eq', 'int_ne',
'int_gt', 'int_ge',
+ 'float_lt', 'float_le', 'float_eq',
+ 'float_ne', 'float_gt', 'float_ge',
'int_is_zero', 'int_is_true',
'ptr_eq', 'ptr_ne',
'ptr_iszero', 'ptr_nonzero'):
diff --git a/rpython/jit/metainterp/blackhole.py b/rpython/jit/metainterp/blackhole.py
--- a/rpython/jit/metainterp/blackhole.py
+++ b/rpython/jit/metainterp/blackhole.py
@@ -672,6 +672,55 @@
b = longlong.getrealfloat(b)
return a >= b
+ @arguments("f", "f", "L", "pc", returns="L")
+ def bhimpl_goto_if_not_float_lt(a, b, target, pc):
+ a = longlong.getrealfloat(a)
+ b = longlong.getrealfloat(b)
+ if a < b:
+ return pc
+ else:
+ return target
+ @arguments("f", "f", "L", "pc", returns="L")
+ def bhimpl_goto_if_not_float_le(a, b, target, pc):
+ a = longlong.getrealfloat(a)
+ b = longlong.getrealfloat(b)
+ if a <= b:
+ return pc
+ else:
+ return target
+ @arguments("f", "f", "L", "pc", returns="L")
+ def bhimpl_goto_if_not_float_eq(a, b, target, pc):
+ a = longlong.getrealfloat(a)
+ b = longlong.getrealfloat(b)
+ if a == b:
+ return pc
+ else:
+ return target
+ @arguments("f", "f", "L", "pc", returns="L")
+ def bhimpl_goto_if_not_float_ne(a, b, target, pc):
+ a = longlong.getrealfloat(a)
+ b = longlong.getrealfloat(b)
+ if a != b:
+ return pc
+ else:
+ return target
+ @arguments("f", "f", "L", "pc", returns="L")
+ def bhimpl_goto_if_not_float_gt(a, b, target, pc):
+ a = longlong.getrealfloat(a)
+ b = longlong.getrealfloat(b)
+ if a > b:
+ return pc
+ else:
+ return target
+ @arguments("f", "f", "L", "pc", returns="L")
+ def bhimpl_goto_if_not_float_ge(a, b, target, pc):
+ a = longlong.getrealfloat(a)
+ b = longlong.getrealfloat(b)
+ if a >= b:
+ return pc
+ else:
+ return target
+
@arguments("f", returns="i")
def bhimpl_cast_float_to_int(a):
a = longlong.getrealfloat(a)
diff --git a/rpython/jit/metainterp/pyjitpl.py b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -358,7 +358,8 @@
self.opimpl_goto_if_not(condbox, target, orgpc)
for _opimpl in ['int_lt', 'int_le', 'int_eq', 'int_ne', 'int_gt', 'int_ge',
- 'ptr_eq', 'ptr_ne']:
+ 'ptr_eq', 'ptr_ne', 'float_lt', 'float_le', 'float_eq',
+ 'float_ne', 'float_gt', 'float_ge']:
exec py.code.Source('''
@arguments("box", "box", "label", "orgpc")
def opimpl_goto_if_not_%s(self, b1, b2, target, orgpc):
More information about the pypy-commit
mailing list