master
build 157 lines 5.45 KB
Raw
1 if 'CONFIG_TCG' not in config_all_accel
2 subdir_done()
3 endif
4 # There are namespace pollution issues on Windows, due to osdep.h
5 # bringing in Windows headers that define a FLOAT128 type.
6 if host_os == 'windows'
7 subdir_done()
8 endif
9
10 # By default tests run with the usual 30s timeout; particularly
11 # slow tests can have that overridden here. The keys here are
12 # the testnames without their fp-test- prefix.
13 slow_fp_tests = {
14 'rem': 60,
15 'div': 60,
16 'mul': 60,
17 'mulAdd': 180,
18 }
19
20 sfcflags = [
21 # softfloat defines
22 '-DSOFTFLOAT_ROUND_ODD',
23 '-DINLINE_LEVEL=5',
24 '-DSOFTFLOAT_FAST_DIV32TO16',
25 '-DSOFTFLOAT_FAST_DIV64TO32',
26 '-DSOFTFLOAT_FAST_INT64',
27 ]
28 tfcflags = [
29 # testfloat defines
30 '-DFLOAT16',
31 '-DFLOAT64',
32 '-DEXTFLOAT80',
33 '-DFLOAT128',
34 '-DFLOAT_ROUND_ODD',
35 '-DLONG_DOUBLE_IS_EXTFLOAT80',
36 ]
37
38 libsoftfloat_proj = subproject('berkeley-softfloat-3', required: true,
39 default_options: 'defines=' + ','.join(sfcflags))
40 libsoftfloat = libsoftfloat_proj.get_variable('libsoftfloat_dep')
41
42 libtestfloat_proj = subproject('berkeley-testfloat-3', required: true,
43 default_options: 'defines=' + ','.join(tfcflags))
44 libtestfloat = libtestfloat_proj.get_variable('libtestfloat_dep')
45 libslowfloat = libtestfloat_proj.get_variable('libslowfloat_dep')
46
47 fpcflags = [
48 # work around TARGET_* poisoning
49 '-DHW_POISON_H',
50 # define a target to match testfloat's implementation-defined choices, such as
51 # whether to raise the invalid flag when dealing with NaNs in muladd.
52 '-DTARGET_ARM',
53 # FIXME: uiZ may be used uninitialized in this function
54 '-Wno-uninitialized',
55 ]
56
57 fptest = executable(
58 'fp-test',
59 ['fp-test.c', '../../fpu/softfloat.c'],
60 dependencies: [qemuutil, libsoftfloat, libtestfloat, libslowfloat],
61 c_args: fpcflags,
62 )
63 softfloat_conv_tests = {
64 'float-to-float': 'f16_to_f32 f16_to_f64 f16_to_extF80 f16_to_f128 ' +
65 'f32_to_f16 f32_to_f64 f32_to_extF80 ' +
66 'f64_to_f16 f64_to_f32 ' +
67 'extF80_to_f16 extF80_to_f32 ' +
68 'extF80_to_f64 extF80_to_f128 ' +
69 'f128_to_f16',
70 'int-to-float': 'i32_to_f16 i64_to_f16 i32_to_f32 i64_to_f32 ' +
71 'i32_to_f64 i64_to_f64 ' +
72 'i32_to_extF80 i64_to_extF80 ' +
73 'i32_to_f128 i64_to_f128',
74 'uint-to-float': 'ui32_to_f16 ui64_to_f16 ui32_to_f32 ui64_to_f32 ' +
75 'ui32_to_f64 ui64_to_f64 ui64_to_f128 ' +
76 'ui32_to_extF80 ui64_to_extF80',
77 'float-to-int': 'f16_to_i32 f16_to_i32_r_minMag ' +
78 'f32_to_i32 f32_to_i32_r_minMag ' +
79 'f64_to_i32 f64_to_i32_r_minMag ' +
80 'extF80_to_i32 extF80_to_i32_r_minMag ' +
81 'f128_to_i32 f128_to_i32_r_minMag ' +
82 'f16_to_i64 f16_to_i64_r_minMag ' +
83 'f32_to_i64 f32_to_i64_r_minMag ' +
84 'f64_to_i64 f64_to_i64_r_minMag ' +
85 'extF80_to_i64 extF80_to_i64_r_minMag ' +
86 'f128_to_i64 f128_to_i64_r_minMag',
87 'float-to-uint': 'f16_to_ui32 f16_to_ui32_r_minMag ' +
88 'f32_to_ui32 f32_to_ui32_r_minMag ' +
89 'f64_to_ui32 f64_to_ui32_r_minMag ' +
90 'extF80_to_ui32 extF80_to_ui32_r_minMag ' +
91 'f128_to_ui32 f128_to_ui32_r_minMag ' +
92 'f16_to_ui64 f16_to_ui64_r_minMag ' +
93 'f32_to_ui64 f32_to_ui64_r_minMag ' +
94 'f64_to_ui64 f64_to_ui64_r_minMag ' +
95 'extF80_to_ui64 extF80_to_ui64_r_minMag ' +
96 'f128_to_ui64 f128_to_ui64_r_minMag',
97 'round-to-integer': 'f16_roundToInt f32_roundToInt ' +
98 'f64_roundToInt extF80_roundToInt f128_roundToInt'
99 }
100 softfloat_tests = {
101 'eq_signaling' : 'compare',
102 'le' : 'compare',
103 'le_quiet' : 'compare',
104 'lt_quiet' : 'compare',
105 'add': 'ops',
106 'sub': 'ops',
107 'mul': 'ops',
108 'div': 'ops',
109 'rem': 'ops',
110 'sqrt': 'ops'
111 }
112 # The full test suite can take a bit of time, default to a quick run
113 # "-l 2 -r all" can take more than a day for some operations and is best
114 # run manually
115 fptest_args = ['-q', '-s', '-l', '1']
116 fptest_rounding_args = ['-r', 'all']
117
118 # Conversion Routines:
119 foreach k, v : softfloat_conv_tests
120 test('fp-test-' + k, fptest,
121 args: fptest_args + fptest_rounding_args + v.split(),
122 timeout: slow_fp_tests.get(k, 30),
123 suite: ['softfloat', 'softfloat-conv'])
124 endforeach
125
126 foreach k, v : softfloat_tests
127 test('fp-test-' + k, fptest,
128 args: fptest_args + fptest_rounding_args +
129 ['f16_' + k, 'f32_' + k, 'f64_' + k, 'f128_' + k, 'extF80_' + k],
130 timeout: slow_fp_tests.get(k, 30),
131 suite: ['softfloat', 'softfloat-' + v])
132 endforeach
133
134 # FIXME: extF80_{mulAdd} (missing)
135 test('fp-test-mulAdd', fptest,
136 # no fptest_rounding_args
137 args: fptest_args +
138 ['f16_mulAdd', 'f32_mulAdd', 'f64_mulAdd', 'f128_mulAdd'],
139 timeout: slow_fp_tests.get('mulAdd', 30),
140 suite: ['softfloat-slow', 'softfloat-ops-slow', 'slow'])
141
142 executable(
143 'fp-bench',
144 ['fp-bench.c', '../../fpu/softfloat.c'],
145 dependencies: [qemuutil, libtestfloat, libsoftfloat],
146 c_args: fpcflags,
147 )
148
149 fptestlog2 = executable(
150 'fp-test-log2',
151 ['fp-test-log2.c', '../../fpu/softfloat.c'],
152 dependencies: [qemuutil, libsoftfloat],
153 c_args: fpcflags,
154 )
155 test('fp-test-log2', fptestlog2,
156 timeout: slow_fp_tests.get('log2', 30),
157 suite: ['softfloat', 'softfloat-ops'])