# See LICENSE for license details. #***************************************************************************** # recoding.S #----------------------------------------------------------------------------- # # Test corner cases of John Hauser's microarchitectural recoding scheme. # There are twice as many recoded values as IEEE-754 values; some of these # extras are redundant (e.g. Inf) and others are illegal (subnormals with # too many bits set). # #include "riscv_test.h" #include "test_macros.h" RVTEST_RV64UF RVTEST_CODE_BEGIN # Make sure infinities with different mantissas compare as equal. fld f0, minf, a0 fld f1, three, a0 fmul.d f1, f1, f0 TEST_CASE( 2, a0, 1, feq.d a0, f0, f1) TEST_CASE( 3, a0, 1, fle.d a0, f0, f1) TEST_CASE( 4, a0, 0, flt.d a0, f0, f1) # Likewise, but for zeroes. fcvt.d.w f0, x0 li a0, 1 fcvt.d.w f1, a0 fmul.d f1, f1, f0 TEST_CASE(5, a0, 1, feq.d a0, f0, f1) TEST_CASE(6, a0, 1, fle.d a0, f0, f1) TEST_CASE(7, a0, 0, flt.d a0, f0, f1) # When converting small doubles to single-precision subnormals, # ensure that the extra precision is discarded. flw f0, big, a0 fld f1, tiny, a0 fcvt.s.d f1, f1 fmul.s f0, f0, f1 fmv.x.s a0, f0 lw a1, small TEST_CASE(10, a0, 0, sub a0, a0, a1) # Make sure FSD+FLD correctly saves and restores a single-precision value. flw f0, three, a0 fadd.s f1, f0, f0 fadd.s f0, f0, f0 fsd f0, tiny, a0 fld f0, tiny, a0 TEST_CASE(20, a0, 1, feq.s a0, f0, f1) TEST_PASSFAIL RVTEST_CODE_END .data RVTEST_DATA_BEGIN minf: .double -Inf three: .double 3.0 big: .float 1221 small: .float 2.9133121e-37 tiny: .double 2.3860049081905093e-40 RVTEST_DATA_END