⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vector_support.h

📁 eCos/RedBoot for勤研ARM AnywhereII(4510) 含全部源代码
💻 H
📖 第 1 页 / 共 2 页
字号:
// double = fn(double, double *)
//
// result type being non-double is left as a future enhancement
//
// This returns true if the tests all succeeded and false if any failed
//
static cyg_bool
doTestVec( CYG_ADDRESS func_ptr,
           Cyg_libm_test_arg_type arg1_type,
           Cyg_libm_test_arg_type arg2_type,
           Cyg_libm_test_arg_type result_type,
           const Cyg_libm_test_double_vec_t *vectors,
           cyg_ucount32 num_vectors )
{
    cyg_ucount32 problems=0;
    cyg_ucount32 i;
    Cyg_libm_ieee_double_shape_type arg1, arg2, result_wanted, ret;
    cyg_ucount32 alive_count = num_vectors / 10;

    if ((arg1_type != CYG_LIBM_TEST_VEC_DOUBLE) ||
        (result_type != CYG_LIBM_TEST_VEC_DOUBLE) ) {
        CYG_TEST_FAIL("Test vector arguments are not correct type!");
        return false;
    } // if

    switch (arg2_type) {
    case CYG_LIBM_TEST_VEC_DOUBLE:

        {
            ddfn fn = (ddfn) func_ptr;

            for (i=0;
                 (i < num_vectors) && (problems < PROBLEM_THRESHOLD);
                 i++) {

                if (0 == i % alive_count)
                    CYG_TEST_STILL_ALIVE(i, "Still crunching, please wait...");

                arg1.parts.msw = vectors[i].arg1_msw;
                arg1.parts.lsw = vectors[i].arg1_lsw;

                arg2.parts.msw = vectors[i].arg2_msw;
                arg2.parts.lsw = vectors[i].arg2_lsw;

                result_wanted.parts.msw = vectors[i].result_msw;
                result_wanted.parts.lsw = vectors[i].result_lsw;

                ret.value = (*fn)( arg1.value, arg2.value );

                if ((vectors[i].errno_val) != 0) {

#ifndef CYGSEM_LIBM_COMPAT_IEEE_ONLY
                    // In IEEE-mode we can't check the answer if this
                    // is an error case

                    if ((cyg_libm_get_compat_mode() !=
                        CYGNUM_LIBM_COMPAT_IEEE) &&
                        (errno != vectors[i].errno_val)) {

                        ++problems;
                        diag_printf("Vector #%d\n", i+1);
                        CYG_TEST_FAIL( "error not set correctly");

                    } // if
#endif

                    continue; // no point checking value in an error case
                } // if
                if (checkErrorAcceptable( ret, result_wanted,
                                          vectors[i].tolerance) ) {
                    ++problems;
                    diag_printf("Vector #%d\n", i+1);
                    CYG_TEST_FAIL( "Result out of tolerance");
                } // if
            } // for
            
        } // compound
            
        break;

    case CYG_LIBM_TEST_VEC_INT:

        {
            difn fn = (difn) func_ptr;
        
            for (i=0;
                 (i < num_vectors) && (problems < PROBLEM_THRESHOLD);
                 i++) {

                if (0 == i % alive_count)
                    CYG_TEST_STILL_ALIVE(i, "Still crunching, please wait...");

                arg1.parts.msw = vectors[i].arg1_msw;
                arg1.parts.lsw = vectors[i].arg1_lsw;

                result_wanted.parts.msw = vectors[i].result_msw;
                result_wanted.parts.lsw = vectors[i].result_lsw;

                ret.value = (*fn)( arg1.value, vectors[i].arg2_lsw );
                if (checkErrorAcceptable( ret, result_wanted,
                                          vectors[i].tolerance) ) {
                    ++problems;
                    diag_printf("Vector #%d\n", i+1);
                    CYG_TEST_FAIL( "Result out of tolerance");
                } // if
            } // for
            
        } // compound
            
        break;

    case CYG_LIBM_TEST_VEC_INT_P:

        {
            dipfn fn = (dipfn) func_ptr;
            int my_int;
            Cyg_libm_ieee_double_shape_type my_doub1, my_doub2;
        
            for (i=0;
                 (i < num_vectors) && (problems < PROBLEM_THRESHOLD);
                 i++) {

                if (0 == i % alive_count)
                    CYG_TEST_STILL_ALIVE(i, "Still crunching, please wait...");

                arg1.parts.msw = vectors[i].arg1_msw;
                arg1.parts.lsw = vectors[i].arg1_lsw;


                result_wanted.parts.msw = vectors[i].result_msw;
                result_wanted.parts.lsw = vectors[i].result_lsw;

                ret.value = (*fn)( arg1.value, &my_int );
                if (checkErrorAcceptable( ret, result_wanted,
                                          vectors[i].tolerance) ) {
                    ++problems;
                    diag_printf("Vector #%d\n", i+1);
                    CYG_TEST_FAIL( "Result out of tolerance");
                } // if

                my_doub1.value = (double) my_int;
                my_doub2.value = (double) (signed)vectors[i].arg2_lsw;
                
                if (checkErrorAcceptable( my_doub1, my_doub2,
                                          vectors[i].tolerance) ) {
                    ++problems;
                    diag_printf("Vector #%d\n", i+1);
                    CYG_TEST_FAIL( "Integer result out of tolerance");
                } // if

                
            } // for
            
        } // compound
            
        break;

    case CYG_LIBM_TEST_VEC_DOUBLE_P:

        {
            ddpfn fn = (ddpfn) func_ptr;
            Cyg_libm_ieee_double_shape_type my_doub1;
        
            for (i=0;
                 (i < num_vectors) && (problems < PROBLEM_THRESHOLD);
                 i++) {

                if (0 == i % alive_count)
                    CYG_TEST_STILL_ALIVE(i, "Still crunching, please wait...");

                arg1.parts.msw = vectors[i].arg1_msw;
                arg1.parts.lsw = vectors[i].arg1_lsw;

                arg2.parts.msw = vectors[i].arg2_msw;
                arg2.parts.lsw = vectors[i].arg2_lsw;


                result_wanted.parts.msw = vectors[i].result_msw;
                result_wanted.parts.lsw = vectors[i].result_lsw;

                ret.value = (*fn)( arg1.value, &my_doub1.value );
                if (checkErrorAcceptable( ret, result_wanted,
                                          vectors[i].tolerance) ) {
                    ++problems;
                    diag_printf("Vector #%d\n", i+1);
                    CYG_TEST_FAIL( "Result out of tolerance");
                } // if

                if (checkErrorAcceptable( my_doub1, arg2,
                                          vectors[i].tolerance) ) {
                    ++problems;
                    diag_printf("Vector #%d\n", i+1);
                    CYG_TEST_FAIL( "Returned double result out of "
                                   "tolerance");
                } // if

                
            } // for
            
        } // compound
            
        break;

    case CYG_LIBM_TEST_VEC_NONE:

        {
            dfn fn = (dfn) func_ptr;
        
            for (i=0;
                 (i < num_vectors) && (problems < PROBLEM_THRESHOLD);
                 i++) {

                if (0 == i % alive_count)
                    CYG_TEST_STILL_ALIVE(i, "Still crunching, please wait...");

                arg1.parts.msw = vectors[i].arg1_msw;
                arg1.parts.lsw = vectors[i].arg1_lsw;

                result_wanted.parts.msw = vectors[i].result_msw;
                result_wanted.parts.lsw = vectors[i].result_lsw;

                ret.value = (*fn)( arg1.value );
                if (checkErrorAcceptable( ret, result_wanted,
                                          vectors[i].tolerance) ) {
                    ++problems;
                    diag_printf("Vector #%d\n", i+1);
                    CYG_TEST_FAIL( "Result out of tolerance");
                } // if
            } // for
            
        } // compound
            
        break;

    default:
        CYG_TEST_FAIL("Second argument of unknown type!");
        return false;
    } // switch

    if (problems != 0)
        return false;
    else
        return true;

} // doTestVec()

#endif // CYGONCE_LIBM_VECTOR_SUPPORT_H multiple inclusion protection

// EOF vector_support.h

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -