Add wasm tacle-bench targets

This commit is contained in:
2026-06-12 20:06:22 +02:00
parent 30daa8a00c
commit 08c2e9c13d
1122 changed files with 520422 additions and 0 deletions

View File

@ -0,0 +1,29 @@
# ~~~
# SPDX-License-Identifier: MIT
# SPDX-FileCopyrightText: 2026, Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU)
# ~~~
cmake_minimum_required(VERSION 3.20)
project(susan)
set(TACLEBENCH_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../..")
set(REPOSITORY_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}/../../../..")
set(APP_TARGET_NAME "${CMAKE_PROJECT_NAME}")
if(DEFINED TACLEBENCH_VARIANT AND "${TACLEBENCH_VARIANT}" STREQUAL "inline")
set(APP_SOURCE_FILE_PATH
"generated/modified_sources/inline/susan.c")
else()
set(APP_SOURCE_FILE_PATH
"generated/modified_sources/default/susan.c"
"generated/modified_sources/default/input.c"
"generated/modified_sources/default/wccfile.c"
"generated/modified_sources/default/wcclibm.c"
"generated/modified_sources/default/wccmalloc.c")
endif()
include(${REPOSITORY_ROOT_PATH}/cmake/taclebench_wasm.cmake)

View File

@ -0,0 +1,11 @@
2017-07-04
- Removed self-assignment to avoid clangs self-assign warning.
- Introduced susan_initm susan_main and susan_return.
- Fix possible division by zero to please tacle-lint.
- Removed unused variables.
- Added prefix 'susan_'.
- Removed exit_on_error function.
- Removed PowerPC specific typedef.
2017-08-18:
- Give explicit name to former anonymous struct to silence g++ warnings.

View File

@ -0,0 +1,14 @@
This code is issued for research purposes only and remains the
property of the UK Secretary of State for Defence. This code must
not be passed on without this header information being kept
intact. This code must not be sold.
A UK patent has been granted: "Method for digitally processing
images to determine the position of edges and/or corners therein for
guidance of unmanned vehicle", UK Patent 2272285. Proprietor:
Secretary of State for Defence, UK. 15 January 1997
Source Code obtained from:
http://www.fmrib.ox.ac.uk/~steve/susan/index.html

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,610 @@
char susan_input[7292] = {
80, 53, 10, 35, 32, 67, 82, 69, 65, 84, 79, 82,
58, 32, 88, 86, 32, 86, 101, 114, 115, 105, 111, 110,
32, 51, 46, 49, 48, 97, 32, 32, 82, 101, 118, 58,
32, 49, 50, 47, 50, 57, 47, 57, 52, 32, 40, 80,
78, 71, 32, 112, 97, 116, 99, 104, 32, 49, 46, 50,
41, 10, 55, 54, 32, 57, 53, 10, 50, 53, 53, 10,
35, 36, 36, 36, 36, 38, 38, 36, 37, 37, 37, 38,
38, 36, 34, 38, 40, 41, 42, 40, 38, 36, 36, 35,
36, 35, 32, 35, 38, 42, 42, 38, 36, 36, 36, 37,
36, 35, 33, 33, 33, 32, 31, 33, 36, 39, 40, 36,
36, 34, 34, 36, 38, 39, 37, 36, 36, 35, 36, 39,
39, 37, 37, 39, 37, 38, 39, 40, 38, 37, 37, 33,
33, 32, 33, 34, 35, 35, 36, 36, 36, 37, 38, 37,
38, 38, 39, 41, 41, 40, 40, 43, 42, 41, 40, 39,
38, 35, 33, 35, 35, 37, 39, 38, 37, 36, 38, 36,
36, 34, 34, 38, 39, 39, 37, 36, 36, 34, 33, 34,
33, 35, 33, 36, 35, 35, 36, 36, 37, 33, 32, 36,
38, 38, 38, 39, 39, 38, 39, 37, 35, 36, 34, 35,
36, 37, 39, 38, 37, 34, 31, 34, 35, 35, 35, 35,
36, 38, 39, 39, 37, 38, 38, 40, 39, 40, 41, 43,
44, 42, 40, 39, 38, 42, 42, 39, 39, 36, 33, 33,
34, 36, 36, 35, 33, 33, 35, 37, 36, 34, 34, 31,
30, 32, 36, 42, 43, 43, 40, 36, 36, 36, 35, 34,
35, 33, 33, 30, 32, 34, 35, 35, 35, 36, 35, 37,
34, 34, 35, 36, 37, 37, 35, 36, 37, 39, 39, 38,
35, 35, 35, 35, 35, 36, 38, 37, 38, 38, 36, 35,
35, 36, 35, 35, 35, 35, 34, 34, 36, 36, 38, 40,
38, 37, 36, 34, 34, 35, 35, 36, 37, 37, 38, 38,
39, 39, 36, 35, 36, 35, 37, 36, 38, 39, 37, 38,
34, 33, 32, 33, 32, 28, 34, 40, 45, 44, 40, 38,
34, 30, 30, 33, 40, 45, 43, 41, 37, 37, 37, 36,
33, 31, 32, 31, 35, 35, 35, 35, 35, 38, 39, 39,
40, 39, 37, 37, 37, 35, 35, 37, 37, 36, 37, 37,
37, 38, 37, 38, 37, 37, 35, 35, 34, 35, 35, 35,
36, 39, 45, 43, 38, 39, 38, 36, 36, 36, 35, 37,
39, 38, 37, 37, 37, 39, 38, 37, 37, 35, 34, 34,
37, 39, 36, 37, 38, 39, 40, 41, 39, 36, 38, 39,
39, 39, 36, 33, 32, 30, 30, 31, 35, 35, 35, 35,
35, 39, 40, 38, 37, 40, 39, 38, 39, 39, 39, 38,
39, 39, 40, 40, 39, 41, 39, 41, 39, 38, 39, 38,
38, 36, 35, 36, 35, 37, 38, 38, 38, 40, 38, 39,
39, 36, 36, 33, 34, 36, 35, 37, 38, 39, 39, 38,
36, 32, 32, 35, 38, 38, 39, 38, 35, 35, 34, 37,
39, 38, 36, 35, 35, 33, 31, 30, 32, 36, 37, 38,
35, 35, 35, 35, 35, 39, 41, 42, 38, 33, 31, 33,
37, 36, 37, 38, 37, 37, 38, 39, 38, 38, 38, 38,
37, 38, 38, 39, 41, 41, 37, 39, 40, 42, 44, 43,
39, 42, 48, 45, 41, 39, 38, 38, 38, 38, 36, 37,
38, 39, 39, 39, 43, 41, 38, 37, 37, 38, 36, 34,
34, 34, 38, 41, 41, 38, 35, 35, 34, 35, 32, 30,
31, 33, 34, 35, 35, 35, 35, 35, 35, 39, 36, 35,
38, 41, 38, 32, 34, 38, 34, 38, 40, 39, 39, 36,
36, 39, 38, 39, 37, 38, 38, 36, 36, 35, 37, 38,
39, 38, 36, 38, 37, 35, 31, 35, 37, 40, 39, 35,
35, 36, 34, 36, 36, 38, 37, 38, 37, 37, 36, 37,
38, 37, 36, 35, 34, 34, 34, 37, 36, 37, 36, 34,
36, 36, 34, 31, 30, 33, 32, 33, 35, 35, 35, 35,
34, 27, 33, 39, 42, 41, 42, 44, 45, 42, 39, 41,
41, 42, 43, 42, 41, 40, 38, 37, 35, 37, 36, 36,
36, 37, 36, 36, 37, 37, 39, 43, 43, 43, 42, 39,
39, 39, 39, 40, 39, 38, 35, 34, 36, 37, 36, 37,
38, 38, 37, 36, 35, 35, 33, 35, 38, 38, 39, 41,
39, 38, 37, 38, 38, 36, 37, 36, 37, 37, 36, 36,
35, 35, 35, 35, 36, 42, 40, 41, 43, 42, 39, 37,
37, 37, 37, 39, 39, 38, 37, 35, 37, 36, 35, 36,
36, 39, 39, 36, 36, 34, 37, 40, 40, 40, 39, 41,
40, 39, 39, 39, 40, 38, 36, 34, 35, 37, 34, 36,
35, 35, 34, 33, 36, 36, 38, 39, 38, 37, 34, 34,
33, 34, 35, 36, 36, 35, 36, 35, 38, 39, 39, 40,
38, 37, 36, 36, 35, 35, 35, 35, 36, 36, 42, 45,
44, 43, 40, 38, 37, 36, 37, 37, 38, 38, 38, 38,
36, 35, 35, 34, 34, 36, 38, 36, 35, 38, 37, 37,
38, 38, 37, 38, 36, 33, 35, 37, 37, 38, 38, 41,
41, 41, 38, 35, 33, 30, 29, 32, 37, 39, 39, 38,
39, 38, 35, 34, 35, 35, 35, 35, 34, 35, 36, 36,
37, 38, 38, 38, 36, 35, 33, 34, 35, 35, 35, 35,
36, 36, 32, 33, 36, 38, 40, 42, 42, 39, 40, 41,
43, 42, 36, 33, 32, 33, 32, 35, 37, 41, 41, 39,
40, 37, 36, 38, 39, 41, 40, 40, 41, 39, 37, 37,
36, 37, 37, 36, 35, 37, 37, 39, 41, 41, 43, 41,
40, 40, 37, 37, 38, 38, 38, 38, 38, 36, 38, 37,
36, 39, 41, 41, 42, 41, 39, 38, 38, 36, 37, 37,
35, 35, 35, 36, 36, 33, 35, 37, 34, 35, 35, 35,
39, 38, 39, 41, 43, 43, 43, 42, 39, 38, 39, 37,
37, 38, 37, 36, 38, 38, 40, 38, 39, 39, 36, 35,
34, 33, 34, 36, 37, 38, 37, 37, 37, 36, 34, 34,
33, 34, 35, 38, 41, 38, 36, 37, 37, 37, 37, 39,
41, 40, 41, 42, 41, 40, 41, 41, 39, 40, 40, 39,
37, 37, 36, 38, 35, 35, 35, 36, 37, 45, 42, 40,
44, 45, 42, 43, 42, 42, 45, 47, 49, 51, 50, 51,
50, 49, 45, 45, 45, 43, 42, 42, 43, 41, 39, 40,
40, 40, 39, 38, 40, 40, 39, 39, 39, 38, 35, 33,
37, 41, 42, 39, 37, 37, 37, 38, 38, 36, 37, 35,
33, 32, 33, 34, 35, 35, 38, 39, 37, 38, 36, 35,
37, 38, 39, 42, 41, 38, 36, 34, 35, 35, 35, 35,
36, 39, 38, 36, 37, 37, 37, 36, 40, 42, 43, 47,
49, 48, 47, 44, 43, 47, 52, 55, 52, 47, 44, 42,
42, 42, 40, 40, 39, 38, 37, 37, 39, 38, 38, 38,
36, 33, 31, 34, 35, 38, 39, 38, 37, 38, 38, 37,
38, 37, 42, 46, 45, 42, 39, 39, 38, 34, 36, 39,
39, 37, 35, 36, 34, 37, 37, 36, 36, 39, 41, 42,
35, 35, 35, 35, 36, 40, 40, 38, 39, 39, 36, 36,
38, 39, 42, 46, 49, 50, 52, 52, 51, 51, 52, 54,
51, 50, 51, 52, 51, 47, 47, 46, 47, 45, 43, 43,
43, 43, 43, 42, 41, 41, 40, 40, 42, 46, 44, 41,
37, 36, 37, 39, 39, 38, 38, 39, 38, 38, 39, 37,
35, 35, 38, 38, 38, 36, 35, 35, 37, 35, 36, 38,
36, 38, 38, 39, 35, 35, 35, 36, 36, 39, 39, 40,
40, 39, 37, 38, 41, 39, 43, 46, 47, 49, 49, 49,
48, 48, 51, 52, 52, 53, 53, 52, 51, 52, 50, 48,
49, 48, 46, 47, 47, 44, 42, 43, 44, 43, 45, 48,
46, 45, 44, 42, 43, 46, 45, 44, 42, 41, 38, 39,
38, 37, 36, 35, 37, 35, 37, 36, 33, 31, 32, 38,
43, 42, 41, 39, 37, 38, 37, 37, 35, 35, 36, 36,
36, 38, 38, 36, 37, 39, 38, 39, 38, 39, 42, 47,
49, 46, 46, 47, 47, 46, 47, 49, 48, 48, 49, 51,
50, 49, 50, 51, 48, 46, 46, 47, 48, 47, 45, 43,
42, 44, 45, 47, 49, 51, 51, 51, 49, 47, 48, 47,
49, 46, 44, 40, 39, 40, 40, 39, 38, 40, 38, 39,
40, 39, 37, 36, 35, 33, 35, 34, 32, 33, 34, 38,
35, 36, 36, 36, 36, 35, 36, 38, 36, 37, 37, 37,
38, 38, 39, 43, 46, 51, 52, 50, 50, 48, 50, 49,
49, 50, 48, 50, 50, 49, 49, 51, 54, 54, 51, 51,
49, 47, 48, 52, 53, 51, 49, 46, 46, 43, 46, 45,
47, 50, 49, 47, 47, 46, 45, 48, 48, 45, 43, 44,
43, 43, 42, 41, 39, 39, 39, 37, 37, 34, 34, 32,
33, 35, 36, 39, 35, 36, 36, 36, 36, 40, 39, 36,
36, 35, 34, 33, 32, 37, 43, 51, 56, 54, 55, 56,
55, 52, 50, 49, 46, 46, 45, 47, 49, 51, 54, 54,
51, 49, 50, 50, 48, 47, 45, 46, 47, 50, 50, 48,
43, 42, 42, 43, 45, 47, 47, 48, 50, 49, 47, 47,
48, 49, 47, 48, 48, 47, 47, 45, 44, 42, 39, 38,
38, 38, 42, 41, 41, 39, 36, 35, 35, 35, 36, 36,
36, 34, 37, 37, 35, 36, 36, 35, 36, 37, 38, 41,
50, 67, 82, 84, 80, 80, 76, 75, 74, 71, 64, 61,
58, 54, 53, 54, 56, 56, 53, 51, 51, 49, 47, 49,
49, 48, 48, 47, 47, 48, 48, 47, 45, 46, 47, 46,
46, 45, 41, 42, 44, 44, 45, 45, 48, 47, 44, 42,
37, 35, 34, 32, 33, 37, 40, 37, 37, 36, 36, 37,
35, 35, 36, 36, 36, 37, 35, 37, 37, 37, 35, 35,
35, 37, 40, 41, 46, 58, 85, 119, -119, -123, 123, 115,
109, 110, 109, 107, 102, 95, 93, 88, 86, 86, 86, 86,
83, 77, 68, 64, 59, 58, 61, 61, 61, 58, 56, 51,
49, 51, 51, 50, 50, 45, 37, 41, 47, 50, 50, 53,
52, 49, 48, 45, 43, 42, 39, 38, 36, 38, 39, 39,
39, 38, 37, 36, 35, 35, 35, 36, 36, 34, 36, 36,
38, 39, 38, 37, 39, 41, 43, 47, 56, 79, 121, -106,
-110, -108, -99, -102, -100, -99, -101, -103, -102, -106, -108, -110,
-111, -111, -115, -117, -120, -123, -123, -125, -128, 127, 124, 118,
114, 119, 113, 104, 99, 100, 100, 97, 89, 83, 79, 76,
73, 69, 60, 52, 48, 47, 45, 46, 40, 37, 38, 38,
42, 45, 43, 42, 42, 39, 38, 39, 35, 35, 36, 36,
36, 37, 37, 40, 42, 42, 40, 39, 38, 40, 43, 49,
60, 83, 126, -105, -98, -93, -97, -94, -93, -90, -88, -91,
-94, -91, -90, -93, -94, -94, -96, -94, -94, -96, -95, -93,
-96, -100, -104, -104, -105, -108, -110, -115, -119, -120, -122, -125,
127, 122, 118, 115, 118, 113, 97, 78, 59, 45, 48, 46,
40, 38, 38, 37, 38, 38, 35, 37, 37, 34, 32, 32,
35, 36, 36, 36, 36, 38, 39, 38, 37, 38, 35, 34,
36, 35, 37, 41, 51, 77, 120, -100, -91, -96, -95, -93,
-92, -89, -90, -92, -92, -93, -93, -91, -90, -91, -94, -94,
-94, -93, -92, -93, -95, -95, -93, -94, -94, -91, -92, -94,
-93, -91, -92, -91, -92, -96, -97, -99, -105, -112, 126, 95,
63, 43, 47, 42, 38, 38, 36, 36, 36, 38, 37, 37,
37, 36, 37, 38, 35, 36, 36, 36, 36, 39, 39, 39,
41, 38, 33, 35, 37, 39, 45, 51, 58, 80, 121, -104,
-94, -93, -92, -94, -94, -91, -89, -89, -88, -86, -86, -88,
-87, -88, -90, -90, -91, -91, -89, -87, -90, -92, -92, -90,
-91, -91, -89, -89, -90, -92, -93, -91, -90, -91, -90, -91,
-91, -100, -128, 88, 54, 44, 47, 48, 46, 43, 41, 36,
37, 40, 38, 40, 38, 38, 37, 39, 35, 36, 36, 36,
36, 38, 41, 39, 37, 35, 32, 34, 36, 38, 42, 47,
57, 82, 118, -105, -88, -86, -84, -88, -91, -91, -91, -92,
-91, -89, -90, -89, -87, -88, -88, -89, -89, -91, -91, -91,
-92, -93, -92, -93, -97, -93, -93, -93, -92, -92, -94, -94,
-92, -94, -94, -91, -91, -98, -122, 96, 63, 53, 49, 44,
42, 42, 41, 38, 36, 37, 36, 37, 38, 39, 38, 40,
35, 36, 36, 36, 36, 34, 36, 35, 37, 39, 40, 43,
41, 41, 44, 48, 56, 83, -127, -99, -89, -88, -87, -88,
-89, -87, -89, -90, -90, -89, -91, -91, -89, -87, -88, -87,
-89, -88, -89, -88, -90, -89, -87, -88, -92, -91, -88, -89,
-88, -87, -89, -91, -93, -95, -97, -94, -93, -99, -125, 91,
59, 45, 45, 47, 43, 42, 39, 36, 36, 36, 40, 38,
39, 39, 37, 36, 36, 36, 36, 36, 36, 34, 37, 38,
39, 40, 43, 43, 43, 43, 40, 43, 56, 87, -127, -100,
-94, -95, -91, -88, -90, -89, -90, -92, -88, -88, -90, -88,
-90, -90, -89, -89, -91, -91, -92, -92, -91, -90, -89, -89,
-92, -90, -90, -92, -91, -89, -90, -91, -91, -95, -94, -92,
-93, -99, -124, 92, 61, 48, 47, 49, 45, 44, 41, 38,
37, 37, 38, 34, 35, 35, 35, 35, 36, 36, 36, 36,
36, 40, 39, 36, 34, 35, 35, 37, 37, 40, 49, 56,
62, 89, -124, -99, -93, -88, -88, -92, -90, -87, -88, -89,
-87, -88, -89, -88, -87, -88, -89, -89, -87, -88, -88, -87,
-89, -92, -91, -92, -92, -91, -91, -90, -89, -89, -89, -90,
-92, -93, -91, -87, -86, -96, -127, 90, 60, 45, 44, 43,
36, 36, 37, 39, 38, 40, 40, 37, 36, 36, 33, 35,
36, 36, 36, 36, 36, 34, 34, 34, 33, 34, 34, 35,
37, 40, 42, 41, 50, 80, -127, -96, -92, -89, -85, -88,
-91, -88, -88, -89, -87, -90, -90, -89, -89, -90, -91, -90,
-89, -87, -86, -87, -89, -90, -91, -93, -93, -93, -91, -91,
-90, -90, -91, -92, -91, -92, -89, -87, -88, -96, -123, 96,
65, 48, 47, 45, 38, 37, 37, 37, 37, 39, 39, 37,
38, 36, 35, 35, 36, 36, 36, 36, 36, 40, 41, 40,
41, 42, 42, 41, 39, 39, 45, 53, 66, 100, -111, -86,
-86, -87, -80, -86, -92, -88, -86, -87, -84, -83, -86, -86,
-85, -85, -86, -84, -84, -88, -90, -87, -88, -88, -88, -88,
-90, -89, -89, -89, -89, -89, -88, -87, -88, -90, -87, -88,
-90, -98, -127, 93, 69, 50, 50, 51, 43, 44, 43, 41,
37, 37, 40, 38, 38, 37, 36, 38, 36, 36, 36, 36,
36, 36, 38, 39, 40, 39, 40, 39, 42, 46, 49, 52,
62, 90, -123, -101, -100, -98, -94, -90, -88, -87, -89, -90,
-89, -88, -88, -87, -86, -87, -86, -86, -87, -85, -85, -88,
-89, -88, -89, -88, -89, -90, -89, -90, -90, -91, -90, -89,
-91, -91, -91, -90, -92, -99, -126, 93, 61, 45, 49, 48,
43, 41, 38, 37, 36, 38, 38, 37, 36, 35, 35, 39,
36, 36, 36, 36, 37, 41, 42, 40, 41, 41, 38, 40,
42, 42, 45, 50, 61, 91, -121, -94, -93, -96, -94, -94,
-93, -91, -91, -93, -90, -88, -92, -90, -87, -87, -89, -88,
-87, -89, -89, -90, -93, -96, -94, -91, -89, -88, -88, -90,
-90, -89, -91, -92, -93, -91, -91, -92, -91, -101, 122, 84,
60, 48, 52, 46, 34, 36, 36, 37, 34, 34, 37, 34,
32, 33, 34, 37, 36, 36, 36, 37, 37, 36, 39, 39,
41, 40, 41, 40, 39, 42, 44, 49, 62, 92, -124, -96,
-84, -81, -86, -87, -89, -90, -91, -92, -90, -88, -89, -91,
-90, -89, -89, -89, -90, -89, -86, -88, -89, -89, -90, -88,
-90, -91, -91, -92, -92, -92, -91, -91, -93, -95, -94, -93,
-93, -101, 125, 86, 61, 47, 47, 49, 45, 44, 44, 43,
44, 45, 44, 42, 41, 38, 35, 38, 37, 37, 37, 37,
37, 39, 40, 40, 42, 44, 42, 43, 47, 45, 44, 50,
66, 99, -111, -93, -97, -96, -92, -89, -89, -89, -87, -88,
-86, -87, -90, -88, -88, -88, -87, -87, -88, -91, -93, -91,
-92, -89, -86, -84, -83, -83, -87, -90, -91, -90, -91, -92,
-93, -94, -97, -96, -97, -107, 119, 79, 53, 39, 39, 38,
37, 40, 38, 38, 37, 38, 40, 41, 39, 38, 36, 36,
37, 37, 37, 37, 37, 40, 39, 40, 40, 40, 40, 38,
39, 43, 44, 48, 59, 95, -121, -103, -96, -95, -97, -94,
-92, -90, -90, -90, -88, -85, -88, -89, -88, -89, -91, -92,
-92, -91, -90, -88, -88, -88, -90, -91, -92, -91, -89, -93,
-93, -92, -92, -91, -93, -94, -94, -94, -93, -105, 118, 79,
52, 38, 36, 40, 41, 41, 42, 39, 38, 40, 40, 39,
39, 39, 37, 38, 37, 37, 37, 37, 37, 41, 42, 40,
41, 43, 43, 45, 43, 42, 43, 47, 62, 95, -120, -93,
-92, -96, -92, -94, -92, -91, -88, -88, -89, -90, -91, -88,
-88, -89, -88, -91, -93, -92, -91, -90, -89, -90, -89, -91,
-90, -90, -94, -95, -95, -94, -91, -87, -83, -87, -88, -89,
-94, -106, 117, 79, 60, 51, 45, 40, 37, 38, 38, 36,
34, 33, 34, 34, 33, 35, 37, 36, 37, 37, 37, 37,
37, 36, 40, 38, 39, 40, 41, 38, 40, 43, 48, 52,
62, 96, -120, -103, -99, -94, -95, -93, -92, -90, -89, -90,
-91, -90, -92, -95, -95, -94, -94, -92, -92, -93, -93, -92,
-91, -90, -92, -94, -93, -92, -89, -91, -89, -87, -88, -91,
-97, -98, -95, -94, -94, -104, 123, 86, 61, 48, 46, 47,
40, 38, 37, 34, 36, 35, 39, 41, 40, 39, 37, 37,
37, 37, 37, 37, 37, 39, 39, 40, 39, 40, 42, 41,
40, 43, 42, 43, 52, 85, 125, -106, -92, -98, -96, -84,
-82, -87, -86, -85, -86, -86, -90, -88, -88, -87, -87, -92,
-93, -93, -93, -90, -91, -92, -89, -89, -89, -89, -91, -91,
-93, -93, -94, -93, -92, -94, -94, -91, -92, -100, 123, 79,
57, 47, 45, 47, 40, 37, 36, 35, 38, 37, 39, 40,
38, 39, 36, 35, 37, 37, 37, 37, 37, 41, 38, 33,
31, 37, 44, 44, 44, 46, 48, 52, 64, 96, -117, -98,
-103, -99, -97, -96, -97, -97, -94, -89, -85, -90, -91, -89,
-89, -89, -88, -87, -86, -90, -92, -91, -93, -91, -92, -92,
-91, -93, -92, -92, -92, -91, -94, -94, -94, -95, -93, -98,
-102, -110, 117, 83, 55, 40, 46, 48, 44, 42, 39, 40,
37, 39, 40, 38, 38, 38, 39, 42, 37, 37, 37, 37,
38, 39, 40, 41, 41, 41, 41, 40, 42, 46, 47, 52,
65, 102, -114, -102, -97, -100, -95, -83, -88, -91, -89, -91,
-91, -89, -89, -88, -90, -89, -88, -88, -88, -89, -92, -90,
-90, -90, -90, -92, -94, -95, -94, -93, -92, -90, -90, -92,
-92, -94, -92, -92, -96, -108, 116, 76, 57, 50, 47, 42,
38, 41, 42, 41, 37, 36, 37, 36, 36, 37, 35, 35,
37, 37, 37, 37, 38, 39, 40, 41, 39, 41, 40, 36,
34, 37, 39, 42, 61, 100, -113, -90, -97, -96, -90, -87,
-88, -90, -91, -93, -89, -91, -91, -90, -90, -91, -91, -89,
-87, -90, -91, -89, -90, -89, -90, -90, -92, -92, -92, -91,
-91, -89, -90, -92, -90, -92, -93, -93, -96, -107, 119, 81,
48, 37, 40, 44, 45, 41, 40, 38, 36, 37, 38, 37,
37, 37, 36, 35, 37, 37, 37, 37, 39, 47, 50, 45,
40, 41, 40, 41, 42, 44, 48, 53, 64, 98, -116, -95,
-96, -97, -87, -83, -87, -87, -88, -87, -86, -86, -87, -91,
-95, -94, -92, -88, -89, -90, -90, -88, -87, -88, -90, -94,
-92, -93, -91, -89, -89, -87, -86, -87, -90, -92, -92, -91,
-92, -100, 125, 79, 52, 51, 54, 50, 47, 47, 47, 46,
45, 46, 44, 40, 36, 34, 34, 34, 37, 37, 37, 37,
38, 41, 42, 42, 39, 39, 37, 35, 39, 46, 52, 53,
68, 101, -119, -101, -101, -101, -93, -90, -89, -88, -88, -88,
-85, -89, -90, -89, -91, -93, -92, -90, -90, -90, -91, -91,
-90, -91, -93, -91, -92, -92, -89, -90, -91, -92, -95, -95,
-94, -95, -95, -96, -97, -110, 116, 81, 54, 48, 52, 51,
49, 45, 47, 46, 43, 44, 43, 38, 35, 35, 34, 36,
37, 37, 37, 37, 39, 43, 43, 41, 40, 42, 41, 41,
40, 40, 44, 50, 68, 106, -112, -93, -93, -95, -92, -94,
-93, -90, -89, -90, -88, -90, -89, -88, -89, -89, -89, -86,
-88, -91, -92, -92, -91, -92, -91, -91, -92, -91, -92, -90,
-90, -91, -88, -87, -90, -92, -91, -91, -92, -104, 121, 80,
54, 43, 45, 46, 41, 41, 40, 38, 38, 38, 37, 37,
37, 37, 39, 40, 37, 37, 37, 37, 37, 39, 39, 40,
38, 40, 41, 40, 41, 43, 46, 52, 69, 105, -112, -92,
-95, -94, -90, -94, -94, -92, -91, -90, -91, -90, -90, -90,
-90, -89, -88, -89, -90, -90, -93, -94, -93, -92, -91, -91,
-92, -94, -91, -91, -89, -89, -93, -95, -96, -97, -96, -96,
-96, -106, 121, 86, 54, 47, 53, 50, 48, 43, 40, 39,
37, 40, 40, 38, 38, 36, 37, 37, 37, 37, 37, 37,
37, 39, 38, 38, 38, 38, 37, 37, 39, 41, 42, 45,
62, 104, -112, -93, -87, -91, -92, -92, -91, -89, -91, -89,
-90, -88, -86, -88, -90, -91, -91, -90, -91, -91, -91, -90,
-89, -90, -89, -90, -93, -91, -92, -92, -91, -92, -91, -91,
-94, -94, -92, -93, -92, -103, 124, 92, 65, 49, 47, 45,
39, 40, 40, 40, 37, 37, 37, 37, 41, 41, 38, 38,
37, 37, 37, 37, 38, 46, 42, 42, 40, 41, 41, 37,
39, 43, 49, 59, 78, 112, -105, -88, -94, -93, -96, -95,
-92, -90, -88, -90, -91, -90, -88, -89, -90, -89, -90, -91,
-90, -91, -93, -93, -92, -92, -91, -91, -90, -92, -92, -92,
-93, -92, -92, -92, -94, -94, -94, -94, -93, -107, 116, 77,
48, 43, 47, 43, 41, 40, 39, 38, 38, 42, 40, 38,
37, 34, 34, 34, 36, 37, 37, 37, 37, 41, 41, 38,
38, 39, 40, 39, 39, 40, 40, 45, 63, 102, -117, -98,
-92, -88, -87, -91, -90, -89, -90, -91, -93, -90, -83, -85,
-87, -88, -90, -91, -93, -92, -93, -91, -89, -89, -89, -91,
-94, -92, -91, -90, -92, -92, -92, -93, -91, -89, -90, -89,
-87, -99, 126, 86, 54, 43, 45, 46, 42, 40, 38, 36,
34, 34, 36, 34, 35, 34, 35, 36, 36, 37, 37, 37,
38, 43, 40, 38, 38, 40, 41, 40, 41, 41, 42, 50,
74, 113, -113, -98, -95, -88, -88, -90, -91, -90, -90, -92,
-91, -88, -86, -87, -86, -86, -89, -91, -92, -92, -91, -88,
-90, -93, -95, -97, -97, -95, -94, -93, -92, -92, -92, -93,
-94, -94, -96, -95, -96, -111, 111, 73, 42, 39, 50, 45,
41, 40, 38, 38, 39, 41, 38, 35, 35, 33, 30, 28,
36, 37, 37, 37, 37, 37, 40, 38, 40, 41, 41, 43,
42, 40, 42, 49, 74, 119, -100, -88, -94, -93, -90, -94,
-94, -91, -89, -89, -90, -89, -88, -93, -94, -91, -89, -87,
-90, -96, -98, -96, -94, -94, -92, -92, -92, -89, -88, -89,
-91, -90, -89, -88, -86, -87, -90, -93, -95, -110, 113, 79,
59, 52, 43, 38, 38, 38, 41, 41, 39, 41, 42, 41,
40, 40, 40, 39, 37, 37, 37, 37, 37, 39, 38, 40,
40, 42, 40, 41, 43, 47, 50, 53, 74, 112, -114, -99,
-95, -92, -94, -95, -95, -92, -90, -91, -88, -85, -89, -88,
-87, -88, -89, -89, -91, -91, -90, -88, -91, -94, -93, -93,
-93, -94, -93, -91, -90, -90, -92, -93, -94, -92, -94, -94,
-95, -110, 113, 78, 52, 46, 49, 45, 43, 42, 43, 41,
39, 41, 40, 38, 38, 35, 37, 39, 37, 37, 37, 37,
37, 35, 38, 38, 41, 42, 39, 42, 43, 44, 46, 55,
80, 119, -108, -99, -95, -91, -90, -95, -95, -92, -90, -94,
-94, -89, -88, -92, -91, -91, -93, -93, -93, -93, -91, -89,
-90, -93, -91, -89, -88, -89, -88, -89, -92, -93, -93, -93,
-92, -92, -95, -95, -97, -113, 108, 67, 48, 46, 41, 41,
42, 39, 39, 37, 36, 38, 38, 36, 37, 39, 38, 39,
37, 37, 37, 37, 36, 32, 34, 36, 38, 38, 38, 38,
41, 42, 44, 50, 67, 115, -98, -89, -94, -93, -87, -86,
-91, -90, -92, -93, -92, -89, -91, -92, -90, -92, -92, -91,
-90, -90, -89, -87, -90, -93, -92, -92, -95, -94, -94, -93,
-91, -92, -94, -95, -96, -93, -93, -92, -95, -112, 107, 73,
56, 45, 45, 44, 41, 41, 39, 38, 37, 39, 39, 37,
38, 37, 39, 41, 37, 37, 37, 37, 37, 40, 39, 41,
42, 42, 39, 39, 43, 47, 49, 56, 76, 112, -112, -102,
-90, -78, -88, -93, -92, -92, -90, -89, -91, -88, -86, -90,
-88, -87, -89, -91, -90, -90, -89, -90, -90, -88, -90, -89,
-89, -89, -87, -90, -91, -90, -90, -88, -90, -92, -93, -93,
-97, -112, 108, 71, 52, 48, 51, 48, 45, 40, 40, 41,
42, 42, 41, 39, 41, 42, 39, 37, 37, 37, 37, 37,
37, 38, 39, 40, 40, 40, 40, 42, 45, 46, 45, 51,
72, 121, -98, -99, -100, -95, -93, -96, -95, -93, -90, -90,
-87, -89, -89, -90, -89, -90, -90, -89, -92, -94, -90, -91,
-91, -91, -90, -89, -90, -88, -90, -92, -91, -92, -93, -94,
-96, -94, -94, -95, -97, -113, 106, 71, 52, 48, 46, 45,
45, 41, 37, 33, 33, 35, 35, 37, 38, 37, 36, 35,
37, 37, 37, 37, 37, 37, 37, 38, 39, 39, 39, 40,
42, 40, 42, 50, 73, 114, -107, -96, -100, -97, -100, -103,
-101, -97, -92, -89, -89, -87, -85, -88, -89, -87, -87, -88,
-88, -89, -91, -92, -89, -86, -86, -84, -86, -86, -90, -94,
-94, -93, -93, -94, -94, -93, -92, -94, -99, -115, 106, 72,
60, 59, 57, 55, 48, 42, 39, 37, 37, 39, 37, 37,
38, 37, 35, 33, 37, 37, 37, 37, 38, 45, 43, 42,
39, 36, 35, 34, 38, 40, 42, 50, 76, 115, -110, -97,
-89, -88, -92, -95, -94, -91, -90, -88, -86, -87, -88, -87,
-86, -88, -88, -88, -91, -90, -89, -90, -89, -89, -91, -90,
-91, -90, -91, -93, -93, -93, -95, -97, -96, -92, -94, -97,
-100, -118, 106, 72, 54, 50, 48, 47, 46, 44, 40, 36,
38, 40, 42, 41, 40, 38, 36, 38, 37, 37, 37, 37,
37, 39, 41, 41, 41, 40, 41, 45, 47, 47, 46, 53,
77, 119, -102, -90, -94, -89, -88, -94, -90, -87, -86, -85,
-87, -87, -85, -86, -86, -87, -88, -90, -90, -91, -91, -91,
-93, -91, -91, -92, -93, -93, -92, -94, -93, -90, -91, -92,
-92, -91, -94, -96, -95, -105, 114, 74, 57, 51, 50, 53,
47, 42, 39, 37, 41, 46, 46, 43, 40, 35, 31, 29,
37, 37, 37, 37, 38, 39, 37, 38, 39, 40, 41, 40,
43, 46, 48, 57, 89, -126, -102, -97, -96, -93, -96, -92,
-89, -89, -91, -94, -90, -91, -90, -88, -88, -90, -90, -90,
-92, -93, -93, -92, -90, -89, -90, -89, -91, -93, -91, -92,
-93, -92, -94, -95, -92, -92, -95, -99, -100, -116, 103, 70,
54, 52, 54, 49, 46, 43, 40, 36, 35, 39, 41, 37,
38, 38, 38, 37, 37, 37, 37, 38, 38, 42, 43, 41,
41, 41, 45, 45, 44, 44, 46, 56, 86, 119, -113, -96,
-91, -78, -83, -90, -90, -90, -89, -91, -92, -92, -90, -88,
-89, -91, -91, -90, -89, -89, -88, -88, -90, -90, -92, -92,
-92, -90, -90, -94, -93, -91, -91, -92, -94, -91, -90, -95,
-100, -121, 91, 58, 49, 49, 47, 45, 44, 44, 43, 41,
40, 40, 37, 35, 35, 36, 35, 34, 37, 37, 38, 38,
38, 42, 38, 37, 38, 37, 37, 40, 45, 45, 44, 54,
84, 123, -106, -96, -95, -96, -99, -97, -96, -92, -91, -92,
-91, -92, -95, -94, -93, -92, -91, -89, -91, -92, -91, -91,
-92, -94, -92, -88, -89, -91, -91, -93, -94, -92, -93, -92,
-93, -92, -94, -95, -97, -118, 95, 55, 33, 34, 37, 37,
34, 33, 33, 31, 34, 36, 36, 34, 35, 36, 37, 38,
37, 37, 38, 38, 38, 40, 40, 42, 43, 43, 41, 41,
40, 43, 43, 50, 77, 116, -110, -84, -81, -87, -91, -94,
-91, -88, -88, -89, -88, -88, -88, -85, -88, -89, -88, -88,
-89, -92, -91, -93, -92, -92, -94, -94, -93, -93, -94, -96,
-95, -91, -89, -88, -91, -92, -94, -98, -100, -122, 91, 57,
43, 46, 41, 33, 36, 36, 38, 39, 39, 38, 33, 33,
34, 34, 34, 35, 37, 38, 38, 38, 39, 44, 43, 44,
45, 44, 40, 40, 42, 40, 46, 60, 93, -127, -103, -88,
-87, -94, -93, -96, -97, -94, -89, -90, -89, -88, -90, -90,
-91, -92, -90, -90, -91, -93, -94, -94, -94, -94, -93, -91,
-94, -96, -95, -98, -97, -94, -94, -95, -99, -98, -95, -95,
-101, -121, 95, 58, 42, 39, 44, 44, 39, 37, 41, 42,
41, 41, 37, 33, 33, 32, 33, 33, 37, 38, 38, 38,
38, 39, 41, 44, 44, 47, 46, 44, 41, 39, 40, 52,
85, 127, -102, -88, -82, -87, -92, -94, -91, -90, -91, -92,
-91, -89, -91, -92, -91, -89, -87, -86, -89, -91, -92, -93,
-93, -92, -95, -98, -95, -90, -87, -90, -92, -93, -94, -98,
-99, -97, -97, -96, -98, -114, 106, 65, 40, 42, 41, 39,
41, 41, 43, 46, 45, 43, 40, 38, 39, 40, 40, 39,
37, 38, 38, 38, 38, 34, 37, 39, 42, 42, 41, 42,
41, 42, 44, 58, 88, 124, -109, -98, -95, -96, -97, -95,
-95, -95, -96, -94, -91, -90, -92, -91, -90, -90, -89, -87,
-89, -92, -94, -95, -96, -95, -94, -94, -97, -98, -97, -97,
-96, -95, -96, -95, -98, -99, -98, -97, -100, -121, 90, 52,
37, 36, 39, 41, 39, 39, 40, 38, 35, 33, 34, 35,
34, 36, 36, 35, 37, 38, 38, 38, 38, 40, 39, 40,
39, 40, 44, 46, 49, 53, 53, 53, 73, 108, -114, -96,
-96, -99, -100, -99, -96, -94, -95, -93, -89, -84, -88, -91,
-91, -93, -97, -97, -98, -97, -93, -92, -92, -92, -95, -95,
-94, -92, -91, -94, -96, -96, -94, -94, -94, -92, -93, -94,
-96, -115, 103, 64, 36, 38, 45, 42, 44, 41, 41, 41,
37, 38, 42, 45, 46, 43, 39, 33, 37, 38, 38, 38,
38, 42, 42, 38, 36, 35, 34, 36, 40, 39, 39, 49,
82, -123, -95, -91, -87, -89, -93, -94, -95, -94, -95, -94,
-91, -92, -93, -92, -92, -94, -95, -95, -96, -94, -94, -94,
-93, -94, -92, -90, -92, -90, -91, -93, -92, -92, -91, -91,
-93, -93, -93, -93, -98, -122, 90, 54, 40, 40, 41, 40,
38, 36, 36, 36, 39, 42, 43, 41, 38, 38, 36, 36,
37, 38, 38, 38, 38, 41, 40, 37, 36, 38, 42, 42,
41, 44, 41, 48, 73, 116, -103, -88, -87, -92, -96, -95,
-93, -91, -87, -85, -88, -85, -89, -93, -91, -88, -87, -85,
-87, -89, -91, -93, -92, -92, -92, -91, -94, -90, -91, -93,
-93, -94, -92, -92, -95, -93, -92, -93, -96, -116, 104, 66,
40, 39, 37, 39, 42, 43, 43, 40, 38, 37, 36, 36,
34, 34, 35, 35, 37, 38, 38, 38, 38, 41, 41, 38,
37, 36, 35, 37, 42, 44, 46, 58, 91, -120, -98, -99,
-94, -89, -93, -92, -92, -93, -93, -93, -91, -89, -88, -85,
-86, -88, -89, -87, -89, -88, -90, -94, -93, -94, -94, -91,
-90, -86, -90, -94, -94, -96, -95, -95, -94, -93, -92, -91,
-97, -123, 91, 58, 48, 52, 48, 44, 43, 43, 41, 36,
38, 42, 43, 39, 37, 34, 31, 32, 37, 38, 38, 38,
38, 41, 40, 37, 41, 42, 41, 43, 41, 39, 45, 60,
92, -123, -102, -102, -99, -99, -97, -92, -93, -93, -94, -94,
-96, -93, -89, -92, -91, -90, -89, -90, -88, -90, -90, -91,
-92, -92, -92, -92, -94, -90, -90, -90, -91, -91, -91, -93,
-94, -91, -92, -95, -103, -127, 92, 59, 49, 56, 53, 55,
51, 50, 48, 43, 39, 36, 35, 35, 34, 33, 34, 37,
37, 38, 38, 38, 38, 38, 39, 38, 40, 41, 40, 42,
45, 45, 47, 64, 100, -118, -104, -102, -93, -95, -92, -96,
-97, -96, -96, -94, -92, -89, -90, -93, -93, -96, -97, -94,
-96, -96, -97, -98, -97, -96, -94, -94, -95, -92, -95, -94,
-94, -95, -94, -95, -96, -95, -94, -94, -97, -118, 102, 70,
53, 53, 55, 52, 54, 52, 47, 41, 38, 39, 40, 36,
37, 37, 35, 36, 37, 38, 38, 38, 38, 40, 39, 40,
41, 39, 33, 33, 36, 40, 51, 64, 84, 125, -102, -87,
-81, -92, -98, -101, -98, -97, -95, -95, -95, -94, -94, -98,
-97, -94, -93, -93, -93, -92, -91, -92, -93, -93, -93, -93,
-95, -94, -94, -96, -94, -91, -91, -95, -94, -95, -98, -98,
-102, -119, 101, 71, 55, 47, 47, 48, 51, 52, 45, 38,
34, 30, 34, 34, 32, 34, 34, 37, 37, 37, 38, 38,
38, 41, 42, 41, 39, 41, 39, 37, 37, 37, 44, 66,
105, -118, -105, -107, -106, -102, -101, -102, -100, -101, -101, -99,
-98, -96, -96, -98, -94, -94, -95, -94, -96, -97, -97, -96,
-96, -95, -96, -94, -96, -99, -95, -96, -98, -100, -98, -97,
-97, -94, -93, -97, -107, 123, 83, 54, 41, 45, 48, 45,
46, 44, 43, 40, 36, 39, 36, 37, 38, 40, 41, 40,
37, 37, 38, 38, 38, 40, 40, 43, 43, 41, 40, 42,
42, 40, 44, 61, 90, 121, -122, -121, -117, -113, -111, -108,
-104, -104, -105, -106, -106, -102, -103, -106, -106, -107, -106, -106,
-104, -103, -101, -100, -99, -98, -99, -100, -101, -98, -95, -94,
-94, -93, -95, -95, -97, -97, -98, -97, -97, -115, 98, 58,
40, 42, 46, 46, 47, 48, 45, 43, 42, 40, 39, 36,
34, 35, 36, 38, 37, 37, 37, 38, 38, 37, 41, 41,
42, 43, 40, 41, 40, 40, 42, 51, 68, 78, 81, 81,
81, 85, 85, 87, 88, 89, 93, 96, 97, 100, 98, 101,
105, 109, 110, 113, 116, 116, 117, 118, 119, 120, 121, 126,
-126, -126, -123, -120, -118, -117, -115, -114, -113, -110, -106, -108,
-115, 117, 81, 52, 40, 42, 47, 48, 48, 45, 42, 38,
34, 37, 34, 36, 37, 39, 39, 38, 37, 37, 37, 38,
38, 38, 37, 39, 41, 39, 42, 42, 40, 41, 43, 53,
69, 71, 66, 65, 61, 57, 57, 58, 60, 62, 65, 64,
68, 76, 71, 67, 68, 69, 75, 82, 87, 85, 85, 86,
87, 92, 94, 94, 96, 90, 91, 95, 101, 109, 109, 114,
115, 119, 123, 121, 117, 104, 77, 50, 37, 32, 30, 24,
27, 35, 39, 39, 36, 38, 36, 37, 36, 34, 33, 32,
37, 37, 37, 37, 38, 37, 41, 40, 41, 43, 41, 39,
38, 40, 43, 49, 53, 52, 50, 50, 51, 51, 52, 54,
49, 46, 50, 48, 47, 51, 51, 50, 48, 50, 50, 50,
50, 50, 51, 51, 52, 52, 56, 57, 58, 59, 57, 56,
56, 55, 52, 53, 56, 59, 60, 61, 62, 59, 54, 54,
51, 47, 50, 47, 45, 44, 43, 40, 37, 37, 37, 39,
43, 45, 43, 39, 36, 37, 37, 37, 39, 46, 41, 38,
40, 40, 39, 40, 40, 38, 43, 49, 54, 54, 52, 52,
49, 47, 47, 50, 48, 49, 52, 49, 50, 51, 48, 48,
49, 49, 49, 51, 50, 46, 46, 50, 49, 52, 52, 47,
48, 51, 52, 48, 50, 52, 47, 45, 46, 45, 48, 49,
50, 48, 44, 45, 48, 50, 47, 43, 44, 44, 44, 43,
43, 43, 41, 41, 41, 38, 36, 36, 36, 37, 37, 37,
37, 41, 41, 39, 38, 38, 36, 36, 37, 39, 44, 48,
50, 50, 50, 52, 52, 52, 52, 53, 50, 46, 46, 46,
42, 43, 46, 45, 44, 46, 46, 45, 43, 45, 46, 50,
51, 50, 51, 50, 49, 51, 51, 50, 51, 50, 49, 47,
49, 49, 50, 52, 50, 48, 45, 46, 47, 47, 48, 47,
45, 44, 45, 42, 38, 37, 35, 31, 29, 31, 33, 35,
36, 36, 37, 37, 37, 39, 39, 40, 41, 42, 39, 37,
37, 36, 40, 44, 48, 47, 45, 46, 49, 49, 49, 50,
47, 48, 49, 48, 45, 47, 47, 49, 51, 53, 51, 49,
48, 46, 44, 44, 43, 44, 46, 48, 49, 51, 51, 50,
49, 49, 48, 50, 54, 56, 49, 44, 43, 44, 44, 45,
45, 44, 45, 42, 40, 41, 42, 41, 38, 36, 37, 41,
46, 43, 40, 37, 36, 36, 37, 37, 37, 40, 41, 40,
39, 39, 36, 35, 37, 38, 41, 43, 45, 46, 46, 46,
47, 45, 41, 45, 46, 47, 48, 47, 45, 44, 45, 47,
46, 46, 46, 45, 46, 45, 43, 44, 44, 46, 51, 51,
47, 49, 46, 44, 43, 39, 39, 42, 46, 46, 46, 44,
43, 42, 42, 44, 44, 46, 46, 47, 45, 40, 37, 33,
35, 40, 45, 42, 42, 42, 38, 36, 36, 36, 36, 37,
38, 42, 42, 40, 39, 38, 38, 39, 40, 39, 38, 40,
40, 38, 37, 38, 40, 40, 38, 39, 39, 40, 39, 36,
34, 37, 40, 40, 41, 40, 38, 35, 36, 40, 39, 38,
36, 36, 37, 39, 40, 40, 40, 41, 42, 42, 42, 42,
40, 41, 41, 42, 45, 45, 42, 42, 40, 42, 46, 46,
44, 43, 41, 39, 37, 40, 41, 37, 35, 32, 30, 31,
36, 36, 36, 36, 37, 40, 40, 40, 39, 39, 38, 39,
41, 42, 40, 42, 42, 41, 38, 38, 42, 39, 37, 39,
37, 34, 35, 36, 39, 39, 41, 41, 39, 39, 36, 35,
35, 37, 41, 45, 48, 47, 48, 45, 42, 44, 41, 41,
42, 43, 42, 41, 40, 39, 37, 37, 37, 38, 38, 40,
41, 42, 40, 41, 40, 39, 40, 38, 37, 39, 41, 40,
37, 35, 32, 33, 36, 36, 36, 36, 36, 38, 39, 38,
37, 38, 37, 37, 40, 39, 43, 48, 48, 44, 39, 38,
40, 41, 41, 41, 42, 42, 39, 36, 35, 35, 34, 35,
36, 38, 38, 37, 39, 38, 36, 36, 37, 39, 40, 40,
38, 38, 37, 35, 36, 33, 34, 37, 36, 39, 39, 38,
37, 33, 30, 32, 33, 33, 35, 36, 36, 36, 37, 35,
37, 39, 40, 36, 35, 37, 36, 35, 36, 36, 36, 36,
35, 31, 34, 35, 37, 38, 37, 36, 39, 42, 41, 41,
40, 38, 36, 37, 38, 39, 40, 40, 37, 34, 34, 35,
37, 37, 39, 39, 38, 40, 39, 41, 43, 43, 43, 40,
39, 41, 41, 39, 35, 33, 34, 33, 36, 38, 40, 40,
39, 40, 37, 39, 37, 34, 33, 34, 35, 35, 35, 35,
33, 35, 34, 33, 34, 36, 37, 36, 35, 35, 34, 35,
36, 36, 36, 36, 36, 38, 39, 40, 40, 42, 41, 40,
43, 42, 39, 38, 35, 35, 34, 35, 37, 37, 37, 37,
38, 37, 35, 34, 36, 39, 40, 39, 40, 41, 40, 36,
37, 38, 34, 35, 36, 37, 39, 40, 37, 37, 37, 34,
34, 35, 35, 37, 37, 38, 39, 42, 44, 42, 40, 41,
40, 38, 35, 34, 34, 36, 36, 37, 39, 38, 40, 40,
38, 36, 33, 31, 36, 36, 36, 36, 36, 36, 36, 39,
41, 42, 41, 40, 38, 38, 37, 37, 41, 40, 39, 39,
37, 39, 38, 39, 37, 35, 35, 35, 36, 39, 38, 38,
38, 38, 39, 39, 39, 38, 38, 39, 40, 41, 41, 41,
38, 38, 37, 37, 36, 38, 40, 39, 37, 35, 37, 35,
33, 34, 35, 38, 36, 36, 38, 34, 33, 35, 36, 35,
37, 39, 38, 38, 38, 37, 34, 31, 36, 36, 36, 36,
36, 37, 41, 41, 39, 40, 39, 40, 41, 42, 40, 35,
35, 36, 34, 36, 38, 38, 39, 39, 39, 39, 38, 37,
38, 38, 36, 34, 35, 40, 44, 43, 46, 47, 40, 35,
36, 36, 37, 37, 35, 36, 37, 35, 36, 38, 38, 39,
39, 39, 40, 40, 38, 33, 32, 35, 36, 35, 32, 31,
32, 34, 34, 35, 38, 39, 38, 37, 35, 36, 36, 33,
36, 36, 36, 36, 36, 35, 31, 33, 36, 36, 37, 37,
37, 38, 38, 39, 41, 39, 36, 36, 36, 35, 37, 34,
34, 32, 32, 34, 35, 39, 38, 38, 39, 38, 38, 38,
38, 36, 33, 34, 33, 34, 34, 37, 40, 40, 40, 37,
35, 37, 38, 37, 35, 35, 36, 37, 38, 41, 43, 42,
37, 36, 40, 39, 41, 43, 41, 36, 32, 33, 36, 37,
40, 39, 36, 33, 36, 36, 36, 36, 37, 42, 42, 39,
35, 35, 35, 37, 37, 38, 39, 38, 40, 40, 39, 44,
44, 39, 40, 40, 42, 44, 42, 38, 38, 36, 35, 35,
35, 38, 38, 35, 33, 36, 35, 35, 37, 38, 39, 38,
38, 38, 37, 36, 33, 33, 33, 34, 37, 38, 39, 40,
36, 31, 33, 36, 34, 37, 35, 34, 36, 37, 38, 38,
37, 37, 35, 33, 35, 39, 36, 34, 36, 36, 36, 36,
36, 36, 35, 36, 36, 37, 35, 37, 38, 38, 40, 41,
42, 40, 41, 44, 42, 42, 40, 38, 39, 37, 36, 35,
35, 34, 33, 34, 35, 36, 36, 38, 37, 37, 36, 34,
36, 39, 40, 39, 38, 39, 37, 37, 36, 39, 40, 39,
39, 35, 37, 37, 36, 40, 41, 40, 37, 35, 36, 36,
37, 35, 35, 34, 32, 36, 34, 32, 31, 30, 31, 33,
36, 36, 36, 36, 37, 37, 37, 36, 35, 38, 39, 41,
40, 35, 36, 35, 35, 34, 34, 38, 38, 39, 40, 36,
35, 36, 35, 36, 36, 38, 36, 39, 41, 42, 41, 41,
40, 41, 41, 39, 38, 36, 37, 37, 35, 37, 40, 39,
37, 37, 37, 38, 39, 43, 44, 41, 39, 39, 42, 40,
36, 38, 34, 33, 36, 37, 41, 41, 41, 41, 41, 40,
40, 44, 41, 38, 36, 36, 36, 37, 37, 38, 39, 39,
38, 38, 37, 40, 40, 37, 38, 38, 37, 36, 36, 36,
35, 39, 39, 38, 41, 38, 37, 38, 39, 41, 40, 40,
41, 41, 41, 40, 37, 39, 40, 40, 39, 39, 36, 35,
35, 35, 35, 35, 34, 36, 35, 37, 40, 40, 40, 38,
36, 36, 35, 37, 36, 37, 38, 38, 38, 37, 37, 34,
31, 33, 32, 33, 33, 33, 35, 36};

View File

@ -0,0 +1,173 @@
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
/*
from: @(#)fdlibm.h 5.1 93/09/24
*/
#ifndef _MATH_PRIVATE_H_
#define _MATH_PRIVATE_H_
#include "wcclibm.h"
// #include <endian.h>
// #include <sys/types.h>
/* A representation of a double as a union. */
union ieee754_double {
double d;
/* This is the IEEE 754 double-precision format. */
struct {
/* Together these comprise the mantissa. */
unsigned int mantissa1 : 32;
unsigned int mantissa0 : 20;
unsigned int exponent : 11;
unsigned int negative : 1;
} ieee;
/* This format makes it easier to see if a NaN is a signalling NaN. */
struct {
/* Together these comprise the mantissa. */
unsigned int mantissa1 : 32;
unsigned int mantissa0 : 19;
unsigned int quiet_nan : 1;
unsigned int exponent : 11;
unsigned int negative : 1;
} ieee_nan;
};
/* The original fdlibm code used statements like:
n0 = ((*(int*)&one)>>29)^1; * index of high word *
ix0 = *(n0+(int*)&x); * high word of x *
ix1 = *((1-n0)+(int*)&x); * low word of x *
to dig two 32 bit words out of the 64 bit IEEE floating point
value. That is non-ANSI, and, moreover, the gcc instruction
scheduler gets it wrong. We instead use the following macros.
Unlike the original code, we determine the endianness at compile
time, not at run time; I don't see much benefit to selecting
endianness at run time. */
/* A union which permits us to convert between a double and two 32 bit
ints. */
/* #if __FLOAT_WORD_ORDER == BIG_ENDIAN */
/* #warning USING Big Endian float word order */
/* typedef union */
/* { */
/* double value; */
/* struct */
/* { */
/* u_int16_t msw; */
/* u_int16_t lsw; */
/* } parts; */
/* } ieeeDoubleShapeType; */
/* #endif */
/* #if __FLOAT_WORD_ORDER == LITTLE_ENDIAN */
/* #warning USING Little Endian float word order */
typedef union {
double value;
struct {
u_int16_t lsw;
u_int16_t msw;
} parts;
} ieeeDoubleShapeType;
/* #endif */
/* Get two 32 bit ints from a double. */
#define EXTRACT_WORDS(ix0, ix1, d) \
{ \
ieeeDoubleShapeType ew_u; \
ew_u.value = (d); \
(ix0) = ew_u.parts.msw; \
(ix1) = ew_u.parts.lsw; \
}
/* Get the more significant 32 bit int from a double. */
#define GET_HIGH_WORD(i, d) \
{ \
ieeeDoubleShapeType gh_u; \
gh_u.value = (d); \
(i) = gh_u.parts.msw; \
}
/* Get the less significant 32 bit int from a double. */
#define GET_LOW_WORD(i, d) \
{ \
ieeeDoubleShapeType gl_u; \
gl_u.value = (d); \
(i) = gl_u.parts.lsw; \
}
/* Set a double from two 32 bit ints. */
#define INSERT_WORDS(d, ix0, ix1) \
{ \
ieeeDoubleShapeType iw_u; \
iw_u.parts.msw = (ix0); \
iw_u.parts.lsw = (ix1); \
(d) = iw_u.value; \
}
/* Set the more significant 32 bits of a double from an int. */
#define SET_HIGH_WORD(d, v) \
{ \
ieeeDoubleShapeType sh_u; \
sh_u.value = (d); \
sh_u.parts.msw = (v); \
(d) = sh_u.value; \
}
/* Set the less significant 32 bits of a double from an int. */
#define SET_LOW_WORD(d, v) \
{ \
ieeeDoubleShapeType sl_u; \
sl_u.value = (d); \
sl_u.parts.lsw = (v); \
(d) = sl_u.value; \
}
/* A union which permits us to convert between a float and a 32 bit
int. */
typedef union {
float value;
u_int32_t word;
} ieee_float_shape_type;
/* Get a 32 bit int from a float. */
#define GET_FLOAT_WORD(i, d) \
{ \
ieee_float_shape_type gf_u; \
gf_u.value = (d); \
(i) = gf_u.word; \
}
/* Set a float from a 32 bit int. */
#define SET_FLOAT_WORD(d, i) \
{ \
ieee_float_shape_type sf_u; \
sf_u.word = (i); \
(d) = sf_u.value; \
}
#endif /* _MATH_PRIVATE_H_ */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,80 @@
#include "wccfile.h"
// Wasm loop bounds
__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void
__pragma_loopbound(unsigned int min_bound, unsigned int max_bound);
#define EOF -1
size_t
susan_wccfread(void *ptr, size_t size, size_t count, struct wccFILE *stream) {
if (susan_wccfeof(stream))
return EOF;
unsigned i = stream->cur_pos, i2 = 0;
size_t number_of_chars_to_read =
stream->size - stream->cur_pos >= size * count
? size * count
: stream->size - stream->cur_pos;
__pragma_loopbound(7220, 7220);
while (i < stream->cur_pos + number_of_chars_to_read)
((unsigned char *) ptr)[i2++] = stream->data[i++];
stream->cur_pos += number_of_chars_to_read;
return number_of_chars_to_read;
}
int
susan_wccfgetc(struct wccFILE *stream) {
if (susan_wccfeof(stream))
return EOF;
else
return stream->data[stream->cur_pos++];
}
char *
susan_wccfgets(char *str, int num, struct wccFILE *stream) {
if (!stream || susan_wccfeof(stream) || !str || num <= 0)
return 0;
int pos = 0;
__pragma_loopbound(57, 57);
while (pos < num - 1 && !susan_wccfeof(stream)) {
str[pos] = stream->data[stream->cur_pos];
if (str[pos] == '\n')
break;
stream->cur_pos++;
pos++;
}
str[pos++] = '\0';
return str;
}
int
susan_wccfseek(struct wccFILE *stream, long int offset, enum _Origin_ origin) {
if (origin == WCCSEEK_SET) {
stream->cur_pos = offset;
return 0;
} else if (origin == WCCSEEK_CUR) {
stream->cur_pos += offset;
return 0;
} else if (origin == WCCSEEK_END) {
stream->cur_pos = stream->size + offset;
return 0;
}
return -1;
}
int
susan_wccfgetpos(struct wccFILE *stream, unsigned *position) {
*position = stream->cur_pos;
return 0;
}
int
susan_wccfeof(struct wccFILE *stream) {
return stream->cur_pos == stream->size ? 1 : 0;
}

View File

@ -0,0 +1,25 @@
#ifndef WCC_FILE_H
#define WCC_FILE_H
enum _Origin_ { WCCSEEK_SET, WCCSEEK_CUR, WCCSEEK_END };
typedef enum _Origin_ Origin;
typedef unsigned int size_t;
#define EOF -1
struct wccFILE {
char *data;
size_t size;
unsigned cur_pos;
};
size_t susan_wccfread(void *ptr, size_t size, size_t count,
struct wccFILE *stream);
int susan_wccfseek(struct wccFILE *stream, long int offset, Origin origin);
int susan_wccfgetpos(struct wccFILE *stream, unsigned *position);
int susan_wccfeof(struct wccFILE *stream);
int susan_wccfgetc(struct wccFILE *stream);
char *susan_wccfgets(char *str, int num, struct wccFILE *stream);
#endif

View File

@ -0,0 +1,483 @@
#include "wcclibm.h"
#include "math_private.h"
/* e_rem_pio2f.c -- float version of e_rem_pio2.c
Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] =
"$NetBSD: e_rem_pio2f.c,v 1.5 1995/05/10 20:46:03 jtc Exp $";
#endif
/* __ieee754_rem_pio2f(x,y)
return the remainder of x rem pi/2 in y[ 0 ]+y[ 1 ]
use __kernel_rem_pio2f()
*/
/* This array is like the one in e_rem_pio2.c, but the numbers are
single precision and the last 8 bits are forced to 0. */
static const int32_t susan_npio2_hw[] = {
0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00,
0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00,
0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100,
0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00,
0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00,
0x4242c700, 0x42490f00};
/*
invpio2: 24 bits of 2/pi
pio2_1: first 17 bit of pi/2
pio2_1t: pi/2 - pio2_1
pio2_2: second 17 bit of pi/2
pio2_2t: pi/2 - (pio2_1+pio2_2)
pio2_3: third 17 bit of pi/2
pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3)
*/
static const float
/* zero = 0.0000000000e+00f, /\* 0x00000000 *\/ */
/* half = 5.0000000000e-01f, /\* 0x3f000000 *\/ */
/* two8 = 2.5600000000e+02f, /\* 0x43800000 *\/ */
susan_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */
susan_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */
susan_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */
susan_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */
susan_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */
susan_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */
susan_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */
int32_t
susan___ieee754_rem_pio2f(float x, float *y) {
float z, w, t, r, fn;
int32_t i, j, n, ix, hx;
GET_FLOAT_WORD(hx, x);
ix = hx & 0x7fffffff;
if (ix <= 0x3f490fd8) { /* |x| ~<= pi/4 , no need for reduction */
y[0] = x;
y[1] = 0;
return 0;
}
if (ix < 0x4016cbe4) { /* |x| < 3pi/4, special case with n=+-1 */
if (hx > 0) {
z = x - susan_pio2_1;
if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */
y[0] = z - susan_pio2_1t;
y[1] = (z - y[0]) - susan_pio2_1t;
} else { /* near pi/2, use 24+24+24 bit pi */
z -= susan_pio2_2;
y[0] = z - susan_pio2_2t;
y[1] = (z - y[0]) - susan_pio2_2t;
}
return 1;
} else { /* negative x */
z = x + susan_pio2_1;
if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */
y[0] = z + susan_pio2_1t;
y[1] = (z - y[0]) + susan_pio2_1t;
} else { /* near pi/2, use 24+24+24 bit pi */
z += susan_pio2_2;
y[0] = z + susan_pio2_2t;
y[1] = (z - y[0]) + susan_pio2_2t;
}
return -1;
}
}
if (ix <= 0x43490f80) { /* |x| ~<= 2^7*(pi/2), medium size */
t = fabsf(x);
n = (int32_t) (t * susan_invpio2 + susan_half);
fn = (float) n;
r = t - fn * susan_pio2_1;
w = fn * susan_pio2_1t; /* 1st round good to 40 bit */
if (n < 32 && (int32_t) (ix & 0xffffff00) != susan_npio2_hw[n - 1]) {
y[0] = r - w; /* quick check no cancellation */
} else {
u_int32_t high;
j = ix >> 23;
y[0] = r - w;
GET_FLOAT_WORD(high, y[0]);
i = j - ((high >> 23) & 0xff);
if (i > 8) { /* 2nd iteration needed, good to 57 */
t = r;
w = fn * susan_pio2_2;
r = t - w;
w = fn * susan_pio2_2t - ((t - r) - w);
y[0] = r - w;
GET_FLOAT_WORD(high, y[0]);
i = j - ((high >> 23) & 0xff);
if (i > 25) { /* 3rd iteration need, 74 bits acc */
t = r; /* will cover all possible cases */
w = fn * susan_pio2_3;
r = t - w;
w = fn * susan_pio2_3t - ((t - r) - w);
y[0] = r - w;
}
}
}
y[1] = (r - y[0]) - w;
if (hx < 0) {
y[0] = -y[0];
y[1] = -y[1];
return -n;
} else
return n;
}
/*
all other (large) arguments
*/
if (ix >= 0x7f800000) { /* x is inf or NaN */
y[0] = y[1] = x - x;
return 0;
}
y[0] = y[1] = x - x;
return 0; /* dummy initialisation */
return 0; /* doesn't happen for our input */
}
/* k_cosf.c -- float version of k_cos.c
Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: k_cosf.c,v 1.4 1995/05/10 20:46:23 jtc Exp $";
#endif
static const float
/* one = 1.0000000000e+00, /\* 0x3f800000 *\/ */
susan_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */
susan_C2 = -1.3888889225e-03f, /* 0xbab60b61 */
susan_C3 = 2.4801587642e-05f, /* 0x37d00d01 */
susan_C4 = -2.7557314297e-07f, /* 0xb493f27c */
susan_C5 = 2.0875723372e-09f, /* 0x310f74f6 */
susan_C6 = -1.1359647598e-11f; /* 0xad47d74e */
float
susan___kernel_cosf(float x, float y) {
float a, hz, z, r, qx;
int32_t ix;
GET_FLOAT_WORD(ix, x);
ix &= 0x7fffffff; /* ix = |x|'s high word*/
if (ix < 0x32000000) { /* if x < 2**27 */
if (((int) x) == 0)
return susan_one; /* generate inexact */
}
z = x * x;
r = z *
(susan_C1 +
z * (susan_C2 +
z * (susan_C3 + z * (susan_C4 + z * (susan_C5 + z * susan_C6)))));
if (ix < 0x3e99999a) /* if |x| < 0.3 */
return susan_one - ((float) 0.5f * z - (z * r - x * y));
else {
if (ix > 0x3f480000) /* x > 0.78125 */
qx = (float) 0.28125f;
else {
SET_FLOAT_WORD(qx, ix - 0x01000000); /* x/4 */
}
hz = (float) 0.5f * z - qx;
a = susan_one - qx;
return a - (hz - (z * r - x * y));
}
}
/* k_sinf.c -- float version of k_sin.c
Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: k_sinf.c,v 1.4 1995/05/10 20:46:33 jtc Exp $";
#endif
static const float
/* half = 5.0000000000e-01f,/\* 0x3f000000 *\/ */
susan_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */
susan_S2 = 8.3333337680e-03f, /* 0x3c088889 */
susan_S3 = -1.9841270114e-04f, /* 0xb9500d01 */
susan_S4 = 2.7557314297e-06f, /* 0x3638ef1b */
susan_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */
susan_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */
float
susan___kernel_sinf(float x, float y, int iy) {
float z, r, v;
int32_t ix;
GET_FLOAT_WORD(ix, x);
ix &= 0x7fffffff; /* high word of x */
if (ix < 0x32000000) { /* |x| < 2**-27 */
if ((int) x == 0)
return x; /* generate inexact */
}
z = x * x;
v = z * x;
r = susan_S2 +
z * (susan_S3 + z * (susan_S4 + z * (susan_S5 + z * susan_S6)));
if (iy == 0)
return x + v * (susan_S1 + z * r);
else
return x - ((z * (susan_half * y - v * r) - y) - v * susan_S1);
}
/* s_atanf.c -- float version of s_atan.c.
Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: s_atanf.c,v 1.4 1995/05/10 20:46:47 jtc Exp $";
#endif
static const float susan_atanhi[] = {
4.6364760399e-01f, /* atan(0.5)hi 0x3eed6338 */
7.8539812565e-01f, /* atan(1.0)hi 0x3f490fda */
9.8279368877e-01f, /* atan(1.5)hi 0x3f7b985e */
1.5707962513e+00f, /* atan(inf)hi 0x3fc90fda */
};
static const float susan_atanlo[] = {
5.0121582440e-09f, /* atan(0.5)lo 0x31ac3769 */
3.7748947079e-08f, /* atan(1.0)lo 0x33222168 */
3.4473217170e-08f, /* atan(1.5)lo 0x33140fb4 */
7.5497894159e-08f, /* atan(inf)lo 0x33a22168 */
};
static const float susan_aT[] = {
3.3333334327e-01f, /* 0x3eaaaaaa */
-2.0000000298e-01f, /* 0xbe4ccccd */
1.4285714924e-01f, /* 0x3e124925 */
-1.1111110449e-01f, /* 0xbde38e38 */
9.0908870101e-02f, /* 0x3dba2e6e */
-7.6918758452e-02f, /* 0xbd9d8795 */
6.6610731184e-02f, /* 0x3d886b35 */
-5.8335702866e-02f, /* 0xbd6ef16b */
4.9768779427e-02f, /* 0x3d4bda59 */
-3.6531571299e-02f, /* 0xbd15a221 */
1.6285819933e-02f, /* 0x3c8569d7 */
};
float
susan___atanf(float x) {
float w, s1, s2, z;
int32_t ix, hx, id;
GET_FLOAT_WORD(hx, x);
ix = hx & 0x7fffffff;
if (ix >= 0x50800000) { /* if |x| >= 2^34 */
if (ix > 0x7f800000)
return x + x; /* NaN */
if (hx > 0)
return susan_atanhi[3] + susan_atanlo[3];
else
return -susan_atanhi[3] - susan_atanlo[3];
}
if (ix < 0x3ee00000) { /* |x| < 0.4375 */
if (ix < 0x31000000) { /* |x| < 2^-29 */
if (susan_huge + x > susan_one)
return x; /* raise inexact */
}
id = -1;
} else {
x = fabsf(x);
if (ix < 0x3f980000) { /* |x| < 1.1875 */
if (ix < 0x3f300000) { /* 7/16 <=|x|<11/16 */
id = 0;
x = ((float) 2.0f * x - susan_one) / ((float) 2.0f + x);
} else { /* 11/16<=|x|< 19/16 */
id = 1;
x = (x - susan_one) / (x + susan_one);
}
} else {
if (ix < 0x401c0000) { /* |x| < 2.4375 */
id = 2;
x = (x - (float) 1.5f) / (susan_one + (float) 1.5f * x);
} else { /* 2.4375 <= |x| < 2^66 */
id = 3;
x = -(float) 1.0f / x;
}
}
}
/* end of argument reduction */
z = x * x;
w = z * z;
/* break sum from i=0 to 10 aT[ i ]z**(i+1) into odd and even poly */
s1 = z *
(susan_aT[0] +
w * (susan_aT[2] +
w * (susan_aT[4] +
w * (susan_aT[6] + w * (susan_aT[8] + w * susan_aT[10])))));
s2 = w * (susan_aT[1] +
w * (susan_aT[3] +
w * (susan_aT[5] + w * (susan_aT[7] + w * susan_aT[9]))));
if (id < 0)
return x - x * (s1 + s2);
else {
z = susan_atanhi[id] - ((x * (s1 + s2) - susan_atanlo[id]) - x);
return (hx < 0) ? -z : z;
}
}
/* s_cosf.c -- float version of s_cos.c.
Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
float
susan___cosf(float x) {
float y[2], z = 0.0f;
int32_t n, ix;
GET_FLOAT_WORD(ix, x);
/* |x| ~< pi/4 */
ix &= 0x7fffffff;
if (ix <= 0x3f490fd8)
return susan___kernel_cosf(x, z);
/* cos(Inf or NaN) is NaN */
else if (ix >= 0x7f800000)
return x - x;
/* argument reduction needed */
else {
n = susan___ieee754_rem_pio2f(x, y);
switch (n & 3) {
case 0:
return susan___kernel_cosf(y[0], y[1]);
case 1:
return -susan___kernel_sinf(y[0], y[1], 1);
case 2:
return -susan___kernel_cosf(y[0], y[1]);
default:
return susan___kernel_sinf(y[0], y[1], 1);
}
}
}
/* s_sinf.c -- float version of s_sin.c.
Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
float
susan___sinf(float x) {
float y[2], z = 0.0;
int32_t n, ix;
GET_FLOAT_WORD(ix, x);
/* |x| ~< pi/4 */
ix &= 0x7fffffff;
if (ix <= 0x3f490fd8)
return susan___kernel_sinf(x, z, 0);
/* sin(Inf or NaN) is NaN */
else if (ix >= 0x7f800000)
return x - x;
/* argument reduction needed */
else {
n = susan___ieee754_rem_pio2f(x, y);
switch (n & 3) {
case 0:
return susan___kernel_sinf(y[0], y[1], 1);
case 1:
return susan___kernel_cosf(y[0], y[1]);
case 2:
return -susan___kernel_sinf(y[0], y[1], 1);
default:
return -susan___kernel_cosf(y[0], y[1]);
}
}
}
/* s_fabsf.c -- float version of s_fabs.c.
Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
/*
fabsf(x) returns the absolute value of x.
*/
float
susan___fabsf(float x) {
u_int32_t ix;
GET_FLOAT_WORD(ix, x);
SET_FLOAT_WORD(x, ix & 0x7fffffff);
return x;
}

