Author: David Malcolm <dmalc...@redhat.com> Branch: libgccjit-backend Changeset: r75082:cf9335135432 Date: 2014-12-23 09:49 -0500 http://bitbucket.org/pypy/pypy/changeset/cf9335135432/
Log: Get test_passing_guards to pass diff --git a/rpython/jit/backend/libgccjit/assembler.py b/rpython/jit/backend/libgccjit/assembler.py --- a/rpython/jit/backend/libgccjit/assembler.py +++ b/rpython/jit/backend/libgccjit/assembler.py @@ -3,7 +3,9 @@ from rpython.jit.backend.llsupport.asmmemmgr import MachineDataBlockWrapper from rpython.jit.backend.llsupport.regalloc import FrameManager from rpython.jit.backend.model import CompiledLoopToken -from rpython.jit.backend.libgccjit.rffi_bindings import make_eci, Library, make_param_array, make_field_array, Context, Type +from rpython.jit.backend.libgccjit.rffi_bindings import ( + make_eci, Library, make_param_array, make_field_array, Context, Type, + RValue) from rpython.jit.metainterp.history import BoxInt, ConstInt, BoxFloat, ConstFloat, BoxPtr, ConstPtr from rpython.jit.metainterp.resoperation import * from rpython.rtyper.annlowlevel import llhelper, cast_instance_to_gcref, cast_object_to_ptr @@ -572,13 +574,10 @@ # GUARD_* - def _impl_guard(self, resop, istrue): - print(resop) - print(resop.__dict__) + def _impl_guard(self, resop, istrue, boolval): + assert isinstance(boolval, RValue) b_true = self.fn.new_block("on_true_at_%s" % resop) b_false = self.fn.new_block("on_false_at_%s" % resop) - boolval = self.ctxt.new_cast(self.expr_to_rvalue(resop._arg0), - self.t_bool) self.b_current.end_with_conditional(boolval, b_true, b_false) @@ -616,11 +615,39 @@ # Further operations go into the guard success block in the original fn: self.b_current = b_guard_success + def _impl_bool_guard(self, resop, istrue): + boolval = self.ctxt.new_cast(self.expr_to_rvalue(resop._arg0), + self.t_bool) + self._impl_guard(resop, istrue, boolval) + def emit_guard_true(self, resop): - self._impl_guard(resop, r_int(1)) + self._impl_bool_guard(resop, r_int(1)) def emit_guard_false(self, resop): - self._impl_guard(resop, r_int(0)) + self._impl_bool_guard(resop, r_int(0)) + + def emit_guard_value(self, resop): + boolval = self.ctxt.new_comparison( + self.lib.GCC_JIT_COMPARISON_EQ, + self.expr_to_rvalue(resop._arg0), + self.expr_to_rvalue(resop._arg1)) + self._impl_guard(resop, r_int(1), boolval) + + def emit_guard_nonnull(self, resop): + ptr_rvalue = self.expr_to_rvalue(resop._arg0) + boolval = self.ctxt.new_comparison( + self.lib.GCC_JIT_COMPARISON_NE, + ptr_rvalue, + self.ctxt.null(ptr_rvalue.get_type())) + self._impl_guard(resop, r_int(1), boolval) + + def emit_guard_isnull(self, resop): + ptr_rvalue = self.expr_to_rvalue(resop._arg0) + boolval = self.ctxt.new_comparison( + self.lib.GCC_JIT_COMPARISON_EQ, + ptr_rvalue, + self.ctxt.null(ptr_rvalue.get_type())) + self._impl_guard(resop, r_int(1), boolval) def _impl_write_output_args(self, params, args): # Write outputs back: diff --git a/rpython/jit/backend/libgccjit/rffi_bindings.py b/rpython/jit/backend/libgccjit/rffi_bindings.py --- a/rpython/jit/backend/libgccjit/rffi_bindings.py +++ b/rpython/jit/backend/libgccjit/rffi_bindings.py @@ -241,6 +241,9 @@ (self.GCC_JIT_RVALUE_P, 'gcc_jit_lvalue_as_rvalue', [self.GCC_JIT_LVALUE_P]), + (self.GCC_JIT_TYPE_P, + 'gcc_jit_rvalue_get_type', [self.GCC_JIT_RVALUE_P]), + # Integer constants. (self.GCC_JIT_RVALUE_P, 'gcc_jit_context_new_rvalue_from_int', [self.GCC_JIT_CONTEXT_P, @@ -266,6 +269,10 @@ VOIDP]), (self.GCC_JIT_RVALUE_P, + 'gcc_jit_context_null', [self.GCC_JIT_CONTEXT_P, + self.GCC_JIT_TYPE_P]), + + (self.GCC_JIT_RVALUE_P, 'gcc_jit_context_new_unary_op', [self.GCC_JIT_CONTEXT_P, self.GCC_JIT_LOCATION_P, INT, # enum gcc_jit_unary_op op, @@ -610,6 +617,13 @@ type_.inner_type, llvalue)) + + def null(self, pointer_type): + return RValue(self.lib, + self, + self.lib.gcc_jit_context_null(self.inner_ctxt, + pointer_type.inner_type)) + def new_unary_op(self, op, type_, rvalue): return RValue(self.lib, self, @@ -779,6 +793,11 @@ Object.__init__(self, lib, ctxt, inner_rvalue) self.inner_rvalue = inner_rvalue + def get_type(self): + return Type(self.lib, + self, + self.lib.gcc_jit_rvalue_get_type(self.inner_rvalue)) + def dereference_field(self, field): return LValue(self.lib, self, _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit