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)
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)
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
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
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)
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),