View File

@ -0,0 +1,54 @@
#ifndef _WCCLIBM
#define _WCCLIBM
#define int32_t int
#define uint32_t unsigned int
#define u_int16_t unsigned short
#define u_int32_t unsigned int
// Often used variables/consts
#ifdef __STDC__
static const float
#else
static float
#endif
susan_one = 1.0f,
susan_half = 5.0000000000e-01f, /* 0x3f000000 */
susan_zero = 0.0f, susan_huge = 1.0e30,
susan_two8 = 2.5600000000e+02f, /* 0x43800000 */
susan_twon8 = 3.9062500000e-03f; /* 0x3b800000 */
// The following defines map the math functions to specialized calls
#define acos susan___ieee754_acosf
#define atan susan___atanf
#define cos susan___cosf
#define fabs susan___fabsf
#define fabsf susan___fabsf
#define isinf susan___isinff
#define pow susan___ieee754_powf
#define sqrt susan___ieee754_sqrtf
#define log10 susan___ieee754_log10f
#define log susan___ieee754_logf
#define sin susan___sinf
float susan___atanf(float x);
float susan___copysignf(float x, float y);
float susan___cosf(float x);
float susan___fabsf(float x);
float susan___floorf(float x);
float susan___ieee754_acosf(float x);
float susan___ieee754_powf(float x, float y);
int32_t susan___ieee754_rem_pio2f(float x, float *y);
float susan___ieee754_sqrtf(float x);
int susan___isinff(float x);
float susan___kernel_cosf(float x, float y);
float susan___kernel_sinf(float x, float y, int iy);
int susan___kernel_rem_pio2f(float *x, float *y, int e0, int nx, int prec,
const int32_t *ipio2);
float susan___scalbnf(float x, int n);
float susan___ieee754_logf(float x);
float susan___ieee754_log10f(float x);
float susan___sinf(float x);
#endif // _WCCLIBM

