Exemplo n.º 1
0
 def test_is_true(self):
     for opname, T in [('llong_is_true', lltype.SignedLongLong),
                       ('ullong_is_true', lltype.UnsignedLongLong)]:
         v = varoftype(T)
         v_result = varoftype(lltype.Bool)
         op = SpaceOperation(opname, [v], v_result)
         tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
         oplist = tr.rewrite_operation(op)
         assert len(oplist) == 2
         assert oplist[0].opname == 'residual_call_irf_f'
         assert oplist[0].args[0].value == opname.split(
             '_')[0] + '_from_int'
         assert list(oplist[0].args[1]) == [const(0)]
         assert list(oplist[0].args[2]) == []
         assert list(oplist[0].args[3]) == []
         assert oplist[0].args[4] == 'calldescr-84'
         v_x = oplist[0].result
         assert isinstance(v_x, Variable)
         assert v_x.concretetype is T
         assert oplist[1].opname == 'residual_call_irf_i'
         assert oplist[1].args[0].value == 'llong_ne'
         assert list(oplist[1].args[1]) == []
         assert list(oplist[1].args[2]) == []
         assert list(oplist[1].args[3]) == [v, v_x]
         assert oplist[1].args[4] == 'calldescr-76'
         assert oplist[1].result == v_result
Exemplo n.º 2
0
    def do_check(self, opname, oopspecindex, ARGS, RESULT):
        vlist = [varoftype(ARG) for ARG in ARGS]
        v_result = varoftype(RESULT)
        op = SpaceOperation(opname, vlist, v_result)
        tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
        op1 = tr.rewrite_operation(op)
        if isinstance(op1, list):
            [op1] = op1
        #
        def is_llf(TYPE):
            return (TYPE == lltype.SignedLongLong
                    or TYPE == lltype.UnsignedLongLong or TYPE == lltype.Float)

        if is_llf(RESULT):
            assert op1.opname == 'residual_call_irf_f'
        else:
            assert op1.opname == 'residual_call_irf_i'
        gotindex = getattr(EffectInfo,
                           'OS_' + op1.args[0].value.upper().lstrip('U'))
        assert gotindex == oopspecindex
        assert list(
            op1.args[1]) == [v for v in vlist if not is_llf(v.concretetype)]
        assert list(op1.args[2]) == []
        assert list(
            op1.args[3]) == [v for v in vlist if is_llf(v.concretetype)]
        assert op1.args[4] == 'calldescr-%d' % oopspecindex
        assert op1.result == v_result
Exemplo n.º 3
0
def builtin_test(oopspec_name, args, RESTYPE, expected):
    v_result = varoftype(RESTYPE)
    tr = Transformer(FakeCPU(), FakeCallControl())
    tr.immutable_arrays = {}
    tr.vable_array_vars = {}
    if '/' in oopspec_name:
        oopspec_name, property = oopspec_name.split('/')
        def force_flags(op):
            if property == 'NONNEG':   return True
            if property == 'NEG':      return False
            raise ValueError(property)
        tr._get_list_nonneg_canraise_flags = force_flags
    op = SpaceOperation('direct_call',
                        [Constant("myfunc", lltype.Void)] + args,
                        v_result)
    try:
        oplist = tr._handle_list_call(op, oopspec_name, args)
    except NotSupported:
        assert expected is NotSupported
    else:
        assert expected is not NotSupported
        assert oplist is not None
        flattener = GraphFlattener(None, fake_regallocs())
        if not isinstance(oplist, list):
            oplist = [oplist]
        for op1 in oplist:
            flattener.serialize_op(op1)
        assert_format(flattener.ssarepr, expected)
