| if 'CONFIG_TCG' not in config_all_accel |
| subdir_done() |
| endif |
| # There are namespace pollution issues on Windows, due to osdep.h |
| # bringing in Windows headers that define a FLOAT128 type. |
| if host_os == 'windows' |
| subdir_done() |
| endif |
| |
| # By default tests run with the usual 30s timeout; particularly |
| # slow tests can have that overridden here. The keys here are |
| # the testnames without their fp-test- prefix. |
| slow_fp_tests = { |
| 'rem': 60, |
| 'div': 60, |
| 'mul': 60, |
| 'mulAdd': 180, |
| } |
| |
| sfcflags = [ |
| # softfloat defines |
| '-DSOFTFLOAT_ROUND_ODD', |
| '-DINLINE_LEVEL=5', |
| '-DSOFTFLOAT_FAST_DIV32TO16', |
| '-DSOFTFLOAT_FAST_DIV64TO32', |
| '-DSOFTFLOAT_FAST_INT64', |
| ] |
| tfcflags = [ |
| # testfloat defines |
| '-DFLOAT16', |
| '-DFLOAT64', |
| '-DEXTFLOAT80', |
| '-DFLOAT128', |
| '-DFLOAT_ROUND_ODD', |
| '-DLONG_DOUBLE_IS_EXTFLOAT80', |
| ] |
| |
| libsoftfloat_proj = subproject('berkeley-softfloat-3', required: true, |
| default_options: 'defines=' + ','.join(sfcflags)) |
| libsoftfloat = libsoftfloat_proj.get_variable('libsoftfloat_dep') |
| |
| libtestfloat_proj = subproject('berkeley-testfloat-3', required: true, |
| default_options: 'defines=' + ','.join(tfcflags)) |
| libtestfloat = libtestfloat_proj.get_variable('libtestfloat_dep') |
| libslowfloat = libtestfloat_proj.get_variable('libslowfloat_dep') |
| |
| fpcflags = [ |
| # work around TARGET_* poisoning |
| '-DHW_POISON_H', |
| # define a target to match testfloat's implementation-defined choices, such as |
| # whether to raise the invalid flag when dealing with NaNs in muladd. |
| '-DTARGET_ARM', |
| # FIXME: uiZ may be used uninitialized in this function |
| '-Wno-uninitialized', |
| ] |
| |
| fptest = executable( |
| 'fp-test', |
| ['fp-test.c', '../../fpu/softfloat.c'], |
| dependencies: [qemuutil, libsoftfloat, libtestfloat, libslowfloat], |
| c_args: fpcflags, |
| ) |
| softfloat_conv_tests = { |
| 'float-to-float': 'f16_to_f32 f16_to_f64 f16_to_extF80 f16_to_f128 ' + |
| 'f32_to_f16 f32_to_f64 f32_to_extF80 ' + |
| 'f64_to_f16 f64_to_f32 ' + |
| 'extF80_to_f16 extF80_to_f32 ' + |
| 'extF80_to_f64 extF80_to_f128 ' + |
| 'f128_to_f16', |
| 'int-to-float': 'i32_to_f16 i64_to_f16 i32_to_f32 i64_to_f32 ' + |
| 'i32_to_f64 i64_to_f64 ' + |
| 'i32_to_extF80 i64_to_extF80 ' + |
| 'i32_to_f128 i64_to_f128', |
| 'uint-to-float': 'ui32_to_f16 ui64_to_f16 ui32_to_f32 ui64_to_f32 ' + |
| 'ui32_to_f64 ui64_to_f64 ui64_to_f128 ' + |
| 'ui32_to_extF80 ui64_to_extF80', |
| 'float-to-int': 'f16_to_i32 f16_to_i32_r_minMag ' + |
| 'f32_to_i32 f32_to_i32_r_minMag ' + |
| 'f64_to_i32 f64_to_i32_r_minMag ' + |
| 'extF80_to_i32 extF80_to_i32_r_minMag ' + |
| 'f128_to_i32 f128_to_i32_r_minMag ' + |
| 'f16_to_i64 f16_to_i64_r_minMag ' + |
| 'f32_to_i64 f32_to_i64_r_minMag ' + |
| 'f64_to_i64 f64_to_i64_r_minMag ' + |
| 'extF80_to_i64 extF80_to_i64_r_minMag ' + |
| 'f128_to_i64 f128_to_i64_r_minMag', |
| 'float-to-uint': 'f16_to_ui32 f16_to_ui32_r_minMag ' + |
| 'f32_to_ui32 f32_to_ui32_r_minMag ' + |
| 'f64_to_ui32 f64_to_ui32_r_minMag ' + |
| 'extF80_to_ui32 extF80_to_ui32_r_minMag ' + |
| 'f128_to_ui32 f128_to_ui32_r_minMag ' + |
| 'f16_to_ui64 f16_to_ui64_r_minMag ' + |
| 'f32_to_ui64 f32_to_ui64_r_minMag ' + |
| 'f64_to_ui64 f64_to_ui64_r_minMag ' + |
| 'extF80_to_ui64 extF80_to_ui64_r_minMag ' + |
| 'f128_to_ui64 f128_to_ui64_r_minMag', |
| 'round-to-integer': 'f16_roundToInt f32_roundToInt ' + |
| 'f64_roundToInt extF80_roundToInt f128_roundToInt' |
| } |
| softfloat_tests = { |
| 'eq_signaling' : 'compare', |
| 'le' : 'compare', |
| 'le_quiet' : 'compare', |
| 'lt_quiet' : 'compare', |
| 'add': 'ops', |
| 'sub': 'ops', |
| 'mul': 'ops', |
| 'div': 'ops', |
| 'rem': 'ops', |
| 'sqrt': 'ops' |
| } |
| # The full test suite can take a bit of time, default to a quick run |
| # "-l 2 -r all" can take more than a day for some operations and is best |
| # run manually |
| fptest_args = ['-q', '-s', '-l', '1'] |
| fptest_rounding_args = ['-r', 'all'] |
| |
| # Conversion Routines: |
| foreach k, v : softfloat_conv_tests |
| test('fp-test-' + k, fptest, |
| args: fptest_args + fptest_rounding_args + v.split(), |
| timeout: slow_fp_tests.get(k, 30), |
| suite: ['softfloat', 'softfloat-conv']) |
| endforeach |
| |
| foreach k, v : softfloat_tests |
| test('fp-test-' + k, fptest, |
| args: fptest_args + fptest_rounding_args + |
| ['f16_' + k, 'f32_' + k, 'f64_' + k, 'f128_' + k, 'extF80_' + k], |
| timeout: slow_fp_tests.get(k, 30), |
| suite: ['softfloat', 'softfloat-' + v]) |
| endforeach |
| |
| # FIXME: extF80_{mulAdd} (missing) |
| test('fp-test-mulAdd', fptest, |
| # no fptest_rounding_args |
| args: fptest_args + |
| ['f16_mulAdd', 'f32_mulAdd', 'f64_mulAdd', 'f128_mulAdd'], |
| timeout: slow_fp_tests.get('mulAdd', 30), |
| suite: ['softfloat-slow', 'softfloat-ops-slow', 'slow']) |
| |
| executable( |
| 'fp-bench', |
| ['fp-bench.c', '../../fpu/softfloat.c'], |
| dependencies: [qemuutil, libtestfloat, libsoftfloat], |
| c_args: fpcflags, |
| ) |
| |
| fptestlog2 = executable( |
| 'fp-test-log2', |
| ['fp-test-log2.c', '../../fpu/softfloat.c'], |
| dependencies: [qemuutil, libsoftfloat], |
| c_args: fpcflags, |
| ) |
| test('fp-test-log2', fptestlog2, |
| timeout: slow_fp_tests.get('log2', 30), |
| suite: ['softfloat', 'softfloat-ops']) |