View File

@ -0,0 +1,56 @@
#include "wccmalloc.h"
// This must be redefined for each new benchmark
// Wasm loop bounds
__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void
__pragma_loopbound(unsigned int min_bound, unsigned int max_bound);
#define HEAP_SIZE 30000
char susan_simulated_heap[HEAP_SIZE];
unsigned int susan_freeHeapPos;
void *
susan_wccmalloc(unsigned int numberOfBytes) {
// Get a 4-byte adress for alignment purposes
unsigned int offset =
((unsigned long) susan_simulated_heap + susan_freeHeapPos) % 4;
if (offset)
susan_freeHeapPos += 4 - offset;
void *currentPos = (void *) &susan_simulated_heap[susan_freeHeapPos];
susan_freeHeapPos += numberOfBytes;
return currentPos;
}
void
susan_wccfreeall(void) {
susan_freeHeapPos = 0;
}
void *
susan_wccmemcpy(void *dstpp, const void *srcpp, unsigned int len) {
unsigned long int dstp = (long int) dstpp;
unsigned long int srcp = (long int) srcpp;
__pragma_loopbound(76, 76);
while (len > 0) {
char __x = ((char *) srcp)[0];
srcp += 1;
len -= 1;
((char *) dstp)[0] = __x;
dstp += 1;
}
return dstpp;
}
void
susan_wccmemset(void *p, int value, unsigned int num) {
unsigned long i;
char *char_ptr = (char *) p;
__pragma_loopbound(7220, 7220);
for (i = 0; i < num; ++i)
*char_ptr++ = (unsigned char) value;
}

