def test_execute_farith_unary32(factory, rn, ex):
    state = new_state(rf1=float2bits(7.2), rf2=float2bits(0.0),
                      rf3=float2bits(-1.5), rf4=float2bits(float('nan')),
                      rf5=0, rf6=-1, rf7=1)
    instr = factory(rd=0, rn=rn)
    name, executefn = decode(instr)
    executefn(state, Instruction(instr, None))
    ex.fp_check(state)
def test_execute_farith_fix(is16bit, rn, ex):
    state = new_state(rf1=float2bits(7.2), rf2=float2bits(0.0),
                      rf3=float2bits(-1.5), rf4=float2bits(float('nan')),
                      rf5=0, rf6=-1, rf7=1)
    instr = opcode_factory.fix16(rd=0, rn=rn) if is16bit else opcode_factory.fix32(rd=0, rn=rn)
    name, executefn = decode(instr)
    executefn(state, Instruction(instr, None))
    ex.check(state)
Beispiel #3
0
def test_registers_differ():
    expected = StateChecker(rf0=0, rf1=float2bits(5.2), rfLR=0, rfDEBUGSTATUS=1)
    got = new_state(rf0=1)
    with pytest.raises(ValueError):
        expected.check(got)
    got = new_state(rf1=float2bits(5.200000001), rfDEBUGSTATUS=1)
    expected.fp_check(got)
    got = new_state(rf1=float2bits(5.3), rfLR=0, rfDEBUGSTATUS=1)
    with pytest.raises(ValueError):
        expected.fp_check(got)
Beispiel #4
0
def test_round_trip():
    fuzzy_equals(bits2float(float2bits(0)), 0)
    fuzzy_equals(bits2float(float2bits(1.0)), 1.0)
    fuzzy_equals(bits2float(float2bits(-1.0)), -1.0)
    fuzzy_equals(bits2float(float2bits(-235.711)), -235.711)
    fuzzy_equals(bits2float(float2bits(235.711)), 235.711)
    assert math.isnan(bits2float(float2bits(float('nan'))))
    assert math.isinf(bits2float(float2bits(float('inf'))))
    assert math.isinf(bits2float(float2bits(float('-inf'))))
    assert bits2float(float2bits(float('inf'))) > 0
    assert bits2float(float2bits(float('-inf'))) < 0
Beispiel #5
0
 def farith(s, inst):
     """
     RD = RN <OP> RM
     BN = RD[31]
     if (RD[30:0] == 0) { BZ=1 } else { BZ=0 }
     if (UnbiasedExponent(RD) > 127) { BUV=1 } else { BV=0 }
     if (UbiasedExponent(RD) < -126) { BUS=1 } else { BUS=BUS }
     if (RM or RN == NAN) { BIS=1 } else { BIS=BIS }
     BVS = BVS | BV;
     """
     if is16bit:
         inst.bits &= 0xffff
     rd = bits2float(s.rf[inst.rd])
     rn = bits2float(s.rf[inst.rn])
     rm = bits2float(s.rf[inst.rm])
     # Binary operations.
     if name == 'add':
         result = rn + rm
     elif name == 'sub':
         result = rn - rm
     elif name == 'mul':
         result = rn * rm
     elif name == 'madd':
         result = rd + (rn * rm)
     elif name == 'msub':
         result = rd - (rn * rm)
     # Unary operations.
     elif name == 'float':
         result = float(s.rf[inst.rn])
     elif name == 'fix':
         if math.isnan(rn): # FXIME
             result = 0xffffffff
         else:
             result = int(rn)
     elif name == 'abs':
         result = abs(rn)
     # 'result' is always a Python float.
     # RD = RN <OP> RM
     s.rf[inst.rd] = trim_32(result if name == 'fix' else float2bits(result))
     # BN = RD[31]
     s.BN = True if result < 0.0 else False
     # if (RD[30:0] == 0) { BZ=1 } else { BZ=0 }
     s.BZ = True if abs(result) < 0.0001 else False
     # if (UnbiasedExponent(RD) > 127) { BUV=1 } else { BV=0 }
     s.BUV = True if get_exponent(s.rf[inst.rd]) > 127 else False
     # if (UbiasedExponent(RD) < -126) { BUS=1 } else { BUS=BUS }
     if get_exponent(s.rf[inst.rd]) > 127:
         s.BUS = True
     # if (RM or RN == NAN) { BIS=1 } else { BIS=BIS }
     if ((is_unary and math.isnan(rn)) or
             (not is_unary) and
             (math.isnan(rn) or math.isnan(rm))):
         s.BIS = True
     # BVS = BVS | BV;
     s.BVS = s.BVS or s.BV
     s.debug_flags()
     s.pc += 2 if is16bit else 4
Beispiel #6
0
def test_float2bits():
    assert is_nan(float2bits(float('nan')))
    assert is_inf(float2bits(float('inf')))
    assert is_inf(float2bits(float('-inf')))
    assert is_zero(float2bits(0.0))
    assert not is_zero(float2bits(0.1))
     (False, 2, StateChecker(rf0=0, BZ=1, BN=0, BIS=0)),
     (False, 3, StateChecker(rf0=0xffffffff, BZ=0, BN=1, BIS=0)),
     (False, 4, StateChecker(rf0=0xffffffff, BZ=0, BN=0, BIS=1)),
    ])
def test_execute_farith_fix(is16bit, rn, ex):
    state = new_state(rf1=float2bits(7.2), rf2=float2bits(0.0),
                      rf3=float2bits(-1.5), rf4=float2bits(float('nan')),
                      rf5=0, rf6=-1, rf7=1)
    instr = opcode_factory.fix16(rd=0, rn=rn) if is16bit else opcode_factory.fix32(rd=0, rn=rn)
    name, executefn = decode(instr)
    executefn(state, Instruction(instr, None))
    ex.check(state)


@pytest.mark.parametrize('factory,rn,ex',
    [(opcode_factory.float16, 4, StateChecker(rf0=float2bits(float('nan')), BZ=0, BN=0, BIS=1)),
     (opcode_factory.float16, 6, StateChecker(rf0=float2bits(-1.0), BZ=0, BN=1, BIS=1)),
     (opcode_factory.float16, 7, StateChecker(rf0=float2bits(1.0), BZ=0, BN=0, BIS=0)),
     (opcode_factory.fabs16,  1, StateChecker(rf0=float2bits(7.2), BZ=0, BN=0, BIS=0)),
     (opcode_factory.fabs16,  2, StateChecker(rf0=float2bits(0.0), BZ=1, BN=0, BIS=0)),
     (opcode_factory.fabs16,  3, StateChecker(rf0=float2bits(1.5), BZ=0, BN=0, BIS=0)),
     (opcode_factory.fabs16,  4, StateChecker(rf0=float2bits(float('nan')), BZ=0, BN=0, BIS=1)),
    ])
def test_execute_farith_unary16(factory, rn, ex):
    state = new_state(rf1=float2bits(7.2), rf2=float2bits(0.0),
                      rf3=float2bits(-1.5), rf4=float2bits(float('nan')),
                      rf5=0, rf6=-1, rf7=1)
    instr = factory(rd=0, rn=rn)
    name, executefn = decode(instr)
    executefn(state, Instruction(instr, None))
    ex.fp_check(state)
Beispiel #8
0
        pytest.mark.xfail(('trap.elf', StateChecker())),
       ])
def test_elf(elf, expected):
    """Test ELF files that deal in unsigned integers (rather than floats).
    """
    elf_filename = os.path.join(elf_dir, elf)
    epiphany = Epiphany()
    with open(elf_filename, 'rb') as elf:
        epiphany.init_state(elf, elf_filename, '', [], False, is_test=True)
        epiphany.max_insts = 10000
        epiphany.run()
        expected.check(epiphany.state)


@pytest.mark.parametrize("elf,expected",
                         [('fabs.elf', StateChecker(rf0=float2bits(5.0),
                                                    rf1=float2bits(0.0),
                                                    rf2=float2bits(-5.0),
                                                    rf3=float2bits(5.0),
                                                    rf4=float2bits(0.0),
                                                    rf5=float2bits(5.0),
                                                    )),
                          ('float.elf', StateChecker(rf1=float2bits(25.0))),
                          ('fadd.elf', StateChecker(rf0=float2bits(15.0),
                                                    rf1=float2bits(5.0),
                                                    rf2=float2bits(5.0),
                                                    rf3=float2bits(10.0),
                                                    rf4=float2bits(0.0))),
                          ('fsub.elf', StateChecker(rf0=float2bits(0.0),
                                                    rf1=float2bits(2.0),
                                                    rf2=float2bits(5.0),