215 Commits

Author SHA1 Message Date
67f364049c adds some message if disass will be in the trace file 2025-05-23 20:28:01 +02:00
047e2e12b0 fixes include issue in LLVM vm_base
vm_base.h needs to be included before gdb_session.h as termios.h (via
boost and gdb_server) has a define which clashes with a variable name in
ConstantRange.h (via iss/llvm/vm_base.h)
2025-05-09 20:14:09 +02:00
fe3ed49519 updates asmjit template, removes lots of comments from IR 2025-04-28 15:04:18 +02:00
1afd77a942 changes aes box functions to extern linkage 2025-04-28 15:02:05 +02:00
cdf5038e59 corrects fp functions for llvm 2025-04-03 09:59:22 +02:00
651897e1e4 corrects another oversight in tcc template wrt floating point 2025-04-03 09:19:02 +02:00
a1803c61c1 even more corrections to tcc template 2025-04-02 13:01:25 +02:00
bfa2182f8e corrects mistakes wrt tcc template 2025-04-02 12:20:42 +02:00
b01c9b27e5 corrects tcc template when using floating point 2025-04-02 12:18:45 +02:00
07f394d5ff corrects tcc template when using floating point 2025-04-02 11:53:55 +02:00
7e97329e78 adds UserProvidedFunctions for NaNBoxing, updates generated files, adapts to new fp API 2025-04-02 10:19:11 +02:00
8f5d666b7d corrects mistake from rebasing, adds newly generated templates 2025-03-31 12:50:05 +02:00
cc123939ce configures logger in main 2025-03-31 10:19:16 +02:00
a2e5405e25 small changes regarding vector template 2025-03-31 10:19:16 +02:00
cd3ec0b79d removes conversion functions in favor of more explicit conversions 2025-03-31 10:19:16 +02:00
0e35a2a8c9 adds complete Zfh support, small rework regarding floating point interface 2025-03-31 10:19:16 +02:00
8220c00a3d small correction for floating point h 2025-03-31 10:19:16 +02:00
ec5fb1e87e increases verbosity for file loading errors 2025-03-31 10:19:16 +02:00
453407568c removes carry_t, moves functionality to own functions 2025-03-31 10:19:16 +02:00
0fe9e6ebc8 corrects error for narrowing fp dispatch 2025-03-31 10:19:16 +02:00
484d9dbe08 removes rounding mode lookup as it is not needes 2025-03-31 10:19:15 +02:00
7a7035f267 adds support for half precision float 2025-03-31 10:19:15 +02:00
d9f1e5d31b small refactor 2025-03-31 10:19:15 +02:00
7b35f45a48 changes to make correct oversighst for XLEN=64 in Vector functions 2025-03-31 10:19:15 +02:00
ece6f7290f small bugfixes, adds some half point functionality 2025-03-31 10:19:15 +02:00
2166a6d81e makes widenning function types more explicit 2025-03-31 10:19:15 +02:00
fe9f2a5455 corrects vectorslide, changes all loop index type 2025-03-31 10:19:15 +02:00
42bf6ee380 corrects errors w.r.t. floating point dispatch 2025-03-31 10:19:15 +02:00
f0b582df6c corrects ambiguity in frsqrt 2025-03-31 10:19:15 +02:00
6fcb3dbb66 adds missing floating point instructions 2025-03-31 10:19:15 +02:00
c01eb39a76 reworks merge instrs, adds fp comparisons 2025-03-31 10:19:15 +02:00
08280a094f allows assigning to mask_view elements 2025-03-31 10:19:15 +02:00
ae90adc854 adds most fp functions 2025-03-31 10:19:15 +02:00
cd358198ad expands floating point functions 2025-03-31 10:19:14 +02:00
8746003d3e adds floating point reduction instrs, widening are untested 2025-03-31 10:19:14 +02:00
60d2b45a81 adds floating point Permutation Instructions 2025-03-31 10:19:14 +02:00
0264c5d66f small cleanup 2025-03-31 10:19:14 +02:00
528c2536af removes unused declarations 2025-03-31 10:19:14 +02:00
19e38ec898 corrects bug 2025-03-31 10:19:14 +02:00
fd11ce18c4 changes order of arguments to reflect assembly 2025-03-31 10:19:14 +02:00
9b7a9fa273 updates indexed load to use vreg_views 2025-03-31 10:19:14 +02:00
e24c1874c4 Changes load_store to use vreg_views aswell 2025-03-31 10:19:14 +02:00
221d2ee38c adds whole register moves 2025-03-31 10:19:14 +02:00
877cad27ba adds gather instructions 2025-03-31 10:19:14 +02:00
a26505cb5c adds more functions, up to slide 2025-03-31 10:19:13 +02:00
c1277b6528 adds mask_mask logical instructions 2025-03-31 10:19:13 +02:00
63889b02e7 adds widening reductions 2025-03-31 10:19:13 +02:00
f049d8cbb3 adds Integer Reduction Instructions 2025-03-31 10:19:13 +02:00
28ac169cfe adds narrowing fixed point instructions 2025-03-31 10:19:13 +02:00
a6f24db83a adds vssrl and vssra 2025-03-31 10:19:13 +02:00
e1911bc450 adds vsmul, widens functions parameters for sat_vector operations 2025-03-31 10:19:13 +02:00
75d96bf18d small cleanup, adds first fixed point instrs 2025-03-31 10:19:13 +02:00
e59458aa0e adds the missing vector csrs to the architectural state 2025-03-31 10:18:51 +02:00
77807fec01 adds merge and move instructions 2025-03-31 10:18:10 +02:00
6852d1d299 adds Vector Widening Integer Multiply-Add Instructions 2025-03-31 10:18:10 +02:00
ac1322d66b changes to ternary functions for Multiply-Add Instructions 2025-03-31 10:18:10 +02:00
9ba9d2432c adds Vector Widening Integer Multiply Instructions 2025-03-31 10:18:10 +02:00
c9b7962cd3 adds Vector Integer Divide Instructions 2025-03-31 10:18:10 +02:00
ab31fd27c9 adds single width integer instructins, also small cleanup 2025-03-31 10:18:10 +02:00
b3f189145f adds funct3 to vector functions 2025-03-31 10:18:10 +02:00
dd4416ab15 adds min/max instructions 2025-03-31 10:18:10 +02:00
0027946f90 renames mask operations to distinguish from vector integer compare instructions 2025-03-31 10:18:09 +02:00
feaff8c4a5 adds support for narrowing shifts 2025-03-31 10:18:09 +02:00
af3e76cc98 adds integer extension and add/substract with carry vector instructions 2025-03-31 10:18:09 +02:00
b1ceac2c2a small correction for vector_functions 2025-03-31 10:18:09 +02:00
b5862039e7 changes order of operands to more closely resemble assembly 2025-03-31 10:18:09 +02:00
51f3802394 adds vector_imm instructions to vector_functions, makes size of all involved registers a template parameter 2025-03-31 10:18:09 +02:00
6ce0d97e81 general improvements to vector_functions, adds functions to process arithmetic instructions (working add) 2025-03-31 10:18:09 +02:00
69c8fda5d2 corrects oversight in vector_functions 2025-03-31 10:18:09 +02:00
c1f9328528 corrects vector_functions 2025-03-31 10:18:09 +02:00
2b85748279 adds load_store_index to vector_functions 2025-03-31 10:18:09 +02:00
f7aa51b12e adds small optimization, clarifies variables in vector_functions 2025-03-31 10:18:09 +02:00
3428745a00 small corrections in vector functions 2025-03-31 10:18:09 +02:00
512b79a3e7 makes elem_count an explicit parameter for the softvector functions rather than calculating it from vtype 2025-03-31 10:18:08 +02:00
7a048f8b93 changes wording of returned index to better reflect what it means, cleans up a bit 2025-03-31 10:18:08 +02:00
6f4daf91ed adds explicit RFS to assertions 2025-03-31 10:18:08 +02:00
947d353bbf adds working vector (unit) stride (segmented) loads and stores 2025-03-31 10:18:08 +02:00
b95f518c91 updates templates for interp to make extension specific includes conditonal 2025-03-31 10:18:08 +02:00
4cef0f57c1 updates templates and adds newly generated files 2025-03-31 10:18:05 +02:00
28af695592 adds vector support to m and mu priv wrapper 2025-03-31 10:16:01 +02:00
f6cdd9d07c adds vector csr to riscv_common 2025-03-31 09:54:26 +02:00
9e390971d4 corrects include guard comment for fp_functions 2025-03-31 09:54:26 +02:00
2bb2e56310 adds dependencies for K ISA (Cryptography) 2025-03-31 09:54:26 +02:00
a0eeae7dd6 corrects template for new arch_if changes 2025-03-30 19:12:22 +02:00
8f491ef36b adds superflous exception throwing 2025-03-21 20:28:37 +01:00
cbe4c2d62f adds comment to indicate purpose of arch state members 2025-03-19 12:03:12 +01:00
31c6bb55f4 applies clang format 2025-03-16 14:38:45 +01:00
63d0162119 adds license header 2025-03-16 13:33:01 +01:00
3b294d9da0 fixes sc_core_adapter wrt refactored memory hierarchy 2025-03-16 12:29:03 +01:00
54233b448d moves mmu related code into mmu unit 2025-03-16 08:50:01 +01:00
e238369e18 cleansup htif call 2025-03-15 06:54:21 +01:00
cfc980a069 Merge branch 'feature/privilege_refactor' into develop 2025-03-14 20:00:07 +01:00
502f3e8df9 fixes htif behavior and instrumentation interface 2025-03-14 19:43:20 +01:00
88475bfa55 changes the io_buf 2025-03-14 12:14:20 +01:00
71260a3ef4 Merge remote-tracking branch 'origin/feature/htif' into develop 2025-03-14 11:32:36 +01:00
23842742a6 factors clic & pmp into separate units 2025-03-13 12:13:41 +01:00
a13b7ac6d3 separates functional memory into separate unit 2025-03-12 09:26:51 +01:00
aaebeaf023 changes the io_buf 2025-03-11 12:00:31 +01:00
fb0f6255e9 replaces virtual functions with memory pointers (kind of) 2025-03-11 08:31:25 +01:00
57d5ea92be moves common functionality to base class 2025-03-10 16:00:26 +01:00
383d762abc applies clang-format and updates SystemC HTIF implementation 2025-03-06 12:10:12 +01:00
03cbd305c6 replaces literal constant with symbolic definition 2025-02-28 19:34:07 +01:00
9f5326c110 extends htif for 32bit systems 2025-02-13 13:39:47 +01:00
f4718c6de3 Merge remote-tracking branch 'origin/feature/htif' into develop 2025-02-13 09:34:31 +01:00
53de21eef9 adds generator changed output 2025-02-12 20:45:04 +01:00
d443c89c87 removes llvm from dbt-rise-tgc build system as it is handled in dbt-rise-core 2024-12-28 13:10:49 +01:00
9a2df32d57 updates templates 2024-12-28 13:07:07 +01:00
be0f783af8 adds cycle increment to tcc 2024-12-28 13:06:46 +01:00
1089800682 updates vm_impls and core.h to work with new vm_base 2024-12-28 08:24:09 +01:00
a6a6f51f0b adds clang-format fixes 2024-12-06 15:50:50 +01:00
21e1f791ad corrects sysc integration template and corresponding file 2024-12-06 09:49:02 +01:00
be6f5791fa adds update to cyclecount after each instr for asmjit 2024-11-26 20:26:18 +01:00
d907dc7f54 corrects tohost functionality and minor cleanup 2024-11-22 17:35:12 +01:00
75e81ce236 copies new tohost implemenation from hart_m_p 2024-11-14 16:51:26 +01:00
82a70efdb8 small reorder to make tohost output more readable 2024-11-14 16:51:26 +01:00
978c3db06e minor improvements to readability 2024-11-14 16:51:26 +01:00
0e88664ff7 adds better tohost writing implementation, allowing the standard riscv-isa-test benchmarks to run 2024-11-14 16:51:26 +01:00
ac818f304d increases verbosity incase elf loading goes wrong 2024-10-21 16:42:58 +02:00
ad60449073 updates generated cores 2024-09-27 20:04:58 +02:00
b45b3589fa updates templates to immediately trap when gen_trap is called 2024-09-27 20:03:51 +02:00
1fb7e8fcea improves logging output 2024-09-24 08:39:34 +02:00
5f9d0beafb corrects softfloat to comply with RVD ACT 2024-09-23 22:22:57 +02:00
4c0d1c75aa adds addr formatting to logging 2024-09-23 12:21:43 +02:00
2f3abf2f76 adds namespaces for ELFIO 2024-09-23 11:55:18 +02:00
62768bf81e applies clang format 2024-09-23 10:05:33 +02:00
f6be8ec006 adds elfio test utility 2024-09-23 09:29:08 +02:00
a8f56b6e27 removes code dupication by unifying elf file read 2024-09-23 09:28:27 +02:00
76ea0db25d adds newest generated vm_impl 2024-08-17 23:19:51 +02:00
ec1b820c18 fixes target xml generation 2024-08-17 19:36:53 +02:00
64329cf0f6 fixes use of icount vs. cycle 2024-08-17 19:36:40 +02:00
9de0aed84d expands some error message 2024-08-17 16:55:49 +02:00
bb4e2766d1 applies clang-format 2024-08-17 16:12:57 +02:00
0996d15bd4 removes debug code 2024-08-17 12:48:48 +02:00
6305efa7c2 implements proper target XML generation incl. CSRs 2024-08-17 12:40:40 +02:00
de79adc50d updates debugger hook to stop before fetching instructions
this relates to https://github.com/Minres/DBT-RISE-RISCV/issues/8 :
Debugger loses control when trap vector fetch fails

and https://github.com/Minres/DBT-RISE-RISCV/issues/7 : Two debugger
single-steps are required at reset vector
2024-08-17 12:39:54 +02:00
0473aa5344 fixes SystemC wrapper wrt. templated core_complex 2024-08-17 12:34:17 +02:00
a45fcd28db updates fn calling generation 2024-08-17 08:22:04 +02:00
0f15032210 removes gen_wait as wait can be called like any other extern function 2024-08-14 15:25:06 +02:00
efc11d87a5 updates template with fcsr check, adds extra braces on If Statements 2024-08-14 14:32:58 +02:00
4a19e27926 adds changes due to generator being more inline with others 2024-08-14 13:52:08 +02:00
c15cdb0955 expands return values of jit creating functions to inhibit endless trapping 2024-08-14 11:49:59 +02:00
6609d12582 adds flimit that gets properly evaluated in interp 2024-08-13 15:22:34 +02:00
b5341700aa updates template and adds braces when using conditions 2024-08-13 08:55:14 +02:00
0b5062d21c adds fp_functions here to remove dependencies in dbt-rise-core 2024-08-09 11:56:32 +02:00
fbca690b3b replaces gen_wait, updates template to include fp_functions when necessary 2024-08-08 12:57:08 +02:00
235a7e6e24 updates template 2024-08-08 11:08:28 +02:00
62d21e1156 updates disass 2024-08-07 09:21:07 +02:00
9c51d6eade improves interp, only calls decode once per instr 2024-08-07 09:20:11 +02:00
2878dca6b5 updates templates 2024-08-06 08:32:05 +02:00
c28e8fd00c removes left-overs 2024-08-04 18:57:20 +02:00
b3cc9d2346 makes core_complex a template 2024-08-04 18:47:32 +02:00
933f08494c removes C++17 dependency from asmjit backend 2024-08-04 17:41:49 +02:00
21f8eab432 adds regenerated tgc5c 2024-08-02 19:18:28 +02:00
6ddb8da07f fixes missing rename 2024-08-02 11:58:51 +02:00
edf456c59f fixes missing braces 2024-08-02 10:33:15 +02:00
42efced1eb fixes FCSR behavior if no floating point is implemented 2024-08-02 08:59:22 +02:00
c376e34b2b applies clang format 2024-08-01 11:02:10 +02:00
f579ec6e48 changes access to rounding mode to fail explicitly instead of unintended behavior 2024-07-31 12:30:41 +02:00
fd20e66f1f changes softfloat API usage, all effected Instrs pass test suite 2024-07-31 12:30:41 +02:00
5d69b79232 reverts patches in softfloat 2024-07-31 12:30:41 +02:00
2edd68d1bd refactors zeroProd branch to allow for better case handling 2024-07-31 12:30:41 +02:00
7ffa7667b6 fixes concerning FMADD_S, FMSUB_S, FNMADD_S, and FNSUB_S
mostly about ensuring correct sign
2024-07-31 12:30:41 +02:00
93d89e07ca removes wrong compile definition 2024-07-31 12:30:41 +02:00
17dcba4b90 updates softfloat to #b51ef8f of softfloat3
https://github.com/ucb-bar/berkeley-softfloat-3/
2024-07-31 12:30:41 +02:00
39d2518fdd checkin: tgc5f builds and runs through 2024-07-31 12:30:41 +02:00
a365110054 fix format 2024-07-30 13:34:23 +02:00
d2efb23ff7 fixes cache behavior for fetches 2024-07-25 19:33:50 +02:00
04b7a09b19 updates date in templates 2024-07-25 17:25:12 +02:00
72b11beac5 moves decoder to dbt-rise-core 2024-07-25 10:13:38 +02:00
e87b7d5fd0 applies clang-format 2024-07-24 14:48:50 +02:00
5a2b96ef3e adds logging categories for ISS 2024-07-24 12:30:07 +02:00
c6b99cd155 introduces new decoder to interp backend 2024-07-24 12:28:35 +02:00
b1306c3a47 improves instruction decoding by avoiding copying, replaces .size() 2024-07-24 08:54:37 +02:00
0d6bf924ed changes jh.globals from map to vector 2024-07-23 15:45:51 +02:00
86de536c8f changes jh globals to seperate riscv specifics 2024-07-23 14:35:31 +02:00
051dd5e2d3 updates templates for decoder in seperate class, adds again generated templates 2024-07-23 13:46:10 +02:00
e3942be776 Introduces decoder in a seperate class 2024-07-23 13:08:53 +02:00
6ee484a771 moves instruction decoder into own class 2024-07-23 11:30:33 +02:00
60808c8649 corrects template since util fns are no longer vm_base members 2024-07-23 11:29:56 +02:00
0432803d82 updates templates and vm impls for better LAST_BRANCH handling 2024-07-22 09:04:17 +02:00
4f5d9214ed adds newly generated instr.yaml 2024-07-18 14:31:36 +02:00
d42d2ce533 corrects illegal instruction for llvm 2024-07-18 14:04:23 +02:00
236d12d7f5 integrates gen_bool for Conditions (was truncation) into llvm 2024-07-18 13:30:42 +02:00
e1b6cab890 removes setting of NEXT_PC to max when trapping in llvm and asmjit, adds default disass to llvm 2024-07-18 12:02:40 +02:00
8361f88718 removes setting of NEXT_PC to max if trap 2024-07-18 11:37:53 +02:00
2ec7ea4b41 removes leftover gen_sync in asmjit 2024-07-17 22:39:12 +02:00
b24965d321 corrects gen_sync update order, improves illegal instruction 2024-07-17 20:52:01 +02:00
244bf6d2f2 corrects gen_sync before trap check, improves illegal_instruction 2024-07-17 20:25:49 +02:00
1a4465a371 changes template: adds correct illegal instruction, reorders gen_sync to allow correct instr id eve when trapping, adds newly generated vm 2024-07-17 19:59:01 +02:00
fa82a50824 fixes typo in templates 2024-07-17 17:24:17 +02:00
6dc17857da updates template 2024-07-17 15:36:08 +02:00
11a30caae8 integrates generator changes to canPrecompute 2024-07-17 15:14:13 +02:00
ac1a26a10c integrates new tval changes into llvm 2024-07-17 14:17:02 +02:00
7a199e122d integrates new tval changes into asmjit 2024-07-17 09:42:12 +02:00
d8c3d2e19c integrates new tval changes into tcc 2024-07-16 17:35:23 +02:00
375755999a integrates new tval changes 2024-07-16 15:32:35 +02:00
9996fd4833 change cache line size to 64 2024-07-11 14:03:58 +02:00
149b3136d2 updates generated files 2024-07-10 12:55:36 +02:00
ac8f8b0539 updates vms with fixed Zc in tgc5c.core_desc 2024-07-10 12:51:59 +02:00
b2cbf90d0b updates generated files 2024-07-10 12:51:59 +02:00
373145478e updats file because of generator changes 2024-07-10 12:51:59 +02:00
55b0cea94f changes vm_base util API 2024-07-10 12:51:59 +02:00
5b17599aa2 allows usage of std::variants 2024-07-10 12:51:59 +02:00
4cfb15c7cd Asmjit and interp working 2024-07-10 12:51:31 +02:00
63da7f8d57 applies clang-format 2024-07-09 13:57:11 +02:00
fb4012fbd1 moves likely annotation 2024-07-09 13:52:10 +02:00
24449f1c0f fixes some elf load issue 2024-07-05 12:18:36 +02:00
fd303c8343 fixes asmjit deprecation warning 2024-07-05 07:51:37 +02:00
346b177a87 extends finishing conditions 2024-07-05 05:52:29 +02:00
d4ec131fa7 change COUNT_LIMIT to ICOUNT_LIMIT 2024-07-04 10:46:24 +02:00
48370a4555 asmjit passes backend with new CoreDSL 2024-06-22 09:28:26 +02:00
36b076774e Merge branch 'develop' of https://git.minres.com/DBT-RISE/DBT-RISE-TGC into develop 2024-06-21 13:35:30 +02:00
482a4ec253 fixes semihosting callbacks in templates 2024-06-21 13:35:25 +02:00
2fb28364c5 fixes remaining templates 2024-06-21 10:49:36 +02:00
8460f4ab7f updates templates to re-enable interactive debugging of generator 2024-06-21 10:46:11 +02:00
536 changed files with 65003 additions and 56226 deletions

View File

@ -18,8 +18,11 @@ add_subdirectory(softfloat)
set(LIB_SOURCES set(LIB_SOURCES
src/iss/plugin/instruction_count.cpp src/iss/plugin/instruction_count.cpp
src/iss/arch/tgc5c.cpp src/iss/arch/tgc5c.cpp
src/iss/mem/memory_if.cpp
src/vm/interp/vm_tgc5c.cpp src/vm/interp/vm_tgc5c.cpp
src/vm/fp_functions.cpp src/vm/fp_functions.cpp
src/vm/vector_functions.cpp
src/iss/debugger/csr_names.cpp
src/iss/semihosting/semihosting.cpp src/iss/semihosting/semihosting.cpp
) )
@ -108,16 +111,6 @@ if(TARGET yaml-cpp::yaml-cpp)
target_link_libraries(${PROJECT_NAME} PUBLIC yaml-cpp::yaml-cpp) target_link_libraries(${PROJECT_NAME} PUBLIC yaml-cpp::yaml-cpp)
endif() endif()
if(WITH_LLVM)
find_package(LLVM)
target_compile_definitions(${PROJECT_NAME} PUBLIC ${LLVM_DEFINITIONS})
target_include_directories(${PROJECT_NAME} PUBLIC ${LLVM_INCLUDE_DIRS})
if(BUILD_SHARED_LIBS)
target_link_libraries(${PROJECT_NAME} PUBLIC ${LLVM_LIBRARIES})
endif()
endif()
set_target_properties(${PROJECT_NAME} PROPERTIES set_target_properties(${PROJECT_NAME} PROPERTIES
VERSION ${PROJECT_VERSION} VERSION ${PROJECT_VERSION}
FRAMEWORK FALSE FRAMEWORK FALSE
@ -261,3 +254,9 @@ if(TARGET scc-sysc)
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} # headers INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} # headers
) )
endif() endif()
project(elfio-test)
find_package(Boost COMPONENTS program_options thread REQUIRED)
add_executable(${PROJECT_NAME} src/elfio.cpp)
target_link_libraries(${PROJECT_NAME} PUBLIC elfio::elfio)

View File

@ -20,7 +20,7 @@ RVI:
mask: 0b00000000000000000000000001111111 mask: 0b00000000000000000000000001111111
size: 32 size: 32
branch: true branch: true
delay: 1 delay: [1,1]
JALR: JALR:
index: 3 index: 3
encoding: 0b00000000000000000000000001100111 encoding: 0b00000000000000000000000001100111

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (C) 2017 - 2020 MINRES Technologies GmbH * Copyright (C) 2024 MINRES Technologies GmbH
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -47,10 +47,10 @@ def getRegisterSizes(){
using namespace iss::arch; using namespace iss::arch;
constexpr std::array<const char*, ${registers.size}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_names; constexpr std::array<const char*, ${registers.size()}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_names;
constexpr std::array<const char*, ${registers.size}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_aliases; constexpr std::array<const char*, ${registers.size()}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_aliases;
constexpr std::array<const uint32_t, ${getRegisterSizes().size}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_bit_widths; constexpr std::array<const uint32_t, ${getRegisterSizes().size()}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_bit_widths;
constexpr std::array<const uint32_t, ${getRegisterSizes().size}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_byte_offsets; constexpr std::array<const uint32_t, ${getRegisterSizes().size()}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_byte_offsets;
${coreDef.name.toLowerCase()}::${coreDef.name.toLowerCase()}() = default; ${coreDef.name.toLowerCase()}::${coreDef.name.toLowerCase()}() = default;

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (C) 2017 - 2021 MINRES Technologies GmbH * Copyright (C) 2024 MINRES Technologies GmbH
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -30,11 +30,21 @@
* *
*******************************************************************************/ *******************************************************************************/
<% <%
def nativeTypeSize(int size){ def nativeSize(int size){
if(size<=8) return 8; else if(size<=16) return 16; else if(size<=32) return 32; else return 64; if(size<=8) return 8;
if(size<=16) return 16;
if(size<=32) return 32;
if(size<=64) return 64;
if(size<=128) return 128;
if(size<=256) return 256;
if(size<=512) return 512;
if(size<=1024) return 1024;
if(size<=2048) return 2048;
if(size<=4096) return 4096;
throw new IllegalArgumentException("Unsupported size in nativeSize in CORENAME.h.gtl");
} }
def getRegisterSizes(){ def getRegisterSizes(){
def regs = registers.collect{nativeTypeSize(it.size)} def regs = registers.collect{nativeSize(it.size)}
regs+=[32,32, 64, 64, 64, 32, 32] // append TRAP_STATE, PENDING_TRAP, ICOUNT, CYCLE, INSTRET, INSTRUCTION, LAST_BRANCH regs+=[32,32, 64, 64, 64, 32, 32] // append TRAP_STATE, PENDING_TRAP, ICOUNT, CYCLE, INSTRET, INSTRUCTION, LAST_BRANCH
return regs return regs
} }
@ -47,13 +57,7 @@ def getRegisterOffsets(){
} }
return offsets return offsets
} }
def byteSize(int size){
if(size<=8) return 8;
if(size<=16) return 16;
if(size<=32) return 32;
if(size<=64) return 64;
return 128;
}
def getCString(def val){ def getCString(def val){
return val.toString()+'ULL' return val.toString()+'ULL'
} }
@ -75,15 +79,17 @@ template <> struct traits<${coreDef.name.toLowerCase()}> {
constexpr static char const* const core_type = "${coreDef.name}"; constexpr static char const* const core_type = "${coreDef.name}";
static constexpr std::array<const char*, ${registers.size}> reg_names{ static constexpr std::array<const char*, ${registers.size()}> reg_names{
{"${registers.collect{it.name.toLowerCase()}.join('", "')}"}}; {"${registers.collect{it.name.toLowerCase()}.join('", "')}"}};
static constexpr std::array<const char*, ${registers.size}> reg_aliases{ static constexpr std::array<const char*, ${registers.size()}> reg_aliases{
{"${registers.collect{it.alias.toLowerCase()}.join('", "')}"}}; {"${registers.collect{it.alias.toLowerCase()}.join('", "')}"}};
enum constants {${constants.collect{c -> c.name+"="+getCString(c.value)}.join(', ')}}; enum constants {${constants.collect{c -> c.name+"="+getCString(c.value)}.join(', ')}};
constexpr static unsigned FP_REGS_SIZE = ${constants.find {it.name=='FLEN'}?.value?:0}; constexpr static unsigned FP_REGS_SIZE = ${constants.find {it.name=='FLEN'}?.value?:0};
constexpr static unsigned V_REGS_SIZE = ${constants.find {it.name=='VLEN'}?.value?:0};
enum reg_e { enum reg_e {
${registers.collect{it.name}.join(', ')}, NUM_REGS, TRAP_STATE=NUM_REGS, PENDING_TRAP, ICOUNT, CYCLE, INSTRET, INSTRUCTION, LAST_BRANCH ${registers.collect{it.name}.join(', ')}, NUM_REGS, TRAP_STATE=NUM_REGS, PENDING_TRAP, ICOUNT, CYCLE, INSTRET, INSTRUCTION, LAST_BRANCH
@ -99,10 +105,10 @@ template <> struct traits<${coreDef.name.toLowerCase()}> {
using phys_addr_t = iss::typed_addr_t<iss::address_type::PHYSICAL>; using phys_addr_t = iss::typed_addr_t<iss::address_type::PHYSICAL>;
static constexpr std::array<const uint32_t, ${getRegisterSizes().size}> reg_bit_widths{ static constexpr std::array<const uint32_t, ${getRegisterSizes().size()}> reg_bit_widths{
{${getRegisterSizes().join(',')}}}; {${getRegisterSizes().join(',')}}};
static constexpr std::array<const uint32_t, ${getRegisterOffsets().size}> reg_byte_offsets{ static constexpr std::array<const uint32_t, ${getRegisterOffsets().size()}> reg_byte_offsets{
{${getRegisterOffsets().join(',')}}}; {${getRegisterOffsets().join(',')}}};
static const uint64_t addr_mask = (reg_t(1) << (XLEN - 1)) | ((reg_t(1) << (XLEN - 1)) - 1); static const uint64_t addr_mask = (reg_t(1) << (XLEN - 1)) | ((reg_t(1) << (XLEN - 1)) - 1);
@ -131,8 +137,6 @@ struct ${coreDef.name.toLowerCase()}: public arch_if {
uint8_t* get_regs_base_ptr() override; uint8_t* get_regs_base_ptr() override;
inline uint64_t get_icount() { return reg.icount; }
inline bool should_stop() { return interrupt_sim; } inline bool should_stop() { return interrupt_sim; }
inline uint64_t stop_code() { return interrupt_sim; } inline uint64_t stop_code() { return interrupt_sim; }
@ -141,20 +145,20 @@ struct ${coreDef.name.toLowerCase()}: public arch_if {
virtual iss::sync_type needed_sync() const { return iss::NO_SYNC; } virtual iss::sync_type needed_sync() const { return iss::NO_SYNC; }
inline uint32_t get_last_branch() { return reg.last_branch; }
#pragma pack(push, 1) #pragma pack(push, 1)
struct ${coreDef.name}_regs {<% struct ${coreDef.name}_regs {<%
registers.each { reg -> if(reg.size>0) {%> registers.each { reg -> if(reg.size>64) {%>
uint${byteSize(reg.size)}_t ${reg.name} = 0;<% uint8_t ${reg.name}[${reg.size/8}] = {0};<%
}else if(reg.size>0) {%>
uint${nativeSize(reg.size)}_t ${reg.name} = 0;<%
}}%> }}%>
uint32_t trap_state = 0, pending_trap = 0; uint32_t trap_state = 0, pending_trap = 0;
uint64_t icount = 0; uint64_t icount = 0; // counts number of instructions undisturbed
uint64_t cycle = 0; uint64_t cycle = 0; // counts number of cycles, in functional mode equals icount
uint64_t instret = 0; uint64_t instret = 0; // counts number of instructions, can be reset via CSR write
uint32_t instruction = 0; uint32_t instruction = 0; // holds op code of currently executed instruction
uint32_t last_branch = 0; uint32_t last_branch = 0; // indicates if last branch was taken
} reg; } reg;
#pragma pack(pop) #pragma pack(pop)
std::array<address_type, 4> addr_mode; std::array<address_type, 4> addr_mode;
@ -168,6 +172,31 @@ if(fcsr != null) {%>
<%} else { %> <%} else { %>
uint32_t get_fcsr(){return 0;} uint32_t get_fcsr(){return 0;}
void set_fcsr(uint32_t val){} void set_fcsr(uint32_t val){}
<%}
def vstart = registers.find {it.name=='vstart'}
def vl = registers.find {it.name=='vl'}
def vtype = registers.find {it.name=='vtype'}
def vxsat = registers.find {it.name=='vxsat'}
def vxrm = registers.find {it.name=='vxrm'}
if(vtype != null) {%>
uint${vstart.size}_t get_vstart(){return reg.vstart;}
void set_vstart(uint${vstart.size}_t val){reg.vstart = val;}
uint${vl.size}_t get_vl(){return reg.vl;}
uint${vtype.size}_t get_vtype(){return reg.vtype;}
uint${vxsat.size}_t get_vxsat(){return reg.vxsat;}
void set_vxsat(uint${vxsat.size}_t val){reg.vxsat = val;}
uint${vxrm.size}_t get_vxrm(){return reg.vxrm;}
void set_vxrm(uint${vxrm.size}_t val){reg.vxrm = val;}
<%} else { %>
uint32_t get_vstart(){return 0;}
void set_vstart(uint32_t val){}
uint32_t get_vl(){return 0;}
uint32_t get_vtype(){return 0;}
uint32_t get_vxsat(){return 0;}
void set_vxsat(uint32_t val){}
uint32_t get_vxrm(){return 0;}
void set_vxrm(uint32_t val){}
<%}%> <%}%>
}; };

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (C) 2023 MINRES Technologies GmbH * Copyright (C) 2024 MINRES Technologies GmbH
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -45,17 +45,17 @@ namespace interp {
using namespace sysc; using namespace sysc;
volatile std::array<bool, ${array_count}> ${coreDef.name.toLowerCase()}_init = { volatile std::array<bool, ${array_count}> ${coreDef.name.toLowerCase()}_init = {
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|m_p|interp", [](unsigned gdb_port, void* data) -> iss_factory::base_t { iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|m_p|interp", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex*>(data); auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_m_p<arch::${coreDef.name.toLowerCase()}>>(cc); auto* cpu = new sc_core_adapter<arch::riscv_hart_m_p<arch::${coreDef.name.toLowerCase()}>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}}; return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
}), }),
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p|interp", [](unsigned gdb_port, void* data) -> iss_factory::base_t { iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p|interp", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex*>(data); auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}>>(cc); auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}}; return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
})<%if(coreDef.name.toLowerCase()=="tgc5d" || coreDef.name.toLowerCase()=="tgc5e") {%>, })<%if(coreDef.name.toLowerCase()=="tgc5d" || coreDef.name.toLowerCase()=="tgc5e") {%>,
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p_clic_pmp|interp", [](unsigned gdb_port, void* data) -> iss_factory::base_t { iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p_clic_pmp|interp", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex*>(data); auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}, (iss::arch::features_e)(iss::arch::FEAT_PMP | iss::arch::FEAT_EXT_N | iss::arch::FEAT_CLIC)>>(cc); auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}, (iss::arch::features_e)(iss::arch::FEAT_PMP | iss::arch::FEAT_EXT_N | iss::arch::FEAT_CLIC)>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}}; return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
})<%}%> })<%}%>
@ -66,17 +66,17 @@ namespace llvm {
using namespace sysc; using namespace sysc;
volatile std::array<bool, ${array_count}> ${coreDef.name.toLowerCase()}_init = { volatile std::array<bool, ${array_count}> ${coreDef.name.toLowerCase()}_init = {
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|m_p|llvm", [](unsigned gdb_port, void* data) -> iss_factory::base_t { iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|m_p|llvm", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex*>(data); auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_m_p<arch::${coreDef.name.toLowerCase()}>>(cc); auto* cpu = new sc_core_adapter<arch::riscv_hart_m_p<arch::${coreDef.name.toLowerCase()}>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}}; return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
}), }),
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p|llvm", [](unsigned gdb_port, void* data) -> iss_factory::base_t { iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p|llvm", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex*>(data); auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}>>(cc); auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}}; return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
})<%if(coreDef.name.toLowerCase()=="tgc5d" || coreDef.name.toLowerCase()=="tgc5e") {%>, })<%if(coreDef.name.toLowerCase()=="tgc5d" || coreDef.name.toLowerCase()=="tgc5e") {%>,
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p_clic_pmp|llvm", [](unsigned gdb_port, void* data) -> iss_factory::base_t { iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p_clic_pmp|llvm", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex*>(data); auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}, (iss::arch::features_e)(iss::arch::FEAT_PMP | iss::arch::FEAT_EXT_N | iss::arch::FEAT_CLIC)>>(cc); auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}, (iss::arch::features_e)(iss::arch::FEAT_PMP | iss::arch::FEAT_EXT_N | iss::arch::FEAT_CLIC)>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}}; return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
})<%}%> })<%}%>
@ -88,17 +88,17 @@ namespace tcc {
using namespace sysc; using namespace sysc;
volatile std::array<bool, ${array_count}> ${coreDef.name.toLowerCase()}_init = { volatile std::array<bool, ${array_count}> ${coreDef.name.toLowerCase()}_init = {
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|m_p|tcc", [](unsigned gdb_port, void* data) -> iss_factory::base_t { iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|m_p|tcc", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex*>(data); auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_m_p<arch::${coreDef.name.toLowerCase()}>>(cc); auto* cpu = new sc_core_adapter<arch::riscv_hart_m_p<arch::${coreDef.name.toLowerCase()}>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}}; return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
}), }),
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p|tcc", [](unsigned gdb_port, void* data) -> iss_factory::base_t { iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p|tcc", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex*>(data); auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}>>(cc); auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}}; return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
})<%if(coreDef.name.toLowerCase()=="tgc5d" || coreDef.name.toLowerCase()=="tgc5e") {%>, })<%if(coreDef.name.toLowerCase()=="tgc5d" || coreDef.name.toLowerCase()=="tgc5e") {%>,
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p_clic_pmp|tcc", [](unsigned gdb_port, void* data) -> iss_factory::base_t { iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p_clic_pmp|tcc", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex*>(data); auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}, (iss::arch::features_e)(iss::arch::FEAT_PMP | iss::arch::FEAT_EXT_N | iss::arch::FEAT_CLIC)>>(cc); auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}, (iss::arch::features_e)(iss::arch::FEAT_PMP | iss::arch::FEAT_EXT_N | iss::arch::FEAT_CLIC)>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}}; return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
})<%}%> })<%}%>
@ -110,17 +110,17 @@ namespace asmjit {
using namespace sysc; using namespace sysc;
volatile std::array<bool, ${array_count}> ${coreDef.name.toLowerCase()}_init = { volatile std::array<bool, ${array_count}> ${coreDef.name.toLowerCase()}_init = {
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|m_p|asmjit", [](unsigned gdb_port, void* data) -> iss_factory::base_t { iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|m_p|asmjit", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex*>(data); auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_m_p<arch::${coreDef.name.toLowerCase()}>>(cc); auto* cpu = new sc_core_adapter<arch::riscv_hart_m_p<arch::${coreDef.name.toLowerCase()}>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}}; return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
}), }),
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p|asmjit", [](unsigned gdb_port, void* data) -> iss_factory::base_t { iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p|asmjit", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex*>(data); auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}>>(cc); auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}}; return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
})<%if(coreDef.name.toLowerCase()=="tgc5d" || coreDef.name.toLowerCase()=="tgc5e") {%>, })<%if(coreDef.name.toLowerCase()=="tgc5d" || coreDef.name.toLowerCase()=="tgc5e") {%>,
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p_clic_pmp|asmjit", [](unsigned gdb_port, void* data) -> iss_factory::base_t { iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p_clic_pmp|asmjit", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex*>(data); auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}, (iss::arch::features_e)(iss::arch::FEAT_PMP | iss::arch::FEAT_EXT_N | iss::arch::FEAT_CLIC)>>(cc); auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}, (iss::arch::features_e)(iss::arch::FEAT_PMP | iss::arch::FEAT_EXT_N | iss::arch::FEAT_CLIC)>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}}; return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
})<%}%> })<%}%>

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (C) 2017, 2023 MINRES Technologies GmbH * Copyright (C) 2017-2024 MINRES Technologies GmbH
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -37,7 +37,14 @@
#include <iss/asmjit/vm_base.h> #include <iss/asmjit/vm_base.h>
#include <asmjit/asmjit.h> #include <asmjit/asmjit.h>
#include <util/logging.h> #include <util/logging.h>
#include <iss/instruction_decoder.h>
<%def fcsr = registers.find {it.name=='FCSR'}
if(fcsr != null) {%>
#include <vm/fp_functions.h><%}
def aes = functions.find { it.contains('aes') }
if(aes != null) {%>
#include <vm/aes_sbox.h>
<%}%>
#ifndef FMT_HEADER_ONLY #ifndef FMT_HEADER_ONLY
#define FMT_HEADER_ONLY #define FMT_HEADER_ONLY
#endif #endif
@ -46,6 +53,22 @@
#include <array> #include <array>
#include <iss/debugger/riscv_target_adapter.h> #include <iss/debugger/riscv_target_adapter.h>
#ifndef _MSC_VER
using int128_t = __int128;
using uint128_t = unsigned __int128;
namespace std {
template <> struct make_unsigned<__int128> { typedef unsigned __int128 type; };
template <> class __make_unsigned_selector<__int128 unsigned, false, false> {
public:
typedef unsigned __int128 __type;
};
template <> struct is_signed<int128_t> { static constexpr bool value = true; };
template <> struct is_signed<uint128_t> { static constexpr bool value = false; };
template <> struct is_unsigned<int128_t> { static constexpr bool value = false; };
template <> struct is_unsigned<uint128_t> { static constexpr bool value = true; };
} // namespace std
#endif
namespace iss { namespace iss {
namespace asmjit { namespace asmjit {
@ -80,61 +103,67 @@ public:
protected: protected:
using super::get_ptr_for; using super::get_ptr_for;
using super::get_reg;
using super::get_reg_for; using super::get_reg_for;
using super::get_reg_for_Gp;
using super::load_reg_from_mem; using super::load_reg_from_mem;
using super::load_reg_from_mem_Gp;
using super::write_reg_to_mem; using super::write_reg_to_mem;
using super::gen_ext;
using super::gen_read_mem; using super::gen_read_mem;
using super::gen_write_mem; using super::gen_write_mem;
using super::gen_wait;
using super::gen_leave; using super::gen_leave;
using super::gen_operation; using super::gen_sync;
using this_class = vm_impl<ARCH>; using this_class = vm_impl<ARCH>;
using compile_func = continuation_e (this_class::*)(virt_addr_t&, code_word_t, jit_holder&); using compile_func = continuation_e (this_class::*)(virt_addr_t&, code_word_t, jit_holder&);
continuation_e gen_single_inst_behavior(virt_addr_t&, unsigned int &, jit_holder&) override; continuation_e gen_single_inst_behavior(virt_addr_t&, jit_holder&) override;
enum globals_e {TVAL = 0, GLOBALS_SIZE};
void gen_block_prologue(jit_holder& jh) override; void gen_block_prologue(jit_holder& jh) override;
void gen_block_epilogue(jit_holder& jh) override; void gen_block_epilogue(jit_holder& jh) override;
inline const char *name(size_t index){return traits::reg_aliases.at(index);} inline const char *name(size_t index){return traits::reg_aliases.at(index);}
<%if(fcsr != null) {%>
inline const char *fname(size_t index){return index < 32?name(index+traits::F0):"illegal";}
<%}%>
void gen_instr_prologue(jit_holder& jh); void gen_instr_prologue(jit_holder& jh);
void gen_instr_epilogue(jit_holder& jh); void gen_instr_epilogue(jit_holder& jh);
inline void gen_raise(jit_holder& jh, uint16_t trap_id, uint16_t cause); inline void gen_raise(jit_holder& jh, uint16_t trap_id, uint16_t cause);
template <typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type> void gen_set_tval(jit_holder& jh, T new_tval) ;
void gen_set_tval(jit_holder& jh, x86_reg_t _new_tval) ;
template<unsigned W, typename U, typename S = typename std::make_signed<U>::type> template<unsigned W, typename U, typename S = typename std::make_signed<U>::type>
inline S sext(U from) { inline S sext(U from) {
auto mask = (1ULL<<W) - 1; auto mask = (1ULL<<W) - 1;
auto sign_mask = 1ULL<<(W-1); auto sign_mask = 1ULL<<(W-1);
return (from & mask) | ((from & sign_mask) ? ~mask : 0); return (from & mask) | ((from & sign_mask) ? ~mask : 0);
} }
inline void raise(uint16_t trap_id, uint16_t cause){
auto trap_val = 0x80ULL << 24 | (cause << 16) | trap_id;
this->core.reg.trap_state = trap_val;
}
<%functions.each{ it.eachLine { %>
${it}<%}
}%>
private: private:
/**************************************************************************** /****************************************************************************
* start opcode definitions * start opcode definitions
****************************************************************************/ ****************************************************************************/
struct instruction_descriptor { struct instruction_descriptor {
size_t length; uint32_t length;
uint32_t value; uint32_t value;
uint32_t mask; uint32_t mask;
compile_func op; compile_func op;
}; };
struct decoding_tree_node{
std::vector<instruction_descriptor> instrs;
std::vector<decoding_tree_node*> children;
uint32_t submask = std::numeric_limits<uint32_t>::max();
uint32_t value;
decoding_tree_node(uint32_t value) : value(value){}
};
decoding_tree_node* root {nullptr}; const std::array<instruction_descriptor, ${instructions.size()}> instr_descr = {{
const std::array<instruction_descriptor, ${instructions.size}> instr_descr = {{
/* entries are: size, valid value, valid mask, function ptr */<%instructions.each{instr -> %> /* entries are: size, valid value, valid mask, function ptr */<%instructions.each{instr -> %>
/* instruction ${instr.instruction.name}, encoding '${instr.encoding}' */ /* instruction ${instr.instruction.name}, encoding '${instr.encoding}' */
{${instr.length}, ${instr.encoding}, ${instr.mask}, &this_class::__${generator.functionName(instr.name)}},<%}%> {${instr.length}, ${instr.encoding}, ${instr.mask}, &this_class::__${generator.functionName(instr.name)}},<%}%>
}}; }};
//needs to be declared after instr_descr
decoder instr_decoder;
/* instruction definitions */<%instructions.eachWithIndex{instr, idx -> %> /* instruction definitions */<%instructions.eachWithIndex{instr, idx -> %>
/* instruction ${idx}: ${instr.name} */ /* instruction ${idx}: ${instr.name} */
continuation_e __${generator.functionName(instr.name)}(virt_addr_t& pc, code_word_t instr, jit_holder& jh){ continuation_e __${generator.functionName(instr.name)}(virt_addr_t& pc, code_word_t instr, jit_holder& jh){
@ -147,7 +176,7 @@ private:
InvokeNode* call_print_disass; InvokeNode* call_print_disass;
char* mnemonic_ptr = strdup(mnemonic.c_str()); char* mnemonic_ptr = strdup(mnemonic.c_str());
jh.disass_collection.push_back(mnemonic_ptr); jh.disass_collection.push_back(mnemonic_ptr);
jh.cc.invoke(&call_print_disass, &print_disass, FuncSignatureT<void, void *, uint64_t, char *>()); jh.cc.invoke(&call_print_disass, &print_disass, FuncSignature::build<void, void *, uint64_t, char *>());
call_print_disass->setArg(0, jh.arch_if_ptr); call_print_disass->setArg(0, jh.arch_if_ptr);
call_print_disass->setArg(1, pc.val); call_print_disass->setArg(1, pc.val);
call_print_disass->setArg(2, mnemonic_ptr); call_print_disass->setArg(2, mnemonic_ptr);
@ -155,87 +184,47 @@ private:
} }
x86::Compiler& cc = jh.cc; x86::Compiler& cc = jh.cc;
cc.comment(fmt::format("${instr.name}_{:#x}:",pc.val).c_str()); cc.comment(fmt::format("${instr.name}_{:#x}:",pc.val).c_str());
this->gen_sync(jh, PRE_SYNC, ${idx}); gen_sync(jh, PRE_SYNC, ${idx});
cc.mov(jh.pc, pc.val); mov(cc, jh.pc, pc.val);
gen_set_tval(jh, instr);
pc = pc+${instr.length/8}; pc = pc+${instr.length/8};
cc.mov(jh.next_pc, pc.val); mov(cc, jh.next_pc, pc.val);
gen_instr_prologue(jh); gen_instr_prologue(jh);
cc.comment("//behavior:");
/*generate behavior*/ /*generate behavior*/
<%instr.behavior.eachLine{%>${it} <%instr.behavior.eachLine{%>${it}
<%}%> <%}%>
gen_sync(jh, POST_SYNC, ${idx});
gen_instr_epilogue(jh); gen_instr_epilogue(jh);
this->gen_sync(jh, POST_SYNC, ${idx});
return returnValue; return returnValue;
} }
<%}%> <%}%>
/**************************************************************************** /****************************************************************************
* end opcode definitions * end opcode definitions
****************************************************************************/ ****************************************************************************/
continuation_e illegal_intruction(virt_addr_t &pc, code_word_t instr, jit_holder& jh ) { continuation_e illegal_instruction(virt_addr_t &pc, code_word_t instr, jit_holder& jh ) {
x86::Compiler& cc = jh.cc; x86::Compiler& cc = jh.cc;
cc.comment(fmt::format("illegal_intruction{:#x}:",pc.val).c_str()); if(this->disass_enabled){
this->gen_sync(jh, PRE_SYNC, instr_descr.size()); auto mnemonic = std::string("illegal_instruction");
InvokeNode* call_print_disass;
char* mnemonic_ptr = strdup(mnemonic.c_str());
jh.disass_collection.push_back(mnemonic_ptr);
jh.cc.invoke(&call_print_disass, &print_disass, FuncSignature::build<void, void *, uint64_t, char *>());
call_print_disass->setArg(0, jh.arch_if_ptr);
call_print_disass->setArg(1, pc.val);
call_print_disass->setArg(2, mnemonic_ptr);
}
cc.comment(fmt::format("illegal_instruction{:#x}:",pc.val).c_str());
gen_sync(jh, PRE_SYNC, instr_descr.size());
mov(cc, jh.pc, pc.val);
gen_set_tval(jh, instr);
pc = pc + ((instr & 3) == 3 ? 4 : 2); pc = pc + ((instr & 3) == 3 ? 4 : 2);
mov(cc, jh.next_pc, pc.val);
gen_instr_prologue(jh); gen_instr_prologue(jh);
cc.comment("//behavior:"); gen_raise(jh, 0, 2);
gen_sync(jh, POST_SYNC, instr_descr.size());
gen_instr_epilogue(jh); gen_instr_epilogue(jh);
this->gen_sync(jh, POST_SYNC, instr_descr.size()); return ILLEGAL_INSTR;
return BRANCH;
}
//decoding functionality
void populate_decoding_tree(decoding_tree_node* root){
//create submask
for(auto instr: root->instrs){
root->submask &= instr.mask;
}
//put each instr according to submask&encoding into children
for(auto instr: root->instrs){
bool foundMatch = false;
for(auto child: root->children){
//use value as identifying trait
if(child->value == (instr.value&root->submask)){
child->instrs.push_back(instr);
foundMatch = true;
}
}
if(!foundMatch){
decoding_tree_node* child = new decoding_tree_node(instr.value&root->submask);
child->instrs.push_back(instr);
root->children.push_back(child);
}
}
root->instrs.clear();
//call populate_decoding_tree for all children
if(root->children.size() >1)
for(auto child: root->children){
populate_decoding_tree(child);
}
else{
//sort instrs by value of the mask, this works bc we want to have the least restrictive one last
std::sort(root->children[0]->instrs.begin(), root->children[0]->instrs.end(), [](const instruction_descriptor& instr1, const instruction_descriptor& instr2) {
return instr1.mask > instr2.mask;
});
}
}
compile_func decode_instr(decoding_tree_node* node, code_word_t word){
if(!node->children.size()){
if(node->instrs.size() == 1) return node->instrs[0].op;
for(auto instr : node->instrs){
if((instr.mask&word) == instr.value) return instr.op;
}
}
else{
for(auto child : node->children){
if (child->value == (node->submask&word)){
return decode_instr(child, word);
}
}
}
return nullptr;
} }
}; };
@ -243,102 +232,119 @@ template <typename ARCH> vm_impl<ARCH>::vm_impl() { this(new ARCH()); }
template <typename ARCH> template <typename ARCH>
vm_impl<ARCH>::vm_impl(ARCH &core, unsigned core_id, unsigned cluster_id) vm_impl<ARCH>::vm_impl(ARCH &core, unsigned core_id, unsigned cluster_id)
: vm_base<ARCH>(core, core_id, cluster_id) { : vm_base<ARCH>(core, core_id, cluster_id)
root = new decoding_tree_node(std::numeric_limits<uint32_t>::max()); , instr_decoder([this]() {
for(auto instr: instr_descr){ std::vector<generic_instruction_descriptor> g_instr_descr;
root->instrs.push_back(instr); g_instr_descr.reserve(instr_descr.size());
} for (uint32_t i = 0; i < instr_descr.size(); ++i) {
populate_decoding_tree(root); generic_instruction_descriptor new_instr_descr {instr_descr[i].value, instr_descr[i].mask, i};
} g_instr_descr.push_back(new_instr_descr);
}
return std::move(g_instr_descr);
}()) {}
template <typename ARCH> template <typename ARCH>
continuation_e vm_impl<ARCH>::gen_single_inst_behavior(virt_addr_t &pc, unsigned int &inst_cnt, jit_holder& jh) { continuation_e vm_impl<ARCH>::gen_single_inst_behavior(virt_addr_t &pc, jit_holder& jh) {
enum {TRAP_ID=1<<16}; enum {TRAP_ID=1<<16};
code_word_t instr = 0; code_word_t instr = 0;
phys_addr_t paddr(pc); phys_addr_t paddr(pc);
auto *const data = (uint8_t *)&instr; auto *const data = (uint8_t *)&instr;
if(this->core.has_mmu())
paddr = this->core.virt2phys(pc);
auto res = this->core.read(paddr, 4, data); auto res = this->core.read(paddr, 4, data);
if (res != iss::Ok) if (res != iss::Ok)
throw trap_access(TRAP_ID, pc.val); return ILLEGAL_FETCH;
if (instr == 0x0000006f || (instr&0xffff)==0xa001) if (instr == 0x0000006f || (instr&0xffff)==0xa001)
throw simulation_stopped(0); // 'J 0' or 'C.J 0' return JUMP_TO_SELF;
++inst_cnt; uint32_t inst_index = instr_decoder.decode_instr(instr);
auto f = decode_instr(root, instr); compile_func f = nullptr;
if(inst_index < instr_descr.size())
f = instr_descr[inst_index].op;
if (f == nullptr) if (f == nullptr)
f = &this_class::illegal_intruction; f = &this_class::illegal_instruction;
return (this->*f)(pc, instr, jh); return (this->*f)(pc, instr, jh);
} }
template <typename ARCH> template <typename ARCH>
void vm_impl<ARCH>::gen_instr_prologue(jit_holder& jh) { void vm_impl<ARCH>::gen_instr_prologue(jit_holder& jh) {
auto& cc = jh.cc; auto& cc = jh.cc;
cc.comment("//gen_instr_prologue"); x86_reg_t current_trap_state = get_reg_for(cc, traits::TRAP_STATE);
cc.inc(get_ptr_for(jh, traits::ICOUNT)); mov(cc, current_trap_state, get_ptr_for(jh, traits::TRAP_STATE));
mov(cc, get_ptr_for(jh, traits::PENDING_TRAP), current_trap_state);
x86::Gp current_trap_state = get_reg_for(jh, traits::TRAP_STATE); cc.comment("//Instruction prologue end");
cc.mov(current_trap_state, get_ptr_for(jh, traits::TRAP_STATE));
cc.mov(get_ptr_for(jh, traits::PENDING_TRAP), current_trap_state);
} }
template <typename ARCH> template <typename ARCH>
void vm_impl<ARCH>::gen_instr_epilogue(jit_holder& jh) { void vm_impl<ARCH>::gen_instr_epilogue(jit_holder& jh) {
auto& cc = jh.cc; auto& cc = jh.cc;
cc.comment("//gen_instr_epilogue"); cc.comment("//Instruction epilogue begin");
x86::Gp current_trap_state = get_reg_for(jh, traits::TRAP_STATE); x86_reg_t current_trap_state = get_reg_for(cc, traits::TRAP_STATE);
cc.mov(current_trap_state, get_ptr_for(jh, traits::TRAP_STATE)); mov(cc, current_trap_state, get_ptr_for(jh, traits::TRAP_STATE));
cc.cmp(current_trap_state, 0); cmp(cc, current_trap_state, 0);
cc.jne(jh.trap_entry); cc.jne(jh.trap_entry);
cc.inc(get_ptr_for(jh, traits::ICOUNT));
cc.inc(get_ptr_for(jh, traits::CYCLE));
cc.comment("//Instruction epilogue end");
} }
template <typename ARCH> template <typename ARCH>
void vm_impl<ARCH>::gen_block_prologue(jit_holder& jh){ void vm_impl<ARCH>::gen_block_prologue(jit_holder& jh){
jh.pc = load_reg_from_mem_Gp(jh, traits::PC);
jh.pc = load_reg_from_mem(jh, traits::PC); jh.next_pc = load_reg_from_mem_Gp(jh, traits::NEXT_PC);
jh.next_pc = load_reg_from_mem(jh, traits::NEXT_PC); jh.globals.resize(GLOBALS_SIZE);
jh.globals[TVAL] = get_reg_Gp(jh.cc, 64, false);
} }
template <typename ARCH> template <typename ARCH>
void vm_impl<ARCH>::gen_block_epilogue(jit_holder& jh){ void vm_impl<ARCH>::gen_block_epilogue(jit_holder& jh){
x86::Compiler& cc = jh.cc; x86::Compiler& cc = jh.cc;
cc.comment("//gen_block_epilogue"); cc.comment("//block epilogue begin");
cc.ret(jh.next_pc); cc.ret(jh.next_pc);
cc.bind(jh.trap_entry); cc.bind(jh.trap_entry);
this->write_back(jh); this->write_back(jh);
this->gen_sync(jh, POST_SYNC, -1);
x86::Gp current_trap_state = get_reg_for(jh, traits::TRAP_STATE); x86::Gp current_trap_state = get_reg_for_Gp(cc, traits::TRAP_STATE);
cc.mov(current_trap_state, get_ptr_for(jh, traits::TRAP_STATE)); mov(cc, current_trap_state, get_ptr_for(jh, traits::TRAP_STATE));
x86::Gp current_pc = get_reg_for(jh, traits::PC); x86::Gp current_pc = get_reg_for_Gp(cc, traits::PC);
cc.mov(current_pc, get_ptr_for(jh, traits::PC)); mov(cc, current_pc, get_ptr_for(jh, traits::PC));
x86::Gp instr = cc.newInt32("instr");
cc.mov(instr, 0); // FIXME:this is not correct
cc.comment("//enter trap call;");
InvokeNode* call_enter_trap; InvokeNode* call_enter_trap;
cc.invoke(&call_enter_trap, &enter_trap, FuncSignatureT<uint64_t, void*, uint64_t, uint64_t, uint64_t>()); cc.invoke(&call_enter_trap, &enter_trap, FuncSignature::build<uint64_t, void*, uint64_t, uint64_t, uint64_t>());
call_enter_trap->setArg(0, jh.arch_if_ptr); call_enter_trap->setArg(0, jh.arch_if_ptr);
call_enter_trap->setArg(1, current_trap_state); call_enter_trap->setArg(1, current_trap_state);
call_enter_trap->setArg(2, current_pc); call_enter_trap->setArg(2, current_pc);
call_enter_trap->setArg(3, instr); call_enter_trap->setArg(3, jh.globals[TVAL]);
x86::Gp current_next_pc = get_reg_for(jh, traits::NEXT_PC); x86_reg_t current_next_pc = get_reg_for(cc, traits::NEXT_PC);
cc.mov(current_next_pc, get_ptr_for(jh, traits::NEXT_PC)); mov(cc, current_next_pc, get_ptr_for(jh, traits::NEXT_PC));
cc.mov(jh.next_pc, current_next_pc); mov(cc, jh.next_pc, current_next_pc);
cc.mov(get_ptr_for(jh, traits::LAST_BRANCH), std::numeric_limits<uint32_t>::max()); mov(cc, get_ptr_for(jh, traits::LAST_BRANCH), static_cast<int>(UNKNOWN_JUMP));
cc.ret(jh.next_pc); cc.ret(jh.next_pc);
} }
template <typename ARCH> template <typename ARCH>
inline void vm_impl<ARCH>::gen_raise(jit_holder& jh, uint16_t trap_id, uint16_t cause) { inline void vm_impl<ARCH>::gen_raise(jit_holder& jh, uint16_t trap_id, uint16_t cause) {
auto& cc = jh.cc; auto& cc = jh.cc;
cc.comment("//gen_raise"); auto tmp1 = get_reg_for(cc, traits::TRAP_STATE);
auto tmp1 = get_reg_for(jh, traits::TRAP_STATE); mov(cc, tmp1, 0x80ULL << 24 | (cause << 16) | trap_id);
cc.mov(tmp1, 0x80ULL << 24 | (cause << 16) | trap_id); mov(cc, get_ptr_for(jh, traits::TRAP_STATE), tmp1);
cc.mov(get_ptr_for(jh, traits::TRAP_STATE), tmp1); cc.jmp(jh.trap_entry);
cc.mov(jh.next_pc, std::numeric_limits<uint32_t>::max()); }
template <typename ARCH>
template <typename T, typename>
void vm_impl<ARCH>::gen_set_tval(jit_holder& jh, T new_tval) {
mov(jh.cc, jh.globals[TVAL], new_tval);
}
template <typename ARCH>
void vm_impl<ARCH>::gen_set_tval(jit_holder& jh, x86_reg_t _new_tval) {
if(nonstd::holds_alternative<x86::Gp>(_new_tval)) {
x86::Gp new_tval = nonstd::get<x86::Gp>(_new_tval);
if(new_tval.size() < 8)
new_tval = gen_ext_Gp(jh.cc, new_tval, 64, false);
mov(jh.cc, jh.globals[TVAL], new_tval);
} else {
throw std::runtime_error("Variant not supported in gen_set_tval");
}
} }
} // namespace tgc5c } // namespace tgc5c
@ -363,7 +369,7 @@ volatile std::array<bool, 2> dummy = {
auto vm = new asmjit::${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*cpu, false); auto vm = new asmjit::${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*cpu, false);
if (port != 0) debugger::server<debugger::gdb_session>::run_server(vm, port); if (port != 0) debugger::server<debugger::gdb_session>::run_server(vm, port);
if(init_data){ if(init_data){
auto* cb = reinterpret_cast<std::function<void(arch_if*, arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t, arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t)>*>(init_data); auto* cb = reinterpret_cast<semihosting_cb_t<arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t>*>(init_data);
cpu->set_semihosting_callback(*cb); cpu->set_semihosting_callback(*cb);
} }
return {cpu_ptr{cpu}, vm_ptr{vm}}; return {cpu_ptr{cpu}, vm_ptr{vm}};
@ -373,7 +379,7 @@ volatile std::array<bool, 2> dummy = {
auto vm = new asmjit::${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*cpu, false); auto vm = new asmjit::${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*cpu, false);
if (port != 0) debugger::server<debugger::gdb_session>::run_server(vm, port); if (port != 0) debugger::server<debugger::gdb_session>::run_server(vm, port);
if(init_data){ if(init_data){
auto* cb = reinterpret_cast<std::function<void(arch_if*, arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t, arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t)>*>(init_data); auto* cb = reinterpret_cast<semihosting_cb_t<arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t>*>(init_data);
cpu->set_semihosting_callback(*cb); cpu->set_semihosting_callback(*cb);
} }
return {cpu_ptr{cpu}, vm_ptr{vm}}; return {cpu_ptr{cpu}, vm_ptr{vm}};

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (C) 2017, 2018 MINRES Technologies GmbH * Copyright (C) 2017-2024 MINRES Technologies GmbH
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -31,12 +31,17 @@
*******************************************************************************/ *******************************************************************************/
// clang-format off // clang-format off
#include <iss/arch/${coreDef.name.toLowerCase()}.h> #include <iss/arch/${coreDef.name.toLowerCase()}.h>
// vm_base needs to be included before gdb_session as termios.h (via boost and gdb_server) has a define which clashes with a variable
// name in ConstantRange.h
#include <iss/llvm/vm_base.h>
#include <iss/iss.h>
#include <iss/debugger/gdb_session.h> #include <iss/debugger/gdb_session.h>
#include <iss/debugger/server.h> #include <iss/debugger/server.h>
#include <iss/iss.h> #include <iss/instruction_decoder.h>
#include <iss/llvm/vm_base.h>
#include <util/logging.h> #include <util/logging.h>
<%def fcsr = registers.find {it.name=='FCSR'}
if(fcsr != null) {%>
#include <vm/fp_functions.h><%}%>
#ifndef FMT_HEADER_ONLY #ifndef FMT_HEADER_ONLY
#define FMT_HEADER_ONLY #define FMT_HEADER_ONLY
#endif #endif
@ -82,7 +87,9 @@ protected:
using vm_base<ARCH>::get_reg_ptr; using vm_base<ARCH>::get_reg_ptr;
inline const char *name(size_t index){return traits::reg_aliases.at(index);} inline const char *name(size_t index){return traits::reg_aliases.at(index);}
<%if(fcsr != null) {%>
inline const char *fname(size_t index){return index < 32?name(index+traits::F0):"illegal";}
<%}%>
template <typename T> inline ConstantInt *size(T type) { template <typename T> inline ConstantInt *size(T type) {
return ConstantInt::get(getContext(), APInt(32, type->getType()->getScalarSizeInBits())); return ConstantInt::get(getContext(), APInt(32, type->getType()->getScalarSizeInBits()));
} }
@ -96,13 +103,16 @@ protected:
return super::gen_cond_assign(cond, this->gen_ext(trueVal, size), this->gen_ext(falseVal, size)); return super::gen_cond_assign(cond, this->gen_ext(trueVal, size), this->gen_ext(falseVal, size));
} }
std::tuple<continuation_e, BasicBlock *> gen_single_inst_behavior(virt_addr_t &, unsigned int &, BasicBlock *) override; std::tuple<continuation_e, BasicBlock *> gen_single_inst_behavior(virt_addr_t &, BasicBlock *) override;
void gen_leave_behavior(BasicBlock *leave_blk) override; void gen_leave_behavior(BasicBlock *leave_blk) override;
void gen_raise_trap(uint16_t trap_id, uint16_t cause); void gen_raise_trap(uint16_t trap_id, uint16_t cause);
void gen_leave_trap(unsigned lvl); void gen_leave_trap(unsigned lvl);
void gen_wait(unsigned type); void gen_wait(unsigned type);
void set_tval(uint64_t new_tval);
void set_tval(Value* new_tval);
void gen_trap_behavior(BasicBlock *) override; void gen_trap_behavior(BasicBlock *) override;
void gen_instr_prologue();
void gen_instr_epilogue(BasicBlock *bb); void gen_instr_epilogue(BasicBlock *bb);
inline Value *gen_reg_load(unsigned i, unsigned level = 0) { inline Value *gen_reg_load(unsigned i, unsigned level = 0) {
@ -126,34 +136,51 @@ protected:
auto mask = (1ULL<<W) - 1; auto mask = (1ULL<<W) - 1;
auto sign_mask = 1ULL<<(W-1); auto sign_mask = 1ULL<<(W-1);
return (from & mask) | ((from & sign_mask) ? ~mask : 0); return (from & mask) | ((from & sign_mask) ? ~mask : 0);
} }
<%functions.each{ it.eachLine { %>
${it}<%}
}
if(fcsr != null) {%>
Value* NaNBox16(BasicBlock* bb, Value* NaNBox16_val){
if(static_cast<uint32_t>(traits::FLEN) == 16)
return this->gen_ext(NaNBox16_val, traits::FLEN, false);
auto box = this->builder.CreateNot((this->gen_ext(0, 32, false)));
return this->gen_ext((this->builder.CreateOr(this->builder.CreateShl(this->gen_ext(box, traits::FLEN), 16), this->gen_ext(NaNBox16_val, traits::FLEN))), traits::FLEN, false);
}
Value* NaNBox32(BasicBlock* bb, Value* NaNBox32_val){
if(static_cast<uint32_t>(traits::FLEN) == 32)
return this->gen_ext(NaNBox32_val, traits::FLEN, false);
auto box = this->builder.CreateNot((this->gen_ext(0, 64, false)));
return this->gen_ext((this->builder.CreateOr(this->builder.CreateShl(this->gen_ext(box, traits::FLEN), 32), this->gen_ext(NaNBox32_val, traits::FLEN))), traits::FLEN, false);
}
Value* NaNBox64(BasicBlock* bb, Value* NaNBox64_val){
if(static_cast<uint32_t>(traits::FLEN) == 64)
return this->gen_ext(NaNBox64_val, traits::FLEN, false);
auto box = this->builder.CreateNot((this->gen_ext(0, 128, false)));
return this->gen_ext((this->builder.CreateOr(this->builder.CreateShl(this->gen_ext(box, traits::FLEN), 64), this->gen_ext(NaNBox64_val, traits::FLEN))), traits::FLEN, false);
}
<%}%>
private: private:
/**************************************************************************** /****************************************************************************
* start opcode definitions * start opcode definitions
****************************************************************************/ ****************************************************************************/
struct instruction_descriptor { struct instruction_descriptor {
size_t length; uint32_t length;
uint32_t value; uint32_t value;
uint32_t mask; uint32_t mask;
compile_func op; compile_func op;
}; };
struct decoding_tree_node{
std::vector<instruction_descriptor> instrs;
std::vector<decoding_tree_node*> children;
uint32_t submask = std::numeric_limits<uint32_t>::max();
uint32_t value;
decoding_tree_node(uint32_t value) : value(value){}
};
decoding_tree_node* root {nullptr}; const std::array<instruction_descriptor, ${instructions.size()}> instr_descr = {{
const std::array<instruction_descriptor, ${instructions.size}> instr_descr = {{
/* entries are: size, valid value, valid mask, function ptr */<%instructions.each{instr -> %> /* entries are: size, valid value, valid mask, function ptr */<%instructions.each{instr -> %>
/* instruction ${instr.instruction.name}, encoding '${instr.encoding}' */ /* instruction ${instr.instruction.name}, encoding '${instr.encoding}' */
{${instr.length}, ${instr.encoding}, ${instr.mask}, &this_class::__${generator.functionName(instr.name)}},<%}%> {${instr.length}, ${instr.encoding}, ${instr.mask}, &this_class::__${generator.functionName(instr.name)}},<%}%>
}}; }};
//needs to be declared after instr_descr
decoder instr_decoder;
/* instruction definitions */<%instructions.eachWithIndex{instr, idx -> %> /* instruction definitions */<%instructions.eachWithIndex{instr, idx -> %>
/* instruction ${idx}: ${instr.name} */ /* instruction ${idx}: ${instr.name} */
std::tuple<continuation_e, BasicBlock*> __${generator.functionName(instr.name)}(virt_addr_t& pc, code_word_t instr, BasicBlock* bb){ std::tuple<continuation_e, BasicBlock*> __${generator.functionName(instr.name)}(virt_addr_t& pc, code_word_t instr, BasicBlock* bb){
@ -162,18 +189,27 @@ private:
<%}%>if(this->disass_enabled){ <%}%>if(this->disass_enabled){
/* generate console output when executing the command */<%instr.disass.eachLine{%> /* generate console output when executing the command */<%instr.disass.eachLine{%>
${it}<%}%> ${it}<%}%>
std::vector<Value*> args {
this->core_ptr,
this->gen_const(64, pc.val),
this->builder.CreateGlobalStringPtr(mnemonic),
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
bb->setName(fmt::format("${instr.name}_0x{:X}",pc.val)); bb->setName(fmt::format("${instr.name}_0x{:X}",pc.val));
this->gen_sync(PRE_SYNC,${idx}); this->gen_sync(PRE_SYNC,${idx});
auto cur_pc_val = this->gen_const(32,pc.val);
this->gen_set_pc(pc, traits::PC);
this->set_tval(instr);
pc=pc+ ${instr.length/8}; pc=pc+ ${instr.length/8};
this->gen_set_pc(pc, traits::NEXT_PC); this->gen_set_pc(pc, traits::NEXT_PC);
this->gen_instr_prologue();
/*generate behavior*/ /*generate behavior*/
<%instr.behavior.eachLine{%>${it} <%instr.behavior.eachLine{%>${it}
<%}%> <%}%>
this->gen_sync(POST_SYNC, ${idx});
this->gen_instr_epilogue(bb); this->gen_instr_epilogue(bb);
this->gen_sync(POST_SYNC, ${idx});
this->builder.CreateBr(bb); this->builder.CreateBr(bb);
return returnValue; return returnValue;
} }
@ -181,8 +217,17 @@ private:
/**************************************************************************** /****************************************************************************
* end opcode definitions * end opcode definitions
****************************************************************************/ ****************************************************************************/
std::tuple<continuation_e, BasicBlock *> illegal_intruction(virt_addr_t &pc, code_word_t instr, BasicBlock *bb) { std::tuple<continuation_e, BasicBlock *> illegal_instruction(virt_addr_t &pc, code_word_t instr, BasicBlock *bb) {
this->gen_sync(iss::PRE_SYNC, instr_descr.size()); if(this->disass_enabled){
auto mnemonic = std::string("illegal_instruction");
std::vector<Value*> args {
this->core_ptr,
this->gen_const(64, pc.val),
this->builder.CreateGlobalStringPtr(mnemonic),
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
this->gen_sync(iss::PRE_SYNC, instr_descr.size());
this->builder.CreateStore(this->builder.CreateLoad(this->get_typeptr(traits::NEXT_PC), get_reg_ptr(traits::NEXT_PC), true), this->builder.CreateStore(this->builder.CreateLoad(this->get_typeptr(traits::NEXT_PC), get_reg_ptr(traits::NEXT_PC), true),
get_reg_ptr(traits::PC), true); get_reg_ptr(traits::PC), true);
this->builder.CreateStore( this->builder.CreateStore(
@ -190,63 +235,14 @@ private:
this->gen_const(64U, 1)), this->gen_const(64U, 1)),
get_reg_ptr(traits::ICOUNT), true); get_reg_ptr(traits::ICOUNT), true);
pc = pc + ((instr & 3) == 3 ? 4 : 2); pc = pc + ((instr & 3) == 3 ? 4 : 2);
this->set_tval(instr);
this->gen_raise_trap(0, 2); // illegal instruction trap this->gen_raise_trap(0, 2); // illegal instruction trap
this->gen_sync(iss::POST_SYNC, instr_descr.size()); this->gen_sync(iss::POST_SYNC, instr_descr.size());
this->gen_instr_epilogue(this->leave_blk); bb = this->leave_blk;
return std::make_tuple(BRANCH, nullptr); this->gen_instr_epilogue(bb);
this->builder.CreateBr(bb);
return std::make_tuple(ILLEGAL_INSTR, nullptr);
} }
//decoding functionality
void populate_decoding_tree(decoding_tree_node* root){
//create submask
for(auto instr: root->instrs){
root->submask &= instr.mask;
}
//put each instr according to submask&encoding into children
for(auto instr: root->instrs){
bool foundMatch = false;
for(auto child: root->children){
//use value as identifying trait
if(child->value == (instr.value&root->submask)){
child->instrs.push_back(instr);
foundMatch = true;
}
}
if(!foundMatch){
decoding_tree_node* child = new decoding_tree_node(instr.value&root->submask);
child->instrs.push_back(instr);
root->children.push_back(child);
}
}
root->instrs.clear();
//call populate_decoding_tree for all children
if(root->children.size() >1)
for(auto child: root->children){
populate_decoding_tree(child);
}
else{
//sort instrs by value of the mask, this works bc we want to have the least restrictive one last
std::sort(root->children[0]->instrs.begin(), root->children[0]->instrs.end(), [](const instruction_descriptor& instr1, const instruction_descriptor& instr2) {
return instr1.mask > instr2.mask;
});
}
}
compile_func decode_instr(decoding_tree_node* node, code_word_t word){
if(!node->children.size()){
if(node->instrs.size() == 1) return node->instrs[0].op;
for(auto instr : node->instrs){
if((instr.mask&word) == instr.value) return instr.op;
}
}
else{
for(auto child : node->children){
if (child->value == (node->submask&word)){
return decode_instr(child, word);
}
}
}
return nullptr;
}
}; };
template <typename CODE_WORD> void debug_fn(CODE_WORD instr) { template <typename CODE_WORD> void debug_fn(CODE_WORD instr) {
@ -258,42 +254,39 @@ template <typename ARCH> vm_impl<ARCH>::vm_impl() { this(new ARCH()); }
template <typename ARCH> template <typename ARCH>
vm_impl<ARCH>::vm_impl(ARCH &core, unsigned core_id, unsigned cluster_id) vm_impl<ARCH>::vm_impl(ARCH &core, unsigned core_id, unsigned cluster_id)
: vm_base<ARCH>(core, core_id, cluster_id) { : vm_base<ARCH>(core, core_id, cluster_id)
root = new decoding_tree_node(std::numeric_limits<uint32_t>::max()); , instr_decoder([this]() {
for(auto instr:instr_descr){ std::vector<generic_instruction_descriptor> g_instr_descr;
root->instrs.push_back(instr); g_instr_descr.reserve(instr_descr.size());
} for (uint32_t i = 0; i < instr_descr.size(); ++i) {
populate_decoding_tree(root); generic_instruction_descriptor new_instr_descr {instr_descr[i].value, instr_descr[i].mask, i};
} g_instr_descr.push_back(new_instr_descr);
}
return std::move(g_instr_descr);
}()) {}
template <typename ARCH> template <typename ARCH>
std::tuple<continuation_e, BasicBlock *> std::tuple<continuation_e, BasicBlock *>
vm_impl<ARCH>::gen_single_inst_behavior(virt_addr_t &pc, unsigned int &inst_cnt, BasicBlock *this_block) { vm_impl<ARCH>::gen_single_inst_behavior(virt_addr_t &pc, BasicBlock *this_block) {
// we fetch at max 4 byte, alignment is 2 // we fetch at max 4 byte, alignment is 2
enum {TRAP_ID=1<<16}; enum {TRAP_ID=1<<16};
code_word_t instr = 0; code_word_t instr = 0;
// const typename traits::addr_t upper_bits = ~traits::PGMASK; // const typename traits::addr_t upper_bits = ~traits::PGMASK;
phys_addr_t paddr(pc); phys_addr_t paddr(pc);
auto *const data = (uint8_t *)&instr; auto *const data = (uint8_t *)&instr;
if(this->core.has_mmu()) auto res = this->core.read(paddr, 4, data);
paddr = this->core.virt2phys(pc); if (res != iss::Ok)
//TODO: re-add page handling return std::make_tuple(ILLEGAL_FETCH, nullptr);
// if ((pc.val & upper_bits) != ((pc.val + 2) & upper_bits)) { // we may cross a page boundary if (instr == 0x0000006f || (instr&0xffff)==0xa001){
// auto res = this->core.read(paddr, 2, data); this->builder.CreateBr(this->leave_blk);
// if (res != iss::Ok) throw trap_access(TRAP_ID, pc.val); return std::make_tuple(JUMP_TO_SELF, nullptr);
// if ((instr & 0x3) == 0x3) { // this is a 32bit instruction }
// res = this->core.read(this->core.v2p(pc + 2), 2, data + 2); uint32_t inst_index = instr_decoder.decode_instr(instr);
// } compile_func f = nullptr;
// } else { if(inst_index < instr_descr.size())
auto res = this->core.read(paddr, 4, data); f = instr_descr[inst_index].op;
if (res != iss::Ok) throw trap_access(TRAP_ID, pc.val);
// }
if (instr == 0x0000006f || (instr&0xffff)==0xa001) throw simulation_stopped(0); // 'J 0' or 'C.J 0'
// curr pc on stack
++inst_cnt;
auto f = decode_instr(root, instr);
if (f == nullptr) { if (f == nullptr) {
f = &this_class::illegal_intruction; f = &this_class::illegal_instruction;
} }
return (this->*f)(pc, instr, this_block); return (this->*f)(pc, instr, this_block);
} }
@ -308,16 +301,14 @@ template <typename ARCH>
void vm_impl<ARCH>::gen_raise_trap(uint16_t trap_id, uint16_t cause) { void vm_impl<ARCH>::gen_raise_trap(uint16_t trap_id, uint16_t cause) {
auto *TRAP_val = this->gen_const(32, 0x80 << 24 | (cause << 16) | trap_id); auto *TRAP_val = this->gen_const(32, 0x80 << 24 | (cause << 16) | trap_id);
this->builder.CreateStore(TRAP_val, get_reg_ptr(traits::TRAP_STATE), true); this->builder.CreateStore(TRAP_val, get_reg_ptr(traits::TRAP_STATE), true);
this->builder.CreateStore(this->gen_const(32U, std::numeric_limits<uint32_t>::max()), get_reg_ptr(traits::LAST_BRANCH), false); this->builder.CreateBr(this->trap_blk);
} }
template <typename ARCH> template <typename ARCH>
void vm_impl<ARCH>::gen_leave_trap(unsigned lvl) { void vm_impl<ARCH>::gen_leave_trap(unsigned lvl) {
std::vector<Value *> args{ this->core_ptr, ConstantInt::get(getContext(), APInt(64, lvl)) }; std::vector<Value *> args{ this->core_ptr, ConstantInt::get(getContext(), APInt(64, lvl)) };
this->builder.CreateCall(this->mod->getFunction("leave_trap"), args); this->builder.CreateCall(this->mod->getFunction("leave_trap"), args);
auto *PC_val = this->gen_read_mem(traits::CSR, (lvl << 8) + 0x41, traits::XLEN / 8); this->builder.CreateStore(this->gen_const(32U, static_cast<int>(UNKNOWN_JUMP)), get_reg_ptr(traits::LAST_BRANCH), false);
this->builder.CreateStore(PC_val, get_reg_ptr(traits::NEXT_PC), false);
this->builder.CreateStore(this->gen_const(32U, std::numeric_limits<uint32_t>::max()), get_reg_ptr(traits::LAST_BRANCH), false);
} }
template <typename ARCH> template <typename ARCH>
@ -326,19 +317,37 @@ void vm_impl<ARCH>::gen_wait(unsigned type) {
this->builder.CreateCall(this->mod->getFunction("wait"), args); this->builder.CreateCall(this->mod->getFunction("wait"), args);
} }
template <typename ARCH>
inline void vm_impl<ARCH>::set_tval(uint64_t tval) {
auto tmp_tval = this->gen_const(64, tval);
this->set_tval(tmp_tval);
}
template <typename ARCH>
inline void vm_impl<ARCH>::set_tval(Value* new_tval) {
this->builder.CreateStore(this->gen_ext(new_tval, 64, false), this->tval);
}
template <typename ARCH> template <typename ARCH>
void vm_impl<ARCH>::gen_trap_behavior(BasicBlock *trap_blk) { void vm_impl<ARCH>::gen_trap_behavior(BasicBlock *trap_blk) {
this->builder.SetInsertPoint(trap_blk); this->builder.SetInsertPoint(trap_blk);
this->gen_sync(POST_SYNC, -1); //TODO get right InstrId
auto *trap_state_val = this->builder.CreateLoad(this->get_typeptr(traits::TRAP_STATE), get_reg_ptr(traits::TRAP_STATE), true); auto *trap_state_val = this->builder.CreateLoad(this->get_typeptr(traits::TRAP_STATE), get_reg_ptr(traits::TRAP_STATE), true);
this->builder.CreateStore(this->gen_const(32U, std::numeric_limits<uint32_t>::max()), auto *cur_pc_val = this->builder.CreateLoad(this->get_typeptr(traits::PC), get_reg_ptr(traits::PC), true);
get_reg_ptr(traits::LAST_BRANCH), false); std::vector<Value *> args{this->core_ptr,
std::vector<Value *> args{this->core_ptr, this->adj_to64(trap_state_val), this->adj_to64(trap_state_val),
this->adj_to64(this->builder.CreateLoad(this->get_typeptr(traits::PC), get_reg_ptr(traits::PC), false))}; this->adj_to64(cur_pc_val),
this->adj_to64(this->builder.CreateLoad(this->get_type(64),this->tval))};
this->builder.CreateCall(this->mod->getFunction("enter_trap"), args); this->builder.CreateCall(this->mod->getFunction("enter_trap"), args);
this->builder.CreateStore(this->gen_const(32U, static_cast<int>(UNKNOWN_JUMP)), get_reg_ptr(traits::LAST_BRANCH), false);
auto *trap_addr_val = this->builder.CreateLoad(this->get_typeptr(traits::NEXT_PC), get_reg_ptr(traits::NEXT_PC), false); auto *trap_addr_val = this->builder.CreateLoad(this->get_typeptr(traits::NEXT_PC), get_reg_ptr(traits::NEXT_PC), false);
this->builder.CreateRet(trap_addr_val); this->builder.CreateRet(trap_addr_val);
} }
template <typename ARCH>
void vm_impl<ARCH>::gen_instr_prologue() {
auto* trap_val =
this->builder.CreateLoad(this->get_typeptr(arch::traits<ARCH>::PENDING_TRAP), get_reg_ptr(arch::traits<ARCH>::PENDING_TRAP));
this->builder.CreateStore(trap_val, get_reg_ptr(arch::traits<ARCH>::TRAP_STATE), false);
}
template <typename ARCH> template <typename ARCH>
void vm_impl<ARCH>::gen_instr_epilogue(BasicBlock *bb) { void vm_impl<ARCH>::gen_instr_epilogue(BasicBlock *bb) {
@ -349,6 +358,14 @@ void vm_impl<ARCH>::gen_instr_epilogue(BasicBlock *bb) {
ConstantInt::get(getContext(), APInt(v->getType()->getIntegerBitWidth(), 0))), ConstantInt::get(getContext(), APInt(v->getType()->getIntegerBitWidth(), 0))),
target_bb, this->trap_blk, 1); target_bb, this->trap_blk, 1);
this->builder.SetInsertPoint(target_bb); this->builder.SetInsertPoint(target_bb);
// update icount
auto* icount_val = this->builder.CreateAdd(
this->builder.CreateLoad(this->get_typeptr(arch::traits<ARCH>::ICOUNT), get_reg_ptr(arch::traits<ARCH>::ICOUNT)), this->gen_const(64U, 1));
this->builder.CreateStore(icount_val, get_reg_ptr(arch::traits<ARCH>::ICOUNT), false);
//increment cyclecount
auto* cycle_val = this->builder.CreateAdd(
this->builder.CreateLoad(this->get_typeptr(arch::traits<ARCH>::CYCLE), get_reg_ptr(arch::traits<ARCH>::CYCLE)), this->gen_const(64U, 1));
this->builder.CreateStore(cycle_val, get_reg_ptr(arch::traits<ARCH>::CYCLE), false);
} }
} // namespace ${coreDef.name.toLowerCase()} } // namespace ${coreDef.name.toLowerCase()}
@ -391,4 +408,4 @@ volatile std::array<bool, 2> dummy = {
}; };
} }
} }
// clang-format on // clang-format on

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (C) 2020 MINRES Technologies GmbH * Copyright (C) 2020-2024 MINRES Technologies GmbH
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -37,7 +37,10 @@
#include <iss/tcc/vm_base.h> #include <iss/tcc/vm_base.h>
#include <util/logging.h> #include <util/logging.h>
#include <sstream> #include <sstream>
#include <iss/instruction_decoder.h>
<%def fcsr = registers.find {it.name=='FCSR'}
if(fcsr != null) {%>
#include <vm/fp_functions.h><%}%>
#ifndef FMT_HEADER_ONLY #ifndef FMT_HEADER_ONLY
#define FMT_HEADER_ONLY #define FMT_HEADER_ONLY
#endif #endif
@ -80,16 +83,21 @@ protected:
using vm_base<ARCH>::get_reg_ptr; using vm_base<ARCH>::get_reg_ptr;
using this_class = vm_impl<ARCH>; using this_class = vm_impl<ARCH>;
using compile_ret_t = std::tuple<continuation_e>; using compile_ret_t = continuation_e;
using compile_func = compile_ret_t (this_class::*)(virt_addr_t &pc, code_word_t instr, tu_builder&); using compile_func = compile_ret_t (this_class::*)(virt_addr_t &pc, code_word_t instr, tu_builder&);
inline const char *name(size_t index){return traits::reg_aliases.at(index);} inline const char *name(size_t index){return traits::reg_aliases.at(index);}
<%
if(fcsr != null) {%>
inline const char *fname(size_t index){return index < 32?name(index+traits::F0):"illegal";}
<%}%>
void add_prologue(tu_builder& tu) override;
void setup_module(std::string m) override { void setup_module(std::string m) override {
super::setup_module(m); super::setup_module(m);
} }
compile_ret_t gen_single_inst_behavior(virt_addr_t &, unsigned int &, tu_builder&) override; compile_ret_t gen_single_inst_behavior(virt_addr_t &, tu_builder&) override;
void gen_trap_behavior(tu_builder& tu) override; void gen_trap_behavior(tu_builder& tu) override;
@ -97,7 +105,9 @@ protected:
void gen_leave_trap(tu_builder& tu, unsigned lvl); void gen_leave_trap(tu_builder& tu, unsigned lvl);
void gen_wait(tu_builder& tu, unsigned type); inline void gen_set_tval(tu_builder& tu, uint64_t new_tval);
inline void gen_set_tval(tu_builder& tu, value new_tval);
inline void gen_trap_check(tu_builder& tu) { inline void gen_trap_check(tu_builder& tu) {
tu("if(*trap_state!=0) goto trap_entry;"); tu("if(*trap_state!=0) goto trap_entry;");
@ -126,34 +136,58 @@ protected:
auto mask = (1ULL<<W) - 1; auto mask = (1ULL<<W) - 1;
auto sign_mask = 1ULL<<(W-1); auto sign_mask = 1ULL<<(W-1);
return (from & mask) | ((from & sign_mask) ? ~mask : 0); return (from & mask) | ((from & sign_mask) ? ~mask : 0);
} }
<%functions.each{ it.eachLine { %>
${it}<%}
}
if(fcsr != null) {%>
value NaNBox16(tu_builder& tu, value NaNBox16_val){
if(static_cast<uint32_t>(traits::FLEN) == 16)
return tu.ext(NaNBox16_val, traits::FLEN, false);
else {
auto box = tu.assignment(tu.logical_neg((tu.ext(0, 32, false))), traits::FLEN) ;
return tu.ext((tu.bitwise_or(tu.shl(box, 16), NaNBox16_val)), traits::FLEN, false);
}
}
value NaNBox32(tu_builder& tu, value NaNBox32_val){
if(static_cast<uint32_t>(traits::FLEN) == 32)
return tu.ext(NaNBox32_val, traits::FLEN, false);
else {
auto box = tu.assignment(tu.logical_neg((tu.ext(0, 64, false))), traits::FLEN) ;
return tu.ext((tu.bitwise_or(tu.shl(box, 32), NaNBox32_val)), traits::FLEN, false);
}
}
value NaNBox64(tu_builder& tu, value NaNBox64_val){
if(static_cast<uint32_t>(traits::FLEN) == 64)
return tu.ext(NaNBox64_val, traits::FLEN, false);
else {
throw new std::runtime_error("tcc does not support Registers wider than 64 bits");
auto box = tu.assignment(tu.logical_neg((tu.ext(0, 128, false))), traits::FLEN) ;
return tu.ext((tu.bitwise_or(tu.shl(box, 64), NaNBox64_val)), traits::FLEN, false);
}
}
<%}%>
private: private:
/**************************************************************************** /****************************************************************************
* start opcode definitions * start opcode definitions
****************************************************************************/ ****************************************************************************/
struct instruction_descriptor { struct instruction_descriptor {
size_t length; uint32_t length;
uint32_t value; uint32_t value;
uint32_t mask; uint32_t mask;
compile_func op; compile_func op;
}; };
struct decoding_tree_node{
std::vector<instruction_descriptor> instrs;
std::vector<decoding_tree_node*> children;
uint32_t submask = std::numeric_limits<uint32_t>::max();
uint32_t value;
decoding_tree_node(uint32_t value) : value(value){}
};
decoding_tree_node* root {nullptr}; const std::array<instruction_descriptor, ${instructions.size()}> instr_descr = {{
const std::array<instruction_descriptor, ${instructions.size}> instr_descr = {{
/* entries are: size, valid value, valid mask, function ptr */<%instructions.each{instr -> %> /* entries are: size, valid value, valid mask, function ptr */<%instructions.each{instr -> %>
/* instruction ${instr.instruction.name}, encoding '${instr.encoding}' */ /* instruction ${instr.instruction.name}, encoding '${instr.encoding}' */
{${instr.length}, ${instr.encoding}, ${instr.mask}, &this_class::__${generator.functionName(instr.name)}},<%}%> {${instr.length}, ${instr.encoding}, ${instr.mask}, &this_class::__${generator.functionName(instr.name)}},<%}%>
}}; }};
//needs to be declared after instr_descr
decoder instr_decoder;
/* instruction definitions */<%instructions.eachWithIndex{instr, idx -> %> /* instruction definitions */<%instructions.eachWithIndex{instr, idx -> %>
/* instruction ${idx}: ${instr.name} */ /* instruction ${idx}: ${instr.name} */
compile_ret_t __${generator.functionName(instr.name)}(virt_addr_t& pc, code_word_t instr, tu_builder& tu){ compile_ret_t __${generator.functionName(instr.name)}(virt_addr_t& pc, code_word_t instr, tu_builder& tu){
@ -164,82 +198,39 @@ private:
<%}%>if(this->disass_enabled){ <%}%>if(this->disass_enabled){
/* generate console output when executing the command */<%instr.disass.eachLine{%> /* generate console output when executing the command */<%instr.disass.eachLine{%>
${it}<%}%> ${it}<%}%>
tu("print_disass(core_ptr, {:#x}, \"{}\");", pc.val, mnemonic);
} }
auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]);
pc=pc+ ${instr.length/8}; pc=pc+ ${instr.length/8};
gen_set_pc(tu, pc, traits::NEXT_PC); gen_set_pc(tu, pc, traits::NEXT_PC);
tu("(*cycle)++;");
tu.open_scope(); tu.open_scope();
this->gen_set_tval(tu, instr);
<%instr.behavior.eachLine{%>${it} <%instr.behavior.eachLine{%>${it}
<%}%> <%}%>
tu("(*icount)++;");
tu("(*instret)++;");
tu.close_scope(); tu.close_scope();
gen_trap_check(tu);
vm_base<ARCH>::gen_sync(tu, POST_SYNC,${idx}); vm_base<ARCH>::gen_sync(tu, POST_SYNC,${idx});
gen_trap_check(tu);
return returnValue; return returnValue;
} }
<%}%> <%}%>
/**************************************************************************** /****************************************************************************
* end opcode definitions * end opcode definitions
****************************************************************************/ ****************************************************************************/
compile_ret_t illegal_intruction(virt_addr_t &pc, code_word_t instr, tu_builder& tu) { compile_ret_t illegal_instruction(virt_addr_t &pc, code_word_t instr, tu_builder& tu) {
vm_impl::gen_sync(tu, iss::PRE_SYNC, instr_descr.size()); vm_impl::gen_sync(tu, iss::PRE_SYNC, instr_descr.size());
if(this->disass_enabled){
/* generate console output when executing the command */
tu("print_disass(core_ptr, {:#x}, \"{}\");", pc.val, std::string("illegal_instruction"));
}
pc = pc + ((instr & 3) == 3 ? 4 : 2); pc = pc + ((instr & 3) == 3 ? 4 : 2);
gen_raise_trap(tu, 0, 2); // illegal instruction trap gen_raise_trap(tu, 0, static_cast<int32_t>(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION));
this->gen_set_tval(tu, instr);
vm_impl::gen_sync(tu, iss::POST_SYNC, instr_descr.size()); vm_impl::gen_sync(tu, iss::POST_SYNC, instr_descr.size());
vm_impl::gen_trap_check(tu); vm_impl::gen_trap_check(tu);
return BRANCH; return ILLEGAL_INSTR;
}
//decoding functionality
void populate_decoding_tree(decoding_tree_node* root){
//create submask
for(auto instr: root->instrs){
root->submask &= instr.mask;
}
//put each instr according to submask&encoding into children
for(auto instr: root->instrs){
bool foundMatch = false;
for(auto child: root->children){
//use value as identifying trait
if(child->value == (instr.value&root->submask)){
child->instrs.push_back(instr);
foundMatch = true;
}
}
if(!foundMatch){
decoding_tree_node* child = new decoding_tree_node(instr.value&root->submask);
child->instrs.push_back(instr);
root->children.push_back(child);
}
}
root->instrs.clear();
//call populate_decoding_tree for all children
if(root->children.size() >1)
for(auto child: root->children){
populate_decoding_tree(child);
}
else{
//sort instrs by value of the mask, this works bc we want to have the least restrictive one last
std::sort(root->children[0]->instrs.begin(), root->children[0]->instrs.end(), [](const instruction_descriptor& instr1, const instruction_descriptor& instr2) {
return instr1.mask > instr2.mask;
});
}
}
compile_func decode_instr(decoding_tree_node* node, code_word_t word){
if(!node->children.size()){
if(node->instrs.size() == 1) return node->instrs[0].op;
for(auto instr : node->instrs){
if((instr.mask&word) == instr.value) return instr.op;
}
}
else{
for(auto child : node->children){
if (child->value == (node->submask&word)){
return decode_instr(child, word);
}
}
}
return nullptr;
} }
}; };
@ -252,65 +243,139 @@ template <typename ARCH> vm_impl<ARCH>::vm_impl() { this(new ARCH()); }
template <typename ARCH> template <typename ARCH>
vm_impl<ARCH>::vm_impl(ARCH &core, unsigned core_id, unsigned cluster_id) vm_impl<ARCH>::vm_impl(ARCH &core, unsigned core_id, unsigned cluster_id)
: vm_base<ARCH>(core, core_id, cluster_id) { : vm_base<ARCH>(core, core_id, cluster_id)
root = new decoding_tree_node(std::numeric_limits<uint32_t>::max()); , instr_decoder([this]() {
for(auto instr:instr_descr){ std::vector<generic_instruction_descriptor> g_instr_descr;
root->instrs.push_back(instr); g_instr_descr.reserve(instr_descr.size());
} for (uint32_t i = 0; i < instr_descr.size(); ++i) {
populate_decoding_tree(root); generic_instruction_descriptor new_instr_descr {instr_descr[i].value, instr_descr[i].mask, i};
} g_instr_descr.push_back(new_instr_descr);
}
return std::move(g_instr_descr);
}()) {}
template <typename ARCH> template <typename ARCH>
std::tuple<continuation_e> continuation_e
vm_impl<ARCH>::gen_single_inst_behavior(virt_addr_t &pc, unsigned int &inst_cnt, tu_builder& tu) { vm_impl<ARCH>::gen_single_inst_behavior(virt_addr_t &pc, tu_builder& tu) {
// we fetch at max 4 byte, alignment is 2 // we fetch at max 4 byte, alignment is 2
enum {TRAP_ID=1<<16}; enum {TRAP_ID=1<<16};
code_word_t instr = 0; code_word_t instr = 0;
phys_addr_t paddr(pc); phys_addr_t paddr(pc);
if(this->core.has_mmu()) auto res = this->core.read(paddr, 4, reinterpret_cast<uint8_t*>(&instr));
paddr = this->core.virt2phys(pc); if (res != iss::Ok)
//TODO: re-add page handling return ILLEGAL_FETCH;
// if ((pc.val & upper_bits) != ((pc.val + 2) & upper_bits)) { // we may cross a page boundary if (instr == 0x0000006f || (instr&0xffff)==0xa001)
// auto res = this->core.read(paddr, 2, data); return JUMP_TO_SELF;
// if (res != iss::Ok) throw trap_access(TRAP_ID, pc.val); uint32_t inst_index = instr_decoder.decode_instr(instr);
// if ((insn & 0x3) == 0x3) { // this is a 32bit instruction compile_func f = nullptr;
// res = this->core.read(this->core.v2p(pc + 2), 2, data + 2); if(inst_index < instr_descr.size())
// } f = instr_descr[inst_index].op;
// } else {
auto res = this->core.read(paddr, 4, reinterpret_cast<uint8_t*>(&instr));
if (res != iss::Ok) throw trap_access(TRAP_ID, pc.val);
// }
if (instr == 0x0000006f || (instr&0xffff)==0xa001) throw simulation_stopped(0); // 'J 0' or 'C.J 0'
// curr pc on stack
++inst_cnt;
auto f = decode_instr(root, instr);
if (f == nullptr) { if (f == nullptr) {
f = &this_class::illegal_intruction; f = &this_class::illegal_instruction;
} }
return (this->*f)(pc, instr, tu); return (this->*f)(pc, instr, tu);
} }
template <typename ARCH> void vm_impl<ARCH>::gen_raise_trap(tu_builder& tu, uint16_t trap_id, uint16_t cause) { template <typename ARCH> void vm_impl<ARCH>::gen_raise_trap(tu_builder& tu, uint16_t trap_id, uint16_t cause) {
tu(" *trap_state = {:#x};", 0x80 << 24 | (cause << 16) | trap_id); tu(" *trap_state = {:#x};", 0x80 << 24 | (cause << 16) | trap_id);
tu.store(traits::NEXT_PC, tu.constant(std::numeric_limits<uint32_t>::max(), 32));
} }
template <typename ARCH> void vm_impl<ARCH>::gen_leave_trap(tu_builder& tu, unsigned lvl) { template <typename ARCH> void vm_impl<ARCH>::gen_leave_trap(tu_builder& tu, unsigned lvl) {
tu("leave_trap(core_ptr, {});", lvl); tu("leave_trap(core_ptr, {});", lvl);
tu.store(traits::NEXT_PC, tu.read_mem(traits::CSR, (lvl << 8) + 0x41, traits::XLEN)); tu.store(traits::NEXT_PC, tu.read_mem(traits::CSR, (lvl << 8) + 0x41, traits::XLEN));
tu.store(traits::LAST_BRANCH, tu.constant(std::numeric_limits<uint32_t>::max(), 32)); tu.store(traits::LAST_BRANCH, tu.constant(static_cast<int>(UNKNOWN_JUMP), 32));
} }
template <typename ARCH> void vm_impl<ARCH>::gen_wait(tu_builder& tu, unsigned type) { template <typename ARCH> void vm_impl<ARCH>::gen_set_tval(tu_builder& tu, uint64_t new_tval) {
tu(fmt::format("tval = {};", new_tval));
}
template <typename ARCH> void vm_impl<ARCH>::gen_set_tval(tu_builder& tu, value new_tval) {
tu(fmt::format("tval = {};", new_tval.str));
} }
template <typename ARCH> void vm_impl<ARCH>::gen_trap_behavior(tu_builder& tu) { template <typename ARCH> void vm_impl<ARCH>::gen_trap_behavior(tu_builder& tu) {
tu("trap_entry:"); tu("trap_entry:");
this->gen_sync(tu, POST_SYNC, -1); this->gen_sync(tu, POST_SYNC, -1);
tu("enter_trap(core_ptr, *trap_state, *pc, 0);"); tu("enter_trap(core_ptr, *trap_state, *pc, tval);");
tu.store(traits::LAST_BRANCH, tu.constant(std::numeric_limits<uint32_t>::max(),32)); tu.store(traits::LAST_BRANCH, tu.constant(static_cast<int>(UNKNOWN_JUMP),32));
tu("return *next_pc;"); tu("return *next_pc;");
} }
template <typename ARCH> void vm_impl<ARCH>::add_prologue(tu_builder& tu){
std::ostringstream os;
os << tu.add_reg_ptr("trap_state", arch::traits<ARCH>::TRAP_STATE, this->regs_base_ptr);
os << tu.add_reg_ptr("pending_trap", arch::traits<ARCH>::PENDING_TRAP, this->regs_base_ptr);
os << tu.add_reg_ptr("cycle", arch::traits<ARCH>::CYCLE, this->regs_base_ptr);
<%if(fcsr != null) {
def flen = constants.find { it.name == 'FLEN' }?.value ?: 0
%>
os << "uint32_t (*fget_flags)()=" << (uintptr_t)&fget_flags << ";\\n";
os << "uint16_t (*fadd_h)(uint16_t v1, uint16_t v2, uint8_t mode)=" << (uintptr_t)&fadd_h << ";\\n";
os << "uint16_t (*fsub_h)(uint16_t v1, uint16_t v2, uint8_t mode)=" << (uintptr_t)&fsub_h << ";\\n";
os << "uint16_t (*fmul_h)(uint16_t v1, uint16_t v2, uint8_t mode)=" << (uintptr_t)&fmul_h << ";\\n";
os << "uint16_t (*fdiv_h)(uint16_t v1, uint16_t v2, uint8_t mode)=" << (uintptr_t)&fdiv_h << ";\\n";
os << "uint16_t (*fsqrt_h)(uint16_t v1, uint8_t mode)=" << (uintptr_t)&fsqrt_h << ";\\n";
os << "uint16_t (*fcmp_h)(uint16_t v1, uint16_t v2, uint16_t op)=" << (uintptr_t)&fcmp_h << ";\\n";
os << "uint16_t (*fmadd_h)(uint16_t v1, uint16_t v2, uint16_t v3, uint16_t op, uint8_t mode)=" << (uintptr_t)&fmadd_h << ";\\n";
os << "uint16_t (*fsel_h)(uint16_t v1, uint16_t v2, uint16_t op)=" << (uintptr_t)&fsel_h << ";\\n";
os << "uint16_t (*fclass_h)(uint16_t v1)=" << (uintptr_t)&fclass_h << ";\\n";
os << "uint16_t (*unbox_h)(uint8_t FLEN, uint64_t v)=" << (uintptr_t)&unbox_h << ";\\n";
os << "uint32_t (*f16toi32)(uint32_t v1, uint8_t mode)=" << (uintptr_t)&f16toi32 << ";\\n";
os << "uint32_t (*f16toui32)(uint32_t v1, uint8_t mode)=" << (uintptr_t)&f16toui32 << ";\\n";
os << "uint16_t (*i32tof16)(uint32_t v1, uint8_t mode)=" << (uintptr_t)&i32tof16 << ";\\n";
os << "uint16_t (*ui32tof16)(uint32_t v1, uint8_t mode)=" << (uintptr_t)&ui32tof16 << ";\\n";
os << "uint64_t (*f16toi64)(uint32_t v1, uint8_t mode)=" << (uintptr_t)&f16toi64 <<";\\n";
os << "uint64_t (*f16toui64)(uint32_t v1, uint8_t mode)=" << (uintptr_t)&f16toui64 <<";\\n";
os << "uint16_t (*i64tof16)(uint64_t v1, uint8_t mode)=" << (uintptr_t)&i64tof16 <<";\\n";
os << "uint16_t (*ui64tof16)(uint64_t v1, uint8_t mode)=" << (uintptr_t)&ui64tof16 <<";\\n";
os << "uint32_t (*fadd_s)(uint32_t v1, uint32_t v2, uint8_t mode)=" << (uintptr_t)&fadd_s << ";\\n";
os << "uint32_t (*fsub_s)(uint32_t v1, uint32_t v2, uint8_t mode)=" << (uintptr_t)&fsub_s << ";\\n";
os << "uint32_t (*fmul_s)(uint32_t v1, uint32_t v2, uint8_t mode)=" << (uintptr_t)&fmul_s << ";\\n";
os << "uint32_t (*fdiv_s)(uint32_t v1, uint32_t v2, uint8_t mode)=" << (uintptr_t)&fdiv_s << ";\\n";
os << "uint32_t (*fsqrt_s)(uint32_t v1, uint8_t mode)=" << (uintptr_t)&fsqrt_s << ";\\n";
os << "uint32_t (*fcmp_s)(uint32_t v1, uint32_t v2, uint32_t op)=" << (uintptr_t)&fcmp_s << ";\\n";
os << "uint32_t (*fmadd_s)(uint32_t v1, uint32_t v2, uint32_t v3, uint32_t op, uint8_t mode)=" << (uintptr_t)&fmadd_s << ";\\n";
os << "uint32_t (*fsel_s)(uint32_t v1, uint32_t v2, uint32_t op)=" << (uintptr_t)&fsel_s << ";\\n";
os << "uint32_t (*fclass_s)( uint32_t v1 )=" << (uintptr_t)&fclass_s << ";\\n";
os << "uint32_t (*unbox_s)(uint8_t FLEN, uint64_t v)=" << (uintptr_t)&unbox_s << ";\\n";
os << "uint32_t (*f32toi32)(uint32_t v1, uint8_t mode)=" << (uintptr_t)&f32toi32 << ";\\n";
os << "uint32_t (*f32toui32)(uint32_t v1, uint8_t mode)=" << (uintptr_t)&f32toui32 << ";\\n";
os << "uint32_t (*i32tof32)(uint32_t v1, uint8_t mode)=" << (uintptr_t)&i32tof32 << ";\\n";
os << "uint32_t (*ui32tof32)(uint32_t v1, uint8_t mode)=" << (uintptr_t)&ui32tof32 << ";\\n";
os << "uint64_t (*f32toi64)(uint32_t v1, uint8_t mode)=" << (uintptr_t)&f32toi64 <<";\\n";
os << "uint64_t (*f32toui64)(uint32_t v1, uint8_t mode)=" << (uintptr_t)&f32toui64 <<";\\n";
os << "uint32_t (*i64tof32)(uint64_t v1, uint8_t mode)=" << (uintptr_t)&i64tof32 <<";\\n";
os << "uint32_t (*ui64tof32)(uint64_t v1, uint8_t mode)=" << (uintptr_t)&ui64tof32 <<";\\n";
<%if(flen > 32) {%>
os << "uint64_t (*fadd_d)(uint64_t v1, uint64_t v2, uint8_t mode)=" << (uintptr_t)&fadd_d << ";\\n";
os << "uint64_t (*fsub_d)(uint64_t v1, uint64_t v2, uint8_t mode)=" << (uintptr_t)&fsub_d << ";\\n";
os << "uint64_t (*fmul_d)(uint64_t v1, uint64_t v2, uint8_t mode)=" << (uintptr_t)&fmul_d << ";\\n";
os << "uint64_t (*fdiv_d)(uint64_t v1, uint64_t v2, uint8_t mode)=" << (uintptr_t)&fdiv_d << ";\\n";
os << "uint64_t (*fsqrt_d)(uint64_t v1, uint8_t mode)=" << (uintptr_t)&fsqrt_d << ";\\n";
os << "uint64_t (*fcmp_d)(uint64_t v1, uint64_t v2, uint32_t op)=" << (uintptr_t)&fcmp_d << ";\\n";
os << "uint64_t (*fmadd_d)(uint64_t v1, uint64_t v2, uint64_t v3, uint32_t op, uint8_t mode)=" << (uintptr_t)&fmadd_d << ";\\n";
os << "uint64_t (*fsel_d)(uint64_t v1, uint64_t v2, uint32_t op)=" << (uintptr_t)&fsel_d << ";\\n";
os << "uint64_t (*fclass_d)(uint64_t v1 )=" << (uintptr_t)&fclass_d << ";\\n";
os << "uint64_t (*unbox_d)(uint8_t FLEN, uint64_t v)=" << (uintptr_t)&unbox_d << ";\\n";
os << "uint32_t (*f64tof32)(uint64_t v1, uint8_t mode)=" << (uintptr_t)&f64tof32 << ";\\n";
os << "uint64_t (*f32tof64)(uint32_t v1, uint8_t mode)=" << (uintptr_t)&f32tof64 << ";\\n";
os << "uint64_t (*f64toi64)(uint64_t v1, uint8_t mode)=" << (uintptr_t)&f64toi64 <<";\\n";
os << "uint64_t (*f64toui64)(uint64_t v1, uint8_t mode)=" << (uintptr_t)&f64toui64 <<";\\n";
os << "uint64_t (*i64tof64)(uint64_t v1, uint8_t mode)=" << (uintptr_t)&i64tof64 <<";\\n";
os << "uint64_t (*ui64tof64)(uint64_t v1, uint8_t mode)=" << (uintptr_t)&ui64tof64 <<";\\n";
os << "uint64_t (*i32tof64)(uint32_t v1, uint8_t mode)=" << (uintptr_t)&i32tof64 <<";\\n";
os << "uint64_t (*ui32tof64)(uint32_t v1, uint8_t mode)=" << (uintptr_t)&ui32tof64 <<";\\n";
os << "uint32_t (*f64toi32)(uint64_t v1, uint8_t mode)=" << (uintptr_t)&f64toi32 <<";\\n";
os << "uint32_t (*f64toui32)(uint64_t v1, uint8_t mode)=" << (uintptr_t)&f64toui32 <<";\\n";
<%}
}%>
tu.add_prologue(os.str());
}
} // namespace ${coreDef.name.toLowerCase()} } // namespace ${coreDef.name.toLowerCase()}
@ -334,7 +399,7 @@ volatile std::array<bool, 2> dummy = {
auto vm = new tcc::${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*cpu, false); auto vm = new tcc::${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*cpu, false);
if (port != 0) debugger::server<debugger::gdb_session>::run_server(vm, port); if (port != 0) debugger::server<debugger::gdb_session>::run_server(vm, port);
if(init_data){ if(init_data){
auto* cb = reinterpret_cast<std::function<void(arch_if*, arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t, arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t)>*>(init_data); auto* cb = reinterpret_cast<semihosting_cb_t<arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t>*>(init_data);
cpu->set_semihosting_callback(*cb); cpu->set_semihosting_callback(*cb);
} }
return {cpu_ptr{cpu}, vm_ptr{vm}}; return {cpu_ptr{cpu}, vm_ptr{vm}};
@ -344,7 +409,7 @@ volatile std::array<bool, 2> dummy = {
auto vm = new tcc::${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*cpu, false); auto vm = new tcc::${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*cpu, false);
if (port != 0) debugger::server<debugger::gdb_session>::run_server(vm, port); if (port != 0) debugger::server<debugger::gdb_session>::run_server(vm, port);
if(init_data){ if(init_data){
auto* cb = reinterpret_cast<std::function<void(arch_if*, arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t, arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t)>*>(init_data); auto* cb = reinterpret_cast<semihosting_cb_t<arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t>*>(init_data);
cpu->set_semihosting_callback(*cb); cpu->set_semihosting_callback(*cb);
} }
return {cpu_ptr{cpu}, vm_ptr{vm}}; return {cpu_ptr{cpu}, vm_ptr{vm}};

2
softfloat/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
build/*/*.o
build/*/*.a

View File

@ -1,37 +1,37 @@
License for Berkeley SoftFloat Release 3e License for Berkeley SoftFloat Release 3e
John R. Hauser John R. Hauser
2018 January 20 2018 January 20
The following applies to the whole of SoftFloat Release 3e as well as to The following applies to the whole of SoftFloat Release 3e as well as to
each source file individually. each source file individually.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the
University of California. All rights reserved. University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright 2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions, and the following disclaimer in the notice, this list of conditions, and the following disclaimer in the
documentation and/or other materials provided with the distribution. documentation and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors 3. Neither the name of the University nor the names of its contributors
may be used to endorse or promote products derived from this software may be used to endorse or promote products derived from this software
without specific prior written permission. without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -1,49 +1,49 @@
<HTML> <HTML>
<HEAD> <HEAD>
<TITLE>Berkeley SoftFloat Package Overview</TITLE> <TITLE>Berkeley SoftFloat Package Overview</TITLE>
</HEAD> </HEAD>
<BODY> <BODY>
<H1>Package Overview for Berkeley SoftFloat Release 3e</H1> <H1>Package Overview for Berkeley SoftFloat Release 3e</H1>
<P> <P>
John R. Hauser<BR> John R. Hauser<BR>
2018 January 20<BR> 2018 January 20<BR>
</P> </P>
<P> <P>
Berkeley SoftFloat is a software implementation of binary floating-point that Berkeley SoftFloat is a software implementation of binary floating-point that
conforms to the IEEE Standard for Floating-Point Arithmetic. conforms to the IEEE Standard for Floating-Point Arithmetic.
SoftFloat is distributed in the form of C source code. SoftFloat is distributed in the form of C source code.
Building the SoftFloat sources generates a library file (typically Building the SoftFloat sources generates a library file (typically
<CODE>softfloat.a</CODE> or <CODE>libsoftfloat.a</CODE>) containing the <CODE>softfloat.a</CODE> or <CODE>libsoftfloat.a</CODE>) containing the
floating-point subroutines. floating-point subroutines.
</P> </P>
<P> <P>
The SoftFloat package is documented in the following files in the The SoftFloat package is documented in the following files in the
<CODE>doc</CODE> subdirectory: <CODE>doc</CODE> subdirectory:
<BLOCKQUOTE> <BLOCKQUOTE>
<TABLE> <TABLE>
<TR> <TR>
<TD><A HREF="doc/SoftFloat.html"><NOBR><CODE>SoftFloat.html</CODE></NOBR></A></TD> <TD><A HREF="doc/SoftFloat.html"><NOBR><CODE>SoftFloat.html</CODE></NOBR></A></TD>
<TD>Documentation for using the SoftFloat functions.</TD> <TD>Documentation for using the SoftFloat functions.</TD>
</TR> </TR>
<TR> <TR>
<TD><A HREF="doc/SoftFloat-source.html"><NOBR><CODE>SoftFloat-source.html</CODE></NOBR></A></TD> <TD><A HREF="doc/SoftFloat-source.html"><NOBR><CODE>SoftFloat-source.html</CODE></NOBR></A></TD>
<TD>Documentation for building SoftFloat.</TD> <TD>Documentation for building SoftFloat.</TD>
</TR> </TR>
<TR> <TR>
<TD><A HREF="doc/SoftFloat-history.html"><NOBR><CODE>SoftFloat-history.html</CODE></A><CODE>&nbsp;&nbsp;&nbsp;</CODE></NOBR></TD> <TD><A HREF="doc/SoftFloat-history.html"><NOBR><CODE>SoftFloat-history.html</CODE></A><CODE>&nbsp;&nbsp;&nbsp;</CODE></NOBR></TD>
<TD>History of the major changes to SoftFloat.</TD> <TD>History of the major changes to SoftFloat.</TD>
</TR> </TR>
</TABLE> </TABLE>
</BLOCKQUOTE> </BLOCKQUOTE>
Other files in the package comprise the source code for SoftFloat. Other files in the package comprise the source code for SoftFloat.
</P> </P>
</BODY> </BODY>

24
softfloat/README.md Normal file
View File

@ -0,0 +1,24 @@
Package Overview for Berkeley SoftFloat Release 3e
==================================================
John R. Hauser<br>
2018 January 20
Berkeley SoftFloat is a software implementation of binary floating-point
that conforms to the IEEE Standard for Floating-Point Arithmetic. SoftFloat
is distributed in the form of C source code. Building the SoftFloat sources
generates a library file (typically `softfloat.a` or `libsoftfloat.a`)
containing the floating-point subroutines.
The SoftFloat package is documented in the following files in the `doc`
subdirectory:
* [SoftFloat.html](http://www.jhauser.us/arithmetic/SoftFloat-3/doc/SoftFloat.html) Documentation for using the SoftFloat functions.
* [SoftFloat-source.html](http://www.jhauser.us/arithmetic/SoftFloat-3/doc/SoftFloat-source.html) Documentation for building SoftFloat.
* [SoftFloat-history.html](http://www.jhauser.us/arithmetic/SoftFloat-3/doc/SoftFloat-history.html) History of the major changes to SoftFloat.
Other files in the package comprise the source code for SoftFloat.

View File

@ -1,21 +1,21 @@
Package Overview for Berkeley SoftFloat Release 3e Package Overview for Berkeley SoftFloat Release 3e
John R. Hauser John R. Hauser
2018 January 20 2018 January 20
Berkeley SoftFloat is a software implementation of binary floating-point Berkeley SoftFloat is a software implementation of binary floating-point
that conforms to the IEEE Standard for Floating-Point Arithmetic. SoftFloat that conforms to the IEEE Standard for Floating-Point Arithmetic. SoftFloat
is distributed in the form of C source code. Building the SoftFloat sources is distributed in the form of C source code. Building the SoftFloat sources
generates a library file (typically "softfloat.a" or "libsoftfloat.a") generates a library file (typically "softfloat.a" or "libsoftfloat.a")
containing the floating-point subroutines. containing the floating-point subroutines.
The SoftFloat package is documented in the following files in the "doc" The SoftFloat package is documented in the following files in the "doc"
subdirectory: subdirectory:
SoftFloat.html Documentation for using the SoftFloat functions. SoftFloat.html Documentation for using the SoftFloat functions.
SoftFloat-source.html Documentation for building SoftFloat. SoftFloat-source.html Documentation for building SoftFloat.
SoftFloat-history.html History of the major changes to SoftFloat. SoftFloat-history.html History of the major changes to SoftFloat.
Other files in the package comprise the source code for SoftFloat. Other files in the package comprise the source code for SoftFloat.

View File

@ -1,325 +1,325 @@
#============================================================================= #=============================================================================
# #
# This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic # This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic
# Package, Release 3e, by John R. Hauser. # Package, Release 3e, by John R. Hauser.
# #
# Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the # Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
# University of California. All rights reserved. # University of California. All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met: # modification, are permitted provided that the following conditions are met:
# #
# 1. Redistributions of source code must retain the above copyright notice, # 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer. # this list of conditions, and the following disclaimer.
# #
# 2. Redistributions in binary form must reproduce the above copyright # 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in the # notice, this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution. # documentation and/or other materials provided with the distribution.
# #
# 3. Neither the name of the University nor the names of its contributors # 3. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software # may be used to endorse or promote products derived from this software
# without specific prior written permission. # without specific prior written permission.
# #
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# #
#============================================================================= #=============================================================================
SOURCE_DIR ?= ../../source SOURCE_DIR ?= ../../source
SPECIALIZE_TYPE ?= 8086 SPECIALIZE_TYPE ?= 8086
SOFTFLOAT_OPTS ?= \ SOFTFLOAT_OPTS ?= \
-DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \ -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
-DSOFTFLOAT_FAST_DIV64TO32 -DSOFTFLOAT_FAST_DIV64TO32
DELETE = rm -f DELETE = rm -f
C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
COMPILE_C = \ COMPILE_C = \
gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \ gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \
$(C_INCLUDES) -O2 -o $@ $(C_INCLUDES) -O2 -o $@
MAKELIB = ar crs $@ MAKELIB = ar crs $@
OBJ = .o OBJ = .o
LIB = .a LIB = .a
OTHER_HEADERS = OTHER_HEADERS =
.PHONY: all .PHONY: all
all: softfloat$(LIB) all: softfloat$(LIB)
OBJS_PRIMITIVES = \ OBJS_PRIMITIVES = \
s_compare96M$(OBJ) \ s_compare96M$(OBJ) \
s_compare128M$(OBJ) \ s_compare128M$(OBJ) \
s_shortShiftLeft64To96M$(OBJ) \ s_shortShiftLeft64To96M$(OBJ) \
s_shortShiftLeftM$(OBJ) \ s_shortShiftLeftM$(OBJ) \
s_shiftLeftM$(OBJ) \ s_shiftLeftM$(OBJ) \
s_shortShiftRightM$(OBJ) \ s_shortShiftRightM$(OBJ) \
s_shortShiftRightJam64$(OBJ) \ s_shortShiftRightJam64$(OBJ) \
s_shortShiftRightJamM$(OBJ) \ s_shortShiftRightJamM$(OBJ) \
s_shiftRightJam32$(OBJ) \ s_shiftRightJam32$(OBJ) \
s_shiftRightJam64$(OBJ) \ s_shiftRightJam64$(OBJ) \
s_shiftRightJamM$(OBJ) \ s_shiftRightJamM$(OBJ) \
s_shiftRightM$(OBJ) \ s_shiftRightM$(OBJ) \
s_countLeadingZeros8$(OBJ) \ s_countLeadingZeros8$(OBJ) \
s_countLeadingZeros16$(OBJ) \ s_countLeadingZeros16$(OBJ) \
s_countLeadingZeros32$(OBJ) \ s_countLeadingZeros32$(OBJ) \
s_countLeadingZeros64$(OBJ) \ s_countLeadingZeros64$(OBJ) \
s_addM$(OBJ) \ s_addM$(OBJ) \
s_addCarryM$(OBJ) \ s_addCarryM$(OBJ) \
s_addComplCarryM$(OBJ) \ s_addComplCarryM$(OBJ) \
s_negXM$(OBJ) \ s_negXM$(OBJ) \
s_sub1XM$(OBJ) \ s_sub1XM$(OBJ) \
s_subM$(OBJ) \ s_subM$(OBJ) \
s_mul64To128M$(OBJ) \ s_mul64To128M$(OBJ) \
s_mul128MTo256M$(OBJ) \ s_mul128MTo256M$(OBJ) \
s_approxRecip_1Ks$(OBJ) \ s_approxRecip_1Ks$(OBJ) \
s_approxRecip32_1$(OBJ) \ s_approxRecip32_1$(OBJ) \
s_approxRecipSqrt_1Ks$(OBJ) \ s_approxRecipSqrt_1Ks$(OBJ) \
s_approxRecipSqrt32_1$(OBJ) \ s_approxRecipSqrt32_1$(OBJ) \
s_remStepMBy32$(OBJ) \ s_remStepMBy32$(OBJ) \
OBJS_SPECIALIZE = \ OBJS_SPECIALIZE = \
softfloat_raiseFlags$(OBJ) \ softfloat_raiseFlags$(OBJ) \
s_f16UIToCommonNaN$(OBJ) \ s_f16UIToCommonNaN$(OBJ) \
s_commonNaNToF16UI$(OBJ) \ s_commonNaNToF16UI$(OBJ) \
s_propagateNaNF16UI$(OBJ) \ s_propagateNaNF16UI$(OBJ) \
s_f32UIToCommonNaN$(OBJ) \ s_f32UIToCommonNaN$(OBJ) \
s_commonNaNToF32UI$(OBJ) \ s_commonNaNToF32UI$(OBJ) \
s_propagateNaNF32UI$(OBJ) \ s_propagateNaNF32UI$(OBJ) \
s_f64UIToCommonNaN$(OBJ) \ s_f64UIToCommonNaN$(OBJ) \
s_commonNaNToF64UI$(OBJ) \ s_commonNaNToF64UI$(OBJ) \
s_propagateNaNF64UI$(OBJ) \ s_propagateNaNF64UI$(OBJ) \
extF80M_isSignalingNaN$(OBJ) \ extF80M_isSignalingNaN$(OBJ) \
s_extF80MToCommonNaN$(OBJ) \ s_extF80MToCommonNaN$(OBJ) \
s_commonNaNToExtF80M$(OBJ) \ s_commonNaNToExtF80M$(OBJ) \
s_propagateNaNExtF80M$(OBJ) \ s_propagateNaNExtF80M$(OBJ) \
f128M_isSignalingNaN$(OBJ) \ f128M_isSignalingNaN$(OBJ) \
s_f128MToCommonNaN$(OBJ) \ s_f128MToCommonNaN$(OBJ) \
s_commonNaNToF128M$(OBJ) \ s_commonNaNToF128M$(OBJ) \
s_propagateNaNF128M$(OBJ) \ s_propagateNaNF128M$(OBJ) \
OBJS_OTHERS = \ OBJS_OTHERS = \
s_roundToUI32$(OBJ) \ s_roundToUI32$(OBJ) \
s_roundMToUI64$(OBJ) \ s_roundMToUI64$(OBJ) \
s_roundToI32$(OBJ) \ s_roundToI32$(OBJ) \
s_roundMToI64$(OBJ) \ s_roundMToI64$(OBJ) \
s_normSubnormalF16Sig$(OBJ) \ s_normSubnormalF16Sig$(OBJ) \
s_roundPackToF16$(OBJ) \ s_roundPackToF16$(OBJ) \
s_normRoundPackToF16$(OBJ) \ s_normRoundPackToF16$(OBJ) \
s_addMagsF16$(OBJ) \ s_addMagsF16$(OBJ) \
s_subMagsF16$(OBJ) \ s_subMagsF16$(OBJ) \
s_mulAddF16$(OBJ) \ s_mulAddF16$(OBJ) \
s_normSubnormalF32Sig$(OBJ) \ s_normSubnormalF32Sig$(OBJ) \
s_roundPackToF32$(OBJ) \ s_roundPackToF32$(OBJ) \
s_normRoundPackToF32$(OBJ) \ s_normRoundPackToF32$(OBJ) \
s_addMagsF32$(OBJ) \ s_addMagsF32$(OBJ) \
s_subMagsF32$(OBJ) \ s_subMagsF32$(OBJ) \
s_mulAddF32$(OBJ) \ s_mulAddF32$(OBJ) \
s_normSubnormalF64Sig$(OBJ) \ s_normSubnormalF64Sig$(OBJ) \
s_roundPackToF64$(OBJ) \ s_roundPackToF64$(OBJ) \
s_normRoundPackToF64$(OBJ) \ s_normRoundPackToF64$(OBJ) \
s_addMagsF64$(OBJ) \ s_addMagsF64$(OBJ) \
s_subMagsF64$(OBJ) \ s_subMagsF64$(OBJ) \
s_mulAddF64$(OBJ) \ s_mulAddF64$(OBJ) \
s_tryPropagateNaNExtF80M$(OBJ) \ s_tryPropagateNaNExtF80M$(OBJ) \
s_invalidExtF80M$(OBJ) \ s_invalidExtF80M$(OBJ) \
s_normExtF80SigM$(OBJ) \ s_normExtF80SigM$(OBJ) \
s_roundPackMToExtF80M$(OBJ) \ s_roundPackMToExtF80M$(OBJ) \
s_normRoundPackMToExtF80M$(OBJ) \ s_normRoundPackMToExtF80M$(OBJ) \
s_addExtF80M$(OBJ) \ s_addExtF80M$(OBJ) \
s_compareNonnormExtF80M$(OBJ) \ s_compareNonnormExtF80M$(OBJ) \
s_isNaNF128M$(OBJ) \ s_isNaNF128M$(OBJ) \
s_tryPropagateNaNF128M$(OBJ) \ s_tryPropagateNaNF128M$(OBJ) \
s_invalidF128M$(OBJ) \ s_invalidF128M$(OBJ) \
s_shiftNormSigF128M$(OBJ) \ s_shiftNormSigF128M$(OBJ) \
s_roundPackMToF128M$(OBJ) \ s_roundPackMToF128M$(OBJ) \
s_normRoundPackMToF128M$(OBJ) \ s_normRoundPackMToF128M$(OBJ) \
s_addF128M$(OBJ) \ s_addF128M$(OBJ) \
s_mulAddF128M$(OBJ) \ s_mulAddF128M$(OBJ) \
softfloat_state$(OBJ) \ softfloat_state$(OBJ) \
ui32_to_f16$(OBJ) \ ui32_to_f16$(OBJ) \
ui32_to_f32$(OBJ) \ ui32_to_f32$(OBJ) \
ui32_to_f64$(OBJ) \ ui32_to_f64$(OBJ) \
ui32_to_extF80M$(OBJ) \ ui32_to_extF80M$(OBJ) \
ui32_to_f128M$(OBJ) \ ui32_to_f128M$(OBJ) \
ui64_to_f16$(OBJ) \ ui64_to_f16$(OBJ) \
ui64_to_f32$(OBJ) \ ui64_to_f32$(OBJ) \
ui64_to_f64$(OBJ) \ ui64_to_f64$(OBJ) \
ui64_to_extF80M$(OBJ) \ ui64_to_extF80M$(OBJ) \
ui64_to_f128M$(OBJ) \ ui64_to_f128M$(OBJ) \
i32_to_f16$(OBJ) \ i32_to_f16$(OBJ) \
i32_to_f32$(OBJ) \ i32_to_f32$(OBJ) \
i32_to_f64$(OBJ) \ i32_to_f64$(OBJ) \
i32_to_extF80M$(OBJ) \ i32_to_extF80M$(OBJ) \
i32_to_f128M$(OBJ) \ i32_to_f128M$(OBJ) \
i64_to_f16$(OBJ) \ i64_to_f16$(OBJ) \
i64_to_f32$(OBJ) \ i64_to_f32$(OBJ) \
i64_to_f64$(OBJ) \ i64_to_f64$(OBJ) \
i64_to_extF80M$(OBJ) \ i64_to_extF80M$(OBJ) \
i64_to_f128M$(OBJ) \ i64_to_f128M$(OBJ) \
f16_to_ui32$(OBJ) \ f16_to_ui32$(OBJ) \
f16_to_ui64$(OBJ) \ f16_to_ui64$(OBJ) \
f16_to_i32$(OBJ) \ f16_to_i32$(OBJ) \
f16_to_i64$(OBJ) \ f16_to_i64$(OBJ) \
f16_to_ui32_r_minMag$(OBJ) \ f16_to_ui32_r_minMag$(OBJ) \
f16_to_ui64_r_minMag$(OBJ) \ f16_to_ui64_r_minMag$(OBJ) \
f16_to_i32_r_minMag$(OBJ) \ f16_to_i32_r_minMag$(OBJ) \
f16_to_i64_r_minMag$(OBJ) \ f16_to_i64_r_minMag$(OBJ) \
f16_to_f32$(OBJ) \ f16_to_f32$(OBJ) \
f16_to_f64$(OBJ) \ f16_to_f64$(OBJ) \
f16_to_extF80M$(OBJ) \ f16_to_extF80M$(OBJ) \
f16_to_f128M$(OBJ) \ f16_to_f128M$(OBJ) \
f16_roundToInt$(OBJ) \ f16_roundToInt$(OBJ) \
f16_add$(OBJ) \ f16_add$(OBJ) \
f16_sub$(OBJ) \ f16_sub$(OBJ) \
f16_mul$(OBJ) \ f16_mul$(OBJ) \
f16_mulAdd$(OBJ) \ f16_mulAdd$(OBJ) \
f16_div$(OBJ) \ f16_div$(OBJ) \
f16_rem$(OBJ) \ f16_rem$(OBJ) \
f16_sqrt$(OBJ) \ f16_sqrt$(OBJ) \
f16_eq$(OBJ) \ f16_eq$(OBJ) \
f16_le$(OBJ) \ f16_le$(OBJ) \
f16_lt$(OBJ) \ f16_lt$(OBJ) \
f16_eq_signaling$(OBJ) \ f16_eq_signaling$(OBJ) \
f16_le_quiet$(OBJ) \ f16_le_quiet$(OBJ) \
f16_lt_quiet$(OBJ) \ f16_lt_quiet$(OBJ) \
f16_isSignalingNaN$(OBJ) \ f16_isSignalingNaN$(OBJ) \
f32_to_ui32$(OBJ) \ f32_to_ui32$(OBJ) \
f32_to_ui64$(OBJ) \ f32_to_ui64$(OBJ) \
f32_to_i32$(OBJ) \ f32_to_i32$(OBJ) \
f32_to_i64$(OBJ) \ f32_to_i64$(OBJ) \
f32_to_ui32_r_minMag$(OBJ) \ f32_to_ui32_r_minMag$(OBJ) \
f32_to_ui64_r_minMag$(OBJ) \ f32_to_ui64_r_minMag$(OBJ) \
f32_to_i32_r_minMag$(OBJ) \ f32_to_i32_r_minMag$(OBJ) \
f32_to_i64_r_minMag$(OBJ) \ f32_to_i64_r_minMag$(OBJ) \
f32_to_f16$(OBJ) \ f32_to_f16$(OBJ) \
f32_to_f64$(OBJ) \ f32_to_f64$(OBJ) \
f32_to_extF80M$(OBJ) \ f32_to_extF80M$(OBJ) \
f32_to_f128M$(OBJ) \ f32_to_f128M$(OBJ) \
f32_roundToInt$(OBJ) \ f32_roundToInt$(OBJ) \
f32_add$(OBJ) \ f32_add$(OBJ) \
f32_sub$(OBJ) \ f32_sub$(OBJ) \
f32_mul$(OBJ) \ f32_mul$(OBJ) \
f32_mulAdd$(OBJ) \ f32_mulAdd$(OBJ) \
f32_div$(OBJ) \ f32_div$(OBJ) \
f32_rem$(OBJ) \ f32_rem$(OBJ) \
f32_sqrt$(OBJ) \ f32_sqrt$(OBJ) \
f32_eq$(OBJ) \ f32_eq$(OBJ) \
f32_le$(OBJ) \ f32_le$(OBJ) \
f32_lt$(OBJ) \ f32_lt$(OBJ) \
f32_eq_signaling$(OBJ) \ f32_eq_signaling$(OBJ) \
f32_le_quiet$(OBJ) \ f32_le_quiet$(OBJ) \
f32_lt_quiet$(OBJ) \ f32_lt_quiet$(OBJ) \
f32_isSignalingNaN$(OBJ) \ f32_isSignalingNaN$(OBJ) \
f64_to_ui32$(OBJ) \ f64_to_ui32$(OBJ) \
f64_to_ui64$(OBJ) \ f64_to_ui64$(OBJ) \
f64_to_i32$(OBJ) \ f64_to_i32$(OBJ) \
f64_to_i64$(OBJ) \ f64_to_i64$(OBJ) \
f64_to_ui32_r_minMag$(OBJ) \ f64_to_ui32_r_minMag$(OBJ) \
f64_to_ui64_r_minMag$(OBJ) \ f64_to_ui64_r_minMag$(OBJ) \
f64_to_i32_r_minMag$(OBJ) \ f64_to_i32_r_minMag$(OBJ) \
f64_to_i64_r_minMag$(OBJ) \ f64_to_i64_r_minMag$(OBJ) \
f64_to_f16$(OBJ) \ f64_to_f16$(OBJ) \
f64_to_f32$(OBJ) \ f64_to_f32$(OBJ) \
f64_to_extF80M$(OBJ) \ f64_to_extF80M$(OBJ) \
f64_to_f128M$(OBJ) \ f64_to_f128M$(OBJ) \
f64_roundToInt$(OBJ) \ f64_roundToInt$(OBJ) \
f64_add$(OBJ) \ f64_add$(OBJ) \
f64_sub$(OBJ) \ f64_sub$(OBJ) \
f64_mul$(OBJ) \ f64_mul$(OBJ) \
f64_mulAdd$(OBJ) \ f64_mulAdd$(OBJ) \
f64_div$(OBJ) \ f64_div$(OBJ) \
f64_rem$(OBJ) \ f64_rem$(OBJ) \
f64_sqrt$(OBJ) \ f64_sqrt$(OBJ) \
f64_eq$(OBJ) \ f64_eq$(OBJ) \
f64_le$(OBJ) \ f64_le$(OBJ) \
f64_lt$(OBJ) \ f64_lt$(OBJ) \
f64_eq_signaling$(OBJ) \ f64_eq_signaling$(OBJ) \
f64_le_quiet$(OBJ) \ f64_le_quiet$(OBJ) \
f64_lt_quiet$(OBJ) \ f64_lt_quiet$(OBJ) \
f64_isSignalingNaN$(OBJ) \ f64_isSignalingNaN$(OBJ) \
extF80M_to_ui32$(OBJ) \ extF80M_to_ui32$(OBJ) \
extF80M_to_ui64$(OBJ) \ extF80M_to_ui64$(OBJ) \
extF80M_to_i32$(OBJ) \ extF80M_to_i32$(OBJ) \
extF80M_to_i64$(OBJ) \ extF80M_to_i64$(OBJ) \
extF80M_to_ui32_r_minMag$(OBJ) \ extF80M_to_ui32_r_minMag$(OBJ) \
extF80M_to_ui64_r_minMag$(OBJ) \ extF80M_to_ui64_r_minMag$(OBJ) \
extF80M_to_i32_r_minMag$(OBJ) \ extF80M_to_i32_r_minMag$(OBJ) \
extF80M_to_i64_r_minMag$(OBJ) \ extF80M_to_i64_r_minMag$(OBJ) \
extF80M_to_f16$(OBJ) \ extF80M_to_f16$(OBJ) \
extF80M_to_f32$(OBJ) \ extF80M_to_f32$(OBJ) \
extF80M_to_f64$(OBJ) \ extF80M_to_f64$(OBJ) \
extF80M_to_f128M$(OBJ) \ extF80M_to_f128M$(OBJ) \
extF80M_roundToInt$(OBJ) \ extF80M_roundToInt$(OBJ) \
extF80M_add$(OBJ) \ extF80M_add$(OBJ) \
extF80M_sub$(OBJ) \ extF80M_sub$(OBJ) \
extF80M_mul$(OBJ) \ extF80M_mul$(OBJ) \
extF80M_div$(OBJ) \ extF80M_div$(OBJ) \
extF80M_rem$(OBJ) \ extF80M_rem$(OBJ) \
extF80M_sqrt$(OBJ) \ extF80M_sqrt$(OBJ) \
extF80M_eq$(OBJ) \ extF80M_eq$(OBJ) \
extF80M_le$(OBJ) \ extF80M_le$(OBJ) \
extF80M_lt$(OBJ) \ extF80M_lt$(OBJ) \
extF80M_eq_signaling$(OBJ) \ extF80M_eq_signaling$(OBJ) \
extF80M_le_quiet$(OBJ) \ extF80M_le_quiet$(OBJ) \
extF80M_lt_quiet$(OBJ) \ extF80M_lt_quiet$(OBJ) \
f128M_to_ui32$(OBJ) \ f128M_to_ui32$(OBJ) \
f128M_to_ui64$(OBJ) \ f128M_to_ui64$(OBJ) \
f128M_to_i32$(OBJ) \ f128M_to_i32$(OBJ) \
f128M_to_i64$(OBJ) \ f128M_to_i64$(OBJ) \
f128M_to_ui32_r_minMag$(OBJ) \ f128M_to_ui32_r_minMag$(OBJ) \
f128M_to_ui64_r_minMag$(OBJ) \ f128M_to_ui64_r_minMag$(OBJ) \
f128M_to_i32_r_minMag$(OBJ) \ f128M_to_i32_r_minMag$(OBJ) \
f128M_to_i64_r_minMag$(OBJ) \ f128M_to_i64_r_minMag$(OBJ) \
f128M_to_f16$(OBJ) \ f128M_to_f16$(OBJ) \
f128M_to_f32$(OBJ) \ f128M_to_f32$(OBJ) \
f128M_to_f64$(OBJ) \ f128M_to_f64$(OBJ) \
f128M_to_extF80M$(OBJ) \ f128M_to_extF80M$(OBJ) \
f128M_roundToInt$(OBJ) \ f128M_roundToInt$(OBJ) \
f128M_add$(OBJ) \ f128M_add$(OBJ) \
f128M_sub$(OBJ) \ f128M_sub$(OBJ) \
f128M_mul$(OBJ) \ f128M_mul$(OBJ) \
f128M_mulAdd$(OBJ) \ f128M_mulAdd$(OBJ) \
f128M_div$(OBJ) \ f128M_div$(OBJ) \
f128M_rem$(OBJ) \ f128M_rem$(OBJ) \
f128M_sqrt$(OBJ) \ f128M_sqrt$(OBJ) \
f128M_eq$(OBJ) \ f128M_eq$(OBJ) \
f128M_le$(OBJ) \ f128M_le$(OBJ) \
f128M_lt$(OBJ) \ f128M_lt$(OBJ) \
f128M_eq_signaling$(OBJ) \ f128M_eq_signaling$(OBJ) \
f128M_le_quiet$(OBJ) \ f128M_le_quiet$(OBJ) \
f128M_lt_quiet$(OBJ) \ f128M_lt_quiet$(OBJ) \
OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS) OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS)
$(OBJS_ALL): \ $(OBJS_ALL): \
$(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \ $(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \
$(SOURCE_DIR)/include/primitives.h $(SOURCE_DIR)/include/primitives.h
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \ $(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \ $(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \ $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
$(SOURCE_DIR)/include/softfloat.h $(SOURCE_DIR)/include/softfloat.h
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c $(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$*.c
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c $(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
softfloat$(LIB): $(OBJS_ALL) softfloat$(LIB): $(OBJS_ALL)
$(DELETE) $@ $(DELETE) $@
$(MAKELIB) $^ $(MAKELIB) $^
.PHONY: clean .PHONY: clean
clean: clean:
$(DELETE) $(OBJS_ALL) softfloat$(LIB) $(DELETE) $(OBJS_ALL) softfloat$(LIB)

View File

@ -1,52 +1,53 @@
/*============================================================================ /*============================================================================
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
University of California. All rights reserved. University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define LITTLEENDIAN 1 #define LITTLEENDIAN 1
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#ifdef __GNUC_STDC_INLINE__ #ifdef __GNUC_STDC_INLINE__
#define INLINE inline #define INLINE inline
#else #else
#define INLINE extern inline #define INLINE extern inline
#endif #endif
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define SOFTFLOAT_BUILTIN_CLZ 1 #define SOFTFLOAT_BUILTIN_CLZ 1
#include "opts-GCC.h" #include "opts-GCC.h"

View File

@ -1,325 +1,325 @@
#============================================================================= #=============================================================================
# #
# This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic # This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic
# Package, Release 3e, by John R. Hauser. # Package, Release 3e, by John R. Hauser.
# #
# Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the # Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
# University of California. All rights reserved. # University of California. All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met: # modification, are permitted provided that the following conditions are met:
# #
# 1. Redistributions of source code must retain the above copyright notice, # 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer. # this list of conditions, and the following disclaimer.
# #
# 2. Redistributions in binary form must reproduce the above copyright # 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in the # notice, this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution. # documentation and/or other materials provided with the distribution.
# #
# 3. Neither the name of the University nor the names of its contributors # 3. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software # may be used to endorse or promote products derived from this software
# without specific prior written permission. # without specific prior written permission.
# #
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# #
#============================================================================= #=============================================================================
SOURCE_DIR ?= ../../source SOURCE_DIR ?= ../../source
SPECIALIZE_TYPE ?= 8086-SSE SPECIALIZE_TYPE ?= 8086-SSE
SOFTFLOAT_OPTS ?= \ SOFTFLOAT_OPTS ?= \
-DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \ -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
-DSOFTFLOAT_FAST_DIV64TO32 -DSOFTFLOAT_FAST_DIV64TO32
DELETE = rm -f DELETE = rm -f
C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
COMPILE_C = \ COMPILE_C = \
gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \ gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \
$(C_INCLUDES) -O2 -o $@ $(C_INCLUDES) -O2 -o $@
MAKELIB = ar crs $@ MAKELIB = ar crs $@
OBJ = .o OBJ = .o
LIB = .a LIB = .a
OTHER_HEADERS = OTHER_HEADERS =
.PHONY: all .PHONY: all
all: softfloat$(LIB) all: softfloat$(LIB)
OBJS_PRIMITIVES = \ OBJS_PRIMITIVES = \
s_compare96M$(OBJ) \ s_compare96M$(OBJ) \
s_compare128M$(OBJ) \ s_compare128M$(OBJ) \
s_shortShiftLeft64To96M$(OBJ) \ s_shortShiftLeft64To96M$(OBJ) \
s_shortShiftLeftM$(OBJ) \ s_shortShiftLeftM$(OBJ) \
s_shiftLeftM$(OBJ) \ s_shiftLeftM$(OBJ) \
s_shortShiftRightM$(OBJ) \ s_shortShiftRightM$(OBJ) \
s_shortShiftRightJam64$(OBJ) \ s_shortShiftRightJam64$(OBJ) \
s_shortShiftRightJamM$(OBJ) \ s_shortShiftRightJamM$(OBJ) \
s_shiftRightJam32$(OBJ) \ s_shiftRightJam32$(OBJ) \
s_shiftRightJam64$(OBJ) \ s_shiftRightJam64$(OBJ) \
s_shiftRightJamM$(OBJ) \ s_shiftRightJamM$(OBJ) \
s_shiftRightM$(OBJ) \ s_shiftRightM$(OBJ) \
s_countLeadingZeros8$(OBJ) \ s_countLeadingZeros8$(OBJ) \
s_countLeadingZeros16$(OBJ) \ s_countLeadingZeros16$(OBJ) \
s_countLeadingZeros32$(OBJ) \ s_countLeadingZeros32$(OBJ) \
s_countLeadingZeros64$(OBJ) \ s_countLeadingZeros64$(OBJ) \
s_addM$(OBJ) \ s_addM$(OBJ) \
s_addCarryM$(OBJ) \ s_addCarryM$(OBJ) \
s_addComplCarryM$(OBJ) \ s_addComplCarryM$(OBJ) \
s_negXM$(OBJ) \ s_negXM$(OBJ) \
s_sub1XM$(OBJ) \ s_sub1XM$(OBJ) \
s_subM$(OBJ) \ s_subM$(OBJ) \
s_mul64To128M$(OBJ) \ s_mul64To128M$(OBJ) \
s_mul128MTo256M$(OBJ) \ s_mul128MTo256M$(OBJ) \
s_approxRecip_1Ks$(OBJ) \ s_approxRecip_1Ks$(OBJ) \
s_approxRecip32_1$(OBJ) \ s_approxRecip32_1$(OBJ) \
s_approxRecipSqrt_1Ks$(OBJ) \ s_approxRecipSqrt_1Ks$(OBJ) \
s_approxRecipSqrt32_1$(OBJ) \ s_approxRecipSqrt32_1$(OBJ) \
s_remStepMBy32$(OBJ) \ s_remStepMBy32$(OBJ) \
OBJS_SPECIALIZE = \ OBJS_SPECIALIZE = \
softfloat_raiseFlags$(OBJ) \ softfloat_raiseFlags$(OBJ) \
s_f16UIToCommonNaN$(OBJ) \ s_f16UIToCommonNaN$(OBJ) \
s_commonNaNToF16UI$(OBJ) \ s_commonNaNToF16UI$(OBJ) \
s_propagateNaNF16UI$(OBJ) \ s_propagateNaNF16UI$(OBJ) \
s_f32UIToCommonNaN$(OBJ) \ s_f32UIToCommonNaN$(OBJ) \
s_commonNaNToF32UI$(OBJ) \ s_commonNaNToF32UI$(OBJ) \
s_propagateNaNF32UI$(OBJ) \ s_propagateNaNF32UI$(OBJ) \
s_f64UIToCommonNaN$(OBJ) \ s_f64UIToCommonNaN$(OBJ) \
s_commonNaNToF64UI$(OBJ) \ s_commonNaNToF64UI$(OBJ) \
s_propagateNaNF64UI$(OBJ) \ s_propagateNaNF64UI$(OBJ) \
extF80M_isSignalingNaN$(OBJ) \ extF80M_isSignalingNaN$(OBJ) \
s_extF80MToCommonNaN$(OBJ) \ s_extF80MToCommonNaN$(OBJ) \
s_commonNaNToExtF80M$(OBJ) \ s_commonNaNToExtF80M$(OBJ) \
s_propagateNaNExtF80M$(OBJ) \ s_propagateNaNExtF80M$(OBJ) \
f128M_isSignalingNaN$(OBJ) \ f128M_isSignalingNaN$(OBJ) \
s_f128MToCommonNaN$(OBJ) \ s_f128MToCommonNaN$(OBJ) \
s_commonNaNToF128M$(OBJ) \ s_commonNaNToF128M$(OBJ) \
s_propagateNaNF128M$(OBJ) \ s_propagateNaNF128M$(OBJ) \
OBJS_OTHERS = \ OBJS_OTHERS = \
s_roundToUI32$(OBJ) \ s_roundToUI32$(OBJ) \
s_roundMToUI64$(OBJ) \ s_roundMToUI64$(OBJ) \
s_roundToI32$(OBJ) \ s_roundToI32$(OBJ) \
s_roundMToI64$(OBJ) \ s_roundMToI64$(OBJ) \
s_normSubnormalF16Sig$(OBJ) \ s_normSubnormalF16Sig$(OBJ) \
s_roundPackToF16$(OBJ) \ s_roundPackToF16$(OBJ) \
s_normRoundPackToF16$(OBJ) \ s_normRoundPackToF16$(OBJ) \
s_addMagsF16$(OBJ) \ s_addMagsF16$(OBJ) \
s_subMagsF16$(OBJ) \ s_subMagsF16$(OBJ) \
s_mulAddF16$(OBJ) \ s_mulAddF16$(OBJ) \
s_normSubnormalF32Sig$(OBJ) \ s_normSubnormalF32Sig$(OBJ) \
s_roundPackToF32$(OBJ) \ s_roundPackToF32$(OBJ) \
s_normRoundPackToF32$(OBJ) \ s_normRoundPackToF32$(OBJ) \
s_addMagsF32$(OBJ) \ s_addMagsF32$(OBJ) \
s_subMagsF32$(OBJ) \ s_subMagsF32$(OBJ) \
s_mulAddF32$(OBJ) \ s_mulAddF32$(OBJ) \
s_normSubnormalF64Sig$(OBJ) \ s_normSubnormalF64Sig$(OBJ) \
s_roundPackToF64$(OBJ) \ s_roundPackToF64$(OBJ) \
s_normRoundPackToF64$(OBJ) \ s_normRoundPackToF64$(OBJ) \
s_addMagsF64$(OBJ) \ s_addMagsF64$(OBJ) \
s_subMagsF64$(OBJ) \ s_subMagsF64$(OBJ) \
s_mulAddF64$(OBJ) \ s_mulAddF64$(OBJ) \
s_tryPropagateNaNExtF80M$(OBJ) \ s_tryPropagateNaNExtF80M$(OBJ) \
s_invalidExtF80M$(OBJ) \ s_invalidExtF80M$(OBJ) \
s_normExtF80SigM$(OBJ) \ s_normExtF80SigM$(OBJ) \
s_roundPackMToExtF80M$(OBJ) \ s_roundPackMToExtF80M$(OBJ) \
s_normRoundPackMToExtF80M$(OBJ) \ s_normRoundPackMToExtF80M$(OBJ) \
s_addExtF80M$(OBJ) \ s_addExtF80M$(OBJ) \
s_compareNonnormExtF80M$(OBJ) \ s_compareNonnormExtF80M$(OBJ) \
s_isNaNF128M$(OBJ) \ s_isNaNF128M$(OBJ) \
s_tryPropagateNaNF128M$(OBJ) \ s_tryPropagateNaNF128M$(OBJ) \
s_invalidF128M$(OBJ) \ s_invalidF128M$(OBJ) \
s_shiftNormSigF128M$(OBJ) \ s_shiftNormSigF128M$(OBJ) \
s_roundPackMToF128M$(OBJ) \ s_roundPackMToF128M$(OBJ) \
s_normRoundPackMToF128M$(OBJ) \ s_normRoundPackMToF128M$(OBJ) \
s_addF128M$(OBJ) \ s_addF128M$(OBJ) \
s_mulAddF128M$(OBJ) \ s_mulAddF128M$(OBJ) \
softfloat_state$(OBJ) \ softfloat_state$(OBJ) \
ui32_to_f16$(OBJ) \ ui32_to_f16$(OBJ) \
ui32_to_f32$(OBJ) \ ui32_to_f32$(OBJ) \
ui32_to_f64$(OBJ) \ ui32_to_f64$(OBJ) \
ui32_to_extF80M$(OBJ) \ ui32_to_extF80M$(OBJ) \
ui32_to_f128M$(OBJ) \ ui32_to_f128M$(OBJ) \
ui64_to_f16$(OBJ) \ ui64_to_f16$(OBJ) \
ui64_to_f32$(OBJ) \ ui64_to_f32$(OBJ) \
ui64_to_f64$(OBJ) \ ui64_to_f64$(OBJ) \
ui64_to_extF80M$(OBJ) \ ui64_to_extF80M$(OBJ) \
ui64_to_f128M$(OBJ) \ ui64_to_f128M$(OBJ) \
i32_to_f16$(OBJ) \ i32_to_f16$(OBJ) \
i32_to_f32$(OBJ) \ i32_to_f32$(OBJ) \
i32_to_f64$(OBJ) \ i32_to_f64$(OBJ) \
i32_to_extF80M$(OBJ) \ i32_to_extF80M$(OBJ) \
i32_to_f128M$(OBJ) \ i32_to_f128M$(OBJ) \
i64_to_f16$(OBJ) \ i64_to_f16$(OBJ) \
i64_to_f32$(OBJ) \ i64_to_f32$(OBJ) \
i64_to_f64$(OBJ) \ i64_to_f64$(OBJ) \
i64_to_extF80M$(OBJ) \ i64_to_extF80M$(OBJ) \
i64_to_f128M$(OBJ) \ i64_to_f128M$(OBJ) \
f16_to_ui32$(OBJ) \ f16_to_ui32$(OBJ) \
f16_to_ui64$(OBJ) \ f16_to_ui64$(OBJ) \
f16_to_i32$(OBJ) \ f16_to_i32$(OBJ) \
f16_to_i64$(OBJ) \ f16_to_i64$(OBJ) \
f16_to_ui32_r_minMag$(OBJ) \ f16_to_ui32_r_minMag$(OBJ) \
f16_to_ui64_r_minMag$(OBJ) \ f16_to_ui64_r_minMag$(OBJ) \
f16_to_i32_r_minMag$(OBJ) \ f16_to_i32_r_minMag$(OBJ) \
f16_to_i64_r_minMag$(OBJ) \ f16_to_i64_r_minMag$(OBJ) \
f16_to_f32$(OBJ) \ f16_to_f32$(OBJ) \
f16_to_f64$(OBJ) \ f16_to_f64$(OBJ) \
f16_to_extF80M$(OBJ) \ f16_to_extF80M$(OBJ) \
f16_to_f128M$(OBJ) \ f16_to_f128M$(OBJ) \
f16_roundToInt$(OBJ) \ f16_roundToInt$(OBJ) \
f16_add$(OBJ) \ f16_add$(OBJ) \
f16_sub$(OBJ) \ f16_sub$(OBJ) \
f16_mul$(OBJ) \ f16_mul$(OBJ) \
f16_mulAdd$(OBJ) \ f16_mulAdd$(OBJ) \
f16_div$(OBJ) \ f16_div$(OBJ) \
f16_rem$(OBJ) \ f16_rem$(OBJ) \
f16_sqrt$(OBJ) \ f16_sqrt$(OBJ) \
f16_eq$(OBJ) \ f16_eq$(OBJ) \
f16_le$(OBJ) \ f16_le$(OBJ) \
f16_lt$(OBJ) \ f16_lt$(OBJ) \
f16_eq_signaling$(OBJ) \ f16_eq_signaling$(OBJ) \
f16_le_quiet$(OBJ) \ f16_le_quiet$(OBJ) \
f16_lt_quiet$(OBJ) \ f16_lt_quiet$(OBJ) \
f16_isSignalingNaN$(OBJ) \ f16_isSignalingNaN$(OBJ) \
f32_to_ui32$(OBJ) \ f32_to_ui32$(OBJ) \
f32_to_ui64$(OBJ) \ f32_to_ui64$(OBJ) \
f32_to_i32$(OBJ) \ f32_to_i32$(OBJ) \
f32_to_i64$(OBJ) \ f32_to_i64$(OBJ) \
f32_to_ui32_r_minMag$(OBJ) \ f32_to_ui32_r_minMag$(OBJ) \
f32_to_ui64_r_minMag$(OBJ) \ f32_to_ui64_r_minMag$(OBJ) \
f32_to_i32_r_minMag$(OBJ) \ f32_to_i32_r_minMag$(OBJ) \
f32_to_i64_r_minMag$(OBJ) \ f32_to_i64_r_minMag$(OBJ) \
f32_to_f16$(OBJ) \ f32_to_f16$(OBJ) \
f32_to_f64$(OBJ) \ f32_to_f64$(OBJ) \
f32_to_extF80M$(OBJ) \ f32_to_extF80M$(OBJ) \
f32_to_f128M$(OBJ) \ f32_to_f128M$(OBJ) \
f32_roundToInt$(OBJ) \ f32_roundToInt$(OBJ) \
f32_add$(OBJ) \ f32_add$(OBJ) \
f32_sub$(OBJ) \ f32_sub$(OBJ) \
f32_mul$(OBJ) \ f32_mul$(OBJ) \
f32_mulAdd$(OBJ) \ f32_mulAdd$(OBJ) \
f32_div$(OBJ) \ f32_div$(OBJ) \
f32_rem$(OBJ) \ f32_rem$(OBJ) \
f32_sqrt$(OBJ) \ f32_sqrt$(OBJ) \
f32_eq$(OBJ) \ f32_eq$(OBJ) \
f32_le$(OBJ) \ f32_le$(OBJ) \
f32_lt$(OBJ) \ f32_lt$(OBJ) \
f32_eq_signaling$(OBJ) \ f32_eq_signaling$(OBJ) \
f32_le_quiet$(OBJ) \ f32_le_quiet$(OBJ) \
f32_lt_quiet$(OBJ) \ f32_lt_quiet$(OBJ) \
f32_isSignalingNaN$(OBJ) \ f32_isSignalingNaN$(OBJ) \
f64_to_ui32$(OBJ) \ f64_to_ui32$(OBJ) \
f64_to_ui64$(OBJ) \ f64_to_ui64$(OBJ) \
f64_to_i32$(OBJ) \ f64_to_i32$(OBJ) \
f64_to_i64$(OBJ) \ f64_to_i64$(OBJ) \
f64_to_ui32_r_minMag$(OBJ) \ f64_to_ui32_r_minMag$(OBJ) \
f64_to_ui64_r_minMag$(OBJ) \ f64_to_ui64_r_minMag$(OBJ) \
f64_to_i32_r_minMag$(OBJ) \ f64_to_i32_r_minMag$(OBJ) \
f64_to_i64_r_minMag$(OBJ) \ f64_to_i64_r_minMag$(OBJ) \
f64_to_f16$(OBJ) \ f64_to_f16$(OBJ) \
f64_to_f32$(OBJ) \ f64_to_f32$(OBJ) \
f64_to_extF80M$(OBJ) \ f64_to_extF80M$(OBJ) \
f64_to_f128M$(OBJ) \ f64_to_f128M$(OBJ) \
f64_roundToInt$(OBJ) \ f64_roundToInt$(OBJ) \
f64_add$(OBJ) \ f64_add$(OBJ) \
f64_sub$(OBJ) \ f64_sub$(OBJ) \
f64_mul$(OBJ) \ f64_mul$(OBJ) \
f64_mulAdd$(OBJ) \ f64_mulAdd$(OBJ) \
f64_div$(OBJ) \ f64_div$(OBJ) \
f64_rem$(OBJ) \ f64_rem$(OBJ) \
f64_sqrt$(OBJ) \ f64_sqrt$(OBJ) \
f64_eq$(OBJ) \ f64_eq$(OBJ) \
f64_le$(OBJ) \ f64_le$(OBJ) \
f64_lt$(OBJ) \ f64_lt$(OBJ) \
f64_eq_signaling$(OBJ) \ f64_eq_signaling$(OBJ) \
f64_le_quiet$(OBJ) \ f64_le_quiet$(OBJ) \
f64_lt_quiet$(OBJ) \ f64_lt_quiet$(OBJ) \
f64_isSignalingNaN$(OBJ) \ f64_isSignalingNaN$(OBJ) \
extF80M_to_ui32$(OBJ) \ extF80M_to_ui32$(OBJ) \
extF80M_to_ui64$(OBJ) \ extF80M_to_ui64$(OBJ) \
extF80M_to_i32$(OBJ) \ extF80M_to_i32$(OBJ) \
extF80M_to_i64$(OBJ) \ extF80M_to_i64$(OBJ) \
extF80M_to_ui32_r_minMag$(OBJ) \ extF80M_to_ui32_r_minMag$(OBJ) \
extF80M_to_ui64_r_minMag$(OBJ) \ extF80M_to_ui64_r_minMag$(OBJ) \
extF80M_to_i32_r_minMag$(OBJ) \ extF80M_to_i32_r_minMag$(OBJ) \
extF80M_to_i64_r_minMag$(OBJ) \ extF80M_to_i64_r_minMag$(OBJ) \
extF80M_to_f16$(OBJ) \ extF80M_to_f16$(OBJ) \
extF80M_to_f32$(OBJ) \ extF80M_to_f32$(OBJ) \
extF80M_to_f64$(OBJ) \ extF80M_to_f64$(OBJ) \
extF80M_to_f128M$(OBJ) \ extF80M_to_f128M$(OBJ) \
extF80M_roundToInt$(OBJ) \ extF80M_roundToInt$(OBJ) \
extF80M_add$(OBJ) \ extF80M_add$(OBJ) \
extF80M_sub$(OBJ) \ extF80M_sub$(OBJ) \
extF80M_mul$(OBJ) \ extF80M_mul$(OBJ) \
extF80M_div$(OBJ) \ extF80M_div$(OBJ) \
extF80M_rem$(OBJ) \ extF80M_rem$(OBJ) \
extF80M_sqrt$(OBJ) \ extF80M_sqrt$(OBJ) \
extF80M_eq$(OBJ) \ extF80M_eq$(OBJ) \
extF80M_le$(OBJ) \ extF80M_le$(OBJ) \
extF80M_lt$(OBJ) \ extF80M_lt$(OBJ) \
extF80M_eq_signaling$(OBJ) \ extF80M_eq_signaling$(OBJ) \
extF80M_le_quiet$(OBJ) \ extF80M_le_quiet$(OBJ) \
extF80M_lt_quiet$(OBJ) \ extF80M_lt_quiet$(OBJ) \
f128M_to_ui32$(OBJ) \ f128M_to_ui32$(OBJ) \
f128M_to_ui64$(OBJ) \ f128M_to_ui64$(OBJ) \
f128M_to_i32$(OBJ) \ f128M_to_i32$(OBJ) \
f128M_to_i64$(OBJ) \ f128M_to_i64$(OBJ) \
f128M_to_ui32_r_minMag$(OBJ) \ f128M_to_ui32_r_minMag$(OBJ) \
f128M_to_ui64_r_minMag$(OBJ) \ f128M_to_ui64_r_minMag$(OBJ) \
f128M_to_i32_r_minMag$(OBJ) \ f128M_to_i32_r_minMag$(OBJ) \
f128M_to_i64_r_minMag$(OBJ) \ f128M_to_i64_r_minMag$(OBJ) \
f128M_to_f16$(OBJ) \ f128M_to_f16$(OBJ) \
f128M_to_f32$(OBJ) \ f128M_to_f32$(OBJ) \
f128M_to_f64$(OBJ) \ f128M_to_f64$(OBJ) \
f128M_to_extF80M$(OBJ) \ f128M_to_extF80M$(OBJ) \
f128M_roundToInt$(OBJ) \ f128M_roundToInt$(OBJ) \
f128M_add$(OBJ) \ f128M_add$(OBJ) \
f128M_sub$(OBJ) \ f128M_sub$(OBJ) \
f128M_mul$(OBJ) \ f128M_mul$(OBJ) \
f128M_mulAdd$(OBJ) \ f128M_mulAdd$(OBJ) \
f128M_div$(OBJ) \ f128M_div$(OBJ) \
f128M_rem$(OBJ) \ f128M_rem$(OBJ) \
f128M_sqrt$(OBJ) \ f128M_sqrt$(OBJ) \
f128M_eq$(OBJ) \ f128M_eq$(OBJ) \
f128M_le$(OBJ) \ f128M_le$(OBJ) \
f128M_lt$(OBJ) \ f128M_lt$(OBJ) \
f128M_eq_signaling$(OBJ) \ f128M_eq_signaling$(OBJ) \
f128M_le_quiet$(OBJ) \ f128M_le_quiet$(OBJ) \
f128M_lt_quiet$(OBJ) \ f128M_lt_quiet$(OBJ) \
OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS) OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS)
$(OBJS_ALL): \ $(OBJS_ALL): \
$(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \ $(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \
$(SOURCE_DIR)/include/primitives.h $(SOURCE_DIR)/include/primitives.h
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \ $(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \ $(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \ $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
$(SOURCE_DIR)/include/softfloat.h $(SOURCE_DIR)/include/softfloat.h
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c $(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$*.c
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c $(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
softfloat$(LIB): $(OBJS_ALL) softfloat$(LIB): $(OBJS_ALL)
$(DELETE) $@ $(DELETE) $@
$(MAKELIB) $^ $(MAKELIB) $^
.PHONY: clean .PHONY: clean
clean: clean:
$(DELETE) $(OBJS_ALL) softfloat$(LIB) $(DELETE) $(OBJS_ALL) softfloat$(LIB)

View File

@ -1,52 +1,53 @@
/*============================================================================ /*============================================================================
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
University of California. All rights reserved. University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define LITTLEENDIAN 1 #define LITTLEENDIAN 1
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#ifdef __GNUC_STDC_INLINE__ #ifdef __GNUC_STDC_INLINE__
#define INLINE inline #define INLINE inline
#else #else
#define INLINE extern inline #define INLINE extern inline
#endif #endif
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define SOFTFLOAT_BUILTIN_CLZ 1 #define SOFTFLOAT_BUILTIN_CLZ 1
#include "opts-GCC.h" #include "opts-GCC.h"

View File

@ -1,323 +1,323 @@
#============================================================================= #=============================================================================
# #
# This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic # This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic
# Package, Release 3e, by John R. Hauser. # Package, Release 3e, by John R. Hauser.
# #
# Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the # Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
# University of California. All rights reserved. # University of California. All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met: # modification, are permitted provided that the following conditions are met:
# #
# 1. Redistributions of source code must retain the above copyright notice, # 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer. # this list of conditions, and the following disclaimer.
# #
# 2. Redistributions in binary form must reproduce the above copyright # 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in the # notice, this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution. # documentation and/or other materials provided with the distribution.
# #
# 3. Neither the name of the University nor the names of its contributors # 3. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software # may be used to endorse or promote products derived from this software
# without specific prior written permission. # without specific prior written permission.
# #
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# #
#============================================================================= #=============================================================================
SOURCE_DIR ?= ../../source SOURCE_DIR ?= ../../source
SPECIALIZE_TYPE ?= ARM-VFPv2 SPECIALIZE_TYPE ?= ARM-VFPv2
SOFTFLOAT_OPTS ?= -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 SOFTFLOAT_OPTS ?= -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5
DELETE = rm -f DELETE = rm -f
C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
COMPILE_C = \ COMPILE_C = \
gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \ gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \
$(C_INCLUDES) -O2 -o $@ $(C_INCLUDES) -O2 -o $@
MAKELIB = ar crs $@ MAKELIB = ar crs $@
OBJ = .o OBJ = .o
LIB = .a LIB = .a
OTHER_HEADERS = OTHER_HEADERS =
.PHONY: all .PHONY: all
all: softfloat$(LIB) all: softfloat$(LIB)
OBJS_PRIMITIVES = \ OBJS_PRIMITIVES = \
s_compare96M$(OBJ) \ s_compare96M$(OBJ) \
s_compare128M$(OBJ) \ s_compare128M$(OBJ) \
s_shortShiftLeft64To96M$(OBJ) \ s_shortShiftLeft64To96M$(OBJ) \
s_shortShiftLeftM$(OBJ) \ s_shortShiftLeftM$(OBJ) \
s_shiftLeftM$(OBJ) \ s_shiftLeftM$(OBJ) \
s_shortShiftRightM$(OBJ) \ s_shortShiftRightM$(OBJ) \
s_shortShiftRightJam64$(OBJ) \ s_shortShiftRightJam64$(OBJ) \
s_shortShiftRightJamM$(OBJ) \ s_shortShiftRightJamM$(OBJ) \
s_shiftRightJam32$(OBJ) \ s_shiftRightJam32$(OBJ) \
s_shiftRightJam64$(OBJ) \ s_shiftRightJam64$(OBJ) \
s_shiftRightJamM$(OBJ) \ s_shiftRightJamM$(OBJ) \
s_shiftRightM$(OBJ) \ s_shiftRightM$(OBJ) \
s_countLeadingZeros8$(OBJ) \ s_countLeadingZeros8$(OBJ) \
s_countLeadingZeros16$(OBJ) \ s_countLeadingZeros16$(OBJ) \
s_countLeadingZeros32$(OBJ) \ s_countLeadingZeros32$(OBJ) \
s_countLeadingZeros64$(OBJ) \ s_countLeadingZeros64$(OBJ) \
s_addM$(OBJ) \ s_addM$(OBJ) \
s_addCarryM$(OBJ) \ s_addCarryM$(OBJ) \
s_addComplCarryM$(OBJ) \ s_addComplCarryM$(OBJ) \
s_negXM$(OBJ) \ s_negXM$(OBJ) \
s_sub1XM$(OBJ) \ s_sub1XM$(OBJ) \
s_subM$(OBJ) \ s_subM$(OBJ) \
s_mul64To128M$(OBJ) \ s_mul64To128M$(OBJ) \
s_mul128MTo256M$(OBJ) \ s_mul128MTo256M$(OBJ) \
s_approxRecip_1Ks$(OBJ) \ s_approxRecip_1Ks$(OBJ) \
s_approxRecip32_1$(OBJ) \ s_approxRecip32_1$(OBJ) \
s_approxRecipSqrt_1Ks$(OBJ) \ s_approxRecipSqrt_1Ks$(OBJ) \
s_approxRecipSqrt32_1$(OBJ) \ s_approxRecipSqrt32_1$(OBJ) \
s_remStepMBy32$(OBJ) \ s_remStepMBy32$(OBJ) \
OBJS_SPECIALIZE = \ OBJS_SPECIALIZE = \
softfloat_raiseFlags$(OBJ) \ softfloat_raiseFlags$(OBJ) \
s_f16UIToCommonNaN$(OBJ) \ s_f16UIToCommonNaN$(OBJ) \
s_commonNaNToF16UI$(OBJ) \ s_commonNaNToF16UI$(OBJ) \
s_propagateNaNF16UI$(OBJ) \ s_propagateNaNF16UI$(OBJ) \
s_f32UIToCommonNaN$(OBJ) \ s_f32UIToCommonNaN$(OBJ) \
s_commonNaNToF32UI$(OBJ) \ s_commonNaNToF32UI$(OBJ) \
s_propagateNaNF32UI$(OBJ) \ s_propagateNaNF32UI$(OBJ) \
s_f64UIToCommonNaN$(OBJ) \ s_f64UIToCommonNaN$(OBJ) \
s_commonNaNToF64UI$(OBJ) \ s_commonNaNToF64UI$(OBJ) \
s_propagateNaNF64UI$(OBJ) \ s_propagateNaNF64UI$(OBJ) \
extF80M_isSignalingNaN$(OBJ) \ extF80M_isSignalingNaN$(OBJ) \
s_extF80MToCommonNaN$(OBJ) \ s_extF80MToCommonNaN$(OBJ) \
s_commonNaNToExtF80M$(OBJ) \ s_commonNaNToExtF80M$(OBJ) \
s_propagateNaNExtF80M$(OBJ) \ s_propagateNaNExtF80M$(OBJ) \
f128M_isSignalingNaN$(OBJ) \ f128M_isSignalingNaN$(OBJ) \
s_f128MToCommonNaN$(OBJ) \ s_f128MToCommonNaN$(OBJ) \
s_commonNaNToF128M$(OBJ) \ s_commonNaNToF128M$(OBJ) \
s_propagateNaNF128M$(OBJ) \ s_propagateNaNF128M$(OBJ) \
OBJS_OTHERS = \ OBJS_OTHERS = \
s_roundToUI32$(OBJ) \ s_roundToUI32$(OBJ) \
s_roundMToUI64$(OBJ) \ s_roundMToUI64$(OBJ) \
s_roundToI32$(OBJ) \ s_roundToI32$(OBJ) \
s_roundMToI64$(OBJ) \ s_roundMToI64$(OBJ) \
s_normSubnormalF16Sig$(OBJ) \ s_normSubnormalF16Sig$(OBJ) \
s_roundPackToF16$(OBJ) \ s_roundPackToF16$(OBJ) \
s_normRoundPackToF16$(OBJ) \ s_normRoundPackToF16$(OBJ) \
s_addMagsF16$(OBJ) \ s_addMagsF16$(OBJ) \
s_subMagsF16$(OBJ) \ s_subMagsF16$(OBJ) \
s_mulAddF16$(OBJ) \ s_mulAddF16$(OBJ) \
s_normSubnormalF32Sig$(OBJ) \ s_normSubnormalF32Sig$(OBJ) \
s_roundPackToF32$(OBJ) \ s_roundPackToF32$(OBJ) \
s_normRoundPackToF32$(OBJ) \ s_normRoundPackToF32$(OBJ) \
s_addMagsF32$(OBJ) \ s_addMagsF32$(OBJ) \
s_subMagsF32$(OBJ) \ s_subMagsF32$(OBJ) \
s_mulAddF32$(OBJ) \ s_mulAddF32$(OBJ) \
s_normSubnormalF64Sig$(OBJ) \ s_normSubnormalF64Sig$(OBJ) \
s_roundPackToF64$(OBJ) \ s_roundPackToF64$(OBJ) \
s_normRoundPackToF64$(OBJ) \ s_normRoundPackToF64$(OBJ) \
s_addMagsF64$(OBJ) \ s_addMagsF64$(OBJ) \
s_subMagsF64$(OBJ) \ s_subMagsF64$(OBJ) \
s_mulAddF64$(OBJ) \ s_mulAddF64$(OBJ) \
s_tryPropagateNaNExtF80M$(OBJ) \ s_tryPropagateNaNExtF80M$(OBJ) \
s_invalidExtF80M$(OBJ) \ s_invalidExtF80M$(OBJ) \
s_normExtF80SigM$(OBJ) \ s_normExtF80SigM$(OBJ) \
s_roundPackMToExtF80M$(OBJ) \ s_roundPackMToExtF80M$(OBJ) \
s_normRoundPackMToExtF80M$(OBJ) \ s_normRoundPackMToExtF80M$(OBJ) \
s_addExtF80M$(OBJ) \ s_addExtF80M$(OBJ) \
s_compareNonnormExtF80M$(OBJ) \ s_compareNonnormExtF80M$(OBJ) \
s_isNaNF128M$(OBJ) \ s_isNaNF128M$(OBJ) \
s_tryPropagateNaNF128M$(OBJ) \ s_tryPropagateNaNF128M$(OBJ) \
s_invalidF128M$(OBJ) \ s_invalidF128M$(OBJ) \
s_shiftNormSigF128M$(OBJ) \ s_shiftNormSigF128M$(OBJ) \
s_roundPackMToF128M$(OBJ) \ s_roundPackMToF128M$(OBJ) \
s_normRoundPackMToF128M$(OBJ) \ s_normRoundPackMToF128M$(OBJ) \
s_addF128M$(OBJ) \ s_addF128M$(OBJ) \
s_mulAddF128M$(OBJ) \ s_mulAddF128M$(OBJ) \
softfloat_state$(OBJ) \ softfloat_state$(OBJ) \
ui32_to_f16$(OBJ) \ ui32_to_f16$(OBJ) \
ui32_to_f32$(OBJ) \ ui32_to_f32$(OBJ) \
ui32_to_f64$(OBJ) \ ui32_to_f64$(OBJ) \
ui32_to_extF80M$(OBJ) \ ui32_to_extF80M$(OBJ) \
ui32_to_f128M$(OBJ) \ ui32_to_f128M$(OBJ) \
ui64_to_f16$(OBJ) \ ui64_to_f16$(OBJ) \
ui64_to_f32$(OBJ) \ ui64_to_f32$(OBJ) \
ui64_to_f64$(OBJ) \ ui64_to_f64$(OBJ) \
ui64_to_extF80M$(OBJ) \ ui64_to_extF80M$(OBJ) \
ui64_to_f128M$(OBJ) \ ui64_to_f128M$(OBJ) \
i32_to_f16$(OBJ) \ i32_to_f16$(OBJ) \
i32_to_f32$(OBJ) \ i32_to_f32$(OBJ) \
i32_to_f64$(OBJ) \ i32_to_f64$(OBJ) \
i32_to_extF80M$(OBJ) \ i32_to_extF80M$(OBJ) \
i32_to_f128M$(OBJ) \ i32_to_f128M$(OBJ) \
i64_to_f16$(OBJ) \ i64_to_f16$(OBJ) \
i64_to_f32$(OBJ) \ i64_to_f32$(OBJ) \
i64_to_f64$(OBJ) \ i64_to_f64$(OBJ) \
i64_to_extF80M$(OBJ) \ i64_to_extF80M$(OBJ) \
i64_to_f128M$(OBJ) \ i64_to_f128M$(OBJ) \
f16_to_ui32$(OBJ) \ f16_to_ui32$(OBJ) \
f16_to_ui64$(OBJ) \ f16_to_ui64$(OBJ) \
f16_to_i32$(OBJ) \ f16_to_i32$(OBJ) \
f16_to_i64$(OBJ) \ f16_to_i64$(OBJ) \
f16_to_ui32_r_minMag$(OBJ) \ f16_to_ui32_r_minMag$(OBJ) \
f16_to_ui64_r_minMag$(OBJ) \ f16_to_ui64_r_minMag$(OBJ) \
f16_to_i32_r_minMag$(OBJ) \ f16_to_i32_r_minMag$(OBJ) \
f16_to_i64_r_minMag$(OBJ) \ f16_to_i64_r_minMag$(OBJ) \
f16_to_f32$(OBJ) \ f16_to_f32$(OBJ) \
f16_to_f64$(OBJ) \ f16_to_f64$(OBJ) \
f16_to_extF80M$(OBJ) \ f16_to_extF80M$(OBJ) \
f16_to_f128M$(OBJ) \ f16_to_f128M$(OBJ) \
f16_roundToInt$(OBJ) \ f16_roundToInt$(OBJ) \
f16_add$(OBJ) \ f16_add$(OBJ) \
f16_sub$(OBJ) \ f16_sub$(OBJ) \
f16_mul$(OBJ) \ f16_mul$(OBJ) \
f16_mulAdd$(OBJ) \ f16_mulAdd$(OBJ) \
f16_div$(OBJ) \ f16_div$(OBJ) \
f16_rem$(OBJ) \ f16_rem$(OBJ) \
f16_sqrt$(OBJ) \ f16_sqrt$(OBJ) \
f16_eq$(OBJ) \ f16_eq$(OBJ) \
f16_le$(OBJ) \ f16_le$(OBJ) \
f16_lt$(OBJ) \ f16_lt$(OBJ) \
f16_eq_signaling$(OBJ) \ f16_eq_signaling$(OBJ) \
f16_le_quiet$(OBJ) \ f16_le_quiet$(OBJ) \
f16_lt_quiet$(OBJ) \ f16_lt_quiet$(OBJ) \
f16_isSignalingNaN$(OBJ) \ f16_isSignalingNaN$(OBJ) \
f32_to_ui32$(OBJ) \ f32_to_ui32$(OBJ) \
f32_to_ui64$(OBJ) \ f32_to_ui64$(OBJ) \
f32_to_i32$(OBJ) \ f32_to_i32$(OBJ) \
f32_to_i64$(OBJ) \ f32_to_i64$(OBJ) \
f32_to_ui32_r_minMag$(OBJ) \ f32_to_ui32_r_minMag$(OBJ) \
f32_to_ui64_r_minMag$(OBJ) \ f32_to_ui64_r_minMag$(OBJ) \
f32_to_i32_r_minMag$(OBJ) \ f32_to_i32_r_minMag$(OBJ) \
f32_to_i64_r_minMag$(OBJ) \ f32_to_i64_r_minMag$(OBJ) \
f32_to_f16$(OBJ) \ f32_to_f16$(OBJ) \
f32_to_f64$(OBJ) \ f32_to_f64$(OBJ) \
f32_to_extF80M$(OBJ) \ f32_to_extF80M$(OBJ) \
f32_to_f128M$(OBJ) \ f32_to_f128M$(OBJ) \
f32_roundToInt$(OBJ) \ f32_roundToInt$(OBJ) \
f32_add$(OBJ) \ f32_add$(OBJ) \
f32_sub$(OBJ) \ f32_sub$(OBJ) \
f32_mul$(OBJ) \ f32_mul$(OBJ) \
f32_mulAdd$(OBJ) \ f32_mulAdd$(OBJ) \
f32_div$(OBJ) \ f32_div$(OBJ) \
f32_rem$(OBJ) \ f32_rem$(OBJ) \
f32_sqrt$(OBJ) \ f32_sqrt$(OBJ) \
f32_eq$(OBJ) \ f32_eq$(OBJ) \
f32_le$(OBJ) \ f32_le$(OBJ) \
f32_lt$(OBJ) \ f32_lt$(OBJ) \
f32_eq_signaling$(OBJ) \ f32_eq_signaling$(OBJ) \
f32_le_quiet$(OBJ) \ f32_le_quiet$(OBJ) \
f32_lt_quiet$(OBJ) \ f32_lt_quiet$(OBJ) \
f32_isSignalingNaN$(OBJ) \ f32_isSignalingNaN$(OBJ) \
f64_to_ui32$(OBJ) \ f64_to_ui32$(OBJ) \
f64_to_ui64$(OBJ) \ f64_to_ui64$(OBJ) \
f64_to_i32$(OBJ) \ f64_to_i32$(OBJ) \
f64_to_i64$(OBJ) \ f64_to_i64$(OBJ) \
f64_to_ui32_r_minMag$(OBJ) \ f64_to_ui32_r_minMag$(OBJ) \
f64_to_ui64_r_minMag$(OBJ) \ f64_to_ui64_r_minMag$(OBJ) \
f64_to_i32_r_minMag$(OBJ) \ f64_to_i32_r_minMag$(OBJ) \
f64_to_i64_r_minMag$(OBJ) \ f64_to_i64_r_minMag$(OBJ) \
f64_to_f16$(OBJ) \ f64_to_f16$(OBJ) \
f64_to_f32$(OBJ) \ f64_to_f32$(OBJ) \
f64_to_extF80M$(OBJ) \ f64_to_extF80M$(OBJ) \
f64_to_f128M$(OBJ) \ f64_to_f128M$(OBJ) \
f64_roundToInt$(OBJ) \ f64_roundToInt$(OBJ) \
f64_add$(OBJ) \ f64_add$(OBJ) \
f64_sub$(OBJ) \ f64_sub$(OBJ) \
f64_mul$(OBJ) \ f64_mul$(OBJ) \
f64_mulAdd$(OBJ) \ f64_mulAdd$(OBJ) \
f64_div$(OBJ) \ f64_div$(OBJ) \
f64_rem$(OBJ) \ f64_rem$(OBJ) \
f64_sqrt$(OBJ) \ f64_sqrt$(OBJ) \
f64_eq$(OBJ) \ f64_eq$(OBJ) \
f64_le$(OBJ) \ f64_le$(OBJ) \
f64_lt$(OBJ) \ f64_lt$(OBJ) \
f64_eq_signaling$(OBJ) \ f64_eq_signaling$(OBJ) \
f64_le_quiet$(OBJ) \ f64_le_quiet$(OBJ) \
f64_lt_quiet$(OBJ) \ f64_lt_quiet$(OBJ) \
f64_isSignalingNaN$(OBJ) \ f64_isSignalingNaN$(OBJ) \
extF80M_to_ui32$(OBJ) \ extF80M_to_ui32$(OBJ) \
extF80M_to_ui64$(OBJ) \ extF80M_to_ui64$(OBJ) \
extF80M_to_i32$(OBJ) \ extF80M_to_i32$(OBJ) \
extF80M_to_i64$(OBJ) \ extF80M_to_i64$(OBJ) \
extF80M_to_ui32_r_minMag$(OBJ) \ extF80M_to_ui32_r_minMag$(OBJ) \
extF80M_to_ui64_r_minMag$(OBJ) \ extF80M_to_ui64_r_minMag$(OBJ) \
extF80M_to_i32_r_minMag$(OBJ) \ extF80M_to_i32_r_minMag$(OBJ) \
extF80M_to_i64_r_minMag$(OBJ) \ extF80M_to_i64_r_minMag$(OBJ) \
extF80M_to_f16$(OBJ) \ extF80M_to_f16$(OBJ) \
extF80M_to_f32$(OBJ) \ extF80M_to_f32$(OBJ) \
extF80M_to_f64$(OBJ) \ extF80M_to_f64$(OBJ) \
extF80M_to_f128M$(OBJ) \ extF80M_to_f128M$(OBJ) \
extF80M_roundToInt$(OBJ) \ extF80M_roundToInt$(OBJ) \
extF80M_add$(OBJ) \ extF80M_add$(OBJ) \
extF80M_sub$(OBJ) \ extF80M_sub$(OBJ) \
extF80M_mul$(OBJ) \ extF80M_mul$(OBJ) \
extF80M_div$(OBJ) \ extF80M_div$(OBJ) \
extF80M_rem$(OBJ) \ extF80M_rem$(OBJ) \
extF80M_sqrt$(OBJ) \ extF80M_sqrt$(OBJ) \
extF80M_eq$(OBJ) \ extF80M_eq$(OBJ) \
extF80M_le$(OBJ) \ extF80M_le$(OBJ) \
extF80M_lt$(OBJ) \ extF80M_lt$(OBJ) \
extF80M_eq_signaling$(OBJ) \ extF80M_eq_signaling$(OBJ) \
extF80M_le_quiet$(OBJ) \ extF80M_le_quiet$(OBJ) \
extF80M_lt_quiet$(OBJ) \ extF80M_lt_quiet$(OBJ) \
f128M_to_ui32$(OBJ) \ f128M_to_ui32$(OBJ) \
f128M_to_ui64$(OBJ) \ f128M_to_ui64$(OBJ) \
f128M_to_i32$(OBJ) \ f128M_to_i32$(OBJ) \
f128M_to_i64$(OBJ) \ f128M_to_i64$(OBJ) \
f128M_to_ui32_r_minMag$(OBJ) \ f128M_to_ui32_r_minMag$(OBJ) \
f128M_to_ui64_r_minMag$(OBJ) \ f128M_to_ui64_r_minMag$(OBJ) \
f128M_to_i32_r_minMag$(OBJ) \ f128M_to_i32_r_minMag$(OBJ) \
f128M_to_i64_r_minMag$(OBJ) \ f128M_to_i64_r_minMag$(OBJ) \
f128M_to_f16$(OBJ) \ f128M_to_f16$(OBJ) \
f128M_to_f32$(OBJ) \ f128M_to_f32$(OBJ) \
f128M_to_f64$(OBJ) \ f128M_to_f64$(OBJ) \
f128M_to_extF80M$(OBJ) \ f128M_to_extF80M$(OBJ) \
f128M_roundToInt$(OBJ) \ f128M_roundToInt$(OBJ) \
f128M_add$(OBJ) \ f128M_add$(OBJ) \
f128M_sub$(OBJ) \ f128M_sub$(OBJ) \
f128M_mul$(OBJ) \ f128M_mul$(OBJ) \
f128M_mulAdd$(OBJ) \ f128M_mulAdd$(OBJ) \
f128M_div$(OBJ) \ f128M_div$(OBJ) \
f128M_rem$(OBJ) \ f128M_rem$(OBJ) \
f128M_sqrt$(OBJ) \ f128M_sqrt$(OBJ) \
f128M_eq$(OBJ) \ f128M_eq$(OBJ) \
f128M_le$(OBJ) \ f128M_le$(OBJ) \
f128M_lt$(OBJ) \ f128M_lt$(OBJ) \
f128M_eq_signaling$(OBJ) \ f128M_eq_signaling$(OBJ) \
f128M_le_quiet$(OBJ) \ f128M_le_quiet$(OBJ) \
f128M_lt_quiet$(OBJ) \ f128M_lt_quiet$(OBJ) \
OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS) OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS)
$(OBJS_ALL): \ $(OBJS_ALL): \
$(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \ $(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \
$(SOURCE_DIR)/include/primitives.h $(SOURCE_DIR)/include/primitives.h
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \ $(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \ $(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \ $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
$(SOURCE_DIR)/include/softfloat.h $(SOURCE_DIR)/include/softfloat.h
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c $(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$*.c
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c $(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
softfloat$(LIB): $(OBJS_ALL) softfloat$(LIB): $(OBJS_ALL)
$(DELETE) $@ $(DELETE) $@
$(MAKELIB) $^ $(MAKELIB) $^
.PHONY: clean .PHONY: clean
clean: clean:
$(DELETE) $(OBJS_ALL) softfloat$(LIB) $(DELETE) $(OBJS_ALL) softfloat$(LIB)

View File

@ -1,52 +1,53 @@
/*============================================================================ /*============================================================================
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
University of California. All rights reserved. University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define LITTLEENDIAN 1 #define LITTLEENDIAN 1
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#ifdef __GNUC_STDC_INLINE__ #ifdef __GNUC_STDC_INLINE__
#define INLINE inline #define INLINE inline
#else #else
#define INLINE extern inline #define INLINE extern inline
#endif #endif
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define SOFTFLOAT_BUILTIN_CLZ 1 #define SOFTFLOAT_BUILTIN_CLZ 1
#include "opts-GCC.h" #include "opts-GCC.h"

View File

@ -0,0 +1,399 @@
#=============================================================================
#
# This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic
# Package, Release 3e, by John R. Hauser.
#
# Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
# University of California. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
#=============================================================================
SOURCE_DIR ?= ../../source
SPECIALIZE_TYPE ?= RISCV
MARCH ?= rv64gcv_zfh_zfhmin
MABI ?= lp64d
SOFTFLOAT_OPTS ?= \
-DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
-DSOFTFLOAT_FAST_DIV64TO32
DELETE = rm -f
C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
COMPILE_C = \
riscv64-unknown-linux-gnu-gcc -c -march=$(MARCH) -mabi=$(MABI) -Werror-implicit-function-declaration -DSOFTFLOAT_FAST_INT64 \
$(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@
MAKELIB = ar crs $@
OBJ = .o
LIB = .a
OTHER_HEADERS = $(SOURCE_DIR)/include/opts-GCC.h
.PHONY: all
all: softfloat$(LIB)
OBJS_PRIMITIVES = \
s_eq128$(OBJ) \
s_le128$(OBJ) \
s_lt128$(OBJ) \
s_shortShiftLeft128$(OBJ) \
s_shortShiftRight128$(OBJ) \
s_shortShiftRightJam64$(OBJ) \
s_shortShiftRightJam64Extra$(OBJ) \
s_shortShiftRightJam128$(OBJ) \
s_shortShiftRightJam128Extra$(OBJ) \
s_shiftRightJam32$(OBJ) \
s_shiftRightJam64$(OBJ) \
s_shiftRightJam64Extra$(OBJ) \
s_shiftRightJam128$(OBJ) \
s_shiftRightJam128Extra$(OBJ) \
s_shiftRightJam256M$(OBJ) \
s_countLeadingZeros8$(OBJ) \
s_countLeadingZeros16$(OBJ) \
s_countLeadingZeros32$(OBJ) \
s_countLeadingZeros64$(OBJ) \
s_add128$(OBJ) \
s_add256M$(OBJ) \
s_sub128$(OBJ) \
s_sub256M$(OBJ) \
s_mul64ByShifted32To128$(OBJ) \
s_mul64To128$(OBJ) \
s_mul128By32$(OBJ) \
s_mul128To256M$(OBJ) \
s_approxRecip_1Ks$(OBJ) \
s_approxRecip32_1$(OBJ) \
s_approxRecipSqrt_1Ks$(OBJ) \
s_approxRecipSqrt32_1$(OBJ) \
OBJS_SPECIALIZE = \
softfloat_raiseFlags$(OBJ) \
s_f16UIToCommonNaN$(OBJ) \
s_commonNaNToF16UI$(OBJ) \
s_propagateNaNF16UI$(OBJ) \
s_bf16UIToCommonNaN$(OBJ) \
s_commonNaNToBF16UI$(OBJ) \
s_f32UIToCommonNaN$(OBJ) \
s_commonNaNToF32UI$(OBJ) \
s_propagateNaNF32UI$(OBJ) \
s_f64UIToCommonNaN$(OBJ) \
s_commonNaNToF64UI$(OBJ) \
s_propagateNaNF64UI$(OBJ) \
extF80M_isSignalingNaN$(OBJ) \
s_extF80UIToCommonNaN$(OBJ) \
s_commonNaNToExtF80UI$(OBJ) \
s_propagateNaNExtF80UI$(OBJ) \
f128M_isSignalingNaN$(OBJ) \
s_f128UIToCommonNaN$(OBJ) \
s_commonNaNToF128UI$(OBJ) \
s_propagateNaNF128UI$(OBJ) \
OBJS_OTHERS = \
s_roundToUI32$(OBJ) \
s_roundToUI64$(OBJ) \
s_roundToI32$(OBJ) \
s_roundToI64$(OBJ) \
s_normSubnormalBF16Sig$(OBJ) \
s_roundPackToBF16$(OBJ) \
s_normSubnormalF16Sig$(OBJ) \
s_roundPackToF16$(OBJ) \
s_normRoundPackToF16$(OBJ) \
s_addMagsF16$(OBJ) \
s_subMagsF16$(OBJ) \
s_mulAddF16$(OBJ) \
s_normSubnormalF32Sig$(OBJ) \
s_roundPackToF32$(OBJ) \
s_normRoundPackToF32$(OBJ) \
s_addMagsF32$(OBJ) \
s_subMagsF32$(OBJ) \
s_mulAddF32$(OBJ) \
s_normSubnormalF64Sig$(OBJ) \
s_roundPackToF64$(OBJ) \
s_normRoundPackToF64$(OBJ) \
s_addMagsF64$(OBJ) \
s_subMagsF64$(OBJ) \
s_mulAddF64$(OBJ) \
s_normSubnormalExtF80Sig$(OBJ) \
s_roundPackToExtF80$(OBJ) \
s_normRoundPackToExtF80$(OBJ) \
s_addMagsExtF80$(OBJ) \
s_subMagsExtF80$(OBJ) \
s_normSubnormalF128Sig$(OBJ) \
s_roundPackToF128$(OBJ) \
s_normRoundPackToF128$(OBJ) \
s_addMagsF128$(OBJ) \
s_subMagsF128$(OBJ) \
s_mulAddF128$(OBJ) \
softfloat_state$(OBJ) \
ui32_to_f16$(OBJ) \
ui32_to_f32$(OBJ) \
ui32_to_f64$(OBJ) \
ui32_to_extF80$(OBJ) \
ui32_to_extF80M$(OBJ) \
ui32_to_f128$(OBJ) \
ui32_to_f128M$(OBJ) \
ui64_to_f16$(OBJ) \
ui64_to_f32$(OBJ) \
ui64_to_f64$(OBJ) \
ui64_to_extF80$(OBJ) \
ui64_to_extF80M$(OBJ) \
ui64_to_f128$(OBJ) \
ui64_to_f128M$(OBJ) \
i32_to_f16$(OBJ) \
i32_to_f32$(OBJ) \
i32_to_f64$(OBJ) \
i32_to_extF80$(OBJ) \
i32_to_extF80M$(OBJ) \
i32_to_f128$(OBJ) \
i32_to_f128M$(OBJ) \
i64_to_f16$(OBJ) \
i64_to_f32$(OBJ) \
i64_to_f64$(OBJ) \
i64_to_extF80$(OBJ) \
i64_to_extF80M$(OBJ) \
i64_to_f128$(OBJ) \
i64_to_f128M$(OBJ) \
bf16_isSignalingNaN$(OBJ) \
bf16_to_f32$(OBJ) \
f16_to_ui32$(OBJ) \
f16_to_ui64$(OBJ) \
f16_to_i32$(OBJ) \
f16_to_i64$(OBJ) \
f16_to_ui32_r_minMag$(OBJ) \
f16_to_ui64_r_minMag$(OBJ) \
f16_to_i32_r_minMag$(OBJ) \
f16_to_i64_r_minMag$(OBJ) \
f16_to_f32$(OBJ) \
f16_to_f64$(OBJ) \
f16_to_extF80$(OBJ) \
f16_to_extF80M$(OBJ) \
f16_to_f128$(OBJ) \
f16_to_f128M$(OBJ) \
f16_roundToInt$(OBJ) \
f16_add$(OBJ) \
f16_sub$(OBJ) \
f16_mul$(OBJ) \
f16_mulAdd$(OBJ) \
f16_div$(OBJ) \
f16_rem$(OBJ) \
f16_sqrt$(OBJ) \
f16_eq$(OBJ) \
f16_le$(OBJ) \
f16_lt$(OBJ) \
f16_eq_signaling$(OBJ) \
f16_le_quiet$(OBJ) \
f16_lt_quiet$(OBJ) \
f16_isSignalingNaN$(OBJ) \
f32_to_ui32$(OBJ) \
f32_to_ui64$(OBJ) \
f32_to_i32$(OBJ) \
f32_to_i64$(OBJ) \
f32_to_ui32_r_minMag$(OBJ) \
f32_to_ui64_r_minMag$(OBJ) \
f32_to_i32_r_minMag$(OBJ) \
f32_to_i64_r_minMag$(OBJ) \
f32_to_bf16$(OBJ) \
f32_to_f16$(OBJ) \
f32_to_f64$(OBJ) \
f32_to_extF80$(OBJ) \
f32_to_extF80M$(OBJ) \
f32_to_f128$(OBJ) \
f32_to_f128M$(OBJ) \
f32_roundToInt$(OBJ) \
f32_add$(OBJ) \
f32_sub$(OBJ) \
f32_mul$(OBJ) \
f32_mulAdd$(OBJ) \
f32_div$(OBJ) \
f32_rem$(OBJ) \
f32_sqrt$(OBJ) \
f32_eq$(OBJ) \
f32_le$(OBJ) \
f32_lt$(OBJ) \
f32_eq_signaling$(OBJ) \
f32_le_quiet$(OBJ) \
f32_lt_quiet$(OBJ) \
f32_isSignalingNaN$(OBJ) \
f64_to_ui32$(OBJ) \
f64_to_ui64$(OBJ) \
f64_to_i32$(OBJ) \
f64_to_i64$(OBJ) \
f64_to_ui32_r_minMag$(OBJ) \
f64_to_ui64_r_minMag$(OBJ) \
f64_to_i32_r_minMag$(OBJ) \
f64_to_i64_r_minMag$(OBJ) \
f64_to_f16$(OBJ) \
f64_to_f32$(OBJ) \
f64_to_extF80$(OBJ) \
f64_to_extF80M$(OBJ) \
f64_to_f128$(OBJ) \
f64_to_f128M$(OBJ) \
f64_roundToInt$(OBJ) \
f64_add$(OBJ) \
f64_sub$(OBJ) \
f64_mul$(OBJ) \
f64_mulAdd$(OBJ) \
f64_div$(OBJ) \
f64_rem$(OBJ) \
f64_sqrt$(OBJ) \
f64_eq$(OBJ) \
f64_le$(OBJ) \
f64_lt$(OBJ) \
f64_eq_signaling$(OBJ) \
f64_le_quiet$(OBJ) \
f64_lt_quiet$(OBJ) \
f64_isSignalingNaN$(OBJ) \
extF80_to_ui32$(OBJ) \
extF80_to_ui64$(OBJ) \
extF80_to_i32$(OBJ) \
extF80_to_i64$(OBJ) \
extF80_to_ui32_r_minMag$(OBJ) \
extF80_to_ui64_r_minMag$(OBJ) \
extF80_to_i32_r_minMag$(OBJ) \
extF80_to_i64_r_minMag$(OBJ) \
extF80_to_f16$(OBJ) \
extF80_to_f32$(OBJ) \
extF80_to_f64$(OBJ) \
extF80_to_f128$(OBJ) \
extF80_roundToInt$(OBJ) \
extF80_add$(OBJ) \
extF80_sub$(OBJ) \
extF80_mul$(OBJ) \
extF80_div$(OBJ) \
extF80_rem$(OBJ) \
extF80_sqrt$(OBJ) \
extF80_eq$(OBJ) \
extF80_le$(OBJ) \
extF80_lt$(OBJ) \
extF80_eq_signaling$(OBJ) \
extF80_le_quiet$(OBJ) \
extF80_lt_quiet$(OBJ) \
extF80_isSignalingNaN$(OBJ) \
extF80M_to_ui32$(OBJ) \
extF80M_to_ui64$(OBJ) \
extF80M_to_i32$(OBJ) \
extF80M_to_i64$(OBJ) \
extF80M_to_ui32_r_minMag$(OBJ) \
extF80M_to_ui64_r_minMag$(OBJ) \
extF80M_to_i32_r_minMag$(OBJ) \
extF80M_to_i64_r_minMag$(OBJ) \
extF80M_to_f16$(OBJ) \
extF80M_to_f32$(OBJ) \
extF80M_to_f64$(OBJ) \
extF80M_to_f128M$(OBJ) \
extF80M_roundToInt$(OBJ) \
extF80M_add$(OBJ) \
extF80M_sub$(OBJ) \
extF80M_mul$(OBJ) \
extF80M_div$(OBJ) \
extF80M_rem$(OBJ) \
extF80M_sqrt$(OBJ) \
extF80M_eq$(OBJ) \
extF80M_le$(OBJ) \
extF80M_lt$(OBJ) \
extF80M_eq_signaling$(OBJ) \
extF80M_le_quiet$(OBJ) \
extF80M_lt_quiet$(OBJ) \
f128_to_ui32$(OBJ) \
f128_to_ui64$(OBJ) \
f128_to_i32$(OBJ) \
f128_to_i64$(OBJ) \
f128_to_ui32_r_minMag$(OBJ) \
f128_to_ui64_r_minMag$(OBJ) \
f128_to_i32_r_minMag$(OBJ) \
f128_to_i64_r_minMag$(OBJ) \
f128_to_f16$(OBJ) \
f128_to_f32$(OBJ) \
f128_to_extF80$(OBJ) \
f128_to_f64$(OBJ) \
f128_roundToInt$(OBJ) \
f128_add$(OBJ) \
f128_sub$(OBJ) \
f128_mul$(OBJ) \
f128_mulAdd$(OBJ) \
f128_div$(OBJ) \
f128_rem$(OBJ) \
f128_sqrt$(OBJ) \
f128_eq$(OBJ) \
f128_le$(OBJ) \
f128_lt$(OBJ) \
f128_eq_signaling$(OBJ) \
f128_le_quiet$(OBJ) \
f128_lt_quiet$(OBJ) \
f128_isSignalingNaN$(OBJ) \
f128M_to_ui32$(OBJ) \
f128M_to_ui64$(OBJ) \
f128M_to_i32$(OBJ) \
f128M_to_i64$(OBJ) \
f128M_to_ui32_r_minMag$(OBJ) \
f128M_to_ui64_r_minMag$(OBJ) \
f128M_to_i32_r_minMag$(OBJ) \
f128M_to_i64_r_minMag$(OBJ) \
f128M_to_f16$(OBJ) \
f128M_to_f32$(OBJ) \
f128M_to_extF80M$(OBJ) \
f128M_to_f64$(OBJ) \
f128M_roundToInt$(OBJ) \
f128M_add$(OBJ) \
f128M_sub$(OBJ) \
f128M_mul$(OBJ) \
f128M_mulAdd$(OBJ) \
f128M_div$(OBJ) \
f128M_rem$(OBJ) \
f128M_sqrt$(OBJ) \
f128M_eq$(OBJ) \
f128M_le$(OBJ) \
f128M_lt$(OBJ) \
f128M_eq_signaling$(OBJ) \
f128M_le_quiet$(OBJ) \
f128M_lt_quiet$(OBJ) \
OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS)
$(OBJS_ALL): \
$(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \
$(SOURCE_DIR)/include/primitives.h
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
$(SOURCE_DIR)/include/softfloat.h
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$*.c
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
softfloat$(LIB): $(OBJS_ALL)
$(DELETE) $@
$(MAKELIB) $^
.PHONY: clean
clean:
$(DELETE) $(OBJS_ALL) softfloat$(LIB)

View File

@ -0,0 +1,54 @@
/*============================================================================
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/
/*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/
#define LITTLEENDIAN 1
/*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/
#ifdef __GNUC_STDC_INLINE__
#define INLINE inline
#else
#define INLINE extern inline
#endif
/*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/
#define SOFTFLOAT_BUILTIN_CLZ 1
#define SOFTFLOAT_INTRINSIC_INT128 1
#include "opts-GCC.h"

View File

@ -1,390 +1,397 @@
#============================================================================= #=============================================================================
# #
# This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic # This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic
# Package, Release 3e, by John R. Hauser. # Package, Release 3e, by John R. Hauser.
# #
# Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the # Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
# University of California. All rights reserved. # University of California. All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met: # modification, are permitted provided that the following conditions are met:
# #
# 1. Redistributions of source code must retain the above copyright notice, # 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer. # this list of conditions, and the following disclaimer.
# #
# 2. Redistributions in binary form must reproduce the above copyright # 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in the # notice, this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution. # documentation and/or other materials provided with the distribution.
# #
# 3. Neither the name of the University nor the names of its contributors # 3. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software # may be used to endorse or promote products derived from this software
# without specific prior written permission. # without specific prior written permission.
# #
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# #
#============================================================================= #=============================================================================
SOURCE_DIR ?= ../../source SOURCE_DIR ?= ../../source
SPECIALIZE_TYPE ?= 8086-SSE SPECIALIZE_TYPE ?= 8086-SSE
SOFTFLOAT_OPTS ?= \ SOFTFLOAT_OPTS ?= \
-DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \ -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
-DSOFTFLOAT_FAST_DIV64TO32 -DSOFTFLOAT_FAST_DIV64TO32
DELETE = rm -f DELETE = rm -f
C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
COMPILE_C = \ COMPILE_C = \
gcc -c -Werror-implicit-function-declaration -DSOFTFLOAT_FAST_INT64 \ gcc -c -Werror-implicit-function-declaration -DSOFTFLOAT_FAST_INT64 \
$(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@ $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@
MAKELIB = ar crs $@ MAKELIB = ar crs $@
OBJ = .o OBJ = .o
LIB = .a LIB = .a
OTHER_HEADERS = $(SOURCE_DIR)/include/opts-GCC.h OTHER_HEADERS = $(SOURCE_DIR)/include/opts-GCC.h
.PHONY: all .PHONY: all
all: softfloat$(LIB) all: softfloat$(LIB)
OBJS_PRIMITIVES = \ OBJS_PRIMITIVES = \
s_eq128$(OBJ) \ s_eq128$(OBJ) \
s_le128$(OBJ) \ s_le128$(OBJ) \
s_lt128$(OBJ) \ s_lt128$(OBJ) \
s_shortShiftLeft128$(OBJ) \ s_shortShiftLeft128$(OBJ) \
s_shortShiftRight128$(OBJ) \ s_shortShiftRight128$(OBJ) \
s_shortShiftRightJam64$(OBJ) \ s_shortShiftRightJam64$(OBJ) \
s_shortShiftRightJam64Extra$(OBJ) \ s_shortShiftRightJam64Extra$(OBJ) \
s_shortShiftRightJam128$(OBJ) \ s_shortShiftRightJam128$(OBJ) \
s_shortShiftRightJam128Extra$(OBJ) \ s_shortShiftRightJam128Extra$(OBJ) \
s_shiftRightJam32$(OBJ) \ s_shiftRightJam32$(OBJ) \
s_shiftRightJam64$(OBJ) \ s_shiftRightJam64$(OBJ) \
s_shiftRightJam64Extra$(OBJ) \ s_shiftRightJam64Extra$(OBJ) \
s_shiftRightJam128$(OBJ) \ s_shiftRightJam128$(OBJ) \
s_shiftRightJam128Extra$(OBJ) \ s_shiftRightJam128Extra$(OBJ) \
s_shiftRightJam256M$(OBJ) \ s_shiftRightJam256M$(OBJ) \
s_countLeadingZeros8$(OBJ) \ s_countLeadingZeros8$(OBJ) \
s_countLeadingZeros16$(OBJ) \ s_countLeadingZeros16$(OBJ) \
s_countLeadingZeros32$(OBJ) \ s_countLeadingZeros32$(OBJ) \
s_countLeadingZeros64$(OBJ) \ s_countLeadingZeros64$(OBJ) \
s_add128$(OBJ) \ s_add128$(OBJ) \
s_add256M$(OBJ) \ s_add256M$(OBJ) \
s_sub128$(OBJ) \ s_sub128$(OBJ) \
s_sub256M$(OBJ) \ s_sub256M$(OBJ) \
s_mul64ByShifted32To128$(OBJ) \ s_mul64ByShifted32To128$(OBJ) \
s_mul64To128$(OBJ) \ s_mul64To128$(OBJ) \
s_mul128By32$(OBJ) \ s_mul128By32$(OBJ) \
s_mul128To256M$(OBJ) \ s_mul128To256M$(OBJ) \
s_approxRecip_1Ks$(OBJ) \ s_approxRecip_1Ks$(OBJ) \
s_approxRecip32_1$(OBJ) \ s_approxRecip32_1$(OBJ) \
s_approxRecipSqrt_1Ks$(OBJ) \ s_approxRecipSqrt_1Ks$(OBJ) \
s_approxRecipSqrt32_1$(OBJ) \ s_approxRecipSqrt32_1$(OBJ) \
OBJS_SPECIALIZE = \ OBJS_SPECIALIZE = \
softfloat_raiseFlags$(OBJ) \ softfloat_raiseFlags$(OBJ) \
s_f16UIToCommonNaN$(OBJ) \ s_f16UIToCommonNaN$(OBJ) \
s_commonNaNToF16UI$(OBJ) \ s_commonNaNToF16UI$(OBJ) \
s_propagateNaNF16UI$(OBJ) \ s_propagateNaNF16UI$(OBJ) \
s_f32UIToCommonNaN$(OBJ) \ s_bf16UIToCommonNaN$(OBJ) \
s_commonNaNToF32UI$(OBJ) \ s_commonNaNToBF16UI$(OBJ) \
s_propagateNaNF32UI$(OBJ) \ s_f32UIToCommonNaN$(OBJ) \
s_f64UIToCommonNaN$(OBJ) \ s_commonNaNToF32UI$(OBJ) \
s_commonNaNToF64UI$(OBJ) \ s_propagateNaNF32UI$(OBJ) \
s_propagateNaNF64UI$(OBJ) \ s_f64UIToCommonNaN$(OBJ) \
extF80M_isSignalingNaN$(OBJ) \ s_commonNaNToF64UI$(OBJ) \
s_extF80UIToCommonNaN$(OBJ) \ s_propagateNaNF64UI$(OBJ) \
s_commonNaNToExtF80UI$(OBJ) \ extF80M_isSignalingNaN$(OBJ) \
s_propagateNaNExtF80UI$(OBJ) \ s_extF80UIToCommonNaN$(OBJ) \
f128M_isSignalingNaN$(OBJ) \ s_commonNaNToExtF80UI$(OBJ) \
s_f128UIToCommonNaN$(OBJ) \ s_propagateNaNExtF80UI$(OBJ) \
s_commonNaNToF128UI$(OBJ) \ f128M_isSignalingNaN$(OBJ) \
s_propagateNaNF128UI$(OBJ) \ s_f128UIToCommonNaN$(OBJ) \
s_commonNaNToF128UI$(OBJ) \
OBJS_OTHERS = \ s_propagateNaNF128UI$(OBJ) \
s_roundToUI32$(OBJ) \
s_roundToUI64$(OBJ) \ OBJS_OTHERS = \
s_roundToI32$(OBJ) \ s_roundToUI32$(OBJ) \
s_roundToI64$(OBJ) \ s_roundToUI64$(OBJ) \
s_normSubnormalF16Sig$(OBJ) \ s_roundToI32$(OBJ) \
s_roundPackToF16$(OBJ) \ s_roundToI64$(OBJ) \
s_normRoundPackToF16$(OBJ) \ s_normSubnormalBF16Sig$(OBJ) \
s_addMagsF16$(OBJ) \ s_roundPackToBF16$(OBJ) \
s_subMagsF16$(OBJ) \ s_normSubnormalF16Sig$(OBJ) \
s_mulAddF16$(OBJ) \ s_roundPackToF16$(OBJ) \
s_normSubnormalF32Sig$(OBJ) \ s_normRoundPackToF16$(OBJ) \
s_roundPackToF32$(OBJ) \ s_addMagsF16$(OBJ) \
s_normRoundPackToF32$(OBJ) \ s_subMagsF16$(OBJ) \
s_addMagsF32$(OBJ) \ s_mulAddF16$(OBJ) \
s_subMagsF32$(OBJ) \ s_normSubnormalF32Sig$(OBJ) \
s_mulAddF32$(OBJ) \ s_roundPackToF32$(OBJ) \
s_normSubnormalF64Sig$(OBJ) \ s_normRoundPackToF32$(OBJ) \
s_roundPackToF64$(OBJ) \ s_addMagsF32$(OBJ) \
s_normRoundPackToF64$(OBJ) \ s_subMagsF32$(OBJ) \
s_addMagsF64$(OBJ) \ s_mulAddF32$(OBJ) \
s_subMagsF64$(OBJ) \ s_normSubnormalF64Sig$(OBJ) \
s_mulAddF64$(OBJ) \ s_roundPackToF64$(OBJ) \
s_normSubnormalExtF80Sig$(OBJ) \ s_normRoundPackToF64$(OBJ) \
s_roundPackToExtF80$(OBJ) \ s_addMagsF64$(OBJ) \
s_normRoundPackToExtF80$(OBJ) \ s_subMagsF64$(OBJ) \
s_addMagsExtF80$(OBJ) \ s_mulAddF64$(OBJ) \
s_subMagsExtF80$(OBJ) \ s_normSubnormalExtF80Sig$(OBJ) \
s_normSubnormalF128Sig$(OBJ) \ s_roundPackToExtF80$(OBJ) \
s_roundPackToF128$(OBJ) \ s_normRoundPackToExtF80$(OBJ) \
s_normRoundPackToF128$(OBJ) \ s_addMagsExtF80$(OBJ) \
s_addMagsF128$(OBJ) \ s_subMagsExtF80$(OBJ) \
s_subMagsF128$(OBJ) \ s_normSubnormalF128Sig$(OBJ) \
s_mulAddF128$(OBJ) \ s_roundPackToF128$(OBJ) \
softfloat_state$(OBJ) \ s_normRoundPackToF128$(OBJ) \
ui32_to_f16$(OBJ) \ s_addMagsF128$(OBJ) \
ui32_to_f32$(OBJ) \ s_subMagsF128$(OBJ) \
ui32_to_f64$(OBJ) \ s_mulAddF128$(OBJ) \
ui32_to_extF80$(OBJ) \ softfloat_state$(OBJ) \
ui32_to_extF80M$(OBJ) \ ui32_to_f16$(OBJ) \
ui32_to_f128$(OBJ) \ ui32_to_f32$(OBJ) \
ui32_to_f128M$(OBJ) \ ui32_to_f64$(OBJ) \
ui64_to_f16$(OBJ) \ ui32_to_extF80$(OBJ) \
ui64_to_f32$(OBJ) \ ui32_to_extF80M$(OBJ) \
ui64_to_f64$(OBJ) \ ui32_to_f128$(OBJ) \
ui64_to_extF80$(OBJ) \ ui32_to_f128M$(OBJ) \
ui64_to_extF80M$(OBJ) \ ui64_to_f16$(OBJ) \
ui64_to_f128$(OBJ) \ ui64_to_f32$(OBJ) \
ui64_to_f128M$(OBJ) \ ui64_to_f64$(OBJ) \
i32_to_f16$(OBJ) \ ui64_to_extF80$(OBJ) \
i32_to_f32$(OBJ) \ ui64_to_extF80M$(OBJ) \
i32_to_f64$(OBJ) \ ui64_to_f128$(OBJ) \
i32_to_extF80$(OBJ) \ ui64_to_f128M$(OBJ) \
i32_to_extF80M$(OBJ) \ i32_to_f16$(OBJ) \
i32_to_f128$(OBJ) \ i32_to_f32$(OBJ) \
i32_to_f128M$(OBJ) \ i32_to_f64$(OBJ) \
i64_to_f16$(OBJ) \ i32_to_extF80$(OBJ) \
i64_to_f32$(OBJ) \ i32_to_extF80M$(OBJ) \
i64_to_f64$(OBJ) \ i32_to_f128$(OBJ) \
i64_to_extF80$(OBJ) \ i32_to_f128M$(OBJ) \
i64_to_extF80M$(OBJ) \ i64_to_f16$(OBJ) \
i64_to_f128$(OBJ) \ i64_to_f32$(OBJ) \
i64_to_f128M$(OBJ) \ i64_to_f64$(OBJ) \
f16_to_ui32$(OBJ) \ i64_to_extF80$(OBJ) \
f16_to_ui64$(OBJ) \ i64_to_extF80M$(OBJ) \
f16_to_i32$(OBJ) \ i64_to_f128$(OBJ) \
f16_to_i64$(OBJ) \ i64_to_f128M$(OBJ) \
f16_to_ui32_r_minMag$(OBJ) \ bf16_isSignalingNaN$(OBJ) \
f16_to_ui64_r_minMag$(OBJ) \ bf16_to_f32$(OBJ) \
f16_to_i32_r_minMag$(OBJ) \ f16_to_ui32$(OBJ) \
f16_to_i64_r_minMag$(OBJ) \ f16_to_ui64$(OBJ) \
f16_to_f32$(OBJ) \ f16_to_i32$(OBJ) \
f16_to_f64$(OBJ) \ f16_to_i64$(OBJ) \
f16_to_extF80$(OBJ) \ f16_to_ui32_r_minMag$(OBJ) \
f16_to_extF80M$(OBJ) \ f16_to_ui64_r_minMag$(OBJ) \
f16_to_f128$(OBJ) \ f16_to_i32_r_minMag$(OBJ) \
f16_to_f128M$(OBJ) \ f16_to_i64_r_minMag$(OBJ) \
f16_roundToInt$(OBJ) \ f16_to_f32$(OBJ) \
f16_add$(OBJ) \ f16_to_f64$(OBJ) \
f16_sub$(OBJ) \ f16_to_extF80$(OBJ) \
f16_mul$(OBJ) \ f16_to_extF80M$(OBJ) \
f16_mulAdd$(OBJ) \ f16_to_f128$(OBJ) \
f16_div$(OBJ) \ f16_to_f128M$(OBJ) \
f16_rem$(OBJ) \ f16_roundToInt$(OBJ) \
f16_sqrt$(OBJ) \ f16_add$(OBJ) \
f16_eq$(OBJ) \ f16_sub$(OBJ) \
f16_le$(OBJ) \ f16_mul$(OBJ) \
f16_lt$(OBJ) \ f16_mulAdd$(OBJ) \
f16_eq_signaling$(OBJ) \ f16_div$(OBJ) \
f16_le_quiet$(OBJ) \ f16_rem$(OBJ) \
f16_lt_quiet$(OBJ) \ f16_sqrt$(OBJ) \
f16_isSignalingNaN$(OBJ) \ f16_eq$(OBJ) \
f32_to_ui32$(OBJ) \ f16_le$(OBJ) \
f32_to_ui64$(OBJ) \ f16_lt$(OBJ) \
f32_to_i32$(OBJ) \ f16_eq_signaling$(OBJ) \
f32_to_i64$(OBJ) \ f16_le_quiet$(OBJ) \
f32_to_ui32_r_minMag$(OBJ) \ f16_lt_quiet$(OBJ) \
f32_to_ui64_r_minMag$(OBJ) \ f16_isSignalingNaN$(OBJ) \
f32_to_i32_r_minMag$(OBJ) \ f32_to_ui32$(OBJ) \
f32_to_i64_r_minMag$(OBJ) \ f32_to_ui64$(OBJ) \
f32_to_f16$(OBJ) \ f32_to_i32$(OBJ) \
f32_to_f64$(OBJ) \ f32_to_i64$(OBJ) \
f32_to_extF80$(OBJ) \ f32_to_ui32_r_minMag$(OBJ) \
f32_to_extF80M$(OBJ) \ f32_to_ui64_r_minMag$(OBJ) \
f32_to_f128$(OBJ) \ f32_to_i32_r_minMag$(OBJ) \
f32_to_f128M$(OBJ) \ f32_to_i64_r_minMag$(OBJ) \
f32_roundToInt$(OBJ) \ f32_to_bf16$(OBJ) \
f32_add$(OBJ) \ f32_to_f16$(OBJ) \
f32_sub$(OBJ) \ f32_to_f64$(OBJ) \
f32_mul$(OBJ) \ f32_to_extF80$(OBJ) \
f32_mulAdd$(OBJ) \ f32_to_extF80M$(OBJ) \
f32_div$(OBJ) \ f32_to_f128$(OBJ) \
f32_rem$(OBJ) \ f32_to_f128M$(OBJ) \
f32_sqrt$(OBJ) \ f32_roundToInt$(OBJ) \
f32_eq$(OBJ) \ f32_add$(OBJ) \
f32_le$(OBJ) \ f32_sub$(OBJ) \
f32_lt$(OBJ) \ f32_mul$(OBJ) \
f32_eq_signaling$(OBJ) \ f32_mulAdd$(OBJ) \
f32_le_quiet$(OBJ) \ f32_div$(OBJ) \
f32_lt_quiet$(OBJ) \ f32_rem$(OBJ) \
f32_isSignalingNaN$(OBJ) \ f32_sqrt$(OBJ) \
f64_to_ui32$(OBJ) \ f32_eq$(OBJ) \
f64_to_ui64$(OBJ) \ f32_le$(OBJ) \
f64_to_i32$(OBJ) \ f32_lt$(OBJ) \
f64_to_i64$(OBJ) \ f32_eq_signaling$(OBJ) \
f64_to_ui32_r_minMag$(OBJ) \ f32_le_quiet$(OBJ) \
f64_to_ui64_r_minMag$(OBJ) \ f32_lt_quiet$(OBJ) \
f64_to_i32_r_minMag$(OBJ) \ f32_isSignalingNaN$(OBJ) \
f64_to_i64_r_minMag$(OBJ) \ f64_to_ui32$(OBJ) \
f64_to_f16$(OBJ) \ f64_to_ui64$(OBJ) \
f64_to_f32$(OBJ) \ f64_to_i32$(OBJ) \
f64_to_extF80$(OBJ) \ f64_to_i64$(OBJ) \
f64_to_extF80M$(OBJ) \ f64_to_ui32_r_minMag$(OBJ) \
f64_to_f128$(OBJ) \ f64_to_ui64_r_minMag$(OBJ) \
f64_to_f128M$(OBJ) \ f64_to_i32_r_minMag$(OBJ) \
f64_roundToInt$(OBJ) \ f64_to_i64_r_minMag$(OBJ) \
f64_add$(OBJ) \ f64_to_f16$(OBJ) \
f64_sub$(OBJ) \ f64_to_f32$(OBJ) \
f64_mul$(OBJ) \ f64_to_extF80$(OBJ) \
f64_mulAdd$(OBJ) \ f64_to_extF80M$(OBJ) \
f64_div$(OBJ) \ f64_to_f128$(OBJ) \
f64_rem$(OBJ) \ f64_to_f128M$(OBJ) \
f64_sqrt$(OBJ) \ f64_roundToInt$(OBJ) \
f64_eq$(OBJ) \ f64_add$(OBJ) \
f64_le$(OBJ) \ f64_sub$(OBJ) \
f64_lt$(OBJ) \ f64_mul$(OBJ) \
f64_eq_signaling$(OBJ) \ f64_mulAdd$(OBJ) \
f64_le_quiet$(OBJ) \ f64_div$(OBJ) \
f64_lt_quiet$(OBJ) \ f64_rem$(OBJ) \
f64_isSignalingNaN$(OBJ) \ f64_sqrt$(OBJ) \
extF80_to_ui32$(OBJ) \ f64_eq$(OBJ) \
extF80_to_ui64$(OBJ) \ f64_le$(OBJ) \
extF80_to_i32$(OBJ) \ f64_lt$(OBJ) \
extF80_to_i64$(OBJ) \ f64_eq_signaling$(OBJ) \
extF80_to_ui32_r_minMag$(OBJ) \ f64_le_quiet$(OBJ) \
extF80_to_ui64_r_minMag$(OBJ) \ f64_lt_quiet$(OBJ) \
extF80_to_i32_r_minMag$(OBJ) \ f64_isSignalingNaN$(OBJ) \
extF80_to_i64_r_minMag$(OBJ) \ extF80_to_ui32$(OBJ) \
extF80_to_f16$(OBJ) \ extF80_to_ui64$(OBJ) \
extF80_to_f32$(OBJ) \ extF80_to_i32$(OBJ) \
extF80_to_f64$(OBJ) \ extF80_to_i64$(OBJ) \
extF80_to_f128$(OBJ) \ extF80_to_ui32_r_minMag$(OBJ) \
extF80_roundToInt$(OBJ) \ extF80_to_ui64_r_minMag$(OBJ) \
extF80_add$(OBJ) \ extF80_to_i32_r_minMag$(OBJ) \
extF80_sub$(OBJ) \ extF80_to_i64_r_minMag$(OBJ) \
extF80_mul$(OBJ) \ extF80_to_f16$(OBJ) \
extF80_div$(OBJ) \ extF80_to_f32$(OBJ) \
extF80_rem$(OBJ) \ extF80_to_f64$(OBJ) \
extF80_sqrt$(OBJ) \ extF80_to_f128$(OBJ) \
extF80_eq$(OBJ) \ extF80_roundToInt$(OBJ) \
extF80_le$(OBJ) \ extF80_add$(OBJ) \
extF80_lt$(OBJ) \ extF80_sub$(OBJ) \
extF80_eq_signaling$(OBJ) \ extF80_mul$(OBJ) \
extF80_le_quiet$(OBJ) \ extF80_div$(OBJ) \
extF80_lt_quiet$(OBJ) \ extF80_rem$(OBJ) \
extF80_isSignalingNaN$(OBJ) \ extF80_sqrt$(OBJ) \
extF80M_to_ui32$(OBJ) \ extF80_eq$(OBJ) \
extF80M_to_ui64$(OBJ) \ extF80_le$(OBJ) \
extF80M_to_i32$(OBJ) \ extF80_lt$(OBJ) \
extF80M_to_i64$(OBJ) \ extF80_eq_signaling$(OBJ) \
extF80M_to_ui32_r_minMag$(OBJ) \ extF80_le_quiet$(OBJ) \
extF80M_to_ui64_r_minMag$(OBJ) \ extF80_lt_quiet$(OBJ) \
extF80M_to_i32_r_minMag$(OBJ) \ extF80_isSignalingNaN$(OBJ) \
extF80M_to_i64_r_minMag$(OBJ) \ extF80M_to_ui32$(OBJ) \
extF80M_to_f16$(OBJ) \ extF80M_to_ui64$(OBJ) \
extF80M_to_f32$(OBJ) \ extF80M_to_i32$(OBJ) \
extF80M_to_f64$(OBJ) \ extF80M_to_i64$(OBJ) \
extF80M_to_f128M$(OBJ) \ extF80M_to_ui32_r_minMag$(OBJ) \
extF80M_roundToInt$(OBJ) \ extF80M_to_ui64_r_minMag$(OBJ) \
extF80M_add$(OBJ) \ extF80M_to_i32_r_minMag$(OBJ) \
extF80M_sub$(OBJ) \ extF80M_to_i64_r_minMag$(OBJ) \
extF80M_mul$(OBJ) \ extF80M_to_f16$(OBJ) \
extF80M_div$(OBJ) \ extF80M_to_f32$(OBJ) \
extF80M_rem$(OBJ) \ extF80M_to_f64$(OBJ) \
extF80M_sqrt$(OBJ) \ extF80M_to_f128M$(OBJ) \
extF80M_eq$(OBJ) \ extF80M_roundToInt$(OBJ) \
extF80M_le$(OBJ) \ extF80M_add$(OBJ) \
extF80M_lt$(OBJ) \ extF80M_sub$(OBJ) \
extF80M_eq_signaling$(OBJ) \ extF80M_mul$(OBJ) \
extF80M_le_quiet$(OBJ) \ extF80M_div$(OBJ) \
extF80M_lt_quiet$(OBJ) \ extF80M_rem$(OBJ) \
f128_to_ui32$(OBJ) \ extF80M_sqrt$(OBJ) \
f128_to_ui64$(OBJ) \ extF80M_eq$(OBJ) \
f128_to_i32$(OBJ) \ extF80M_le$(OBJ) \
f128_to_i64$(OBJ) \ extF80M_lt$(OBJ) \
f128_to_ui32_r_minMag$(OBJ) \ extF80M_eq_signaling$(OBJ) \
f128_to_ui64_r_minMag$(OBJ) \ extF80M_le_quiet$(OBJ) \
f128_to_i32_r_minMag$(OBJ) \ extF80M_lt_quiet$(OBJ) \
f128_to_i64_r_minMag$(OBJ) \ f128_to_ui32$(OBJ) \
f128_to_f16$(OBJ) \ f128_to_ui64$(OBJ) \
f128_to_f32$(OBJ) \ f128_to_i32$(OBJ) \
f128_to_extF80$(OBJ) \ f128_to_i64$(OBJ) \
f128_to_f64$(OBJ) \ f128_to_ui32_r_minMag$(OBJ) \
f128_roundToInt$(OBJ) \ f128_to_ui64_r_minMag$(OBJ) \
f128_add$(OBJ) \ f128_to_i32_r_minMag$(OBJ) \
f128_sub$(OBJ) \ f128_to_i64_r_minMag$(OBJ) \
f128_mul$(OBJ) \ f128_to_f16$(OBJ) \
f128_mulAdd$(OBJ) \ f128_to_f32$(OBJ) \
f128_div$(OBJ) \ f128_to_extF80$(OBJ) \
f128_rem$(OBJ) \ f128_to_f64$(OBJ) \
f128_sqrt$(OBJ) \ f128_roundToInt$(OBJ) \
f128_eq$(OBJ) \ f128_add$(OBJ) \
f128_le$(OBJ) \ f128_sub$(OBJ) \
f128_lt$(OBJ) \ f128_mul$(OBJ) \
f128_eq_signaling$(OBJ) \ f128_mulAdd$(OBJ) \
f128_le_quiet$(OBJ) \ f128_div$(OBJ) \
f128_lt_quiet$(OBJ) \ f128_rem$(OBJ) \
f128_isSignalingNaN$(OBJ) \ f128_sqrt$(OBJ) \
f128M_to_ui32$(OBJ) \ f128_eq$(OBJ) \
f128M_to_ui64$(OBJ) \ f128_le$(OBJ) \
f128M_to_i32$(OBJ) \ f128_lt$(OBJ) \
f128M_to_i64$(OBJ) \ f128_eq_signaling$(OBJ) \
f128M_to_ui32_r_minMag$(OBJ) \ f128_le_quiet$(OBJ) \
f128M_to_ui64_r_minMag$(OBJ) \ f128_lt_quiet$(OBJ) \
f128M_to_i32_r_minMag$(OBJ) \ f128_isSignalingNaN$(OBJ) \
f128M_to_i64_r_minMag$(OBJ) \ f128M_to_ui32$(OBJ) \
f128M_to_f16$(OBJ) \ f128M_to_ui64$(OBJ) \
f128M_to_f32$(OBJ) \ f128M_to_i32$(OBJ) \
f128M_to_extF80M$(OBJ) \ f128M_to_i64$(OBJ) \
f128M_to_f64$(OBJ) \ f128M_to_ui32_r_minMag$(OBJ) \
f128M_roundToInt$(OBJ) \ f128M_to_ui64_r_minMag$(OBJ) \
f128M_add$(OBJ) \ f128M_to_i32_r_minMag$(OBJ) \
f128M_sub$(OBJ) \ f128M_to_i64_r_minMag$(OBJ) \
f128M_mul$(OBJ) \ f128M_to_f16$(OBJ) \
f128M_mulAdd$(OBJ) \ f128M_to_f32$(OBJ) \
f128M_div$(OBJ) \ f128M_to_extF80M$(OBJ) \
f128M_rem$(OBJ) \ f128M_to_f64$(OBJ) \
f128M_sqrt$(OBJ) \ f128M_roundToInt$(OBJ) \
f128M_eq$(OBJ) \ f128M_add$(OBJ) \
f128M_le$(OBJ) \ f128M_sub$(OBJ) \
f128M_lt$(OBJ) \ f128M_mul$(OBJ) \
f128M_eq_signaling$(OBJ) \ f128M_mulAdd$(OBJ) \
f128M_le_quiet$(OBJ) \ f128M_div$(OBJ) \
f128M_lt_quiet$(OBJ) \ f128M_rem$(OBJ) \
f128M_sqrt$(OBJ) \
OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS) f128M_eq$(OBJ) \
f128M_le$(OBJ) \
$(OBJS_ALL): \ f128M_lt$(OBJ) \
$(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \ f128M_eq_signaling$(OBJ) \
$(SOURCE_DIR)/include/primitives.h f128M_le_quiet$(OBJ) \
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \ f128M_lt_quiet$(OBJ) \
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \ OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS)
$(SOURCE_DIR)/include/softfloat.h
$(OBJS_ALL): \
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c $(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \
$(COMPILE_C) $(SOURCE_DIR)/$*.c $(SOURCE_DIR)/include/primitives.h
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c $(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
$(SOURCE_DIR)/include/softfloat.h
softfloat$(LIB): $(OBJS_ALL)
$(DELETE) $@ $(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
$(MAKELIB) $^ $(COMPILE_C) $(SOURCE_DIR)/$*.c
.PHONY: clean $(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
clean: $(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
$(DELETE) $(OBJS_ALL) softfloat$(LIB)
softfloat$(LIB): $(OBJS_ALL)
$(DELETE) $@
$(MAKELIB) $^
.PHONY: clean
clean:
$(DELETE) $(OBJS_ALL) softfloat$(LIB)

View File

@ -1,56 +1,56 @@
/*============================================================================ /*============================================================================
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
University of California. All rights reserved. University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define LITTLEENDIAN 1 #define LITTLEENDIAN 1
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#ifdef __GNUC_STDC_INLINE__ #ifdef __GNUC_STDC_INLINE__
//#define INLINE inline //#define INLINE inline
#define INLINE static #define INLINE static
#else #else
#define INLINE extern inline #define INLINE extern inline
#endif #endif
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#ifdef __GNUC__ #ifdef __GNUC__
#define SOFTFLOAT_BUILTIN_CLZ 1 #define SOFTFLOAT_BUILTIN_CLZ 1
#define SOFTFLOAT_INTRINSIC_INT128 1 #define SOFTFLOAT_INTRINSIC_INT128 1
#endif #endif
#include "opts-GCC.h" #include "opts-GCC.h"

View File

@ -1,325 +1,325 @@
#============================================================================= #=============================================================================
# #
# This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic # This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic
# Package, Release 3e, by John R. Hauser. # Package, Release 3e, by John R. Hauser.
# #
# Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the # Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
# University of California. All rights reserved. # University of California. All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met: # modification, are permitted provided that the following conditions are met:
# #
# 1. Redistributions of source code must retain the above copyright notice, # 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer. # this list of conditions, and the following disclaimer.
# #
# 2. Redistributions in binary form must reproduce the above copyright # 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in the # notice, this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution. # documentation and/or other materials provided with the distribution.
# #
# 3. Neither the name of the University nor the names of its contributors # 3. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software # may be used to endorse or promote products derived from this software
# without specific prior written permission. # without specific prior written permission.
# #
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# #
#============================================================================= #=============================================================================
SOURCE_DIR ?= ../../source SOURCE_DIR ?= ../../source
SPECIALIZE_TYPE ?= 8086 SPECIALIZE_TYPE ?= 8086
SOFTFLOAT_OPTS ?= \ SOFTFLOAT_OPTS ?= \
-DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \ -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
-DSOFTFLOAT_FAST_DIV64TO32 -DSOFTFLOAT_FAST_DIV64TO32
DELETE = rm -f DELETE = rm -f
C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
COMPILE_C = \ COMPILE_C = \
gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \ gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \
$(C_INCLUDES) -O2 -o $@ $(C_INCLUDES) -O2 -o $@
MAKELIB = ar crs $@ MAKELIB = ar crs $@
OBJ = .o OBJ = .o
LIB = .a LIB = .a
OTHER_HEADERS = OTHER_HEADERS =
.PHONY: all .PHONY: all
all: softfloat$(LIB) all: softfloat$(LIB)
OBJS_PRIMITIVES = \ OBJS_PRIMITIVES = \
s_compare96M$(OBJ) \ s_compare96M$(OBJ) \
s_compare128M$(OBJ) \ s_compare128M$(OBJ) \
s_shortShiftLeft64To96M$(OBJ) \ s_shortShiftLeft64To96M$(OBJ) \
s_shortShiftLeftM$(OBJ) \ s_shortShiftLeftM$(OBJ) \
s_shiftLeftM$(OBJ) \ s_shiftLeftM$(OBJ) \
s_shortShiftRightM$(OBJ) \ s_shortShiftRightM$(OBJ) \
s_shortShiftRightJam64$(OBJ) \ s_shortShiftRightJam64$(OBJ) \
s_shortShiftRightJamM$(OBJ) \ s_shortShiftRightJamM$(OBJ) \
s_shiftRightJam32$(OBJ) \ s_shiftRightJam32$(OBJ) \
s_shiftRightJam64$(OBJ) \ s_shiftRightJam64$(OBJ) \
s_shiftRightJamM$(OBJ) \ s_shiftRightJamM$(OBJ) \
s_shiftRightM$(OBJ) \ s_shiftRightM$(OBJ) \
s_countLeadingZeros8$(OBJ) \ s_countLeadingZeros8$(OBJ) \
s_countLeadingZeros16$(OBJ) \ s_countLeadingZeros16$(OBJ) \
s_countLeadingZeros32$(OBJ) \ s_countLeadingZeros32$(OBJ) \
s_countLeadingZeros64$(OBJ) \ s_countLeadingZeros64$(OBJ) \
s_addM$(OBJ) \ s_addM$(OBJ) \
s_addCarryM$(OBJ) \ s_addCarryM$(OBJ) \
s_addComplCarryM$(OBJ) \ s_addComplCarryM$(OBJ) \
s_negXM$(OBJ) \ s_negXM$(OBJ) \
s_sub1XM$(OBJ) \ s_sub1XM$(OBJ) \
s_subM$(OBJ) \ s_subM$(OBJ) \
s_mul64To128M$(OBJ) \ s_mul64To128M$(OBJ) \
s_mul128MTo256M$(OBJ) \ s_mul128MTo256M$(OBJ) \
s_approxRecip_1Ks$(OBJ) \ s_approxRecip_1Ks$(OBJ) \
s_approxRecip32_1$(OBJ) \ s_approxRecip32_1$(OBJ) \
s_approxRecipSqrt_1Ks$(OBJ) \ s_approxRecipSqrt_1Ks$(OBJ) \
s_approxRecipSqrt32_1$(OBJ) \ s_approxRecipSqrt32_1$(OBJ) \
s_remStepMBy32$(OBJ) \ s_remStepMBy32$(OBJ) \
OBJS_SPECIALIZE = \ OBJS_SPECIALIZE = \
softfloat_raiseFlags$(OBJ) \ softfloat_raiseFlags$(OBJ) \
s_f16UIToCommonNaN$(OBJ) \ s_f16UIToCommonNaN$(OBJ) \
s_commonNaNToF16UI$(OBJ) \ s_commonNaNToF16UI$(OBJ) \
s_propagateNaNF16UI$(OBJ) \ s_propagateNaNF16UI$(OBJ) \
s_f32UIToCommonNaN$(OBJ) \ s_f32UIToCommonNaN$(OBJ) \
s_commonNaNToF32UI$(OBJ) \ s_commonNaNToF32UI$(OBJ) \
s_propagateNaNF32UI$(OBJ) \ s_propagateNaNF32UI$(OBJ) \
s_f64UIToCommonNaN$(OBJ) \ s_f64UIToCommonNaN$(OBJ) \
s_commonNaNToF64UI$(OBJ) \ s_commonNaNToF64UI$(OBJ) \
s_propagateNaNF64UI$(OBJ) \ s_propagateNaNF64UI$(OBJ) \
extF80M_isSignalingNaN$(OBJ) \ extF80M_isSignalingNaN$(OBJ) \
s_extF80MToCommonNaN$(OBJ) \ s_extF80MToCommonNaN$(OBJ) \
s_commonNaNToExtF80M$(OBJ) \ s_commonNaNToExtF80M$(OBJ) \
s_propagateNaNExtF80M$(OBJ) \ s_propagateNaNExtF80M$(OBJ) \
f128M_isSignalingNaN$(OBJ) \ f128M_isSignalingNaN$(OBJ) \
s_f128MToCommonNaN$(OBJ) \ s_f128MToCommonNaN$(OBJ) \
s_commonNaNToF128M$(OBJ) \ s_commonNaNToF128M$(OBJ) \
s_propagateNaNF128M$(OBJ) \ s_propagateNaNF128M$(OBJ) \
OBJS_OTHERS = \ OBJS_OTHERS = \
s_roundToUI32$(OBJ) \ s_roundToUI32$(OBJ) \
s_roundMToUI64$(OBJ) \ s_roundMToUI64$(OBJ) \
s_roundToI32$(OBJ) \ s_roundToI32$(OBJ) \
s_roundMToI64$(OBJ) \ s_roundMToI64$(OBJ) \
s_normSubnormalF16Sig$(OBJ) \ s_normSubnormalF16Sig$(OBJ) \
s_roundPackToF16$(OBJ) \ s_roundPackToF16$(OBJ) \
s_normRoundPackToF16$(OBJ) \ s_normRoundPackToF16$(OBJ) \
s_addMagsF16$(OBJ) \ s_addMagsF16$(OBJ) \
s_subMagsF16$(OBJ) \ s_subMagsF16$(OBJ) \
s_mulAddF16$(OBJ) \ s_mulAddF16$(OBJ) \
s_normSubnormalF32Sig$(OBJ) \ s_normSubnormalF32Sig$(OBJ) \
s_roundPackToF32$(OBJ) \ s_roundPackToF32$(OBJ) \
s_normRoundPackToF32$(OBJ) \ s_normRoundPackToF32$(OBJ) \
s_addMagsF32$(OBJ) \ s_addMagsF32$(OBJ) \
s_subMagsF32$(OBJ) \ s_subMagsF32$(OBJ) \
s_mulAddF32$(OBJ) \ s_mulAddF32$(OBJ) \
s_normSubnormalF64Sig$(OBJ) \ s_normSubnormalF64Sig$(OBJ) \
s_roundPackToF64$(OBJ) \ s_roundPackToF64$(OBJ) \
s_normRoundPackToF64$(OBJ) \ s_normRoundPackToF64$(OBJ) \
s_addMagsF64$(OBJ) \ s_addMagsF64$(OBJ) \
s_subMagsF64$(OBJ) \ s_subMagsF64$(OBJ) \
s_mulAddF64$(OBJ) \ s_mulAddF64$(OBJ) \
s_tryPropagateNaNExtF80M$(OBJ) \ s_tryPropagateNaNExtF80M$(OBJ) \
s_invalidExtF80M$(OBJ) \ s_invalidExtF80M$(OBJ) \
s_normExtF80SigM$(OBJ) \ s_normExtF80SigM$(OBJ) \
s_roundPackMToExtF80M$(OBJ) \ s_roundPackMToExtF80M$(OBJ) \
s_normRoundPackMToExtF80M$(OBJ) \ s_normRoundPackMToExtF80M$(OBJ) \
s_addExtF80M$(OBJ) \ s_addExtF80M$(OBJ) \
s_compareNonnormExtF80M$(OBJ) \ s_compareNonnormExtF80M$(OBJ) \
s_isNaNF128M$(OBJ) \ s_isNaNF128M$(OBJ) \
s_tryPropagateNaNF128M$(OBJ) \ s_tryPropagateNaNF128M$(OBJ) \
s_invalidF128M$(OBJ) \ s_invalidF128M$(OBJ) \
s_shiftNormSigF128M$(OBJ) \ s_shiftNormSigF128M$(OBJ) \
s_roundPackMToF128M$(OBJ) \ s_roundPackMToF128M$(OBJ) \
s_normRoundPackMToF128M$(OBJ) \ s_normRoundPackMToF128M$(OBJ) \
s_addF128M$(OBJ) \ s_addF128M$(OBJ) \
s_mulAddF128M$(OBJ) \ s_mulAddF128M$(OBJ) \
softfloat_state$(OBJ) \ softfloat_state$(OBJ) \
ui32_to_f16$(OBJ) \ ui32_to_f16$(OBJ) \
ui32_to_f32$(OBJ) \ ui32_to_f32$(OBJ) \
ui32_to_f64$(OBJ) \ ui32_to_f64$(OBJ) \
ui32_to_extF80M$(OBJ) \ ui32_to_extF80M$(OBJ) \
ui32_to_f128M$(OBJ) \ ui32_to_f128M$(OBJ) \
ui64_to_f16$(OBJ) \ ui64_to_f16$(OBJ) \
ui64_to_f32$(OBJ) \ ui64_to_f32$(OBJ) \
ui64_to_f64$(OBJ) \ ui64_to_f64$(OBJ) \
ui64_to_extF80M$(OBJ) \ ui64_to_extF80M$(OBJ) \
ui64_to_f128M$(OBJ) \ ui64_to_f128M$(OBJ) \
i32_to_f16$(OBJ) \ i32_to_f16$(OBJ) \
i32_to_f32$(OBJ) \ i32_to_f32$(OBJ) \
i32_to_f64$(OBJ) \ i32_to_f64$(OBJ) \
i32_to_extF80M$(OBJ) \ i32_to_extF80M$(OBJ) \
i32_to_f128M$(OBJ) \ i32_to_f128M$(OBJ) \
i64_to_f16$(OBJ) \ i64_to_f16$(OBJ) \
i64_to_f32$(OBJ) \ i64_to_f32$(OBJ) \
i64_to_f64$(OBJ) \ i64_to_f64$(OBJ) \
i64_to_extF80M$(OBJ) \ i64_to_extF80M$(OBJ) \
i64_to_f128M$(OBJ) \ i64_to_f128M$(OBJ) \
f16_to_ui32$(OBJ) \ f16_to_ui32$(OBJ) \
f16_to_ui64$(OBJ) \ f16_to_ui64$(OBJ) \
f16_to_i32$(OBJ) \ f16_to_i32$(OBJ) \
f16_to_i64$(OBJ) \ f16_to_i64$(OBJ) \
f16_to_ui32_r_minMag$(OBJ) \ f16_to_ui32_r_minMag$(OBJ) \
f16_to_ui64_r_minMag$(OBJ) \ f16_to_ui64_r_minMag$(OBJ) \
f16_to_i32_r_minMag$(OBJ) \ f16_to_i32_r_minMag$(OBJ) \
f16_to_i64_r_minMag$(OBJ) \ f16_to_i64_r_minMag$(OBJ) \
f16_to_f32$(OBJ) \ f16_to_f32$(OBJ) \
f16_to_f64$(OBJ) \ f16_to_f64$(OBJ) \
f16_to_extF80M$(OBJ) \ f16_to_extF80M$(OBJ) \
f16_to_f128M$(OBJ) \ f16_to_f128M$(OBJ) \
f16_roundToInt$(OBJ) \ f16_roundToInt$(OBJ) \
f16_add$(OBJ) \ f16_add$(OBJ) \
f16_sub$(OBJ) \ f16_sub$(OBJ) \
f16_mul$(OBJ) \ f16_mul$(OBJ) \
f16_mulAdd$(OBJ) \ f16_mulAdd$(OBJ) \
f16_div$(OBJ) \ f16_div$(OBJ) \
f16_rem$(OBJ) \ f16_rem$(OBJ) \
f16_sqrt$(OBJ) \ f16_sqrt$(OBJ) \
f16_eq$(OBJ) \ f16_eq$(OBJ) \
f16_le$(OBJ) \ f16_le$(OBJ) \
f16_lt$(OBJ) \ f16_lt$(OBJ) \
f16_eq_signaling$(OBJ) \ f16_eq_signaling$(OBJ) \
f16_le_quiet$(OBJ) \ f16_le_quiet$(OBJ) \
f16_lt_quiet$(OBJ) \ f16_lt_quiet$(OBJ) \
f16_isSignalingNaN$(OBJ) \ f16_isSignalingNaN$(OBJ) \
f32_to_ui32$(OBJ) \ f32_to_ui32$(OBJ) \
f32_to_ui64$(OBJ) \ f32_to_ui64$(OBJ) \
f32_to_i32$(OBJ) \ f32_to_i32$(OBJ) \
f32_to_i64$(OBJ) \ f32_to_i64$(OBJ) \
f32_to_ui32_r_minMag$(OBJ) \ f32_to_ui32_r_minMag$(OBJ) \
f32_to_ui64_r_minMag$(OBJ) \ f32_to_ui64_r_minMag$(OBJ) \
f32_to_i32_r_minMag$(OBJ) \ f32_to_i32_r_minMag$(OBJ) \
f32_to_i64_r_minMag$(OBJ) \ f32_to_i64_r_minMag$(OBJ) \
f32_to_f16$(OBJ) \ f32_to_f16$(OBJ) \
f32_to_f64$(OBJ) \ f32_to_f64$(OBJ) \
f32_to_extF80M$(OBJ) \ f32_to_extF80M$(OBJ) \
f32_to_f128M$(OBJ) \ f32_to_f128M$(OBJ) \
f32_roundToInt$(OBJ) \ f32_roundToInt$(OBJ) \
f32_add$(OBJ) \ f32_add$(OBJ) \
f32_sub$(OBJ) \ f32_sub$(OBJ) \
f32_mul$(OBJ) \ f32_mul$(OBJ) \
f32_mulAdd$(OBJ) \ f32_mulAdd$(OBJ) \
f32_div$(OBJ) \ f32_div$(OBJ) \
f32_rem$(OBJ) \ f32_rem$(OBJ) \
f32_sqrt$(OBJ) \ f32_sqrt$(OBJ) \
f32_eq$(OBJ) \ f32_eq$(OBJ) \
f32_le$(OBJ) \ f32_le$(OBJ) \
f32_lt$(OBJ) \ f32_lt$(OBJ) \
f32_eq_signaling$(OBJ) \ f32_eq_signaling$(OBJ) \
f32_le_quiet$(OBJ) \ f32_le_quiet$(OBJ) \
f32_lt_quiet$(OBJ) \ f32_lt_quiet$(OBJ) \
f32_isSignalingNaN$(OBJ) \ f32_isSignalingNaN$(OBJ) \
f64_to_ui32$(OBJ) \ f64_to_ui32$(OBJ) \
f64_to_ui64$(OBJ) \ f64_to_ui64$(OBJ) \
f64_to_i32$(OBJ) \ f64_to_i32$(OBJ) \
f64_to_i64$(OBJ) \ f64_to_i64$(OBJ) \
f64_to_ui32_r_minMag$(OBJ) \ f64_to_ui32_r_minMag$(OBJ) \
f64_to_ui64_r_minMag$(OBJ) \ f64_to_ui64_r_minMag$(OBJ) \
f64_to_i32_r_minMag$(OBJ) \ f64_to_i32_r_minMag$(OBJ) \
f64_to_i64_r_minMag$(OBJ) \ f64_to_i64_r_minMag$(OBJ) \
f64_to_f16$(OBJ) \ f64_to_f16$(OBJ) \
f64_to_f32$(OBJ) \ f64_to_f32$(OBJ) \
f64_to_extF80M$(OBJ) \ f64_to_extF80M$(OBJ) \
f64_to_f128M$(OBJ) \ f64_to_f128M$(OBJ) \
f64_roundToInt$(OBJ) \ f64_roundToInt$(OBJ) \
f64_add$(OBJ) \ f64_add$(OBJ) \
f64_sub$(OBJ) \ f64_sub$(OBJ) \
f64_mul$(OBJ) \ f64_mul$(OBJ) \
f64_mulAdd$(OBJ) \ f64_mulAdd$(OBJ) \
f64_div$(OBJ) \ f64_div$(OBJ) \
f64_rem$(OBJ) \ f64_rem$(OBJ) \
f64_sqrt$(OBJ) \ f64_sqrt$(OBJ) \
f64_eq$(OBJ) \ f64_eq$(OBJ) \
f64_le$(OBJ) \ f64_le$(OBJ) \
f64_lt$(OBJ) \ f64_lt$(OBJ) \
f64_eq_signaling$(OBJ) \ f64_eq_signaling$(OBJ) \
f64_le_quiet$(OBJ) \ f64_le_quiet$(OBJ) \
f64_lt_quiet$(OBJ) \ f64_lt_quiet$(OBJ) \
f64_isSignalingNaN$(OBJ) \ f64_isSignalingNaN$(OBJ) \
extF80M_to_ui32$(OBJ) \ extF80M_to_ui32$(OBJ) \
extF80M_to_ui64$(OBJ) \ extF80M_to_ui64$(OBJ) \
extF80M_to_i32$(OBJ) \ extF80M_to_i32$(OBJ) \
extF80M_to_i64$(OBJ) \ extF80M_to_i64$(OBJ) \
extF80M_to_ui32_r_minMag$(OBJ) \ extF80M_to_ui32_r_minMag$(OBJ) \
extF80M_to_ui64_r_minMag$(OBJ) \ extF80M_to_ui64_r_minMag$(OBJ) \
extF80M_to_i32_r_minMag$(OBJ) \ extF80M_to_i32_r_minMag$(OBJ) \
extF80M_to_i64_r_minMag$(OBJ) \ extF80M_to_i64_r_minMag$(OBJ) \
extF80M_to_f16$(OBJ) \ extF80M_to_f16$(OBJ) \
extF80M_to_f32$(OBJ) \ extF80M_to_f32$(OBJ) \
extF80M_to_f64$(OBJ) \ extF80M_to_f64$(OBJ) \
extF80M_to_f128M$(OBJ) \ extF80M_to_f128M$(OBJ) \
extF80M_roundToInt$(OBJ) \ extF80M_roundToInt$(OBJ) \
extF80M_add$(OBJ) \ extF80M_add$(OBJ) \
extF80M_sub$(OBJ) \ extF80M_sub$(OBJ) \
extF80M_mul$(OBJ) \ extF80M_mul$(OBJ) \
extF80M_div$(OBJ) \ extF80M_div$(OBJ) \
extF80M_rem$(OBJ) \ extF80M_rem$(OBJ) \
extF80M_sqrt$(OBJ) \ extF80M_sqrt$(OBJ) \
extF80M_eq$(OBJ) \ extF80M_eq$(OBJ) \
extF80M_le$(OBJ) \ extF80M_le$(OBJ) \
extF80M_lt$(OBJ) \ extF80M_lt$(OBJ) \
extF80M_eq_signaling$(OBJ) \ extF80M_eq_signaling$(OBJ) \
extF80M_le_quiet$(OBJ) \ extF80M_le_quiet$(OBJ) \
extF80M_lt_quiet$(OBJ) \ extF80M_lt_quiet$(OBJ) \
f128M_to_ui32$(OBJ) \ f128M_to_ui32$(OBJ) \
f128M_to_ui64$(OBJ) \ f128M_to_ui64$(OBJ) \
f128M_to_i32$(OBJ) \ f128M_to_i32$(OBJ) \
f128M_to_i64$(OBJ) \ f128M_to_i64$(OBJ) \
f128M_to_ui32_r_minMag$(OBJ) \ f128M_to_ui32_r_minMag$(OBJ) \
f128M_to_ui64_r_minMag$(OBJ) \ f128M_to_ui64_r_minMag$(OBJ) \
f128M_to_i32_r_minMag$(OBJ) \ f128M_to_i32_r_minMag$(OBJ) \
f128M_to_i64_r_minMag$(OBJ) \ f128M_to_i64_r_minMag$(OBJ) \
f128M_to_f16$(OBJ) \ f128M_to_f16$(OBJ) \
f128M_to_f32$(OBJ) \ f128M_to_f32$(OBJ) \
f128M_to_f64$(OBJ) \ f128M_to_f64$(OBJ) \
f128M_to_extF80M$(OBJ) \ f128M_to_extF80M$(OBJ) \
f128M_roundToInt$(OBJ) \ f128M_roundToInt$(OBJ) \
f128M_add$(OBJ) \ f128M_add$(OBJ) \
f128M_sub$(OBJ) \ f128M_sub$(OBJ) \
f128M_mul$(OBJ) \ f128M_mul$(OBJ) \
f128M_mulAdd$(OBJ) \ f128M_mulAdd$(OBJ) \
f128M_div$(OBJ) \ f128M_div$(OBJ) \
f128M_rem$(OBJ) \ f128M_rem$(OBJ) \
f128M_sqrt$(OBJ) \ f128M_sqrt$(OBJ) \
f128M_eq$(OBJ) \ f128M_eq$(OBJ) \
f128M_le$(OBJ) \ f128M_le$(OBJ) \
f128M_lt$(OBJ) \ f128M_lt$(OBJ) \
f128M_eq_signaling$(OBJ) \ f128M_eq_signaling$(OBJ) \
f128M_le_quiet$(OBJ) \ f128M_le_quiet$(OBJ) \
f128M_lt_quiet$(OBJ) \ f128M_lt_quiet$(OBJ) \
OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS) OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS)
$(OBJS_ALL): \ $(OBJS_ALL): \
$(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \ $(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \
$(SOURCE_DIR)/include/primitives.h $(SOURCE_DIR)/include/primitives.h
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \ $(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \ $(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \ $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
$(SOURCE_DIR)/include/softfloat.h $(SOURCE_DIR)/include/softfloat.h
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c $(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$*.c
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c $(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
softfloat$(LIB): $(OBJS_ALL) softfloat$(LIB): $(OBJS_ALL)
$(DELETE) $@ $(DELETE) $@
$(MAKELIB) $^ $(MAKELIB) $^
.PHONY: clean .PHONY: clean
clean: clean:
$(DELETE) $(OBJS_ALL) softfloat$(LIB) $(DELETE) $(OBJS_ALL) softfloat$(LIB)

View File

@ -1,52 +1,53 @@
/*============================================================================ /*============================================================================
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
University of California. All rights reserved. University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define LITTLEENDIAN 1 #define LITTLEENDIAN 1
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#ifdef __GNUC_STDC_INLINE__ #ifdef __GNUC_STDC_INLINE__
#define INLINE inline #define INLINE inline
#else #else
#define INLINE extern inline #define INLINE extern inline
#endif #endif
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define SOFTFLOAT_BUILTIN_CLZ 1 #define SOFTFLOAT_BUILTIN_CLZ 1
#include "opts-GCC.h" #include "opts-GCC.h"

View File

@ -1,325 +1,325 @@
#============================================================================= #=============================================================================
# #
# This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic # This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic
# Package, Release 3e, by John R. Hauser. # Package, Release 3e, by John R. Hauser.
# #
# Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the # Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
# University of California. All rights reserved. # University of California. All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met: # modification, are permitted provided that the following conditions are met:
# #
# 1. Redistributions of source code must retain the above copyright notice, # 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer. # this list of conditions, and the following disclaimer.
# #
# 2. Redistributions in binary form must reproduce the above copyright # 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in the # notice, this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution. # documentation and/or other materials provided with the distribution.
# #
# 3. Neither the name of the University nor the names of its contributors # 3. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software # may be used to endorse or promote products derived from this software
# without specific prior written permission. # without specific prior written permission.
# #
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# #
#============================================================================= #=============================================================================
SOURCE_DIR ?= ../../source SOURCE_DIR ?= ../../source
SPECIALIZE_TYPE ?= 8086-SSE SPECIALIZE_TYPE ?= 8086-SSE
SOFTFLOAT_OPTS ?= \ SOFTFLOAT_OPTS ?= \
-DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \ -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
-DSOFTFLOAT_FAST_DIV64TO32 -DSOFTFLOAT_FAST_DIV64TO32
DELETE = rm -f DELETE = rm -f
C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
COMPILE_C = \ COMPILE_C = \
gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \ gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \
$(C_INCLUDES) -O2 -o $@ $(C_INCLUDES) -O2 -o $@
MAKELIB = ar crs $@ MAKELIB = ar crs $@
OBJ = .o OBJ = .o
LIB = .a LIB = .a
OTHER_HEADERS = OTHER_HEADERS =
.PHONY: all .PHONY: all
all: softfloat$(LIB) all: softfloat$(LIB)
OBJS_PRIMITIVES = \ OBJS_PRIMITIVES = \
s_compare96M$(OBJ) \ s_compare96M$(OBJ) \
s_compare128M$(OBJ) \ s_compare128M$(OBJ) \
s_shortShiftLeft64To96M$(OBJ) \ s_shortShiftLeft64To96M$(OBJ) \
s_shortShiftLeftM$(OBJ) \ s_shortShiftLeftM$(OBJ) \
s_shiftLeftM$(OBJ) \ s_shiftLeftM$(OBJ) \
s_shortShiftRightM$(OBJ) \ s_shortShiftRightM$(OBJ) \
s_shortShiftRightJam64$(OBJ) \ s_shortShiftRightJam64$(OBJ) \
s_shortShiftRightJamM$(OBJ) \ s_shortShiftRightJamM$(OBJ) \
s_shiftRightJam32$(OBJ) \ s_shiftRightJam32$(OBJ) \
s_shiftRightJam64$(OBJ) \ s_shiftRightJam64$(OBJ) \
s_shiftRightJamM$(OBJ) \ s_shiftRightJamM$(OBJ) \
s_shiftRightM$(OBJ) \ s_shiftRightM$(OBJ) \
s_countLeadingZeros8$(OBJ) \ s_countLeadingZeros8$(OBJ) \
s_countLeadingZeros16$(OBJ) \ s_countLeadingZeros16$(OBJ) \
s_countLeadingZeros32$(OBJ) \ s_countLeadingZeros32$(OBJ) \
s_countLeadingZeros64$(OBJ) \ s_countLeadingZeros64$(OBJ) \
s_addM$(OBJ) \ s_addM$(OBJ) \
s_addCarryM$(OBJ) \ s_addCarryM$(OBJ) \
s_addComplCarryM$(OBJ) \ s_addComplCarryM$(OBJ) \
s_negXM$(OBJ) \ s_negXM$(OBJ) \
s_sub1XM$(OBJ) \ s_sub1XM$(OBJ) \
s_subM$(OBJ) \ s_subM$(OBJ) \
s_mul64To128M$(OBJ) \ s_mul64To128M$(OBJ) \
s_mul128MTo256M$(OBJ) \ s_mul128MTo256M$(OBJ) \
s_approxRecip_1Ks$(OBJ) \ s_approxRecip_1Ks$(OBJ) \
s_approxRecip32_1$(OBJ) \ s_approxRecip32_1$(OBJ) \
s_approxRecipSqrt_1Ks$(OBJ) \ s_approxRecipSqrt_1Ks$(OBJ) \
s_approxRecipSqrt32_1$(OBJ) \ s_approxRecipSqrt32_1$(OBJ) \
s_remStepMBy32$(OBJ) \ s_remStepMBy32$(OBJ) \
OBJS_SPECIALIZE = \ OBJS_SPECIALIZE = \
softfloat_raiseFlags$(OBJ) \ softfloat_raiseFlags$(OBJ) \
s_f16UIToCommonNaN$(OBJ) \ s_f16UIToCommonNaN$(OBJ) \
s_commonNaNToF16UI$(OBJ) \ s_commonNaNToF16UI$(OBJ) \
s_propagateNaNF16UI$(OBJ) \ s_propagateNaNF16UI$(OBJ) \
s_f32UIToCommonNaN$(OBJ) \ s_f32UIToCommonNaN$(OBJ) \
s_commonNaNToF32UI$(OBJ) \ s_commonNaNToF32UI$(OBJ) \
s_propagateNaNF32UI$(OBJ) \ s_propagateNaNF32UI$(OBJ) \
s_f64UIToCommonNaN$(OBJ) \ s_f64UIToCommonNaN$(OBJ) \
s_commonNaNToF64UI$(OBJ) \ s_commonNaNToF64UI$(OBJ) \
s_propagateNaNF64UI$(OBJ) \ s_propagateNaNF64UI$(OBJ) \
extF80M_isSignalingNaN$(OBJ) \ extF80M_isSignalingNaN$(OBJ) \
s_extF80MToCommonNaN$(OBJ) \ s_extF80MToCommonNaN$(OBJ) \
s_commonNaNToExtF80M$(OBJ) \ s_commonNaNToExtF80M$(OBJ) \
s_propagateNaNExtF80M$(OBJ) \ s_propagateNaNExtF80M$(OBJ) \
f128M_isSignalingNaN$(OBJ) \ f128M_isSignalingNaN$(OBJ) \
s_f128MToCommonNaN$(OBJ) \ s_f128MToCommonNaN$(OBJ) \
s_commonNaNToF128M$(OBJ) \ s_commonNaNToF128M$(OBJ) \
s_propagateNaNF128M$(OBJ) \ s_propagateNaNF128M$(OBJ) \
OBJS_OTHERS = \ OBJS_OTHERS = \
s_roundToUI32$(OBJ) \ s_roundToUI32$(OBJ) \
s_roundMToUI64$(OBJ) \ s_roundMToUI64$(OBJ) \
s_roundToI32$(OBJ) \ s_roundToI32$(OBJ) \
s_roundMToI64$(OBJ) \ s_roundMToI64$(OBJ) \
s_normSubnormalF16Sig$(OBJ) \ s_normSubnormalF16Sig$(OBJ) \
s_roundPackToF16$(OBJ) \ s_roundPackToF16$(OBJ) \
s_normRoundPackToF16$(OBJ) \ s_normRoundPackToF16$(OBJ) \
s_addMagsF16$(OBJ) \ s_addMagsF16$(OBJ) \
s_subMagsF16$(OBJ) \ s_subMagsF16$(OBJ) \
s_mulAddF16$(OBJ) \ s_mulAddF16$(OBJ) \
s_normSubnormalF32Sig$(OBJ) \ s_normSubnormalF32Sig$(OBJ) \
s_roundPackToF32$(OBJ) \ s_roundPackToF32$(OBJ) \
s_normRoundPackToF32$(OBJ) \ s_normRoundPackToF32$(OBJ) \
s_addMagsF32$(OBJ) \ s_addMagsF32$(OBJ) \
s_subMagsF32$(OBJ) \ s_subMagsF32$(OBJ) \
s_mulAddF32$(OBJ) \ s_mulAddF32$(OBJ) \
s_normSubnormalF64Sig$(OBJ) \ s_normSubnormalF64Sig$(OBJ) \
s_roundPackToF64$(OBJ) \ s_roundPackToF64$(OBJ) \
s_normRoundPackToF64$(OBJ) \ s_normRoundPackToF64$(OBJ) \
s_addMagsF64$(OBJ) \ s_addMagsF64$(OBJ) \
s_subMagsF64$(OBJ) \ s_subMagsF64$(OBJ) \
s_mulAddF64$(OBJ) \ s_mulAddF64$(OBJ) \
s_tryPropagateNaNExtF80M$(OBJ) \ s_tryPropagateNaNExtF80M$(OBJ) \
s_invalidExtF80M$(OBJ) \ s_invalidExtF80M$(OBJ) \
s_normExtF80SigM$(OBJ) \ s_normExtF80SigM$(OBJ) \
s_roundPackMToExtF80M$(OBJ) \ s_roundPackMToExtF80M$(OBJ) \
s_normRoundPackMToExtF80M$(OBJ) \ s_normRoundPackMToExtF80M$(OBJ) \
s_addExtF80M$(OBJ) \ s_addExtF80M$(OBJ) \
s_compareNonnormExtF80M$(OBJ) \ s_compareNonnormExtF80M$(OBJ) \
s_isNaNF128M$(OBJ) \ s_isNaNF128M$(OBJ) \
s_tryPropagateNaNF128M$(OBJ) \ s_tryPropagateNaNF128M$(OBJ) \
s_invalidF128M$(OBJ) \ s_invalidF128M$(OBJ) \
s_shiftNormSigF128M$(OBJ) \ s_shiftNormSigF128M$(OBJ) \
s_roundPackMToF128M$(OBJ) \ s_roundPackMToF128M$(OBJ) \
s_normRoundPackMToF128M$(OBJ) \ s_normRoundPackMToF128M$(OBJ) \
s_addF128M$(OBJ) \ s_addF128M$(OBJ) \
s_mulAddF128M$(OBJ) \ s_mulAddF128M$(OBJ) \
softfloat_state$(OBJ) \ softfloat_state$(OBJ) \
ui32_to_f16$(OBJ) \ ui32_to_f16$(OBJ) \
ui32_to_f32$(OBJ) \ ui32_to_f32$(OBJ) \
ui32_to_f64$(OBJ) \ ui32_to_f64$(OBJ) \
ui32_to_extF80M$(OBJ) \ ui32_to_extF80M$(OBJ) \
ui32_to_f128M$(OBJ) \ ui32_to_f128M$(OBJ) \
ui64_to_f16$(OBJ) \ ui64_to_f16$(OBJ) \
ui64_to_f32$(OBJ) \ ui64_to_f32$(OBJ) \
ui64_to_f64$(OBJ) \ ui64_to_f64$(OBJ) \
ui64_to_extF80M$(OBJ) \ ui64_to_extF80M$(OBJ) \
ui64_to_f128M$(OBJ) \ ui64_to_f128M$(OBJ) \
i32_to_f16$(OBJ) \ i32_to_f16$(OBJ) \
i32_to_f32$(OBJ) \ i32_to_f32$(OBJ) \
i32_to_f64$(OBJ) \ i32_to_f64$(OBJ) \
i32_to_extF80M$(OBJ) \ i32_to_extF80M$(OBJ) \
i32_to_f128M$(OBJ) \ i32_to_f128M$(OBJ) \
i64_to_f16$(OBJ) \ i64_to_f16$(OBJ) \
i64_to_f32$(OBJ) \ i64_to_f32$(OBJ) \
i64_to_f64$(OBJ) \ i64_to_f64$(OBJ) \
i64_to_extF80M$(OBJ) \ i64_to_extF80M$(OBJ) \
i64_to_f128M$(OBJ) \ i64_to_f128M$(OBJ) \
f16_to_ui32$(OBJ) \ f16_to_ui32$(OBJ) \
f16_to_ui64$(OBJ) \ f16_to_ui64$(OBJ) \
f16_to_i32$(OBJ) \ f16_to_i32$(OBJ) \
f16_to_i64$(OBJ) \ f16_to_i64$(OBJ) \
f16_to_ui32_r_minMag$(OBJ) \ f16_to_ui32_r_minMag$(OBJ) \
f16_to_ui64_r_minMag$(OBJ) \ f16_to_ui64_r_minMag$(OBJ) \
f16_to_i32_r_minMag$(OBJ) \ f16_to_i32_r_minMag$(OBJ) \
f16_to_i64_r_minMag$(OBJ) \ f16_to_i64_r_minMag$(OBJ) \
f16_to_f32$(OBJ) \ f16_to_f32$(OBJ) \
f16_to_f64$(OBJ) \ f16_to_f64$(OBJ) \
f16_to_extF80M$(OBJ) \ f16_to_extF80M$(OBJ) \
f16_to_f128M$(OBJ) \ f16_to_f128M$(OBJ) \
f16_roundToInt$(OBJ) \ f16_roundToInt$(OBJ) \
f16_add$(OBJ) \ f16_add$(OBJ) \
f16_sub$(OBJ) \ f16_sub$(OBJ) \
f16_mul$(OBJ) \ f16_mul$(OBJ) \
f16_mulAdd$(OBJ) \ f16_mulAdd$(OBJ) \
f16_div$(OBJ) \ f16_div$(OBJ) \
f16_rem$(OBJ) \ f16_rem$(OBJ) \
f16_sqrt$(OBJ) \ f16_sqrt$(OBJ) \
f16_eq$(OBJ) \ f16_eq$(OBJ) \
f16_le$(OBJ) \ f16_le$(OBJ) \
f16_lt$(OBJ) \ f16_lt$(OBJ) \
f16_eq_signaling$(OBJ) \ f16_eq_signaling$(OBJ) \
f16_le_quiet$(OBJ) \ f16_le_quiet$(OBJ) \
f16_lt_quiet$(OBJ) \ f16_lt_quiet$(OBJ) \
f16_isSignalingNaN$(OBJ) \ f16_isSignalingNaN$(OBJ) \
f32_to_ui32$(OBJ) \ f32_to_ui32$(OBJ) \
f32_to_ui64$(OBJ) \ f32_to_ui64$(OBJ) \
f32_to_i32$(OBJ) \ f32_to_i32$(OBJ) \
f32_to_i64$(OBJ) \ f32_to_i64$(OBJ) \
f32_to_ui32_r_minMag$(OBJ) \ f32_to_ui32_r_minMag$(OBJ) \
f32_to_ui64_r_minMag$(OBJ) \ f32_to_ui64_r_minMag$(OBJ) \
f32_to_i32_r_minMag$(OBJ) \ f32_to_i32_r_minMag$(OBJ) \
f32_to_i64_r_minMag$(OBJ) \ f32_to_i64_r_minMag$(OBJ) \
f32_to_f16$(OBJ) \ f32_to_f16$(OBJ) \
f32_to_f64$(OBJ) \ f32_to_f64$(OBJ) \
f32_to_extF80M$(OBJ) \ f32_to_extF80M$(OBJ) \
f32_to_f128M$(OBJ) \ f32_to_f128M$(OBJ) \
f32_roundToInt$(OBJ) \ f32_roundToInt$(OBJ) \
f32_add$(OBJ) \ f32_add$(OBJ) \
f32_sub$(OBJ) \ f32_sub$(OBJ) \
f32_mul$(OBJ) \ f32_mul$(OBJ) \
f32_mulAdd$(OBJ) \ f32_mulAdd$(OBJ) \
f32_div$(OBJ) \ f32_div$(OBJ) \
f32_rem$(OBJ) \ f32_rem$(OBJ) \
f32_sqrt$(OBJ) \ f32_sqrt$(OBJ) \
f32_eq$(OBJ) \ f32_eq$(OBJ) \
f32_le$(OBJ) \ f32_le$(OBJ) \
f32_lt$(OBJ) \ f32_lt$(OBJ) \
f32_eq_signaling$(OBJ) \ f32_eq_signaling$(OBJ) \
f32_le_quiet$(OBJ) \ f32_le_quiet$(OBJ) \
f32_lt_quiet$(OBJ) \ f32_lt_quiet$(OBJ) \
f32_isSignalingNaN$(OBJ) \ f32_isSignalingNaN$(OBJ) \
f64_to_ui32$(OBJ) \ f64_to_ui32$(OBJ) \
f64_to_ui64$(OBJ) \ f64_to_ui64$(OBJ) \
f64_to_i32$(OBJ) \ f64_to_i32$(OBJ) \
f64_to_i64$(OBJ) \ f64_to_i64$(OBJ) \
f64_to_ui32_r_minMag$(OBJ) \ f64_to_ui32_r_minMag$(OBJ) \
f64_to_ui64_r_minMag$(OBJ) \ f64_to_ui64_r_minMag$(OBJ) \
f64_to_i32_r_minMag$(OBJ) \ f64_to_i32_r_minMag$(OBJ) \
f64_to_i64_r_minMag$(OBJ) \ f64_to_i64_r_minMag$(OBJ) \
f64_to_f16$(OBJ) \ f64_to_f16$(OBJ) \
f64_to_f32$(OBJ) \ f64_to_f32$(OBJ) \
f64_to_extF80M$(OBJ) \ f64_to_extF80M$(OBJ) \
f64_to_f128M$(OBJ) \ f64_to_f128M$(OBJ) \
f64_roundToInt$(OBJ) \ f64_roundToInt$(OBJ) \
f64_add$(OBJ) \ f64_add$(OBJ) \
f64_sub$(OBJ) \ f64_sub$(OBJ) \
f64_mul$(OBJ) \ f64_mul$(OBJ) \
f64_mulAdd$(OBJ) \ f64_mulAdd$(OBJ) \
f64_div$(OBJ) \ f64_div$(OBJ) \
f64_rem$(OBJ) \ f64_rem$(OBJ) \
f64_sqrt$(OBJ) \ f64_sqrt$(OBJ) \
f64_eq$(OBJ) \ f64_eq$(OBJ) \
f64_le$(OBJ) \ f64_le$(OBJ) \
f64_lt$(OBJ) \ f64_lt$(OBJ) \
f64_eq_signaling$(OBJ) \ f64_eq_signaling$(OBJ) \
f64_le_quiet$(OBJ) \ f64_le_quiet$(OBJ) \
f64_lt_quiet$(OBJ) \ f64_lt_quiet$(OBJ) \
f64_isSignalingNaN$(OBJ) \ f64_isSignalingNaN$(OBJ) \
extF80M_to_ui32$(OBJ) \ extF80M_to_ui32$(OBJ) \
extF80M_to_ui64$(OBJ) \ extF80M_to_ui64$(OBJ) \
extF80M_to_i32$(OBJ) \ extF80M_to_i32$(OBJ) \
extF80M_to_i64$(OBJ) \ extF80M_to_i64$(OBJ) \
extF80M_to_ui32_r_minMag$(OBJ) \ extF80M_to_ui32_r_minMag$(OBJ) \
extF80M_to_ui64_r_minMag$(OBJ) \ extF80M_to_ui64_r_minMag$(OBJ) \
extF80M_to_i32_r_minMag$(OBJ) \ extF80M_to_i32_r_minMag$(OBJ) \
extF80M_to_i64_r_minMag$(OBJ) \ extF80M_to_i64_r_minMag$(OBJ) \
extF80M_to_f16$(OBJ) \ extF80M_to_f16$(OBJ) \
extF80M_to_f32$(OBJ) \ extF80M_to_f32$(OBJ) \
extF80M_to_f64$(OBJ) \ extF80M_to_f64$(OBJ) \
extF80M_to_f128M$(OBJ) \ extF80M_to_f128M$(OBJ) \
extF80M_roundToInt$(OBJ) \ extF80M_roundToInt$(OBJ) \
extF80M_add$(OBJ) \ extF80M_add$(OBJ) \
extF80M_sub$(OBJ) \ extF80M_sub$(OBJ) \
extF80M_mul$(OBJ) \ extF80M_mul$(OBJ) \
extF80M_div$(OBJ) \ extF80M_div$(OBJ) \
extF80M_rem$(OBJ) \ extF80M_rem$(OBJ) \
extF80M_sqrt$(OBJ) \ extF80M_sqrt$(OBJ) \
extF80M_eq$(OBJ) \ extF80M_eq$(OBJ) \
extF80M_le$(OBJ) \ extF80M_le$(OBJ) \
extF80M_lt$(OBJ) \ extF80M_lt$(OBJ) \
extF80M_eq_signaling$(OBJ) \ extF80M_eq_signaling$(OBJ) \
extF80M_le_quiet$(OBJ) \ extF80M_le_quiet$(OBJ) \
extF80M_lt_quiet$(OBJ) \ extF80M_lt_quiet$(OBJ) \
f128M_to_ui32$(OBJ) \ f128M_to_ui32$(OBJ) \
f128M_to_ui64$(OBJ) \ f128M_to_ui64$(OBJ) \
f128M_to_i32$(OBJ) \ f128M_to_i32$(OBJ) \
f128M_to_i64$(OBJ) \ f128M_to_i64$(OBJ) \
f128M_to_ui32_r_minMag$(OBJ) \ f128M_to_ui32_r_minMag$(OBJ) \
f128M_to_ui64_r_minMag$(OBJ) \ f128M_to_ui64_r_minMag$(OBJ) \
f128M_to_i32_r_minMag$(OBJ) \ f128M_to_i32_r_minMag$(OBJ) \
f128M_to_i64_r_minMag$(OBJ) \ f128M_to_i64_r_minMag$(OBJ) \
f128M_to_f16$(OBJ) \ f128M_to_f16$(OBJ) \
f128M_to_f32$(OBJ) \ f128M_to_f32$(OBJ) \
f128M_to_f64$(OBJ) \ f128M_to_f64$(OBJ) \
f128M_to_extF80M$(OBJ) \ f128M_to_extF80M$(OBJ) \
f128M_roundToInt$(OBJ) \ f128M_roundToInt$(OBJ) \
f128M_add$(OBJ) \ f128M_add$(OBJ) \
f128M_sub$(OBJ) \ f128M_sub$(OBJ) \
f128M_mul$(OBJ) \ f128M_mul$(OBJ) \
f128M_mulAdd$(OBJ) \ f128M_mulAdd$(OBJ) \
f128M_div$(OBJ) \ f128M_div$(OBJ) \
f128M_rem$(OBJ) \ f128M_rem$(OBJ) \
f128M_sqrt$(OBJ) \ f128M_sqrt$(OBJ) \
f128M_eq$(OBJ) \ f128M_eq$(OBJ) \
f128M_le$(OBJ) \ f128M_le$(OBJ) \
f128M_lt$(OBJ) \ f128M_lt$(OBJ) \
f128M_eq_signaling$(OBJ) \ f128M_eq_signaling$(OBJ) \
f128M_le_quiet$(OBJ) \ f128M_le_quiet$(OBJ) \
f128M_lt_quiet$(OBJ) \ f128M_lt_quiet$(OBJ) \
OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS) OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS)
$(OBJS_ALL): \ $(OBJS_ALL): \
$(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \ $(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \
$(SOURCE_DIR)/include/primitives.h $(SOURCE_DIR)/include/primitives.h
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \ $(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \ $(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \ $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
$(SOURCE_DIR)/include/softfloat.h $(SOURCE_DIR)/include/softfloat.h
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c $(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$*.c
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c $(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
softfloat$(LIB): $(OBJS_ALL) softfloat$(LIB): $(OBJS_ALL)
$(DELETE) $@ $(DELETE) $@
$(MAKELIB) $^ $(MAKELIB) $^
.PHONY: clean .PHONY: clean
clean: clean:
$(DELETE) $(OBJS_ALL) softfloat$(LIB) $(DELETE) $(OBJS_ALL) softfloat$(LIB)

View File

@ -1,52 +1,53 @@
/*============================================================================ /*============================================================================
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
University of California. All rights reserved. University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define LITTLEENDIAN 1 #define LITTLEENDIAN 1
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#ifdef __GNUC_STDC_INLINE__ #ifdef __GNUC_STDC_INLINE__
#define INLINE inline #define INLINE inline
#else #else
#define INLINE extern inline #define INLINE extern inline
#endif #endif
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define SOFTFLOAT_BUILTIN_CLZ 1 #define SOFTFLOAT_BUILTIN_CLZ 1
#include "opts-GCC.h" #include "opts-GCC.h"

View File

@ -1,390 +1,390 @@
#============================================================================= #=============================================================================
# #
# This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic # This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic
# Package, Release 3e, by John R. Hauser. # Package, Release 3e, by John R. Hauser.
# #
# Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the # Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
# University of California. All rights reserved. # University of California. All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met: # modification, are permitted provided that the following conditions are met:
# #
# 1. Redistributions of source code must retain the above copyright notice, # 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer. # this list of conditions, and the following disclaimer.
# #
# 2. Redistributions in binary form must reproduce the above copyright # 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in the # notice, this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution. # documentation and/or other materials provided with the distribution.
# #
# 3. Neither the name of the University nor the names of its contributors # 3. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software # may be used to endorse or promote products derived from this software
# without specific prior written permission. # without specific prior written permission.
# #
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# #
#============================================================================= #=============================================================================
SOURCE_DIR ?= ../../source SOURCE_DIR ?= ../../source
SPECIALIZE_TYPE ?= 8086-SSE SPECIALIZE_TYPE ?= 8086-SSE
SOFTFLOAT_OPTS ?= \ SOFTFLOAT_OPTS ?= \
-DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \ -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
-DSOFTFLOAT_FAST_DIV64TO32 -DSOFTFLOAT_FAST_DIV64TO32
DELETE = rm -f DELETE = rm -f
C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
COMPILE_C = \ COMPILE_C = \
x86_64-w64-mingw32-gcc -c -Werror-implicit-function-declaration \ x86_64-w64-mingw32-gcc -c -Werror-implicit-function-declaration \
-DSOFTFLOAT_FAST_INT64 $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@ -DSOFTFLOAT_FAST_INT64 $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@
MAKELIB = x86_64-w64-mingw32-ar crs $@ MAKELIB = x86_64-w64-mingw32-ar crs $@
OBJ = .o OBJ = .o
LIB = .a LIB = .a
OTHER_HEADERS = $(SOURCE_DIR)/include/opts-GCC.h OTHER_HEADERS = $(SOURCE_DIR)/include/opts-GCC.h
.PHONY: all .PHONY: all
all: softfloat$(LIB) all: softfloat$(LIB)
OBJS_PRIMITIVES = \ OBJS_PRIMITIVES = \
s_eq128$(OBJ) \ s_eq128$(OBJ) \
s_le128$(OBJ) \ s_le128$(OBJ) \
s_lt128$(OBJ) \ s_lt128$(OBJ) \
s_shortShiftLeft128$(OBJ) \ s_shortShiftLeft128$(OBJ) \
s_shortShiftRight128$(OBJ) \ s_shortShiftRight128$(OBJ) \
s_shortShiftRightJam64$(OBJ) \ s_shortShiftRightJam64$(OBJ) \
s_shortShiftRightJam64Extra$(OBJ) \ s_shortShiftRightJam64Extra$(OBJ) \
s_shortShiftRightJam128$(OBJ) \ s_shortShiftRightJam128$(OBJ) \
s_shortShiftRightJam128Extra$(OBJ) \ s_shortShiftRightJam128Extra$(OBJ) \
s_shiftRightJam32$(OBJ) \ s_shiftRightJam32$(OBJ) \
s_shiftRightJam64$(OBJ) \ s_shiftRightJam64$(OBJ) \
s_shiftRightJam64Extra$(OBJ) \ s_shiftRightJam64Extra$(OBJ) \
s_shiftRightJam128$(OBJ) \ s_shiftRightJam128$(OBJ) \
s_shiftRightJam128Extra$(OBJ) \ s_shiftRightJam128Extra$(OBJ) \
s_shiftRightJam256M$(OBJ) \ s_shiftRightJam256M$(OBJ) \
s_countLeadingZeros8$(OBJ) \ s_countLeadingZeros8$(OBJ) \
s_countLeadingZeros16$(OBJ) \ s_countLeadingZeros16$(OBJ) \
s_countLeadingZeros32$(OBJ) \ s_countLeadingZeros32$(OBJ) \
s_countLeadingZeros64$(OBJ) \ s_countLeadingZeros64$(OBJ) \
s_add128$(OBJ) \ s_add128$(OBJ) \
s_add256M$(OBJ) \ s_add256M$(OBJ) \
s_sub128$(OBJ) \ s_sub128$(OBJ) \
s_sub256M$(OBJ) \ s_sub256M$(OBJ) \
s_mul64ByShifted32To128$(OBJ) \ s_mul64ByShifted32To128$(OBJ) \
s_mul64To128$(OBJ) \ s_mul64To128$(OBJ) \
s_mul128By32$(OBJ) \ s_mul128By32$(OBJ) \
s_mul128To256M$(OBJ) \ s_mul128To256M$(OBJ) \
s_approxRecip_1Ks$(OBJ) \ s_approxRecip_1Ks$(OBJ) \
s_approxRecip32_1$(OBJ) \ s_approxRecip32_1$(OBJ) \
s_approxRecipSqrt_1Ks$(OBJ) \ s_approxRecipSqrt_1Ks$(OBJ) \
s_approxRecipSqrt32_1$(OBJ) \ s_approxRecipSqrt32_1$(OBJ) \
OBJS_SPECIALIZE = \ OBJS_SPECIALIZE = \
softfloat_raiseFlags$(OBJ) \ softfloat_raiseFlags$(OBJ) \
s_f16UIToCommonNaN$(OBJ) \ s_f16UIToCommonNaN$(OBJ) \
s_commonNaNToF16UI$(OBJ) \ s_commonNaNToF16UI$(OBJ) \
s_propagateNaNF16UI$(OBJ) \ s_propagateNaNF16UI$(OBJ) \
s_f32UIToCommonNaN$(OBJ) \ s_f32UIToCommonNaN$(OBJ) \
s_commonNaNToF32UI$(OBJ) \ s_commonNaNToF32UI$(OBJ) \
s_propagateNaNF32UI$(OBJ) \ s_propagateNaNF32UI$(OBJ) \
s_f64UIToCommonNaN$(OBJ) \ s_f64UIToCommonNaN$(OBJ) \
s_commonNaNToF64UI$(OBJ) \ s_commonNaNToF64UI$(OBJ) \
s_propagateNaNF64UI$(OBJ) \ s_propagateNaNF64UI$(OBJ) \
extF80M_isSignalingNaN$(OBJ) \ extF80M_isSignalingNaN$(OBJ) \
s_extF80UIToCommonNaN$(OBJ) \ s_extF80UIToCommonNaN$(OBJ) \
s_commonNaNToExtF80UI$(OBJ) \ s_commonNaNToExtF80UI$(OBJ) \
s_propagateNaNExtF80UI$(OBJ) \ s_propagateNaNExtF80UI$(OBJ) \
f128M_isSignalingNaN$(OBJ) \ f128M_isSignalingNaN$(OBJ) \
s_f128UIToCommonNaN$(OBJ) \ s_f128UIToCommonNaN$(OBJ) \
s_commonNaNToF128UI$(OBJ) \ s_commonNaNToF128UI$(OBJ) \
s_propagateNaNF128UI$(OBJ) \ s_propagateNaNF128UI$(OBJ) \
OBJS_OTHERS = \ OBJS_OTHERS = \
s_roundToUI32$(OBJ) \ s_roundToUI32$(OBJ) \
s_roundToUI64$(OBJ) \ s_roundToUI64$(OBJ) \
s_roundToI32$(OBJ) \ s_roundToI32$(OBJ) \
s_roundToI64$(OBJ) \ s_roundToI64$(OBJ) \
s_normSubnormalF16Sig$(OBJ) \ s_normSubnormalF16Sig$(OBJ) \
s_roundPackToF16$(OBJ) \ s_roundPackToF16$(OBJ) \
s_normRoundPackToF16$(OBJ) \ s_normRoundPackToF16$(OBJ) \
s_addMagsF16$(OBJ) \ s_addMagsF16$(OBJ) \
s_subMagsF16$(OBJ) \ s_subMagsF16$(OBJ) \
s_mulAddF16$(OBJ) \ s_mulAddF16$(OBJ) \
s_normSubnormalF32Sig$(OBJ) \ s_normSubnormalF32Sig$(OBJ) \
s_roundPackToF32$(OBJ) \ s_roundPackToF32$(OBJ) \
s_normRoundPackToF32$(OBJ) \ s_normRoundPackToF32$(OBJ) \
s_addMagsF32$(OBJ) \ s_addMagsF32$(OBJ) \
s_subMagsF32$(OBJ) \ s_subMagsF32$(OBJ) \
s_mulAddF32$(OBJ) \ s_mulAddF32$(OBJ) \
s_normSubnormalF64Sig$(OBJ) \ s_normSubnormalF64Sig$(OBJ) \
s_roundPackToF64$(OBJ) \ s_roundPackToF64$(OBJ) \
s_normRoundPackToF64$(OBJ) \ s_normRoundPackToF64$(OBJ) \
s_addMagsF64$(OBJ) \ s_addMagsF64$(OBJ) \
s_subMagsF64$(OBJ) \ s_subMagsF64$(OBJ) \
s_mulAddF64$(OBJ) \ s_mulAddF64$(OBJ) \
s_normSubnormalExtF80Sig$(OBJ) \ s_normSubnormalExtF80Sig$(OBJ) \
s_roundPackToExtF80$(OBJ) \ s_roundPackToExtF80$(OBJ) \
s_normRoundPackToExtF80$(OBJ) \ s_normRoundPackToExtF80$(OBJ) \
s_addMagsExtF80$(OBJ) \ s_addMagsExtF80$(OBJ) \
s_subMagsExtF80$(OBJ) \ s_subMagsExtF80$(OBJ) \
s_normSubnormalF128Sig$(OBJ) \ s_normSubnormalF128Sig$(OBJ) \
s_roundPackToF128$(OBJ) \ s_roundPackToF128$(OBJ) \
s_normRoundPackToF128$(OBJ) \ s_normRoundPackToF128$(OBJ) \
s_addMagsF128$(OBJ) \ s_addMagsF128$(OBJ) \
s_subMagsF128$(OBJ) \ s_subMagsF128$(OBJ) \
s_mulAddF128$(OBJ) \ s_mulAddF128$(OBJ) \
softfloat_state$(OBJ) \ softfloat_state$(OBJ) \
ui32_to_f16$(OBJ) \ ui32_to_f16$(OBJ) \
ui32_to_f32$(OBJ) \ ui32_to_f32$(OBJ) \
ui32_to_f64$(OBJ) \ ui32_to_f64$(OBJ) \
ui32_to_extF80$(OBJ) \ ui32_to_extF80$(OBJ) \
ui32_to_extF80M$(OBJ) \ ui32_to_extF80M$(OBJ) \
ui32_to_f128$(OBJ) \ ui32_to_f128$(OBJ) \
ui32_to_f128M$(OBJ) \ ui32_to_f128M$(OBJ) \
ui64_to_f16$(OBJ) \ ui64_to_f16$(OBJ) \
ui64_to_f32$(OBJ) \ ui64_to_f32$(OBJ) \
ui64_to_f64$(OBJ) \ ui64_to_f64$(OBJ) \
ui64_to_extF80$(OBJ) \ ui64_to_extF80$(OBJ) \
ui64_to_extF80M$(OBJ) \ ui64_to_extF80M$(OBJ) \
ui64_to_f128$(OBJ) \ ui64_to_f128$(OBJ) \
ui64_to_f128M$(OBJ) \ ui64_to_f128M$(OBJ) \
i32_to_f16$(OBJ) \ i32_to_f16$(OBJ) \
i32_to_f32$(OBJ) \ i32_to_f32$(OBJ) \
i32_to_f64$(OBJ) \ i32_to_f64$(OBJ) \
i32_to_extF80$(OBJ) \ i32_to_extF80$(OBJ) \
i32_to_extF80M$(OBJ) \ i32_to_extF80M$(OBJ) \
i32_to_f128$(OBJ) \ i32_to_f128$(OBJ) \
i32_to_f128M$(OBJ) \ i32_to_f128M$(OBJ) \
i64_to_f16$(OBJ) \ i64_to_f16$(OBJ) \
i64_to_f32$(OBJ) \ i64_to_f32$(OBJ) \
i64_to_f64$(OBJ) \ i64_to_f64$(OBJ) \
i64_to_extF80$(OBJ) \ i64_to_extF80$(OBJ) \
i64_to_extF80M$(OBJ) \ i64_to_extF80M$(OBJ) \
i64_to_f128$(OBJ) \ i64_to_f128$(OBJ) \
i64_to_f128M$(OBJ) \ i64_to_f128M$(OBJ) \
f16_to_ui32$(OBJ) \ f16_to_ui32$(OBJ) \
f16_to_ui64$(OBJ) \ f16_to_ui64$(OBJ) \
f16_to_i32$(OBJ) \ f16_to_i32$(OBJ) \
f16_to_i64$(OBJ) \ f16_to_i64$(OBJ) \
f16_to_ui32_r_minMag$(OBJ) \ f16_to_ui32_r_minMag$(OBJ) \
f16_to_ui64_r_minMag$(OBJ) \ f16_to_ui64_r_minMag$(OBJ) \
f16_to_i32_r_minMag$(OBJ) \ f16_to_i32_r_minMag$(OBJ) \
f16_to_i64_r_minMag$(OBJ) \ f16_to_i64_r_minMag$(OBJ) \
f16_to_f32$(OBJ) \ f16_to_f32$(OBJ) \
f16_to_f64$(OBJ) \ f16_to_f64$(OBJ) \
f16_to_extF80$(OBJ) \ f16_to_extF80$(OBJ) \
f16_to_extF80M$(OBJ) \ f16_to_extF80M$(OBJ) \
f16_to_f128$(OBJ) \ f16_to_f128$(OBJ) \
f16_to_f128M$(OBJ) \ f16_to_f128M$(OBJ) \
f16_roundToInt$(OBJ) \ f16_roundToInt$(OBJ) \
f16_add$(OBJ) \ f16_add$(OBJ) \
f16_sub$(OBJ) \ f16_sub$(OBJ) \
f16_mul$(OBJ) \ f16_mul$(OBJ) \
f16_mulAdd$(OBJ) \ f16_mulAdd$(OBJ) \
f16_div$(OBJ) \ f16_div$(OBJ) \
f16_rem$(OBJ) \ f16_rem$(OBJ) \
f16_sqrt$(OBJ) \ f16_sqrt$(OBJ) \
f16_eq$(OBJ) \ f16_eq$(OBJ) \
f16_le$(OBJ) \ f16_le$(OBJ) \
f16_lt$(OBJ) \ f16_lt$(OBJ) \
f16_eq_signaling$(OBJ) \ f16_eq_signaling$(OBJ) \
f16_le_quiet$(OBJ) \ f16_le_quiet$(OBJ) \
f16_lt_quiet$(OBJ) \ f16_lt_quiet$(OBJ) \
f16_isSignalingNaN$(OBJ) \ f16_isSignalingNaN$(OBJ) \
f32_to_ui32$(OBJ) \ f32_to_ui32$(OBJ) \
f32_to_ui64$(OBJ) \ f32_to_ui64$(OBJ) \
f32_to_i32$(OBJ) \ f32_to_i32$(OBJ) \
f32_to_i64$(OBJ) \ f32_to_i64$(OBJ) \
f32_to_ui32_r_minMag$(OBJ) \ f32_to_ui32_r_minMag$(OBJ) \
f32_to_ui64_r_minMag$(OBJ) \ f32_to_ui64_r_minMag$(OBJ) \
f32_to_i32_r_minMag$(OBJ) \ f32_to_i32_r_minMag$(OBJ) \
f32_to_i64_r_minMag$(OBJ) \ f32_to_i64_r_minMag$(OBJ) \
f32_to_f16$(OBJ) \ f32_to_f16$(OBJ) \
f32_to_f64$(OBJ) \ f32_to_f64$(OBJ) \
f32_to_extF80$(OBJ) \ f32_to_extF80$(OBJ) \
f32_to_extF80M$(OBJ) \ f32_to_extF80M$(OBJ) \
f32_to_f128$(OBJ) \ f32_to_f128$(OBJ) \
f32_to_f128M$(OBJ) \ f32_to_f128M$(OBJ) \
f32_roundToInt$(OBJ) \ f32_roundToInt$(OBJ) \
f32_add$(OBJ) \ f32_add$(OBJ) \
f32_sub$(OBJ) \ f32_sub$(OBJ) \
f32_mul$(OBJ) \ f32_mul$(OBJ) \
f32_mulAdd$(OBJ) \ f32_mulAdd$(OBJ) \
f32_div$(OBJ) \ f32_div$(OBJ) \
f32_rem$(OBJ) \ f32_rem$(OBJ) \
f32_sqrt$(OBJ) \ f32_sqrt$(OBJ) \
f32_eq$(OBJ) \ f32_eq$(OBJ) \
f32_le$(OBJ) \ f32_le$(OBJ) \
f32_lt$(OBJ) \ f32_lt$(OBJ) \
f32_eq_signaling$(OBJ) \ f32_eq_signaling$(OBJ) \
f32_le_quiet$(OBJ) \ f32_le_quiet$(OBJ) \
f32_lt_quiet$(OBJ) \ f32_lt_quiet$(OBJ) \
f32_isSignalingNaN$(OBJ) \ f32_isSignalingNaN$(OBJ) \
f64_to_ui32$(OBJ) \ f64_to_ui32$(OBJ) \
f64_to_ui64$(OBJ) \ f64_to_ui64$(OBJ) \
f64_to_i32$(OBJ) \ f64_to_i32$(OBJ) \
f64_to_i64$(OBJ) \ f64_to_i64$(OBJ) \
f64_to_ui32_r_minMag$(OBJ) \ f64_to_ui32_r_minMag$(OBJ) \
f64_to_ui64_r_minMag$(OBJ) \ f64_to_ui64_r_minMag$(OBJ) \
f64_to_i32_r_minMag$(OBJ) \ f64_to_i32_r_minMag$(OBJ) \
f64_to_i64_r_minMag$(OBJ) \ f64_to_i64_r_minMag$(OBJ) \
f64_to_f16$(OBJ) \ f64_to_f16$(OBJ) \
f64_to_f32$(OBJ) \ f64_to_f32$(OBJ) \
f64_to_extF80$(OBJ) \ f64_to_extF80$(OBJ) \
f64_to_extF80M$(OBJ) \ f64_to_extF80M$(OBJ) \
f64_to_f128$(OBJ) \ f64_to_f128$(OBJ) \
f64_to_f128M$(OBJ) \ f64_to_f128M$(OBJ) \
f64_roundToInt$(OBJ) \ f64_roundToInt$(OBJ) \
f64_add$(OBJ) \ f64_add$(OBJ) \
f64_sub$(OBJ) \ f64_sub$(OBJ) \
f64_mul$(OBJ) \ f64_mul$(OBJ) \
f64_mulAdd$(OBJ) \ f64_mulAdd$(OBJ) \
f64_div$(OBJ) \ f64_div$(OBJ) \
f64_rem$(OBJ) \ f64_rem$(OBJ) \
f64_sqrt$(OBJ) \ f64_sqrt$(OBJ) \
f64_eq$(OBJ) \ f64_eq$(OBJ) \
f64_le$(OBJ) \ f64_le$(OBJ) \
f64_lt$(OBJ) \ f64_lt$(OBJ) \
f64_eq_signaling$(OBJ) \ f64_eq_signaling$(OBJ) \
f64_le_quiet$(OBJ) \ f64_le_quiet$(OBJ) \
f64_lt_quiet$(OBJ) \ f64_lt_quiet$(OBJ) \
f64_isSignalingNaN$(OBJ) \ f64_isSignalingNaN$(OBJ) \
extF80_to_ui32$(OBJ) \ extF80_to_ui32$(OBJ) \
extF80_to_ui64$(OBJ) \ extF80_to_ui64$(OBJ) \
extF80_to_i32$(OBJ) \ extF80_to_i32$(OBJ) \
extF80_to_i64$(OBJ) \ extF80_to_i64$(OBJ) \
extF80_to_ui32_r_minMag$(OBJ) \ extF80_to_ui32_r_minMag$(OBJ) \
extF80_to_ui64_r_minMag$(OBJ) \ extF80_to_ui64_r_minMag$(OBJ) \
extF80_to_i32_r_minMag$(OBJ) \ extF80_to_i32_r_minMag$(OBJ) \
extF80_to_i64_r_minMag$(OBJ) \ extF80_to_i64_r_minMag$(OBJ) \
extF80_to_f16$(OBJ) \ extF80_to_f16$(OBJ) \
extF80_to_f32$(OBJ) \ extF80_to_f32$(OBJ) \
extF80_to_f64$(OBJ) \ extF80_to_f64$(OBJ) \
extF80_to_f128$(OBJ) \ extF80_to_f128$(OBJ) \
extF80_roundToInt$(OBJ) \ extF80_roundToInt$(OBJ) \
extF80_add$(OBJ) \ extF80_add$(OBJ) \
extF80_sub$(OBJ) \ extF80_sub$(OBJ) \
extF80_mul$(OBJ) \ extF80_mul$(OBJ) \
extF80_div$(OBJ) \ extF80_div$(OBJ) \
extF80_rem$(OBJ) \ extF80_rem$(OBJ) \
extF80_sqrt$(OBJ) \ extF80_sqrt$(OBJ) \
extF80_eq$(OBJ) \ extF80_eq$(OBJ) \
extF80_le$(OBJ) \ extF80_le$(OBJ) \
extF80_lt$(OBJ) \ extF80_lt$(OBJ) \
extF80_eq_signaling$(OBJ) \ extF80_eq_signaling$(OBJ) \
extF80_le_quiet$(OBJ) \ extF80_le_quiet$(OBJ) \
extF80_lt_quiet$(OBJ) \ extF80_lt_quiet$(OBJ) \
extF80_isSignalingNaN$(OBJ) \ extF80_isSignalingNaN$(OBJ) \
extF80M_to_ui32$(OBJ) \ extF80M_to_ui32$(OBJ) \
extF80M_to_ui64$(OBJ) \ extF80M_to_ui64$(OBJ) \
extF80M_to_i32$(OBJ) \ extF80M_to_i32$(OBJ) \
extF80M_to_i64$(OBJ) \ extF80M_to_i64$(OBJ) \
extF80M_to_ui32_r_minMag$(OBJ) \ extF80M_to_ui32_r_minMag$(OBJ) \
extF80M_to_ui64_r_minMag$(OBJ) \ extF80M_to_ui64_r_minMag$(OBJ) \
extF80M_to_i32_r_minMag$(OBJ) \ extF80M_to_i32_r_minMag$(OBJ) \
extF80M_to_i64_r_minMag$(OBJ) \ extF80M_to_i64_r_minMag$(OBJ) \
extF80M_to_f16$(OBJ) \ extF80M_to_f16$(OBJ) \
extF80M_to_f32$(OBJ) \ extF80M_to_f32$(OBJ) \
extF80M_to_f64$(OBJ) \ extF80M_to_f64$(OBJ) \
extF80M_to_f128M$(OBJ) \ extF80M_to_f128M$(OBJ) \
extF80M_roundToInt$(OBJ) \ extF80M_roundToInt$(OBJ) \
extF80M_add$(OBJ) \ extF80M_add$(OBJ) \
extF80M_sub$(OBJ) \ extF80M_sub$(OBJ) \
extF80M_mul$(OBJ) \ extF80M_mul$(OBJ) \
extF80M_div$(OBJ) \ extF80M_div$(OBJ) \
extF80M_rem$(OBJ) \ extF80M_rem$(OBJ) \
extF80M_sqrt$(OBJ) \ extF80M_sqrt$(OBJ) \
extF80M_eq$(OBJ) \ extF80M_eq$(OBJ) \
extF80M_le$(OBJ) \ extF80M_le$(OBJ) \
extF80M_lt$(OBJ) \ extF80M_lt$(OBJ) \
extF80M_eq_signaling$(OBJ) \ extF80M_eq_signaling$(OBJ) \
extF80M_le_quiet$(OBJ) \ extF80M_le_quiet$(OBJ) \
extF80M_lt_quiet$(OBJ) \ extF80M_lt_quiet$(OBJ) \
f128_to_ui32$(OBJ) \ f128_to_ui32$(OBJ) \
f128_to_ui64$(OBJ) \ f128_to_ui64$(OBJ) \
f128_to_i32$(OBJ) \ f128_to_i32$(OBJ) \
f128_to_i64$(OBJ) \ f128_to_i64$(OBJ) \
f128_to_ui32_r_minMag$(OBJ) \ f128_to_ui32_r_minMag$(OBJ) \
f128_to_ui64_r_minMag$(OBJ) \ f128_to_ui64_r_minMag$(OBJ) \
f128_to_i32_r_minMag$(OBJ) \ f128_to_i32_r_minMag$(OBJ) \
f128_to_i64_r_minMag$(OBJ) \ f128_to_i64_r_minMag$(OBJ) \
f128_to_f16$(OBJ) \ f128_to_f16$(OBJ) \
f128_to_f32$(OBJ) \ f128_to_f32$(OBJ) \
f128_to_extF80$(OBJ) \ f128_to_extF80$(OBJ) \
f128_to_f64$(OBJ) \ f128_to_f64$(OBJ) \
f128_roundToInt$(OBJ) \ f128_roundToInt$(OBJ) \
f128_add$(OBJ) \ f128_add$(OBJ) \
f128_sub$(OBJ) \ f128_sub$(OBJ) \
f128_mul$(OBJ) \ f128_mul$(OBJ) \
f128_mulAdd$(OBJ) \ f128_mulAdd$(OBJ) \
f128_div$(OBJ) \ f128_div$(OBJ) \
f128_rem$(OBJ) \ f128_rem$(OBJ) \
f128_sqrt$(OBJ) \ f128_sqrt$(OBJ) \
f128_eq$(OBJ) \ f128_eq$(OBJ) \
f128_le$(OBJ) \ f128_le$(OBJ) \
f128_lt$(OBJ) \ f128_lt$(OBJ) \
f128_eq_signaling$(OBJ) \ f128_eq_signaling$(OBJ) \
f128_le_quiet$(OBJ) \ f128_le_quiet$(OBJ) \
f128_lt_quiet$(OBJ) \ f128_lt_quiet$(OBJ) \
f128_isSignalingNaN$(OBJ) \ f128_isSignalingNaN$(OBJ) \
f128M_to_ui32$(OBJ) \ f128M_to_ui32$(OBJ) \
f128M_to_ui64$(OBJ) \ f128M_to_ui64$(OBJ) \
f128M_to_i32$(OBJ) \ f128M_to_i32$(OBJ) \
f128M_to_i64$(OBJ) \ f128M_to_i64$(OBJ) \
f128M_to_ui32_r_minMag$(OBJ) \ f128M_to_ui32_r_minMag$(OBJ) \
f128M_to_ui64_r_minMag$(OBJ) \ f128M_to_ui64_r_minMag$(OBJ) \
f128M_to_i32_r_minMag$(OBJ) \ f128M_to_i32_r_minMag$(OBJ) \
f128M_to_i64_r_minMag$(OBJ) \ f128M_to_i64_r_minMag$(OBJ) \
f128M_to_f16$(OBJ) \ f128M_to_f16$(OBJ) \
f128M_to_f32$(OBJ) \ f128M_to_f32$(OBJ) \
f128M_to_extF80M$(OBJ) \ f128M_to_extF80M$(OBJ) \
f128M_to_f64$(OBJ) \ f128M_to_f64$(OBJ) \
f128M_roundToInt$(OBJ) \ f128M_roundToInt$(OBJ) \
f128M_add$(OBJ) \ f128M_add$(OBJ) \
f128M_sub$(OBJ) \ f128M_sub$(OBJ) \
f128M_mul$(OBJ) \ f128M_mul$(OBJ) \
f128M_mulAdd$(OBJ) \ f128M_mulAdd$(OBJ) \
f128M_div$(OBJ) \ f128M_div$(OBJ) \
f128M_rem$(OBJ) \ f128M_rem$(OBJ) \
f128M_sqrt$(OBJ) \ f128M_sqrt$(OBJ) \
f128M_eq$(OBJ) \ f128M_eq$(OBJ) \
f128M_le$(OBJ) \ f128M_le$(OBJ) \
f128M_lt$(OBJ) \ f128M_lt$(OBJ) \
f128M_eq_signaling$(OBJ) \ f128M_eq_signaling$(OBJ) \
f128M_le_quiet$(OBJ) \ f128M_le_quiet$(OBJ) \
f128M_lt_quiet$(OBJ) \ f128M_lt_quiet$(OBJ) \
OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS) OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS)
$(OBJS_ALL): \ $(OBJS_ALL): \
$(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \ $(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \
$(SOURCE_DIR)/include/primitives.h $(SOURCE_DIR)/include/primitives.h
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \ $(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \ $(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \ $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
$(SOURCE_DIR)/include/softfloat.h $(SOURCE_DIR)/include/softfloat.h
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c $(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$*.c
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c $(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
softfloat$(LIB): $(OBJS_ALL) softfloat$(LIB): $(OBJS_ALL)
$(DELETE) $@ $(DELETE) $@
$(MAKELIB) $^ $(MAKELIB) $^
.PHONY: clean .PHONY: clean
clean: clean:
$(DELETE) $(OBJS_ALL) softfloat$(LIB) $(DELETE) $(OBJS_ALL) softfloat$(LIB)

View File

@ -1,53 +1,54 @@
/*============================================================================ /*============================================================================
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
University of California. All rights reserved. University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define LITTLEENDIAN 1 #define LITTLEENDIAN 1
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#ifdef __GNUC_STDC_INLINE__ #ifdef __GNUC_STDC_INLINE__
#define INLINE inline #define INLINE inline
#else #else
#define INLINE extern inline #define INLINE extern inline
#endif #endif
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define SOFTFLOAT_BUILTIN_CLZ 1 #define SOFTFLOAT_BUILTIN_CLZ 1
#define SOFTFLOAT_INTRINSIC_INT128 1 #define SOFTFLOAT_INTRINSIC_INT128 1
#include "opts-GCC.h" #include "opts-GCC.h"

View File

@ -1,391 +1,396 @@
#============================================================================= #=============================================================================
# #
# This Makefile template is part of the SoftFloat IEEE Floating-Point # This Makefile template is part of the SoftFloat IEEE Floating-Point
# Arithmetic Package, Release 3e, by John R. Hauser. # Arithmetic Package, Release 3e, by John R. Hauser.
# #
# Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the # Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
# University of California. All rights reserved. # University of California. All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met: # modification, are permitted provided that the following conditions are met:
# #
# 1. Redistributions of source code must retain the above copyright notice, # 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer. # this list of conditions, and the following disclaimer.
# #
# 2. Redistributions in binary form must reproduce the above copyright # 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in the # notice, this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution. # documentation and/or other materials provided with the distribution.
# #
# 3. Neither the name of the University nor the names of its contributors # 3. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software # may be used to endorse or promote products derived from this software
# without specific prior written permission. # without specific prior written permission.
# #
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# #
#============================================================================= #=============================================================================
# Edit lines marked with `==>'. See "SoftFloat-source.html". # Edit lines marked with `==>'. See "SoftFloat-source.html".
==> SOURCE_DIR ?= ../../source ==> SOURCE_DIR ?= ../../source
==> SPECIALIZE_TYPE ?= 8086 ==> SPECIALIZE_TYPE ?= 8086
==> SOFTFLOAT_OPTS ?= \ ==> SOFTFLOAT_OPTS ?= \
==> -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \ ==> -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
==> -DSOFTFLOAT_FAST_DIV64TO32 ==> -DSOFTFLOAT_FAST_DIV64TO32
==> DELETE = rm -f ==> DELETE = rm -f
==> C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include ==> C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
==> COMPILE_C = \ ==> COMPILE_C = \
==> cc -c -DSOFTFLOAT_FAST_INT64 $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@ ==> cc -c -DSOFTFLOAT_FAST_INT64 $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@
==> MAKELIB = ar crs $@ ==> MAKELIB = ar crs $@
==> OBJ = .o ==> OBJ = .o
==> LIB = .a ==> LIB = .a
==> OTHER_HEADERS = ==> OTHER_HEADERS =
.PHONY: all .PHONY: all
all: softfloat$(LIB) all: softfloat$(LIB)
OBJS_PRIMITIVES = \ OBJS_PRIMITIVES = \
s_eq128$(OBJ) \ s_eq128$(OBJ) \
s_le128$(OBJ) \ s_le128$(OBJ) \
s_lt128$(OBJ) \ s_lt128$(OBJ) \
s_shortShiftLeft128$(OBJ) \ s_shortShiftLeft128$(OBJ) \
s_shortShiftRight128$(OBJ) \ s_shortShiftRight128$(OBJ) \
s_shortShiftRightJam64$(OBJ) \ s_shortShiftRightJam64$(OBJ) \
s_shortShiftRightJam64Extra$(OBJ) \ s_shortShiftRightJam64Extra$(OBJ) \
s_shortShiftRightJam128$(OBJ) \ s_shortShiftRightJam128$(OBJ) \
s_shortShiftRightJam128Extra$(OBJ) \ s_shortShiftRightJam128Extra$(OBJ) \
s_shiftRightJam32$(OBJ) \ s_shiftRightJam32$(OBJ) \
s_shiftRightJam64$(OBJ) \ s_shiftRightJam64$(OBJ) \
s_shiftRightJam64Extra$(OBJ) \ s_shiftRightJam64Extra$(OBJ) \
s_shiftRightJam128$(OBJ) \ s_shiftRightJam128$(OBJ) \
s_shiftRightJam128Extra$(OBJ) \ s_shiftRightJam128Extra$(OBJ) \
s_shiftRightJam256M$(OBJ) \ s_shiftRightJam256M$(OBJ) \
s_countLeadingZeros8$(OBJ) \ s_countLeadingZeros8$(OBJ) \
s_countLeadingZeros16$(OBJ) \ s_countLeadingZeros16$(OBJ) \
s_countLeadingZeros32$(OBJ) \ s_countLeadingZeros32$(OBJ) \
s_countLeadingZeros64$(OBJ) \ s_countLeadingZeros64$(OBJ) \
s_add128$(OBJ) \ s_add128$(OBJ) \
s_add256M$(OBJ) \ s_add256M$(OBJ) \
s_sub128$(OBJ) \ s_sub128$(OBJ) \
s_sub256M$(OBJ) \ s_sub256M$(OBJ) \
s_mul64ByShifted32To128$(OBJ) \ s_mul64ByShifted32To128$(OBJ) \
s_mul64To128$(OBJ) \ s_mul64To128$(OBJ) \
s_mul128By32$(OBJ) \ s_mul128By32$(OBJ) \
s_mul128To256M$(OBJ) \ s_mul128To256M$(OBJ) \
s_approxRecip_1Ks$(OBJ) \ s_approxRecip_1Ks$(OBJ) \
s_approxRecip32_1$(OBJ) \ s_approxRecip32_1$(OBJ) \
s_approxRecipSqrt_1Ks$(OBJ) \ s_approxRecipSqrt_1Ks$(OBJ) \
s_approxRecipSqrt32_1$(OBJ) \ s_approxRecipSqrt32_1$(OBJ) \
OBJS_SPECIALIZE = \ OBJS_SPECIALIZE = \
softfloat_raiseFlags$(OBJ) \ softfloat_raiseFlags$(OBJ) \
s_f16UIToCommonNaN$(OBJ) \ s_f16UIToCommonNaN$(OBJ) \
s_commonNaNToF16UI$(OBJ) \ s_commonNaNToF16UI$(OBJ) \
s_propagateNaNF16UI$(OBJ) \ s_propagateNaNF16UI$(OBJ) \
s_f32UIToCommonNaN$(OBJ) \ s_f32UIToCommonNaN$(OBJ) \
s_commonNaNToF32UI$(OBJ) \ s_commonNaNToF32UI$(OBJ) \
s_propagateNaNF32UI$(OBJ) \ s_propagateNaNF32UI$(OBJ) \
s_f64UIToCommonNaN$(OBJ) \ s_f64UIToCommonNaN$(OBJ) \
s_commonNaNToF64UI$(OBJ) \ s_commonNaNToF64UI$(OBJ) \
s_propagateNaNF64UI$(OBJ) \ s_propagateNaNF64UI$(OBJ) \
extF80M_isSignalingNaN$(OBJ) \ extF80M_isSignalingNaN$(OBJ) \
s_extF80UIToCommonNaN$(OBJ) \ s_extF80UIToCommonNaN$(OBJ) \
s_commonNaNToExtF80UI$(OBJ) \ s_commonNaNToExtF80UI$(OBJ) \
s_propagateNaNExtF80UI$(OBJ) \ s_propagateNaNExtF80UI$(OBJ) \
f128M_isSignalingNaN$(OBJ) \ f128M_isSignalingNaN$(OBJ) \
s_f128UIToCommonNaN$(OBJ) \ s_f128UIToCommonNaN$(OBJ) \
s_commonNaNToF128UI$(OBJ) \ s_commonNaNToF128UI$(OBJ) \
s_propagateNaNF128UI$(OBJ) \ s_propagateNaNF128UI$(OBJ) \
OBJS_OTHERS = \ OBJS_OTHERS = \
s_roundToUI32$(OBJ) \ s_roundToUI32$(OBJ) \
s_roundToUI64$(OBJ) \ s_roundToUI64$(OBJ) \
s_roundToI32$(OBJ) \ s_roundToI32$(OBJ) \
s_roundToI64$(OBJ) \ s_roundToI64$(OBJ) \
s_normSubnormalF16Sig$(OBJ) \ s_normSubnormalBF16Sig$(OBJ) \
s_roundPackToF16$(OBJ) \ s_roundPackToBF16$(OBJ) \
s_normRoundPackToF16$(OBJ) \ s_normSubnormalF16Sig$(OBJ) \
s_addMagsF16$(OBJ) \ s_roundPackToF16$(OBJ) \
s_subMagsF16$(OBJ) \ s_normRoundPackToF16$(OBJ) \
s_mulAddF16$(OBJ) \ s_addMagsF16$(OBJ) \
s_normSubnormalF32Sig$(OBJ) \ s_subMagsF16$(OBJ) \
s_roundPackToF32$(OBJ) \ s_mulAddF16$(OBJ) \
s_normRoundPackToF32$(OBJ) \ s_normSubnormalF32Sig$(OBJ) \
s_addMagsF32$(OBJ) \ s_roundPackToF32$(OBJ) \
s_subMagsF32$(OBJ) \ s_normRoundPackToF32$(OBJ) \
s_mulAddF32$(OBJ) \ s_addMagsF32$(OBJ) \
s_normSubnormalF64Sig$(OBJ) \ s_subMagsF32$(OBJ) \
s_roundPackToF64$(OBJ) \ s_mulAddF32$(OBJ) \
s_normRoundPackToF64$(OBJ) \ s_normSubnormalF64Sig$(OBJ) \
s_addMagsF64$(OBJ) \ s_roundPackToF64$(OBJ) \
s_subMagsF64$(OBJ) \ s_normRoundPackToF64$(OBJ) \
s_mulAddF64$(OBJ) \ s_addMagsF64$(OBJ) \
s_normSubnormalExtF80Sig$(OBJ) \ s_subMagsF64$(OBJ) \
s_roundPackToExtF80$(OBJ) \ s_mulAddF64$(OBJ) \
s_normRoundPackToExtF80$(OBJ) \ s_normSubnormalExtF80Sig$(OBJ) \
s_addMagsExtF80$(OBJ) \ s_roundPackToExtF80$(OBJ) \
s_subMagsExtF80$(OBJ) \ s_normRoundPackToExtF80$(OBJ) \
s_normSubnormalF128Sig$(OBJ) \ s_addMagsExtF80$(OBJ) \
s_roundPackToF128$(OBJ) \ s_subMagsExtF80$(OBJ) \
s_normRoundPackToF128$(OBJ) \ s_normSubnormalF128Sig$(OBJ) \
s_addMagsF128$(OBJ) \ s_roundPackToF128$(OBJ) \
s_subMagsF128$(OBJ) \ s_normRoundPackToF128$(OBJ) \
s_mulAddF128$(OBJ) \ s_addMagsF128$(OBJ) \
softfloat_state$(OBJ) \ s_subMagsF128$(OBJ) \
ui32_to_f16$(OBJ) \ s_mulAddF128$(OBJ) \
ui32_to_f32$(OBJ) \ softfloat_state$(OBJ) \
ui32_to_f64$(OBJ) \ ui32_to_f16$(OBJ) \
ui32_to_extF80$(OBJ) \ ui32_to_f32$(OBJ) \
ui32_to_extF80M$(OBJ) \ ui32_to_f64$(OBJ) \
ui32_to_f128$(OBJ) \ ui32_to_extF80$(OBJ) \
ui32_to_f128M$(OBJ) \ ui32_to_extF80M$(OBJ) \
ui64_to_f16$(OBJ) \ ui32_to_f128$(OBJ) \
ui64_to_f32$(OBJ) \ ui32_to_f128M$(OBJ) \
ui64_to_f64$(OBJ) \ ui64_to_f16$(OBJ) \
ui64_to_extF80$(OBJ) \ ui64_to_f32$(OBJ) \
ui64_to_extF80M$(OBJ) \ ui64_to_f64$(OBJ) \
ui64_to_f128$(OBJ) \ ui64_to_extF80$(OBJ) \
ui64_to_f128M$(OBJ) \ ui64_to_extF80M$(OBJ) \
i32_to_f16$(OBJ) \ ui64_to_f128$(OBJ) \
i32_to_f32$(OBJ) \ ui64_to_f128M$(OBJ) \
i32_to_f64$(OBJ) \ i32_to_f16$(OBJ) \
i32_to_extF80$(OBJ) \ i32_to_f32$(OBJ) \
i32_to_extF80M$(OBJ) \ i32_to_f64$(OBJ) \
i32_to_f128$(OBJ) \ i32_to_extF80$(OBJ) \
i32_to_f128M$(OBJ) \ i32_to_extF80M$(OBJ) \
i64_to_f16$(OBJ) \ i32_to_f128$(OBJ) \
i64_to_f32$(OBJ) \ i32_to_f128M$(OBJ) \
i64_to_f64$(OBJ) \ i64_to_f16$(OBJ) \
i64_to_extF80$(OBJ) \ i64_to_f32$(OBJ) \
i64_to_extF80M$(OBJ) \ i64_to_f64$(OBJ) \
i64_to_f128$(OBJ) \ i64_to_extF80$(OBJ) \
i64_to_f128M$(OBJ) \ i64_to_extF80M$(OBJ) \
f16_to_ui32$(OBJ) \ i64_to_f128$(OBJ) \
f16_to_ui64$(OBJ) \ i64_to_f128M$(OBJ) \
f16_to_i32$(OBJ) \ bf16_isSignalingNaN$(OBJ) \
f16_to_i64$(OBJ) \ bf16_to_f32$(OBJ) \
f16_to_ui32_r_minMag$(OBJ) \ f16_to_ui32$(OBJ) \
f16_to_ui64_r_minMag$(OBJ) \ f16_to_ui64$(OBJ) \
f16_to_i32_r_minMag$(OBJ) \ f16_to_i32$(OBJ) \
f16_to_i64_r_minMag$(OBJ) \ f16_to_i64$(OBJ) \
f16_to_f32$(OBJ) \ f16_to_ui32_r_minMag$(OBJ) \
f16_to_f64$(OBJ) \ f16_to_ui64_r_minMag$(OBJ) \
f16_to_extF80$(OBJ) \ f16_to_i32_r_minMag$(OBJ) \
f16_to_extF80M$(OBJ) \ f16_to_i64_r_minMag$(OBJ) \
f16_to_f128$(OBJ) \ f16_to_f32$(OBJ) \
f16_to_f128M$(OBJ) \ f16_to_f64$(OBJ) \
f16_roundToInt$(OBJ) \ f16_to_extF80$(OBJ) \
f16_add$(OBJ) \ f16_to_extF80M$(OBJ) \
f16_sub$(OBJ) \ f16_to_f128$(OBJ) \
f16_mul$(OBJ) \ f16_to_f128M$(OBJ) \
f16_mulAdd$(OBJ) \ f16_roundToInt$(OBJ) \
f16_div$(OBJ) \ f16_add$(OBJ) \
f16_rem$(OBJ) \ f16_sub$(OBJ) \
f16_sqrt$(OBJ) \ f16_mul$(OBJ) \
f16_eq$(OBJ) \ f16_mulAdd$(OBJ) \
f16_le$(OBJ) \ f16_div$(OBJ) \
f16_lt$(OBJ) \ f16_rem$(OBJ) \
f16_eq_signaling$(OBJ) \ f16_sqrt$(OBJ) \
f16_le_quiet$(OBJ) \ f16_eq$(OBJ) \
f16_lt_quiet$(OBJ) \ f16_le$(OBJ) \
f16_isSignalingNaN$(OBJ) \ f16_lt$(OBJ) \
f32_to_ui32$(OBJ) \ f16_eq_signaling$(OBJ) \
f32_to_ui64$(OBJ) \ f16_le_quiet$(OBJ) \
f32_to_i32$(OBJ) \ f16_lt_quiet$(OBJ) \
f32_to_i64$(OBJ) \ f16_isSignalingNaN$(OBJ) \
f32_to_ui32_r_minMag$(OBJ) \ f32_to_ui32$(OBJ) \
f32_to_ui64_r_minMag$(OBJ) \ f32_to_ui64$(OBJ) \
f32_to_i32_r_minMag$(OBJ) \ f32_to_i32$(OBJ) \
f32_to_i64_r_minMag$(OBJ) \ f32_to_i64$(OBJ) \
f32_to_f16$(OBJ) \ f32_to_ui32_r_minMag$(OBJ) \
f32_to_f64$(OBJ) \ f32_to_ui64_r_minMag$(OBJ) \
f32_to_extF80$(OBJ) \ f32_to_i32_r_minMag$(OBJ) \
f32_to_extF80M$(OBJ) \ f32_to_i64_r_minMag$(OBJ) \
f32_to_f128$(OBJ) \ f32_to_bf16$(OBJ) \
f32_to_f128M$(OBJ) \ f32_to_f16$(OBJ) \
f32_roundToInt$(OBJ) \ f32_to_f64$(OBJ) \
f32_add$(OBJ) \ f32_to_extF80$(OBJ) \
f32_sub$(OBJ) \ f32_to_extF80M$(OBJ) \
f32_mul$(OBJ) \ f32_to_f128$(OBJ) \
f32_mulAdd$(OBJ) \ f32_to_f128M$(OBJ) \
f32_div$(OBJ) \ f32_roundToInt$(OBJ) \
f32_rem$(OBJ) \ f32_add$(OBJ) \
f32_sqrt$(OBJ) \ f32_sub$(OBJ) \
f32_eq$(OBJ) \ f32_mul$(OBJ) \
f32_le$(OBJ) \ f32_mulAdd$(OBJ) \
f32_lt$(OBJ) \ f32_div$(OBJ) \
f32_eq_signaling$(OBJ) \ f32_rem$(OBJ) \
f32_le_quiet$(OBJ) \ f32_sqrt$(OBJ) \
f32_lt_quiet$(OBJ) \ f32_eq$(OBJ) \
f32_isSignalingNaN$(OBJ) \ f32_le$(OBJ) \
f64_to_ui32$(OBJ) \ f32_lt$(OBJ) \
f64_to_ui64$(OBJ) \ f32_eq_signaling$(OBJ) \
f64_to_i32$(OBJ) \ f32_le_quiet$(OBJ) \
f64_to_i64$(OBJ) \ f32_lt_quiet$(OBJ) \
f64_to_ui32_r_minMag$(OBJ) \ f32_isSignalingNaN$(OBJ) \
f64_to_ui64_r_minMag$(OBJ) \ f64_to_ui32$(OBJ) \
f64_to_i32_r_minMag$(OBJ) \ f64_to_ui64$(OBJ) \
f64_to_i64_r_minMag$(OBJ) \ f64_to_i32$(OBJ) \
f64_to_f16$(OBJ) \ f64_to_i64$(OBJ) \
f64_to_f32$(OBJ) \ f64_to_ui32_r_minMag$(OBJ) \
f64_to_extF80$(OBJ) \ f64_to_ui64_r_minMag$(OBJ) \
f64_to_extF80M$(OBJ) \ f64_to_i32_r_minMag$(OBJ) \
f64_to_f128$(OBJ) \ f64_to_i64_r_minMag$(OBJ) \
f64_to_f128M$(OBJ) \ f64_to_f16$(OBJ) \
f64_roundToInt$(OBJ) \ f64_to_f32$(OBJ) \
f64_add$(OBJ) \ f64_to_extF80$(OBJ) \
f64_sub$(OBJ) \ f64_to_extF80M$(OBJ) \
f64_mul$(OBJ) \ f64_to_f128$(OBJ) \
f64_mulAdd$(OBJ) \ f64_to_f128M$(OBJ) \
f64_div$(OBJ) \ f64_roundToInt$(OBJ) \
f64_rem$(OBJ) \ f64_add$(OBJ) \
f64_sqrt$(OBJ) \ f64_sub$(OBJ) \
f64_eq$(OBJ) \ f64_mul$(OBJ) \
f64_le$(OBJ) \ f64_mulAdd$(OBJ) \
f64_lt$(OBJ) \ f64_div$(OBJ) \
f64_eq_signaling$(OBJ) \ f64_rem$(OBJ) \
f64_le_quiet$(OBJ) \ f64_sqrt$(OBJ) \
f64_lt_quiet$(OBJ) \ f64_eq$(OBJ) \
f64_isSignalingNaN$(OBJ) \ f64_le$(OBJ) \
extF80_to_ui32$(OBJ) \ f64_lt$(OBJ) \
extF80_to_ui64$(OBJ) \ f64_eq_signaling$(OBJ) \
extF80_to_i32$(OBJ) \ f64_le_quiet$(OBJ) \
extF80_to_i64$(OBJ) \ f64_lt_quiet$(OBJ) \
extF80_to_ui32_r_minMag$(OBJ) \ f64_isSignalingNaN$(OBJ) \
extF80_to_ui64_r_minMag$(OBJ) \ extF80_to_ui32$(OBJ) \
extF80_to_i32_r_minMag$(OBJ) \ extF80_to_ui64$(OBJ) \
extF80_to_i64_r_minMag$(OBJ) \ extF80_to_i32$(OBJ) \
extF80_to_f16$(OBJ) \ extF80_to_i64$(OBJ) \
extF80_to_f32$(OBJ) \ extF80_to_ui32_r_minMag$(OBJ) \
extF80_to_f64$(OBJ) \ extF80_to_ui64_r_minMag$(OBJ) \
extF80_to_f128$(OBJ) \ extF80_to_i32_r_minMag$(OBJ) \
extF80_roundToInt$(OBJ) \ extF80_to_i64_r_minMag$(OBJ) \
extF80_add$(OBJ) \ extF80_to_f16$(OBJ) \
extF80_sub$(OBJ) \ extF80_to_f32$(OBJ) \
extF80_mul$(OBJ) \ extF80_to_f64$(OBJ) \
extF80_div$(OBJ) \ extF80_to_f128$(OBJ) \
extF80_rem$(OBJ) \ extF80_roundToInt$(OBJ) \
extF80_sqrt$(OBJ) \ extF80_add$(OBJ) \
extF80_eq$(OBJ) \ extF80_sub$(OBJ) \
extF80_le$(OBJ) \ extF80_mul$(OBJ) \
extF80_lt$(OBJ) \ extF80_div$(OBJ) \
extF80_eq_signaling$(OBJ) \ extF80_rem$(OBJ) \
extF80_le_quiet$(OBJ) \ extF80_sqrt$(OBJ) \
extF80_lt_quiet$(OBJ) \ extF80_eq$(OBJ) \
extF80_isSignalingNaN$(OBJ) \ extF80_le$(OBJ) \
extF80M_to_ui32$(OBJ) \ extF80_lt$(OBJ) \
extF80M_to_ui64$(OBJ) \ extF80_eq_signaling$(OBJ) \
extF80M_to_i32$(OBJ) \ extF80_le_quiet$(OBJ) \
extF80M_to_i64$(OBJ) \ extF80_lt_quiet$(OBJ) \
extF80M_to_ui32_r_minMag$(OBJ) \ extF80_isSignalingNaN$(OBJ) \
extF80M_to_ui64_r_minMag$(OBJ) \ extF80M_to_ui32$(OBJ) \
extF80M_to_i32_r_minMag$(OBJ) \ extF80M_to_ui64$(OBJ) \
extF80M_to_i64_r_minMag$(OBJ) \ extF80M_to_i32$(OBJ) \
extF80M_to_f16$(OBJ) \ extF80M_to_i64$(OBJ) \
extF80M_to_f32$(OBJ) \ extF80M_to_ui32_r_minMag$(OBJ) \
extF80M_to_f64$(OBJ) \ extF80M_to_ui64_r_minMag$(OBJ) \
extF80M_to_f128M$(OBJ) \ extF80M_to_i32_r_minMag$(OBJ) \
extF80M_roundToInt$(OBJ) \ extF80M_to_i64_r_minMag$(OBJ) \
extF80M_add$(OBJ) \ extF80M_to_f16$(OBJ) \
extF80M_sub$(OBJ) \ extF80M_to_f32$(OBJ) \
extF80M_mul$(OBJ) \ extF80M_to_f64$(OBJ) \
extF80M_div$(OBJ) \ extF80M_to_f128M$(OBJ) \
extF80M_rem$(OBJ) \ extF80M_roundToInt$(OBJ) \
extF80M_sqrt$(OBJ) \ extF80M_add$(OBJ) \
extF80M_eq$(OBJ) \ extF80M_sub$(OBJ) \
extF80M_le$(OBJ) \ extF80M_mul$(OBJ) \
extF80M_lt$(OBJ) \ extF80M_div$(OBJ) \
extF80M_eq_signaling$(OBJ) \ extF80M_rem$(OBJ) \
extF80M_le_quiet$(OBJ) \ extF80M_sqrt$(OBJ) \
extF80M_lt_quiet$(OBJ) \ extF80M_eq$(OBJ) \
f128_to_ui32$(OBJ) \ extF80M_le$(OBJ) \
f128_to_ui64$(OBJ) \ extF80M_lt$(OBJ) \
f128_to_i32$(OBJ) \ extF80M_eq_signaling$(OBJ) \
f128_to_i64$(OBJ) \ extF80M_le_quiet$(OBJ) \
f128_to_ui32_r_minMag$(OBJ) \ extF80M_lt_quiet$(OBJ) \
f128_to_ui64_r_minMag$(OBJ) \ f128_to_ui32$(OBJ) \
f128_to_i32_r_minMag$(OBJ) \ f128_to_ui64$(OBJ) \
f128_to_i64_r_minMag$(OBJ) \ f128_to_i32$(OBJ) \
f128_to_f16$(OBJ) \ f128_to_i64$(OBJ) \
f128_to_f32$(OBJ) \ f128_to_ui32_r_minMag$(OBJ) \
f128_to_extF80$(OBJ) \ f128_to_ui64_r_minMag$(OBJ) \
f128_to_f64$(OBJ) \ f128_to_i32_r_minMag$(OBJ) \
f128_roundToInt$(OBJ) \ f128_to_i64_r_minMag$(OBJ) \
f128_add$(OBJ) \ f128_to_f16$(OBJ) \
f128_sub$(OBJ) \ f128_to_f32$(OBJ) \
f128_mul$(OBJ) \ f128_to_extF80$(OBJ) \
f128_mulAdd$(OBJ) \ f128_to_f64$(OBJ) \
f128_div$(OBJ) \ f128_roundToInt$(OBJ) \
f128_rem$(OBJ) \ f128_add$(OBJ) \
f128_sqrt$(OBJ) \ f128_sub$(OBJ) \
f128_eq$(OBJ) \ f128_mul$(OBJ) \
f128_le$(OBJ) \ f128_mulAdd$(OBJ) \
f128_lt$(OBJ) \ f128_div$(OBJ) \
f128_eq_signaling$(OBJ) \ f128_rem$(OBJ) \
f128_le_quiet$(OBJ) \ f128_sqrt$(OBJ) \
f128_lt_quiet$(OBJ) \ f128_eq$(OBJ) \
f128_isSignalingNaN$(OBJ) \ f128_le$(OBJ) \
f128M_to_ui32$(OBJ) \ f128_lt$(OBJ) \
f128M_to_ui64$(OBJ) \ f128_eq_signaling$(OBJ) \
f128M_to_i32$(OBJ) \ f128_le_quiet$(OBJ) \
f128M_to_i64$(OBJ) \ f128_lt_quiet$(OBJ) \
f128M_to_ui32_r_minMag$(OBJ) \ f128_isSignalingNaN$(OBJ) \
f128M_to_ui64_r_minMag$(OBJ) \ f128M_to_ui32$(OBJ) \
f128M_to_i32_r_minMag$(OBJ) \ f128M_to_ui64$(OBJ) \
f128M_to_i64_r_minMag$(OBJ) \ f128M_to_i32$(OBJ) \
f128M_to_f16$(OBJ) \ f128M_to_i64$(OBJ) \
f128M_to_f32$(OBJ) \ f128M_to_ui32_r_minMag$(OBJ) \
f128M_to_extF80M$(OBJ) \ f128M_to_ui64_r_minMag$(OBJ) \
f128M_to_f64$(OBJ) \ f128M_to_i32_r_minMag$(OBJ) \
f128M_roundToInt$(OBJ) \ f128M_to_i64_r_minMag$(OBJ) \
f128M_add$(OBJ) \ f128M_to_f16$(OBJ) \
f128M_sub$(OBJ) \ f128M_to_f32$(OBJ) \
f128M_mul$(OBJ) \ f128M_to_extF80M$(OBJ) \
f128M_mulAdd$(OBJ) \ f128M_to_f64$(OBJ) \
f128M_div$(OBJ) \ f128M_roundToInt$(OBJ) \
f128M_rem$(OBJ) \ f128M_add$(OBJ) \
f128M_sqrt$(OBJ) \ f128M_sub$(OBJ) \
f128M_eq$(OBJ) \ f128M_mul$(OBJ) \
f128M_le$(OBJ) \ f128M_mulAdd$(OBJ) \
f128M_lt$(OBJ) \ f128M_div$(OBJ) \
f128M_eq_signaling$(OBJ) \ f128M_rem$(OBJ) \
f128M_le_quiet$(OBJ) \ f128M_sqrt$(OBJ) \
f128M_lt_quiet$(OBJ) \ f128M_eq$(OBJ) \
f128M_le$(OBJ) \
OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS) f128M_lt$(OBJ) \
f128M_eq_signaling$(OBJ) \
$(OBJS_ALL): \ f128M_le_quiet$(OBJ) \
$(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \ f128M_lt_quiet$(OBJ) \
$(SOURCE_DIR)/include/primitives.h
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \ OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS)
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \ $(OBJS_ALL): \
$(SOURCE_DIR)/include/softfloat.h $(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \
$(SOURCE_DIR)/include/primitives.h
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c $(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
$(COMPILE_C) $(SOURCE_DIR)/$*.c $(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c $(SOURCE_DIR)/include/softfloat.h
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
softfloat$(LIB): $(OBJS_ALL) $(COMPILE_C) $(SOURCE_DIR)/$*.c
$(DELETE) $@
$(MAKELIB) $^ $(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
.PHONY: clean
clean: softfloat$(LIB): $(OBJS_ALL)
$(DELETE) $(OBJS_ALL) softfloat$(LIB) $(DELETE) $@
$(MAKELIB) $^
.PHONY: clean
clean:
$(DELETE) $(OBJS_ALL) softfloat$(LIB)

View File

@ -1,49 +1,50 @@
/*============================================================================ /*============================================================================
This C header template is part of the SoftFloat IEEE Floating-Point Arithmetic This C header template is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
// Edit lines marked with `==>'. See "SoftFloat-source.html". // Edit lines marked with `==>'. See "SoftFloat-source.html".
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
== > #define LITTLEENDIAN 1 ==> #define LITTLEENDIAN 1
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
== > #define INLINE inline ==> #define INLINE inline
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
== > #define THREAD_LOCAL _Thread_local ==> #define THREAD_LOCAL _Thread_local

View File

@ -1,325 +1,325 @@
#============================================================================= #=============================================================================
# #
# This Makefile template is part of the SoftFloat IEEE Floating-Point # This Makefile template is part of the SoftFloat IEEE Floating-Point
# Arithmetic Package, Release 3e, by John R. Hauser. # Arithmetic Package, Release 3e, by John R. Hauser.
# #
# Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the # Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
# University of California. All rights reserved. # University of California. All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met: # modification, are permitted provided that the following conditions are met:
# #
# 1. Redistributions of source code must retain the above copyright notice, # 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer. # this list of conditions, and the following disclaimer.
# #
# 2. Redistributions in binary form must reproduce the above copyright # 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in the # notice, this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution. # documentation and/or other materials provided with the distribution.
# #
# 3. Neither the name of the University nor the names of its contributors # 3. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software # may be used to endorse or promote products derived from this software
# without specific prior written permission. # without specific prior written permission.
# #
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# #
#============================================================================= #=============================================================================
# Edit lines marked with `==>'. See "SoftFloat-source.html". # Edit lines marked with `==>'. See "SoftFloat-source.html".
==> SOURCE_DIR ?= ../../source ==> SOURCE_DIR ?= ../../source
==> SPECIALIZE_TYPE ?= 8086 ==> SPECIALIZE_TYPE ?= 8086
==> SOFTFLOAT_OPTS ?= \ ==> SOFTFLOAT_OPTS ?= \
==> -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \ ==> -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
==> -DSOFTFLOAT_FAST_DIV64TO32 ==> -DSOFTFLOAT_FAST_DIV64TO32
==> DELETE = rm -f ==> DELETE = rm -f
==> C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include ==> C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
==> COMPILE_C = cc -c $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@ ==> COMPILE_C = cc -c $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@
==> MAKELIB = ar crs $@ ==> MAKELIB = ar crs $@
==> OBJ = .o ==> OBJ = .o
==> LIB = .a ==> LIB = .a
==> OTHER_HEADERS = ==> OTHER_HEADERS =
.PHONY: all .PHONY: all
all: softfloat$(LIB) all: softfloat$(LIB)
OBJS_PRIMITIVES = \ OBJS_PRIMITIVES = \
s_compare96M$(OBJ) \ s_compare96M$(OBJ) \
s_compare128M$(OBJ) \ s_compare128M$(OBJ) \
s_shortShiftLeft64To96M$(OBJ) \ s_shortShiftLeft64To96M$(OBJ) \
s_shortShiftLeftM$(OBJ) \ s_shortShiftLeftM$(OBJ) \
s_shiftLeftM$(OBJ) \ s_shiftLeftM$(OBJ) \
s_shortShiftRightM$(OBJ) \ s_shortShiftRightM$(OBJ) \
s_shortShiftRightJam64$(OBJ) \ s_shortShiftRightJam64$(OBJ) \
s_shortShiftRightJamM$(OBJ) \ s_shortShiftRightJamM$(OBJ) \
s_shiftRightJam32$(OBJ) \ s_shiftRightJam32$(OBJ) \
s_shiftRightJam64$(OBJ) \ s_shiftRightJam64$(OBJ) \
s_shiftRightJamM$(OBJ) \ s_shiftRightJamM$(OBJ) \
s_shiftRightM$(OBJ) \ s_shiftRightM$(OBJ) \
s_countLeadingZeros8$(OBJ) \ s_countLeadingZeros8$(OBJ) \
s_countLeadingZeros16$(OBJ) \ s_countLeadingZeros16$(OBJ) \
s_countLeadingZeros32$(OBJ) \ s_countLeadingZeros32$(OBJ) \
s_countLeadingZeros64$(OBJ) \ s_countLeadingZeros64$(OBJ) \
s_addM$(OBJ) \ s_addM$(OBJ) \
s_addCarryM$(OBJ) \ s_addCarryM$(OBJ) \
s_addComplCarryM$(OBJ) \ s_addComplCarryM$(OBJ) \
s_negXM$(OBJ) \ s_negXM$(OBJ) \
s_sub1XM$(OBJ) \ s_sub1XM$(OBJ) \
s_subM$(OBJ) \ s_subM$(OBJ) \
s_mul64To128M$(OBJ) \ s_mul64To128M$(OBJ) \
s_mul128MTo256M$(OBJ) \ s_mul128MTo256M$(OBJ) \
s_approxRecip_1Ks$(OBJ) \ s_approxRecip_1Ks$(OBJ) \
s_approxRecip32_1$(OBJ) \ s_approxRecip32_1$(OBJ) \
s_approxRecipSqrt_1Ks$(OBJ) \ s_approxRecipSqrt_1Ks$(OBJ) \
s_approxRecipSqrt32_1$(OBJ) \ s_approxRecipSqrt32_1$(OBJ) \
s_remStepMBy32$(OBJ) \ s_remStepMBy32$(OBJ) \
OBJS_SPECIALIZE = \ OBJS_SPECIALIZE = \
softfloat_raiseFlags$(OBJ) \ softfloat_raiseFlags$(OBJ) \
s_f16UIToCommonNaN$(OBJ) \ s_f16UIToCommonNaN$(OBJ) \
s_commonNaNToF16UI$(OBJ) \ s_commonNaNToF16UI$(OBJ) \
s_propagateNaNF16UI$(OBJ) \ s_propagateNaNF16UI$(OBJ) \
s_f32UIToCommonNaN$(OBJ) \ s_f32UIToCommonNaN$(OBJ) \
s_commonNaNToF32UI$(OBJ) \ s_commonNaNToF32UI$(OBJ) \
s_propagateNaNF32UI$(OBJ) \ s_propagateNaNF32UI$(OBJ) \
s_f64UIToCommonNaN$(OBJ) \ s_f64UIToCommonNaN$(OBJ) \
s_commonNaNToF64UI$(OBJ) \ s_commonNaNToF64UI$(OBJ) \
s_propagateNaNF64UI$(OBJ) \ s_propagateNaNF64UI$(OBJ) \
extF80M_isSignalingNaN$(OBJ) \ extF80M_isSignalingNaN$(OBJ) \
s_extF80MToCommonNaN$(OBJ) \ s_extF80MToCommonNaN$(OBJ) \
s_commonNaNToExtF80M$(OBJ) \ s_commonNaNToExtF80M$(OBJ) \
s_propagateNaNExtF80M$(OBJ) \ s_propagateNaNExtF80M$(OBJ) \
f128M_isSignalingNaN$(OBJ) \ f128M_isSignalingNaN$(OBJ) \
s_f128MToCommonNaN$(OBJ) \ s_f128MToCommonNaN$(OBJ) \
s_commonNaNToF128M$(OBJ) \ s_commonNaNToF128M$(OBJ) \
s_propagateNaNF128M$(OBJ) \ s_propagateNaNF128M$(OBJ) \
OBJS_OTHERS = \ OBJS_OTHERS = \
s_roundToUI32$(OBJ) \ s_roundToUI32$(OBJ) \
s_roundMToUI64$(OBJ) \ s_roundMToUI64$(OBJ) \
s_roundToI32$(OBJ) \ s_roundToI32$(OBJ) \
s_roundMToI64$(OBJ) \ s_roundMToI64$(OBJ) \
s_normSubnormalF16Sig$(OBJ) \ s_normSubnormalF16Sig$(OBJ) \
s_roundPackToF16$(OBJ) \ s_roundPackToF16$(OBJ) \
s_normRoundPackToF16$(OBJ) \ s_normRoundPackToF16$(OBJ) \
s_addMagsF16$(OBJ) \ s_addMagsF16$(OBJ) \
s_subMagsF16$(OBJ) \ s_subMagsF16$(OBJ) \
s_mulAddF16$(OBJ) \ s_mulAddF16$(OBJ) \
s_normSubnormalF32Sig$(OBJ) \ s_normSubnormalF32Sig$(OBJ) \
s_roundPackToF32$(OBJ) \ s_roundPackToF32$(OBJ) \
s_normRoundPackToF32$(OBJ) \ s_normRoundPackToF32$(OBJ) \
s_addMagsF32$(OBJ) \ s_addMagsF32$(OBJ) \
s_subMagsF32$(OBJ) \ s_subMagsF32$(OBJ) \
s_mulAddF32$(OBJ) \ s_mulAddF32$(OBJ) \
s_normSubnormalF64Sig$(OBJ) \ s_normSubnormalF64Sig$(OBJ) \
s_roundPackToF64$(OBJ) \ s_roundPackToF64$(OBJ) \
s_normRoundPackToF64$(OBJ) \ s_normRoundPackToF64$(OBJ) \
s_addMagsF64$(OBJ) \ s_addMagsF64$(OBJ) \
s_subMagsF64$(OBJ) \ s_subMagsF64$(OBJ) \
s_mulAddF64$(OBJ) \ s_mulAddF64$(OBJ) \
s_tryPropagateNaNExtF80M$(OBJ) \ s_tryPropagateNaNExtF80M$(OBJ) \
s_invalidExtF80M$(OBJ) \ s_invalidExtF80M$(OBJ) \
s_normExtF80SigM$(OBJ) \ s_normExtF80SigM$(OBJ) \
s_roundPackMToExtF80M$(OBJ) \ s_roundPackMToExtF80M$(OBJ) \
s_normRoundPackMToExtF80M$(OBJ) \ s_normRoundPackMToExtF80M$(OBJ) \
s_addExtF80M$(OBJ) \ s_addExtF80M$(OBJ) \
s_compareNonnormExtF80M$(OBJ) \ s_compareNonnormExtF80M$(OBJ) \
s_isNaNF128M$(OBJ) \ s_isNaNF128M$(OBJ) \
s_tryPropagateNaNF128M$(OBJ) \ s_tryPropagateNaNF128M$(OBJ) \
s_invalidF128M$(OBJ) \ s_invalidF128M$(OBJ) \
s_shiftNormSigF128M$(OBJ) \ s_shiftNormSigF128M$(OBJ) \
s_roundPackMToF128M$(OBJ) \ s_roundPackMToF128M$(OBJ) \
s_normRoundPackMToF128M$(OBJ) \ s_normRoundPackMToF128M$(OBJ) \
s_addF128M$(OBJ) \ s_addF128M$(OBJ) \
s_mulAddF128M$(OBJ) \ s_mulAddF128M$(OBJ) \
softfloat_state$(OBJ) \ softfloat_state$(OBJ) \
ui32_to_f16$(OBJ) \ ui32_to_f16$(OBJ) \
ui32_to_f32$(OBJ) \ ui32_to_f32$(OBJ) \
ui32_to_f64$(OBJ) \ ui32_to_f64$(OBJ) \
ui32_to_extF80M$(OBJ) \ ui32_to_extF80M$(OBJ) \
ui32_to_f128M$(OBJ) \ ui32_to_f128M$(OBJ) \
ui64_to_f16$(OBJ) \ ui64_to_f16$(OBJ) \
ui64_to_f32$(OBJ) \ ui64_to_f32$(OBJ) \
ui64_to_f64$(OBJ) \ ui64_to_f64$(OBJ) \
ui64_to_extF80M$(OBJ) \ ui64_to_extF80M$(OBJ) \
ui64_to_f128M$(OBJ) \ ui64_to_f128M$(OBJ) \
i32_to_f16$(OBJ) \ i32_to_f16$(OBJ) \
i32_to_f32$(OBJ) \ i32_to_f32$(OBJ) \
i32_to_f64$(OBJ) \ i32_to_f64$(OBJ) \
i32_to_extF80M$(OBJ) \ i32_to_extF80M$(OBJ) \
i32_to_f128M$(OBJ) \ i32_to_f128M$(OBJ) \
i64_to_f16$(OBJ) \ i64_to_f16$(OBJ) \
i64_to_f32$(OBJ) \ i64_to_f32$(OBJ) \
i64_to_f64$(OBJ) \ i64_to_f64$(OBJ) \
i64_to_extF80M$(OBJ) \ i64_to_extF80M$(OBJ) \
i64_to_f128M$(OBJ) \ i64_to_f128M$(OBJ) \
f16_to_ui32$(OBJ) \ f16_to_ui32$(OBJ) \
f16_to_ui64$(OBJ) \ f16_to_ui64$(OBJ) \
f16_to_i32$(OBJ) \ f16_to_i32$(OBJ) \
f16_to_i64$(OBJ) \ f16_to_i64$(OBJ) \
f16_to_ui32_r_minMag$(OBJ) \ f16_to_ui32_r_minMag$(OBJ) \
f16_to_ui64_r_minMag$(OBJ) \ f16_to_ui64_r_minMag$(OBJ) \
f16_to_i32_r_minMag$(OBJ) \ f16_to_i32_r_minMag$(OBJ) \
f16_to_i64_r_minMag$(OBJ) \ f16_to_i64_r_minMag$(OBJ) \
f16_to_f32$(OBJ) \ f16_to_f32$(OBJ) \
f16_to_f64$(OBJ) \ f16_to_f64$(OBJ) \
f16_to_extF80M$(OBJ) \ f16_to_extF80M$(OBJ) \
f16_to_f128M$(OBJ) \ f16_to_f128M$(OBJ) \
f16_roundToInt$(OBJ) \ f16_roundToInt$(OBJ) \
f16_add$(OBJ) \ f16_add$(OBJ) \
f16_sub$(OBJ) \ f16_sub$(OBJ) \
f16_mul$(OBJ) \ f16_mul$(OBJ) \
f16_mulAdd$(OBJ) \ f16_mulAdd$(OBJ) \
f16_div$(OBJ) \ f16_div$(OBJ) \
f16_rem$(OBJ) \ f16_rem$(OBJ) \
f16_sqrt$(OBJ) \ f16_sqrt$(OBJ) \
f16_eq$(OBJ) \ f16_eq$(OBJ) \
f16_le$(OBJ) \ f16_le$(OBJ) \
f16_lt$(OBJ) \ f16_lt$(OBJ) \
f16_eq_signaling$(OBJ) \ f16_eq_signaling$(OBJ) \
f16_le_quiet$(OBJ) \ f16_le_quiet$(OBJ) \
f16_lt_quiet$(OBJ) \ f16_lt_quiet$(OBJ) \
f16_isSignalingNaN$(OBJ) \ f16_isSignalingNaN$(OBJ) \
f32_to_ui32$(OBJ) \ f32_to_ui32$(OBJ) \
f32_to_ui64$(OBJ) \ f32_to_ui64$(OBJ) \
f32_to_i32$(OBJ) \ f32_to_i32$(OBJ) \
f32_to_i64$(OBJ) \ f32_to_i64$(OBJ) \
f32_to_ui32_r_minMag$(OBJ) \ f32_to_ui32_r_minMag$(OBJ) \
f32_to_ui64_r_minMag$(OBJ) \ f32_to_ui64_r_minMag$(OBJ) \
f32_to_i32_r_minMag$(OBJ) \ f32_to_i32_r_minMag$(OBJ) \
f32_to_i64_r_minMag$(OBJ) \ f32_to_i64_r_minMag$(OBJ) \
f32_to_f16$(OBJ) \ f32_to_f16$(OBJ) \
f32_to_f64$(OBJ) \ f32_to_f64$(OBJ) \
f32_to_extF80M$(OBJ) \ f32_to_extF80M$(OBJ) \
f32_to_f128M$(OBJ) \ f32_to_f128M$(OBJ) \
f32_roundToInt$(OBJ) \ f32_roundToInt$(OBJ) \
f32_add$(OBJ) \ f32_add$(OBJ) \
f32_sub$(OBJ) \ f32_sub$(OBJ) \
f32_mul$(OBJ) \ f32_mul$(OBJ) \
f32_mulAdd$(OBJ) \ f32_mulAdd$(OBJ) \
f32_div$(OBJ) \ f32_div$(OBJ) \
f32_rem$(OBJ) \ f32_rem$(OBJ) \
f32_sqrt$(OBJ) \ f32_sqrt$(OBJ) \
f32_eq$(OBJ) \ f32_eq$(OBJ) \
f32_le$(OBJ) \ f32_le$(OBJ) \
f32_lt$(OBJ) \ f32_lt$(OBJ) \
f32_eq_signaling$(OBJ) \ f32_eq_signaling$(OBJ) \
f32_le_quiet$(OBJ) \ f32_le_quiet$(OBJ) \
f32_lt_quiet$(OBJ) \ f32_lt_quiet$(OBJ) \
f32_isSignalingNaN$(OBJ) \ f32_isSignalingNaN$(OBJ) \
f64_to_ui32$(OBJ) \ f64_to_ui32$(OBJ) \
f64_to_ui64$(OBJ) \ f64_to_ui64$(OBJ) \
f64_to_i32$(OBJ) \ f64_to_i32$(OBJ) \
f64_to_i64$(OBJ) \ f64_to_i64$(OBJ) \
f64_to_ui32_r_minMag$(OBJ) \ f64_to_ui32_r_minMag$(OBJ) \
f64_to_ui64_r_minMag$(OBJ) \ f64_to_ui64_r_minMag$(OBJ) \
f64_to_i32_r_minMag$(OBJ) \ f64_to_i32_r_minMag$(OBJ) \
f64_to_i64_r_minMag$(OBJ) \ f64_to_i64_r_minMag$(OBJ) \
f64_to_f16$(OBJ) \ f64_to_f16$(OBJ) \
f64_to_f32$(OBJ) \ f64_to_f32$(OBJ) \
f64_to_extF80M$(OBJ) \ f64_to_extF80M$(OBJ) \
f64_to_f128M$(OBJ) \ f64_to_f128M$(OBJ) \
f64_roundToInt$(OBJ) \ f64_roundToInt$(OBJ) \
f64_add$(OBJ) \ f64_add$(OBJ) \
f64_sub$(OBJ) \ f64_sub$(OBJ) \
f64_mul$(OBJ) \ f64_mul$(OBJ) \
f64_mulAdd$(OBJ) \ f64_mulAdd$(OBJ) \
f64_div$(OBJ) \ f64_div$(OBJ) \
f64_rem$(OBJ) \ f64_rem$(OBJ) \
f64_sqrt$(OBJ) \ f64_sqrt$(OBJ) \
f64_eq$(OBJ) \ f64_eq$(OBJ) \
f64_le$(OBJ) \ f64_le$(OBJ) \
f64_lt$(OBJ) \ f64_lt$(OBJ) \
f64_eq_signaling$(OBJ) \ f64_eq_signaling$(OBJ) \
f64_le_quiet$(OBJ) \ f64_le_quiet$(OBJ) \
f64_lt_quiet$(OBJ) \ f64_lt_quiet$(OBJ) \
f64_isSignalingNaN$(OBJ) \ f64_isSignalingNaN$(OBJ) \
extF80M_to_ui32$(OBJ) \ extF80M_to_ui32$(OBJ) \
extF80M_to_ui64$(OBJ) \ extF80M_to_ui64$(OBJ) \
extF80M_to_i32$(OBJ) \ extF80M_to_i32$(OBJ) \
extF80M_to_i64$(OBJ) \ extF80M_to_i64$(OBJ) \
extF80M_to_ui32_r_minMag$(OBJ) \ extF80M_to_ui32_r_minMag$(OBJ) \
extF80M_to_ui64_r_minMag$(OBJ) \ extF80M_to_ui64_r_minMag$(OBJ) \
extF80M_to_i32_r_minMag$(OBJ) \ extF80M_to_i32_r_minMag$(OBJ) \
extF80M_to_i64_r_minMag$(OBJ) \ extF80M_to_i64_r_minMag$(OBJ) \
extF80M_to_f16$(OBJ) \ extF80M_to_f16$(OBJ) \
extF80M_to_f32$(OBJ) \ extF80M_to_f32$(OBJ) \
extF80M_to_f64$(OBJ) \ extF80M_to_f64$(OBJ) \
extF80M_to_f128M$(OBJ) \ extF80M_to_f128M$(OBJ) \
extF80M_roundToInt$(OBJ) \ extF80M_roundToInt$(OBJ) \
extF80M_add$(OBJ) \ extF80M_add$(OBJ) \
extF80M_sub$(OBJ) \ extF80M_sub$(OBJ) \
extF80M_mul$(OBJ) \ extF80M_mul$(OBJ) \
extF80M_div$(OBJ) \ extF80M_div$(OBJ) \
extF80M_rem$(OBJ) \ extF80M_rem$(OBJ) \
extF80M_sqrt$(OBJ) \ extF80M_sqrt$(OBJ) \
extF80M_eq$(OBJ) \ extF80M_eq$(OBJ) \
extF80M_le$(OBJ) \ extF80M_le$(OBJ) \
extF80M_lt$(OBJ) \ extF80M_lt$(OBJ) \
extF80M_eq_signaling$(OBJ) \ extF80M_eq_signaling$(OBJ) \
extF80M_le_quiet$(OBJ) \ extF80M_le_quiet$(OBJ) \
extF80M_lt_quiet$(OBJ) \ extF80M_lt_quiet$(OBJ) \
f128M_to_ui32$(OBJ) \ f128M_to_ui32$(OBJ) \
f128M_to_ui64$(OBJ) \ f128M_to_ui64$(OBJ) \
f128M_to_i32$(OBJ) \ f128M_to_i32$(OBJ) \
f128M_to_i64$(OBJ) \ f128M_to_i64$(OBJ) \
f128M_to_ui32_r_minMag$(OBJ) \ f128M_to_ui32_r_minMag$(OBJ) \
f128M_to_ui64_r_minMag$(OBJ) \ f128M_to_ui64_r_minMag$(OBJ) \
f128M_to_i32_r_minMag$(OBJ) \ f128M_to_i32_r_minMag$(OBJ) \
f128M_to_i64_r_minMag$(OBJ) \ f128M_to_i64_r_minMag$(OBJ) \
f128M_to_f16$(OBJ) \ f128M_to_f16$(OBJ) \
f128M_to_f32$(OBJ) \ f128M_to_f32$(OBJ) \
f128M_to_f64$(OBJ) \ f128M_to_f64$(OBJ) \
f128M_to_extF80M$(OBJ) \ f128M_to_extF80M$(OBJ) \
f128M_roundToInt$(OBJ) \ f128M_roundToInt$(OBJ) \
f128M_add$(OBJ) \ f128M_add$(OBJ) \
f128M_sub$(OBJ) \ f128M_sub$(OBJ) \
f128M_mul$(OBJ) \ f128M_mul$(OBJ) \
f128M_mulAdd$(OBJ) \ f128M_mulAdd$(OBJ) \
f128M_div$(OBJ) \ f128M_div$(OBJ) \
f128M_rem$(OBJ) \ f128M_rem$(OBJ) \
f128M_sqrt$(OBJ) \ f128M_sqrt$(OBJ) \
f128M_eq$(OBJ) \ f128M_eq$(OBJ) \
f128M_le$(OBJ) \ f128M_le$(OBJ) \
f128M_lt$(OBJ) \ f128M_lt$(OBJ) \
f128M_eq_signaling$(OBJ) \ f128M_eq_signaling$(OBJ) \
f128M_le_quiet$(OBJ) \ f128M_le_quiet$(OBJ) \
f128M_lt_quiet$(OBJ) \ f128M_lt_quiet$(OBJ) \
OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS) OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS)
$(OBJS_ALL): \ $(OBJS_ALL): \
$(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \ $(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \
$(SOURCE_DIR)/include/primitives.h $(SOURCE_DIR)/include/primitives.h
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \ $(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \ $(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \ $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
$(SOURCE_DIR)/include/softfloat.h $(SOURCE_DIR)/include/softfloat.h
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c $(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$*.c
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c $(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
softfloat$(LIB): $(OBJS_ALL) softfloat$(LIB): $(OBJS_ALL)
$(DELETE) $@ $(DELETE) $@
$(MAKELIB) $^ $(MAKELIB) $^
.PHONY: clean .PHONY: clean
clean: clean:
$(DELETE) $(OBJS_ALL) softfloat$(LIB) $(DELETE) $(OBJS_ALL) softfloat$(LIB)

View File

@ -1,49 +1,50 @@
/*============================================================================ /*============================================================================
This C header template is part of the SoftFloat IEEE Floating-Point Arithmetic This C header template is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
// Edit lines marked with `==>'. See "SoftFloat-source.html". // Edit lines marked with `==>'. See "SoftFloat-source.html".
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
== > #define LITTLEENDIAN 1 ==> #define LITTLEENDIAN 1
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
== > #define INLINE inline ==> #define INLINE inline
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
== > #define THREAD_LOCAL _Thread_local ==> #define THREAD_LOCAL _Thread_local

View File

@ -1,258 +1,258 @@
<HTML> <HTML>
<HEAD> <HEAD>
<TITLE>Berkeley SoftFloat History</TITLE> <TITLE>Berkeley SoftFloat History</TITLE>
</HEAD> </HEAD>
<BODY> <BODY>
<H1>History of Berkeley SoftFloat, to Release 3e</H1> <H1>History of Berkeley SoftFloat, to Release 3e</H1>
<P> <P>
John R. Hauser<BR> John R. Hauser<BR>
2018 January 20<BR> 2018 January 20<BR>
</P> </P>
<H3>Release 3e (2018 January)</H3> <H3>Release 3e (2018 January)</H3>
<UL> <UL>
<LI> <LI>
Changed the default numeric code for optional rounding mode <CODE>odd</CODE> Changed the default numeric code for optional rounding mode <CODE>odd</CODE>
(round to odd, also known as <EM>jamming</EM>) from 5 to 6. (round to odd, also known as <EM>jamming</EM>) from 5 to 6.
<LI> <LI>
Modified the behavior of rounding mode <CODE>odd</CODE> when rounding to an Modified the behavior of rounding mode <CODE>odd</CODE> when rounding to an
integer value (either conversion to an integer format or a integer value (either conversion to an integer format or a
&lsquo;<CODE>roundToInt</CODE>&rsquo; function). &lsquo;<CODE>roundToInt</CODE>&rsquo; function).
Previously, for those cases only, rounding mode <CODE>odd</CODE> acted the same Previously, for those cases only, rounding mode <CODE>odd</CODE> acted the same
as rounding to minimum magnitude. as rounding to minimum magnitude.
Now all operations are rounded consistently. Now all operations are rounded consistently.
<LI> <LI>
Fixed some errors in the specialization code modeling Intel x86 floating-point, Fixed some errors in the specialization code modeling Intel x86 floating-point,
specifically the integers returned on invalid operations and the propagation of specifically the integers returned on invalid operations and the propagation of
NaN payloads in a few rare cases. NaN payloads in a few rare cases.
<LI> <LI>
Added specialization code modeling ARM floating-point, conforming to VFPv2 or Added specialization code modeling ARM floating-point, conforming to VFPv2 or
later. later.
<LI> <LI>
Added an example target for ARM processors. Added an example target for ARM processors.
<LI> <LI>
Fixed a minor bug whereby function <CODE>f16_to_ui64</CODE> might return a Fixed a minor bug whereby function <CODE>f16_to_ui64</CODE> might return a
different integer than expected in the case that the floating-point operand is different integer than expected in the case that the floating-point operand is
negative. negative.
<LI> <LI>
Added example target-specific optimization for GCC, employing GCC instrinsics Added example target-specific optimization for GCC, employing GCC instrinsics
and support for <NOBR>128-bit</NOBR> integer arithmetic. and support for <NOBR>128-bit</NOBR> integer arithmetic.
<LI> <LI>
Made other minor improvements. Made other minor improvements.
</UL> </UL>
<H3>Release 3d (2017 August)</H3> <H3>Release 3d (2017 August)</H3>
<UL> <UL>
<LI> <LI>
Fixed bugs in the square root functions for <NOBR>64-bit</NOBR> Fixed bugs in the square root functions for <NOBR>64-bit</NOBR>
double-precision, <NOBR>80-bit</NOBR> double-extended-precision, and double-precision, <NOBR>80-bit</NOBR> double-extended-precision, and
<NOBR>128-bit</NOBR> quadruple-precision. <NOBR>128-bit</NOBR> quadruple-precision.
For <NOBR>64-bit</NOBR> double-precision (<CODE>f64_sqrt</CODE>), the result For <NOBR>64-bit</NOBR> double-precision (<CODE>f64_sqrt</CODE>), the result
could sometimes be off by <NOBR>1 unit</NOBR> in the last place could sometimes be off by <NOBR>1 unit</NOBR> in the last place
(<NOBR>1 ulp</NOBR>) from what it should be. (<NOBR>1 ulp</NOBR>) from what it should be.
For the larger formats, the square root could be wrong in a large portion of For the larger formats, the square root could be wrong in a large portion of
the less-significant bits. the less-significant bits.
(A bug in <CODE>f128_sqrt</CODE> was first reported by Alexei Sibidanov.) (A bug in <CODE>f128_sqrt</CODE> was first reported by Alexei Sibidanov.)
</UL> </UL>
<H3>Release 3c (2017 February)</H3> <H3>Release 3c (2017 February)</H3>
<UL> <UL>
<LI> <LI>
Added optional rounding mode <CODE>odd</CODE> (round to odd, also known as Added optional rounding mode <CODE>odd</CODE> (round to odd, also known as
<EM>jamming</EM>). <EM>jamming</EM>).
<LI> <LI>
Corrected the documentation concerning non-canonical representations in Corrected the documentation concerning non-canonical representations in
<NOBR>80-bit</NOBR> double-extended-precision. <NOBR>80-bit</NOBR> double-extended-precision.
</UL> </UL>
<H3>Release 3b (2016 July)</H3> <H3>Release 3b (2016 July)</H3>
<UL> <UL>
<LI> <LI>
Implemented the common <NOBR>16-bit</NOBR> &ldquo;half-precision&rdquo; Implemented the common <NOBR>16-bit</NOBR> &ldquo;half-precision&rdquo;
floating-point format (<CODE>float16_t</CODE>). floating-point format (<CODE>float16_t</CODE>).
<LI> <LI>
Made the integer values returned on invalid conversions to integer formats Made the integer values returned on invalid conversions to integer formats
be determined by the port-specific specialization instead of being the same for be determined by the port-specific specialization instead of being the same for
all ports. all ports.
<LI> <LI>
Added preprocessor macro <CODE>THREAD_LOCAL</CODE> to allow the floating-point Added preprocessor macro <CODE>THREAD_LOCAL</CODE> to allow the floating-point
state (modes and exception flags) to be made per-thread. state (modes and exception flags) to be made per-thread.
<LI> <LI>
Modified the provided Makefiles to allow some options to be overridden from the Modified the provided Makefiles to allow some options to be overridden from the
<CODE>make</CODE> command. <CODE>make</CODE> command.
<LI> <LI>
Made other minor improvements. Made other minor improvements.
</UL> </UL>
<H3>Release 3a (2015 October)</H3> <H3>Release 3a (2015 October)</H3>
<UL> <UL>
<LI> <LI>
Replaced the license text supplied by the University of California, Berkeley. Replaced the license text supplied by the University of California, Berkeley.
</UL> </UL>
<H3>Release 3 (2015 February)</H3> <H3>Release 3 (2015 February)</H3>
<UL> <UL>
<LI> <LI>
Complete rewrite, funded by the University of California, Berkeley, and Complete rewrite, funded by the University of California, Berkeley, and
consequently having a different use license than earlier releases. consequently having a different use license than earlier releases.
Major changes included renaming most types and functions, upgrading some Major changes included renaming most types and functions, upgrading some
algorithms, restructuring the source files, and making SoftFloat into a true algorithms, restructuring the source files, and making SoftFloat into a true
library. library.
<LI> <LI>
Added functions to convert between floating-point and unsigned integers, both Added functions to convert between floating-point and unsigned integers, both
<NOBR>32-bit</NOBR> and <NOBR>64-bit</NOBR> (<CODE>uint32_t</CODE> and <NOBR>32-bit</NOBR> and <NOBR>64-bit</NOBR> (<CODE>uint32_t</CODE> and
<CODE>uint64_t</CODE>). <CODE>uint64_t</CODE>).
<LI> <LI>
Added functions for fused multiply-add, for all supported floating-point Added functions for fused multiply-add, for all supported floating-point
formats except <NOBR>80-bit</NOBR> double-extended-precision. formats except <NOBR>80-bit</NOBR> double-extended-precision.
<LI> <LI>
Added support for a fifth rounding mode, <CODE>near_maxMag</CODE> (round to Added support for a fifth rounding mode, <CODE>near_maxMag</CODE> (round to
nearest, with ties to maximum magnitude, away from zero). nearest, with ties to maximum magnitude, away from zero).
<LI> <LI>
Dropped the <CODE>timesoftfloat</CODE> program (now part of the Berkeley Dropped the <CODE>timesoftfloat</CODE> program (now part of the Berkeley
TestFloat package). TestFloat package).
</UL> </UL>
<H3>Release 2c (2015 January)</H3> <H3>Release 2c (2015 January)</H3>
<UL> <UL>
<LI> <LI>
Fixed mistakes affecting some <NOBR>64-bit</NOBR> processors. Fixed mistakes affecting some <NOBR>64-bit</NOBR> processors.
<LI> <LI>
Further improved the documentation and the wording for the legal restrictions Further improved the documentation and the wording for the legal restrictions
on using SoftFloat releases <NOBR>through 2c</NOBR> (not applicable to on using SoftFloat releases <NOBR>through 2c</NOBR> (not applicable to
<NOBR>Release 3</NOBR> or later). <NOBR>Release 3</NOBR> or later).
</UL> </UL>
<H3>Release 2b (2002 May)</H3> <H3>Release 2b (2002 May)</H3>
<UL> <UL>
<LI> <LI>
Made minor updates to the documentation, including improved wording for the Made minor updates to the documentation, including improved wording for the
legal restrictions on using SoftFloat. legal restrictions on using SoftFloat.
</UL> </UL>
<H3>Release 2a (1998 December)</H3> <H3>Release 2a (1998 December)</H3>
<UL> <UL>
<LI> <LI>
Added functions to convert between <NOBR>64-bit</NOBR> integers Added functions to convert between <NOBR>64-bit</NOBR> integers
(<CODE>int64</CODE>) and all supported floating-point formats. (<CODE>int64</CODE>) and all supported floating-point formats.
<LI> <LI>
Fixed a bug in all <NOBR>64-bit</NOBR>-version square root functions except Fixed a bug in all <NOBR>64-bit</NOBR>-version square root functions except
<CODE>float32_sqrt</CODE> that caused the result sometimes to be off by <CODE>float32_sqrt</CODE> that caused the result sometimes to be off by
<NOBR>1 unit</NOBR> in the last place (<NOBR>1 ulp</NOBR>) from what it should <NOBR>1 unit</NOBR> in the last place (<NOBR>1 ulp</NOBR>) from what it should
be. be.
(Bug discovered by Paul Donahue.) (Bug discovered by Paul Donahue.)
<LI> <LI>
Improved the Makefiles. Improved the Makefiles.
</UL> </UL>
<H3>Release 2 (1997 June)</H3> <H3>Release 2 (1997 June)</H3>
<UL> <UL>
<LI> <LI>
Created the <NOBR>64-bit</NOBR> (<CODE>bits64</CODE>) version, adding the Created the <NOBR>64-bit</NOBR> (<CODE>bits64</CODE>) version, adding the
<CODE>floatx80</CODE> and <CODE>float128</CODE> formats. <CODE>floatx80</CODE> and <CODE>float128</CODE> formats.
<LI> <LI>
Changed the source directory structure, splitting the sources into a Changed the source directory structure, splitting the sources into a
<CODE>bits32</CODE> and a <CODE>bits64</CODE> version. <CODE>bits32</CODE> and a <CODE>bits64</CODE> version.
Renamed <CODE>environment.h</CODE> to <CODE>milieu.h</CODE> to avoid confusion Renamed <CODE>environment.h</CODE> to <CODE>milieu.h</CODE> to avoid confusion
with environment variables. with environment variables.
<LI> <LI>
Fixed a small error that caused <CODE>float64_round_to_int</CODE> often to Fixed a small error that caused <CODE>float64_round_to_int</CODE> often to
round the wrong way in nearest/even mode when the operand was between round the wrong way in nearest/even mode when the operand was between
2<SUP>20</SUP> and 2<SUP>21</SUP> and halfway between two integers. 2<SUP>20</SUP> and 2<SUP>21</SUP> and halfway between two integers.
</UL> </UL>
<H3>Release 1a (1996 July)</H3> <H3>Release 1a (1996 July)</H3>
<UL> <UL>
<LI> <LI>
Corrected a mistake that caused borderline underflow cases not to raise the Corrected a mistake that caused borderline underflow cases not to raise the
underflow flag when they should have. underflow flag when they should have.
(Problem reported by Doug Priest.) (Problem reported by Doug Priest.)
<LI> <LI>
Added the <CODE>float_detect_tininess</CODE> variable to control whether Added the <CODE>float_detect_tininess</CODE> variable to control whether
tininess is detected before or after rounding. tininess is detected before or after rounding.
</UL> </UL>
<H3>Release 1 (1996 July)</H3> <H3>Release 1 (1996 July)</H3>
<UL> <UL>
<LI> <LI>
Original release, based on work done for the International Computer Science Original release, based on work done for the International Computer Science
Institute (ICSI) in Berkeley, California. Institute (ICSI) in Berkeley, California.
</UL> </UL>
</BODY> </BODY>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,57 +1,57 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
bool extF80M_isSignalingNaN( const extFloat80_t *aPtr ) bool extF80M_isSignalingNaN( const extFloat80_t *aPtr )
{ {
const struct extFloat80M *aSPtr; const struct extFloat80M *aSPtr;
uint64_t uiA0; uint64_t uiA0;
aSPtr = (const struct extFloat80M *) aPtr; aSPtr = (const struct extFloat80M *) aPtr;
if ( (aSPtr->signExp & 0x7FFF) != 0x7FFF ) return false; if ( (aSPtr->signExp & 0x7FFF) != 0x7FFF ) return false;
uiA0 = aSPtr->signif; uiA0 = aSPtr->signif;
return return
! (uiA0 & UINT64_C( 0x4000000000000000 )) ! (uiA0 & UINT64_C( 0x4000000000000000 ))
&& (uiA0 & UINT64_C( 0x3FFFFFFFFFFFFFFF)); && (uiA0 & UINT64_C( 0x3FFFFFFFFFFFFFFF));
} }

View File

@ -1,60 +1,60 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
bool f128M_isSignalingNaN( const float128_t *aPtr ) bool f128M_isSignalingNaN( const float128_t *aPtr )
{ {
const uint32_t *aWPtr; const uint32_t *aWPtr;
uint32_t uiA96; uint32_t uiA96;
aWPtr = (const uint32_t *) aPtr; aWPtr = (const uint32_t *) aPtr;
uiA96 = aWPtr[indexWordHi( 4 )]; uiA96 = aWPtr[indexWordHi( 4 )];
if ( (uiA96 & 0x7FFF8000) != 0x7FFF0000 ) return false; if ( (uiA96 & 0x7FFF8000) != 0x7FFF0000 ) return false;
return return
((uiA96 & 0x00007FFF) != 0) ((uiA96 & 0x00007FFF) != 0)
|| ((aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )] || ((aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
| aWPtr[indexWord( 4, 0 )]) | aWPtr[indexWord( 4, 0 )])
!= 0); != 0);
} }

View File

@ -0,0 +1,59 @@
/*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/
#include <stdint.h>
#include "platform.h"
#include "specialize.h"
#include "softfloat.h"
/*----------------------------------------------------------------------------
| Assuming `uiA' has the bit pattern of a BF16 NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised.
*----------------------------------------------------------------------------*/
void softfloat_bf16UIToCommonNaN( uint_fast16_t uiA, struct commonNaN *zPtr )
{
if ( softfloat_isSigNaNBF16UI( uiA ) ) {
softfloat_raiseFlags( softfloat_flag_invalid );
}
zPtr->sign = uiA>>15;
zPtr->v64 = (uint_fast64_t) uiA<<56;
zPtr->v0 = 0;
}

View File

@ -0,0 +1,51 @@
/*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/
#include <stdint.h>
#include "platform.h"
#include "specialize.h"
/*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a BF16 NaN, and
| returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/
uint_fast16_t softfloat_commonNaNToBF16UI( const struct commonNaN *aPtr )
{
return (uint_fast16_t) aPtr->sign<<15 | 0x7FC0 | aPtr->v64>>56;
}

View File

@ -1,56 +1,56 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into an 80-bit extended | Converts the common NaN pointed to by `aPtr' into an 80-bit extended
| floating-point NaN, and stores this NaN at the location pointed to by | floating-point NaN, and stores this NaN at the location pointed to by
| `zSPtr'. | `zSPtr'.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_commonNaNToExtF80M( softfloat_commonNaNToExtF80M(
const struct commonNaN *aPtr, struct extFloat80M *zSPtr ) const struct commonNaN *aPtr, struct extFloat80M *zSPtr )
{ {
zSPtr->signExp = packToExtF80UI64( aPtr->sign, 0x7FFF ); zSPtr->signExp = packToExtF80UI64( aPtr->sign, 0x7FFF );
zSPtr->signif = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1; zSPtr->signif = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1;
} }

View File

@ -1,56 +1,56 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into an 80-bit extended | Converts the common NaN pointed to by `aPtr' into an 80-bit extended
| floating-point NaN, and returns the bit pattern of this value as an unsigned | floating-point NaN, and returns the bit pattern of this value as an unsigned
| integer. | integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct uint128 softfloat_commonNaNToExtF80UI( const struct commonNaN *aPtr ) struct uint128 softfloat_commonNaNToExtF80UI( const struct commonNaN *aPtr )
{ {
struct uint128 uiZ; struct uint128 uiZ;
uiZ.v64 = (uint_fast16_t) aPtr->sign<<15 | 0x7FFF; uiZ.v64 = (uint_fast16_t) aPtr->sign<<15 | 0x7FFF;
uiZ.v0 = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1; uiZ.v0 = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1;
return uiZ; return uiZ;
} }

View File

@ -1,56 +1,56 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point | Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point
| NaN, and stores this NaN at the location pointed to by `zWPtr'. Argument | NaN, and stores this NaN at the location pointed to by `zWPtr'. Argument
| `zWPtr' points to an array of four 32-bit elements that concatenate in the | `zWPtr' points to an array of four 32-bit elements that concatenate in the
| platform's normal endian order to form a 128-bit floating-point value. | platform's normal endian order to form a 128-bit floating-point value.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_commonNaNToF128M( const struct commonNaN *aPtr, uint32_t *zWPtr ) softfloat_commonNaNToF128M( const struct commonNaN *aPtr, uint32_t *zWPtr )
{ {
softfloat_shortShiftRight128M( (const uint32_t *) &aPtr->v0, 16, zWPtr ); softfloat_shortShiftRight128M( (const uint32_t *) &aPtr->v0, 16, zWPtr );
zWPtr[indexWordHi( 4 )] |= (uint32_t) aPtr->sign<<31 | 0x7FFF8000; zWPtr[indexWordHi( 4 )] |= (uint32_t) aPtr->sign<<31 | 0x7FFF8000;
} }

View File

@ -1,55 +1,55 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point | Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct uint128 softfloat_commonNaNToF128UI( const struct commonNaN *aPtr ) struct uint128 softfloat_commonNaNToF128UI( const struct commonNaN *aPtr )
{ {
struct uint128 uiZ; struct uint128 uiZ;
uiZ = softfloat_shortShiftRight128( aPtr->v64, aPtr->v0, 16 ); uiZ = softfloat_shortShiftRight128( aPtr->v64, aPtr->v0, 16 );
uiZ.v64 |= (uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FFF800000000000 ); uiZ.v64 |= (uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FFF800000000000 );
return uiZ; return uiZ;
} }

View File

@ -1,51 +1,51 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a 16-bit floating-point | Converts the common NaN pointed to by `aPtr' into a 16-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast16_t softfloat_commonNaNToF16UI( const struct commonNaN *aPtr ) uint_fast16_t softfloat_commonNaNToF16UI( const struct commonNaN *aPtr )
{ {
return (uint_fast16_t) aPtr->sign<<15 | 0x7E00 | aPtr->v64>>54; return (uint_fast16_t) aPtr->sign<<15 | 0x7E00 | aPtr->v64>>54;
} }

View File

@ -1,51 +1,51 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a 32-bit floating-point | Converts the common NaN pointed to by `aPtr' into a 32-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast32_t softfloat_commonNaNToF32UI( const struct commonNaN *aPtr ) uint_fast32_t softfloat_commonNaNToF32UI( const struct commonNaN *aPtr )
{ {
return (uint_fast32_t) aPtr->sign<<31 | 0x7FC00000 | aPtr->v64>>41; return (uint_fast32_t) aPtr->sign<<31 | 0x7FC00000 | aPtr->v64>>41;
} }

View File

@ -1,53 +1,53 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a 64-bit floating-point | Converts the common NaN pointed to by `aPtr' into a 64-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast64_t softfloat_commonNaNToF64UI( const struct commonNaN *aPtr ) uint_fast64_t softfloat_commonNaNToF64UI( const struct commonNaN *aPtr )
{ {
return return
(uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FF8000000000000 ) (uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FF8000000000000 )
| aPtr->v64>>12; | aPtr->v64>>12;
} }

View File

@ -1,62 +1,62 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming the 80-bit extended floating-point value pointed to by `aSPtr' is | Assuming the 80-bit extended floating-point value pointed to by `aSPtr' is
| a NaN, converts this NaN to the common NaN form, and stores the resulting | a NaN, converts this NaN to the common NaN form, and stores the resulting
| common NaN at the location pointed to by `zPtr'. If the NaN is a signaling | common NaN at the location pointed to by `zPtr'. If the NaN is a signaling
| NaN, the invalid exception is raised. | NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_extF80MToCommonNaN( softfloat_extF80MToCommonNaN(
const struct extFloat80M *aSPtr, struct commonNaN *zPtr ) const struct extFloat80M *aSPtr, struct commonNaN *zPtr )
{ {
if ( extF80M_isSignalingNaN( (const extFloat80_t *) aSPtr ) ) { if ( extF80M_isSignalingNaN( (const extFloat80_t *) aSPtr ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
zPtr->sign = signExtF80UI64( aSPtr->signExp ); zPtr->sign = signExtF80UI64( aSPtr->signExp );
zPtr->v64 = aSPtr->signif<<1; zPtr->v64 = aSPtr->signif<<1;
zPtr->v0 = 0; zPtr->v0 = 0;
} }

View File

@ -1,62 +1,62 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0' | Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0'
| has the bit pattern of an 80-bit extended floating-point NaN, converts | has the bit pattern of an 80-bit extended floating-point NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the | this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid | location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_extF80UIToCommonNaN( softfloat_extF80UIToCommonNaN(
uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr ) uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr )
{ {
if ( softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) ) { if ( softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
zPtr->sign = uiA64>>15; zPtr->sign = uiA64>>15;
zPtr->v64 = uiA0<<1; zPtr->v64 = uiA0<<1;
zPtr->v0 = 0; zPtr->v0 = 0;
} }

View File

@ -1,62 +1,62 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming the 128-bit floating-point value pointed to by `aWPtr' is a NaN, | Assuming the 128-bit floating-point value pointed to by `aWPtr' is a NaN,
| converts this NaN to the common NaN form, and stores the resulting common | converts this NaN to the common NaN form, and stores the resulting common
| NaN at the location pointed to by `zPtr'. If the NaN is a signaling NaN, | NaN at the location pointed to by `zPtr'. If the NaN is a signaling NaN,
| the invalid exception is raised. Argument `aWPtr' points to an array of | the invalid exception is raised. Argument `aWPtr' points to an array of
| four 32-bit elements that concatenate in the platform's normal endian order | four 32-bit elements that concatenate in the platform's normal endian order
| to form a 128-bit floating-point value. | to form a 128-bit floating-point value.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_f128MToCommonNaN( const uint32_t *aWPtr, struct commonNaN *zPtr ) softfloat_f128MToCommonNaN( const uint32_t *aWPtr, struct commonNaN *zPtr )
{ {
if ( f128M_isSignalingNaN( (const float128_t *) aWPtr ) ) { if ( f128M_isSignalingNaN( (const float128_t *) aWPtr ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
zPtr->sign = aWPtr[indexWordHi( 4 )]>>31; zPtr->sign = aWPtr[indexWordHi( 4 )]>>31;
softfloat_shortShiftLeft128M( aWPtr, 16, (uint32_t *) &zPtr->v0 ); softfloat_shortShiftLeft128M( aWPtr, 16, (uint32_t *) &zPtr->v0 );
} }

View File

@ -1,65 +1,65 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0' | Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0'
| has the bit pattern of a 128-bit floating-point NaN, converts this NaN to | has the bit pattern of a 128-bit floating-point NaN, converts this NaN to
| the common NaN form, and stores the resulting common NaN at the location | the common NaN form, and stores the resulting common NaN at the location
| pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid exception | pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid exception
| is raised. | is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_f128UIToCommonNaN( softfloat_f128UIToCommonNaN(
uint_fast64_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr ) uint_fast64_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr )
{ {
struct uint128 NaNSig; struct uint128 NaNSig;
if ( softfloat_isSigNaNF128UI( uiA64, uiA0 ) ) { if ( softfloat_isSigNaNF128UI( uiA64, uiA0 ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
NaNSig = softfloat_shortShiftLeft128( uiA64, uiA0, 16 ); NaNSig = softfloat_shortShiftLeft128( uiA64, uiA0, 16 );
zPtr->sign = uiA64>>63; zPtr->sign = uiA64>>63;
zPtr->v64 = NaNSig.v64; zPtr->v64 = NaNSig.v64;
zPtr->v0 = NaNSig.v0; zPtr->v0 = NaNSig.v0;
} }

View File

@ -1,59 +1,59 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming `uiA' has the bit pattern of a 16-bit floating-point NaN, converts | Assuming `uiA' has the bit pattern of a 16-bit floating-point NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the | this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid | location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_f16UIToCommonNaN( uint_fast16_t uiA, struct commonNaN *zPtr ) void softfloat_f16UIToCommonNaN( uint_fast16_t uiA, struct commonNaN *zPtr )
{ {
if ( softfloat_isSigNaNF16UI( uiA ) ) { if ( softfloat_isSigNaNF16UI( uiA ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
zPtr->sign = uiA>>15; zPtr->sign = uiA>>15;
zPtr->v64 = (uint_fast64_t) uiA<<54; zPtr->v64 = (uint_fast64_t) uiA<<54;
zPtr->v0 = 0; zPtr->v0 = 0;
} }

View File

@ -1,59 +1,59 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming `uiA' has the bit pattern of a 32-bit floating-point NaN, converts | Assuming `uiA' has the bit pattern of a 32-bit floating-point NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the | this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid | location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_f32UIToCommonNaN( uint_fast32_t uiA, struct commonNaN *zPtr ) void softfloat_f32UIToCommonNaN( uint_fast32_t uiA, struct commonNaN *zPtr )
{ {
if ( softfloat_isSigNaNF32UI( uiA ) ) { if ( softfloat_isSigNaNF32UI( uiA ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
zPtr->sign = uiA>>31; zPtr->sign = uiA>>31;
zPtr->v64 = (uint_fast64_t) uiA<<41; zPtr->v64 = (uint_fast64_t) uiA<<41;
zPtr->v0 = 0; zPtr->v0 = 0;
} }

View File

@ -1,59 +1,59 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming `uiA' has the bit pattern of a 64-bit floating-point NaN, converts | Assuming `uiA' has the bit pattern of a 64-bit floating-point NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the | this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid | location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_f64UIToCommonNaN( uint_fast64_t uiA, struct commonNaN *zPtr ) void softfloat_f64UIToCommonNaN( uint_fast64_t uiA, struct commonNaN *zPtr )
{ {
if ( softfloat_isSigNaNF64UI( uiA ) ) { if ( softfloat_isSigNaNF64UI( uiA ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
zPtr->sign = uiA>>63; zPtr->sign = uiA>>63;
zPtr->v64 = uiA<<12; zPtr->v64 = uiA<<12;
zPtr->v0 = 0; zPtr->v0 = 0;
} }

View File

@ -1,107 +1,107 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming at least one of the two 80-bit extended floating-point values | Assuming at least one of the two 80-bit extended floating-point values
| pointed to by `aSPtr' and `bSPtr' is a NaN, stores the combined NaN result | pointed to by `aSPtr' and `bSPtr' is a NaN, stores the combined NaN result
| at the location pointed to by `zSPtr'. If either original floating-point | at the location pointed to by `zSPtr'. If either original floating-point
| value is a signaling NaN, the invalid exception is raised. | value is a signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_propagateNaNExtF80M( softfloat_propagateNaNExtF80M(
const struct extFloat80M *aSPtr, const struct extFloat80M *aSPtr,
const struct extFloat80M *bSPtr, const struct extFloat80M *bSPtr,
struct extFloat80M *zSPtr struct extFloat80M *zSPtr
) )
{ {
bool isSigNaNA; bool isSigNaNA;
const struct extFloat80M *sPtr; const struct extFloat80M *sPtr;
bool isSigNaNB; bool isSigNaNB;
uint_fast16_t uiB64; uint_fast16_t uiB64;
uint64_t uiB0; uint64_t uiB0;
uint_fast16_t uiA64; uint_fast16_t uiA64;
uint64_t uiA0; uint64_t uiA0;
uint_fast16_t uiMagA64, uiMagB64; uint_fast16_t uiMagA64, uiMagB64;
isSigNaNA = extF80M_isSignalingNaN( (const extFloat80_t *) aSPtr ); isSigNaNA = extF80M_isSignalingNaN( (const extFloat80_t *) aSPtr );
sPtr = aSPtr; sPtr = aSPtr;
if ( ! bSPtr ) { if ( ! bSPtr ) {
if ( isSigNaNA ) softfloat_raiseFlags( softfloat_flag_invalid ); if ( isSigNaNA ) softfloat_raiseFlags( softfloat_flag_invalid );
goto copy; goto copy;
} }
isSigNaNB = extF80M_isSignalingNaN( (const extFloat80_t *) bSPtr ); isSigNaNB = extF80M_isSignalingNaN( (const extFloat80_t *) bSPtr );
if ( isSigNaNA | isSigNaNB ) { if ( isSigNaNA | isSigNaNB ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
if ( isSigNaNA ) { if ( isSigNaNA ) {
uiB64 = bSPtr->signExp; uiB64 = bSPtr->signExp;
if ( isSigNaNB ) goto returnLargerUIMag; if ( isSigNaNB ) goto returnLargerUIMag;
uiB0 = bSPtr->signif; uiB0 = bSPtr->signif;
if ( isNaNExtF80UI( uiB64, uiB0 ) ) goto copyB; if ( isNaNExtF80UI( uiB64, uiB0 ) ) goto copyB;
goto copy; goto copy;
} else { } else {
uiA64 = aSPtr->signExp; uiA64 = aSPtr->signExp;
uiA0 = aSPtr->signif; uiA0 = aSPtr->signif;
if ( isNaNExtF80UI( uiA64, uiA0 ) ) goto copy; if ( isNaNExtF80UI( uiA64, uiA0 ) ) goto copy;
goto copyB; goto copyB;
} }
} }
uiB64 = bSPtr->signExp; uiB64 = bSPtr->signExp;
returnLargerUIMag: returnLargerUIMag:
uiA64 = aSPtr->signExp; uiA64 = aSPtr->signExp;
uiMagA64 = uiA64 & 0x7FFF; uiMagA64 = uiA64 & 0x7FFF;
uiMagB64 = uiB64 & 0x7FFF; uiMagB64 = uiB64 & 0x7FFF;
if ( uiMagA64 < uiMagB64 ) goto copyB; if ( uiMagA64 < uiMagB64 ) goto copyB;
if ( uiMagB64 < uiMagA64 ) goto copy; if ( uiMagB64 < uiMagA64 ) goto copy;
uiA0 = aSPtr->signif; uiA0 = aSPtr->signif;
uiB0 = bSPtr->signif; uiB0 = bSPtr->signif;
if ( uiA0 < uiB0 ) goto copyB; if ( uiA0 < uiB0 ) goto copyB;
if ( uiB0 < uiA0 ) goto copy; if ( uiB0 < uiA0 ) goto copy;
if ( uiA64 < uiB64 ) goto copy; if ( uiA64 < uiB64 ) goto copy;
copyB: copyB:
sPtr = bSPtr; sPtr = bSPtr;
copy: copy:
zSPtr->signExp = sPtr->signExp; zSPtr->signExp = sPtr->signExp;
zSPtr->signif = sPtr->signif | UINT64_C( 0xC000000000000000 ); zSPtr->signif = sPtr->signif | UINT64_C( 0xC000000000000000 );
} }

View File

@ -1,106 +1,106 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2018 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2018 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting the unsigned integer formed from concatenating 'uiA64' and | Interpreting the unsigned integer formed from concatenating 'uiA64' and
| 'uiA0' as an 80-bit extended floating-point value, and likewise interpreting | 'uiA0' as an 80-bit extended floating-point value, and likewise interpreting
| the unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another | the unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another
| 80-bit extended floating-point value, and assuming at least on of these | 80-bit extended floating-point value, and assuming at least on of these
| floating-point values is a NaN, returns the bit pattern of the combined NaN | floating-point values is a NaN, returns the bit pattern of the combined NaN
| result. If either original floating-point value is a signaling NaN, the | result. If either original floating-point value is a signaling NaN, the
| invalid exception is raised. | invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct uint128 struct uint128
softfloat_propagateNaNExtF80UI( softfloat_propagateNaNExtF80UI(
uint_fast16_t uiA64, uint_fast16_t uiA64,
uint_fast64_t uiA0, uint_fast64_t uiA0,
uint_fast16_t uiB64, uint_fast16_t uiB64,
uint_fast64_t uiB0 uint_fast64_t uiB0
) )
{ {
bool isSigNaNA, isSigNaNB; bool isSigNaNA, isSigNaNB;
uint_fast64_t uiNonsigA0, uiNonsigB0; uint_fast64_t uiNonsigA0, uiNonsigB0;
uint_fast16_t uiMagA64, uiMagB64; uint_fast16_t uiMagA64, uiMagB64;
struct uint128 uiZ; struct uint128 uiZ;
/*------------------------------------------------------------------------ /*------------------------------------------------------------------------
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
isSigNaNA = softfloat_isSigNaNExtF80UI( uiA64, uiA0 ); isSigNaNA = softfloat_isSigNaNExtF80UI( uiA64, uiA0 );
isSigNaNB = softfloat_isSigNaNExtF80UI( uiB64, uiB0 ); isSigNaNB = softfloat_isSigNaNExtF80UI( uiB64, uiB0 );
/*------------------------------------------------------------------------ /*------------------------------------------------------------------------
| Make NaNs non-signaling. | Make NaNs non-signaling.
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
uiNonsigA0 = uiA0 | UINT64_C( 0xC000000000000000 ); uiNonsigA0 = uiA0 | UINT64_C( 0xC000000000000000 );
uiNonsigB0 = uiB0 | UINT64_C( 0xC000000000000000 ); uiNonsigB0 = uiB0 | UINT64_C( 0xC000000000000000 );
/*------------------------------------------------------------------------ /*------------------------------------------------------------------------
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
if ( isSigNaNA | isSigNaNB ) { if ( isSigNaNA | isSigNaNB ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
if ( isSigNaNA ) { if ( isSigNaNA ) {
if ( isSigNaNB ) goto returnLargerMag; if ( isSigNaNB ) goto returnLargerMag;
if ( isNaNExtF80UI( uiB64, uiB0 ) ) goto returnB; if ( isNaNExtF80UI( uiB64, uiB0 ) ) goto returnB;
goto returnA; goto returnA;
} else { } else {
if ( isNaNExtF80UI( uiA64, uiA0 ) ) goto returnA; if ( isNaNExtF80UI( uiA64, uiA0 ) ) goto returnA;
goto returnB; goto returnB;
} }
} }
returnLargerMag: returnLargerMag:
uiMagA64 = uiA64 & 0x7FFF; uiMagA64 = uiA64 & 0x7FFF;
uiMagB64 = uiB64 & 0x7FFF; uiMagB64 = uiB64 & 0x7FFF;
if ( uiMagA64 < uiMagB64 ) goto returnB; if ( uiMagA64 < uiMagB64 ) goto returnB;
if ( uiMagB64 < uiMagA64 ) goto returnA; if ( uiMagB64 < uiMagA64 ) goto returnA;
if ( uiA0 < uiB0 ) goto returnB; if ( uiA0 < uiB0 ) goto returnB;
if ( uiB0 < uiA0 ) goto returnA; if ( uiB0 < uiA0 ) goto returnA;
if ( uiA64 < uiB64 ) goto returnA; if ( uiA64 < uiB64 ) goto returnA;
returnB: returnB:
uiZ.v64 = uiB64; uiZ.v64 = uiB64;
uiZ.v0 = uiNonsigB0; uiZ.v0 = uiNonsigB0;
return uiZ; return uiZ;
returnA: returnA:
uiZ.v64 = uiA64; uiZ.v64 = uiA64;
uiZ.v0 = uiNonsigA0; uiZ.v0 = uiNonsigA0;
return uiZ; return uiZ;
} }

View File

@ -1,76 +1,76 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming at least one of the two 128-bit floating-point values pointed to by | Assuming at least one of the two 128-bit floating-point values pointed to by
| `aWPtr' and `bWPtr' is a NaN, stores the combined NaN result at the location | `aWPtr' and `bWPtr' is a NaN, stores the combined NaN result at the location
| pointed to by `zWPtr'. If either original floating-point value is a | pointed to by `zWPtr'. If either original floating-point value is a
| signaling NaN, the invalid exception is raised. Each of `aWPtr', `bWPtr', | signaling NaN, the invalid exception is raised. Each of `aWPtr', `bWPtr',
| and `zWPtr' points to an array of four 32-bit elements that concatenate in | and `zWPtr' points to an array of four 32-bit elements that concatenate in
| the platform's normal endian order to form a 128-bit floating-point value. | the platform's normal endian order to form a 128-bit floating-point value.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_propagateNaNF128M( softfloat_propagateNaNF128M(
const uint32_t *aWPtr, const uint32_t *bWPtr, uint32_t *zWPtr ) const uint32_t *aWPtr, const uint32_t *bWPtr, uint32_t *zWPtr )
{ {
bool isSigNaNA; bool isSigNaNA;
const uint32_t *ptr; const uint32_t *ptr;
ptr = aWPtr; ptr = aWPtr;
isSigNaNA = f128M_isSignalingNaN( (const float128_t *) aWPtr ); isSigNaNA = f128M_isSignalingNaN( (const float128_t *) aWPtr );
if ( if (
isSigNaNA isSigNaNA
|| (bWPtr && f128M_isSignalingNaN( (const float128_t *) bWPtr )) || (bWPtr && f128M_isSignalingNaN( (const float128_t *) bWPtr ))
) { ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
if ( isSigNaNA ) goto copy; if ( isSigNaNA ) goto copy;
} }
if ( ! softfloat_isNaNF128M( aWPtr ) ) ptr = bWPtr; if ( ! softfloat_isNaNF128M( aWPtr ) ) ptr = bWPtr;
copy: copy:
zWPtr[indexWordHi( 4 )] = ptr[indexWordHi( 4 )] | 0x00008000; zWPtr[indexWordHi( 4 )] = ptr[indexWordHi( 4 )] | 0x00008000;
zWPtr[indexWord( 4, 2 )] = ptr[indexWord( 4, 2 )]; zWPtr[indexWord( 4, 2 )] = ptr[indexWord( 4, 2 )];
zWPtr[indexWord( 4, 1 )] = ptr[indexWord( 4, 1 )]; zWPtr[indexWord( 4, 1 )] = ptr[indexWord( 4, 1 )];
zWPtr[indexWord( 4, 0 )] = ptr[indexWord( 4, 0 )]; zWPtr[indexWord( 4, 0 )] = ptr[indexWord( 4, 0 )];
} }

View File

@ -1,81 +1,81 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting the unsigned integer formed from concatenating `uiA64' and | Interpreting the unsigned integer formed from concatenating `uiA64' and
| `uiA0' as a 128-bit floating-point value, and likewise interpreting the | `uiA0' as a 128-bit floating-point value, and likewise interpreting the
| unsigned integer formed from concatenating `uiB64' and `uiB0' as another | unsigned integer formed from concatenating `uiB64' and `uiB0' as another
| 128-bit floating-point value, and assuming at least on of these floating- | 128-bit floating-point value, and assuming at least on of these floating-
| point values is a NaN, returns the bit pattern of the combined NaN result. | point values is a NaN, returns the bit pattern of the combined NaN result.
| If either original floating-point value is a signaling NaN, the invalid | If either original floating-point value is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct uint128 struct uint128
softfloat_propagateNaNF128UI( softfloat_propagateNaNF128UI(
uint_fast64_t uiA64, uint_fast64_t uiA64,
uint_fast64_t uiA0, uint_fast64_t uiA0,
uint_fast64_t uiB64, uint_fast64_t uiB64,
uint_fast64_t uiB0 uint_fast64_t uiB0
) )
{ {
bool isSigNaNA; bool isSigNaNA;
struct uint128 uiZ; struct uint128 uiZ;
isSigNaNA = softfloat_isSigNaNF128UI( uiA64, uiA0 ); isSigNaNA = softfloat_isSigNaNF128UI( uiA64, uiA0 );
if ( isSigNaNA || softfloat_isSigNaNF128UI( uiB64, uiB0 ) ) { if ( isSigNaNA || softfloat_isSigNaNF128UI( uiB64, uiB0 ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
if ( isSigNaNA ) goto returnNonsigA; if ( isSigNaNA ) goto returnNonsigA;
} }
if ( isNaNF128UI( uiA64, uiA0 ) ) { if ( isNaNF128UI( uiA64, uiA0 ) ) {
returnNonsigA: returnNonsigA:
uiZ.v64 = uiA64; uiZ.v64 = uiA64;
uiZ.v0 = uiA0; uiZ.v0 = uiA0;
} else { } else {
uiZ.v64 = uiB64; uiZ.v64 = uiB64;
uiZ.v0 = uiB0; uiZ.v0 = uiB0;
} }
uiZ.v64 |= UINT64_C( 0x0000800000000000 ); uiZ.v64 |= UINT64_C( 0x0000800000000000 );
return uiZ; return uiZ;
} }

View File

@ -1,63 +1,63 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting `uiA' and `uiB' as the bit patterns of two 16-bit floating- | Interpreting `uiA' and `uiB' as the bit patterns of two 16-bit floating-
| point values, at least one of which is a NaN, returns the bit pattern of | point values, at least one of which is a NaN, returns the bit pattern of
| the combined NaN result. If either `uiA' or `uiB' has the pattern of a | the combined NaN result. If either `uiA' or `uiB' has the pattern of a
| signaling NaN, the invalid exception is raised. | signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast16_t uint_fast16_t
softfloat_propagateNaNF16UI( uint_fast16_t uiA, uint_fast16_t uiB ) softfloat_propagateNaNF16UI( uint_fast16_t uiA, uint_fast16_t uiB )
{ {
bool isSigNaNA; bool isSigNaNA;
isSigNaNA = softfloat_isSigNaNF16UI( uiA ); isSigNaNA = softfloat_isSigNaNF16UI( uiA );
if ( isSigNaNA || softfloat_isSigNaNF16UI( uiB ) ) { if ( isSigNaNA || softfloat_isSigNaNF16UI( uiB ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
if ( isSigNaNA ) return uiA | 0x0200; if ( isSigNaNA ) return uiA | 0x0200;
} }
return (isNaNF16UI( uiA ) ? uiA : uiB) | 0x0200; return (isNaNF16UI( uiA ) ? uiA : uiB) | 0x0200;
} }

View File

@ -1,63 +1,63 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting `uiA' and `uiB' as the bit patterns of two 32-bit floating- | Interpreting `uiA' and `uiB' as the bit patterns of two 32-bit floating-
| point values, at least one of which is a NaN, returns the bit pattern of | point values, at least one of which is a NaN, returns the bit pattern of
| the combined NaN result. If either `uiA' or `uiB' has the pattern of a | the combined NaN result. If either `uiA' or `uiB' has the pattern of a
| signaling NaN, the invalid exception is raised. | signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast32_t uint_fast32_t
softfloat_propagateNaNF32UI( uint_fast32_t uiA, uint_fast32_t uiB ) softfloat_propagateNaNF32UI( uint_fast32_t uiA, uint_fast32_t uiB )
{ {
bool isSigNaNA; bool isSigNaNA;
isSigNaNA = softfloat_isSigNaNF32UI( uiA ); isSigNaNA = softfloat_isSigNaNF32UI( uiA );
if ( isSigNaNA || softfloat_isSigNaNF32UI( uiB ) ) { if ( isSigNaNA || softfloat_isSigNaNF32UI( uiB ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
if ( isSigNaNA ) return uiA | 0x00400000; if ( isSigNaNA ) return uiA | 0x00400000;
} }
return (isNaNF32UI( uiA ) ? uiA : uiB) | 0x00400000; return (isNaNF32UI( uiA ) ? uiA : uiB) | 0x00400000;
} }

View File

@ -1,63 +1,63 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting `uiA' and `uiB' as the bit patterns of two 64-bit floating- | Interpreting `uiA' and `uiB' as the bit patterns of two 64-bit floating-
| point values, at least one of which is a NaN, returns the bit pattern of | point values, at least one of which is a NaN, returns the bit pattern of
| the combined NaN result. If either `uiA' or `uiB' has the pattern of a | the combined NaN result. If either `uiA' or `uiB' has the pattern of a
| signaling NaN, the invalid exception is raised. | signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast64_t uint_fast64_t
softfloat_propagateNaNF64UI( uint_fast64_t uiA, uint_fast64_t uiB ) softfloat_propagateNaNF64UI( uint_fast64_t uiA, uint_fast64_t uiB )
{ {
bool isSigNaNA; bool isSigNaNA;
isSigNaNA = softfloat_isSigNaNF64UI( uiA ); isSigNaNA = softfloat_isSigNaNF64UI( uiA );
if ( isSigNaNA || softfloat_isSigNaNF64UI( uiB ) ) { if ( isSigNaNA || softfloat_isSigNaNF64UI( uiB ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
if ( isSigNaNA ) return uiA | UINT64_C( 0x0008000000000000 ); if ( isSigNaNA ) return uiA | UINT64_C( 0x0008000000000000 );
} }
return (isNaNF64UI( uiA ) ? uiA : uiB) | UINT64_C( 0x0008000000000000 ); return (isNaNF64UI( uiA ) ? uiA : uiB) | UINT64_C( 0x0008000000000000 );
} }

View File

@ -1,52 +1,52 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include "platform.h" #include "platform.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Raises the exceptions specified by `flags'. Floating-point traps can be | Raises the exceptions specified by `flags'. Floating-point traps can be
| defined here if desired. It is currently not possible for such a trap | defined here if desired. It is currently not possible for such a trap
| to substitute a result value. If traps are not implemented, this routine | to substitute a result value. If traps are not implemented, this routine
| should be simply `softfloat_exceptionFlags |= flags;'. | should be simply `softfloat_exceptionFlags |= flags;'.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_raiseFlags( uint_fast8_t flags ) void softfloat_raiseFlags( uint_fast8_t flags )
{ {
softfloat_exceptionFlags |= flags; softfloat_exceptionFlags |= flags;
} }

View File

@ -1,346 +1,367 @@
/*============================================================================ /*============================================================================
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2018 The Regents of the Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2018 The Regents of the
University of California. All rights reserved. University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#ifndef specialize_h #ifndef specialize_h
#define specialize_h 1 #define specialize_h 1
#include "primitiveTypes.h" #include "primitiveTypes.h"
#include "softfloat.h" #include "softfloat.h"
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Default value for 'softfloat_detectTininess'. | Default value for 'softfloat_detectTininess'.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define init_detectTininess softfloat_tininess_afterRounding #define init_detectTininess softfloat_tininess_afterRounding
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| The values to return on conversions to 32-bit integer formats that raise an | The values to return on conversions to 32-bit integer formats that raise an
| invalid exception. | invalid exception.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define ui32_fromPosOverflow 0xFFFFFFFF #define ui32_fromPosOverflow 0xFFFFFFFF
#define ui32_fromNegOverflow 0xFFFFFFFF #define ui32_fromNegOverflow 0xFFFFFFFF
#define ui32_fromNaN 0xFFFFFFFF #define ui32_fromNaN 0xFFFFFFFF
#define i32_fromPosOverflow (-0x7FFFFFFF - 1) #define i32_fromPosOverflow (-0x7FFFFFFF - 1)
#define i32_fromNegOverflow (-0x7FFFFFFF - 1) #define i32_fromNegOverflow (-0x7FFFFFFF - 1)
#define i32_fromNaN (-0x7FFFFFFF - 1) #define i32_fromNaN (-0x7FFFFFFF - 1)
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| The values to return on conversions to 64-bit integer formats that raise an | The values to return on conversions to 64-bit integer formats that raise an
| invalid exception. | invalid exception.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define ui64_fromPosOverflow UINT64_C(0xFFFFFFFFFFFFFFFF) #define ui64_fromPosOverflow UINT64_C(0xFFFFFFFFFFFFFFFF)
#define ui64_fromNegOverflow UINT64_C(0xFFFFFFFFFFFFFFFF) #define ui64_fromNegOverflow UINT64_C(0xFFFFFFFFFFFFFFFF)
#define ui64_fromNaN UINT64_C(0xFFFFFFFFFFFFFFFF) #define ui64_fromNaN UINT64_C(0xFFFFFFFFFFFFFFFF)
#define i64_fromPosOverflow (-INT64_C(0x7FFFFFFFFFFFFFFF) - 1) #define i64_fromPosOverflow (-INT64_C(0x7FFFFFFFFFFFFFFF) - 1)
#define i64_fromNegOverflow (-INT64_C(0x7FFFFFFFFFFFFFFF) - 1) #define i64_fromNegOverflow (-INT64_C(0x7FFFFFFFFFFFFFFF) - 1)
#define i64_fromNaN (-INT64_C(0x7FFFFFFFFFFFFFFF) - 1) #define i64_fromNaN (-INT64_C(0x7FFFFFFFFFFFFFFF) - 1)
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| "Common NaN" structure, used to transfer NaN representations from one format | "Common NaN" structure, used to transfer NaN representations from one format
| to another. | to another.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct commonNaN { struct commonNaN {
bool sign; bool sign;
#ifdef LITTLEENDIAN #ifdef LITTLEENDIAN
uint64_t v0, v64; uint64_t v0, v64;
#else #else
uint64_t v64, v0; uint64_t v64, v0;
#endif #endif
}; };
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| The bit pattern for a default generated 16-bit floating-point NaN. | The bit pattern for a default generated 16-bit floating-point NaN.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define defaultNaNF16UI 0xFE00 #define defaultNaNF16UI 0xFE00
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Returns true when 16-bit unsigned integer 'uiA' has the bit pattern of a | Returns true when 16-bit unsigned integer 'uiA' has the bit pattern of a
| 16-bit floating-point signaling NaN. | 16-bit floating-point signaling NaN.
| Note: This macro evaluates its argument more than once. | Note: This macro evaluates its argument more than once.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define softfloat_isSigNaNF16UI(uiA) ((((uiA)&0x7E00) == 0x7C00) && ((uiA)&0x01FF)) #define softfloat_isSigNaNF16UI(uiA) ((((uiA)&0x7E00) == 0x7C00) && ((uiA)&0x01FF))
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming 'uiA' has the bit pattern of a 16-bit floating-point NaN, converts | Assuming 'uiA' has the bit pattern of a 16-bit floating-point NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the | this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid | location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_f16UIToCommonNaN(uint_fast16_t uiA, struct commonNaN* zPtr); void softfloat_f16UIToCommonNaN(uint_fast16_t uiA, struct commonNaN* zPtr);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by 'aPtr' into a 16-bit floating-point | Converts the common NaN pointed to by 'aPtr' into a 16-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast16_t softfloat_commonNaNToF16UI(const struct commonNaN* aPtr); uint_fast16_t softfloat_commonNaNToF16UI(const struct commonNaN* aPtr);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting 'uiA' and 'uiB' as the bit patterns of two 16-bit floating- | Interpreting 'uiA' and 'uiB' as the bit patterns of two 16-bit floating-
| point values, at least one of which is a NaN, returns the bit pattern of | point values, at least one of which is a NaN, returns the bit pattern of
| the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a | the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a
| signaling NaN, the invalid exception is raised. | signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast16_t softfloat_propagateNaNF16UI(uint_fast16_t uiA, uint_fast16_t uiB); uint_fast16_t softfloat_propagateNaNF16UI(uint_fast16_t uiA, uint_fast16_t uiB);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| The bit pattern for a default generated 32-bit floating-point NaN. | Returns true when 16-bit unsigned integer 'uiA' has the bit pattern of a
*----------------------------------------------------------------------------*/ | 16-bit brain floating-point (BF16) signaling NaN.
#define defaultNaNF32UI 0xFFC00000 | Note: This macro evaluates its argument more than once.
*----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------- #define softfloat_isSigNaNBF16UI(uiA) ((((uiA)&0x7FC0) == 0x7F80) && ((uiA)&0x003F))
| Returns true when 32-bit unsigned integer 'uiA' has the bit pattern of a
| 32-bit floating-point signaling NaN. /*----------------------------------------------------------------------------
| Note: This macro evaluates its argument more than once. | Assuming 'uiA' has the bit pattern of a 16-bit BF16 floating-point NaN, converts
*----------------------------------------------------------------------------*/ | this NaN to the common NaN form, and stores the resulting common NaN at the
#define softfloat_isSigNaNF32UI(uiA) ((((uiA)&0x7FC00000) == 0x7F800000) && ((uiA)&0x003FFFFF)) | location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised.
/*---------------------------------------------------------------------------- *----------------------------------------------------------------------------*/
| Assuming 'uiA' has the bit pattern of a 32-bit floating-point NaN, converts void softfloat_bf16UIToCommonNaN(uint_fast16_t uiA, struct commonNaN* zPtr);
| this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid /*----------------------------------------------------------------------------
| exception is raised. | Converts the common NaN pointed to by 'aPtr' into a 16-bit floating-point
*----------------------------------------------------------------------------*/ | NaN, and returns the bit pattern of this value as an unsigned integer.
void softfloat_f32UIToCommonNaN(uint_fast32_t uiA, struct commonNaN* zPtr); *----------------------------------------------------------------------------*/
uint_fast16_t softfloat_commonNaNToBF16UI(const struct commonNaN* aPtr);
/*----------------------------------------------------------------------------
| Converts the common NaN pointed to by 'aPtr' into a 32-bit floating-point /*----------------------------------------------------------------------------
| NaN, and returns the bit pattern of this value as an unsigned integer. | The bit pattern for a default generated 32-bit floating-point NaN.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast32_t softfloat_commonNaNToF32UI(const struct commonNaN* aPtr); #define defaultNaNF32UI 0xFFC00000
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting 'uiA' and 'uiB' as the bit patterns of two 32-bit floating- | Returns true when 32-bit unsigned integer 'uiA' has the bit pattern of a
| point values, at least one of which is a NaN, returns the bit pattern of | 32-bit floating-point signaling NaN.
| the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a | Note: This macro evaluates its argument more than once.
| signaling NaN, the invalid exception is raised. *----------------------------------------------------------------------------*/
*----------------------------------------------------------------------------*/ #define softfloat_isSigNaNF32UI(uiA) ((((uiA)&0x7FC00000) == 0x7F800000) && ((uiA)&0x003FFFFF))
uint_fast32_t softfloat_propagateNaNF32UI(uint_fast32_t uiA, uint_fast32_t uiB);
/*----------------------------------------------------------------------------
/*---------------------------------------------------------------------------- | Assuming 'uiA' has the bit pattern of a 32-bit floating-point NaN, converts
| The bit pattern for a default generated 64-bit floating-point NaN. | this NaN to the common NaN form, and stores the resulting common NaN at the
*----------------------------------------------------------------------------*/ | location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid
#define defaultNaNF64UI UINT64_C(0xFFF8000000000000) | exception is raised.
*----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------- void softfloat_f32UIToCommonNaN(uint_fast32_t uiA, struct commonNaN* zPtr);
| Returns true when 64-bit unsigned integer 'uiA' has the bit pattern of a
| 64-bit floating-point signaling NaN. /*----------------------------------------------------------------------------
| Note: This macro evaluates its argument more than once. | Converts the common NaN pointed to by 'aPtr' into a 32-bit floating-point
*----------------------------------------------------------------------------*/ | NaN, and returns the bit pattern of this value as an unsigned integer.
#define softfloat_isSigNaNF64UI(uiA) \ *----------------------------------------------------------------------------*/
((((uiA)&UINT64_C(0x7FF8000000000000)) == UINT64_C(0x7FF0000000000000)) && ((uiA)&UINT64_C(0x0007FFFFFFFFFFFF))) uint_fast32_t softfloat_commonNaNToF32UI(const struct commonNaN* aPtr);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming 'uiA' has the bit pattern of a 64-bit floating-point NaN, converts | Interpreting 'uiA' and 'uiB' as the bit patterns of two 32-bit floating-
| this NaN to the common NaN form, and stores the resulting common NaN at the | point values, at least one of which is a NaN, returns the bit pattern of
| location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid | the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a
| exception is raised. | signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_f64UIToCommonNaN(uint_fast64_t uiA, struct commonNaN* zPtr); uint_fast32_t softfloat_propagateNaNF32UI(uint_fast32_t uiA, uint_fast32_t uiB);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by 'aPtr' into a 64-bit floating-point | The bit pattern for a default generated 64-bit floating-point NaN.
| NaN, and returns the bit pattern of this value as an unsigned integer. *----------------------------------------------------------------------------*/
*----------------------------------------------------------------------------*/ #define defaultNaNF64UI UINT64_C(0xFFF8000000000000)
uint_fast64_t softfloat_commonNaNToF64UI(const struct commonNaN* aPtr);
/*----------------------------------------------------------------------------
/*---------------------------------------------------------------------------- | Returns true when 64-bit unsigned integer 'uiA' has the bit pattern of a
| Interpreting 'uiA' and 'uiB' as the bit patterns of two 64-bit floating- | 64-bit floating-point signaling NaN.
| point values, at least one of which is a NaN, returns the bit pattern of | Note: This macro evaluates its argument more than once.
| the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a *----------------------------------------------------------------------------*/
| signaling NaN, the invalid exception is raised. #define softfloat_isSigNaNF64UI(uiA) \
*----------------------------------------------------------------------------*/ ((((uiA)&UINT64_C(0x7FF8000000000000)) == UINT64_C(0x7FF0000000000000)) && ((uiA)&UINT64_C(0x0007FFFFFFFFFFFF)))
uint_fast64_t softfloat_propagateNaNF64UI(uint_fast64_t uiA, uint_fast64_t uiB);
/*----------------------------------------------------------------------------
/*---------------------------------------------------------------------------- | Assuming 'uiA' has the bit pattern of a 64-bit floating-point NaN, converts
| The bit pattern for a default generated 80-bit extended floating-point NaN. | this NaN to the common NaN form, and stores the resulting common NaN at the
*----------------------------------------------------------------------------*/ | location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid
#define defaultNaNExtF80UI64 0xFFFF | exception is raised.
#define defaultNaNExtF80UI0 UINT64_C(0xC000000000000000) *----------------------------------------------------------------------------*/
void softfloat_f64UIToCommonNaN(uint_fast64_t uiA, struct commonNaN* zPtr);
/*----------------------------------------------------------------------------
| Returns true when the 80-bit unsigned integer formed from concatenating /*----------------------------------------------------------------------------
| 16-bit 'uiA64' and 64-bit 'uiA0' has the bit pattern of an 80-bit extended | Converts the common NaN pointed to by 'aPtr' into a 64-bit floating-point
| floating-point signaling NaN. | NaN, and returns the bit pattern of this value as an unsigned integer.
| Note: This macro evaluates its arguments more than once. *----------------------------------------------------------------------------*/
*----------------------------------------------------------------------------*/ uint_fast64_t softfloat_commonNaNToF64UI(const struct commonNaN* aPtr);
#define softfloat_isSigNaNExtF80UI(uiA64, uiA0) \
((((uiA64)&0x7FFF) == 0x7FFF) && !((uiA0)&UINT64_C(0x4000000000000000)) && ((uiA0)&UINT64_C(0x3FFFFFFFFFFFFFFF))) /*----------------------------------------------------------------------------
| Interpreting 'uiA' and 'uiB' as the bit patterns of two 64-bit floating-
#ifdef SOFTFLOAT_FAST_INT64 | point values, at least one of which is a NaN, returns the bit pattern of
| the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a
/*---------------------------------------------------------------------------- | signaling NaN, the invalid exception is raised.
| The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is *----------------------------------------------------------------------------*/
| defined. uint_fast64_t softfloat_propagateNaNF64UI(uint_fast64_t uiA, uint_fast64_t uiB);
*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------
/*---------------------------------------------------------------------------- | The bit pattern for a default generated 80-bit extended floating-point NaN.
| Assuming the unsigned integer formed from concatenating 'uiA64' and 'uiA0' *----------------------------------------------------------------------------*/
| has the bit pattern of an 80-bit extended floating-point NaN, converts #define defaultNaNExtF80UI64 0xFFFF
| this NaN to the common NaN form, and stores the resulting common NaN at the #define defaultNaNExtF80UI0 UINT64_C(0xC000000000000000)
| location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised. /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ | Returns true when the 80-bit unsigned integer formed from concatenating
void softfloat_extF80UIToCommonNaN(uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN* zPtr); | 16-bit 'uiA64' and 64-bit 'uiA0' has the bit pattern of an 80-bit extended
| floating-point signaling NaN.
/*---------------------------------------------------------------------------- | Note: This macro evaluates its arguments more than once.
| Converts the common NaN pointed to by 'aPtr' into an 80-bit extended *----------------------------------------------------------------------------*/
| floating-point NaN, and returns the bit pattern of this value as an unsigned #define softfloat_isSigNaNExtF80UI(uiA64, uiA0) \
| integer. ((((uiA64)&0x7FFF) == 0x7FFF) && !((uiA0)&UINT64_C(0x4000000000000000)) && ((uiA0)&UINT64_C(0x3FFFFFFFFFFFFFFF)))
*----------------------------------------------------------------------------*/
struct uint128 softfloat_commonNaNToExtF80UI(const struct commonNaN* aPtr); #ifdef SOFTFLOAT_FAST_INT64
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting the unsigned integer formed from concatenating 'uiA64' and | The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is
| 'uiA0' as an 80-bit extended floating-point value, and likewise interpreting | defined.
| the unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another *----------------------------------------------------------------------------*/
| 80-bit extended floating-point value, and assuming at least on of these
| floating-point values is a NaN, returns the bit pattern of the combined NaN /*----------------------------------------------------------------------------
| result. If either original floating-point value is a signaling NaN, the | Assuming the unsigned integer formed from concatenating 'uiA64' and 'uiA0'
| invalid exception is raised. | has the bit pattern of an 80-bit extended floating-point NaN, converts
*----------------------------------------------------------------------------*/ | this NaN to the common NaN form, and stores the resulting common NaN at the
struct uint128 softfloat_propagateNaNExtF80UI(uint_fast16_t uiA64, uint_fast64_t uiA0, uint_fast16_t uiB64, uint_fast64_t uiB0); | location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised.
/*---------------------------------------------------------------------------- *----------------------------------------------------------------------------*/
| The bit pattern for a default generated 128-bit floating-point NaN. void softfloat_extF80UIToCommonNaN(uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN* zPtr);
*----------------------------------------------------------------------------*/
#define defaultNaNF128UI64 UINT64_C(0xFFFF800000000000) /*----------------------------------------------------------------------------
#define defaultNaNF128UI0 UINT64_C(0) | Converts the common NaN pointed to by 'aPtr' into an 80-bit extended
| floating-point NaN, and returns the bit pattern of this value as an unsigned
/*---------------------------------------------------------------------------- | integer.
| Returns true when the 128-bit unsigned integer formed from concatenating *----------------------------------------------------------------------------*/
| 64-bit 'uiA64' and 64-bit 'uiA0' has the bit pattern of a 128-bit floating- struct uint128 softfloat_commonNaNToExtF80UI(const struct commonNaN* aPtr);
| point signaling NaN.
| Note: This macro evaluates its arguments more than once. /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ | Interpreting the unsigned integer formed from concatenating 'uiA64' and
#define softfloat_isSigNaNF128UI(uiA64, uiA0) \ | 'uiA0' as an 80-bit extended floating-point value, and likewise interpreting
((((uiA64)&UINT64_C(0x7FFF800000000000)) == UINT64_C(0x7FFF000000000000)) && ((uiA0) || ((uiA64)&UINT64_C(0x00007FFFFFFFFFFF)))) | the unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another
| 80-bit extended floating-point value, and assuming at least on of these
/*---------------------------------------------------------------------------- | floating-point values is a NaN, returns the bit pattern of the combined NaN
| Assuming the unsigned integer formed from concatenating 'uiA64' and 'uiA0' | result. If either original floating-point value is a signaling NaN, the
| has the bit pattern of a 128-bit floating-point NaN, converts this NaN to | invalid exception is raised.
| the common NaN form, and stores the resulting common NaN at the location *----------------------------------------------------------------------------*/
| pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid exception struct uint128 softfloat_propagateNaNExtF80UI(uint_fast16_t uiA64, uint_fast64_t uiA0, uint_fast16_t uiB64, uint_fast64_t uiB0);
| is raised.
*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------
void softfloat_f128UIToCommonNaN(uint_fast64_t uiA64, uint_fast64_t uiA0, struct commonNaN* zPtr); | The bit pattern for a default generated 128-bit floating-point NaN.
*----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------- #define defaultNaNF128UI64 UINT64_C(0xFFFF800000000000)
| Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point #define defaultNaNF128UI0 UINT64_C(0)
| NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------
struct uint128 softfloat_commonNaNToF128UI(const struct commonNaN*); | Returns true when the 128-bit unsigned integer formed from concatenating
| 64-bit 'uiA64' and 64-bit 'uiA0' has the bit pattern of a 128-bit floating-
/*---------------------------------------------------------------------------- | point signaling NaN.
| Interpreting the unsigned integer formed from concatenating 'uiA64' and | Note: This macro evaluates its arguments more than once.
| 'uiA0' as a 128-bit floating-point value, and likewise interpreting the *----------------------------------------------------------------------------*/
| unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another #define softfloat_isSigNaNF128UI(uiA64, uiA0) \
| 128-bit floating-point value, and assuming at least on of these floating- ((((uiA64)&UINT64_C(0x7FFF800000000000)) == UINT64_C(0x7FFF000000000000)) && ((uiA0) || ((uiA64)&UINT64_C(0x00007FFFFFFFFFFF))))
| point values is a NaN, returns the bit pattern of the combined NaN result.
| If either original floating-point value is a signaling NaN, the invalid /*----------------------------------------------------------------------------
| exception is raised. | Assuming the unsigned integer formed from concatenating 'uiA64' and 'uiA0'
*----------------------------------------------------------------------------*/ | has the bit pattern of a 128-bit floating-point NaN, converts this NaN to
struct uint128 softfloat_propagateNaNF128UI(uint_fast64_t uiA64, uint_fast64_t uiA0, uint_fast64_t uiB64, uint_fast64_t uiB0); | the common NaN form, and stores the resulting common NaN at the location
| pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid exception
#else | is raised.
*----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------- void softfloat_f128UIToCommonNaN(uint_fast64_t uiA64, uint_fast64_t uiA0, struct commonNaN* zPtr);
| The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is not
| defined. /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ | Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer.
/*---------------------------------------------------------------------------- *----------------------------------------------------------------------------*/
| Assuming the 80-bit extended floating-point value pointed to by 'aSPtr' is struct uint128 softfloat_commonNaNToF128UI(const struct commonNaN*);
| a NaN, converts this NaN to the common NaN form, and stores the resulting
| common NaN at the location pointed to by 'zPtr'. If the NaN is a signaling /*----------------------------------------------------------------------------
| NaN, the invalid exception is raised. | Interpreting the unsigned integer formed from concatenating 'uiA64' and
*----------------------------------------------------------------------------*/ | 'uiA0' as a 128-bit floating-point value, and likewise interpreting the
void softfloat_extF80MToCommonNaN(const struct extFloat80M* aSPtr, struct commonNaN* zPtr); | unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another
| 128-bit floating-point value, and assuming at least on of these floating-
/*---------------------------------------------------------------------------- | point values is a NaN, returns the bit pattern of the combined NaN result.
| Converts the common NaN pointed to by 'aPtr' into an 80-bit extended | If either original floating-point value is a signaling NaN, the invalid
| floating-point NaN, and stores this NaN at the location pointed to by | exception is raised.
| 'zSPtr'. *----------------------------------------------------------------------------*/
*----------------------------------------------------------------------------*/ struct uint128 softfloat_propagateNaNF128UI(uint_fast64_t uiA64, uint_fast64_t uiA0, uint_fast64_t uiB64, uint_fast64_t uiB0);
void softfloat_commonNaNToExtF80M(const struct commonNaN* aPtr, struct extFloat80M* zSPtr);
#else
/*----------------------------------------------------------------------------
| Assuming at least one of the two 80-bit extended floating-point values /*----------------------------------------------------------------------------
| pointed to by 'aSPtr' and 'bSPtr' is a NaN, stores the combined NaN result | The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is not
| at the location pointed to by 'zSPtr'. If either original floating-point | defined.
| value is a signaling NaN, the invalid exception is raised. *----------------------------------------------------------------------------*/
*----------------------------------------------------------------------------*/
void softfloat_propagateNaNExtF80M(const struct extFloat80M* aSPtr, const struct extFloat80M* bSPtr, struct extFloat80M* zSPtr); /*----------------------------------------------------------------------------
| Assuming the 80-bit extended floating-point value pointed to by 'aSPtr' is
/*---------------------------------------------------------------------------- | a NaN, converts this NaN to the common NaN form, and stores the resulting
| The bit pattern for a default generated 128-bit floating-point NaN. | common NaN at the location pointed to by 'zPtr'. If the NaN is a signaling
*----------------------------------------------------------------------------*/ | NaN, the invalid exception is raised.
#define defaultNaNF128UI96 0xFFFF8000 *----------------------------------------------------------------------------*/
#define defaultNaNF128UI64 0 void softfloat_extF80MToCommonNaN(const struct extFloat80M* aSPtr, struct commonNaN* zPtr);
#define defaultNaNF128UI32 0
#define defaultNaNF128UI0 0 /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by 'aPtr' into an 80-bit extended
/*---------------------------------------------------------------------------- | floating-point NaN, and stores this NaN at the location pointed to by
| Assuming the 128-bit floating-point value pointed to by 'aWPtr' is a NaN, | 'zSPtr'.
| converts this NaN to the common NaN form, and stores the resulting common *----------------------------------------------------------------------------*/
| NaN at the location pointed to by 'zPtr'. If the NaN is a signaling NaN, void softfloat_commonNaNToExtF80M(const struct commonNaN* aPtr, struct extFloat80M* zSPtr);
| the invalid exception is raised. Argument 'aWPtr' points to an array of
| four 32-bit elements that concatenate in the platform's normal endian order /*----------------------------------------------------------------------------
| to form a 128-bit floating-point value. | Assuming at least one of the two 80-bit extended floating-point values
*----------------------------------------------------------------------------*/ | pointed to by 'aSPtr' and 'bSPtr' is a NaN, stores the combined NaN result
void softfloat_f128MToCommonNaN(const uint32_t* aWPtr, struct commonNaN* zPtr); | at the location pointed to by 'zSPtr'. If either original floating-point
| value is a signaling NaN, the invalid exception is raised.
/*---------------------------------------------------------------------------- *----------------------------------------------------------------------------*/
| Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point void softfloat_propagateNaNExtF80M(const struct extFloat80M* aSPtr, const struct extFloat80M* bSPtr, struct extFloat80M* zSPtr);
| NaN, and stores this NaN at the location pointed to by 'zWPtr'. Argument
| 'zWPtr' points to an array of four 32-bit elements that concatenate in the /*----------------------------------------------------------------------------
| platform's normal endian order to form a 128-bit floating-point value. | The bit pattern for a default generated 128-bit floating-point NaN.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_commonNaNToF128M(const struct commonNaN* aPtr, uint32_t* zWPtr); #define defaultNaNF128UI96 0xFFFF8000
#define defaultNaNF128UI64 0
/*---------------------------------------------------------------------------- #define defaultNaNF128UI32 0
| Assuming at least one of the two 128-bit floating-point values pointed to by #define defaultNaNF128UI0 0
| 'aWPtr' and 'bWPtr' is a NaN, stores the combined NaN result at the location
| pointed to by 'zWPtr'. If either original floating-point value is a /*----------------------------------------------------------------------------
| signaling NaN, the invalid exception is raised. Each of 'aWPtr', 'bWPtr', | Assuming the 128-bit floating-point value pointed to by 'aWPtr' is a NaN,
| and 'zWPtr' points to an array of four 32-bit elements that concatenate in | converts this NaN to the common NaN form, and stores the resulting common
| the platform's normal endian order to form a 128-bit floating-point value. | NaN at the location pointed to by 'zPtr'. If the NaN is a signaling NaN,
*----------------------------------------------------------------------------*/ | the invalid exception is raised. Argument 'aWPtr' points to an array of
void softfloat_propagateNaNF128M(const uint32_t* aWPtr, const uint32_t* bWPtr, uint32_t* zWPtr); | four 32-bit elements that concatenate in the platform's normal endian order
| to form a 128-bit floating-point value.
#endif *----------------------------------------------------------------------------*/
void softfloat_f128MToCommonNaN(const uint32_t* aWPtr, struct commonNaN* zPtr);
#endif
/*----------------------------------------------------------------------------
| Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point
| NaN, and stores this NaN at the location pointed to by 'zWPtr'. Argument
| 'zWPtr' points to an array of four 32-bit elements that concatenate in the
| platform's normal endian order to form a 128-bit floating-point value.
*----------------------------------------------------------------------------*/
void softfloat_commonNaNToF128M(const struct commonNaN* aPtr, uint32_t* zWPtr);
/*----------------------------------------------------------------------------
| Assuming at least one of the two 128-bit floating-point values pointed to by
| 'aWPtr' and 'bWPtr' is a NaN, stores the combined NaN result at the location
| pointed to by 'zWPtr'. If either original floating-point value is a
| signaling NaN, the invalid exception is raised. Each of 'aWPtr', 'bWPtr',
| and 'zWPtr' points to an array of four 32-bit elements that concatenate in
| the platform's normal endian order to form a 128-bit floating-point value.
*----------------------------------------------------------------------------*/
void softfloat_propagateNaNF128M(const uint32_t* aWPtr, const uint32_t* bWPtr, uint32_t* zWPtr);
#endif
#endif

View File

@ -1,57 +1,57 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
bool extF80M_isSignalingNaN( const extFloat80_t *aPtr ) bool extF80M_isSignalingNaN( const extFloat80_t *aPtr )
{ {
const struct extFloat80M *aSPtr; const struct extFloat80M *aSPtr;
uint64_t uiA0; uint64_t uiA0;
aSPtr = (const struct extFloat80M *) aPtr; aSPtr = (const struct extFloat80M *) aPtr;
if ( (aSPtr->signExp & 0x7FFF) != 0x7FFF ) return false; if ( (aSPtr->signExp & 0x7FFF) != 0x7FFF ) return false;
uiA0 = aSPtr->signif; uiA0 = aSPtr->signif;
return return
! (uiA0 & UINT64_C( 0x4000000000000000 )) ! (uiA0 & UINT64_C( 0x4000000000000000 ))
&& (uiA0 & UINT64_C( 0x3FFFFFFFFFFFFFFF)); && (uiA0 & UINT64_C( 0x3FFFFFFFFFFFFFFF));
} }

View File

@ -1,60 +1,60 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
bool f128M_isSignalingNaN( const float128_t *aPtr ) bool f128M_isSignalingNaN( const float128_t *aPtr )
{ {
const uint32_t *aWPtr; const uint32_t *aWPtr;
uint32_t uiA96; uint32_t uiA96;
aWPtr = (const uint32_t *) aPtr; aWPtr = (const uint32_t *) aPtr;
uiA96 = aWPtr[indexWordHi( 4 )]; uiA96 = aWPtr[indexWordHi( 4 )];
if ( (uiA96 & 0x7FFF8000) != 0x7FFF0000 ) return false; if ( (uiA96 & 0x7FFF8000) != 0x7FFF0000 ) return false;
return return
((uiA96 & 0x00007FFF) != 0) ((uiA96 & 0x00007FFF) != 0)
|| ((aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )] || ((aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
| aWPtr[indexWord( 4, 0 )]) | aWPtr[indexWord( 4, 0 )])
!= 0); != 0);
} }

View File

@ -1,56 +1,56 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into an 80-bit extended | Converts the common NaN pointed to by `aPtr' into an 80-bit extended
| floating-point NaN, and stores this NaN at the location pointed to by | floating-point NaN, and stores this NaN at the location pointed to by
| `zSPtr'. | `zSPtr'.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_commonNaNToExtF80M( softfloat_commonNaNToExtF80M(
const struct commonNaN *aPtr, struct extFloat80M *zSPtr ) const struct commonNaN *aPtr, struct extFloat80M *zSPtr )
{ {
zSPtr->signExp = packToExtF80UI64( aPtr->sign, 0x7FFF ); zSPtr->signExp = packToExtF80UI64( aPtr->sign, 0x7FFF );
zSPtr->signif = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1; zSPtr->signif = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1;
} }

View File

@ -1,56 +1,56 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into an 80-bit extended | Converts the common NaN pointed to by `aPtr' into an 80-bit extended
| floating-point NaN, and returns the bit pattern of this value as an unsigned | floating-point NaN, and returns the bit pattern of this value as an unsigned
| integer. | integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct uint128 softfloat_commonNaNToExtF80UI( const struct commonNaN *aPtr ) struct uint128 softfloat_commonNaNToExtF80UI( const struct commonNaN *aPtr )
{ {
struct uint128 uiZ; struct uint128 uiZ;
uiZ.v64 = (uint_fast16_t) aPtr->sign<<15 | 0x7FFF; uiZ.v64 = (uint_fast16_t) aPtr->sign<<15 | 0x7FFF;
uiZ.v0 = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1; uiZ.v0 = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1;
return uiZ; return uiZ;
} }

View File

@ -1,56 +1,56 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point | Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point
| NaN, and stores this NaN at the location pointed to by `zWPtr'. Argument | NaN, and stores this NaN at the location pointed to by `zWPtr'. Argument
| `zWPtr' points to an array of four 32-bit elements that concatenate in the | `zWPtr' points to an array of four 32-bit elements that concatenate in the
| platform's normal endian order to form a 128-bit floating-point value. | platform's normal endian order to form a 128-bit floating-point value.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_commonNaNToF128M( const struct commonNaN *aPtr, uint32_t *zWPtr ) softfloat_commonNaNToF128M( const struct commonNaN *aPtr, uint32_t *zWPtr )
{ {
softfloat_shortShiftRight128M( (const uint32_t *) &aPtr->v0, 16, zWPtr ); softfloat_shortShiftRight128M( (const uint32_t *) &aPtr->v0, 16, zWPtr );
zWPtr[indexWordHi( 4 )] |= (uint32_t) aPtr->sign<<31 | 0x7FFF8000; zWPtr[indexWordHi( 4 )] |= (uint32_t) aPtr->sign<<31 | 0x7FFF8000;
} }

View File

@ -1,55 +1,55 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point | Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct uint128 softfloat_commonNaNToF128UI( const struct commonNaN *aPtr ) struct uint128 softfloat_commonNaNToF128UI( const struct commonNaN *aPtr )
{ {
struct uint128 uiZ; struct uint128 uiZ;
uiZ = softfloat_shortShiftRight128( aPtr->v64, aPtr->v0, 16 ); uiZ = softfloat_shortShiftRight128( aPtr->v64, aPtr->v0, 16 );
uiZ.v64 |= (uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FFF800000000000 ); uiZ.v64 |= (uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FFF800000000000 );
return uiZ; return uiZ;
} }

View File

@ -1,51 +1,51 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a 16-bit floating-point | Converts the common NaN pointed to by `aPtr' into a 16-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast16_t softfloat_commonNaNToF16UI( const struct commonNaN *aPtr ) uint_fast16_t softfloat_commonNaNToF16UI( const struct commonNaN *aPtr )
{ {
return (uint_fast16_t) aPtr->sign<<15 | 0x7E00 | aPtr->v64>>54; return (uint_fast16_t) aPtr->sign<<15 | 0x7E00 | aPtr->v64>>54;
} }

View File

@ -1,51 +1,51 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a 32-bit floating-point | Converts the common NaN pointed to by `aPtr' into a 32-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast32_t softfloat_commonNaNToF32UI( const struct commonNaN *aPtr ) uint_fast32_t softfloat_commonNaNToF32UI( const struct commonNaN *aPtr )
{ {
return (uint_fast32_t) aPtr->sign<<31 | 0x7FC00000 | aPtr->v64>>41; return (uint_fast32_t) aPtr->sign<<31 | 0x7FC00000 | aPtr->v64>>41;
} }

View File

@ -1,53 +1,53 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a 64-bit floating-point | Converts the common NaN pointed to by `aPtr' into a 64-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast64_t softfloat_commonNaNToF64UI( const struct commonNaN *aPtr ) uint_fast64_t softfloat_commonNaNToF64UI( const struct commonNaN *aPtr )
{ {
return return
(uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FF8000000000000 ) (uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FF8000000000000 )
| aPtr->v64>>12; | aPtr->v64>>12;
} }

View File

@ -1,62 +1,62 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming the 80-bit extended floating-point value pointed to by `aSPtr' is | Assuming the 80-bit extended floating-point value pointed to by `aSPtr' is
| a NaN, converts this NaN to the common NaN form, and stores the resulting | a NaN, converts this NaN to the common NaN form, and stores the resulting
| common NaN at the location pointed to by `zPtr'. If the NaN is a signaling | common NaN at the location pointed to by `zPtr'. If the NaN is a signaling
| NaN, the invalid exception is raised. | NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_extF80MToCommonNaN( softfloat_extF80MToCommonNaN(
const struct extFloat80M *aSPtr, struct commonNaN *zPtr ) const struct extFloat80M *aSPtr, struct commonNaN *zPtr )
{ {
if ( extF80M_isSignalingNaN( (const extFloat80_t *) aSPtr ) ) { if ( extF80M_isSignalingNaN( (const extFloat80_t *) aSPtr ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
zPtr->sign = signExtF80UI64( aSPtr->signExp ); zPtr->sign = signExtF80UI64( aSPtr->signExp );
zPtr->v64 = aSPtr->signif<<1; zPtr->v64 = aSPtr->signif<<1;
zPtr->v0 = 0; zPtr->v0 = 0;
} }

View File

@ -1,62 +1,62 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0' | Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0'
| has the bit pattern of an 80-bit extended floating-point NaN, converts | has the bit pattern of an 80-bit extended floating-point NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the | this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid | location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_extF80UIToCommonNaN( softfloat_extF80UIToCommonNaN(
uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr ) uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr )
{ {
if ( softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) ) { if ( softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
zPtr->sign = uiA64>>15; zPtr->sign = uiA64>>15;
zPtr->v64 = uiA0<<1; zPtr->v64 = uiA0<<1;
zPtr->v0 = 0; zPtr->v0 = 0;
} }

View File

@ -1,62 +1,62 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming the 128-bit floating-point value pointed to by `aWPtr' is a NaN, | Assuming the 128-bit floating-point value pointed to by `aWPtr' is a NaN,
| converts this NaN to the common NaN form, and stores the resulting common | converts this NaN to the common NaN form, and stores the resulting common
| NaN at the location pointed to by `zPtr'. If the NaN is a signaling NaN, | NaN at the location pointed to by `zPtr'. If the NaN is a signaling NaN,
| the invalid exception is raised. Argument `aWPtr' points to an array of | the invalid exception is raised. Argument `aWPtr' points to an array of
| four 32-bit elements that concatenate in the platform's normal endian order | four 32-bit elements that concatenate in the platform's normal endian order
| to form a 128-bit floating-point value. | to form a 128-bit floating-point value.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_f128MToCommonNaN( const uint32_t *aWPtr, struct commonNaN *zPtr ) softfloat_f128MToCommonNaN( const uint32_t *aWPtr, struct commonNaN *zPtr )
{ {
if ( f128M_isSignalingNaN( (const float128_t *) aWPtr ) ) { if ( f128M_isSignalingNaN( (const float128_t *) aWPtr ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
zPtr->sign = aWPtr[indexWordHi( 4 )]>>31; zPtr->sign = aWPtr[indexWordHi( 4 )]>>31;
softfloat_shortShiftLeft128M( aWPtr, 16, (uint32_t *) &zPtr->v0 ); softfloat_shortShiftLeft128M( aWPtr, 16, (uint32_t *) &zPtr->v0 );
} }

View File

@ -1,65 +1,65 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0' | Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0'
| has the bit pattern of a 128-bit floating-point NaN, converts this NaN to | has the bit pattern of a 128-bit floating-point NaN, converts this NaN to
| the common NaN form, and stores the resulting common NaN at the location | the common NaN form, and stores the resulting common NaN at the location
| pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid exception | pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid exception
| is raised. | is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_f128UIToCommonNaN( softfloat_f128UIToCommonNaN(
uint_fast64_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr ) uint_fast64_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr )
{ {
struct uint128 NaNSig; struct uint128 NaNSig;
if ( softfloat_isSigNaNF128UI( uiA64, uiA0 ) ) { if ( softfloat_isSigNaNF128UI( uiA64, uiA0 ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
NaNSig = softfloat_shortShiftLeft128( uiA64, uiA0, 16 ); NaNSig = softfloat_shortShiftLeft128( uiA64, uiA0, 16 );
zPtr->sign = uiA64>>63; zPtr->sign = uiA64>>63;
zPtr->v64 = NaNSig.v64; zPtr->v64 = NaNSig.v64;
zPtr->v0 = NaNSig.v0; zPtr->v0 = NaNSig.v0;
} }

View File

@ -1,59 +1,59 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming `uiA' has the bit pattern of a 16-bit floating-point NaN, converts | Assuming `uiA' has the bit pattern of a 16-bit floating-point NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the | this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid | location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_f16UIToCommonNaN( uint_fast16_t uiA, struct commonNaN *zPtr ) void softfloat_f16UIToCommonNaN( uint_fast16_t uiA, struct commonNaN *zPtr )
{ {
if ( softfloat_isSigNaNF16UI( uiA ) ) { if ( softfloat_isSigNaNF16UI( uiA ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
zPtr->sign = uiA>>15; zPtr->sign = uiA>>15;
zPtr->v64 = (uint_fast64_t) uiA<<54; zPtr->v64 = (uint_fast64_t) uiA<<54;
zPtr->v0 = 0; zPtr->v0 = 0;
} }

View File

@ -1,59 +1,59 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming `uiA' has the bit pattern of a 32-bit floating-point NaN, converts | Assuming `uiA' has the bit pattern of a 32-bit floating-point NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the | this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid | location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_f32UIToCommonNaN( uint_fast32_t uiA, struct commonNaN *zPtr ) void softfloat_f32UIToCommonNaN( uint_fast32_t uiA, struct commonNaN *zPtr )
{ {
if ( softfloat_isSigNaNF32UI( uiA ) ) { if ( softfloat_isSigNaNF32UI( uiA ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
zPtr->sign = uiA>>31; zPtr->sign = uiA>>31;
zPtr->v64 = (uint_fast64_t) uiA<<41; zPtr->v64 = (uint_fast64_t) uiA<<41;
zPtr->v0 = 0; zPtr->v0 = 0;
} }

View File

@ -1,59 +1,59 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming `uiA' has the bit pattern of a 64-bit floating-point NaN, converts | Assuming `uiA' has the bit pattern of a 64-bit floating-point NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the | this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid | location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_f64UIToCommonNaN( uint_fast64_t uiA, struct commonNaN *zPtr ) void softfloat_f64UIToCommonNaN( uint_fast64_t uiA, struct commonNaN *zPtr )
{ {
if ( softfloat_isSigNaNF64UI( uiA ) ) { if ( softfloat_isSigNaNF64UI( uiA ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
zPtr->sign = uiA>>63; zPtr->sign = uiA>>63;
zPtr->v64 = uiA<<12; zPtr->v64 = uiA<<12;
zPtr->v0 = 0; zPtr->v0 = 0;
} }

View File

@ -1,107 +1,107 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming at least one of the two 80-bit extended floating-point values | Assuming at least one of the two 80-bit extended floating-point values
| pointed to by `aSPtr' and `bSPtr' is a NaN, stores the combined NaN result | pointed to by `aSPtr' and `bSPtr' is a NaN, stores the combined NaN result
| at the location pointed to by `zSPtr'. If either original floating-point | at the location pointed to by `zSPtr'. If either original floating-point
| value is a signaling NaN, the invalid exception is raised. | value is a signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_propagateNaNExtF80M( softfloat_propagateNaNExtF80M(
const struct extFloat80M *aSPtr, const struct extFloat80M *aSPtr,
const struct extFloat80M *bSPtr, const struct extFloat80M *bSPtr,
struct extFloat80M *zSPtr struct extFloat80M *zSPtr
) )
{ {
bool isSigNaNA; bool isSigNaNA;
const struct extFloat80M *sPtr; const struct extFloat80M *sPtr;
bool isSigNaNB; bool isSigNaNB;
uint_fast16_t uiB64; uint_fast16_t uiB64;
uint64_t uiB0; uint64_t uiB0;
uint_fast16_t uiA64; uint_fast16_t uiA64;
uint64_t uiA0; uint64_t uiA0;
uint_fast16_t uiMagA64, uiMagB64; uint_fast16_t uiMagA64, uiMagB64;
isSigNaNA = extF80M_isSignalingNaN( (const extFloat80_t *) aSPtr ); isSigNaNA = extF80M_isSignalingNaN( (const extFloat80_t *) aSPtr );
sPtr = aSPtr; sPtr = aSPtr;
if ( ! bSPtr ) { if ( ! bSPtr ) {
if ( isSigNaNA ) softfloat_raiseFlags( softfloat_flag_invalid ); if ( isSigNaNA ) softfloat_raiseFlags( softfloat_flag_invalid );
goto copy; goto copy;
} }
isSigNaNB = extF80M_isSignalingNaN( (const extFloat80_t *) bSPtr ); isSigNaNB = extF80M_isSignalingNaN( (const extFloat80_t *) bSPtr );
if ( isSigNaNA | isSigNaNB ) { if ( isSigNaNA | isSigNaNB ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
if ( isSigNaNA ) { if ( isSigNaNA ) {
uiB64 = bSPtr->signExp; uiB64 = bSPtr->signExp;
if ( isSigNaNB ) goto returnLargerUIMag; if ( isSigNaNB ) goto returnLargerUIMag;
uiB0 = bSPtr->signif; uiB0 = bSPtr->signif;
if ( isNaNExtF80UI( uiB64, uiB0 ) ) goto copyB; if ( isNaNExtF80UI( uiB64, uiB0 ) ) goto copyB;
goto copy; goto copy;
} else { } else {
uiA64 = aSPtr->signExp; uiA64 = aSPtr->signExp;
uiA0 = aSPtr->signif; uiA0 = aSPtr->signif;
if ( isNaNExtF80UI( uiA64, uiA0 ) ) goto copy; if ( isNaNExtF80UI( uiA64, uiA0 ) ) goto copy;
goto copyB; goto copyB;
} }
} }
uiB64 = bSPtr->signExp; uiB64 = bSPtr->signExp;
returnLargerUIMag: returnLargerUIMag:
uiA64 = aSPtr->signExp; uiA64 = aSPtr->signExp;
uiMagA64 = uiA64 & 0x7FFF; uiMagA64 = uiA64 & 0x7FFF;
uiMagB64 = uiB64 & 0x7FFF; uiMagB64 = uiB64 & 0x7FFF;
if ( uiMagA64 < uiMagB64 ) goto copyB; if ( uiMagA64 < uiMagB64 ) goto copyB;
if ( uiMagB64 < uiMagA64 ) goto copy; if ( uiMagB64 < uiMagA64 ) goto copy;
uiA0 = aSPtr->signif; uiA0 = aSPtr->signif;
uiB0 = bSPtr->signif; uiB0 = bSPtr->signif;
if ( uiA0 < uiB0 ) goto copyB; if ( uiA0 < uiB0 ) goto copyB;
if ( uiB0 < uiA0 ) goto copy; if ( uiB0 < uiA0 ) goto copy;
if ( uiA64 < uiB64 ) goto copy; if ( uiA64 < uiB64 ) goto copy;
copyB: copyB:
sPtr = bSPtr; sPtr = bSPtr;
copy: copy:
zSPtr->signExp = sPtr->signExp; zSPtr->signExp = sPtr->signExp;
zSPtr->signif = sPtr->signif | UINT64_C( 0xC000000000000000 ); zSPtr->signif = sPtr->signif | UINT64_C( 0xC000000000000000 );
} }

View File

@ -1,106 +1,106 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2018 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2018 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting the unsigned integer formed from concatenating 'uiA64' and | Interpreting the unsigned integer formed from concatenating 'uiA64' and
| 'uiA0' as an 80-bit extended floating-point value, and likewise interpreting | 'uiA0' as an 80-bit extended floating-point value, and likewise interpreting
| the unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another | the unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another
| 80-bit extended floating-point value, and assuming at least on of these | 80-bit extended floating-point value, and assuming at least on of these
| floating-point values is a NaN, returns the bit pattern of the combined NaN | floating-point values is a NaN, returns the bit pattern of the combined NaN
| result. If either original floating-point value is a signaling NaN, the | result. If either original floating-point value is a signaling NaN, the
| invalid exception is raised. | invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct uint128 struct uint128
softfloat_propagateNaNExtF80UI( softfloat_propagateNaNExtF80UI(
uint_fast16_t uiA64, uint_fast16_t uiA64,
uint_fast64_t uiA0, uint_fast64_t uiA0,
uint_fast16_t uiB64, uint_fast16_t uiB64,
uint_fast64_t uiB0 uint_fast64_t uiB0
) )
{ {
bool isSigNaNA, isSigNaNB; bool isSigNaNA, isSigNaNB;
uint_fast64_t uiNonsigA0, uiNonsigB0; uint_fast64_t uiNonsigA0, uiNonsigB0;
uint_fast16_t uiMagA64, uiMagB64; uint_fast16_t uiMagA64, uiMagB64;
struct uint128 uiZ; struct uint128 uiZ;
/*------------------------------------------------------------------------ /*------------------------------------------------------------------------
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
isSigNaNA = softfloat_isSigNaNExtF80UI( uiA64, uiA0 ); isSigNaNA = softfloat_isSigNaNExtF80UI( uiA64, uiA0 );
isSigNaNB = softfloat_isSigNaNExtF80UI( uiB64, uiB0 ); isSigNaNB = softfloat_isSigNaNExtF80UI( uiB64, uiB0 );
/*------------------------------------------------------------------------ /*------------------------------------------------------------------------
| Make NaNs non-signaling. | Make NaNs non-signaling.
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
uiNonsigA0 = uiA0 | UINT64_C( 0xC000000000000000 ); uiNonsigA0 = uiA0 | UINT64_C( 0xC000000000000000 );
uiNonsigB0 = uiB0 | UINT64_C( 0xC000000000000000 ); uiNonsigB0 = uiB0 | UINT64_C( 0xC000000000000000 );
/*------------------------------------------------------------------------ /*------------------------------------------------------------------------
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
if ( isSigNaNA | isSigNaNB ) { if ( isSigNaNA | isSigNaNB ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
if ( isSigNaNA ) { if ( isSigNaNA ) {
if ( isSigNaNB ) goto returnLargerMag; if ( isSigNaNB ) goto returnLargerMag;
if ( isNaNExtF80UI( uiB64, uiB0 ) ) goto returnB; if ( isNaNExtF80UI( uiB64, uiB0 ) ) goto returnB;
goto returnA; goto returnA;
} else { } else {
if ( isNaNExtF80UI( uiA64, uiA0 ) ) goto returnA; if ( isNaNExtF80UI( uiA64, uiA0 ) ) goto returnA;
goto returnB; goto returnB;
} }
} }
returnLargerMag: returnLargerMag:
uiMagA64 = uiA64 & 0x7FFF; uiMagA64 = uiA64 & 0x7FFF;
uiMagB64 = uiB64 & 0x7FFF; uiMagB64 = uiB64 & 0x7FFF;
if ( uiMagA64 < uiMagB64 ) goto returnB; if ( uiMagA64 < uiMagB64 ) goto returnB;
if ( uiMagB64 < uiMagA64 ) goto returnA; if ( uiMagB64 < uiMagA64 ) goto returnA;
if ( uiA0 < uiB0 ) goto returnB; if ( uiA0 < uiB0 ) goto returnB;
if ( uiB0 < uiA0 ) goto returnA; if ( uiB0 < uiA0 ) goto returnA;
if ( uiA64 < uiB64 ) goto returnA; if ( uiA64 < uiB64 ) goto returnA;
returnB: returnB:
uiZ.v64 = uiB64; uiZ.v64 = uiB64;
uiZ.v0 = uiNonsigB0; uiZ.v0 = uiNonsigB0;
return uiZ; return uiZ;
returnA: returnA:
uiZ.v64 = uiA64; uiZ.v64 = uiA64;
uiZ.v0 = uiNonsigA0; uiZ.v0 = uiNonsigA0;
return uiZ; return uiZ;
} }

View File

@ -1,108 +1,108 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming at least one of the two 128-bit floating-point values pointed to by | Assuming at least one of the two 128-bit floating-point values pointed to by
| `aWPtr' and `bWPtr' is a NaN, stores the combined NaN result at the location | `aWPtr' and `bWPtr' is a NaN, stores the combined NaN result at the location
| pointed to by `zWPtr'. If either original floating-point value is a | pointed to by `zWPtr'. If either original floating-point value is a
| signaling NaN, the invalid exception is raised. Each of `aWPtr', `bWPtr', | signaling NaN, the invalid exception is raised. Each of `aWPtr', `bWPtr',
| and `zWPtr' points to an array of four 32-bit elements that concatenate in | and `zWPtr' points to an array of four 32-bit elements that concatenate in
| the platform's normal endian order to form a 128-bit floating-point value. | the platform's normal endian order to form a 128-bit floating-point value.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_propagateNaNF128M( softfloat_propagateNaNF128M(
const uint32_t *aWPtr, const uint32_t *bWPtr, uint32_t *zWPtr ) const uint32_t *aWPtr, const uint32_t *bWPtr, uint32_t *zWPtr )
{ {
bool isSigNaNA; bool isSigNaNA;
const uint32_t *ptr; const uint32_t *ptr;
bool isSigNaNB; bool isSigNaNB;
uint32_t uiA96, uiB96, wordMagA, wordMagB; uint32_t uiA96, uiB96, wordMagA, wordMagB;
isSigNaNA = f128M_isSignalingNaN( (const float128_t *) aWPtr ); isSigNaNA = f128M_isSignalingNaN( (const float128_t *) aWPtr );
ptr = aWPtr; ptr = aWPtr;
if ( ! bWPtr ) { if ( ! bWPtr ) {
if ( isSigNaNA ) softfloat_raiseFlags( softfloat_flag_invalid ); if ( isSigNaNA ) softfloat_raiseFlags( softfloat_flag_invalid );
goto copy; goto copy;
} }
isSigNaNB = f128M_isSignalingNaN( (const float128_t *) bWPtr ); isSigNaNB = f128M_isSignalingNaN( (const float128_t *) bWPtr );
if ( isSigNaNA | isSigNaNB ) { if ( isSigNaNA | isSigNaNB ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
if ( isSigNaNA ) { if ( isSigNaNA ) {
if ( isSigNaNB ) goto returnLargerUIMag; if ( isSigNaNB ) goto returnLargerUIMag;
if ( softfloat_isNaNF128M( bWPtr ) ) goto copyB; if ( softfloat_isNaNF128M( bWPtr ) ) goto copyB;
goto copy; goto copy;
} else { } else {
if ( softfloat_isNaNF128M( aWPtr ) ) goto copy; if ( softfloat_isNaNF128M( aWPtr ) ) goto copy;
goto copyB; goto copyB;
} }
} }
returnLargerUIMag: returnLargerUIMag:
uiA96 = aWPtr[indexWordHi( 4 )]; uiA96 = aWPtr[indexWordHi( 4 )];
uiB96 = bWPtr[indexWordHi( 4 )]; uiB96 = bWPtr[indexWordHi( 4 )];
wordMagA = uiA96 & 0x7FFFFFFF; wordMagA = uiA96 & 0x7FFFFFFF;
wordMagB = uiB96 & 0x7FFFFFFF; wordMagB = uiB96 & 0x7FFFFFFF;
if ( wordMagA < wordMagB ) goto copyB; if ( wordMagA < wordMagB ) goto copyB;
if ( wordMagB < wordMagA ) goto copy; if ( wordMagB < wordMagA ) goto copy;
wordMagA = aWPtr[indexWord( 4, 2 )]; wordMagA = aWPtr[indexWord( 4, 2 )];
wordMagB = bWPtr[indexWord( 4, 2 )]; wordMagB = bWPtr[indexWord( 4, 2 )];
if ( wordMagA < wordMagB ) goto copyB; if ( wordMagA < wordMagB ) goto copyB;
if ( wordMagB < wordMagA ) goto copy; if ( wordMagB < wordMagA ) goto copy;
wordMagA = aWPtr[indexWord( 4, 1 )]; wordMagA = aWPtr[indexWord( 4, 1 )];
wordMagB = bWPtr[indexWord( 4, 1 )]; wordMagB = bWPtr[indexWord( 4, 1 )];
if ( wordMagA < wordMagB ) goto copyB; if ( wordMagA < wordMagB ) goto copyB;
if ( wordMagB < wordMagA ) goto copy; if ( wordMagB < wordMagA ) goto copy;
wordMagA = aWPtr[indexWord( 4, 0 )]; wordMagA = aWPtr[indexWord( 4, 0 )];
wordMagB = bWPtr[indexWord( 4, 0 )]; wordMagB = bWPtr[indexWord( 4, 0 )];
if ( wordMagA < wordMagB ) goto copyB; if ( wordMagA < wordMagB ) goto copyB;
if ( wordMagB < wordMagA ) goto copy; if ( wordMagB < wordMagA ) goto copy;
if ( uiA96 < uiB96 ) goto copy; if ( uiA96 < uiB96 ) goto copy;
copyB: copyB:
ptr = bWPtr; ptr = bWPtr;
copy: copy:
zWPtr[indexWordHi( 4 )] = ptr[indexWordHi( 4 )] | 0x00008000; zWPtr[indexWordHi( 4 )] = ptr[indexWordHi( 4 )] | 0x00008000;
zWPtr[indexWord( 4, 2 )] = ptr[indexWord( 4, 2 )]; zWPtr[indexWord( 4, 2 )] = ptr[indexWord( 4, 2 )];
zWPtr[indexWord( 4, 1 )] = ptr[indexWord( 4, 1 )]; zWPtr[indexWord( 4, 1 )] = ptr[indexWord( 4, 1 )];
zWPtr[indexWord( 4, 0 )] = ptr[indexWord( 4, 0 )]; zWPtr[indexWord( 4, 0 )] = ptr[indexWord( 4, 0 )];
} }

View File

@ -1,105 +1,105 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2018 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2018 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting the unsigned integer formed from concatenating 'uiA64' and | Interpreting the unsigned integer formed from concatenating 'uiA64' and
| 'uiA0' as a 128-bit floating-point value, and likewise interpreting the | 'uiA0' as a 128-bit floating-point value, and likewise interpreting the
| unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another | unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another
| 128-bit floating-point value, and assuming at least on of these floating- | 128-bit floating-point value, and assuming at least on of these floating-
| point values is a NaN, returns the bit pattern of the combined NaN result. | point values is a NaN, returns the bit pattern of the combined NaN result.
| If either original floating-point value is a signaling NaN, the invalid | If either original floating-point value is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct uint128 struct uint128
softfloat_propagateNaNF128UI( softfloat_propagateNaNF128UI(
uint_fast64_t uiA64, uint_fast64_t uiA64,
uint_fast64_t uiA0, uint_fast64_t uiA0,
uint_fast64_t uiB64, uint_fast64_t uiB64,
uint_fast64_t uiB0 uint_fast64_t uiB0
) )
{ {
bool isSigNaNA, isSigNaNB; bool isSigNaNA, isSigNaNB;
uint_fast64_t uiNonsigA64, uiNonsigB64, uiMagA64, uiMagB64; uint_fast64_t uiNonsigA64, uiNonsigB64, uiMagA64, uiMagB64;
struct uint128 uiZ; struct uint128 uiZ;
/*------------------------------------------------------------------------ /*------------------------------------------------------------------------
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
isSigNaNA = softfloat_isSigNaNF128UI( uiA64, uiA0 ); isSigNaNA = softfloat_isSigNaNF128UI( uiA64, uiA0 );
isSigNaNB = softfloat_isSigNaNF128UI( uiB64, uiB0 ); isSigNaNB = softfloat_isSigNaNF128UI( uiB64, uiB0 );
/*------------------------------------------------------------------------ /*------------------------------------------------------------------------
| Make NaNs non-signaling. | Make NaNs non-signaling.
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
uiNonsigA64 = uiA64 | UINT64_C( 0x0000800000000000 ); uiNonsigA64 = uiA64 | UINT64_C( 0x0000800000000000 );
uiNonsigB64 = uiB64 | UINT64_C( 0x0000800000000000 ); uiNonsigB64 = uiB64 | UINT64_C( 0x0000800000000000 );
/*------------------------------------------------------------------------ /*------------------------------------------------------------------------
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
if ( isSigNaNA | isSigNaNB ) { if ( isSigNaNA | isSigNaNB ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
if ( isSigNaNA ) { if ( isSigNaNA ) {
if ( isSigNaNB ) goto returnLargerMag; if ( isSigNaNB ) goto returnLargerMag;
if ( isNaNF128UI( uiB64, uiB0 ) ) goto returnB; if ( isNaNF128UI( uiB64, uiB0 ) ) goto returnB;
goto returnA; goto returnA;
} else { } else {
if ( isNaNF128UI( uiA64, uiA0 ) ) goto returnA; if ( isNaNF128UI( uiA64, uiA0 ) ) goto returnA;
goto returnB; goto returnB;
} }
} }
returnLargerMag: returnLargerMag:
uiMagA64 = uiA64 & UINT64_C( 0x7FFFFFFFFFFFFFFF ); uiMagA64 = uiA64 & UINT64_C( 0x7FFFFFFFFFFFFFFF );
uiMagB64 = uiB64 & UINT64_C( 0x7FFFFFFFFFFFFFFF ); uiMagB64 = uiB64 & UINT64_C( 0x7FFFFFFFFFFFFFFF );
if ( uiMagA64 < uiMagB64 ) goto returnB; if ( uiMagA64 < uiMagB64 ) goto returnB;
if ( uiMagB64 < uiMagA64 ) goto returnA; if ( uiMagB64 < uiMagA64 ) goto returnA;
if ( uiA0 < uiB0 ) goto returnB; if ( uiA0 < uiB0 ) goto returnB;
if ( uiB0 < uiA0 ) goto returnA; if ( uiB0 < uiA0 ) goto returnA;
if ( uiNonsigA64 < uiNonsigB64 ) goto returnA; if ( uiNonsigA64 < uiNonsigB64 ) goto returnA;
returnB: returnB:
uiZ.v64 = uiNonsigB64; uiZ.v64 = uiNonsigB64;
uiZ.v0 = uiB0; uiZ.v0 = uiB0;
return uiZ; return uiZ;
returnA: returnA:
uiZ.v64 = uiNonsigA64; uiZ.v64 = uiNonsigA64;
uiZ.v0 = uiA0; uiZ.v0 = uiA0;
return uiZ; return uiZ;
} }

View File

@ -1,84 +1,84 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2018 The Regents of the Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2018 The Regents of the
University of California. All rights reserved. University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting 'uiA' and 'uiB' as the bit patterns of two 16-bit floating- | Interpreting 'uiA' and 'uiB' as the bit patterns of two 16-bit floating-
| point values, at least one of which is a NaN, returns the bit pattern of | point values, at least one of which is a NaN, returns the bit pattern of
| the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a | the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a
| signaling NaN, the invalid exception is raised. | signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast16_t uint_fast16_t
softfloat_propagateNaNF16UI( uint_fast16_t uiA, uint_fast16_t uiB ) softfloat_propagateNaNF16UI( uint_fast16_t uiA, uint_fast16_t uiB )
{ {
bool isSigNaNA, isSigNaNB; bool isSigNaNA, isSigNaNB;
uint_fast16_t uiNonsigA, uiNonsigB, uiMagA, uiMagB; uint_fast16_t uiNonsigA, uiNonsigB, uiMagA, uiMagB;
/*------------------------------------------------------------------------ /*------------------------------------------------------------------------
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
isSigNaNA = softfloat_isSigNaNF16UI( uiA ); isSigNaNA = softfloat_isSigNaNF16UI( uiA );
isSigNaNB = softfloat_isSigNaNF16UI( uiB ); isSigNaNB = softfloat_isSigNaNF16UI( uiB );
/*------------------------------------------------------------------------ /*------------------------------------------------------------------------
| Make NaNs non-signaling. | Make NaNs non-signaling.
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
uiNonsigA = uiA | 0x0200; uiNonsigA = uiA | 0x0200;
uiNonsigB = uiB | 0x0200; uiNonsigB = uiB | 0x0200;
/*------------------------------------------------------------------------ /*------------------------------------------------------------------------
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
if ( isSigNaNA | isSigNaNB ) { if ( isSigNaNA | isSigNaNB ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
if ( isSigNaNA ) { if ( isSigNaNA ) {
if ( isSigNaNB ) goto returnLargerMag; if ( isSigNaNB ) goto returnLargerMag;
return isNaNF16UI( uiB ) ? uiNonsigB : uiNonsigA; return isNaNF16UI( uiB ) ? uiNonsigB : uiNonsigA;
} else { } else {
return isNaNF16UI( uiA ) ? uiNonsigA : uiNonsigB; return isNaNF16UI( uiA ) ? uiNonsigA : uiNonsigB;
} }
} }
returnLargerMag: returnLargerMag:
uiMagA = uiA & 0x7FFF; uiMagA = uiA & 0x7FFF;
uiMagB = uiB & 0x7FFF; uiMagB = uiB & 0x7FFF;
if ( uiMagA < uiMagB ) return uiNonsigB; if ( uiMagA < uiMagB ) return uiNonsigB;
if ( uiMagB < uiMagA ) return uiNonsigA; if ( uiMagB < uiMagA ) return uiNonsigA;
return (uiNonsigA < uiNonsigB) ? uiNonsigA : uiNonsigB; return (uiNonsigA < uiNonsigB) ? uiNonsigA : uiNonsigB;
} }

View File

@ -1,84 +1,84 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2018 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2018 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting 'uiA' and 'uiB' as the bit patterns of two 32-bit floating- | Interpreting 'uiA' and 'uiB' as the bit patterns of two 32-bit floating-
| point values, at least one of which is a NaN, returns the bit pattern of | point values, at least one of which is a NaN, returns the bit pattern of
| the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a | the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a
| signaling NaN, the invalid exception is raised. | signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast32_t uint_fast32_t
softfloat_propagateNaNF32UI( uint_fast32_t uiA, uint_fast32_t uiB ) softfloat_propagateNaNF32UI( uint_fast32_t uiA, uint_fast32_t uiB )
{ {
bool isSigNaNA, isSigNaNB; bool isSigNaNA, isSigNaNB;
uint_fast32_t uiNonsigA, uiNonsigB, uiMagA, uiMagB; uint_fast32_t uiNonsigA, uiNonsigB, uiMagA, uiMagB;
/*------------------------------------------------------------------------ /*------------------------------------------------------------------------
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
isSigNaNA = softfloat_isSigNaNF32UI( uiA ); isSigNaNA = softfloat_isSigNaNF32UI( uiA );
isSigNaNB = softfloat_isSigNaNF32UI( uiB ); isSigNaNB = softfloat_isSigNaNF32UI( uiB );
/*------------------------------------------------------------------------ /*------------------------------------------------------------------------
| Make NaNs non-signaling. | Make NaNs non-signaling.
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
uiNonsigA = uiA | 0x00400000; uiNonsigA = uiA | 0x00400000;
uiNonsigB = uiB | 0x00400000; uiNonsigB = uiB | 0x00400000;
/*------------------------------------------------------------------------ /*------------------------------------------------------------------------
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
if ( isSigNaNA | isSigNaNB ) { if ( isSigNaNA | isSigNaNB ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
if ( isSigNaNA ) { if ( isSigNaNA ) {
if ( isSigNaNB ) goto returnLargerMag; if ( isSigNaNB ) goto returnLargerMag;
return isNaNF32UI( uiB ) ? uiNonsigB : uiNonsigA; return isNaNF32UI( uiB ) ? uiNonsigB : uiNonsigA;
} else { } else {
return isNaNF32UI( uiA ) ? uiNonsigA : uiNonsigB; return isNaNF32UI( uiA ) ? uiNonsigA : uiNonsigB;
} }
} }
returnLargerMag: returnLargerMag:
uiMagA = uiA & 0x7FFFFFFF; uiMagA = uiA & 0x7FFFFFFF;
uiMagB = uiB & 0x7FFFFFFF; uiMagB = uiB & 0x7FFFFFFF;
if ( uiMagA < uiMagB ) return uiNonsigB; if ( uiMagA < uiMagB ) return uiNonsigB;
if ( uiMagB < uiMagA ) return uiNonsigA; if ( uiMagB < uiMagA ) return uiNonsigA;
return (uiNonsigA < uiNonsigB) ? uiNonsigA : uiNonsigB; return (uiNonsigA < uiNonsigB) ? uiNonsigA : uiNonsigB;
} }

View File

@ -1,84 +1,84 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2018 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2018 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting 'uiA' and 'uiB' as the bit patterns of two 64-bit floating- | Interpreting 'uiA' and 'uiB' as the bit patterns of two 64-bit floating-
| point values, at least one of which is a NaN, returns the bit pattern of | point values, at least one of which is a NaN, returns the bit pattern of
| the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a | the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a
| signaling NaN, the invalid exception is raised. | signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast64_t uint_fast64_t
softfloat_propagateNaNF64UI( uint_fast64_t uiA, uint_fast64_t uiB ) softfloat_propagateNaNF64UI( uint_fast64_t uiA, uint_fast64_t uiB )
{ {
bool isSigNaNA, isSigNaNB; bool isSigNaNA, isSigNaNB;
uint_fast64_t uiNonsigA, uiNonsigB, uiMagA, uiMagB; uint_fast64_t uiNonsigA, uiNonsigB, uiMagA, uiMagB;
/*------------------------------------------------------------------------ /*------------------------------------------------------------------------
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
isSigNaNA = softfloat_isSigNaNF64UI( uiA ); isSigNaNA = softfloat_isSigNaNF64UI( uiA );
isSigNaNB = softfloat_isSigNaNF64UI( uiB ); isSigNaNB = softfloat_isSigNaNF64UI( uiB );
/*------------------------------------------------------------------------ /*------------------------------------------------------------------------
| Make NaNs non-signaling. | Make NaNs non-signaling.
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
uiNonsigA = uiA | UINT64_C( 0x0008000000000000 ); uiNonsigA = uiA | UINT64_C( 0x0008000000000000 );
uiNonsigB = uiB | UINT64_C( 0x0008000000000000 ); uiNonsigB = uiB | UINT64_C( 0x0008000000000000 );
/*------------------------------------------------------------------------ /*------------------------------------------------------------------------
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
if ( isSigNaNA | isSigNaNB ) { if ( isSigNaNA | isSigNaNB ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
if ( isSigNaNA ) { if ( isSigNaNA ) {
if ( isSigNaNB ) goto returnLargerMag; if ( isSigNaNB ) goto returnLargerMag;
return isNaNF64UI( uiB ) ? uiNonsigB : uiNonsigA; return isNaNF64UI( uiB ) ? uiNonsigB : uiNonsigA;
} else { } else {
return isNaNF64UI( uiA ) ? uiNonsigA : uiNonsigB; return isNaNF64UI( uiA ) ? uiNonsigA : uiNonsigB;
} }
} }
returnLargerMag: returnLargerMag:
uiMagA = uiA & UINT64_C( 0x7FFFFFFFFFFFFFFF ); uiMagA = uiA & UINT64_C( 0x7FFFFFFFFFFFFFFF );
uiMagB = uiB & UINT64_C( 0x7FFFFFFFFFFFFFFF ); uiMagB = uiB & UINT64_C( 0x7FFFFFFFFFFFFFFF );
if ( uiMagA < uiMagB ) return uiNonsigB; if ( uiMagA < uiMagB ) return uiNonsigB;
if ( uiMagB < uiMagA ) return uiNonsigA; if ( uiMagB < uiMagA ) return uiNonsigA;
return (uiNonsigA < uiNonsigB) ? uiNonsigA : uiNonsigB; return (uiNonsigA < uiNonsigB) ? uiNonsigA : uiNonsigB;
} }

View File

@ -1,52 +1,52 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include "platform.h" #include "platform.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Raises the exceptions specified by `flags'. Floating-point traps can be | Raises the exceptions specified by `flags'. Floating-point traps can be
| defined here if desired. It is currently not possible for such a trap | defined here if desired. It is currently not possible for such a trap
| to substitute a result value. If traps are not implemented, this routine | to substitute a result value. If traps are not implemented, this routine
| should be simply `softfloat_exceptionFlags |= flags;'. | should be simply `softfloat_exceptionFlags |= flags;'.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_raiseFlags( uint_fast8_t flags ) void softfloat_raiseFlags( uint_fast8_t flags )
{ {
softfloat_exceptionFlags |= flags; softfloat_exceptionFlags |= flags;
} }

View File

@ -1,346 +1,346 @@
/*============================================================================ /*============================================================================
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2018 The Regents of the Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2018 The Regents of the
University of California. All rights reserved. University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#ifndef specialize_h #ifndef specialize_h
#define specialize_h 1 #define specialize_h 1
#include "primitiveTypes.h" #include "primitiveTypes.h"
#include "softfloat.h" #include "softfloat.h"
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Default value for 'softfloat_detectTininess'. | Default value for 'softfloat_detectTininess'.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define init_detectTininess softfloat_tininess_afterRounding #define init_detectTininess softfloat_tininess_afterRounding
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| The values to return on conversions to 32-bit integer formats that raise an | The values to return on conversions to 32-bit integer formats that raise an
| invalid exception. | invalid exception.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define ui32_fromPosOverflow 0xFFFFFFFF #define ui32_fromPosOverflow 0xFFFFFFFF
#define ui32_fromNegOverflow 0xFFFFFFFF #define ui32_fromNegOverflow 0xFFFFFFFF
#define ui32_fromNaN 0xFFFFFFFF #define ui32_fromNaN 0xFFFFFFFF
#define i32_fromPosOverflow (-0x7FFFFFFF - 1) #define i32_fromPosOverflow (-0x7FFFFFFF - 1)
#define i32_fromNegOverflow (-0x7FFFFFFF - 1) #define i32_fromNegOverflow (-0x7FFFFFFF - 1)
#define i32_fromNaN (-0x7FFFFFFF - 1) #define i32_fromNaN (-0x7FFFFFFF - 1)
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| The values to return on conversions to 64-bit integer formats that raise an | The values to return on conversions to 64-bit integer formats that raise an
| invalid exception. | invalid exception.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define ui64_fromPosOverflow UINT64_C(0xFFFFFFFFFFFFFFFF) #define ui64_fromPosOverflow UINT64_C(0xFFFFFFFFFFFFFFFF)
#define ui64_fromNegOverflow UINT64_C(0xFFFFFFFFFFFFFFFF) #define ui64_fromNegOverflow UINT64_C(0xFFFFFFFFFFFFFFFF)
#define ui64_fromNaN UINT64_C(0xFFFFFFFFFFFFFFFF) #define ui64_fromNaN UINT64_C(0xFFFFFFFFFFFFFFFF)
#define i64_fromPosOverflow (-INT64_C(0x7FFFFFFFFFFFFFFF) - 1) #define i64_fromPosOverflow (-INT64_C(0x7FFFFFFFFFFFFFFF) - 1)
#define i64_fromNegOverflow (-INT64_C(0x7FFFFFFFFFFFFFFF) - 1) #define i64_fromNegOverflow (-INT64_C(0x7FFFFFFFFFFFFFFF) - 1)
#define i64_fromNaN (-INT64_C(0x7FFFFFFFFFFFFFFF) - 1) #define i64_fromNaN (-INT64_C(0x7FFFFFFFFFFFFFFF) - 1)
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| "Common NaN" structure, used to transfer NaN representations from one format | "Common NaN" structure, used to transfer NaN representations from one format
| to another. | to another.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct commonNaN { struct commonNaN {
bool sign; bool sign;
#ifdef LITTLEENDIAN #ifdef LITTLEENDIAN
uint64_t v0, v64; uint64_t v0, v64;
#else #else
uint64_t v64, v0; uint64_t v64, v0;
#endif #endif
}; };
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| The bit pattern for a default generated 16-bit floating-point NaN. | The bit pattern for a default generated 16-bit floating-point NaN.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define defaultNaNF16UI 0xFE00 #define defaultNaNF16UI 0xFE00
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Returns true when 16-bit unsigned integer 'uiA' has the bit pattern of a | Returns true when 16-bit unsigned integer 'uiA' has the bit pattern of a
| 16-bit floating-point signaling NaN. | 16-bit floating-point signaling NaN.
| Note: This macro evaluates its argument more than once. | Note: This macro evaluates its argument more than once.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define softfloat_isSigNaNF16UI(uiA) ((((uiA)&0x7E00) == 0x7C00) && ((uiA)&0x01FF)) #define softfloat_isSigNaNF16UI(uiA) ((((uiA)&0x7E00) == 0x7C00) && ((uiA)&0x01FF))
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming 'uiA' has the bit pattern of a 16-bit floating-point NaN, converts | Assuming 'uiA' has the bit pattern of a 16-bit floating-point NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the | this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid | location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_f16UIToCommonNaN(uint_fast16_t uiA, struct commonNaN* zPtr); void softfloat_f16UIToCommonNaN(uint_fast16_t uiA, struct commonNaN* zPtr);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by 'aPtr' into a 16-bit floating-point | Converts the common NaN pointed to by 'aPtr' into a 16-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast16_t softfloat_commonNaNToF16UI(const struct commonNaN* aPtr); uint_fast16_t softfloat_commonNaNToF16UI(const struct commonNaN* aPtr);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting 'uiA' and 'uiB' as the bit patterns of two 16-bit floating- | Interpreting 'uiA' and 'uiB' as the bit patterns of two 16-bit floating-
| point values, at least one of which is a NaN, returns the bit pattern of | point values, at least one of which is a NaN, returns the bit pattern of
| the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a | the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a
| signaling NaN, the invalid exception is raised. | signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast16_t softfloat_propagateNaNF16UI(uint_fast16_t uiA, uint_fast16_t uiB); uint_fast16_t softfloat_propagateNaNF16UI(uint_fast16_t uiA, uint_fast16_t uiB);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| The bit pattern for a default generated 32-bit floating-point NaN. | The bit pattern for a default generated 32-bit floating-point NaN.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define defaultNaNF32UI 0xFFC00000 #define defaultNaNF32UI 0xFFC00000
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Returns true when 32-bit unsigned integer 'uiA' has the bit pattern of a | Returns true when 32-bit unsigned integer 'uiA' has the bit pattern of a
| 32-bit floating-point signaling NaN. | 32-bit floating-point signaling NaN.
| Note: This macro evaluates its argument more than once. | Note: This macro evaluates its argument more than once.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define softfloat_isSigNaNF32UI(uiA) ((((uiA)&0x7FC00000) == 0x7F800000) && ((uiA)&0x003FFFFF)) #define softfloat_isSigNaNF32UI(uiA) ((((uiA)&0x7FC00000) == 0x7F800000) && ((uiA)&0x003FFFFF))
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming 'uiA' has the bit pattern of a 32-bit floating-point NaN, converts | Assuming 'uiA' has the bit pattern of a 32-bit floating-point NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the | this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid | location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_f32UIToCommonNaN(uint_fast32_t uiA, struct commonNaN* zPtr); void softfloat_f32UIToCommonNaN(uint_fast32_t uiA, struct commonNaN* zPtr);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by 'aPtr' into a 32-bit floating-point | Converts the common NaN pointed to by 'aPtr' into a 32-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast32_t softfloat_commonNaNToF32UI(const struct commonNaN* aPtr); uint_fast32_t softfloat_commonNaNToF32UI(const struct commonNaN* aPtr);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting 'uiA' and 'uiB' as the bit patterns of two 32-bit floating- | Interpreting 'uiA' and 'uiB' as the bit patterns of two 32-bit floating-
| point values, at least one of which is a NaN, returns the bit pattern of | point values, at least one of which is a NaN, returns the bit pattern of
| the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a | the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a
| signaling NaN, the invalid exception is raised. | signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast32_t softfloat_propagateNaNF32UI(uint_fast32_t uiA, uint_fast32_t uiB); uint_fast32_t softfloat_propagateNaNF32UI(uint_fast32_t uiA, uint_fast32_t uiB);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| The bit pattern for a default generated 64-bit floating-point NaN. | The bit pattern for a default generated 64-bit floating-point NaN.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define defaultNaNF64UI UINT64_C(0xFFF8000000000000) #define defaultNaNF64UI UINT64_C(0xFFF8000000000000)
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Returns true when 64-bit unsigned integer 'uiA' has the bit pattern of a | Returns true when 64-bit unsigned integer 'uiA' has the bit pattern of a
| 64-bit floating-point signaling NaN. | 64-bit floating-point signaling NaN.
| Note: This macro evaluates its argument more than once. | Note: This macro evaluates its argument more than once.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define softfloat_isSigNaNF64UI(uiA) \ #define softfloat_isSigNaNF64UI(uiA) \
((((uiA)&UINT64_C(0x7FF8000000000000)) == UINT64_C(0x7FF0000000000000)) && ((uiA)&UINT64_C(0x0007FFFFFFFFFFFF))) ((((uiA)&UINT64_C(0x7FF8000000000000)) == UINT64_C(0x7FF0000000000000)) && ((uiA)&UINT64_C(0x0007FFFFFFFFFFFF)))
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming 'uiA' has the bit pattern of a 64-bit floating-point NaN, converts | Assuming 'uiA' has the bit pattern of a 64-bit floating-point NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the | this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid | location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_f64UIToCommonNaN(uint_fast64_t uiA, struct commonNaN* zPtr); void softfloat_f64UIToCommonNaN(uint_fast64_t uiA, struct commonNaN* zPtr);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by 'aPtr' into a 64-bit floating-point | Converts the common NaN pointed to by 'aPtr' into a 64-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast64_t softfloat_commonNaNToF64UI(const struct commonNaN* aPtr); uint_fast64_t softfloat_commonNaNToF64UI(const struct commonNaN* aPtr);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting 'uiA' and 'uiB' as the bit patterns of two 64-bit floating- | Interpreting 'uiA' and 'uiB' as the bit patterns of two 64-bit floating-
| point values, at least one of which is a NaN, returns the bit pattern of | point values, at least one of which is a NaN, returns the bit pattern of
| the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a | the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a
| signaling NaN, the invalid exception is raised. | signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast64_t softfloat_propagateNaNF64UI(uint_fast64_t uiA, uint_fast64_t uiB); uint_fast64_t softfloat_propagateNaNF64UI(uint_fast64_t uiA, uint_fast64_t uiB);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| The bit pattern for a default generated 80-bit extended floating-point NaN. | The bit pattern for a default generated 80-bit extended floating-point NaN.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define defaultNaNExtF80UI64 0xFFFF #define defaultNaNExtF80UI64 0xFFFF
#define defaultNaNExtF80UI0 UINT64_C(0xC000000000000000) #define defaultNaNExtF80UI0 UINT64_C(0xC000000000000000)
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Returns true when the 80-bit unsigned integer formed from concatenating | Returns true when the 80-bit unsigned integer formed from concatenating
| 16-bit 'uiA64' and 64-bit 'uiA0' has the bit pattern of an 80-bit extended | 16-bit 'uiA64' and 64-bit 'uiA0' has the bit pattern of an 80-bit extended
| floating-point signaling NaN. | floating-point signaling NaN.
| Note: This macro evaluates its arguments more than once. | Note: This macro evaluates its arguments more than once.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define softfloat_isSigNaNExtF80UI(uiA64, uiA0) \ #define softfloat_isSigNaNExtF80UI(uiA64, uiA0) \
((((uiA64)&0x7FFF) == 0x7FFF) && !((uiA0)&UINT64_C(0x4000000000000000)) && ((uiA0)&UINT64_C(0x3FFFFFFFFFFFFFFF))) ((((uiA64)&0x7FFF) == 0x7FFF) && !((uiA0)&UINT64_C(0x4000000000000000)) && ((uiA0)&UINT64_C(0x3FFFFFFFFFFFFFFF)))
#ifdef SOFTFLOAT_FAST_INT64 #ifdef SOFTFLOAT_FAST_INT64
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is | The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is
| defined. | defined.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming the unsigned integer formed from concatenating 'uiA64' and 'uiA0' | Assuming the unsigned integer formed from concatenating 'uiA64' and 'uiA0'
| has the bit pattern of an 80-bit extended floating-point NaN, converts | has the bit pattern of an 80-bit extended floating-point NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the | this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid | location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_extF80UIToCommonNaN(uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN* zPtr); void softfloat_extF80UIToCommonNaN(uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN* zPtr);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by 'aPtr' into an 80-bit extended | Converts the common NaN pointed to by 'aPtr' into an 80-bit extended
| floating-point NaN, and returns the bit pattern of this value as an unsigned | floating-point NaN, and returns the bit pattern of this value as an unsigned
| integer. | integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct uint128 softfloat_commonNaNToExtF80UI(const struct commonNaN* aPtr); struct uint128 softfloat_commonNaNToExtF80UI(const struct commonNaN* aPtr);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting the unsigned integer formed from concatenating 'uiA64' and | Interpreting the unsigned integer formed from concatenating 'uiA64' and
| 'uiA0' as an 80-bit extended floating-point value, and likewise interpreting | 'uiA0' as an 80-bit extended floating-point value, and likewise interpreting
| the unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another | the unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another
| 80-bit extended floating-point value, and assuming at least on of these | 80-bit extended floating-point value, and assuming at least on of these
| floating-point values is a NaN, returns the bit pattern of the combined NaN | floating-point values is a NaN, returns the bit pattern of the combined NaN
| result. If either original floating-point value is a signaling NaN, the | result. If either original floating-point value is a signaling NaN, the
| invalid exception is raised. | invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct uint128 softfloat_propagateNaNExtF80UI(uint_fast16_t uiA64, uint_fast64_t uiA0, uint_fast16_t uiB64, uint_fast64_t uiB0); struct uint128 softfloat_propagateNaNExtF80UI(uint_fast16_t uiA64, uint_fast64_t uiA0, uint_fast16_t uiB64, uint_fast64_t uiB0);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| The bit pattern for a default generated 128-bit floating-point NaN. | The bit pattern for a default generated 128-bit floating-point NaN.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define defaultNaNF128UI64 UINT64_C(0xFFFF800000000000) #define defaultNaNF128UI64 UINT64_C(0xFFFF800000000000)
#define defaultNaNF128UI0 UINT64_C(0) #define defaultNaNF128UI0 UINT64_C(0)
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Returns true when the 128-bit unsigned integer formed from concatenating | Returns true when the 128-bit unsigned integer formed from concatenating
| 64-bit 'uiA64' and 64-bit 'uiA0' has the bit pattern of a 128-bit floating- | 64-bit 'uiA64' and 64-bit 'uiA0' has the bit pattern of a 128-bit floating-
| point signaling NaN. | point signaling NaN.
| Note: This macro evaluates its arguments more than once. | Note: This macro evaluates its arguments more than once.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define softfloat_isSigNaNF128UI(uiA64, uiA0) \ #define softfloat_isSigNaNF128UI(uiA64, uiA0) \
((((uiA64)&UINT64_C(0x7FFF800000000000)) == UINT64_C(0x7FFF000000000000)) && ((uiA0) || ((uiA64)&UINT64_C(0x00007FFFFFFFFFFF)))) ((((uiA64)&UINT64_C(0x7FFF800000000000)) == UINT64_C(0x7FFF000000000000)) && ((uiA0) || ((uiA64)&UINT64_C(0x00007FFFFFFFFFFF))))
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming the unsigned integer formed from concatenating 'uiA64' and 'uiA0' | Assuming the unsigned integer formed from concatenating 'uiA64' and 'uiA0'
| has the bit pattern of a 128-bit floating-point NaN, converts this NaN to | has the bit pattern of a 128-bit floating-point NaN, converts this NaN to
| the common NaN form, and stores the resulting common NaN at the location | the common NaN form, and stores the resulting common NaN at the location
| pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid exception | pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid exception
| is raised. | is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_f128UIToCommonNaN(uint_fast64_t uiA64, uint_fast64_t uiA0, struct commonNaN* zPtr); void softfloat_f128UIToCommonNaN(uint_fast64_t uiA64, uint_fast64_t uiA0, struct commonNaN* zPtr);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point | Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct uint128 softfloat_commonNaNToF128UI(const struct commonNaN*); struct uint128 softfloat_commonNaNToF128UI(const struct commonNaN*);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting the unsigned integer formed from concatenating 'uiA64' and | Interpreting the unsigned integer formed from concatenating 'uiA64' and
| 'uiA0' as a 128-bit floating-point value, and likewise interpreting the | 'uiA0' as a 128-bit floating-point value, and likewise interpreting the
| unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another | unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another
| 128-bit floating-point value, and assuming at least on of these floating- | 128-bit floating-point value, and assuming at least on of these floating-
| point values is a NaN, returns the bit pattern of the combined NaN result. | point values is a NaN, returns the bit pattern of the combined NaN result.
| If either original floating-point value is a signaling NaN, the invalid | If either original floating-point value is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct uint128 softfloat_propagateNaNF128UI(uint_fast64_t uiA64, uint_fast64_t uiA0, uint_fast64_t uiB64, uint_fast64_t uiB0); struct uint128 softfloat_propagateNaNF128UI(uint_fast64_t uiA64, uint_fast64_t uiA0, uint_fast64_t uiB64, uint_fast64_t uiB0);
#else #else
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is not | The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is not
| defined. | defined.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming the 80-bit extended floating-point value pointed to by 'aSPtr' is | Assuming the 80-bit extended floating-point value pointed to by 'aSPtr' is
| a NaN, converts this NaN to the common NaN form, and stores the resulting | a NaN, converts this NaN to the common NaN form, and stores the resulting
| common NaN at the location pointed to by 'zPtr'. If the NaN is a signaling | common NaN at the location pointed to by 'zPtr'. If the NaN is a signaling
| NaN, the invalid exception is raised. | NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_extF80MToCommonNaN(const struct extFloat80M* aSPtr, struct commonNaN* zPtr); void softfloat_extF80MToCommonNaN(const struct extFloat80M* aSPtr, struct commonNaN* zPtr);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by 'aPtr' into an 80-bit extended | Converts the common NaN pointed to by 'aPtr' into an 80-bit extended
| floating-point NaN, and stores this NaN at the location pointed to by | floating-point NaN, and stores this NaN at the location pointed to by
| 'zSPtr'. | 'zSPtr'.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_commonNaNToExtF80M(const struct commonNaN* aPtr, struct extFloat80M* zSPtr); void softfloat_commonNaNToExtF80M(const struct commonNaN* aPtr, struct extFloat80M* zSPtr);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming at least one of the two 80-bit extended floating-point values | Assuming at least one of the two 80-bit extended floating-point values
| pointed to by 'aSPtr' and 'bSPtr' is a NaN, stores the combined NaN result | pointed to by 'aSPtr' and 'bSPtr' is a NaN, stores the combined NaN result
| at the location pointed to by 'zSPtr'. If either original floating-point | at the location pointed to by 'zSPtr'. If either original floating-point
| value is a signaling NaN, the invalid exception is raised. | value is a signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_propagateNaNExtF80M(const struct extFloat80M* aSPtr, const struct extFloat80M* bSPtr, struct extFloat80M* zSPtr); void softfloat_propagateNaNExtF80M(const struct extFloat80M* aSPtr, const struct extFloat80M* bSPtr, struct extFloat80M* zSPtr);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| The bit pattern for a default generated 128-bit floating-point NaN. | The bit pattern for a default generated 128-bit floating-point NaN.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define defaultNaNF128UI96 0xFFFF8000 #define defaultNaNF128UI96 0xFFFF8000
#define defaultNaNF128UI64 0 #define defaultNaNF128UI64 0
#define defaultNaNF128UI32 0 #define defaultNaNF128UI32 0
#define defaultNaNF128UI0 0 #define defaultNaNF128UI0 0
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming the 128-bit floating-point value pointed to by 'aWPtr' is a NaN, | Assuming the 128-bit floating-point value pointed to by 'aWPtr' is a NaN,
| converts this NaN to the common NaN form, and stores the resulting common | converts this NaN to the common NaN form, and stores the resulting common
| NaN at the location pointed to by 'zPtr'. If the NaN is a signaling NaN, | NaN at the location pointed to by 'zPtr'. If the NaN is a signaling NaN,
| the invalid exception is raised. Argument 'aWPtr' points to an array of | the invalid exception is raised. Argument 'aWPtr' points to an array of
| four 32-bit elements that concatenate in the platform's normal endian order | four 32-bit elements that concatenate in the platform's normal endian order
| to form a 128-bit floating-point value. | to form a 128-bit floating-point value.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_f128MToCommonNaN(const uint32_t* aWPtr, struct commonNaN* zPtr); void softfloat_f128MToCommonNaN(const uint32_t* aWPtr, struct commonNaN* zPtr);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point | Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point
| NaN, and stores this NaN at the location pointed to by 'zWPtr'. Argument | NaN, and stores this NaN at the location pointed to by 'zWPtr'. Argument
| 'zWPtr' points to an array of four 32-bit elements that concatenate in the | 'zWPtr' points to an array of four 32-bit elements that concatenate in the
| platform's normal endian order to form a 128-bit floating-point value. | platform's normal endian order to form a 128-bit floating-point value.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_commonNaNToF128M(const struct commonNaN* aPtr, uint32_t* zWPtr); void softfloat_commonNaNToF128M(const struct commonNaN* aPtr, uint32_t* zWPtr);
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming at least one of the two 128-bit floating-point values pointed to by | Assuming at least one of the two 128-bit floating-point values pointed to by
| 'aWPtr' and 'bWPtr' is a NaN, stores the combined NaN result at the location | 'aWPtr' and 'bWPtr' is a NaN, stores the combined NaN result at the location
| pointed to by 'zWPtr'. If either original floating-point value is a | pointed to by 'zWPtr'. If either original floating-point value is a
| signaling NaN, the invalid exception is raised. Each of 'aWPtr', 'bWPtr', | signaling NaN, the invalid exception is raised. Each of 'aWPtr', 'bWPtr',
| and 'zWPtr' points to an array of four 32-bit elements that concatenate in | and 'zWPtr' points to an array of four 32-bit elements that concatenate in
| the platform's normal endian order to form a 128-bit floating-point value. | the platform's normal endian order to form a 128-bit floating-point value.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_propagateNaNF128M(const uint32_t* aWPtr, const uint32_t* bWPtr, uint32_t* zWPtr); void softfloat_propagateNaNF128M(const uint32_t* aWPtr, const uint32_t* bWPtr, uint32_t* zWPtr);
#endif #endif
#endif #endif

View File

@ -1,57 +1,57 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
bool extF80M_isSignalingNaN( const extFloat80_t *aPtr ) bool extF80M_isSignalingNaN( const extFloat80_t *aPtr )
{ {
const struct extFloat80M *aSPtr; const struct extFloat80M *aSPtr;
uint64_t uiA0; uint64_t uiA0;
aSPtr = (const struct extFloat80M *) aPtr; aSPtr = (const struct extFloat80M *) aPtr;
if ( (aSPtr->signExp & 0x7FFF) != 0x7FFF ) return false; if ( (aSPtr->signExp & 0x7FFF) != 0x7FFF ) return false;
uiA0 = aSPtr->signif; uiA0 = aSPtr->signif;
return return
! (uiA0 & UINT64_C( 0x4000000000000000 )) ! (uiA0 & UINT64_C( 0x4000000000000000 ))
&& (uiA0 & UINT64_C( 0x3FFFFFFFFFFFFFFF)); && (uiA0 & UINT64_C( 0x3FFFFFFFFFFFFFFF));
} }

View File

@ -1,60 +1,60 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
bool f128M_isSignalingNaN( const float128_t *aPtr ) bool f128M_isSignalingNaN( const float128_t *aPtr )
{ {
const uint32_t *aWPtr; const uint32_t *aWPtr;
uint32_t uiA96; uint32_t uiA96;
aWPtr = (const uint32_t *) aPtr; aWPtr = (const uint32_t *) aPtr;
uiA96 = aWPtr[indexWordHi( 4 )]; uiA96 = aWPtr[indexWordHi( 4 )];
if ( (uiA96 & 0x7FFF8000) != 0x7FFF0000 ) return false; if ( (uiA96 & 0x7FFF8000) != 0x7FFF0000 ) return false;
return return
((uiA96 & 0x00007FFF) != 0) ((uiA96 & 0x00007FFF) != 0)
|| ((aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )] || ((aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
| aWPtr[indexWord( 4, 0 )]) | aWPtr[indexWord( 4, 0 )])
!= 0); != 0);
} }

View File

@ -1,57 +1,57 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2017 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2015, 2017 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include "platform.h" #include "platform.h"
#include "softfloat_types.h" #include "softfloat_types.h"
#define softfloat_commonNaNToExtF80M softfloat_commonNaNToExtF80M #define softfloat_commonNaNToExtF80M softfloat_commonNaNToExtF80M
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by 'aPtr' into an 80-bit extended | Converts the common NaN pointed to by 'aPtr' into an 80-bit extended
| floating-point NaN, and stores this NaN at the location pointed to by | floating-point NaN, and stores this NaN at the location pointed to by
| 'zSPtr'. | 'zSPtr'.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_commonNaNToExtF80M( softfloat_commonNaNToExtF80M(
const struct commonNaN *aPtr, struct extFloat80M *zSPtr ) const struct commonNaN *aPtr, struct extFloat80M *zSPtr )
{ {
zSPtr->signExp = defaultNaNExtF80UI64; zSPtr->signExp = defaultNaNExtF80UI64;
zSPtr->signif = defaultNaNExtF80UI0; zSPtr->signif = defaultNaNExtF80UI0;
} }

View File

@ -1,57 +1,57 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2017 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2015, 2017 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include "platform.h" #include "platform.h"
#include "primitiveTypes.h" #include "primitiveTypes.h"
#define softfloat_commonNaNToExtF80UI softfloat_commonNaNToExtF80UI #define softfloat_commonNaNToExtF80UI softfloat_commonNaNToExtF80UI
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by 'aPtr' into an 80-bit extended | Converts the common NaN pointed to by 'aPtr' into an 80-bit extended
| floating-point NaN, and returns the bit pattern of this value as an unsigned | floating-point NaN, and returns the bit pattern of this value as an unsigned
| integer. | integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct uint128 softfloat_commonNaNToExtF80UI( const struct commonNaN *aPtr ) struct uint128 softfloat_commonNaNToExtF80UI( const struct commonNaN *aPtr )
{ {
struct uint128 uiZ; struct uint128 uiZ;
uiZ.v64 = defaultNaNExtF80UI64; uiZ.v64 = defaultNaNExtF80UI64;
uiZ.v0 = defaultNaNExtF80UI0; uiZ.v0 = defaultNaNExtF80UI0;
return uiZ; return uiZ;
} }

View File

@ -1,60 +1,60 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2017 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2015, 2017 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitiveTypes.h" #include "primitiveTypes.h"
#define softfloat_commonNaNToF128M softfloat_commonNaNToF128M #define softfloat_commonNaNToF128M softfloat_commonNaNToF128M
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point | Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point
| NaN, and stores this NaN at the location pointed to by 'zWPtr'. Argument | NaN, and stores this NaN at the location pointed to by 'zWPtr'. Argument
| 'zWPtr' points to an array of four 32-bit elements that concatenate in the | 'zWPtr' points to an array of four 32-bit elements that concatenate in the
| platform's normal endian order to form a 128-bit floating-point value. | platform's normal endian order to form a 128-bit floating-point value.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_commonNaNToF128M( const struct commonNaN *aPtr, uint32_t *zWPtr ) softfloat_commonNaNToF128M( const struct commonNaN *aPtr, uint32_t *zWPtr )
{ {
zWPtr[indexWord( 4, 3 )] = defaultNaNF128UI96; zWPtr[indexWord( 4, 3 )] = defaultNaNF128UI96;
zWPtr[indexWord( 4, 2 )] = defaultNaNF128UI64; zWPtr[indexWord( 4, 2 )] = defaultNaNF128UI64;
zWPtr[indexWord( 4, 1 )] = defaultNaNF128UI32; zWPtr[indexWord( 4, 1 )] = defaultNaNF128UI32;
zWPtr[indexWord( 4, 0 )] = defaultNaNF128UI0; zWPtr[indexWord( 4, 0 )] = defaultNaNF128UI0;
} }

View File

@ -1,56 +1,56 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2017 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2015, 2017 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include "platform.h" #include "platform.h"
#include "primitiveTypes.h" #include "primitiveTypes.h"
#define softfloat_commonNaNToF128UI softfloat_commonNaNToF128UI #define softfloat_commonNaNToF128UI softfloat_commonNaNToF128UI
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point | Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct uint128 softfloat_commonNaNToF128UI( const struct commonNaN *aPtr ) struct uint128 softfloat_commonNaNToF128UI( const struct commonNaN *aPtr )
{ {
struct uint128 uiZ; struct uint128 uiZ;
uiZ.v64 = defaultNaNF128UI64; uiZ.v64 = defaultNaNF128UI64;
uiZ.v0 = defaultNaNF128UI0; uiZ.v0 = defaultNaNF128UI0;
return uiZ; return uiZ;
} }

View File

@ -1,5 +1,5 @@
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| This file intentionally contains no code. | This file intentionally contains no code.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/

View File

@ -1,5 +1,5 @@
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| This file intentionally contains no code. | This file intentionally contains no code.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/

View File

@ -1,5 +1,5 @@
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| This file intentionally contains no code. | This file intentionally contains no code.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/

View File

@ -1,5 +1,5 @@
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| This file intentionally contains no code. | This file intentionally contains no code.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/

View File

@ -1,5 +1,5 @@
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| This file intentionally contains no code. | This file intentionally contains no code.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/

Some files were not shown because too many files have changed in this diff Show More