View File

@ -0,0 +1,11 @@
#ifndef _WCCMALLOC_H
#define _WCCMALLOC_H
void *susan_wccmalloc(unsigned int numberOfBytes);
//! Frees ALL allocated memory space
void susan_wccfreeall(void);
void *susan_wccmemcpy(void *dstpp, const void *srcpp, unsigned int len);
void susan_wccmemset(void *p, int value, unsigned int num);
#endif

View File

@ -0,0 +1,610 @@
char susan_input[7292] = {
80, 53, 10, 35, 32, 67, 82, 69, 65, 84, 79, 82,
58, 32, 88, 86, 32, 86, 101, 114, 115, 105, 111, 110,
32, 51, 46, 49, 48, 97, 32, 32, 82, 101, 118, 58,
32, 49, 50, 47, 50, 57, 47, 57, 52, 32, 40, 80,
78, 71, 32, 112, 97, 116, 99, 104, 32, 49, 46, 50,
41, 10, 55, 54, 32, 57, 53, 10, 50, 53, 53, 10,
35, 36, 36, 36, 36, 38, 38, 36, 37, 37, 37, 38,
38, 36, 34, 38, 40, 41, 42, 40, 38, 36, 36, 35,
36, 35, 32, 35, 38, 42, 42, 38, 36, 36, 36, 37,
36, 35, 33, 33, 33, 32, 31, 33, 36, 39, 40, 36,
36, 34, 34, 36, 38, 39, 37, 36, 36, 35, 36, 39,
39, 37, 37, 39, 37, 38, 39, 40, 38, 37, 37, 33,
33, 32, 33, 34, 35, 35, 36, 36, 36, 37, 38, 37,
38, 38, 39, 41, 41, 40, 40, 43, 42, 41, 40, 39,
38, 35, 33, 35, 35, 37, 39, 38, 37, 36, 38, 36,
36, 34, 34, 38, 39, 39, 37, 36, 36, 34, 33, 34,
33, 35, 33, 36, 35, 35, 36, 36, 37, 33, 32, 36,
38, 38, 38, 39, 39, 38, 39, 37, 35, 36, 34, 35,
36, 37, 39, 38, 37, 34, 31, 34, 35, 35, 35, 35,
36, 38, 39, 39, 37, 38, 38, 40, 39, 40, 41, 43,
44, 42, 40, 39, 38, 42, 42, 39, 39, 36, 33, 33,
34, 36, 36, 35, 33, 33, 35, 37, 36, 34, 34, 31,
30, 32, 36, 42, 43, 43, 40, 36, 36, 36, 35, 34,
35, 33, 33, 30, 32, 34, 35, 35, 35, 36, 35, 37,
34, 34, 35, 36, 37, 37, 35, 36, 37, 39, 39, 38,
35, 35, 35, 35, 35, 36, 38, 37, 38, 38, 36, 35,
35, 36, 35, 35, 35, 35, 34, 34, 36, 36, 38, 40,
38, 37, 36, 34, 34, 35, 35, 36, 37, 37, 38, 38,
39, 39, 36, 35, 36, 35, 37, 36, 38, 39, 37, 38,
34, 33, 32, 33, 32, 28, 34, 40, 45, 44, 40, 38,
34, 30, 30, 33, 40, 45, 43, 41, 37, 37, 37, 36,
33, 31, 32, 31, 35, 35, 35, 35, 35, 38, 39, 39,
40, 39, 37, 37, 37, 35, 35, 37, 37, 36, 37, 37,
37, 38, 37, 38, 37, 37, 35, 35, 34, 35, 35, 35,
36, 39, 45, 43, 38, 39, 38, 36, 36, 36, 35, 37,
39, 38, 37, 37, 37, 39, 38, 37, 37, 35, 34, 34,
37, 39, 36, 37, 38, 39, 40, 41, 39, 36, 38, 39,
39, 39, 36, 33, 32, 30, 30, 31, 35, 35, 35, 35,
35, 39, 40, 38, 37, 40, 39, 38, 39, 39, 39, 38,
39, 39, 40, 40, 39, 41, 39, 41, 39, 38, 39, 38,
38, 36, 35, 36, 35, 37, 38, 38, 38, 40, 38, 39,
39, 36, 36, 33, 34, 36, 35, 37, 38, 39, 39, 38,
36, 32, 32, 35, 38, 38, 39, 38, 35, 35, 34, 37,
39, 38, 36, 35, 35, 33, 31, 30, 32, 36, 37, 38,
35, 35, 35, 35, 35, 39, 41, 42, 38, 33, 31, 33,
37, 36, 37, 38, 37, 37, 38, 39, 38, 38, 38, 38,
37, 38, 38, 39, 41, 41, 37, 39, 40, 42, 44, 43,
39, 42, 48, 45, 41, 39, 38, 38, 38, 38, 36, 37,
38, 39, 39, 39, 43, 41, 38, 37, 37, 38, 36, 34,
34, 34, 38, 41, 41, 38, 35, 35, 34, 35, 32, 30,
31, 33, 34, 35, 35, 35, 35, 35, 35, 39, 36, 35,
38, 41, 38, 32, 34, 38, 34, 38, 40, 39, 39, 36,
36, 39, 38, 39, 37, 38, 38, 36, 36, 35, 37, 38,
39, 38, 36, 38, 37, 35, 31, 35, 37, 40, 39, 35,
35, 36, 34, 36, 36, 38, 37, 38, 37, 37, 36, 37,
38, 37, 36, 35, 34, 34, 34, 37, 36, 37, 36, 34,
36, 36, 34, 31, 30, 33, 32, 33, 35, 35, 35, 35,
34, 27, 33, 39, 42, 41, 42, 44, 45, 42, 39, 41,
41, 42, 43, 42, 41, 40, 38, 37, 35, 37, 36, 36,
36, 37, 36, 36, 37, 37, 39, 43, 43, 43, 42, 39,
39, 39, 39, 40, 39, 38, 35, 34, 36, 37, 36, 37,
38, 38, 37, 36, 35, 35, 33, 35, 38, 38, 39, 41,
39, 38, 37, 38, 38, 36, 37, 36, 37, 37, 36, 36,
35, 35, 35, 35, 36, 42, 40, 41, 43, 42, 39, 37,
37, 37, 37, 39, 39, 38, 37, 35, 37, 36, 35, 36,
36, 39, 39, 36, 36, 34, 37, 40, 40, 40, 39, 41,
40, 39, 39, 39, 40, 38, 36, 34, 35, 37, 34, 36,
35, 35, 34, 33, 36, 36, 38, 39, 38, 37, 34, 34,
33, 34, 35, 36, 36, 35, 36, 35, 38, 39, 39, 40,
38, 37, 36, 36, 35, 35, 35, 35, 36, 36, 42, 45,
44, 43, 40, 38, 37, 36, 37, 37, 38, 38, 38, 38,
36, 35, 35, 34, 34, 36, 38, 36, 35, 38, 37, 37,
38, 38, 37, 38, 36, 33, 35, 37, 37, 38, 38, 41,
41, 41, 38, 35, 33, 30, 29, 32, 37, 39, 39, 38,
39, 38, 35, 34, 35, 35, 35, 35, 34, 35, 36, 36,
37, 38, 38, 38, 36, 35, 33, 34, 35, 35, 35, 35,
36, 36, 32, 33, 36, 38, 40, 42, 42, 39, 40, 41,
43, 42, 36, 33, 32, 33, 32, 35, 37, 41, 41, 39,
40, 37, 36, 38, 39, 41, 40, 40, 41, 39, 37, 37,
36, 37, 37, 36, 35, 37, 37, 39, 41, 41, 43, 41,
40, 40, 37, 37, 38, 38, 38, 38, 38, 36, 38, 37,
36, 39, 41, 41, 42, 41, 39, 38, 38, 36, 37, 37,
35, 35, 35, 36, 36, 33, 35, 37, 34, 35, 35, 35,
39, 38, 39, 41, 43, 43, 43, 42, 39, 38, 39, 37,
37, 38, 37, 36, 38, 38, 40, 38, 39, 39, 36, 35,
34, 33, 34, 36, 37, 38, 37, 37, 37, 36, 34, 34,
33, 34, 35, 38, 41, 38, 36, 37, 37, 37, 37, 39,
41, 40, 41, 42, 41, 40, 41, 41, 39, 40, 40, 39,
37, 37, 36, 38, 35, 35, 35, 36, 37, 45, 42, 40,
44, 45, 42, 43, 42, 42, 45, 47, 49, 51, 50, 51,
50, 49, 45, 45, 45, 43, 42, 42, 43, 41, 39, 40,
40, 40, 39, 38, 40, 40, 39, 39, 39, 38, 35, 33,
37, 41, 42, 39, 37, 37, 37, 38, 38, 36, 37, 35,
33, 32, 33, 34, 35, 35, 38, 39, 37, 38, 36, 35,
37, 38, 39, 42, 41, 38, 36, 34, 35, 35, 35, 35,
36, 39, 38, 36, 37, 37, 37, 36, 40, 42, 43, 47,
49, 48, 47, 44, 43, 47, 52, 55, 52, 47, 44, 42,
42, 42, 40, 40, 39, 38, 37, 37, 39, 38, 38, 38,
36, 33, 31, 34, 35, 38, 39, 38, 37, 38, 38, 37,
38, 37, 42, 46, 45, 42, 39, 39, 38, 34, 36, 39,
39, 37, 35, 36, 34, 37, 37, 36, 36, 39, 41, 42,
35, 35, 35, 35, 36, 40, 40, 38, 39, 39, 36, 36,
38, 39, 42, 46, 49, 50, 52, 52, 51, 51, 52, 54,
51, 50, 51, 52, 51, 47, 47, 46, 47, 45, 43, 43,
43, 43, 43, 42, 41, 41, 40, 40, 42, 46, 44, 41,
37, 36, 37, 39, 39, 38, 38, 39, 38, 38, 39, 37,
35, 35, 38, 38, 38, 36, 35, 35, 37, 35, 36, 38,
36, 38, 38, 39, 35, 35, 35, 36, 36, 39, 39, 40,
40, 39, 37, 38, 41, 39, 43, 46, 47, 49, 49, 49,
48, 48, 51, 52, 52, 53, 53, 52, 51, 52, 50, 48,
49, 48, 46, 47, 47, 44, 42, 43, 44, 43, 45, 48,
46, 45, 44, 42, 43, 46, 45, 44, 42, 41, 38, 39,
38, 37, 36, 35, 37, 35, 37, 36, 33, 31, 32, 38,
43, 42, 41, 39, 37, 38, 37, 37, 35, 35, 36, 36,
36, 38, 38, 36, 37, 39, 38, 39, 38, 39, 42, 47,
49, 46, 46, 47, 47, 46, 47, 49, 48, 48, 49, 51,
50, 49, 50, 51, 48, 46, 46, 47, 48, 47, 45, 43,
42, 44, 45, 47, 49, 51, 51, 51, 49, 47, 48, 47,
49, 46, 44, 40, 39, 40, 40, 39, 38, 40, 38, 39,
40, 39, 37, 36, 35, 33, 35, 34, 32, 33, 34, 38,
35, 36, 36, 36, 36, 35, 36, 38, 36, 37, 37, 37,
38, 38, 39, 43, 46, 51, 52, 50, 50, 48, 50, 49,
49, 50, 48, 50, 50, 49, 49, 51, 54, 54, 51, 51,
49, 47, 48, 52, 53, 51, 49, 46, 46, 43, 46, 45,
47, 50, 49, 47, 47, 46, 45, 48, 48, 45, 43, 44,
43, 43, 42, 41, 39, 39, 39, 37, 37, 34, 34, 32,
33, 35, 36, 39, 35, 36, 36, 36, 36, 40, 39, 36,
36, 35, 34, 33, 32, 37, 43, 51, 56, 54, 55, 56,
55, 52, 50, 49, 46, 46, 45, 47, 49, 51, 54, 54,
51, 49, 50, 50, 48, 47, 45, 46, 47, 50, 50, 48,
43, 42, 42, 43, 45, 47, 47, 48, 50, 49, 47, 47,
48, 49, 47, 48, 48, 47, 47, 45, 44, 42, 39, 38,
38, 38, 42, 41, 41, 39, 36, 35, 35, 35, 36, 36,
36, 34, 37, 37, 35, 36, 36, 35, 36, 37, 38, 41,
50, 67, 82, 84, 80, 80, 76, 75, 74, 71, 64, 61,
58, 54, 53, 54, 56, 56, 53, 51, 51, 49, 47, 49,
49, 48, 48, 47, 47, 48, 48, 47, 45, 46, 47, 46,
46, 45, 41, 42, 44, 44, 45, 45, 48, 47, 44, 42,
37, 35, 34, 32, 33, 37, 40, 37, 37, 36, 36, 37,
35, 35, 36, 36, 36, 37, 35, 37, 37, 37, 35, 35,
35, 37, 40, 41, 46, 58, 85, 119, -119, -123, 123, 115,
109, 110, 109, 107, 102, 95, 93, 88, 86, 86, 86, 86,
83, 77, 68, 64, 59, 58, 61, 61, 61, 58, 56, 51,
49, 51, 51, 50, 50, 45, 37, 41, 47, 50, 50, 53,
52, 49, 48, 45, 43, 42, 39, 38, 36, 38, 39, 39,
39, 38, 37, 36, 35, 35, 35, 36, 36, 34, 36, 36,
38, 39, 38, 37, 39, 41, 43, 47, 56, 79, 121, -106,
-110, -108, -99, -102, -100, -99, -101, -103, -102, -106, -108, -110,
-111, -111, -115, -117, -120, -123, -123, -125, -128, 127, 124, 118,
114, 119, 113, 104, 99, 100, 100, 97, 89, 83, 79, 76,
73, 69, 60, 52, 48, 47, 45, 46, 40, 37, 38, 38,
42, 45, 43, 42, 42, 39, 38, 39, 35, 35, 36, 36,
36, 37, 37, 40, 42, 42, 40, 39, 38, 40, 43, 49,
60, 83, 126, -105, -98, -93, -97, -94, -93, -90, -88, -91,
-94, -91, -90, -93, -94, -94, -96, -94, -94, -96, -95, -93,
-96, -100, -104, -104, -105, -108, -110, -115, -119, -120, -122, -125,
127, 122, 118, 115, 118, 113, 97, 78, 59, 45, 48, 46,
40, 38, 38, 37, 38, 38, 35, 37, 37, 34, 32, 32,
35, 36, 36, 36, 36, 38, 39, 38, 37, 38, 35, 34,
36, 35, 37, 41, 51, 77, 120, -100, -91, -96, -95, -93,
-92, -89, -90, -92, -92, -93, -93, -91, -90, -91, -94, -94,
-94, -93, -92, -93, -95, -95, -93, -94, -94, -91, -92, -94,
-93, -91, -92, -91, -92, -96, -97, -99, -105, -112, 126, 95,
63, 43, 47, 42, 38, 38, 36, 36, 36, 38, 37, 37,
37, 36, 37, 38, 35, 36, 36, 36, 36, 39, 39, 39,
41, 38, 33, 35, 37, 39, 45, 51, 58, 80, 121, -104,
-94, -93, -92, -94, -94, -91, -89, -89, -88, -86, -86, -88,
-87, -88, -90, -90, -91, -91, -89, -87, -90, -92, -92, -90,
-91, -91, -89, -89, -90, -92, -93, -91, -90, -91, -90, -91,
-91, -100, -128, 88, 54, 44, 47, 48, 46, 43, 41, 36,
37, 40, 38, 40, 38, 38, 37, 39, 35, 36, 36, 36,
36, 38, 41, 39, 37, 35, 32, 34, 36, 38, 42, 47,
57, 82, 118, -105, -88, -86, -84, -88, -91, -91, -91, -92,
-91, -89, -90, -89, -87, -88, -88, -89, -89, -91, -91, -91,
-92, -93, -92, -93, -97, -93, -93, -93, -92, -92, -94, -94,
-92, -94, -94, -91, -91, -98, -122, 96, 63, 53, 49, 44,
42, 42, 41, 38, 36, 37, 36, 37, 38, 39, 38, 40,
35, 36, 36, 36, 36, 34, 36, 35, 37, 39, 40, 43,
41, 41, 44, 48, 56, 83, -127, -99, -89, -88, -87, -88,
-89, -87, -89, -90, -90, -89, -91, -91, -89, -87, -88, -87,
-89, -88, -89, -88, -90, -89, -87, -88, -92, -91, -88, -89,
-88, -87, -89, -91, -93, -95, -97, -94, -93, -99, -125, 91,
59, 45, 45, 47, 43, 42, 39, 36, 36, 36, 40, 38,
39, 39, 37, 36, 36, 36, 36, 36, 36, 34, 37, 38,
39, 40, 43, 43, 43, 43, 40, 43, 56, 87, -127, -100,
-94, -95, -91, -88, -90, -89, -90, -92, -88, -88, -90, -88,
-90, -90, -89, -89, -91, -91, -92, -92, -91, -90, -89, -89,
-92, -90, -90, -92, -91, -89, -90, -91, -91, -95, -94, -92,
-93, -99, -124, 92, 61, 48, 47, 49, 45, 44, 41, 38,
37, 37, 38, 34, 35, 35, 35, 35, 36, 36, 36, 36,
36, 40, 39, 36, 34, 35, 35, 37, 37, 40, 49, 56,
62, 89, -124, -99, -93, -88, -88, -92, -90, -87, -88, -89,
-87, -88, -89, -88, -87, -88, -89, -89, -87, -88, -88, -87,
-89, -92, -91, -92, -92, -91, -91, -90, -89, -89, -89, -90,
-92, -93, -91, -87, -86, -96, -127, 90, 60, 45, 44, 43,
36, 36, 37, 39, 38, 40, 40, 37, 36, 36, 33, 35,
36, 36, 36, 36, 36, 34, 34, 34, 33, 34, 34, 35,
37, 40, 42, 41, 50, 80, -127, -96, -92, -89, -85, -88,
-91, -88, -88, -89, -87, -90, -90, -89, -89, -90, -91, -90,
-89, -87, -86, -87, -89, -90, -91, -93, -93, -93, -91, -91,
-90, -90, -91, -92, -91, -92, -89, -87, -88, -96, -123, 96,
65, 48, 47, 45, 38, 37, 37, 37, 37, 39, 39, 37,
38, 36, 35, 35, 36, 36, 36, 36, 36, 40, 41, 40,
41, 42, 42, 41, 39, 39, 45, 53, 66, 100, -111, -86,
-86, -87, -80, -86, -92, -88, -86, -87, -84, -83, -86, -86,
-85, -85, -86, -84, -84, -88, -90, -87, -88, -88, -88, -88,
-90, -89, -89, -89, -89, -89, -88, -87, -88, -90, -87, -88,
-90, -98, -127, 93, 69, 50, 50, 51, 43, 44, 43, 41,
37, 37, 40, 38, 38, 37, 36, 38, 36, 36, 36, 36,
36, 36, 38, 39, 40, 39, 40, 39, 42, 46, 49, 52,
62, 90, -123, -101, -100, -98, -94, -90, -88, -87, -89, -90,
-89, -88, -88, -87, -86, -87, -86, -86, -87, -85, -85, -88,
-89, -88, -89, -88, -89, -90, -89, -90, -90, -91, -90, -89,
-91, -91, -91, -90, -92, -99, -126, 93, 61, 45, 49, 48,
43, 41, 38, 37, 36, 38, 38, 37, 36, 35, 35, 39,
36, 36, 36, 36, 37, 41, 42, 40, 41, 41, 38, 40,
42, 42, 45, 50, 61, 91, -121, -94, -93, -96, -94, -94,
-93, -91, -91, -93, -90, -88, -92, -90, -87, -87, -89, -88,
-87, -89, -89, -90, -93, -96, -94, -91, -89, -88, -88, -90,
-90, -89, -91, -92, -93, -91, -91, -92, -91, -101, 122, 84,
60, 48, 52, 46, 34, 36, 36, 37, 34, 34, 37, 34,
32, 33, 34, 37, 36, 36, 36, 37, 37, 36, 39, 39,
41, 40, 41, 40, 39, 42, 44, 49, 62, 92, -124, -96,
-84, -81, -86, -87, -89, -90, -91, -92, -90, -88, -89, -91,
-90, -89, -89, -89, -90, -89, -86, -88, -89, -89, -90, -88,
-90, -91, -91, -92, -92, -92, -91, -91, -93, -95, -94, -93,
-93, -101, 125, 86, 61, 47, 47, 49, 45, 44, 44, 43,
44, 45, 44, 42, 41, 38, 35, 38, 37, 37, 37, 37,
37, 39, 40, 40, 42, 44, 42, 43, 47, 45, 44, 50,
66, 99, -111, -93, -97, -96, -92, -89, -89, -89, -87, -88,
-86, -87, -90, -88, -88, -88, -87, -87, -88, -91, -93, -91,
-92, -89, -86, -84, -83, -83, -87, -90, -91, -90, -91, -92,
-93, -94, -97, -96, -97, -107, 119, 79, 53, 39, 39, 38,
37, 40, 38, 38, 37, 38, 40, 41, 39, 38, 36, 36,
37, 37, 37, 37, 37, 40, 39, 40, 40, 40, 40, 38,
39, 43, 44, 48, 59, 95, -121, -103, -96, -95, -97, -94,
-92, -90, -90, -90, -88, -85, -88, -89, -88, -89, -91, -92,
-92, -91, -90, -88, -88, -88, -90, -91, -92, -91, -89, -93,
-93, -92, -92, -91, -93, -94, -94, -94, -93, -105, 118, 79,
52, 38, 36, 40, 41, 41, 42, 39, 38, 40, 40, 39,
39, 39, 37, 38, 37, 37, 37, 37, 37, 41, 42, 40,
41, 43, 43, 45, 43, 42, 43, 47, 62, 95, -120, -93,
-92, -96, -92, -94, -92, -91, -88, -88, -89, -90, -91, -88,
-88, -89, -88, -91, -93, -92, -91, -90, -89, -90, -89, -91,
-90, -90, -94, -95, -95, -94, -91, -87, -83, -87, -88, -89,
-94, -106, 117, 79, 60, 51, 45, 40, 37, 38, 38, 36,
34, 33, 34, 34, 33, 35, 37, 36, 37, 37, 37, 37,
37, 36, 40, 38, 39, 40, 41, 38, 40, 43, 48, 52,
62, 96, -120, -103, -99, -94, -95, -93, -92, -90, -89, -90,
-91, -90, -92, -95, -95, -94, -94, -92, -92, -93, -93, -92,
-91, -90, -92, -94, -93, -92, -89, -91, -89, -87, -88, -91,
-97, -98, -95, -94, -94, -104, 123, 86, 61, 48, 46, 47,
40, 38, 37, 34, 36, 35, 39, 41, 40, 39, 37, 37,
37, 37, 37, 37, 37, 39, 39, 40, 39, 40, 42, 41,
40, 43, 42, 43, 52, 85, 125, -106, -92, -98, -96, -84,
-82, -87, -86, -85, -86, -86, -90, -88, -88, -87, -87, -92,
-93, -93, -93, -90, -91, -92, -89, -89, -89, -89, -91, -91,
-93, -93, -94, -93, -92, -94, -94, -91, -92, -100, 123, 79,
57, 47, 45, 47, 40, 37, 36, 35, 38, 37, 39, 40,
38, 39, 36, 35, 37, 37, 37, 37, 37, 41, 38, 33,
31, 37, 44, 44, 44, 46, 48, 52, 64, 96, -117, -98,
-103, -99, -97, -96, -97, -97, -94, -89, -85, -90, -91, -89,
-89, -89, -88, -87, -86, -90, -92, -91, -93, -91, -92, -92,
-91, -93, -92, -92, -92, -91, -94, -94, -94, -95, -93, -98,
-102, -110, 117, 83, 55, 40, 46, 48, 44, 42, 39, 40,
37, 39, 40, 38, 38, 38, 39, 42, 37, 37, 37, 37,
38, 39, 40, 41, 41, 41, 41, 40, 42, 46, 47, 52,
65, 102, -114, -102, -97, -100, -95, -83, -88, -91, -89, -91,
-91, -89, -89, -88, -90, -89, -88, -88, -88, -89, -92, -90,
-90, -90, -90, -92, -94, -95, -94, -93, -92, -90, -90, -92,
-92, -94, -92, -92, -96, -108, 116, 76, 57, 50, 47, 42,
38, 41, 42, 41, 37, 36, 37, 36, 36, 37, 35, 35,
37, 37, 37, 37, 38, 39, 40, 41, 39, 41, 40, 36,
34, 37, 39, 42, 61, 100, -113, -90, -97, -96, -90, -87,
-88, -90, -91, -93, -89, -91, -91, -90, -90, -91, -91, -89,
-87, -90, -91, -89, -90, -89, -90, -90, -92, -92, -92, -91,
-91, -89, -90, -92, -90, -92, -93, -93, -96, -107, 119, 81,
48, 37, 40, 44, 45, 41, 40, 38, 36, 37, 38, 37,
37, 37, 36, 35, 37, 37, 37, 37, 39, 47, 50, 45,
40, 41, 40, 41, 42, 44, 48, 53, 64, 98, -116, -95,
-96, -97, -87, -83, -87, -87, -88, -87, -86, -86, -87, -91,
-95, -94, -92, -88, -89, -90, -90, -88, -87, -88, -90, -94,
-92, -93, -91, -89, -89, -87, -86, -87, -90, -92, -92, -91,
-92, -100, 125, 79, 52, 51, 54, 50, 47, 47, 47, 46,
45, 46, 44, 40, 36, 34, 34, 34, 37, 37, 37, 37,
38, 41, 42, 42, 39, 39, 37, 35, 39, 46, 52, 53,
68, 101, -119, -101, -101, -101, -93, -90, -89, -88, -88, -88,
-85, -89, -90, -89, -91, -93, -92, -90, -90, -90, -91, -91,
-90, -91, -93, -91, -92, -92, -89, -90, -91, -92, -95, -95,
-94, -95, -95, -96, -97, -110, 116, 81, 54, 48, 52, 51,
49, 45, 47, 46, 43, 44, 43, 38, 35, 35, 34, 36,
37, 37, 37, 37, 39, 43, 43, 41, 40, 42, 41, 41,
40, 40, 44, 50, 68, 106, -112, -93, -93, -95, -92, -94,
-93, -90, -89, -90, -88, -90, -89, -88, -89, -89, -89, -86,
-88, -91, -92, -92, -91, -92, -91, -91, -92, -91, -92, -90,
-90, -91, -88, -87, -90, -92, -91, -91, -92, -104, 121, 80,
54, 43, 45, 46, 41, 41, 40, 38, 38, 38, 37, 37,
37, 37, 39, 40, 37, 37, 37, 37, 37, 39, 39, 40,
38, 40, 41, 40, 41, 43, 46, 52, 69, 105, -112, -92,
-95, -94, -90, -94, -94, -92, -91, -90, -91, -90, -90, -90,
-90, -89, -88, -89, -90, -90, -93, -94, -93, -92, -91, -91,
-92, -94, -91, -91, -89, -89, -93, -95, -96, -97, -96, -96,
-96, -106, 121, 86, 54, 47, 53, 50, 48, 43, 40, 39,
37, 40, 40, 38, 38, 36, 37, 37, 37, 37, 37, 37,
37, 39, 38, 38, 38, 38, 37, 37, 39, 41, 42, 45,
62, 104, -112, -93, -87, -91, -92, -92, -91, -89, -91, -89,
-90, -88, -86, -88, -90, -91, -91, -90, -91, -91, -91, -90,
-89, -90, -89, -90, -93, -91, -92, -92, -91, -92, -91, -91,
-94, -94, -92, -93, -92, -103, 124, 92, 65, 49, 47, 45,
39, 40, 40, 40, 37, 37, 37, 37, 41, 41, 38, 38,
37, 37, 37, 37, 38, 46, 42, 42, 40, 41, 41, 37,
39, 43, 49, 59, 78, 112, -105, -88, -94, -93, -96, -95,
-92, -90, -88, -90, -91, -90, -88, -89, -90, -89, -90, -91,
-90, -91, -93, -93, -92, -92, -91, -91, -90, -92, -92, -92,
-93, -92, -92, -92, -94, -94, -94, -94, -93, -107, 116, 77,
48, 43, 47, 43, 41, 40, 39, 38, 38, 42, 40, 38,
37, 34, 34, 34, 36, 37, 37, 37, 37, 41, 41, 38,
38, 39, 40, 39, 39, 40, 40, 45, 63, 102, -117, -98,
-92, -88, -87, -91, -90, -89, -90, -91, -93, -90, -83, -85,
-87, -88, -90, -91, -93, -92, -93, -91, -89, -89, -89, -91,
-94, -92, -91, -90, -92, -92, -92, -93, -91, -89, -90, -89,
-87, -99, 126, 86, 54, 43, 45, 46, 42, 40, 38, 36,
34, 34, 36, 34, 35, 34, 35, 36, 36, 37, 37, 37,
38, 43, 40, 38, 38, 40, 41, 40, 41, 41, 42, 50,
74, 113, -113, -98, -95, -88, -88, -90, -91, -90, -90, -92,
-91, -88, -86, -87, -86, -86, -89, -91, -92, -92, -91, -88,
-90, -93, -95, -97, -97, -95, -94, -93, -92, -92, -92, -93,
-94, -94, -96, -95, -96, -111, 111, 73, 42, 39, 50, 45,
41, 40, 38, 38, 39, 41, 38, 35, 35, 33, 30, 28,
36, 37, 37, 37, 37, 37, 40, 38, 40, 41, 41, 43,
42, 40, 42, 49, 74, 119, -100, -88, -94, -93, -90, -94,
-94, -91, -89, -89, -90, -89, -88, -93, -94, -91, -89, -87,
-90, -96, -98, -96, -94, -94, -92, -92, -92, -89, -88, -89,
-91, -90, -89, -88, -86, -87, -90, -93, -95, -110, 113, 79,
59, 52, 43, 38, 38, 38, 41, 41, 39, 41, 42, 41,
40, 40, 40, 39, 37, 37, 37, 37, 37, 39, 38, 40,
40, 42, 40, 41, 43, 47, 50, 53, 74, 112, -114, -99,
-95, -92, -94, -95, -95, -92, -90, -91, -88, -85, -89, -88,
-87, -88, -89, -89, -91, -91, -90, -88, -91, -94, -93, -93,
-93, -94, -93, -91, -90, -90, -92, -93, -94, -92, -94, -94,
-95, -110, 113, 78, 52, 46, 49, 45, 43, 42, 43, 41,
39, 41, 40, 38, 38, 35, 37, 39, 37, 37, 37, 37,
37, 35, 38, 38, 41, 42, 39, 42, 43, 44, 46, 55,
80, 119, -108, -99, -95, -91, -90, -95, -95, -92, -90, -94,
-94, -89, -88, -92, -91, -91, -93, -93, -93, -93, -91, -89,
-90, -93, -91, -89, -88, -89, -88, -89, -92, -93, -93, -93,
-92, -92, -95, -95, -97, -113, 108, 67, 48, 46, 41, 41,
42, 39, 39, 37, 36, 38, 38, 36, 37, 39, 38, 39,
37, 37, 37, 37, 36, 32, 34, 36, 38, 38, 38, 38,
41, 42, 44, 50, 67, 115, -98, -89, -94, -93, -87, -86,
-91, -90, -92, -93, -92, -89, -91, -92, -90, -92, -92, -91,
-90, -90, -89, -87, -90, -93, -92, -92, -95, -94, -94, -93,
-91, -92, -94, -95, -96, -93, -93, -92, -95, -112, 107, 73,
56, 45, 45, 44, 41, 41, 39, 38, 37, 39, 39, 37,
38, 37, 39, 41, 37, 37, 37, 37, 37, 40, 39, 41,
42, 42, 39, 39, 43, 47, 49, 56, 76, 112, -112, -102,
-90, -78, -88, -93, -92, -92, -90, -89, -91, -88, -86, -90,
-88, -87, -89, -91, -90, -90, -89, -90, -90, -88, -90, -89,
-89, -89, -87, -90, -91, -90, -90, -88, -90, -92, -93, -93,
-97, -112, 108, 71, 52, 48, 51, 48, 45, 40, 40, 41,
42, 42, 41, 39, 41, 42, 39, 37, 37, 37, 37, 37,
37, 38, 39, 40, 40, 40, 40, 42, 45, 46, 45, 51,
72, 121, -98, -99, -100, -95, -93, -96, -95, -93, -90, -90,
-87, -89, -89, -90, -89, -90, -90, -89, -92, -94, -90, -91,
-91, -91, -90, -89, -90, -88, -90, -92, -91, -92, -93, -94,
-96, -94, -94, -95, -97, -113, 106, 71, 52, 48, 46, 45,
45, 41, 37, 33, 33, 35, 35, 37, 38, 37, 36, 35,
37, 37, 37, 37, 37, 37, 37, 38, 39, 39, 39, 40,
42, 40, 42, 50, 73, 114, -107, -96, -100, -97, -100, -103,
-101, -97, -92, -89, -89, -87, -85, -88, -89, -87, -87, -88,
-88, -89, -91, -92, -89, -86, -86, -84, -86, -86, -90, -94,
-94, -93, -93, -94, -94, -93, -92, -94, -99, -115, 106, 72,
60, 59, 57, 55, 48, 42, 39, 37, 37, 39, 37, 37,
38, 37, 35, 33, 37, 37, 37, 37, 38, 45, 43, 42,
39, 36, 35, 34, 38, 40, 42, 50, 76, 115, -110, -97,
-89, -88, -92, -95, -94, -91, -90, -88, -86, -87, -88, -87,
-86, -88, -88, -88, -91, -90, -89, -90, -89, -89, -91, -90,
-91, -90, -91, -93, -93, -93, -95, -97, -96, -92, -94, -97,
-100, -118, 106, 72, 54, 50, 48, 47, 46, 44, 40, 36,
38, 40, 42, 41, 40, 38, 36, 38, 37, 37, 37, 37,
37, 39, 41, 41, 41, 40, 41, 45, 47, 47, 46, 53,
77, 119, -102, -90, -94, -89, -88, -94, -90, -87, -86, -85,
-87, -87, -85, -86, -86, -87, -88, -90, -90, -91, -91, -91,
-93, -91, -91, -92, -93, -93, -92, -94, -93, -90, -91, -92,
-92, -91, -94, -96, -95, -105, 114, 74, 57, 51, 50, 53,
47, 42, 39, 37, 41, 46, 46, 43, 40, 35, 31, 29,
37, 37, 37, 37, 38, 39, 37, 38, 39, 40, 41, 40,
43, 46, 48, 57, 89, -126, -102, -97, -96, -93, -96, -92,
-89, -89, -91, -94, -90, -91, -90, -88, -88, -90, -90, -90,
-92, -93, -93, -92, -90, -89, -90, -89, -91, -93, -91, -92,
-93, -92, -94, -95, -92, -92, -95, -99, -100, -116, 103, 70,
54, 52, 54, 49, 46, 43, 40, 36, 35, 39, 41, 37,
38, 38, 38, 37, 37, 37, 37, 38, 38, 42, 43, 41,
41, 41, 45, 45, 44, 44, 46, 56, 86, 119, -113, -96,
-91, -78, -83, -90, -90, -90, -89, -91, -92, -92, -90, -88,
-89, -91, -91, -90, -89, -89, -88, -88, -90, -90, -92, -92,
-92, -90, -90, -94, -93, -91, -91, -92, -94, -91, -90, -95,
-100, -121, 91, 58, 49, 49, 47, 45, 44, 44, 43, 41,
40, 40, 37, 35, 35, 36, 35, 34, 37, 37, 38, 38,
38, 42, 38, 37, 38, 37, 37, 40, 45, 45, 44, 54,
84, 123, -106, -96, -95, -96, -99, -97, -96, -92, -91, -92,
-91, -92, -95, -94, -93, -92, -91, -89, -91, -92, -91, -91,
-92, -94, -92, -88, -89, -91, -91, -93, -94, -92, -93, -92,
-93, -92, -94, -95, -97, -118, 95, 55, 33, 34, 37, 37,
34, 33, 33, 31, 34, 36, 36, 34, 35, 36, 37, 38,
37, 37, 38, 38, 38, 40, 40, 42, 43, 43, 41, 41,
40, 43, 43, 50, 77, 116, -110, -84, -81, -87, -91, -94,
-91, -88, -88, -89, -88, -88, -88, -85, -88, -89, -88, -88,
-89, -92, -91, -93, -92, -92, -94, -94, -93, -93, -94, -96,
-95, -91, -89, -88, -91, -92, -94, -98, -100, -122, 91, 57,
43, 46, 41, 33, 36, 36, 38, 39, 39, 38, 33, 33,
34, 34, 34, 35, 37, 38, 38, 38, 39, 44, 43, 44,
45, 44, 40, 40, 42, 40, 46, 60, 93, -127, -103, -88,
-87, -94, -93, -96, -97, -94, -89, -90, -89, -88, -90, -90,
-91, -92, -90, -90, -91, -93, -94, -94, -94, -94, -93, -91,
-94, -96, -95, -98, -97, -94, -94, -95, -99, -98, -95, -95,
-101, -121, 95, 58, 42, 39, 44, 44, 39, 37, 41, 42,
41, 41, 37, 33, 33, 32, 33, 33, 37, 38, 38, 38,
38, 39, 41, 44, 44, 47, 46, 44, 41, 39, 40, 52,
85, 127, -102, -88, -82, -87, -92, -94, -91, -90, -91, -92,
-91, -89, -91, -92, -91, -89, -87, -86, -89, -91, -92, -93,
-93, -92, -95, -98, -95, -90, -87, -90, -92, -93, -94, -98,
-99, -97, -97, -96, -98, -114, 106, 65, 40, 42, 41, 39,
41, 41, 43, 46, 45, 43, 40, 38, 39, 40, 40, 39,
37, 38, 38, 38, 38, 34, 37, 39, 42, 42, 41, 42,
41, 42, 44, 58, 88, 124, -109, -98, -95, -96, -97, -95,
-95, -95, -96, -94, -91, -90, -92, -91, -90, -90, -89, -87,
-89, -92, -94, -95, -96, -95, -94, -94, -97, -98, -97, -97,
-96, -95, -96, -95, -98, -99, -98, -97, -100, -121, 90, 52,
37, 36, 39, 41, 39, 39, 40, 38, 35, 33, 34, 35,
34, 36, 36, 35, 37, 38, 38, 38, 38, 40, 39, 40,
39, 40, 44, 46, 49, 53, 53, 53, 73, 108, -114, -96,
-96, -99, -100, -99, -96, -94, -95, -93, -89, -84, -88, -91,
-91, -93, -97, -97, -98, -97, -93, -92, -92, -92, -95, -95,
-94, -92, -91, -94, -96, -96, -94, -94, -94, -92, -93, -94,
-96, -115, 103, 64, 36, 38, 45, 42, 44, 41, 41, 41,
37, 38, 42, 45, 46, 43, 39, 33, 37, 38, 38, 38,
38, 42, 42, 38, 36, 35, 34, 36, 40, 39, 39, 49,
82, -123, -95, -91, -87, -89, -93, -94, -95, -94, -95, -94,
-91, -92, -93, -92, -92, -94, -95, -95, -96, -94, -94, -94,
-93, -94, -92, -90, -92, -90, -91, -93, -92, -92, -91, -91,
-93, -93, -93, -93, -98, -122, 90, 54, 40, 40, 41, 40,
38, 36, 36, 36, 39, 42, 43, 41, 38, 38, 36, 36,
37, 38, 38, 38, 38, 41, 40, 37, 36, 38, 42, 42,
41, 44, 41, 48, 73, 116, -103, -88, -87, -92, -96, -95,
-93, -91, -87, -85, -88, -85, -89, -93, -91, -88, -87, -85,
-87, -89, -91, -93, -92, -92, -92, -91, -94, -90, -91, -93,
-93, -94, -92, -92, -95, -93, -92, -93, -96, -116, 104, 66,
40, 39, 37, 39, 42, 43, 43, 40, 38, 37, 36, 36,
34, 34, 35, 35, 37, 38, 38, 38, 38, 41, 41, 38,
37, 36, 35, 37, 42, 44, 46, 58, 91, -120, -98, -99,
-94, -89, -93, -92, -92, -93, -93, -93, -91, -89, -88, -85,
-86, -88, -89, -87, -89, -88, -90, -94, -93, -94, -94, -91,
-90, -86, -90, -94, -94, -96, -95, -95, -94, -93, -92, -91,
-97, -123, 91, 58, 48, 52, 48, 44, 43, 43, 41, 36,
38, 42, 43, 39, 37, 34, 31, 32, 37, 38, 38, 38,
38, 41, 40, 37, 41, 42, 41, 43, 41, 39, 45, 60,
92, -123, -102, -102, -99, -99, -97, -92, -93, -93, -94, -94,
-96, -93, -89, -92, -91, -90, -89, -90, -88, -90, -90, -91,
-92, -92, -92, -92, -94, -90, -90, -90, -91, -91, -91, -93,
-94, -91, -92, -95, -103, -127, 92, 59, 49, 56, 53, 55,
51, 50, 48, 43, 39, 36, 35, 35, 34, 33, 34, 37,
37, 38, 38, 38, 38, 38, 39, 38, 40, 41, 40, 42,
45, 45, 47, 64, 100, -118, -104, -102, -93, -95, -92, -96,
-97, -96, -96, -94, -92, -89, -90, -93, -93, -96, -97, -94,
-96, -96, -97, -98, -97, -96, -94, -94, -95, -92, -95, -94,
-94, -95, -94, -95, -96, -95, -94, -94, -97, -118, 102, 70,
53, 53, 55, 52, 54, 52, 47, 41, 38, 39, 40, 36,
37, 37, 35, 36, 37, 38, 38, 38, 38, 40, 39, 40,
41, 39, 33, 33, 36, 40, 51, 64, 84, 125, -102, -87,
-81, -92, -98, -101, -98, -97, -95, -95, -95, -94, -94, -98,
-97, -94, -93, -93, -93, -92, -91, -92, -93, -93, -93, -93,
-95, -94, -94, -96, -94, -91, -91, -95, -94, -95, -98, -98,
-102, -119, 101, 71, 55, 47, 47, 48, 51, 52, 45, 38,
34, 30, 34, 34, 32, 34, 34, 37, 37, 37, 38, 38,
38, 41, 42, 41, 39, 41, 39, 37, 37, 37, 44, 66,
105, -118, -105, -107, -106, -102, -101, -102, -100, -101, -101, -99,
-98, -96, -96, -98, -94, -94, -95, -94, -96, -97, -97, -96,
-96, -95, -96, -94, -96, -99, -95, -96, -98, -100, -98, -97,
-97, -94, -93, -97, -107, 123, 83, 54, 41, 45, 48, 45,
46, 44, 43, 40, 36, 39, 36, 37, 38, 40, 41, 40,
37, 37, 38, 38, 38, 40, 40, 43, 43, 41, 40, 42,
42, 40, 44, 61, 90, 121, -122, -121, -117, -113, -111, -108,
-104, -104, -105, -106, -106, -102, -103, -106, -106, -107, -106, -106,
-104, -103, -101, -100, -99, -98, -99, -100, -101, -98, -95, -94,
-94, -93, -95, -95, -97, -97, -98, -97, -97, -115, 98, 58,
40, 42, 46, 46, 47, 48, 45, 43, 42, 40, 39, 36,
34, 35, 36, 38, 37, 37, 37, 38, 38, 37, 41, 41,
42, 43, 40, 41, 40, 40, 42, 51, 68, 78, 81, 81,
81, 85, 85, 87, 88, 89, 93, 96, 97, 100, 98, 101,
105, 109, 110, 113, 116, 116, 117, 118, 119, 120, 121, 126,
-126, -126, -123, -120, -118, -117, -115, -114, -113, -110, -106, -108,
-115, 117, 81, 52, 40, 42, 47, 48, 48, 45, 42, 38,
34, 37, 34, 36, 37, 39, 39, 38, 37, 37, 37, 38,
38, 38, 37, 39, 41, 39, 42, 42, 40, 41, 43, 53,
69, 71, 66, 65, 61, 57, 57, 58, 60, 62, 65, 64,
68, 76, 71, 67, 68, 69, 75, 82, 87, 85, 85, 86,
87, 92, 94, 94, 96, 90, 91, 95, 101, 109, 109, 114,
115, 119, 123, 121, 117, 104, 77, 50, 37, 32, 30, 24,
27, 35, 39, 39, 36, 38, 36, 37, 36, 34, 33, 32,
37, 37, 37, 37, 38, 37, 41, 40, 41, 43, 41, 39,
38, 40, 43, 49, 53, 52, 50, 50, 51, 51, 52, 54,
49, 46, 50, 48, 47, 51, 51, 50, 48, 50, 50, 50,
50, 50, 51, 51, 52, 52, 56, 57, 58, 59, 57, 56,
56, 55, 52, 53, 56, 59, 60, 61, 62, 59, 54, 54,
51, 47, 50, 47, 45, 44, 43, 40, 37, 37, 37, 39,
43, 45, 43, 39, 36, 37, 37, 37, 39, 46, 41, 38,
40, 40, 39, 40, 40, 38, 43, 49, 54, 54, 52, 52,
49, 47, 47, 50, 48, 49, 52, 49, 50, 51, 48, 48,
49, 49, 49, 51, 50, 46, 46, 50, 49, 52, 52, 47,
48, 51, 52, 48, 50, 52, 47, 45, 46, 45, 48, 49,
50, 48, 44, 45, 48, 50, 47, 43, 44, 44, 44, 43,
43, 43, 41, 41, 41, 38, 36, 36, 36, 37, 37, 37,
37, 41, 41, 39, 38, 38, 36, 36, 37, 39, 44, 48,
50, 50, 50, 52, 52, 52, 52, 53, 50, 46, 46, 46,
42, 43, 46, 45, 44, 46, 46, 45, 43, 45, 46, 50,
51, 50, 51, 50, 49, 51, 51, 50, 51, 50, 49, 47,
49, 49, 50, 52, 50, 48, 45, 46, 47, 47, 48, 47,
45, 44, 45, 42, 38, 37, 35, 31, 29, 31, 33, 35,
36, 36, 37, 37, 37, 39, 39, 40, 41, 42, 39, 37,
37, 36, 40, 44, 48, 47, 45, 46, 49, 49, 49, 50,
47, 48, 49, 48, 45, 47, 47, 49, 51, 53, 51, 49,
48, 46, 44, 44, 43, 44, 46, 48, 49, 51, 51, 50,
49, 49, 48, 50, 54, 56, 49, 44, 43, 44, 44, 45,
45, 44, 45, 42, 40, 41, 42, 41, 38, 36, 37, 41,
46, 43, 40, 37, 36, 36, 37, 37, 37, 40, 41, 40,
39, 39, 36, 35, 37, 38, 41, 43, 45, 46, 46, 46,
47, 45, 41, 45, 46, 47, 48, 47, 45, 44, 45, 47,
46, 46, 46, 45, 46, 45, 43, 44, 44, 46, 51, 51,
47, 49, 46, 44, 43, 39, 39, 42, 46, 46, 46, 44,
43, 42, 42, 44, 44, 46, 46, 47, 45, 40, 37, 33,
35, 40, 45, 42, 42, 42, 38, 36, 36, 36, 36, 37,
38, 42, 42, 40, 39, 38, 38, 39, 40, 39, 38, 40,
40, 38, 37, 38, 40, 40, 38, 39, 39, 40, 39, 36,
34, 37, 40, 40, 41, 40, 38, 35, 36, 40, 39, 38,
36, 36, 37, 39, 40, 40, 40, 41, 42, 42, 42, 42,
40, 41, 41, 42, 45, 45, 42, 42, 40, 42, 46, 46,
44, 43, 41, 39, 37, 40, 41, 37, 35, 32, 30, 31,
36, 36, 36, 36, 37, 40, 40, 40, 39, 39, 38, 39,
41, 42, 40, 42, 42, 41, 38, 38, 42, 39, 37, 39,
37, 34, 35, 36, 39, 39, 41, 41, 39, 39, 36, 35,
35, 37, 41, 45, 48, 47, 48, 45, 42, 44, 41, 41,
42, 43, 42, 41, 40, 39, 37, 37, 37, 38, 38, 40,
41, 42, 40, 41, 40, 39, 40, 38, 37, 39, 41, 40,
37, 35, 32, 33, 36, 36, 36, 36, 36, 38, 39, 38,
37, 38, 37, 37, 40, 39, 43, 48, 48, 44, 39, 38,
40, 41, 41, 41, 42, 42, 39, 36, 35, 35, 34, 35,
36, 38, 38, 37, 39, 38, 36, 36, 37, 39, 40, 40,
38, 38, 37, 35, 36, 33, 34, 37, 36, 39, 39, 38,
37, 33, 30, 32, 33, 33, 35, 36, 36, 36, 37, 35,
37, 39, 40, 36, 35, 37, 36, 35, 36, 36, 36, 36,
35, 31, 34, 35, 37, 38, 37, 36, 39, 42, 41, 41,
40, 38, 36, 37, 38, 39, 40, 40, 37, 34, 34, 35,
37, 37, 39, 39, 38, 40, 39, 41, 43, 43, 43, 40,
39, 41, 41, 39, 35, 33, 34, 33, 36, 38, 40, 40,
39, 40, 37, 39, 37, 34, 33, 34, 35, 35, 35, 35,
33, 35, 34, 33, 34, 36, 37, 36, 35, 35, 34, 35,
36, 36, 36, 36, 36, 38, 39, 40, 40, 42, 41, 40,
43, 42, 39, 38, 35, 35, 34, 35, 37, 37, 37, 37,
38, 37, 35, 34, 36, 39, 40, 39, 40, 41, 40, 36,
37, 38, 34, 35, 36, 37, 39, 40, 37, 37, 37, 34,
34, 35, 35, 37, 37, 38, 39, 42, 44, 42, 40, 41,
40, 38, 35, 34, 34, 36, 36, 37, 39, 38, 40, 40,
38, 36, 33, 31, 36, 36, 36, 36, 36, 36, 36, 39,
41, 42, 41, 40, 38, 38, 37, 37, 41, 40, 39, 39,
37, 39, 38, 39, 37, 35, 35, 35, 36, 39, 38, 38,
38, 38, 39, 39, 39, 38, 38, 39, 40, 41, 41, 41,
38, 38, 37, 37, 36, 38, 40, 39, 37, 35, 37, 35,
33, 34, 35, 38, 36, 36, 38, 34, 33, 35, 36, 35,
37, 39, 38, 38, 38, 37, 34, 31, 36, 36, 36, 36,
36, 37, 41, 41, 39, 40, 39, 40, 41, 42, 40, 35,
35, 36, 34, 36, 38, 38, 39, 39, 39, 39, 38, 37,
38, 38, 36, 34, 35, 40, 44, 43, 46, 47, 40, 35,
36, 36, 37, 37, 35, 36, 37, 35, 36, 38, 38, 39,
39, 39, 40, 40, 38, 33, 32, 35, 36, 35, 32, 31,
32, 34, 34, 35, 38, 39, 38, 37, 35, 36, 36, 33,
36, 36, 36, 36, 36, 35, 31, 33, 36, 36, 37, 37,
37, 38, 38, 39, 41, 39, 36, 36, 36, 35, 37, 34,
34, 32, 32, 34, 35, 39, 38, 38, 39, 38, 38, 38,
38, 36, 33, 34, 33, 34, 34, 37, 40, 40, 40, 37,
35, 37, 38, 37, 35, 35, 36, 37, 38, 41, 43, 42,
37, 36, 40, 39, 41, 43, 41, 36, 32, 33, 36, 37,
40, 39, 36, 33, 36, 36, 36, 36, 37, 42, 42, 39,
35, 35, 35, 37, 37, 38, 39, 38, 40, 40, 39, 44,
44, 39, 40, 40, 42, 44, 42, 38, 38, 36, 35, 35,
35, 38, 38, 35, 33, 36, 35, 35, 37, 38, 39, 38,
38, 38, 37, 36, 33, 33, 33, 34, 37, 38, 39, 40,
36, 31, 33, 36, 34, 37, 35, 34, 36, 37, 38, 38,
37, 37, 35, 33, 35, 39, 36, 34, 36, 36, 36, 36,
36, 36, 35, 36, 36, 37, 35, 37, 38, 38, 40, 41,
42, 40, 41, 44, 42, 42, 40, 38, 39, 37, 36, 35,
35, 34, 33, 34, 35, 36, 36, 38, 37, 37, 36, 34,
36, 39, 40, 39, 38, 39, 37, 37, 36, 39, 40, 39,
39, 35, 37, 37, 36, 40, 41, 40, 37, 35, 36, 36,
37, 35, 35, 34, 32, 36, 34, 32, 31, 30, 31, 33,
36, 36, 36, 36, 37, 37, 37, 36, 35, 38, 39, 41,
40, 35, 36, 35, 35, 34, 34, 38, 38, 39, 40, 36,
35, 36, 35, 36, 36, 38, 36, 39, 41, 42, 41, 41,
40, 41, 41, 39, 38, 36, 37, 37, 35, 37, 40, 39,
37, 37, 37, 38, 39, 43, 44, 41, 39, 39, 42, 40,
36, 38, 34, 33, 36, 37, 41, 41, 41, 41, 41, 40,
40, 44, 41, 38, 36, 36, 36, 37, 37, 38, 39, 39,
38, 38, 37, 40, 40, 37, 38, 38, 37, 36, 36, 36,
35, 39, 39, 38, 41, 38, 37, 38, 39, 41, 40, 40,
41, 41, 41, 40, 37, 39, 40, 40, 39, 39, 36, 35,
35, 35, 35, 35, 34, 36, 35, 37, 40, 40, 40, 38,
36, 36, 35, 37, 36, 37, 38, 38, 38, 37, 37, 34,
31, 33, 32, 33, 33, 33, 35, 36};