Exemplo n.º 4
0
 def test_constants(self):
     for TYPE in [lltype.SignedLongLong, lltype.UnsignedLongLong]:
         v_x = varoftype(TYPE)
         vlist = [v_x, const(rffi.cast(TYPE, 7))]
         v_result = varoftype(TYPE)
         op = SpaceOperation('llong_add', vlist, v_result)
         tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
         op1 = tr.rewrite_operation(op)
         #
         assert op1.opname == 'residual_call_irf_f'
         assert list(op1.args[1]) == []
         assert list(op1.args[2]) == []
         assert list(op1.args[3]) == vlist
         assert op1.result == v_result
Exemplo n.º 5
0
 def test_casts(self):
     self.do_check('cast_int_to_longlong', EffectInfo.OS_LLONG_FROM_INT,
                   [lltype.Signed], lltype.SignedLongLong)
     self.do_check('cast_uint_to_longlong', EffectInfo.OS_LLONG_FROM_UINT,
                   [lltype.Unsigned], lltype.SignedLongLong)
     self.do_check('truncate_longlong_to_int', EffectInfo.OS_LLONG_TO_INT,
                   [lltype.SignedLongLong], lltype.Signed)
     self.do_check('cast_float_to_longlong', EffectInfo.OS_LLONG_FROM_FLOAT,
                   [lltype.Float], lltype.SignedLongLong)
     self.do_check('cast_float_to_ulonglong',
                   EffectInfo.OS_LLONG_FROM_FLOAT, [lltype.Float],
                   lltype.UnsignedLongLong)
     self.do_check('cast_longlong_to_float', EffectInfo.OS_LLONG_TO_FLOAT,
                   [lltype.SignedLongLong], lltype.Float)
     self.do_check('cast_ulonglong_to_float',
                   EffectInfo.OS_LLONG_U_TO_FLOAT,
                   [lltype.UnsignedLongLong], lltype.Float)
     for T1 in [lltype.SignedLongLong, lltype.UnsignedLongLong]:
         for T2 in [lltype.Signed, lltype.Unsigned]:
             self.do_check('cast_primitive', EffectInfo.OS_LLONG_TO_INT,
                           [T1], T2)
             self.do_check('force_cast', EffectInfo.OS_LLONG_TO_INT, [T1],
                           T2)
             if T2 == lltype.Signed:
                 expected = EffectInfo.OS_LLONG_FROM_INT
             else:
                 expected = EffectInfo.OS_LLONG_FROM_UINT
             self.do_check('cast_primitive', expected, [T2], T1)
             self.do_check('force_cast', expected, [T2], T1)
     #
     for T1 in [lltype.SignedLongLong, lltype.UnsignedLongLong]:
         for T2 in [lltype.SignedLongLong, lltype.UnsignedLongLong]:
             vlist = [varoftype(T1)]
             v_result = varoftype(T2)
             op = SpaceOperation('force_cast', vlist, v_result)
             tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
             op1 = tr.rewrite_operation(op)
             assert op1 is None
Exemplo n.º 6
0
 def test_llong_neg(self):
     T = lltype.SignedLongLong
     v = varoftype(T)
     v_result = varoftype(T)
     op = SpaceOperation('llong_neg', [v], v_result)
     tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
     oplist = tr.rewrite_operation(op)
     assert len(oplist) == 2
     assert oplist[0].opname == 'residual_call_irf_f'
     assert oplist[0].args[0].value == 'llong_from_int'
     assert list(oplist[0].args[1]) == [const(0)]
     assert list(oplist[0].args[2]) == []
     assert list(oplist[0].args[3]) == []
     assert oplist[0].args[4] == 'calldescr-84'
     v_x = oplist[0].result
     assert isinstance(v_x, Variable)
     assert oplist[1].opname == 'residual_call_irf_f'
     assert oplist[1].args[0].value == 'llong_sub'
     assert list(oplist[1].args[1]) == []
     assert list(oplist[1].args[2]) == []
     assert list(oplist[1].args[3]) == [v_x, v]
     assert oplist[1].args[4] == 'calldescr-71'
     assert oplist[1].result == v_result