View File

@ -0,0 +1,173 @@
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
/*
from: @(#)fdlibm.h 5.1 93/09/24
*/
#ifndef _MATH_PRIVATE_H_
#define _MATH_PRIVATE_H_
#include "wcclibm.h"
// #include <endian.h>
// #include <sys/types.h>
/* A representation of a double as a union. */
union ieee754_double {
double d;
/* This is the IEEE 754 double-precision format. */
struct {
/* Together these comprise the mantissa. */
unsigned int mantissa1 : 32;
unsigned int mantissa0 : 20;
unsigned int exponent : 11;
unsigned int negative : 1;
} ieee;
/* This format makes it easier to see if a NaN is a signalling NaN. */
struct {
/* Together these comprise the mantissa. */
unsigned int mantissa1 : 32;
unsigned int mantissa0 : 19;
unsigned int quiet_nan : 1;
unsigned int exponent : 11;
unsigned int negative : 1;
} ieee_nan;
};
/* The original fdlibm code used statements like:
n0 = ((*(int*)&one)>>29)^1; * index of high word *
ix0 = *(n0+(int*)&x); * high word of x *
ix1 = *((1-n0)+(int*)&x); * low word of x *
to dig two 32 bit words out of the 64 bit IEEE floating point
value. That is non-ANSI, and, moreover, the gcc instruction
scheduler gets it wrong. We instead use the following macros.
Unlike the original code, we determine the endianness at compile
time, not at run time; I don't see much benefit to selecting
endianness at run time. */
/* A union which permits us to convert between a double and two 32 bit
ints. */
/* #if __FLOAT_WORD_ORDER == BIG_ENDIAN */
/* #warning USING Big Endian float word order */
/* typedef union */
/* { */
/* double value; */
/* struct */
/* { */
/* u_int16_t msw; */
/* u_int16_t lsw; */
/* } parts; */
/* } ieeeDoubleShapeType; */
/* #endif */
/* #if __FLOAT_WORD_ORDER == LITTLE_ENDIAN */
/* #warning USING Little Endian float word order */
typedef union {
double value;
struct {
u_int16_t lsw;
u_int16_t msw;
} parts;
} ieeeDoubleShapeType;
/* #endif */
/* Get two 32 bit ints from a double. */
#define EXTRACT_WORDS(ix0, ix1, d) \
{ \
ieeeDoubleShapeType ew_u; \
ew_u.value = (d); \
(ix0) = ew_u.parts.msw; \
(ix1) = ew_u.parts.lsw; \
}
/* Get the more significant 32 bit int from a double. */
#define GET_HIGH_WORD(i, d) \
{ \
ieeeDoubleShapeType gh_u; \
gh_u.value = (d); \
(i) = gh_u.parts.msw; \
}
/* Get the less significant 32 bit int from a double. */
#define GET_LOW_WORD(i, d) \
{ \
ieeeDoubleShapeType gl_u; \
gl_u.value = (d); \
(i) = gl_u.parts.lsw; \
}
/* Set a double from two 32 bit ints. */
#define INSERT_WORDS(d, ix0, ix1) \
{ \
ieeeDoubleShapeType iw_u; \
iw_u.parts.msw = (ix0); \
iw_u.parts.lsw = (ix1); \
(d) = iw_u.value; \
}
/* Set the more significant 32 bits of a double from an int. */
#define SET_HIGH_WORD(d, v) \
{ \
ieeeDoubleShapeType sh_u; \
sh_u.value = (d); \
sh_u.parts.msw = (v); \
(d) = sh_u.value; \
}
/* Set the less significant 32 bits of a double from an int. */
#define SET_LOW_WORD(d, v) \
{ \
ieeeDoubleShapeType sl_u; \
sl_u.value = (d); \
sl_u.parts.lsw = (v); \
(d) = sl_u.value; \
}
/* A union which permits us to convert between a float and a 32 bit
int. */
typedef union {
float value;
u_int32_t word;
} ieee_float_shape_type;
/* Get a 32 bit int from a float. */
#define GET_FLOAT_WORD(i, d) \
{ \
ieee_float_shape_type gf_u; \
gf_u.value = (d); \
(i) = gf_u.word; \
}
/* Set a float from a 32 bit int. */
#define SET_FLOAT_WORD(d, i) \
{ \
ieee_float_shape_type sf_u; \
sf_u.word = (i); \
(d) = sf_u.value; \
}
#endif /* _MATH_PRIVATE_H_ */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,80 @@
#include "wccfile.h"
// Wasm loop bounds
__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void
__pragma_loopbound(unsigned int min_bound, unsigned int max_bound);
#define EOF -1
__attribute__((always_inline)) static inline size_t
susan_wccfread(void *ptr, size_t size, size_t count, struct wccFILE *stream) {
if (susan_wccfeof(stream))
return EOF;
unsigned i = stream->cur_pos, i2 = 0;
size_t number_of_chars_to_read =
stream->size - stream->cur_pos >= size * count
? size * count
: stream->size - stream->cur_pos;
__pragma_loopbound(7220, 7220);
while (i < stream->cur_pos + number_of_chars_to_read)
((unsigned char *) ptr)[i2++] = stream->data[i++];
stream->cur_pos += number_of_chars_to_read;
return number_of_chars_to_read;
}
__attribute__((always_inline)) static inline int
susan_wccfgetc(struct wccFILE *stream) {
if (susan_wccfeof(stream))
return EOF;
else
return stream->data[stream->cur_pos++];
}
__attribute__((always_inline)) static inline char *
susan_wccfgets(char *str, int num, struct wccFILE *stream) {
if (!stream || susan_wccfeof(stream) || !str || num <= 0)
return 0;
int pos = 0;
__pragma_loopbound(57, 57);
while (pos < num - 1 && !susan_wccfeof(stream)) {
str[pos] = stream->data[stream->cur_pos];
if (str[pos] == '\n')
break;
stream->cur_pos++;
pos++;
}
str[pos++] = '\0';
return str;
}
int
susan_wccfseek(struct wccFILE *stream, long int offset, enum _Origin_ origin) {
if (origin == WCCSEEK_SET) {
stream->cur_pos = offset;
return 0;
} else if (origin == WCCSEEK_CUR) {
stream->cur_pos += offset;
return 0;
} else if (origin == WCCSEEK_END) {
stream->cur_pos = stream->size + offset;
return 0;
}
return -1;
}
__attribute__((always_inline)) static inline int
susan_wccfgetpos(struct wccFILE *stream, unsigned *position) {
*position = stream->cur_pos;
return 0;
}
__attribute__((always_inline)) static inline int
susan_wccfeof(struct wccFILE *stream) {
return stream->cur_pos == stream->size ? 1 : 0;
}

View File

@ -0,0 +1,30 @@
#ifndef WCC_FILE_H
#define WCC_FILE_H
enum _Origin_ { WCCSEEK_SET, WCCSEEK_CUR, WCCSEEK_END };
typedef enum _Origin_ Origin;
typedef unsigned int size_t;
#define EOF -1
struct wccFILE {
char *data;
size_t size;
unsigned cur_pos;
};
__attribute__((always_inline)) static inline size_t
susan_wccfread(void *ptr, size_t size, size_t count, struct wccFILE *stream);
__attribute__((always_inline)) static inline int
susan_wccfseek(struct wccFILE *stream, long int offset, Origin origin);
__attribute__((always_inline)) static inline int
susan_wccfgetpos(struct wccFILE *stream, unsigned *position);
__attribute__((always_inline)) static inline int
susan_wccfeof(struct wccFILE *stream);
__attribute__((always_inline)) static inline int
susan_wccfgetc(struct wccFILE *stream);
__attribute__((always_inline)) static inline char *
susan_wccfgets(char *str, int num, struct wccFILE *stream);
#endif

View File

@ -0,0 +1,483 @@
#include "wcclibm.h"
#include "math_private.h"
/* e_rem_pio2f.c -- float version of e_rem_pio2.c
Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] =
"$NetBSD: e_rem_pio2f.c,v 1.5 1995/05/10 20:46:03 jtc Exp $";
#endif
/* __ieee754_rem_pio2f(x,y)
return the remainder of x rem pi/2 in y[ 0 ]+y[ 1 ]
use __kernel_rem_pio2f()
*/
/* This array is like the one in e_rem_pio2.c, but the numbers are
single precision and the last 8 bits are forced to 0. */
static const int32_t susan_npio2_hw[] = {
0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00,
0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00,
0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100,
0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00,
0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00,
0x4242c700, 0x42490f00};
/*
invpio2: 24 bits of 2/pi
pio2_1: first 17 bit of pi/2
pio2_1t: pi/2 - pio2_1
pio2_2: second 17 bit of pi/2
pio2_2t: pi/2 - (pio2_1+pio2_2)
pio2_3: third 17 bit of pi/2
pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3)
*/
static const float
/* zero = 0.0000000000e+00f, /\* 0x00000000 *\/ */
/* half = 5.0000000000e-01f, /\* 0x3f000000 *\/ */
/* two8 = 2.5600000000e+02f, /\* 0x43800000 *\/ */
susan_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */
susan_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */
susan_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */
susan_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */
susan_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */
susan_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */
susan_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */
__attribute__((always_inline)) static inline int32_t
susan___ieee754_rem_pio2f(float x, float *y) {
float z, w, t, r, fn;
int32_t i, j, n, ix, hx;
GET_FLOAT_WORD(hx, x);
ix = hx & 0x7fffffff;
if (ix <= 0x3f490fd8) { /* |x| ~<= pi/4 , no need for reduction */
y[0] = x;
y[1] = 0;
return 0;
}
if (ix < 0x4016cbe4) { /* |x| < 3pi/4, special case with n=+-1 */
if (hx > 0) {
z = x - susan_pio2_1;
if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */
y[0] = z - susan_pio2_1t;
y[1] = (z - y[0]) - susan_pio2_1t;
} else { /* near pi/2, use 24+24+24 bit pi */
z -= susan_pio2_2;
y[0] = z - susan_pio2_2t;
y[1] = (z - y[0]) - susan_pio2_2t;
}
return 1;
} else { /* negative x */
z = x + susan_pio2_1;
if ((ix & 0xfffffff0) != 0x3fc90fd0) { /* 24+24 bit pi OK */
y[0] = z + susan_pio2_1t;
y[1] = (z - y[0]) + susan_pio2_1t;
} else { /* near pi/2, use 24+24+24 bit pi */
z += susan_pio2_2;
y[0] = z + susan_pio2_2t;
y[1] = (z - y[0]) + susan_pio2_2t;
}
return -1;
}
}
if (ix <= 0x43490f80) { /* |x| ~<= 2^7*(pi/2), medium size */
t = fabsf(x);
n = (int32_t) (t * susan_invpio2 + susan_half);
fn = (float) n;
r = t - fn * susan_pio2_1;
w = fn * susan_pio2_1t; /* 1st round good to 40 bit */
if (n < 32 && (int32_t) (ix & 0xffffff00) != susan_npio2_hw[n - 1]) {
y[0] = r - w; /* quick check no cancellation */
} else {
u_int32_t high;
j = ix >> 23;
y[0] = r - w;
GET_FLOAT_WORD(high, y[0]);
i = j - ((high >> 23) & 0xff);
if (i > 8) { /* 2nd iteration needed, good to 57 */
t = r;
w = fn * susan_pio2_2;
r = t - w;
w = fn * susan_pio2_2t - ((t - r) - w);
y[0] = r - w;
GET_FLOAT_WORD(high, y[0]);
i = j - ((high >> 23) & 0xff);
if (i > 25) { /* 3rd iteration need, 74 bits acc */
t = r; /* will cover all possible cases */
w = fn * susan_pio2_3;
r = t - w;
w = fn * susan_pio2_3t - ((t - r) - w);
y[0] = r - w;
}
}
}
y[1] = (r - y[0]) - w;
if (hx < 0) {
y[0] = -y[0];
y[1] = -y[1];
return -n;
} else
return n;
}
/*
all other (large) arguments
*/
if (ix >= 0x7f800000) { /* x is inf or NaN */
y[0] = y[1] = x - x;
return 0;
}
y[0] = y[1] = x - x;
return 0; /* dummy initialisation */
return 0; /* doesn't happen for our input */
}
/* k_cosf.c -- float version of k_cos.c
Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: k_cosf.c,v 1.4 1995/05/10 20:46:23 jtc Exp $";
#endif
static const float
/* one = 1.0000000000e+00, /\* 0x3f800000 *\/ */
susan_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */
susan_C2 = -1.3888889225e-03f, /* 0xbab60b61 */
susan_C3 = 2.4801587642e-05f, /* 0x37d00d01 */
susan_C4 = -2.7557314297e-07f, /* 0xb493f27c */
susan_C5 = 2.0875723372e-09f, /* 0x310f74f6 */
susan_C6 = -1.1359647598e-11f; /* 0xad47d74e */
__attribute__((always_inline)) static inline float
susan___kernel_cosf(float x, float y) {
float a, hz, z, r, qx;
int32_t ix;
GET_FLOAT_WORD(ix, x);
ix &= 0x7fffffff; /* ix = |x|'s high word*/
if (ix < 0x32000000) { /* if x < 2**27 */
if (((int) x) == 0)
return susan_one; /* generate inexact */
}
z = x * x;
r = z *
(susan_C1 +
z * (susan_C2 +
z * (susan_C3 + z * (susan_C4 + z * (susan_C5 + z * susan_C6)))));
if (ix < 0x3e99999a) /* if |x| < 0.3 */
return susan_one - ((float) 0.5f * z - (z * r - x * y));
else {
if (ix > 0x3f480000) /* x > 0.78125 */
qx = (float) 0.28125f;
else {
SET_FLOAT_WORD(qx, ix - 0x01000000); /* x/4 */
}
hz = (float) 0.5f * z - qx;
a = susan_one - qx;
return a - (hz - (z * r - x * y));
}
}
/* k_sinf.c -- float version of k_sin.c
Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: k_sinf.c,v 1.4 1995/05/10 20:46:33 jtc Exp $";
#endif
static const float
/* half = 5.0000000000e-01f,/\* 0x3f000000 *\/ */
susan_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */
susan_S2 = 8.3333337680e-03f, /* 0x3c088889 */
susan_S3 = -1.9841270114e-04f, /* 0xb9500d01 */
susan_S4 = 2.7557314297e-06f, /* 0x3638ef1b */
susan_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */
susan_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */
__attribute__((always_inline)) static inline float
susan___kernel_sinf(float x, float y, int iy) {
float z, r, v;
int32_t ix;
GET_FLOAT_WORD(ix, x);
ix &= 0x7fffffff; /* high word of x */
if (ix < 0x32000000) { /* |x| < 2**-27 */
if ((int) x == 0)
return x; /* generate inexact */
}
z = x * x;
v = z * x;
r = susan_S2 +
z * (susan_S3 + z * (susan_S4 + z * (susan_S5 + z * susan_S6)));
if (iy == 0)
return x + v * (susan_S1 + z * r);
else
return x - ((z * (susan_half * y - v * r) - y) - v * susan_S1);
}
/* s_atanf.c -- float version of s_atan.c.
Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[] = "$NetBSD: s_atanf.c,v 1.4 1995/05/10 20:46:47 jtc Exp $";
#endif
static const float susan_atanhi[] = {
4.6364760399e-01f, /* atan(0.5)hi 0x3eed6338 */
7.8539812565e-01f, /* atan(1.0)hi 0x3f490fda */
9.8279368877e-01f, /* atan(1.5)hi 0x3f7b985e */
1.5707962513e+00f, /* atan(inf)hi 0x3fc90fda */
};
static const float susan_atanlo[] = {
5.0121582440e-09f, /* atan(0.5)lo 0x31ac3769 */
3.7748947079e-08f, /* atan(1.0)lo 0x33222168 */
3.4473217170e-08f, /* atan(1.5)lo 0x33140fb4 */
7.5497894159e-08f, /* atan(inf)lo 0x33a22168 */
};
static const float susan_aT[] = {
3.3333334327e-01f, /* 0x3eaaaaaa */
-2.0000000298e-01f, /* 0xbe4ccccd */
1.4285714924e-01f, /* 0x3e124925 */
-1.1111110449e-01f, /* 0xbde38e38 */
9.0908870101e-02f, /* 0x3dba2e6e */
-7.6918758452e-02f, /* 0xbd9d8795 */
6.6610731184e-02f, /* 0x3d886b35 */
-5.8335702866e-02f, /* 0xbd6ef16b */
4.9768779427e-02f, /* 0x3d4bda59 */
-3.6531571299e-02f, /* 0xbd15a221 */
1.6285819933e-02f, /* 0x3c8569d7 */
};
__attribute__((always_inline)) static inline float
susan___atanf(float x) {
float w, s1, s2, z;
int32_t ix, hx, id;
GET_FLOAT_WORD(hx, x);
ix = hx & 0x7fffffff;
if (ix >= 0x50800000) { /* if |x| >= 2^34 */
if (ix > 0x7f800000)
return x + x; /* NaN */
if (hx > 0)
return susan_atanhi[3] + susan_atanlo[3];
else
return -susan_atanhi[3] - susan_atanlo[3];
}
if (ix < 0x3ee00000) { /* |x| < 0.4375 */
if (ix < 0x31000000) { /* |x| < 2^-29 */
if (susan_huge + x > susan_one)
return x; /* raise inexact */
}
id = -1;
} else {
x = fabsf(x);
if (ix < 0x3f980000) { /* |x| < 1.1875 */
if (ix < 0x3f300000) { /* 7/16 <=|x|<11/16 */
id = 0;
x = ((float) 2.0f * x - susan_one) / ((float) 2.0f + x);
} else { /* 11/16<=|x|< 19/16 */
id = 1;
x = (x - susan_one) / (x + susan_one);
}
} else {
if (ix < 0x401c0000) { /* |x| < 2.4375 */
id = 2;
x = (x - (float) 1.5f) / (susan_one + (float) 1.5f * x);
} else { /* 2.4375 <= |x| < 2^66 */
id = 3;
x = -(float) 1.0f / x;
}
}
}
/* end of argument reduction */
z = x * x;
w = z * z;
/* break sum from i=0 to 10 aT[ i ]z**(i+1) into odd and even poly */
s1 = z *
(susan_aT[0] +
w * (susan_aT[2] +
w * (susan_aT[4] +
w * (susan_aT[6] + w * (susan_aT[8] + w * susan_aT[10])))));
s2 = w * (susan_aT[1] +
w * (susan_aT[3] +
w * (susan_aT[5] + w * (susan_aT[7] + w * susan_aT[9]))));
if (id < 0)
return x - x * (s1 + s2);
else {
z = susan_atanhi[id] - ((x * (s1 + s2) - susan_atanlo[id]) - x);
return (hx < 0) ? -z : z;
}
}
/* s_cosf.c -- float version of s_cos.c.
Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
__attribute__((always_inline)) static inline float
susan___cosf(float x) {
float y[2], z = 0.0f;
int32_t n, ix;
GET_FLOAT_WORD(ix, x);
/* |x| ~< pi/4 */
ix &= 0x7fffffff;
if (ix <= 0x3f490fd8)
return susan___kernel_cosf(x, z);
/* cos(Inf or NaN) is NaN */
else if (ix >= 0x7f800000)
return x - x;
/* argument reduction needed */
else {
n = susan___ieee754_rem_pio2f(x, y);
switch (n & 3) {
case 0:
return susan___kernel_cosf(y[0], y[1]);
case 1:
return -susan___kernel_sinf(y[0], y[1], 1);
case 2:
return -susan___kernel_cosf(y[0], y[1]);
default:
return susan___kernel_sinf(y[0], y[1], 1);
}
}
}
/* s_sinf.c -- float version of s_sin.c.
Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
__attribute__((always_inline)) static inline float
susan___sinf(float x) {
float y[2], z = 0.0;
int32_t n, ix;
GET_FLOAT_WORD(ix, x);
/* |x| ~< pi/4 */
ix &= 0x7fffffff;
if (ix <= 0x3f490fd8)
return susan___kernel_sinf(x, z, 0);
/* sin(Inf or NaN) is NaN */
else if (ix >= 0x7f800000)
return x - x;
/* argument reduction needed */
else {
n = susan___ieee754_rem_pio2f(x, y);
switch (n & 3) {
case 0:
return susan___kernel_sinf(y[0], y[1], 1);
case 1:
return susan___kernel_cosf(y[0], y[1]);
case 2:
return -susan___kernel_sinf(y[0], y[1], 1);
default:
return -susan___kernel_cosf(y[0], y[1]);
}
}
}
/* s_fabsf.c -- float version of s_fabs.c.
Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
/*
fabsf(x) returns the absolute value of x.
*/
__attribute__((always_inline)) static inline float
susan___fabsf(float x) {
u_int32_t ix;
GET_FLOAT_WORD(ix, x);
SET_FLOAT_WORD(x, ix & 0x7fffffff);
return x;
}

View File

@ -0,0 +1,65 @@
#ifndef _WCCLIBM
#define _WCCLIBM
#define int32_t int
#define uint32_t unsigned int
#define u_int16_t unsigned short
#define u_int32_t unsigned int
// Often used variables/consts
#ifdef __STDC__
static const float
#else
static float
#endif
susan_one = 1.0f,
susan_half = 5.0000000000e-01f, /* 0x3f000000 */
susan_zero = 0.0f, susan_huge = 1.0e30,
susan_two8 = 2.5600000000e+02f, /* 0x43800000 */
susan_twon8 = 3.9062500000e-03f; /* 0x3b800000 */
// The following defines map the math functions to specialized calls
#define acos susan___ieee754_acosf
#define atan susan___atanf
#define cos susan___cosf
#define fabs susan___fabsf
#define fabsf susan___fabsf
#define isinf susan___isinff
#define pow susan___ieee754_powf
#define sqrt susan___ieee754_sqrtf
#define log10 susan___ieee754_log10f
#define log susan___ieee754_logf
#define sin susan___sinf
__attribute__((always_inline)) static inline float susan___atanf(float x);
__attribute__((always_inline)) static inline float susan___copysignf(float x,
float y);
__attribute__((always_inline)) static inline float susan___cosf(float x);
__attribute__((always_inline)) static inline float susan___fabsf(float x);
__attribute__((always_inline)) static inline float susan___floorf(float x);
__attribute__((always_inline)) static inline float
susan___ieee754_acosf(float x);
__attribute__((always_inline)) static inline float
susan___ieee754_powf(float x, float y);
__attribute__((always_inline)) static inline int32_t
susan___ieee754_rem_pio2f(float x, float *y);
__attribute__((always_inline)) static inline float
susan___ieee754_sqrtf(float x);
__attribute__((always_inline)) static inline int susan___isinff(float x);
__attribute__((always_inline)) static inline float susan___kernel_cosf(float x,
float y);
__attribute__((always_inline)) static inline float
susan___kernel_sinf(float x, float y, int iy);
__attribute__((always_inline)) static inline int
susan___kernel_rem_pio2f(float *x, float *y, int e0, int nx, int prec,
const int32_t *ipio2);
__attribute__((always_inline)) static inline float susan___scalbnf(float x,
int n);
__attribute__((always_inline)) static inline float
susan___ieee754_logf(float x);
__attribute__((always_inline)) static inline float
susan___ieee754_log10f(float x);
__attribute__((always_inline)) static inline float susan___sinf(float x);
#endif // _WCCLIBM

View File

@ -0,0 +1,56 @@
#include "wccmalloc.h"
// This must be redefined for each new benchmark
// Wasm loop bounds
__attribute__((import_module("__pragma"), import_name("loopbound"))) extern void
__pragma_loopbound(unsigned int min_bound, unsigned int max_bound);
#define HEAP_SIZE 30000
char susan_simulated_heap[HEAP_SIZE];
unsigned int susan_freeHeapPos;
__attribute__((always_inline)) static inline void *
susan_wccmalloc(unsigned int numberOfBytes) {
// Get a 4-byte adress for alignment purposes
unsigned int offset =
((unsigned long) susan_simulated_heap + susan_freeHeapPos) % 4;
if (offset)
susan_freeHeapPos += 4 - offset;
void *currentPos = (void *) &susan_simulated_heap[susan_freeHeapPos];
susan_freeHeapPos += numberOfBytes;
return currentPos;
}
__attribute__((always_inline)) static inline void
susan_wccfreeall(void) {
susan_freeHeapPos = 0;
}
__attribute__((always_inline)) static inline void *
susan_wccmemcpy(void *dstpp, const void *srcpp, unsigned int len) {
unsigned long int dstp = (long int) dstpp;
unsigned long int srcp = (long int) srcpp;
__pragma_loopbound(76, 76);
while (len > 0) {
char __x = ((char *) srcp)[0];
srcp += 1;
len -= 1;
((char *) dstp)[0] = __x;
dstp += 1;
}
return dstpp;
}
__attribute__((always_inline)) static inline void
susan_wccmemset(void *p, int value, unsigned int num) {
unsigned long i;
char *char_ptr = (char *) p;
__pragma_loopbound(7220, 7220);
for (i = 0; i < num; ++i)
*char_ptr++ = (unsigned char) value;
}

View File

@ -0,0 +1,14 @@
#ifndef _WCCMALLOC_H
#define _WCCMALLOC_H
__attribute__((always_inline)) static inline void *
susan_wccmalloc(unsigned int numberOfBytes);
//! Frees ALL allocated memory space
__attribute__((always_inline)) static inline void susan_wccfreeall(void);
__attribute__((always_inline)) static inline void *
susan_wccmemcpy(void *dstpp, const void *srcpp, unsigned int len);
__attribute__((always_inline)) static inline void
susan_wccmemset(void *p, int value, unsigned int num);
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,174 @@
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
/*
from: @(#)fdlibm.h 5.1 93/09/24
*/
#ifndef _MATH_PRIVATE_H_
#define _MATH_PRIVATE_H_
#include "wcclibm.h"
//#include <endian.h>
//#include <sys/types.h>
/* A representation of a double as a union. */
union ieee754_double {
double d;
/* This is the IEEE 754 double-precision format. */
struct {
/* Together these comprise the mantissa. */
unsigned int mantissa1: 32;
unsigned int mantissa0: 20;
unsigned int exponent: 11;
unsigned int negative: 1;
} ieee;
/* This format makes it easier to see if a NaN is a signalling NaN. */
struct {
/* Together these comprise the mantissa. */
unsigned int mantissa1: 32;
unsigned int mantissa0: 19;
unsigned int quiet_nan: 1;
unsigned int exponent: 11;
unsigned int negative: 1;
} ieee_nan;
};
/* The original fdlibm code used statements like:
n0 = ((*(int*)&one)>>29)^1; * index of high word *
ix0 = *(n0+(int*)&x); * high word of x *
ix1 = *((1-n0)+(int*)&x); * low word of x *
to dig two 32 bit words out of the 64 bit IEEE floating point
value. That is non-ANSI, and, moreover, the gcc instruction
scheduler gets it wrong. We instead use the following macros.
Unlike the original code, we determine the endianness at compile
time, not at run time; I don't see much benefit to selecting
endianness at run time. */
/* A union which permits us to convert between a double and two 32 bit
ints. */
/* #if __FLOAT_WORD_ORDER == BIG_ENDIAN */
/* #warning USING Big Endian float word order */
/* typedef union */
/* { */
/* double value; */
/* struct */
/* { */
/* u_int16_t msw; */
/* u_int16_t lsw; */
/* } parts; */
/* } ieeeDoubleShapeType; */
/* #endif */
/* #if __FLOAT_WORD_ORDER == LITTLE_ENDIAN */
/* #warning USING Little Endian float word order */
typedef union {
double value;
struct {
u_int16_t lsw;
u_int16_t msw;
} parts;
} ieeeDoubleShapeType;
/* #endif */
/* Get two 32 bit ints from a double. */
#define EXTRACT_WORDS(ix0,ix1,d) \
{ \
ieeeDoubleShapeType ew_u; \
ew_u.value = (d); \
(ix0) = ew_u.parts.msw; \
(ix1) = ew_u.parts.lsw; \
}
/* Get the more significant 32 bit int from a double. */
#define GET_HIGH_WORD(i,d) \
{ \
ieeeDoubleShapeType gh_u; \
gh_u.value = (d); \
(i) = gh_u.parts.msw; \
}
/* Get the less significant 32 bit int from a double. */
#define GET_LOW_WORD(i,d) \
{ \
ieeeDoubleShapeType gl_u; \
gl_u.value = (d); \
(i) = gl_u.parts.lsw; \
}
/* Set a double from two 32 bit ints. */
#define INSERT_WORDS(d,ix0,ix1) \
{ \
ieeeDoubleShapeType iw_u; \
iw_u.parts.msw = (ix0); \
iw_u.parts.lsw = (ix1); \
(d) = iw_u.value; \
}
/* Set the more significant 32 bits of a double from an int. */
#define SET_HIGH_WORD(d,v) \
{ \
ieeeDoubleShapeType sh_u; \
sh_u.value = (d); \
sh_u.parts.msw = (v); \
(d) = sh_u.value; \
}
/* Set the less significant 32 bits of a double from an int. */
#define SET_LOW_WORD(d,v) \
{ \
ieeeDoubleShapeType sl_u; \
sl_u.value = (d); \
sl_u.parts.lsw = (v); \
(d) = sl_u.value; \
}
/* A union which permits us to convert between a float and a 32 bit
int. */
typedef union {
float value;
u_int32_t word;
} ieee_float_shape_type;
/* Get a 32 bit int from a float. */
#define GET_FLOAT_WORD(i,d) \
{ \
ieee_float_shape_type gf_u; \
gf_u.value = (d); \
(i) = gf_u.word; \
}
/* Set a float from a 32 bit int. */
#define SET_FLOAT_WORD(d,i) \
{ \
ieee_float_shape_type sf_u; \
sf_u.word = (i); \
(d) = sf_u.value; \
}
#endif /* _MATH_PRIVATE_H_ */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,79 @@
#include "wccfile.h"
#define EOF -1
size_t susan_wccfread( void *ptr, size_t size, size_t count,
struct wccFILE *stream )
{
if ( susan_wccfeof( stream ) )
return EOF;
unsigned i = stream->cur_pos, i2 = 0;
size_t number_of_chars_to_read =
stream->size - stream->cur_pos >= size * count ?
size * count : stream->size - stream->cur_pos;
_Pragma( "loopbound min 7220 max 7220" )
while ( i < stream->cur_pos + number_of_chars_to_read )
( ( unsigned char * )ptr )[ i2++ ] = stream->data[ i++ ];
stream->cur_pos += number_of_chars_to_read;
return number_of_chars_to_read;
}
int susan_wccfgetc( struct wccFILE *stream )
{
if ( susan_wccfeof( stream ) )
return EOF;
else
return stream->data[ stream->cur_pos++ ];
}
char *susan_wccfgets( char *str, int num, struct wccFILE *stream )
{
if ( !stream || susan_wccfeof( stream ) || !str || num <= 0 )
return 0;
int pos = 0;
_Pragma( "loopbound min 57 max 57" )
while ( pos < num - 1 && !susan_wccfeof( stream ) ) {
str[ pos ] = stream->data[ stream->cur_pos ];
if ( str[ pos ] == '\n' )
break;
stream->cur_pos++;
pos++;
}
str[ pos++ ] = '\0';
return str;
}
int susan_wccfseek( struct wccFILE *stream, long int offset,
enum _Origin_ origin )
{
if ( origin == WCCSEEK_SET ) {
stream->cur_pos = offset;
return 0;
} else
if ( origin == WCCSEEK_CUR ) {
stream->cur_pos += offset;
return 0;
} else
if ( origin == WCCSEEK_END ) {
stream->cur_pos = stream->size + offset;
return 0;
}
return -1;
}
int susan_wccfgetpos( struct wccFILE *stream, unsigned *position )
{
*position = stream->cur_pos;
return 0;
}
int susan_wccfeof( struct wccFILE *stream )
{
return stream->cur_pos == stream->size ? 1 : 0;
}

View File

@ -0,0 +1,26 @@
#ifndef WCC_FILE_H
#define WCC_FILE_H
enum _Origin_ { WCCSEEK_SET, WCCSEEK_CUR, WCCSEEK_END };
typedef enum _Origin_ Origin;
typedef unsigned int size_t;
#define EOF -1
struct wccFILE {
char *data;
size_t size;
unsigned cur_pos;
};
size_t susan_wccfread ( void *ptr, size_t size, size_t count,
struct wccFILE *stream );
int susan_wccfseek ( struct wccFILE *stream, long int offset,
Origin origin );
int susan_wccfgetpos ( struct wccFILE *stream, unsigned *position );
int susan_wccfeof ( struct wccFILE *stream );
int susan_wccfgetc ( struct wccFILE *stream );
char *susan_wccfgets ( char *str, int num, struct wccFILE *stream );
#endif

View File

@ -0,0 +1,473 @@
#include "math_private.h"
#include "wcclibm.h"
/* e_rem_pio2f.c -- float version of e_rem_pio2.c
Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[ ] =
"$NetBSD: e_rem_pio2f.c,v 1.5 1995/05/10 20:46:03 jtc Exp $";
#endif
/* __ieee754_rem_pio2f(x,y)
return the remainder of x rem pi/2 in y[ 0 ]+y[ 1 ]
use __kernel_rem_pio2f()
*/
/* This array is like the one in e_rem_pio2.c, but the numbers are
single precision and the last 8 bits are forced to 0. */
static const int32_t susan_npio2_hw[ ] = {
0x3fc90f00, 0x40490f00, 0x4096cb00, 0x40c90f00, 0x40fb5300, 0x4116cb00,
0x412fed00, 0x41490f00, 0x41623100, 0x417b5300, 0x418a3a00, 0x4196cb00,
0x41a35c00, 0x41afed00, 0x41bc7e00, 0x41c90f00, 0x41d5a000, 0x41e23100,
0x41eec200, 0x41fb5300, 0x4203f200, 0x420a3a00, 0x42108300, 0x4216cb00,
0x421d1400, 0x42235c00, 0x4229a500, 0x422fed00, 0x42363600, 0x423c7e00,
0x4242c700, 0x42490f00
};
/*
invpio2: 24 bits of 2/pi
pio2_1: first 17 bit of pi/2
pio2_1t: pi/2 - pio2_1
pio2_2: second 17 bit of pi/2
pio2_2t: pi/2 - (pio2_1+pio2_2)
pio2_3: third 17 bit of pi/2
pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3)
*/
static const float
/* zero = 0.0000000000e+00f, /\* 0x00000000 *\/ */
/* half = 5.0000000000e-01f, /\* 0x3f000000 *\/ */
/* two8 = 2.5600000000e+02f, /\* 0x43800000 *\/ */
susan_invpio2 = 6.3661980629e-01f, /* 0x3f22f984 */
susan_pio2_1 = 1.5707855225e+00f, /* 0x3fc90f80 */
susan_pio2_1t = 1.0804334124e-05f, /* 0x37354443 */
susan_pio2_2 = 1.0804273188e-05f, /* 0x37354400 */
susan_pio2_2t = 6.0770999344e-11f, /* 0x2e85a308 */
susan_pio2_3 = 6.0770943833e-11f, /* 0x2e85a300 */
susan_pio2_3t = 6.1232342629e-17f; /* 0x248d3132 */
int32_t susan___ieee754_rem_pio2f( float x, float *y )
{
float z, w, t, r, fn;
int32_t i, j, n, ix, hx;
GET_FLOAT_WORD( hx, x );
ix = hx & 0x7fffffff;
if ( ix <= 0x3f490fd8 ) { /* |x| ~<= pi/4 , no need for reduction */
y[ 0 ] = x;
y[ 1 ] = 0;
return 0;
}
if ( ix < 0x4016cbe4 ) { /* |x| < 3pi/4, special case with n=+-1 */
if ( hx > 0 ) {
z = x - susan_pio2_1;
if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */
y[ 0 ] = z - susan_pio2_1t;
y[ 1 ] = ( z - y[ 0 ] ) - susan_pio2_1t;
} else { /* near pi/2, use 24+24+24 bit pi */
z -= susan_pio2_2;
y[ 0 ] = z - susan_pio2_2t;
y[ 1 ] = ( z - y[ 0 ] ) - susan_pio2_2t;
}
return 1;
} else { /* negative x */
z = x + susan_pio2_1;
if ( ( ix & 0xfffffff0 ) != 0x3fc90fd0 ) { /* 24+24 bit pi OK */
y[ 0 ] = z + susan_pio2_1t;
y[ 1 ] = ( z - y[ 0 ] ) + susan_pio2_1t;
} else { /* near pi/2, use 24+24+24 bit pi */
z += susan_pio2_2;
y[ 0 ] = z + susan_pio2_2t;
y[ 1 ] = ( z - y[ 0 ] ) + susan_pio2_2t;
}
return -1;
}
}
if ( ix <= 0x43490f80 ) { /* |x| ~<= 2^7*(pi/2), medium size */
t = fabsf( x );
n = ( int32_t ) ( t * susan_invpio2 + susan_half );
fn = ( float )n;
r = t - fn * susan_pio2_1;
w = fn * susan_pio2_1t; /* 1st round good to 40 bit */
if ( n < 32 && ( int32_t )( ix & 0xffffff00 ) != susan_npio2_hw[ n - 1 ] ) {
y[ 0 ] = r - w; /* quick check no cancellation */
} else {
u_int32_t high;
j = ix >> 23;
y[ 0 ] = r - w;
GET_FLOAT_WORD( high, y[ 0 ] );
i = j - ( ( high >> 23 ) & 0xff );
if ( i > 8 ) { /* 2nd iteration needed, good to 57 */
t = r;
w = fn * susan_pio2_2;
r = t - w;
w = fn * susan_pio2_2t - ( ( t - r ) - w );
y[ 0 ] = r - w;
GET_FLOAT_WORD( high, y[ 0 ] );
i = j - ( ( high >> 23 ) & 0xff );
if ( i > 25 ) { /* 3rd iteration need, 74 bits acc */
t = r; /* will cover all possible cases */
w = fn * susan_pio2_3;
r = t - w;
w = fn * susan_pio2_3t - ( ( t - r ) - w );
y[ 0 ] = r - w;
}
}
}
y[ 1 ] = ( r - y[ 0 ] ) - w;
if ( hx < 0 ) {
y[ 0 ] = -y[ 0 ];
y[ 1 ] = -y[ 1 ];
return -n;
} else return n;
}
/*
all other (large) arguments
*/
if ( ix >= 0x7f800000 ) { /* x is inf or NaN */
y[ 0 ] = y[ 1 ] = x - x;
return 0;
}
y[ 0 ] = y[ 1 ] = x - x;
return 0; /* dummy initialisation */
return 0; /* doesn't happen for our input */
}
/* k_cosf.c -- float version of k_cos.c
Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[ ] = "$NetBSD: k_cosf.c,v 1.4 1995/05/10 20:46:23 jtc Exp $";
#endif
static const float
/* one = 1.0000000000e+00, /\* 0x3f800000 *\/ */
susan_C1 = 4.1666667908e-02f, /* 0x3d2aaaab */
susan_C2 = -1.3888889225e-03f, /* 0xbab60b61 */
susan_C3 = 2.4801587642e-05f, /* 0x37d00d01 */
susan_C4 = -2.7557314297e-07f, /* 0xb493f27c */
susan_C5 = 2.0875723372e-09f, /* 0x310f74f6 */
susan_C6 = -1.1359647598e-11f; /* 0xad47d74e */
float susan___kernel_cosf( float x, float y )
{
float a, hz, z, r, qx;
int32_t ix;
GET_FLOAT_WORD( ix, x );
ix &= 0x7fffffff; /* ix = |x|'s high word*/
if ( ix < 0x32000000 ) { /* if x < 2**27 */
if ( ( ( int )x ) == 0 ) return susan_one; /* generate inexact */
}
z = x * x;
r = z * ( susan_C1 + z * ( susan_C2 + z * ( susan_C3 + z * ( susan_C4 + z *
( susan_C5 + z * susan_C6 ) ) ) ) );
if ( ix < 0x3e99999a ) /* if |x| < 0.3 */
return susan_one - ( ( float )0.5f * z - ( z * r - x * y ) );
else {
if ( ix > 0x3f480000 ) /* x > 0.78125 */
qx = ( float )0.28125f;
else {
SET_FLOAT_WORD( qx, ix - 0x01000000 ); /* x/4 */
}
hz = ( float )0.5f * z - qx;
a = susan_one - qx;
return a - ( hz - ( z * r - x * y ) );
}
}
/* k_sinf.c -- float version of k_sin.c
Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[ ] = "$NetBSD: k_sinf.c,v 1.4 1995/05/10 20:46:33 jtc Exp $";
#endif
static const float
/* half = 5.0000000000e-01f,/\* 0x3f000000 *\/ */
susan_S1 = -1.6666667163e-01f, /* 0xbe2aaaab */
susan_S2 = 8.3333337680e-03f, /* 0x3c088889 */
susan_S3 = -1.9841270114e-04f, /* 0xb9500d01 */
susan_S4 = 2.7557314297e-06f, /* 0x3638ef1b */
susan_S5 = -2.5050759689e-08f, /* 0xb2d72f34 */
susan_S6 = 1.5896910177e-10f; /* 0x2f2ec9d3 */
float susan___kernel_sinf( float x, float y, int iy )
{
float z, r, v;
int32_t ix;
GET_FLOAT_WORD( ix, x );
ix &= 0x7fffffff; /* high word of x */
if ( ix < 0x32000000 ) { /* |x| < 2**-27 */
if ( ( int )x == 0 ) return x; /* generate inexact */
}
z = x * x;
v = z * x;
r = susan_S2 + z * ( susan_S3 + z * ( susan_S4 + z * ( susan_S5 + z *
susan_S6 ) ) );
if ( iy == 0 ) return x + v * ( susan_S1 + z * r );
else return x - ( ( z * ( susan_half * y - v * r ) - y ) - v * susan_S1 );
}
/* s_atanf.c -- float version of s_atan.c.
Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
#if defined(LIBM_SCCS) && !defined(lint)
static char rcsid[ ] = "$NetBSD: s_atanf.c,v 1.4 1995/05/10 20:46:47 jtc Exp $";
#endif
static const float susan_atanhi[ ] = {
4.6364760399e-01f, /* atan(0.5)hi 0x3eed6338 */
7.8539812565e-01f, /* atan(1.0)hi 0x3f490fda */
9.8279368877e-01f, /* atan(1.5)hi 0x3f7b985e */
1.5707962513e+00f, /* atan(inf)hi 0x3fc90fda */
};
static const float susan_atanlo[ ] = {
5.0121582440e-09f, /* atan(0.5)lo 0x31ac3769 */
3.7748947079e-08f, /* atan(1.0)lo 0x33222168 */
3.4473217170e-08f, /* atan(1.5)lo 0x33140fb4 */
7.5497894159e-08f, /* atan(inf)lo 0x33a22168 */
};
static const float susan_aT[ ] = {
3.3333334327e-01f, /* 0x3eaaaaaa */
-2.0000000298e-01f, /* 0xbe4ccccd */
1.4285714924e-01f, /* 0x3e124925 */
-1.1111110449e-01f, /* 0xbde38e38 */
9.0908870101e-02f, /* 0x3dba2e6e */
-7.6918758452e-02f, /* 0xbd9d8795 */
6.6610731184e-02f, /* 0x3d886b35 */
-5.8335702866e-02f, /* 0xbd6ef16b */
4.9768779427e-02f, /* 0x3d4bda59 */
-3.6531571299e-02f, /* 0xbd15a221 */
1.6285819933e-02f, /* 0x3c8569d7 */
};
float susan___atanf( float x )
{
float w, s1, s2, z;
int32_t ix, hx, id;
GET_FLOAT_WORD( hx, x );
ix = hx & 0x7fffffff;
if ( ix >= 0x50800000 ) { /* if |x| >= 2^34 */
if ( ix > 0x7f800000 )
return x + x; /* NaN */
if ( hx > 0 ) return susan_atanhi[ 3 ] + susan_atanlo[ 3 ];
else return -susan_atanhi[ 3 ] - susan_atanlo[ 3 ];
}
if ( ix < 0x3ee00000 ) { /* |x| < 0.4375 */
if ( ix < 0x31000000 ) { /* |x| < 2^-29 */
if ( susan_huge + x > susan_one ) return x; /* raise inexact */
}
id = -1;
} else {
x = fabsf( x );
if ( ix < 0x3f980000 ) { /* |x| < 1.1875 */
if ( ix < 0x3f300000 ) { /* 7/16 <=|x|<11/16 */
id = 0;
x = ( ( float )2.0f * x - susan_one ) / ( ( float )2.0f + x );
} else { /* 11/16<=|x|< 19/16 */
id = 1;
x = ( x - susan_one ) / ( x + susan_one );
}
} else {
if ( ix < 0x401c0000 ) { /* |x| < 2.4375 */
id = 2;
x = ( x - ( float )1.5f ) / ( susan_one + ( float )1.5f * x );
} else { /* 2.4375 <= |x| < 2^66 */
id = 3;
x = -( float )1.0f / x;
}
}
}
/* end of argument reduction */
z = x * x;
w = z * z;
/* break sum from i=0 to 10 aT[ i ]z**(i+1) into odd and even poly */
s1 = z * ( susan_aT[ 0 ] + w * ( susan_aT[ 2 ] + w * ( susan_aT[ 4 ] + w *
( susan_aT[ 6 ] + w * ( susan_aT[ 8 ] + w * susan_aT[ 10 ] ) ) ) ) );
s2 = w * ( susan_aT[ 1 ] + w * ( susan_aT[ 3 ] + w * ( susan_aT[ 5 ] + w *
( susan_aT[ 7 ] + w * susan_aT[ 9 ] ) ) ) );
if ( id < 0 ) return x - x * ( s1 + s2 );
else {
z = susan_atanhi[ id ] - ( ( x * ( s1 + s2 ) - susan_atanlo[ id ] ) - x );
return ( hx < 0 ) ? -z : z;
}
}
/* s_cosf.c -- float version of s_cos.c.
Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
float susan___cosf( float x )
{
float y[ 2 ], z = 0.0f;
int32_t n, ix;
GET_FLOAT_WORD( ix, x );
/* |x| ~< pi/4 */
ix &= 0x7fffffff;
if ( ix <= 0x3f490fd8 ) return susan___kernel_cosf( x, z );
/* cos(Inf or NaN) is NaN */
else
if ( ix >= 0x7f800000 ) return x - x;
/* argument reduction needed */
else {
n = susan___ieee754_rem_pio2f( x, y );
switch ( n & 3 ) {
case 0:
return susan___kernel_cosf( y[ 0 ], y[ 1 ] );
case 1:
return -susan___kernel_sinf( y[ 0 ], y[ 1 ], 1 );
case 2:
return -susan___kernel_cosf( y[ 0 ], y[ 1 ] );
default:
return susan___kernel_sinf( y[ 0 ], y[ 1 ], 1 );
}
}
}
/* s_sinf.c -- float version of s_sin.c.
Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
float susan___sinf( float x )
{
float y[ 2 ], z = 0.0;
int32_t n, ix;
GET_FLOAT_WORD( ix, x );
/* |x| ~< pi/4 */
ix &= 0x7fffffff;
if ( ix <= 0x3f490fd8 ) return susan___kernel_sinf( x, z, 0 );
/* sin(Inf or NaN) is NaN */
else
if ( ix >= 0x7f800000 ) return x - x;
/* argument reduction needed */
else {
n = susan___ieee754_rem_pio2f( x, y );
switch ( n & 3 ) {
case 0:
return susan___kernel_sinf( y[ 0 ], y[ 1 ], 1 );
case 1:
return susan___kernel_cosf( y[ 0 ], y[ 1 ] );
case 2:
return -susan___kernel_sinf( y[ 0 ], y[ 1 ], 1 );
default:
return -susan___kernel_cosf( y[ 0 ], y[ 1 ] );
}
}
}
/* s_fabsf.c -- float version of s_fabs.c.
Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
*/
/*
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
Developed at SunPro, a Sun Microsystems, Inc. business.
Permission to use, copy, modify, and distribute this
software is freely granted, provided that this notice
is preserved.
====================================================
*/
/*
fabsf(x) returns the absolute value of x.
*/
float susan___fabsf( float x )
{
u_int32_t ix;
GET_FLOAT_WORD( ix, x );
SET_FLOAT_WORD( x, ix & 0x7fffffff );
return x;
}

View File

@ -0,0 +1,54 @@
#ifndef _WCCLIBM
#define _WCCLIBM
#define int32_t int
#define uint32_t unsigned int
#define u_int16_t unsigned short
#define u_int32_t unsigned int
// Often used variables/consts
#ifdef __STDC__
static const float
#else
static float
#endif
susan_one = 1.0f,
susan_half = 5.0000000000e-01f, /* 0x3f000000 */
susan_zero = 0.0f,
susan_huge = 1.0e30,
susan_two8 = 2.5600000000e+02f, /* 0x43800000 */
susan_twon8 = 3.9062500000e-03f; /* 0x3b800000 */
// The following defines map the math functions to specialized calls
#define acos susan___ieee754_acosf
#define atan susan___atanf
#define cos susan___cosf
#define fabs susan___fabsf
#define fabsf susan___fabsf
#define isinf susan___isinff
#define pow susan___ieee754_powf
#define sqrt susan___ieee754_sqrtf
#define log10 susan___ieee754_log10f
#define log susan___ieee754_logf
#define sin susan___sinf
float susan___atanf( float x );
float susan___copysignf( float x, float y );
float susan___cosf( float x );
float susan___fabsf( float x );
float susan___floorf( float x );
float susan___ieee754_acosf( float x );
float susan___ieee754_powf( float x, float y );
int32_t susan___ieee754_rem_pio2f( float x, float *y );
float susan___ieee754_sqrtf( float x );
int susan___isinff ( float x );
float susan___kernel_cosf( float x, float y );
float susan___kernel_sinf( float x, float y, int iy );
int susan___kernel_rem_pio2f( float *x, float *y, int e0, int nx, int prec,
const int32_t *ipio2 );
float susan___scalbnf ( float x, int n );
float susan___ieee754_logf( float x );
float susan___ieee754_log10f( float x );
float susan___sinf( float x );
#endif // _WCCLIBM

View File

@ -0,0 +1,50 @@
#include "wccmalloc.h"
// This must be redefined for each new benchmark
#define HEAP_SIZE 30000
char susan_simulated_heap[ HEAP_SIZE ];
unsigned int susan_freeHeapPos;
void *susan_wccmalloc( unsigned int numberOfBytes )
{
// Get a 4-byte adress for alignment purposes
unsigned int offset = ( ( unsigned long )susan_simulated_heap +
susan_freeHeapPos ) % 4;
if ( offset )
susan_freeHeapPos += 4 - offset;
void *currentPos = ( void * )&susan_simulated_heap[ susan_freeHeapPos ];
susan_freeHeapPos += numberOfBytes;
return currentPos;
}
void susan_wccfreeall( void )
{
susan_freeHeapPos = 0;
}
void *susan_wccmemcpy( void *dstpp, const void *srcpp, unsigned int len )
{
unsigned long int dstp = ( long int ) dstpp;
unsigned long int srcp = ( long int ) srcpp;
_Pragma( "loopbound min 76 max 76" )
while ( len > 0 ) {
char __x = ( ( char * ) srcp )[ 0 ];
srcp += 1;
len -= 1;
( ( char * ) dstp )[ 0 ] = __x;
dstp += 1;
}
return dstpp;
}
void susan_wccmemset( void *p, int value, unsigned int num )
{
unsigned long i;
char *char_ptr = ( char * )p;
_Pragma( "loopbound min 7220 max 7220" )
for ( i = 0; i < num; ++i )
*char_ptr++ = ( unsigned char )value;
}

View File

@ -0,0 +1,10 @@
#ifndef _WCCMALLOC_H
#define _WCCMALLOC_H
void *susan_wccmalloc( unsigned int numberOfBytes );
//! Frees ALL allocated memory space
void susan_wccfreeall( void );
void *susan_wccmemcpy( void *dstpp, const void *srcpp, unsigned int len );
void susan_wccmemset( void *p, int value, unsigned int num );
#endif