Merge branch 'develop'
Conflicts: .cproject dbt-core sc-components
This commit is contained in:
commit
9ad29ddb64
16
.cproject
16
.cproject
|
@ -10,6 +10,7 @@
|
||||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
</extensions>
|
</extensions>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
|
@ -17,7 +18,7 @@
|
||||||
<folderInfo id="cdt.managedbuild.config.gnu.exe.debug.1751741082." name="/" resourcePath="">
|
<folderInfo id="cdt.managedbuild.config.gnu.exe.debug.1751741082." name="/" resourcePath="">
|
||||||
<toolChain id="cdt.managedbuild.toolchain.gnu.exe.debug.1289745146" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.debug">
|
<toolChain id="cdt.managedbuild.toolchain.gnu.exe.debug.1289745146" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.debug">
|
||||||
<targetPlatform binaryParser="org.eclipse.cdt.core.GNU_ELF;org.eclipse.cdt.core.ELF" id="cdt.managedbuild.target.gnu.platform.exe.debug.1460698591" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.debug"/>
|
<targetPlatform binaryParser="org.eclipse.cdt.core.GNU_ELF;org.eclipse.cdt.core.ELF" id="cdt.managedbuild.target.gnu.platform.exe.debug.1460698591" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.debug"/>
|
||||||
<builder buildPath="/DBT-RISE-RISCV/build/Debug" id="de.marw.cdt.cmake.core.genscriptbuilder.2126162017" keepEnvironmentInBuildfile="false" name="CMake Builder (portable)" parallelBuildOn="true" parallelizationNumber="optimal" superClass="de.marw.cdt.cmake.core.genscriptbuilder"/>
|
<builder buildPath="/DBT-RISE-RISCV/build/{ConfigName}" id="de.marw.cdt.cmake.core.genmakebuilder.2061143699" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CMake Builder (GNU Make)" parallelBuildOn="true" parallelizationNumber="optimal" superClass="de.marw.cdt.cmake.core.genmakebuilder"/>
|
||||||
<tool id="cdt.managedbuild.tool.gnu.archiver.base.366643800" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
|
<tool id="cdt.managedbuild.tool.gnu.archiver.base.366643800" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
|
||||||
<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.1510612390" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug">
|
<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.1510612390" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug">
|
||||||
<option id="gnu.cpp.compiler.exe.debug.option.optimization.level.1768317780" name="Optimization Level" superClass="gnu.cpp.compiler.exe.debug.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
|
<option id="gnu.cpp.compiler.exe.debug.option.optimization.level.1768317780" name="Optimization Level" superClass="gnu.cpp.compiler.exe.debug.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
|
||||||
|
@ -45,7 +46,17 @@
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||||
<storageModule buildDir="build/${ConfigName}" moduleId="de.marw.cdt.cmake.core.settings">
|
<storageModule buildDir="build/${ConfigName}" moduleId="de.marw.cdt.cmake.core.settings">
|
||||||
<options/>
|
<options clearCache="true"/>
|
||||||
|
<linux command="cmake" generator="UnixMakefiles" use-default="true">
|
||||||
|
<defs>
|
||||||
|
<def name="CMAKE_VERBOSE_MAKEFILE" type="BOOL" val="OFF"/>
|
||||||
|
</defs>
|
||||||
|
<undefs/>
|
||||||
|
</linux>
|
||||||
|
<win32 command="cmake" generator="MinGWMakefiles" use-default="true">
|
||||||
|
<defs/>
|
||||||
|
<undefs/>
|
||||||
|
</win32>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
</cconfiguration>
|
</cconfiguration>
|
||||||
<cconfiguration id="cdt.managedbuild.config.gnu.exe.release.1745230171">
|
<cconfiguration id="cdt.managedbuild.config.gnu.exe.release.1745230171">
|
||||||
|
@ -177,4 +188,5 @@
|
||||||
</configuration>
|
</configuration>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
|
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
|
||||||
|
<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
|
||||||
</cproject>
|
</cproject>
|
||||||
|
|
3
.project
3
.project
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<projectDescription>
|
<projectDescription>
|
||||||
<name>dbt-riscv</name>
|
<name>DBT-RISE-RISCV</name>
|
||||||
<comment></comment>
|
<comment></comment>
|
||||||
<projects>
|
<projects>
|
||||||
</projects>
|
</projects>
|
||||||
|
@ -23,5 +23,6 @@
|
||||||
<nature>org.eclipse.cdt.core.ccnature</nature>
|
<nature>org.eclipse.cdt.core.ccnature</nature>
|
||||||
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
||||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||||
|
<nature>org.eclipse.linuxtools.tmf.project.nature</nature>
|
||||||
</natures>
|
</natures>
|
||||||
</projectDescription>
|
</projectDescription>
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
environment/project/cdt.managedbuild.config.gnu.exe.debug.1751741082/append=true
|
||||||
|
environment/project/cdt.managedbuild.config.gnu.exe.debug.1751741082/appendContributed=true
|
||||||
|
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171/LLVM_HOME/delimiter=\:
|
||||||
|
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171/LLVM_HOME/operation=append
|
||||||
|
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171/LLVM_HOME/value=/usr/lib/llvm-6.0
|
||||||
|
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171/append=true
|
||||||
|
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171/appendContributed=true
|
|
@ -51,6 +51,8 @@ include(clang-format)
|
||||||
add_subdirectory(external)
|
add_subdirectory(external)
|
||||||
add_subdirectory(dbt-core)
|
add_subdirectory(dbt-core)
|
||||||
add_subdirectory(sc-components)
|
add_subdirectory(sc-components)
|
||||||
|
add_subdirectory(softfloat)
|
||||||
|
GET_DIRECTORY_PROPERTY(SOFTFLOAT_INCLUDE_DIRS DIRECTORY softfloat DEFINITION SOFTFLOAT_INCLUDE_DIRS)
|
||||||
add_subdirectory(riscv)
|
add_subdirectory(riscv)
|
||||||
add_subdirectory(riscv.sc)
|
add_subdirectory(riscv.sc)
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
2
dbt-core
2
dbt-core
|
@ -1 +1 @@
|
||||||
Subproject commit 23dbab0b768d122c492110d1db34408e9ae787f3
|
Subproject commit 393c374cac4950e629036dda1615abedf866961f
|
|
@ -2,7 +2,7 @@
|
||||||
<launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
|
<launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
|
||||||
<stringAttribute key="org.eclipse.debug.core.ATTR_REFRESH_SCOPE" value="${working_set:<?xml version="1.0" encoding="UTF-8"?> <resources> <item path="/dbt-riscv/riscv" type="2"/> </resources>}"/>
|
<stringAttribute key="org.eclipse.debug.core.ATTR_REFRESH_SCOPE" value="${working_set:<?xml version="1.0" encoding="UTF-8"?> <resources> <item path="/dbt-riscv/riscv" type="2"/> </resources>}"/>
|
||||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${none}"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${none}"/>
|
||||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/lib/jvm/java-8-oracle/bin/java"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/java"/>
|
||||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-jar ${env_var:HOME}/git/JIT-ISS-CoreDsl/com.minres.coredsl.standalone/target/com.minres.coredsl.standalone-1.0.0-SNAPSHOT.jar -i=${project_loc:dbt-riscv}/riscv/incl/iss/arch -s=${project_loc:dbt-riscv}/riscv/src/iss -v=${project_loc:dbt-riscv}/riscv/src/internal -t=${project_loc:dbt-riscv}/riscv/gen_input/templates ${project_loc:dbt-riscv}/riscv/gen_input/minres_rv.core_desc"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-Xmx1G -jar ${env_var:HOME}/git/JIT-ISS-CoreDsl/com.minres.coredsl.standalone/target/com.minres.coredsl.standalone-1.0.0-SNAPSHOT.jar -i=${project_loc:DBT-RISE-RISCV}/riscv/incl/iss/arch -s=${project_loc:DBT-RISE-RISCV}/riscv/src/iss -v=${project_loc:DBT-RISE-RISCV}/riscv/src/internal -t=${project_loc:DBT-RISE-RISCV}/riscv/gen_input/templates ${project_loc:DBT-RISE-RISCV}/riscv/gen_input/minres_rv.core_desc"/>
|
||||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/dbt-riscv}/riscv/gen_input"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/DBT-RISE-RISCV}/riscv/gen_input"/>
|
||||||
</launchConfiguration>
|
</launchConfiguration>
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
|
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
|
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="-v4 -g10000 ${project_loc:hello}/hello"/>
|
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="-v4 -g10000 ${project_loc:hello}/hello"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="/home/eyck/git/DBT-RISE-RISCV/build/Debug/bin/riscv"/>
|
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="build/Debug/riscv/bin/riscv"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="DBT-RISE-RISCV"/>
|
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="DBT-RISE-RISCV"/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
|
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value=""/>
|
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value=""/>
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<launchConfiguration type="org.eclipse.cdt.launch.applicationLaunchType">
|
||||||
|
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB" value="true"/>
|
||||||
|
<listAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB_LIST"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="gdb"/>
|
||||||
|
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_ON_FORK" value="false"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.dsf.gdb.GDB_INIT" value=".gdbinit"/>
|
||||||
|
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.REVERSE" value="false"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.dsf.gdb.REVERSE_MODE" value="UseSoftTrace"/>
|
||||||
|
<listAttribute key="org.eclipse.cdt.dsf.gdb.SOLIB_PATH"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.dsf.gdb.TRACEPOINT_MODE" value="TP_NORMAL_ONLY"/>
|
||||||
|
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.internal.ui.launching.LocalApplicationCDebuggerTab.DEFAULTS_SET" value="true"/>
|
||||||
|
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_ID" value="gdb"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="run"/>
|
||||||
|
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="-v4 -p ic=${workspace_loc:DBT-RISE-RISCV}/cycles.txt ${project_loc:hello}/hello"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="build/Debug/riscv/bin/riscv"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="DBT-RISE-RISCV"/>
|
||||||
|
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="cdt.managedbuild.config.gnu.exe.debug.1751741082"/>
|
||||||
|
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
||||||
|
<listEntry value="/DBT-RISE-RISCV"/>
|
||||||
|
</listAttribute>
|
||||||
|
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
||||||
|
<listEntry value="4"/>
|
||||||
|
</listAttribute>
|
||||||
|
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="reserved-for-future-use"/> "/>
|
||||||
|
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
||||||
|
</launchConfiguration>
|
|
@ -19,7 +19,7 @@
|
||||||
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
|
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="sc_main"/>
|
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="sc_main"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="-v5 -c simple-system.json -l ${project_loc:hello}/hello"/>
|
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="-v5 -c simple-system.json -l ${project_loc:hello}/hello"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="/home/eyck/git/DBT-RISE-RISCV/build/Debug/bin/riscv.sc"/>
|
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="build/Debug/bin/riscv.sc"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="DBT-RISE-RISCV"/>
|
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="DBT-RISE-RISCV"/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
|
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value=""/>
|
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value=""/>
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<launchConfiguration type="org.eclipse.cdt.launch.applicationLaunchType">
|
||||||
|
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB" value="true"/>
|
||||||
|
<listAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB_LIST"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="gdb"/>
|
||||||
|
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_ON_FORK" value="false"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.dsf.gdb.GDB_INIT" value=".gdbinit"/>
|
||||||
|
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.REVERSE" value="false"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.dsf.gdb.REVERSE_MODE" value="UseSoftTrace"/>
|
||||||
|
<listAttribute key="org.eclipse.cdt.dsf.gdb.SOLIB_PATH"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.dsf.gdb.TRACEPOINT_MODE" value="TP_NORMAL_ONLY"/>
|
||||||
|
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.internal.ui.launching.LocalApplicationCDebuggerTab.DEFAULTS_SET" value="true"/>
|
||||||
|
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="1"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_ID" value="gdb"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="run"/>
|
||||||
|
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="-v4 ${project_loc:dhrystone}/dhrystone"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="build/Release/riscv/bin/riscv"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="DBT-RISE-RISCV"/>
|
||||||
|
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
|
||||||
|
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="cdt.managedbuild.config.gnu.exe.release.1745230171"/>
|
||||||
|
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
||||||
|
<listEntry value="/DBT-RISE-RISCV"/>
|
||||||
|
</listAttribute>
|
||||||
|
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
||||||
|
<listEntry value="4"/>
|
||||||
|
</listAttribute>
|
||||||
|
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="reserved-for-future-use"/> "/>
|
||||||
|
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
||||||
|
</launchConfiguration>
|
|
@ -68,7 +68,7 @@ include_directories(
|
||||||
|
|
||||||
add_dependent_subproject(dbt-core)
|
add_dependent_subproject(dbt-core)
|
||||||
add_dependent_subproject(sc-components)
|
add_dependent_subproject(sc-components)
|
||||||
add_dependent_header(util)
|
add_dependent_subproject(riscv)
|
||||||
|
|
||||||
include_directories(
|
include_directories(
|
||||||
${PROJECT_SOURCE_DIR}/incl
|
${PROJECT_SOURCE_DIR}/incl
|
||||||
|
|
|
@ -41,6 +41,7 @@ add_executable(${APPLICATION_NAME} ${APP_SOURCES})
|
||||||
target_link_libraries(${APPLICATION_NAME} ${LIBRARY_NAME})
|
target_link_libraries(${APPLICATION_NAME} ${LIBRARY_NAME})
|
||||||
target_link_libraries(${APPLICATION_NAME} risc-v)
|
target_link_libraries(${APPLICATION_NAME} risc-v)
|
||||||
target_link_libraries(${APPLICATION_NAME} dbt-core)
|
target_link_libraries(${APPLICATION_NAME} dbt-core)
|
||||||
|
target_link_libraries(${APPLICATION_NAME} softfloat)
|
||||||
target_link_libraries(${APPLICATION_NAME} sc-components)
|
target_link_libraries(${APPLICATION_NAME} sc-components)
|
||||||
target_link_libraries(${APPLICATION_NAME} ${CONAN_LIBS_SEASOCKS})
|
target_link_libraries(${APPLICATION_NAME} ${CONAN_LIBS_SEASOCKS})
|
||||||
target_link_libraries(${APPLICATION_NAME} external)
|
target_link_libraries(${APPLICATION_NAME} external)
|
||||||
|
|
|
@ -103,7 +103,9 @@ public:
|
||||||
|
|
||||||
base_type::hart_state<base_type::reg_t>& get_state() { return this->state; }
|
base_type::hart_state<base_type::reg_t>& get_state() { return this->state; }
|
||||||
|
|
||||||
void notify_phase(exec_phase) override;
|
void notify_phase(exec_phase p) override {
|
||||||
|
if(p == ISTART) owner->sync(this->reg.icount+cycle_offset);
|
||||||
|
}
|
||||||
|
|
||||||
sync_type needed_sync() const override { return PRE_SYNC; }
|
sync_type needed_sync() const override { return PRE_SYNC; }
|
||||||
|
|
||||||
|
@ -131,9 +133,12 @@ public:
|
||||||
return owner->write_mem_dbg(addr.val, length, data) ? Ok : Err;
|
return owner->write_mem_dbg(addr.val, length, data) ? Ok : Err;
|
||||||
else{
|
else{
|
||||||
auto res = owner->write_mem(addr.val, length, data) ? Ok : Err;
|
auto res = owner->write_mem(addr.val, length, data) ? Ok : Err;
|
||||||
// TODO: this is an ugly hack (clear MTIP on mtimecmp write), needs to be fixed
|
// clear MTIP on mtimecmp write
|
||||||
if(addr.val==0x2004000)
|
if(addr.val==0x2004000){
|
||||||
this->csr[arch::mip] &= ~(1ULL<<7);
|
reg_t val;
|
||||||
|
this->read_csr(arch::mip, val);
|
||||||
|
this->write_csr(arch::mip, val & ~(1ULL<<7));
|
||||||
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -198,11 +203,6 @@ int cmd_sysc(int argc, char* argv[], debugger::out_func of, debugger::data_func
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void core_wrapper::notify_phase(exec_phase p) {
|
|
||||||
if(p == ISTART)
|
|
||||||
owner->sync(this->reg.icount+cycle_offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
core_complex::core_complex(sc_core::sc_module_name name)
|
core_complex::core_complex(sc_core::sc_module_name name)
|
||||||
: sc_core::sc_module(name)
|
: sc_core::sc_module(name)
|
||||||
, NAMED(initiator)
|
, NAMED(initiator)
|
||||||
|
|
|
@ -41,30 +41,14 @@ message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
|
||||||
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")
|
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")
|
||||||
llvm_map_components_to_libnames(llvm_libs support core mcjit x86codegen x86asmparser)
|
llvm_map_components_to_libnames(llvm_libs support core mcjit x86codegen x86asmparser)
|
||||||
|
|
||||||
find_package(SystemC)
|
|
||||||
if(SystemC_FOUND)
|
|
||||||
add_definitions(-DWITH_SYSTEMC)
|
|
||||||
include_directories(${SystemC_INCLUDE_DIRS})
|
|
||||||
link_directories(${SystemC_LIBRARY_DIRS})
|
|
||||||
else(SystemC_FOUND)
|
|
||||||
message( FATAL_ERROR "SystemC library not found." )
|
|
||||||
endif(SystemC_FOUND)
|
|
||||||
|
|
||||||
if(SCV_FOUND)
|
|
||||||
add_definitions(-DWITH_SCV)
|
|
||||||
link_directories(${SCV_LIBRARY_DIRS})
|
|
||||||
endif(SCV_FOUND)
|
|
||||||
|
|
||||||
# This sets the include directory for the reference project. This is the -I flag in gcc.
|
# This sets the include directory for the reference project. This is the -I flag in gcc.
|
||||||
include_directories(
|
include_directories(
|
||||||
${PROJECT_SOURCE_DIR}/incl
|
${PROJECT_SOURCE_DIR}/incl
|
||||||
|
${SOFTFLOAT_INCLUDE_DIRS}
|
||||||
${LLVM_INCLUDE_DIRS}
|
${LLVM_INCLUDE_DIRS}
|
||||||
)
|
)
|
||||||
|
|
||||||
add_dependent_subproject(dbt-core)
|
add_dependent_subproject(dbt-core)
|
||||||
add_dependent_subproject(sc-components)
|
add_dependent_subproject(sc-components)
|
||||||
add_dependent_header(util)
|
|
||||||
|
|
||||||
include_directories(
|
include_directories(
|
||||||
${PROJECT_SOURCE_DIR}/incl
|
${PROJECT_SOURCE_DIR}/incl
|
||||||
${PROJECT_SOURCE_DIR}/../external/elfio
|
${PROJECT_SOURCE_DIR}/../external/elfio
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import "RV32IBase.core_desc"
|
import "RV32IBase.core_desc"
|
||||||
|
|
||||||
InsructionSet RV32CI {
|
InsructionSet RV32IC {
|
||||||
constants {
|
constants {
|
||||||
XLEN
|
XLEN
|
||||||
}
|
}
|
||||||
|
@ -197,7 +197,64 @@ InsructionSet RV32CI {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
InsructionSet RV32CF extends RV32CI {
|
InsructionSet RV32FC extends RV32IC{
|
||||||
|
constants {
|
||||||
|
XLEN, FLEN
|
||||||
|
}
|
||||||
|
address_spaces {
|
||||||
|
MEM[8]
|
||||||
|
}
|
||||||
|
registers {
|
||||||
|
[31:0] X[XLEN],
|
||||||
|
[31:0] F[FLEN]
|
||||||
|
}
|
||||||
|
instructions{
|
||||||
|
C.FLW {
|
||||||
|
encoding: b011 | uimm[5:3] | rs1[2:0] | uimm[2:2] | uimm[6:6] | rd[2:0] | b00;
|
||||||
|
args_disass:"f(8+%rd$d), %uimm%(x(8+%rs1$d))";
|
||||||
|
val rs1_idx[5] <= rs1+8;
|
||||||
|
val rd_idx[5] <= rd+8;
|
||||||
|
val offs[XLEN] <= X[rs1_idx]+uimm;
|
||||||
|
val res[32] <= MEM[offs]{32};
|
||||||
|
if(FLEN==32)
|
||||||
|
F[rd_idx] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<32) | zext(res, FLEN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
C.FSW {
|
||||||
|
encoding: b111 | uimm[5:3] | rs1[2:0] | uimm[2:2] | uimm[6:6] | rs2[2:0] | b00;
|
||||||
|
args_disass:"f(8+%rs2$d), %uimm%(x(8+%rs1$d))";
|
||||||
|
val rs1_idx[5] <= rs1+8;
|
||||||
|
val rs2_idx[5] <= rs2+8;
|
||||||
|
val offs[XLEN] <= X[rs1_idx]+uimm;
|
||||||
|
MEM[offs]{32}<=F[rs2_idx]{32};
|
||||||
|
}
|
||||||
|
C.FLWSP {
|
||||||
|
encoding:b011 | uimm[5:5] | rd[4:0] | uimm[4:2] | uimm[7:6] | b10;
|
||||||
|
args_disass:"f%rd$d, %uimm%(x2)";
|
||||||
|
val x2_idx[5] <= 2;
|
||||||
|
val offs[XLEN] <= X[x2_idx]+uimm;
|
||||||
|
val res[32] <= MEM[offs]{32};
|
||||||
|
if(FLEN==32)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<32) | zext(res, FLEN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
C.FSWSP {
|
||||||
|
encoding:b111 | uimm[5:2] | uimm[7:6] | rs2[4:0] | b10;
|
||||||
|
args_disass:"f%rs2$d, %uimm%(x2), ";
|
||||||
|
val x2_idx[5] <= 2;
|
||||||
|
val offs[XLEN] <= X[x2_idx]+uimm;
|
||||||
|
MEM[offs]{32}<=F[rs2]{32};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
InsructionSet RV32DC extends RV32IC{
|
||||||
constants {
|
constants {
|
||||||
XLEN, FLEN
|
XLEN, FLEN
|
||||||
}
|
}
|
||||||
|
@ -211,32 +268,50 @@ InsructionSet RV32CF extends RV32CI {
|
||||||
instructions{
|
instructions{
|
||||||
C.FLD { //(RV32/64)
|
C.FLD { //(RV32/64)
|
||||||
encoding: b001 | uimm[5:3] | rs1[2:0] | uimm[7:6] | rd[2:0] | b00;
|
encoding: b001 | uimm[5:3] | rs1[2:0] | uimm[7:6] | rd[2:0] | b00;
|
||||||
|
args_disass:"f(8+%rd$d), %uimm%(x(8+%rs1$d))";
|
||||||
|
val rs1_idx[5] <= rs1+8;
|
||||||
|
val rd_idx[5] <= rd+8;
|
||||||
|
val offs[XLEN] <= X[rs1_idx]+uimm;
|
||||||
|
val res[64] <= MEM[offs]{64};
|
||||||
|
if(FLEN==64)
|
||||||
|
F[rd_idx] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd_idx] <= (upper<<64) | res;
|
||||||
}
|
}
|
||||||
C.FLW {//(RV32)
|
|
||||||
encoding: b011 | uimm[5:3] | rs1[2:0] | uimm[2:2] | uimm[6:6] | rd[2:0] | b00;
|
|
||||||
}
|
}
|
||||||
C.FSD { //(RV32/64)
|
C.FSD { //(RV32/64)
|
||||||
encoding: b101 | uimm[5:3] | rs1[2:0] | uimm[7:6] | rs2[2:0] | b00;
|
encoding: b101 | uimm[5:3] | rs1[2:0] | uimm[7:6] | rs2[2:0] | b00;
|
||||||
}
|
args_disass:"f(8+%rs2$d), %uimm%(x(8+%rs1$d))";
|
||||||
C.FSW {//(RV32)
|
val rs1_idx[5] <= rs1+8;
|
||||||
encoding: b111 | uimm[5:3] | rs1[2:0] | uimm[2:2] | uimm[6:6] | rs2[2:0] | b00;
|
val rs2_idx[5] <= rs2+8;
|
||||||
|
val offs[XLEN] <= X[rs1_idx]+uimm;
|
||||||
|
MEM[offs]{64}<=F[rs2_idx]{64};
|
||||||
}
|
}
|
||||||
C.FLDSP {//(RV32/64)
|
C.FLDSP {//(RV32/64)
|
||||||
encoding:b001 | uimm[5:5] | rd[4:0] | uimm[4:3] | uimm[8:6] | b10;
|
encoding:b001 | uimm[5:5] | rd[4:0] | uimm[4:3] | uimm[8:6] | b10;
|
||||||
|
args_disass:"f%rd$d, %uimm%(x2)";
|
||||||
|
val x2_idx[5] <= 2;
|
||||||
|
val offs[XLEN] <= X[x2_idx]+uimm;
|
||||||
|
val res[64] <= MEM[offs]{64};
|
||||||
|
if(FLEN==64)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<64) | zext(res, FLEN);
|
||||||
}
|
}
|
||||||
C.FLWSP {//RV32
|
|
||||||
encoding:b011 | uimm[5:5] | rd[4:0] | uimm[4:2] | uimm[7:6] | b10;
|
|
||||||
}
|
}
|
||||||
C.FSDSP {//(RV32/64)
|
C.FSDSP {//(RV32/64)
|
||||||
encoding:b101 | uimm[5:3] | uimm[8:6] | rs2[4:0] | b10;
|
encoding:b101 | uimm[5:3] | uimm[8:6] | rs2[4:0] | b10;
|
||||||
}
|
args_disass:"f%rs2$d, %uimm%(x2), ";
|
||||||
C.FSWSP {//(RV32)
|
val x2_idx[5] <= 2;
|
||||||
encoding:b111 | uimm[5:2] | uimm[7:6] | rs2[4:0] | b10;
|
val offs[XLEN] <= X[x2_idx]+uimm;
|
||||||
|
MEM[offs]{64}<=F[rs2]{64};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
InsructionSet RV64CI extends RV32CI {
|
InsructionSet RV64IC extends RV32IC {
|
||||||
constants {
|
constants {
|
||||||
XLEN
|
XLEN
|
||||||
}
|
}
|
||||||
|
@ -284,7 +359,7 @@ InsructionSet RV64CI extends RV32CI {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
InsructionSet RV128CI extends RV64CI {
|
InsructionSet RV128IC extends RV64IC {
|
||||||
constants {
|
constants {
|
||||||
XLEN
|
XLEN
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,298 @@
|
||||||
|
import "RV32IBase.core_desc"
|
||||||
|
|
||||||
|
InsructionSet RV32D extends RV32IBase{
|
||||||
|
constants {
|
||||||
|
FLEN, FFLAG_MASK := 0x1f
|
||||||
|
}
|
||||||
|
registers {
|
||||||
|
[31:0] F[FLEN], FCSR[32]
|
||||||
|
}
|
||||||
|
instructions{
|
||||||
|
FLD {
|
||||||
|
encoding: imm[11:0]s | rs1[4:0] | b011 | rd[4:0] | b0000111;
|
||||||
|
args_disass:"f%rd$d, %imm%(x%rs1$d)";
|
||||||
|
val offs[XLEN] <= X[rs1]+imm;
|
||||||
|
val res[64] <= MEM[offs]{64};
|
||||||
|
if(FLEN==64)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<64) | res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FSD {
|
||||||
|
encoding: imm[11:5]s | rs2[4:0] | rs1[4:0] | b011 | imm[4:0]s | b0100111;
|
||||||
|
args_disass:"f%rs2$d, %imm%(x%rs1$d)";
|
||||||
|
val offs[XLEN] <= X[rs1]+imm;
|
||||||
|
MEM[offs]{64}<=F[rs2]{64};
|
||||||
|
}
|
||||||
|
FMADD.D {
|
||||||
|
encoding: rs3[4:0] | b01 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1000011;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d, f%rs2$d, f%rs3$d";
|
||||||
|
//F[rd]f<= F[rs1]f * F[rs2]f + F[rs3]f;
|
||||||
|
val res[64] <= fdispatch_fmadd_d(F[rs1]{64}, F[rs2]{64}, F[rs3]{64}, zext(0, 64), choose(rm<7, rm{8}, FCSR{8}));
|
||||||
|
if(FLEN==64)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<64) | res;
|
||||||
|
}
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
|
}
|
||||||
|
FMSUB.D {
|
||||||
|
encoding: rs3[4:0] | b01 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1000111;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d, f%rs2$d, f%rs3$d";
|
||||||
|
//F[rd]f<=F[rs1]f * F[rs2]f - F[rs3]f;
|
||||||
|
val res[64] <= fdispatch_fmadd_d(F[rs1]{64}, F[rs2]{64}, F[rs3]{64}, zext(1, 32), choose(rm<7, rm{8}, FCSR{8}));
|
||||||
|
if(FLEN==64)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<64) | res;
|
||||||
|
}
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
|
}
|
||||||
|
FNMADD.D {
|
||||||
|
encoding: rs3[4:0] | b01 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1001111;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d, f%rs2$d, f%rs3$d";
|
||||||
|
//F[rd]f<=-F[rs1]f * F[rs2]f + F[rs3]f;
|
||||||
|
val res[64] <= fdispatch_fmadd_d(F[rs1]{64}, F[rs2]{64}, F[rs3]{64}, zext(2, 32), choose(rm<7, rm{8}, FCSR{8}));
|
||||||
|
if(FLEN==64)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<64) | res;
|
||||||
|
}
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
|
}
|
||||||
|
FNMSUB.D {
|
||||||
|
encoding: rs3[4:0] | b01 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1001011;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d, f%rs2$d, f%rs3$d";
|
||||||
|
//F[rd]f<=-F[rs1]f * F[rs2]f - F[rs3]f;
|
||||||
|
val res[64] <= fdispatch_fmadd_d(F[rs1]{64}, F[rs2]{64}, F[rs3]{64}, zext(3, 32), choose(rm<7, rm{8}, FCSR{8}));
|
||||||
|
if(FLEN==64)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<64) | res;
|
||||||
|
}
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
|
}
|
||||||
|
FADD.D {
|
||||||
|
encoding: b0000001 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
// F[rd]f <= F[rs1]f + F[rs2]f;
|
||||||
|
val res[64] <= fdispatch_fadd_d(F[rs1]{64}, F[rs2]{64}, choose(rm<7, rm{8}, FCSR{8}));
|
||||||
|
if(FLEN==64)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<64) | res;
|
||||||
|
}
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
|
}
|
||||||
|
FSUB.D {
|
||||||
|
encoding: b0000101 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
// F[rd]f <= F[rs1]f - F[rs2]f;
|
||||||
|
val res[64] <= fdispatch_fsub_d(F[rs1]{64}, F[rs2]{64}, choose(rm<7, rm{8}, FCSR{8}));
|
||||||
|
if(FLEN==64)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<64) | res;
|
||||||
|
}
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
|
}
|
||||||
|
FMUL.D {
|
||||||
|
encoding: b0001001 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
// F[rd]f <= F[rs1]f * F[rs2]f;
|
||||||
|
val res[64] <= fdispatch_fmul_d(F[rs1]{64}, F[rs2]{64}, choose(rm<7, rm{8}, FCSR{8}));
|
||||||
|
if(FLEN==64)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<64) | res;
|
||||||
|
}
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
|
}
|
||||||
|
FDIV.D {
|
||||||
|
encoding: b0001101 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
// F[rd]f <= F[rs1]f / F[rs2]f;
|
||||||
|
val res[64] <= fdispatch_fdiv_d(F[rs1]{64}, F[rs2]{64}, choose(rm<7, rm{8}, FCSR{8}));
|
||||||
|
if(FLEN==64)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<64) | res;
|
||||||
|
}
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
|
}
|
||||||
|
FSQRT.D {
|
||||||
|
encoding: b0101101 | b00000 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d";
|
||||||
|
//F[rd]f<=sqrt(F[rs1]f);
|
||||||
|
val res[64] <= fdispatch_fsqrt_d(F[rs1]{64}, choose(rm<7, rm{8}, FCSR{8}));
|
||||||
|
if(FLEN==64)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<64) | res;
|
||||||
|
}
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
|
}
|
||||||
|
FSGNJ.D {
|
||||||
|
encoding: b0010001 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
||||||
|
args_disass:"f%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
val res[64] <= (F[rs1]{64} & 0x7fffffff) | (F[rs2]{64} & 0x80000000);
|
||||||
|
if(FLEN==64)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<64) | res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FSGNJN.D {
|
||||||
|
encoding: b0010001 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b1010011;
|
||||||
|
args_disass:"f%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
val res[64] <= (F[rs1]{64} & 0x7fffffff) | (~F[rs2]{64} & 0x80000000);
|
||||||
|
if(FLEN==64)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<64) | res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FSGNJX.D {
|
||||||
|
encoding: b0010001 | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b1010011;
|
||||||
|
args_disass:"f%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
val res[64] <= F[rs1]{64} ^ (F[rs2]{64} & 0x80000000);
|
||||||
|
if(FLEN==64)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<64) | res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FMIN.D {
|
||||||
|
encoding: b0010101 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
||||||
|
args_disass:"f%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
//F[rd]f<= choose(F[rs1]f<F[rs2]f, F[rs1]f, F[rs2]f);
|
||||||
|
val res[64] <= fdispatch_fsel_d(F[rs1]{64}, F[rs2]{64}, zext(0, 32));
|
||||||
|
if(FLEN==64)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<64) | res;
|
||||||
|
}
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
|
}
|
||||||
|
FMAX.D {
|
||||||
|
encoding: b0010101 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b1010011;
|
||||||
|
args_disass:"f%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
//F[rd]f<= choose(F[rs1]f>F[rs2]f, F[rs1]f, F[rs2]f);
|
||||||
|
val res[64] <= fdispatch_fsel_d(F[rs1]{64}, F[rs2]{64}, zext(1, 32));
|
||||||
|
if(FLEN==64)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<64) | res;
|
||||||
|
}
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
|
}
|
||||||
|
FCVT.S.D {
|
||||||
|
encoding: b0100000 | b00001 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||||
|
args_disass:"f%rd$d, f%rs1$d";
|
||||||
|
val res[32] <= fdispatch_fconv_d2f(F[rs1], rm{8});
|
||||||
|
// NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= upper<<32 | zext(res, FLEN);
|
||||||
|
}
|
||||||
|
FCVT.D.S {
|
||||||
|
encoding: b0100001 | b00000 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||||
|
args_disass:"f%rd$d, f%rs1$d";
|
||||||
|
val res[64] <= fdispatch_fconv_f2d(F[rs1]{32}, rm{8});
|
||||||
|
if(FLEN==64){
|
||||||
|
F[rd] <= res;
|
||||||
|
} else {
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<64) | res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FEQ.D {
|
||||||
|
encoding: b1010001 | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b1010011;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
X[rd]<=fdispatch_fcmp_d(F[rs1]{64}, F[rs2]{64}, zext(0, 32));
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
|
}
|
||||||
|
FLT.D {
|
||||||
|
encoding: b1010001 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b1010011;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
X[rd]<=fdispatch_fcmp_d(F[rs1]{64}, F[rs2]{64}, zext(2, 32));
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
|
}
|
||||||
|
FLE.D {
|
||||||
|
encoding: b1010001 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
X[rd]<=fdispatch_fcmp_d(F[rs1]{64}, F[rs2]{64}, zext(1, 32));
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
|
}
|
||||||
|
FCLASS.D {
|
||||||
|
encoding: b1110001 | b00000 | rs1[4:0] | b001 | rd[4:0] | b1010011;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d";
|
||||||
|
X[rd]<=fdispatch_fclass_d(F[rs1]{64});
|
||||||
|
}
|
||||||
|
FCVT.W.D {
|
||||||
|
encoding: b1100001 | b00000 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d";
|
||||||
|
X[rd]<= sext(fdispatch_fcvt_d(F[rs1]{64}, zext(0, 32), rm{8}), XLEN);
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
|
}
|
||||||
|
FCVT.WU.D {
|
||||||
|
encoding: b1100001 | b00001 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d";
|
||||||
|
X[rd]<= zext(fdispatch_fcvt_d(F[rs1]{64}, zext(1, 32), rm{8}), XLEN);
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
|
}
|
||||||
|
FCVT.D.W {
|
||||||
|
encoding: b1101001 | b00000 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||||
|
args_disass:"f%rd$d, x%rs1$d";
|
||||||
|
val res[64] <= fdispatch_fcvt_d(sext(X[rs1],64), zext(2, 32), rm{8});
|
||||||
|
if(FLEN==64)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<64) | res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FCVT.D.WU {
|
||||||
|
encoding: b1101001 | b00001 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||||
|
args_disass:"f%rd$d, x%rs1$d";
|
||||||
|
val res[64] <=fdispatch_fcvt_d(zext(X[rs1],64), zext(3,32), rm{8});
|
||||||
|
if(FLEN==64)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<64) | res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,104 +2,293 @@ import "RV32IBase.core_desc"
|
||||||
|
|
||||||
InsructionSet RV32F extends RV32IBase{
|
InsructionSet RV32F extends RV32IBase{
|
||||||
constants {
|
constants {
|
||||||
FLEN, fcsr
|
FLEN, FFLAG_MASK := 0x1f
|
||||||
}
|
}
|
||||||
registers {
|
registers {
|
||||||
[31:0] F[FLEN]
|
[31:0] F[FLEN], FCSR[32]
|
||||||
}
|
}
|
||||||
instructions{
|
instructions{
|
||||||
FLW {
|
FLW {
|
||||||
encoding: imm[11:0]s | rs1[4:0] | b010 | rd[4:0] | b0000111;
|
encoding: imm[11:0]s | rs1[4:0] | b010 | rd[4:0] | b0000111;
|
||||||
|
args_disass:"f%rd$d, %imm%(x%rs1$d)";
|
||||||
val offs[XLEN] <= X[rs1]+imm;
|
val offs[XLEN] <= X[rs1]+imm;
|
||||||
F[rd]<=MEM[offs];
|
val res[32] <= MEM[offs]{32};
|
||||||
|
if(FLEN==32)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<32) | zext(res, FLEN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
FSW {
|
FSW {
|
||||||
encoding: imm[11:5]s | rs2[4:0] | rs1[4:0] | b010 | imm[4:0]s | b0100111;
|
encoding: imm[11:5]s | rs2[4:0] | rs1[4:0] | b010 | imm[4:0]s | b0100111;
|
||||||
|
args_disass:"f%rs2$d, %imm%(x%rs1$d)";
|
||||||
val offs[XLEN] <= X[rs1]+imm;
|
val offs[XLEN] <= X[rs1]+imm;
|
||||||
MEM[offs]<=F[rs2];
|
MEM[offs]{32}<=F[rs2]{32};
|
||||||
}
|
}
|
||||||
FMADD.S {
|
FMADD.S {
|
||||||
encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1000011;
|
encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1000011;
|
||||||
F[rd]f<= F[rs1]f * F[rs2]f * F[rs3]f;
|
args_disass:"x%rd$d, f%rs1$d, f%rs2$d, f%rs3$d";
|
||||||
|
//F[rd]f<= F[rs1]f * F[rs2]f + F[rs3]f;
|
||||||
|
val res[32] <= fdispatch_fmadd_s(F[rs1]{32}, F[rs2]{32}, F[rs3]{32}, zext(0, 32), choose(rm<7, rm{8}, FCSR{8}));
|
||||||
|
if(FLEN==32)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<32) | zext(res, FLEN);
|
||||||
|
}
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
}
|
}
|
||||||
FMSUB.S {
|
FMSUB.S {
|
||||||
encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1000111;
|
encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1000111;
|
||||||
F[rd]f<=F[rs1]f * F[rs2]f -F[rs3]f;
|
args_disass:"x%rd$d, f%rs1$d, f%rs2$d, f%rs3$d";
|
||||||
|
//F[rd]f<=F[rs1]f * F[rs2]f - F[rs3]f;
|
||||||
|
val res[32] <= fdispatch_fmadd_s(F[rs1]{32}, F[rs2]{32}, F[rs3]{32}, zext(1, 32), choose(rm<7, rm{8}, FCSR{8}));
|
||||||
|
if(FLEN==32)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<32) | zext(res, FLEN);
|
||||||
}
|
}
|
||||||
FNMSUB.S {
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1001011;
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
F[rd]f<=-F[rs1]f * F[rs2]f- F[rs3]f;
|
|
||||||
}
|
}
|
||||||
FNMADD.S {
|
FNMADD.S {
|
||||||
encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1001111;
|
encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1001111;
|
||||||
F[rd]f<=-F[rs1]f*F[rs2]f+F[rs3]f;
|
args_disass:"x%rd$d, f%rs1$d, f%rs2$d, f%rs3$d";
|
||||||
|
//F[rd]f<=-F[rs1]f * F[rs2]f + F[rs3]f;
|
||||||
|
val res[32] <= fdispatch_fmadd_s(F[rs1]{32}, F[rs2]{32}, F[rs3]{32}, zext(2, 32), choose(rm<7, rm{8}, FCSR{8}));
|
||||||
|
if(FLEN==32)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<32) | zext(res, FLEN);
|
||||||
|
}
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
|
}
|
||||||
|
FNMSUB.S {
|
||||||
|
encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1001011;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d, f%rs2$d, f%rs3$d";
|
||||||
|
//F[rd]f<=-F[rs1]f * F[rs2]f - F[rs3]f;
|
||||||
|
val res[32] <= fdispatch_fmadd_s(F[rs1]{32}, F[rs2]{32}, F[rs3]{32}, zext(3, 32), choose(rm<7, rm{8}, FCSR{8}));
|
||||||
|
if(FLEN==32)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<32) | zext(res, FLEN);
|
||||||
|
}
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
}
|
}
|
||||||
FADD.S {
|
FADD.S {
|
||||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
encoding: b0000000 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||||
F[rd]f <= F[rs1]f + F[rs2]f;
|
args_disass:"f%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
// F[rd]f <= F[rs1]f + F[rs2]f;
|
||||||
|
val res[32] <= fdispatch_fadd_s(F[rs1]{32}, F[rs2]{32}, choose(rm<7, rm{8}, FCSR{8}));
|
||||||
|
if(FLEN==32)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<32) | zext(res, FLEN);
|
||||||
|
}
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
}
|
}
|
||||||
FSUB.S {
|
FSUB.S {
|
||||||
encoding: b0000100 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
encoding: b0000100 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||||
F[rd]f <= F[rs1]f - F[rs2]f;
|
args_disass:"f%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
// F[rd]f <= F[rs1]f - F[rs2]f;
|
||||||
|
val res[32] <= fdispatch_fsub_s(F[rs1]{32}, F[rs2]{32}, choose(rm<7, rm{8}, FCSR{8}));
|
||||||
|
if(FLEN==32)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<32) | zext(res, FLEN);
|
||||||
|
}
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
}
|
}
|
||||||
FMUL.S {
|
FMUL.S {
|
||||||
encoding: b0001000 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
encoding: b0001000 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||||
F[rd]f <= F[rs1]f * F[rs2];
|
args_disass:"f%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
// F[rd]f <= F[rs1]f * F[rs2]f;
|
||||||
|
val res[32] <= fdispatch_fmul_s(F[rs1]{32}, F[rs2]{32}, choose(rm<7, rm{8}, FCSR{8}));
|
||||||
|
if(FLEN==32)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<32) | zext(res, FLEN);
|
||||||
|
}
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
}
|
}
|
||||||
FDIV.S {
|
FDIV.S {
|
||||||
encoding: b0001100 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
encoding: b0001100 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||||
F[rd]f <= F[rs1]f / F[rs2]f;
|
args_disass:"f%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
// F[rd]f <= F[rs1]f / F[rs2]f;
|
||||||
|
val res[32] <= fdispatch_fdiv_s(F[rs1]{32}, F[rs2]{32}, choose(rm<7, rm{8}, FCSR{8}));
|
||||||
|
if(FLEN==32)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<32) | zext(res, FLEN);
|
||||||
|
}
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
}
|
}
|
||||||
FSQRT.S {
|
FSQRT.S {
|
||||||
encoding: b0101100 | b00000 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
encoding: b0101100 | b00000 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||||
F[rd]f<=sqrt(F[rs1]f);
|
args_disass:"f%rd$d, f%rs1$d";
|
||||||
|
//F[rd]f<=sqrt(F[rs1]f);
|
||||||
|
val res[32] <= fdispatch_fsqrt_s(F[rs1]{32}, choose(rm<7, rm{8}, FCSR{8}));
|
||||||
|
if(FLEN==32)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<32) | zext(res, FLEN);
|
||||||
|
}
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
}
|
}
|
||||||
FSGNJ.S {
|
FSGNJ.S {
|
||||||
encoding: b0010000 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
encoding: b0010000 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
||||||
|
args_disass:"f%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
val res[32] <= (F[rs1]{32} & 0x7fffffff) | (F[rs2]{32} & 0x80000000);
|
||||||
|
if(FLEN==32)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<32) | zext(res, FLEN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
FSGNJN.S {
|
FSGNJN.S {
|
||||||
encoding: b0010000 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b1010011;
|
encoding: b0010000 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b1010011;
|
||||||
|
args_disass:"f%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
val res[32] <= (F[rs1]{32} & 0x7fffffff) | (~F[rs2]{32} & 0x80000000);
|
||||||
|
if(FLEN==32)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<32) | zext(res, FLEN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
FSGNJX.S {
|
FSGNJX.S {
|
||||||
encoding: b0010000 | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b1010011;
|
encoding: b0010000 | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b1010011;
|
||||||
|
args_disass:"f%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
val res[32] <= F[rs1]{32} ^ (F[rs2]{32} & 0x80000000);
|
||||||
|
if(FLEN==32)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<32) | zext(res, FLEN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
FMIN.S {
|
FMIN.S {
|
||||||
encoding: b0010100 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
encoding: b0010100 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
||||||
F[rd]f<= choose(F[rs1]f<F[rs2]f, F[rs1]f, F[rs2]f);
|
args_disass:"f%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
//F[rd]f<= choose(F[rs1]f<F[rs2]f, F[rs1]f, F[rs2]f);
|
||||||
|
val res[32] <= fdispatch_fsel_s(F[rs1]{32}, F[rs2]{32}, zext(0, 32));
|
||||||
|
if(FLEN==32)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<32) | zext(res, FLEN);
|
||||||
|
}
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
}
|
}
|
||||||
FMAX.S {
|
FMAX.S {
|
||||||
encoding: b0010100 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b1010011;
|
encoding: b0010100 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b1010011;
|
||||||
F[rd]f<= choose(F[rs1]f>F[rs2]f, F[rs1]f, F[rs2]f);
|
args_disass:"f%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
//F[rd]f<= choose(F[rs1]f>F[rs2]f, F[rs1]f, F[rs2]f);
|
||||||
|
val res[32] <= fdispatch_fsel_s(F[rs1]{32}, F[rs2]{32}, zext(1, 32));
|
||||||
|
if(FLEN==32)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<32) | zext(res, FLEN);
|
||||||
|
}
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
}
|
}
|
||||||
FCVT.W.S {
|
FCVT.W.S {
|
||||||
encoding: b1100000 | b00000 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
encoding: b1100000 | b00000 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d";
|
||||||
|
X[rd]<= sext(fdispatch_fcvt_s(F[rs1]{32}, zext(0, 32), rm{8}), XLEN);
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
}
|
}
|
||||||
FCVT.WU.S {
|
FCVT.WU.S {
|
||||||
encoding: b1100000 | b00001 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
encoding: b1100000 | b00001 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||||
}
|
args_disass:"x%rd$d, f%rs1$d";
|
||||||
FMV.X.W {
|
X[rd]<= zext(fdispatch_fcvt_s(F[rs1]{32}, zext(1, 32), rm{8}), XLEN);
|
||||||
encoding: b1110000 | b00000 | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
}
|
}
|
||||||
FEQ.S {
|
FEQ.S {
|
||||||
encoding: b1010000 | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b1010011;
|
encoding: b1010000 | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b1010011;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
X[rd]<=fdispatch_fcmp_s(F[rs1]{32}, F[rs2]{32}, zext(0, 32));
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
}
|
}
|
||||||
FLT.S {
|
FLT.S {
|
||||||
encoding: b1010000 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b1010011;
|
encoding: b1010000 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b1010011;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
X[rd]<=fdispatch_fcmp_s(F[rs1]{32}, F[rs2]{32}, zext(2, 32));
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
}
|
}
|
||||||
FLE.S {
|
FLE.S {
|
||||||
encoding: b1010000 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
encoding: b1010000 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d, f%rs2$d";
|
||||||
|
X[rd]<=fdispatch_fcmp_s(F[rs1]{32}, F[rs2]{32}, zext(1, 32));
|
||||||
|
val flags[32] <= fdispatch_fget_flags();
|
||||||
|
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
||||||
}
|
}
|
||||||
FCLASS.S {
|
FCLASS.S {
|
||||||
encoding: b1110000 | b00000 | rs1[4:0] | b001 | rd[4:0] | b1010011;
|
encoding: b1110000 | b00000 | rs1[4:0] | b001 | rd[4:0] | b1010011;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d";
|
||||||
|
X[rd]<=fdispatch_fclass_s(F[rs1]{32});
|
||||||
}
|
}
|
||||||
FCVT.S.W {
|
FCVT.S.W {
|
||||||
encoding: b1101000 | b00000 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
encoding: b1101000 | b00000 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||||
|
args_disass:"f%rd$d, x%rs1$d";
|
||||||
|
val res[32] <= fdispatch_fcvt_s(X[rs1]{32}, zext(2, 32), rm{8});
|
||||||
|
if(FLEN==32)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<32) | zext(res, FLEN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
FCVT.S.WU {
|
FCVT.S.WU {
|
||||||
encoding: b1101000 | b00001 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
encoding: b1101000 | b00001 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
||||||
|
args_disass:"f%rd$d, x%rs1$d";
|
||||||
|
val res[32] <=fdispatch_fcvt_s(X[rs1]{32}, zext(3,32), rm{8});
|
||||||
|
if(FLEN==32)
|
||||||
|
F[rd] <= res;
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<32) | zext(res, FLEN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FMV.X.W {
|
||||||
|
encoding: b1110000 | b00000 | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
||||||
|
args_disass:"x%rd$d, f%rs1$d";
|
||||||
|
X[rd]<=sext(F[rs1]{32});
|
||||||
}
|
}
|
||||||
FMV.W.X {
|
FMV.W.X {
|
||||||
encoding: b1111000 | b00000 | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
encoding: b1111000 | b00000 | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
||||||
|
args_disass:"f%rd$d, x%rs1$d";
|
||||||
|
if(FLEN==32)
|
||||||
|
F[rd] <= X[rs1];
|
||||||
|
else { // NaN boxing
|
||||||
|
val upper[FLEN] <= -1;
|
||||||
|
F[rd] <= (upper<<32) | zext(X[rs1], FLEN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,12 +1,12 @@
|
||||||
InsructionSet RV32IBase {
|
InsructionSet RV32IBase {
|
||||||
constants {
|
constants {
|
||||||
XLEN,
|
XLEN,
|
||||||
XLEN_BIT_MASK,
|
|
||||||
PCLEN,
|
PCLEN,
|
||||||
fence,
|
XLEN_BIT_MASK:=0x1f,
|
||||||
fencei,
|
fence:=0,
|
||||||
fencevmal,
|
fencei:=1,
|
||||||
fencevmau
|
fencevmal:=2,
|
||||||
|
fencevmau:=3
|
||||||
}
|
}
|
||||||
|
|
||||||
address_spaces {
|
address_spaces {
|
||||||
|
|
|
@ -2,14 +2,14 @@ import "RV32IBase.core_desc"
|
||||||
|
|
||||||
InsructionSet RV32M extends RV32IBase {
|
InsructionSet RV32M extends RV32IBase {
|
||||||
constants {
|
constants {
|
||||||
XLEN2
|
MAXLEN:=128
|
||||||
}
|
}
|
||||||
instructions{
|
instructions{
|
||||||
MUL{
|
MUL{
|
||||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b0110011;
|
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b0110011;
|
||||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||||
if(rd != 0){
|
if(rd != 0){
|
||||||
val res[XLEN2] <= zext(X[rs1], XLEN2) * zext(X[rs2], XLEN2);
|
val res[MAXLEN] <= zext(X[rs1], MAXLEN) * zext(X[rs2], MAXLEN);
|
||||||
X[rd]<= zext(res , XLEN);
|
X[rd]<= zext(res , XLEN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ InsructionSet RV32M extends RV32IBase {
|
||||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b0110011;
|
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b0110011;
|
||||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||||
if(rd != 0){
|
if(rd != 0){
|
||||||
val res[XLEN2] <= sext(X[rs1], XLEN2) * sext(X[rs2], XLEN2);
|
val res[MAXLEN] <= sext(X[rs1], MAXLEN) * sext(X[rs2], MAXLEN);
|
||||||
X[rd]<= zext(res >> XLEN, XLEN);
|
X[rd]<= zext(res >> XLEN, XLEN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,7 @@ InsructionSet RV32M extends RV32IBase {
|
||||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0110011;
|
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0110011;
|
||||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||||
if(rd != 0){
|
if(rd != 0){
|
||||||
val res[XLEN2] <= sext(X[rs1], XLEN2) * zext(X[rs2], XLEN2);
|
val res[MAXLEN] <= sext(X[rs1], MAXLEN) * zext(X[rs2], MAXLEN);
|
||||||
X[rd]<= zext(res >> XLEN, XLEN);
|
X[rd]<= zext(res >> XLEN, XLEN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,7 @@ InsructionSet RV32M extends RV32IBase {
|
||||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0110011;
|
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0110011;
|
||||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||||
if(rd != 0){
|
if(rd != 0){
|
||||||
val res[XLEN2] <= zext(X[rs1], XLEN2) * zext(X[rs2], XLEN2);
|
val res[MAXLEN] <= zext(X[rs1], MAXLEN) * zext(X[rs2], MAXLEN);
|
||||||
X[rd]<= zext(res >> XLEN, XLEN);
|
X[rd]<= zext(res >> XLEN, XLEN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -41,9 +41,17 @@ InsructionSet RV32M extends RV32IBase {
|
||||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b100 | rd[4:0] | b0110011;
|
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b100 | rd[4:0] | b0110011;
|
||||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||||
if(rd != 0){
|
if(rd != 0){
|
||||||
if(X[rs2]!=0)
|
if(X[rs2]!=0){
|
||||||
X[rd] <= sext(X[rs1], 32) / sext(X[rs2], 32);
|
val M1[XLEN] <= -1;
|
||||||
|
val MMIN[XLEN] <= -1<<(XLEN-1);
|
||||||
|
if(X[rs1]s==MMIN's)
|
||||||
|
if(X[rs2]s==M1's)
|
||||||
|
X[rd]<=MMIN;
|
||||||
else
|
else
|
||||||
|
X[rd] <= X[rs1]s / X[rs2]s;
|
||||||
|
else
|
||||||
|
X[rd] <= X[rs1]s / X[rs2]s;
|
||||||
|
}else
|
||||||
X[rd] <= -1;
|
X[rd] <= -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,9 +69,17 @@ InsructionSet RV32M extends RV32IBase {
|
||||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b110 | rd[4:0] | b0110011;
|
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b110 | rd[4:0] | b0110011;
|
||||||
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
args_disass:"x%rd$d, x%rs1$d, x%rs2$d";
|
||||||
if(rd != 0){
|
if(rd != 0){
|
||||||
if(X[rs2]!=0)
|
if(X[rs2]!=0) {
|
||||||
|
val M1[XLEN] <= -1;
|
||||||
|
val MMIN[XLEN] <= -1<<(XLEN-1);
|
||||||
|
if(X[rs1]s==MMIN's)
|
||||||
|
if(X[rs2]s==M1's)
|
||||||
|
X[rd] <= 0;
|
||||||
|
else
|
||||||
X[rd] <= sext(X[rs1], 32) % sext(X[rs2], 32);
|
X[rd] <= sext(X[rs1], 32) % sext(X[rs2], 32);
|
||||||
else
|
else
|
||||||
|
X[rd] <= sext(X[rs1], 32) % sext(X[rs2], 32);
|
||||||
|
} else
|
||||||
X[rd] <= X[rs1];
|
X[rd] <= X[rs1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,24 +2,34 @@ import "RV32IBase.core_desc"
|
||||||
import "RV32M.core_desc"
|
import "RV32M.core_desc"
|
||||||
import "RV32A.core_desc"
|
import "RV32A.core_desc"
|
||||||
import "RV32C.core_desc"
|
import "RV32C.core_desc"
|
||||||
|
import "RV32F.core_desc"
|
||||||
|
import "RV32D.core_desc"
|
||||||
import "RV64IBase.core_desc"
|
import "RV64IBase.core_desc"
|
||||||
//import "RV64M.core_desc"
|
//import "RV64M.core_desc"
|
||||||
import "RV64A.core_desc"
|
import "RV64A.core_desc"
|
||||||
|
|
||||||
|
|
||||||
Core RV32IMAC provides RV32IBase, RV32M, RV32A, RV32CI {
|
Core RV32IMAC provides RV32IBase, RV32M, RV32A, RV32IC {
|
||||||
template:"vm_riscv.in.cpp";
|
template:"vm_riscv.in.cpp";
|
||||||
constants {
|
constants {
|
||||||
XLEN:=32;
|
XLEN:=32;
|
||||||
XLEN2:=64;
|
|
||||||
XLEN_BIT_MASK:=0x1f;
|
|
||||||
PCLEN:=32;
|
PCLEN:=32;
|
||||||
fence:=0;
|
// definitions for the architecture wrapper
|
||||||
fencei:=1;
|
|
||||||
fencevmal:=2;
|
|
||||||
fencevmau:=3;
|
|
||||||
// XL ZYXWVUTSRQPONMLKJIHGFEDCBA
|
// XL ZYXWVUTSRQPONMLKJIHGFEDCBA
|
||||||
MISA_VAL:=0b01000000000101000001000100000001;
|
MISA_VAL:=0b01000000000101000001000100000101;
|
||||||
|
PGSIZE := 4096; //1 << 12;
|
||||||
|
PGMASK := 4095; //PGSIZE-1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Core RV32GC provides RV32IBase, RV32M, RV32A, RV32IC, RV32F, RV32FC, RV32D, RV32DC {
|
||||||
|
constants {
|
||||||
|
XLEN:=32;
|
||||||
|
FLEN:=64;
|
||||||
|
PCLEN:=32;
|
||||||
|
// definitions for the architecture wrapper
|
||||||
|
// XL ZYXWVUTSRQPONMLKJIHGFEDCBA
|
||||||
|
MISA_VAL:=0b01000000000101000001000100101101;
|
||||||
PGSIZE := 4096; //1 << 12;
|
PGSIZE := 4096; //1 << 12;
|
||||||
PGMASK := 4095; //PGSIZE-1
|
PGMASK := 4095; //PGSIZE-1
|
||||||
}
|
}
|
||||||
|
@ -30,13 +40,8 @@ Core RV64IA provides RV64IBase, RV64A, RV32A {
|
||||||
template:"vm_riscv.in.cpp";
|
template:"vm_riscv.in.cpp";
|
||||||
constants {
|
constants {
|
||||||
XLEN:=64;
|
XLEN:=64;
|
||||||
XLEN2:=128;
|
|
||||||
XLEN_BIT_MASK:=0x3f;
|
|
||||||
PCLEN:=64;
|
PCLEN:=64;
|
||||||
fence:=0;
|
// definitions for the architecture wrapper
|
||||||
fencei:=1;
|
|
||||||
fencevmal:=2;
|
|
||||||
fencevmau:=3;
|
|
||||||
// XL ZYXWVUTSRQPONMLKJIHGFEDCBA
|
// XL ZYXWVUTSRQPONMLKJIHGFEDCBA
|
||||||
MISA_VAL:=0b10000000000001000000000100000001;
|
MISA_VAL:=0b10000000000001000000000100000001;
|
||||||
PGSIZE := 4096; //1 << 12;
|
PGSIZE := 4096; //1 << 12;
|
||||||
|
|
|
@ -56,6 +56,8 @@ struct traits<${coreDef.name.toLowerCase()}> {
|
||||||
|
|
||||||
enum constants {${coreDef.constants.collect{c -> c.name+"="+c.value}.join(', ')}};
|
enum constants {${coreDef.constants.collect{c -> c.name+"="+c.value}.join(', ')}};
|
||||||
|
|
||||||
|
constexpr static unsigned FP_REGS_SIZE = ${coreDef.constants.find {it.name=='FLEN'}?.value?:0};
|
||||||
|
|
||||||
enum reg_e {<%
|
enum reg_e {<%
|
||||||
allRegs.each { reg ->
|
allRegs.each { reg ->
|
||||||
if( reg instanceof RegisterFile) {
|
if( reg instanceof RegisterFile) {
|
||||||
|
@ -78,8 +80,6 @@ struct traits<${coreDef.name.toLowerCase()}> {
|
||||||
|
|
||||||
using addr_t = uint${addrDataWidth}_t;
|
using addr_t = uint${addrDataWidth}_t;
|
||||||
|
|
||||||
using code_word_t = uint${addrDataWidth}_t; //TODO: check removal
|
|
||||||
|
|
||||||
using virt_addr_t = iss::typed_addr_t<iss::address_type::VIRTUAL>;
|
using virt_addr_t = iss::typed_addr_t<iss::address_type::VIRTUAL>;
|
||||||
|
|
||||||
using phys_addr_t = iss::typed_addr_t<iss::address_type::PHYSICAL>;
|
using phys_addr_t = iss::typed_addr_t<iss::address_type::PHYSICAL>;
|
||||||
|
@ -99,7 +99,6 @@ struct traits<${coreDef.name.toLowerCase()}> {
|
||||||
enum sreg_flag_e {FLAGS};
|
enum sreg_flag_e {FLAGS};
|
||||||
|
|
||||||
enum mem_type_e {${allSpaces.collect{s -> s.name}.join(', ')}};
|
enum mem_type_e {${allSpaces.collect{s -> s.name}.join(', ')}};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ${coreDef.name.toLowerCase()}: public arch_if {
|
struct ${coreDef.name.toLowerCase()}: public arch_if {
|
||||||
|
@ -112,8 +111,6 @@ struct ${coreDef.name.toLowerCase()}: public arch_if {
|
||||||
${coreDef.name.toLowerCase()}();
|
${coreDef.name.toLowerCase()}();
|
||||||
~${coreDef.name.toLowerCase()}();
|
~${coreDef.name.toLowerCase()}();
|
||||||
|
|
||||||
const std::string core_type_name() const override {return traits<${coreDef.name.toLowerCase()}>::core_type;}
|
|
||||||
|
|
||||||
void reset(uint64_t address=0) override;
|
void reset(uint64_t address=0) override;
|
||||||
|
|
||||||
uint8_t* get_regs_base_ptr() override;
|
uint8_t* get_regs_base_ptr() override;
|
||||||
|
@ -159,8 +156,15 @@ protected:
|
||||||
|
|
||||||
std::array<address_type, 4> addr_mode;
|
std::array<address_type, 4> addr_mode;
|
||||||
|
|
||||||
uint64_t cycles = 0;
|
<%
|
||||||
|
def fcsr = allRegs.find {it.name=='FCSR'}
|
||||||
|
if(fcsr != null) {%>
|
||||||
|
uint${generator.getSize(fcsr)}_t get_fcsr(){return reg.FCSR;}
|
||||||
|
void set_fcsr(uint${generator.getSize(fcsr)}_t val){reg.FCSR = val;}
|
||||||
|
<%} else { %>
|
||||||
|
uint32_t get_fcsr(){return 0;}
|
||||||
|
void set_fcsr(uint32_t val){}
|
||||||
|
<%}%>
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,6 +68,7 @@ uint8_t* ${coreDef.name.toLowerCase()}::get_regs_base_ptr(){
|
||||||
return reinterpret_cast<uint8_t*>(®);
|
return reinterpret_cast<uint8_t*>(®);
|
||||||
}
|
}
|
||||||
|
|
||||||
${coreDef.name.toLowerCase()}::phys_addr_t ${coreDef.name.toLowerCase()}::v2p(const iss::addr_t& pc) {
|
${coreDef.name.toLowerCase()}::phys_addr_t ${coreDef.name.toLowerCase()}::virt2phys(const iss::addr_t &pc) {
|
||||||
return phys_addr_t(pc); //change logical address to physical address
|
return phys_addr_t(pc); // change logical address to physical address
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,12 @@
|
||||||
#include <array>
|
#include <array>
|
||||||
|
|
||||||
namespace iss {
|
namespace iss {
|
||||||
|
namespace vm {
|
||||||
|
namespace fp_impl{
|
||||||
|
void add_fp_functions_2_module(llvm::Module *, unsigned);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
namespace ${coreDef.name.toLowerCase()} {
|
namespace ${coreDef.name.toLowerCase()} {
|
||||||
using namespace iss::arch;
|
using namespace iss::arch;
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
@ -81,6 +87,11 @@ protected:
|
||||||
return llvm::ConstantInt::get(getContext(), llvm::APInt(32, type->getType()->getScalarSizeInBits()));
|
return llvm::ConstantInt::get(getContext(), llvm::APInt(32, type->getType()->getScalarSizeInBits()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setup_module(llvm::Module* m) override {
|
||||||
|
super::setup_module(m);
|
||||||
|
vm::fp_impl::add_fp_functions_2_module(m, traits<ARCH>::FP_REGS_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
inline llvm::Value *gen_choose(llvm::Value *cond, llvm::Value *trueVal, llvm::Value *falseVal,
|
inline llvm::Value *gen_choose(llvm::Value *cond, llvm::Value *trueVal, llvm::Value *falseVal,
|
||||||
unsigned size) const {
|
unsigned size) const {
|
||||||
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));
|
||||||
|
@ -101,7 +112,6 @@ protected:
|
||||||
|
|
||||||
void gen_trap_check(llvm::BasicBlock *bb);
|
void gen_trap_check(llvm::BasicBlock *bb);
|
||||||
|
|
||||||
|
|
||||||
inline llvm::Value *gen_reg_load(unsigned i, unsigned level = 0) {
|
inline llvm::Value *gen_reg_load(unsigned i, unsigned level = 0) {
|
||||||
return this->builder.CreateLoad(get_reg_ptr(i), false);
|
return this->builder.CreateLoad(get_reg_ptr(i), false);
|
||||||
}
|
}
|
||||||
|
@ -310,8 +320,6 @@ template <typename ARCH> inline void vm_impl<ARCH>::gen_trap_check(llvm::BasicBl
|
||||||
bb, this->trap_blk, 1);
|
bb, this->trap_blk, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ${coreDef.name.toLowerCase()}
|
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
std::unique_ptr<vm_if> create<arch::${coreDef.name.toLowerCase()}>(arch::${coreDef.name.toLowerCase()} *core, unsigned short port, bool dump) {
|
std::unique_ptr<vm_if> create<arch::${coreDef.name.toLowerCase()}>(arch::${coreDef.name.toLowerCase()} *core, unsigned short port, bool dump) {
|
||||||
std::unique_ptr<${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>> ret =
|
std::unique_ptr<${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>> ret =
|
||||||
|
|
|
@ -48,13 +48,14 @@
|
||||||
#include <util/sparse_array.h>
|
#include <util/sparse_array.h>
|
||||||
#include <util/bit_field.h>
|
#include <util/bit_field.h>
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
namespace iss {
|
namespace iss {
|
||||||
namespace arch {
|
namespace arch {
|
||||||
|
|
||||||
enum { tohost_dflt = 0xF0001000, fromhost_dflt = 0xF0001040 };
|
enum { tohost_dflt = 0xF0001000, fromhost_dflt = 0xF0001040 };
|
||||||
|
|
||||||
enum csr_name {
|
enum riscv_csr {
|
||||||
/* user-level CSR */
|
/* user-level CSR */
|
||||||
// User Trap Setup
|
// User Trap Setup
|
||||||
ustatus = 0x000,
|
ustatus = 0x000,
|
||||||
|
@ -537,6 +538,8 @@ private:
|
||||||
iss::status write_ip(unsigned addr, reg_t val);
|
iss::status write_ip(unsigned addr, reg_t val);
|
||||||
iss::status read_satp(unsigned addr, reg_t &val);
|
iss::status read_satp(unsigned addr, reg_t &val);
|
||||||
iss::status write_satp(unsigned addr, reg_t val);
|
iss::status write_satp(unsigned addr, reg_t val);
|
||||||
|
iss::status read_fcsr(unsigned addr, reg_t& val);
|
||||||
|
iss::status write_fcsr(unsigned addr, reg_t val);
|
||||||
protected:
|
protected:
|
||||||
void check_interrupt();
|
void check_interrupt();
|
||||||
};
|
};
|
||||||
|
@ -579,6 +582,13 @@ riscv_hart_msu_vp<BASE>::riscv_hart_msu_vp()
|
||||||
csr_wr_cb[uie] = &riscv_hart_msu_vp<BASE>::write_ie;
|
csr_wr_cb[uie] = &riscv_hart_msu_vp<BASE>::write_ie;
|
||||||
csr_rd_cb[satp] = &riscv_hart_msu_vp<BASE>::read_satp;
|
csr_rd_cb[satp] = &riscv_hart_msu_vp<BASE>::read_satp;
|
||||||
csr_wr_cb[satp] = &riscv_hart_msu_vp<BASE>::write_satp;
|
csr_wr_cb[satp] = &riscv_hart_msu_vp<BASE>::write_satp;
|
||||||
|
csr_rd_cb[fcsr] = &riscv_hart_msu_vp<BASE>::read_fcsr;
|
||||||
|
csr_wr_cb[fcsr] = &riscv_hart_msu_vp<BASE>::write_fcsr;
|
||||||
|
csr_rd_cb[fflags] = &riscv_hart_msu_vp<BASE>::read_fcsr;
|
||||||
|
csr_wr_cb[fflags] = &riscv_hart_msu_vp<BASE>::write_fcsr;
|
||||||
|
csr_rd_cb[frm] = &riscv_hart_msu_vp<BASE>::read_fcsr;
|
||||||
|
csr_wr_cb[frm] = &riscv_hart_msu_vp<BASE>::write_fcsr;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename BASE> std::pair<uint64_t,bool> riscv_hart_msu_vp<BASE>::load_file(std::string name, int type) {
|
template <typename BASE> std::pair<uint64_t,bool> riscv_hart_msu_vp<BASE>::load_file(std::string name, int type) {
|
||||||
|
@ -940,6 +950,39 @@ template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::write_satp(unsigne
|
||||||
update_vm_info();
|
update_vm_info();
|
||||||
return iss::Ok;
|
return iss::Ok;
|
||||||
}
|
}
|
||||||
|
template<typename BASE> iss::status riscv_hart_msu_vp<BASE>::read_fcsr(unsigned addr, reg_t& val) {
|
||||||
|
switch(addr){
|
||||||
|
case 1: //fflags, 4:0
|
||||||
|
val = bit_sub<0, 5>(this->get_fcsr());
|
||||||
|
break;
|
||||||
|
case 2: // frm, 7:5
|
||||||
|
val = bit_sub<5, 3>(this->get_fcsr());
|
||||||
|
break;
|
||||||
|
case 3: // fcsr
|
||||||
|
val=this->get_fcsr();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return iss::Err;
|
||||||
|
}
|
||||||
|
return iss::Ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename BASE> iss::status riscv_hart_msu_vp<BASE>::write_fcsr(unsigned addr, reg_t val) {
|
||||||
|
switch(addr){
|
||||||
|
case 1: //fflags, 4:0
|
||||||
|
this->set_fcsr( (this->get_fcsr() & 0xffffffe0) | (val&0x1f));
|
||||||
|
break;
|
||||||
|
case 2: // frm, 7:5
|
||||||
|
this->set_fcsr( (this->get_fcsr() & 0xffffff1f) | ((val&0x7)<<5));
|
||||||
|
break;
|
||||||
|
case 3: // fcsr
|
||||||
|
this->set_fcsr(val&0xff);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return iss::Err;
|
||||||
|
}
|
||||||
|
return iss::Ok;
|
||||||
|
}
|
||||||
|
|
||||||
template <typename BASE>
|
template <typename BASE>
|
||||||
iss::status riscv_hart_msu_vp<BASE>::read_mem(phys_addr_t paddr, unsigned length, uint8_t *const data) {
|
iss::status riscv_hart_msu_vp<BASE>::read_mem(phys_addr_t paddr, unsigned length, uint8_t *const data) {
|
||||||
|
@ -1299,4 +1342,5 @@ template <typename BASE> void riscv_hart_msu_vp<BASE>::wait_until(uint64_t flags
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* _RISCV_CORE_H_ */
|
#endif /* _RISCV_CORE_H_ */
|
||||||
|
|
|
@ -0,0 +1,277 @@
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Copyright (C) 2017, MINRES Technologies GmbH
|
||||||
|
// 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 copyright holder 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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef _RV32GC_H_
|
||||||
|
#define _RV32GC_H_
|
||||||
|
|
||||||
|
#include <iss/arch_if.h>
|
||||||
|
#include <iss/vm_if.h>
|
||||||
|
#include <iss/arch/traits.h>
|
||||||
|
#include <array>
|
||||||
|
|
||||||
|
namespace iss {
|
||||||
|
namespace arch {
|
||||||
|
|
||||||
|
struct rv32gc;
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct traits<rv32gc> {
|
||||||
|
|
||||||
|
constexpr static char const* const core_type = "RV32GC";
|
||||||
|
|
||||||
|
enum constants {XLEN=32, FLEN=64, PCLEN=32, MISA_VAL=1075056941, PGSIZE=4096, PGMASK=4095};
|
||||||
|
|
||||||
|
constexpr static unsigned FP_REGS_SIZE = 64;
|
||||||
|
|
||||||
|
enum reg_e {
|
||||||
|
X0,
|
||||||
|
X1,
|
||||||
|
X2,
|
||||||
|
X3,
|
||||||
|
X4,
|
||||||
|
X5,
|
||||||
|
X6,
|
||||||
|
X7,
|
||||||
|
X8,
|
||||||
|
X9,
|
||||||
|
X10,
|
||||||
|
X11,
|
||||||
|
X12,
|
||||||
|
X13,
|
||||||
|
X14,
|
||||||
|
X15,
|
||||||
|
X16,
|
||||||
|
X17,
|
||||||
|
X18,
|
||||||
|
X19,
|
||||||
|
X20,
|
||||||
|
X21,
|
||||||
|
X22,
|
||||||
|
X23,
|
||||||
|
X24,
|
||||||
|
X25,
|
||||||
|
X26,
|
||||||
|
X27,
|
||||||
|
X28,
|
||||||
|
X29,
|
||||||
|
X30,
|
||||||
|
X31,
|
||||||
|
PC,
|
||||||
|
F0,
|
||||||
|
F1,
|
||||||
|
F2,
|
||||||
|
F3,
|
||||||
|
F4,
|
||||||
|
F5,
|
||||||
|
F6,
|
||||||
|
F7,
|
||||||
|
F8,
|
||||||
|
F9,
|
||||||
|
F10,
|
||||||
|
F11,
|
||||||
|
F12,
|
||||||
|
F13,
|
||||||
|
F14,
|
||||||
|
F15,
|
||||||
|
F16,
|
||||||
|
F17,
|
||||||
|
F18,
|
||||||
|
F19,
|
||||||
|
F20,
|
||||||
|
F21,
|
||||||
|
F22,
|
||||||
|
F23,
|
||||||
|
F24,
|
||||||
|
F25,
|
||||||
|
F26,
|
||||||
|
F27,
|
||||||
|
F28,
|
||||||
|
F29,
|
||||||
|
F30,
|
||||||
|
F31,
|
||||||
|
FCSR,
|
||||||
|
NUM_REGS,
|
||||||
|
NEXT_PC=NUM_REGS,
|
||||||
|
TRAP_STATE,
|
||||||
|
PENDING_TRAP,
|
||||||
|
MACHINE_STATE,
|
||||||
|
ICOUNT
|
||||||
|
};
|
||||||
|
|
||||||
|
using reg_t = uint32_t;
|
||||||
|
|
||||||
|
using addr_t = uint32_t;
|
||||||
|
|
||||||
|
using code_word_t = uint32_t; //TODO: check removal
|
||||||
|
|
||||||
|
using virt_addr_t = iss::typed_addr_t<iss::address_type::VIRTUAL>;
|
||||||
|
|
||||||
|
using phys_addr_t = iss::typed_addr_t<iss::address_type::PHYSICAL>;
|
||||||
|
|
||||||
|
constexpr static unsigned reg_bit_width(unsigned r) {
|
||||||
|
constexpr std::array<const uint32_t, 71> RV32GC_reg_size{{32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,32,32,32,32,32,64}};
|
||||||
|
return RV32GC_reg_size[r];
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr static unsigned reg_byte_offset(unsigned r) {
|
||||||
|
constexpr std::array<const uint32_t, 72> RV32GC_reg_byte_offset{{0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,256,264,272,280,288,296,304,312,320,328,336,344,352,360,368,376,384,392,396,400,404,408,416,424}};
|
||||||
|
return RV32GC_reg_byte_offset[r];
|
||||||
|
}
|
||||||
|
|
||||||
|
static const uint64_t addr_mask = (reg_t(1) << (XLEN - 1)) | ((reg_t(1) << (XLEN - 1)) - 1);
|
||||||
|
|
||||||
|
enum sreg_flag_e {FLAGS};
|
||||||
|
|
||||||
|
enum mem_type_e {MEM, CSR, FENCE, RES};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct rv32gc: public arch_if {
|
||||||
|
|
||||||
|
using virt_addr_t = typename traits<rv32gc>::virt_addr_t;
|
||||||
|
using phys_addr_t = typename traits<rv32gc>::phys_addr_t;
|
||||||
|
using reg_t = typename traits<rv32gc>::reg_t;
|
||||||
|
using addr_t = typename traits<rv32gc>::addr_t;
|
||||||
|
|
||||||
|
rv32gc();
|
||||||
|
~rv32gc();
|
||||||
|
|
||||||
|
void reset(uint64_t address=0) override;
|
||||||
|
|
||||||
|
uint8_t* get_regs_base_ptr() override;
|
||||||
|
/// deprecated
|
||||||
|
void get_reg(short idx, std::vector<uint8_t>& value) override {}
|
||||||
|
void set_reg(short idx, const std::vector<uint8_t>& value) override {}
|
||||||
|
/// deprecated
|
||||||
|
bool get_flag(int flag) override {return false;}
|
||||||
|
void set_flag(int, bool value) override {};
|
||||||
|
/// deprecated
|
||||||
|
void update_flags(operations op, uint64_t opr1, uint64_t opr2) override {};
|
||||||
|
|
||||||
|
uint64_t get_icount() { return reg.icount;}
|
||||||
|
|
||||||
|
inline phys_addr_t v2p(const iss::addr_t& addr){
|
||||||
|
if(addr.space != traits<rv32gc>::MEM ||
|
||||||
|
addr.type == iss::address_type::PHYSICAL ||
|
||||||
|
addr_mode[static_cast<uint16_t>(addr.access)&0x3]==address_type::PHYSICAL){
|
||||||
|
return phys_addr_t(addr.access, addr.space, addr.val&traits<rv32gc>::addr_mask);
|
||||||
|
} else
|
||||||
|
return virt2phys(addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual phys_addr_t virt2phys(const iss::addr_t& addr);
|
||||||
|
|
||||||
|
virtual iss::sync_type needed_sync() const { return iss::NO_SYNC; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
struct RV32GC_regs {
|
||||||
|
uint32_t X0 = 0;
|
||||||
|
uint32_t X1 = 0;
|
||||||
|
uint32_t X2 = 0;
|
||||||
|
uint32_t X3 = 0;
|
||||||
|
uint32_t X4 = 0;
|
||||||
|
uint32_t X5 = 0;
|
||||||
|
uint32_t X6 = 0;
|
||||||
|
uint32_t X7 = 0;
|
||||||
|
uint32_t X8 = 0;
|
||||||
|
uint32_t X9 = 0;
|
||||||
|
uint32_t X10 = 0;
|
||||||
|
uint32_t X11 = 0;
|
||||||
|
uint32_t X12 = 0;
|
||||||
|
uint32_t X13 = 0;
|
||||||
|
uint32_t X14 = 0;
|
||||||
|
uint32_t X15 = 0;
|
||||||
|
uint32_t X16 = 0;
|
||||||
|
uint32_t X17 = 0;
|
||||||
|
uint32_t X18 = 0;
|
||||||
|
uint32_t X19 = 0;
|
||||||
|
uint32_t X20 = 0;
|
||||||
|
uint32_t X21 = 0;
|
||||||
|
uint32_t X22 = 0;
|
||||||
|
uint32_t X23 = 0;
|
||||||
|
uint32_t X24 = 0;
|
||||||
|
uint32_t X25 = 0;
|
||||||
|
uint32_t X26 = 0;
|
||||||
|
uint32_t X27 = 0;
|
||||||
|
uint32_t X28 = 0;
|
||||||
|
uint32_t X29 = 0;
|
||||||
|
uint32_t X30 = 0;
|
||||||
|
uint32_t X31 = 0;
|
||||||
|
uint32_t PC = 0;
|
||||||
|
uint64_t F0 = 0;
|
||||||
|
uint64_t F1 = 0;
|
||||||
|
uint64_t F2 = 0;
|
||||||
|
uint64_t F3 = 0;
|
||||||
|
uint64_t F4 = 0;
|
||||||
|
uint64_t F5 = 0;
|
||||||
|
uint64_t F6 = 0;
|
||||||
|
uint64_t F7 = 0;
|
||||||
|
uint64_t F8 = 0;
|
||||||
|
uint64_t F9 = 0;
|
||||||
|
uint64_t F10 = 0;
|
||||||
|
uint64_t F11 = 0;
|
||||||
|
uint64_t F12 = 0;
|
||||||
|
uint64_t F13 = 0;
|
||||||
|
uint64_t F14 = 0;
|
||||||
|
uint64_t F15 = 0;
|
||||||
|
uint64_t F16 = 0;
|
||||||
|
uint64_t F17 = 0;
|
||||||
|
uint64_t F18 = 0;
|
||||||
|
uint64_t F19 = 0;
|
||||||
|
uint64_t F20 = 0;
|
||||||
|
uint64_t F21 = 0;
|
||||||
|
uint64_t F22 = 0;
|
||||||
|
uint64_t F23 = 0;
|
||||||
|
uint64_t F24 = 0;
|
||||||
|
uint64_t F25 = 0;
|
||||||
|
uint64_t F26 = 0;
|
||||||
|
uint64_t F27 = 0;
|
||||||
|
uint64_t F28 = 0;
|
||||||
|
uint64_t F29 = 0;
|
||||||
|
uint64_t F30 = 0;
|
||||||
|
uint64_t F31 = 0;
|
||||||
|
uint32_t FCSR = 0;
|
||||||
|
uint32_t NEXT_PC = 0;
|
||||||
|
uint32_t trap_state = 0, pending_trap = 0, machine_state = 0;
|
||||||
|
uint64_t icount = 0;
|
||||||
|
} reg;
|
||||||
|
|
||||||
|
std::array<address_type, 4> addr_mode;
|
||||||
|
|
||||||
|
|
||||||
|
uint32_t get_fcsr(){return reg.FCSR;}
|
||||||
|
void set_fcsr(uint32_t val){reg.FCSR = val;}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* _RV32GC_H_ */
|
|
@ -48,7 +48,9 @@ struct traits<rv32imac> {
|
||||||
|
|
||||||
constexpr static char const* const core_type = "RV32IMAC";
|
constexpr static char const* const core_type = "RV32IMAC";
|
||||||
|
|
||||||
enum constants {XLEN=32, XLEN2=64, XLEN_BIT_MASK=31, PCLEN=32, fence=0, fencei=1, fencevmal=2, fencevmau=3, MISA_VAL=1075056897, PGSIZE=4096, PGMASK=4095};
|
enum constants {XLEN=32, PCLEN=32, MISA_VAL=1075056901, PGSIZE=4096, PGMASK=4095};
|
||||||
|
|
||||||
|
constexpr static unsigned FP_REGS_SIZE = 0;
|
||||||
|
|
||||||
enum reg_e {
|
enum reg_e {
|
||||||
X0,
|
X0,
|
||||||
|
@ -117,7 +119,6 @@ struct traits<rv32imac> {
|
||||||
enum sreg_flag_e {FLAGS};
|
enum sreg_flag_e {FLAGS};
|
||||||
|
|
||||||
enum mem_type_e {MEM, CSR, FENCE, RES};
|
enum mem_type_e {MEM, CSR, FENCE, RES};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct rv32imac: public arch_if {
|
struct rv32imac: public arch_if {
|
||||||
|
@ -199,6 +200,10 @@ protected:
|
||||||
|
|
||||||
std::array<address_type, 4> addr_mode;
|
std::array<address_type, 4> addr_mode;
|
||||||
|
|
||||||
|
|
||||||
|
uint32_t get_fcsr(){return 0;}
|
||||||
|
void set_fcsr(uint32_t val){}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,9 @@ struct traits<rv64ia> {
|
||||||
|
|
||||||
constexpr static char const* const core_type = "RV64IA";
|
constexpr static char const* const core_type = "RV64IA";
|
||||||
|
|
||||||
enum constants {XLEN=64, XLEN2=128, XLEN_BIT_MASK=63, PCLEN=64, fence=0, fencei=1, fencevmal=2, fencevmau=3, MISA_VAL=2147746049, PGSIZE=4096, PGMASK=4095};
|
enum constants {XLEN=64, PCLEN=64, MISA_VAL=2147746049, PGSIZE=4096, PGMASK=4095};
|
||||||
|
|
||||||
|
constexpr static unsigned FP_REGS_SIZE = 0;
|
||||||
|
|
||||||
enum reg_e {
|
enum reg_e {
|
||||||
X0,
|
X0,
|
||||||
|
@ -117,7 +119,6 @@ struct traits<rv64ia> {
|
||||||
enum sreg_flag_e {FLAGS};
|
enum sreg_flag_e {FLAGS};
|
||||||
|
|
||||||
enum mem_type_e {MEM, CSR, FENCE, RES};
|
enum mem_type_e {MEM, CSR, FENCE, RES};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct rv64ia: public arch_if {
|
struct rv64ia: public arch_if {
|
||||||
|
@ -199,6 +200,10 @@ protected:
|
||||||
|
|
||||||
std::array<address_type, 4> addr_mode;
|
std::array<address_type, 4> addr_mode;
|
||||||
|
|
||||||
|
|
||||||
|
uint32_t get_fcsr(){return 0;}
|
||||||
|
void set_fcsr(uint32_t val){}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
# library files
|
# library files
|
||||||
FILE(GLOB RiscVHeaders *.h)
|
FILE(GLOB RiscVHeaders *.h)
|
||||||
|
FILE(GLOB IssSources iss/*.cpp internal/*.cpp)
|
||||||
|
|
||||||
|
|
||||||
set(LIB_HEADERS ${RiscVHeaders} )
|
set(LIB_HEADERS ${RiscVHeaders} )
|
||||||
set(LIB_SOURCES
|
set(LIB_SOURCES
|
||||||
iss/rv32imac.cpp
|
${IssSources}
|
||||||
iss/rv64ia.cpp
|
|
||||||
internal/vm_rv32imac.cpp
|
|
||||||
internal/vm_rv64ia.cpp
|
|
||||||
plugin/instruction_count.cpp
|
plugin/instruction_count.cpp
|
||||||
plugin/cycle_estimate.cpp
|
plugin/cycle_estimate.cpp
|
||||||
)
|
)
|
||||||
|
@ -35,6 +35,7 @@ add_executable(${APPLICATION_NAME} ${APP_SOURCES})
|
||||||
# Links the target exe against the libraries
|
# Links the target exe against the libraries
|
||||||
target_link_libraries(${APPLICATION_NAME} ${LIBRARY_NAME})
|
target_link_libraries(${APPLICATION_NAME} ${LIBRARY_NAME})
|
||||||
target_link_libraries(${APPLICATION_NAME} dbt-core)
|
target_link_libraries(${APPLICATION_NAME} dbt-core)
|
||||||
|
target_link_libraries(${APPLICATION_NAME} softfloat)
|
||||||
target_link_libraries(${APPLICATION_NAME} sc-components)
|
target_link_libraries(${APPLICATION_NAME} sc-components)
|
||||||
target_link_libraries(${APPLICATION_NAME} external)
|
target_link_libraries(${APPLICATION_NAME} external)
|
||||||
target_link_libraries(${APPLICATION_NAME} ${llvm_libs})
|
target_link_libraries(${APPLICATION_NAME} ${llvm_libs})
|
||||||
|
|
|
@ -0,0 +1,458 @@
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Copyright (C) 2017, MINRES Technologies GmbH
|
||||||
|
// 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 copyright holder 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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
|
||||||
|
//
|
||||||
|
// Contributors:
|
||||||
|
// eyck@minres.com - initial API and implementation
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include <iss/iss.h>
|
||||||
|
#include <iss/vm_base.h>
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include <softfloat.h>
|
||||||
|
#include "internals.h"
|
||||||
|
#include "specialize.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
|
namespace iss {
|
||||||
|
namespace vm {
|
||||||
|
namespace fp_impl {
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#define INT_TYPE(L) Type::getIntNTy(mod->getContext(), L)
|
||||||
|
#define FLOAT_TYPE Type::getFloatTy(mod->getContext())
|
||||||
|
#define DOUBLE_TYPE Type::getDoubleTy(mod->getContext())
|
||||||
|
#define VOID_TYPE Type::getVoidTy(mod->getContext())
|
||||||
|
#define THIS_PTR_TYPE Type::getIntNPtrTy(mod->getContext(), 8)
|
||||||
|
#define FDECLL(NAME, RET, ...) \
|
||||||
|
Function *NAME##_func = CurrentModule->getFunction(#NAME); \
|
||||||
|
if (!NAME##_func) { \
|
||||||
|
std::vector<Type *> NAME##_args{__VA_ARGS__}; \
|
||||||
|
FunctionType *NAME##_type = FunctionType::get(RET, NAME##_args, false); \
|
||||||
|
NAME##_func = Function::Create(NAME##_type, GlobalValue::ExternalLinkage, #NAME, CurrentModule); \
|
||||||
|
NAME##_func->setCallingConv(CallingConv::C); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define FDECL(NAME, RET, ...) \
|
||||||
|
std::vector<Type *> NAME##_args{__VA_ARGS__}; \
|
||||||
|
FunctionType *NAME##_type = llvm::FunctionType::get(RET, NAME##_args, false); \
|
||||||
|
mod->getOrInsertFunction(#NAME, NAME##_type);
|
||||||
|
|
||||||
|
using namespace llvm;
|
||||||
|
|
||||||
|
void add_fp_functions_2_module(Module *mod, uint32_t flen) {
|
||||||
|
if(flen){
|
||||||
|
FDECL(fget_flags, INT_TYPE(32));
|
||||||
|
FDECL(fadd_s, INT_TYPE(32), INT_TYPE(32), INT_TYPE(32), INT_TYPE(8));
|
||||||
|
FDECL(fsub_s, INT_TYPE(32), INT_TYPE(32), INT_TYPE(32), INT_TYPE(8));
|
||||||
|
FDECL(fmul_s, INT_TYPE(32), INT_TYPE(32), INT_TYPE(32), INT_TYPE(8));
|
||||||
|
FDECL(fdiv_s, INT_TYPE(32), INT_TYPE(32), INT_TYPE(32), INT_TYPE(8));
|
||||||
|
FDECL(fsqrt_s, INT_TYPE(32), INT_TYPE(32), INT_TYPE(8));
|
||||||
|
FDECL(fcmp_s, INT_TYPE(32), INT_TYPE(32), INT_TYPE(32), INT_TYPE(32));
|
||||||
|
FDECL(fcvt_s, INT_TYPE(32), INT_TYPE(32), INT_TYPE(32), INT_TYPE(8));
|
||||||
|
FDECL(fmadd_s, INT_TYPE(32), INT_TYPE(32), INT_TYPE(32), INT_TYPE(32), INT_TYPE(32), INT_TYPE(8));
|
||||||
|
FDECL(fsel_s, INT_TYPE(32), INT_TYPE(32), INT_TYPE(32), INT_TYPE(32));
|
||||||
|
FDECL(fclass_s, INT_TYPE(32), INT_TYPE(32));
|
||||||
|
if(flen>32){
|
||||||
|
FDECL(fconv_d2f, INT_TYPE(32), INT_TYPE(64), INT_TYPE(8));
|
||||||
|
FDECL(fconv_f2d, INT_TYPE(64), INT_TYPE(32), INT_TYPE(8));
|
||||||
|
FDECL(fadd_d, INT_TYPE(64), INT_TYPE(64), INT_TYPE(64), INT_TYPE(8));
|
||||||
|
FDECL(fsub_d, INT_TYPE(64), INT_TYPE(64), INT_TYPE(64), INT_TYPE(8));
|
||||||
|
FDECL(fmul_d, INT_TYPE(64), INT_TYPE(64), INT_TYPE(64), INT_TYPE(8));
|
||||||
|
FDECL(fdiv_d, INT_TYPE(64), INT_TYPE(64), INT_TYPE(64), INT_TYPE(8));
|
||||||
|
FDECL(fsqrt_d, INT_TYPE(64), INT_TYPE(64), INT_TYPE(8));
|
||||||
|
FDECL(fcmp_d, INT_TYPE(64), INT_TYPE(64), INT_TYPE(64), INT_TYPE(32));
|
||||||
|
FDECL(fcvt_d, INT_TYPE(64), INT_TYPE(64), INT_TYPE(32), INT_TYPE(8));
|
||||||
|
FDECL(fmadd_d, INT_TYPE(64), INT_TYPE(64), INT_TYPE(64), INT_TYPE(64), INT_TYPE(32), INT_TYPE(8));
|
||||||
|
FDECL(fsel_d, INT_TYPE(64), INT_TYPE(64), INT_TYPE(64), INT_TYPE(32));
|
||||||
|
FDECL(fclass_d, INT_TYPE(64), INT_TYPE(64));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
using this_t = uint8_t *;
|
||||||
|
const uint8_t rmm_map[] = {
|
||||||
|
softfloat_round_near_even /*RNE*/,
|
||||||
|
softfloat_round_minMag/*RTZ*/,
|
||||||
|
softfloat_round_min/*RDN*/,
|
||||||
|
softfloat_round_max/*RUP?*/,
|
||||||
|
softfloat_round_near_maxMag /*RMM*/,
|
||||||
|
softfloat_round_max/*RTZ*/,
|
||||||
|
softfloat_round_max/*RTZ*/,
|
||||||
|
softfloat_round_max/*RTZ*/,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint32_t quiet_nan32=0x7fC00000;
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
uint32_t fget_flags(){
|
||||||
|
return softfloat_exceptionFlags&0x1f;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t fadd_s(uint32_t v1, uint32_t v2, uint8_t mode) {
|
||||||
|
float32_t v1f{v1},v2f{v2};
|
||||||
|
softfloat_roundingMode=rmm_map[mode&0x7];
|
||||||
|
softfloat_exceptionFlags=0;
|
||||||
|
float32_t r =f32_add(v1f, v2f);
|
||||||
|
return r.v;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t fsub_s(uint32_t v1, uint32_t v2, uint8_t mode) {
|
||||||
|
float32_t v1f{v1},v2f{v2};
|
||||||
|
softfloat_roundingMode=rmm_map[mode&0x7];
|
||||||
|
softfloat_exceptionFlags=0;
|
||||||
|
float32_t r=f32_sub(v1f, v2f);
|
||||||
|
return r.v;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t fmul_s(uint32_t v1, uint32_t v2, uint8_t mode) {
|
||||||
|
float32_t v1f{v1},v2f{v2};
|
||||||
|
softfloat_roundingMode=rmm_map[mode&0x7];
|
||||||
|
softfloat_exceptionFlags=0;
|
||||||
|
float32_t r=f32_mul(v1f, v2f);
|
||||||
|
return r.v;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t fdiv_s(uint32_t v1, uint32_t v2, uint8_t mode) {
|
||||||
|
float32_t v1f{v1},v2f{v2};
|
||||||
|
softfloat_roundingMode=rmm_map[mode&0x7];
|
||||||
|
softfloat_exceptionFlags=0;
|
||||||
|
float32_t r=f32_div(v1f, v2f);
|
||||||
|
return r.v;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t fsqrt_s(uint32_t v1, uint8_t mode) {
|
||||||
|
float32_t v1f{v1};
|
||||||
|
softfloat_roundingMode=rmm_map[mode&0x7];
|
||||||
|
softfloat_exceptionFlags=0;
|
||||||
|
float32_t r=f32_sqrt(v1f);
|
||||||
|
return r.v;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t fcmp_s(uint32_t v1, uint32_t v2, uint32_t op) {
|
||||||
|
float32_t v1f{v1},v2f{v2};
|
||||||
|
softfloat_exceptionFlags=0;
|
||||||
|
bool nan = (v1&defaultNaNF32UI)==quiet_nan32 || (v2&defaultNaNF32UI)==quiet_nan32;
|
||||||
|
bool snan = softfloat_isSigNaNF32UI(v1) || softfloat_isSigNaNF32UI(v2);
|
||||||
|
switch(op){
|
||||||
|
case 0:
|
||||||
|
if(nan | snan){
|
||||||
|
if(snan) softfloat_raiseFlags(softfloat_flag_invalid);
|
||||||
|
return 0;
|
||||||
|
} else
|
||||||
|
return f32_eq(v1f,v2f )?1:0;
|
||||||
|
case 1:
|
||||||
|
if(nan | snan){
|
||||||
|
softfloat_raiseFlags(softfloat_flag_invalid);
|
||||||
|
return 0;
|
||||||
|
} else
|
||||||
|
return f32_le(v1f,v2f )?1:0;
|
||||||
|
case 2:
|
||||||
|
if(nan | snan){
|
||||||
|
softfloat_raiseFlags(softfloat_flag_invalid);
|
||||||
|
return 0;
|
||||||
|
} else
|
||||||
|
return f32_lt(v1f,v2f )?1:0;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t fcvt_s(uint32_t v1, uint32_t op, uint8_t mode) {
|
||||||
|
float32_t v1f{v1};
|
||||||
|
softfloat_exceptionFlags=0;
|
||||||
|
float32_t r;
|
||||||
|
int32_t res;
|
||||||
|
switch(op){
|
||||||
|
case 0: //w->s, fp to int32
|
||||||
|
res = f32_to_i32(v1f,rmm_map[mode&0x7],true);
|
||||||
|
return (uint32_t)res;
|
||||||
|
case 1: //wu->s
|
||||||
|
return f32_to_ui32(v1f,rmm_map[mode&0x7],true);
|
||||||
|
case 2: //s->w
|
||||||
|
r=i32_to_f32(v1);
|
||||||
|
return r.v;
|
||||||
|
case 3: //s->wu
|
||||||
|
r=ui32_to_f32(v1);
|
||||||
|
return r.v;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t fmadd_s(uint32_t v1, uint32_t v2, uint32_t v3, uint32_t op, uint8_t mode) {
|
||||||
|
// op should be {softfloat_mulAdd_subProd(2), softfloat_mulAdd_subC(1)}
|
||||||
|
softfloat_roundingMode=rmm_map[mode&0x7];
|
||||||
|
softfloat_exceptionFlags=0;
|
||||||
|
float32_t res = softfloat_mulAddF32(v1, v2, v3, op&0x1);
|
||||||
|
if(op>1) res.v ^= 1ULL<<31;
|
||||||
|
return res.v;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t fsel_s(uint32_t v1, uint32_t v2, uint32_t op) {
|
||||||
|
softfloat_exceptionFlags = 0;
|
||||||
|
bool v1_nan = (v1 & defaultNaNF32UI) == defaultNaNF32UI;
|
||||||
|
bool v2_nan = (v2 & defaultNaNF32UI) == defaultNaNF32UI;
|
||||||
|
bool v1_snan = softfloat_isSigNaNF32UI(v1);
|
||||||
|
bool v2_snan = softfloat_isSigNaNF32UI(v2);
|
||||||
|
if (v1_snan || v2_snan) softfloat_raiseFlags(softfloat_flag_invalid);
|
||||||
|
if (v1_nan || v1_snan)
|
||||||
|
return (v2_nan || v2_snan) ? defaultNaNF32UI : v2;
|
||||||
|
else
|
||||||
|
if (v2_nan || v2_snan)
|
||||||
|
return v1;
|
||||||
|
else {
|
||||||
|
if ((v1 & 0x7fffffff) == 0 && (v2 & 0x7fffffff) == 0) {
|
||||||
|
return op == 0 ? ((v1 & 0x80000000) ? v1 : v2) : ((v1 & 0x80000000) ? v2 : v1);
|
||||||
|
} else {
|
||||||
|
float32_t v1f{ v1 }, v2f{ v2 };
|
||||||
|
return op == 0 ? (f32_lt(v1f, v2f) ? v1 : v2) : (f32_lt(v1f, v2f) ? v2 : v1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t fclass_s( uint32_t v1 ){
|
||||||
|
|
||||||
|
float32_t a{v1};
|
||||||
|
union ui32_f32 uA;
|
||||||
|
uint_fast32_t uiA;
|
||||||
|
|
||||||
|
uA.f = a;
|
||||||
|
uiA = uA.ui;
|
||||||
|
|
||||||
|
uint_fast16_t infOrNaN = expF32UI( uiA ) == 0xFF;
|
||||||
|
uint_fast16_t subnormalOrZero = expF32UI( uiA ) == 0;
|
||||||
|
bool sign = signF32UI( uiA );
|
||||||
|
bool fracZero = fracF32UI( uiA ) == 0;
|
||||||
|
bool isNaN = isNaNF32UI( uiA );
|
||||||
|
bool isSNaN = softfloat_isSigNaNF32UI( uiA );
|
||||||
|
|
||||||
|
return
|
||||||
|
( sign && infOrNaN && fracZero ) << 0 |
|
||||||
|
( sign && !infOrNaN && !subnormalOrZero ) << 1 |
|
||||||
|
( sign && subnormalOrZero && !fracZero ) << 2 |
|
||||||
|
( sign && subnormalOrZero && fracZero ) << 3 |
|
||||||
|
( !sign && infOrNaN && fracZero ) << 7 |
|
||||||
|
( !sign && !infOrNaN && !subnormalOrZero ) << 6 |
|
||||||
|
( !sign && subnormalOrZero && !fracZero ) << 5 |
|
||||||
|
( !sign && subnormalOrZero && fracZero ) << 4 |
|
||||||
|
( isNaN && isSNaN ) << 8 |
|
||||||
|
( isNaN && !isSNaN ) << 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t fconv_d2f(uint64_t v1, uint8_t mode){
|
||||||
|
softfloat_roundingMode=rmm_map[mode&0x7];
|
||||||
|
bool nan = (v1 & defaultNaNF64UI)==defaultNaNF64UI;
|
||||||
|
if(nan){
|
||||||
|
return defaultNaNF32UI;
|
||||||
|
} else {
|
||||||
|
float32_t res = f64_to_f32(float64_t{v1});
|
||||||
|
return res.v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t fconv_f2d(uint32_t v1, uint8_t mode){
|
||||||
|
bool nan = (v1 & defaultNaNF32UI)==defaultNaNF32UI;
|
||||||
|
if(nan){
|
||||||
|
return defaultNaNF64UI;
|
||||||
|
} else {
|
||||||
|
softfloat_roundingMode=rmm_map[mode&0x7];
|
||||||
|
float64_t res = f32_to_f64(float32_t{v1});
|
||||||
|
return res.v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t fadd_d(uint64_t v1, uint64_t v2, uint8_t mode) {
|
||||||
|
bool nan = (v1&defaultNaNF32UI)==quiet_nan32;
|
||||||
|
bool snan = softfloat_isSigNaNF32UI(v1);
|
||||||
|
float64_t v1f{v1},v2f{v2};
|
||||||
|
softfloat_roundingMode=rmm_map[mode&0x7];
|
||||||
|
softfloat_exceptionFlags=0;
|
||||||
|
float64_t r =f64_add(v1f, v2f);
|
||||||
|
return r.v;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t fsub_d(uint64_t v1, uint64_t v2, uint8_t mode) {
|
||||||
|
float64_t v1f{v1},v2f{v2};
|
||||||
|
softfloat_roundingMode=rmm_map[mode&0x7];
|
||||||
|
softfloat_exceptionFlags=0;
|
||||||
|
float64_t r=f64_sub(v1f, v2f);
|
||||||
|
return r.v;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t fmul_d(uint64_t v1, uint64_t v2, uint8_t mode) {
|
||||||
|
float64_t v1f{v1},v2f{v2};
|
||||||
|
softfloat_roundingMode=rmm_map[mode&0x7];
|
||||||
|
softfloat_exceptionFlags=0;
|
||||||
|
float64_t r=f64_mul(v1f, v2f);
|
||||||
|
return r.v;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t fdiv_d(uint64_t v1, uint64_t v2, uint8_t mode) {
|
||||||
|
float64_t v1f{v1},v2f{v2};
|
||||||
|
softfloat_roundingMode=rmm_map[mode&0x7];
|
||||||
|
softfloat_exceptionFlags=0;
|
||||||
|
float64_t r=f64_div(v1f, v2f);
|
||||||
|
return r.v;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t fsqrt_d(uint64_t v1, uint8_t mode) {
|
||||||
|
float64_t v1f{v1};
|
||||||
|
softfloat_roundingMode=rmm_map[mode&0x7];
|
||||||
|
softfloat_exceptionFlags=0;
|
||||||
|
float64_t r=f64_sqrt(v1f);
|
||||||
|
return r.v;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t fcmp_d(uint64_t v1, uint64_t v2, uint32_t op) {
|
||||||
|
float64_t v1f{v1},v2f{v2};
|
||||||
|
softfloat_exceptionFlags=0;
|
||||||
|
bool nan = (v1&defaultNaNF64UI)==quiet_nan32 || (v2&defaultNaNF64UI)==quiet_nan32;
|
||||||
|
bool snan = softfloat_isSigNaNF64UI(v1) || softfloat_isSigNaNF64UI(v2);
|
||||||
|
switch(op){
|
||||||
|
case 0:
|
||||||
|
if(nan | snan){
|
||||||
|
if(snan) softfloat_raiseFlags(softfloat_flag_invalid);
|
||||||
|
return 0;
|
||||||
|
} else
|
||||||
|
return f64_eq(v1f,v2f )?1:0;
|
||||||
|
case 1:
|
||||||
|
if(nan | snan){
|
||||||
|
softfloat_raiseFlags(softfloat_flag_invalid);
|
||||||
|
return 0;
|
||||||
|
} else
|
||||||
|
return f64_le(v1f,v2f )?1:0;
|
||||||
|
case 2:
|
||||||
|
if(nan | snan){
|
||||||
|
softfloat_raiseFlags(softfloat_flag_invalid);
|
||||||
|
return 0;
|
||||||
|
} else
|
||||||
|
return f64_lt(v1f,v2f )?1:0;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t fcvt_d(uint64_t v1, uint32_t op, uint8_t mode) {
|
||||||
|
float64_t v1f{v1};
|
||||||
|
softfloat_exceptionFlags=0;
|
||||||
|
float64_t r;
|
||||||
|
int32_t res;
|
||||||
|
switch(op){
|
||||||
|
case 0: //w->s, fp to int32
|
||||||
|
res = f64_to_i64(v1f,rmm_map[mode&0x7],true);
|
||||||
|
return (uint64_t)res;
|
||||||
|
case 1: //wu->s
|
||||||
|
return f64_to_ui64(v1f,rmm_map[mode&0x7],true);
|
||||||
|
case 2: //s->w
|
||||||
|
r=i64_to_f64(v1);
|
||||||
|
return r.v;
|
||||||
|
case 3: //s->wu
|
||||||
|
r=ui64_to_f64(v1);
|
||||||
|
return r.v;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t fmadd_d(uint64_t v1, uint64_t v2, uint64_t v3, uint32_t op, uint8_t mode) {
|
||||||
|
// op should be {softfloat_mulAdd_subProd(2), softfloat_mulAdd_subC(1)}
|
||||||
|
softfloat_roundingMode=rmm_map[mode&0x7];
|
||||||
|
softfloat_exceptionFlags=0;
|
||||||
|
float64_t res = softfloat_mulAddF64(v1, v2, v3, op&0x1);
|
||||||
|
if(op>1) res.v ^= 1ULL<<63;
|
||||||
|
return res.v;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t fsel_d(uint64_t v1, uint64_t v2, uint32_t op) {
|
||||||
|
softfloat_exceptionFlags = 0;
|
||||||
|
bool v1_nan = (v1 & defaultNaNF64UI) == defaultNaNF64UI;
|
||||||
|
bool v2_nan = (v2 & defaultNaNF64UI) == defaultNaNF64UI;
|
||||||
|
bool v1_snan = softfloat_isSigNaNF64UI(v1);
|
||||||
|
bool v2_snan = softfloat_isSigNaNF64UI(v2);
|
||||||
|
if (v1_snan || v2_snan) softfloat_raiseFlags(softfloat_flag_invalid);
|
||||||
|
if (v1_nan || v1_snan)
|
||||||
|
return (v2_nan || v2_snan) ? defaultNaNF64UI : v2;
|
||||||
|
else
|
||||||
|
if (v2_nan || v2_snan)
|
||||||
|
return v1;
|
||||||
|
else {
|
||||||
|
if ((v1 & std::numeric_limits<int64_t>::max()) == 0 && (v2 & std::numeric_limits<int64_t>::max()) == 0) {
|
||||||
|
return op == 0 ?
|
||||||
|
((v1 & std::numeric_limits<int64_t>::min()) ? v1 : v2) :
|
||||||
|
((v1 & std::numeric_limits<int64_t>::min()) ? v2 : v1);
|
||||||
|
} else {
|
||||||
|
float64_t v1f{ v1 }, v2f{ v2 };
|
||||||
|
return op == 0 ?
|
||||||
|
(f64_lt(v1f, v2f) ? v1 : v2) :
|
||||||
|
(f64_lt(v1f, v2f) ? v2 : v1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t fclass_d(uint64_t v1 ){
|
||||||
|
|
||||||
|
float64_t a{v1};
|
||||||
|
union ui64_f64 uA;
|
||||||
|
uint_fast64_t uiA;
|
||||||
|
|
||||||
|
uA.f = a;
|
||||||
|
uiA = uA.ui;
|
||||||
|
|
||||||
|
uint_fast16_t infOrNaN = expF64UI( uiA ) == 0x7FF;
|
||||||
|
uint_fast16_t subnormalOrZero = expF64UI( uiA ) == 0;
|
||||||
|
bool sign = signF64UI( uiA );
|
||||||
|
bool fracZero = fracF64UI( uiA ) == 0;
|
||||||
|
bool isNaN = isNaNF64UI( uiA );
|
||||||
|
bool isSNaN = softfloat_isSigNaNF64UI( uiA );
|
||||||
|
|
||||||
|
return
|
||||||
|
( sign && infOrNaN && fracZero ) << 0 |
|
||||||
|
( sign && !infOrNaN && !subnormalOrZero ) << 1 |
|
||||||
|
( sign && subnormalOrZero && !fracZero ) << 2 |
|
||||||
|
( sign && subnormalOrZero && fracZero ) << 3 |
|
||||||
|
( !sign && infOrNaN && fracZero ) << 7 |
|
||||||
|
( !sign && !infOrNaN && !subnormalOrZero ) << 6 |
|
||||||
|
( !sign && subnormalOrZero && !fracZero ) << 5 |
|
||||||
|
( !sign && subnormalOrZero && fracZero ) << 4 |
|
||||||
|
( isNaN && isSNaN ) << 8 |
|
||||||
|
( isNaN && !isSNaN ) << 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,74 @@
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Copyright (C) 2017, MINRES Technologies GmbH
|
||||||
|
// 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 copyright holder 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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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 "util/ities.h"
|
||||||
|
#include <util/logging.h>
|
||||||
|
|
||||||
|
#include <elfio/elfio.hpp>
|
||||||
|
#include <iss/arch/rv32gc.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#include <ihex.h>
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <fstream>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
using namespace iss::arch;
|
||||||
|
|
||||||
|
rv32gc::rv32gc() {
|
||||||
|
reg.icount=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
rv32gc::~rv32gc(){
|
||||||
|
}
|
||||||
|
|
||||||
|
void rv32gc::reset(uint64_t address) {
|
||||||
|
for(size_t i=0; i<traits<rv32gc>::NUM_REGS; ++i) set_reg(i, std::vector<uint8_t>(sizeof(traits<rv32gc>::reg_t),0));
|
||||||
|
reg.PC=address;
|
||||||
|
reg.NEXT_PC=reg.PC;
|
||||||
|
reg.trap_state=0;
|
||||||
|
reg.machine_state=0x0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t* rv32gc::get_regs_base_ptr(){
|
||||||
|
return reinterpret_cast<uint8_t*>(®);
|
||||||
|
}
|
||||||
|
|
||||||
|
rv32gc::phys_addr_t rv32gc::virt2phys(const iss::addr_t &pc) {
|
||||||
|
return phys_addr_t(pc); // change logical address to physical address
|
||||||
|
}
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
#include <boost/program_options.hpp>
|
#include <boost/program_options.hpp>
|
||||||
#include <iss/arch/riscv_hart_msu_vp.h>
|
#include <iss/arch/riscv_hart_msu_vp.h>
|
||||||
#include <iss/arch/rv32imac.h>
|
#include <iss/arch/rv32imac.h>
|
||||||
|
#include <iss/arch/rv32gc.h>
|
||||||
#include <iss/arch/rv64ia.h>
|
#include <iss/arch/rv64ia.h>
|
||||||
#include <iss/jit/MCJIThelper.h>
|
#include <iss/jit/MCJIThelper.h>
|
||||||
#include <iss/log_categories.h>
|
#include <iss/log_categories.h>
|
||||||
|
@ -65,7 +66,8 @@ int main(int argc, char *argv[]) {
|
||||||
("dump-ir", "dump the intermediate representation")
|
("dump-ir", "dump the intermediate representation")
|
||||||
("elf", po::value<std::vector<std::string>>(), "ELF file(s) to load")
|
("elf", po::value<std::vector<std::string>>(), "ELF file(s) to load")
|
||||||
("mem,m", po::value<std::string>(), "the memory input file")
|
("mem,m", po::value<std::string>(), "the memory input file")
|
||||||
("isa", po::value<std::string>()->default_value("rv32imac"), "isa to use for simulation");
|
("plugin,p", po::value<std::vector<std::string>>(), "plugin to activate")
|
||||||
|
("isa", po::value<std::string>()->default_value("rv32gc"), "isa to use for simulation");
|
||||||
// clang-format on
|
// clang-format on
|
||||||
auto parsed = po::command_line_parser(argc, argv).options(desc).allow_unregistered().run();
|
auto parsed = po::command_line_parser(argc, argv).options(desc).allow_unregistered().run();
|
||||||
try {
|
try {
|
||||||
|
@ -96,26 +98,55 @@ int main(int argc, char *argv[]) {
|
||||||
LOG_OUTPUT(connection)::stream() = f;
|
LOG_OUTPUT(connection)::stream() = f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<iss::vm_plugin*> plugin_list;
|
||||||
|
auto res=0;
|
||||||
try {
|
try {
|
||||||
// application code comes here //
|
// application code comes here //
|
||||||
iss::init_jit(argc, argv);
|
iss::init_jit(argc, argv);
|
||||||
bool dump = clim.count("dump-ir");
|
bool dump = clim.count("dump-ir");
|
||||||
// instantiate the simulator
|
// instantiate the simulator
|
||||||
std::unique_ptr<iss::vm_if> vm{nullptr};
|
std::unique_ptr<iss::vm_if> vm{nullptr};
|
||||||
|
std::unique_ptr<iss::arch_if> cpu{nullptr};
|
||||||
std::string isa_opt(clim["isa"].as<std::string>());
|
std::string isa_opt(clim["isa"].as<std::string>());
|
||||||
iss::plugin::instruction_count ic_plugin("riscv/gen_input/src-gen/rv32imac_cyles.txt");
|
if (isa_opt=="rv64ia") {
|
||||||
iss::plugin::cycle_estimate ce_plugin("riscv/gen_input/src-gen/rv32imac_cyles.txt");
|
iss::arch::rv64ia* lcpu = new iss::arch::riscv_hart_msu_vp<iss::arch::rv64ia>();
|
||||||
if (isa_opt.substr(0, 4)=="rv64") {
|
vm = iss::create(lcpu, clim["gdb-port"].as<unsigned>());
|
||||||
iss::arch::rv64ia* cpu = new iss::arch::riscv_hart_msu_vp<iss::arch::rv64ia>();
|
cpu.reset(lcpu);
|
||||||
vm = iss::create(cpu, clim["gdb-port"].as<unsigned>());
|
} else if (isa_opt=="rv32imac") {
|
||||||
} else if (isa_opt.substr(0, 4)=="rv32") {
|
iss::arch::rv32imac* lcpu = new iss::arch::riscv_hart_msu_vp<iss::arch::rv32imac>();
|
||||||
iss::arch::rv32imac* cpu = new iss::arch::riscv_hart_msu_vp<iss::arch::rv32imac>();
|
vm = iss::create(lcpu, clim["gdb-port"].as<unsigned>());
|
||||||
vm = iss::create(cpu, clim["gdb-port"].as<unsigned>());
|
cpu.reset(lcpu);
|
||||||
//vm->register_plugin(ce_plugin);
|
} else if (isa_opt=="rv32gc") {
|
||||||
|
iss::arch::rv32gc* lcpu = new iss::arch::riscv_hart_msu_vp<iss::arch::rv32gc>();
|
||||||
|
vm = iss::create(lcpu, clim["gdb-port"].as<unsigned>());
|
||||||
|
cpu.reset(lcpu);
|
||||||
} else {
|
} else {
|
||||||
LOG(ERROR) << "Illegal argument value for '--isa': " << clim["isa"].as<std::string>() << std::endl;
|
LOG(ERROR) << "Illegal argument value for '--isa': " << clim["isa"].as<std::string>() << std::endl;
|
||||||
return 127;
|
return 127;
|
||||||
}
|
}
|
||||||
|
if (clim.count("plugin")) {
|
||||||
|
for (std::string opt_val : clim["plugin"].as<std::vector<std::string>>()){
|
||||||
|
auto plugin_name{opt_val};
|
||||||
|
std::string filename{"cycles.txt"};
|
||||||
|
std::size_t found = opt_val.find('=');
|
||||||
|
if (found!=std::string::npos){
|
||||||
|
plugin_name=opt_val.substr(0, found);
|
||||||
|
filename=opt_val.substr(found+1, opt_val.size());
|
||||||
|
}
|
||||||
|
if(plugin_name=="ic"){
|
||||||
|
auto* ic_plugin= new iss::plugin::instruction_count(filename);
|
||||||
|
vm->register_plugin(*ic_plugin);
|
||||||
|
plugin_list.push_back(ic_plugin);
|
||||||
|
} else if(plugin_name=="ce"){
|
||||||
|
auto* ce_plugin= new iss::plugin::cycle_estimate(filename);
|
||||||
|
vm->register_plugin(*ce_plugin);
|
||||||
|
plugin_list.push_back(ce_plugin);
|
||||||
|
} else {
|
||||||
|
LOG(ERROR) << "Unknown plugin name: " << plugin_name << ", valid names are 'ce', 'ic'"<<std::endl;
|
||||||
|
return 127;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (clim.count("disass")) {
|
if (clim.count("disass")) {
|
||||||
vm->setDisassEnabled(true);
|
vm->setDisassEnabled(true);
|
||||||
LOGGER(disass)::reporting_level() = logging::INFO;
|
LOGGER(disass)::reporting_level() = logging::INFO;
|
||||||
|
@ -146,9 +177,14 @@ int main(int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
vm->reset(start_address);
|
vm->reset(start_address);
|
||||||
auto cycles = clim["instructions"].as<int64_t>();
|
auto cycles = clim["instructions"].as<int64_t>();
|
||||||
return vm->start(cycles, dump);
|
res = vm->start(cycles, dump);
|
||||||
} catch (std::exception &e) {
|
} catch (std::exception &e) {
|
||||||
LOG(ERROR) << "Unhandled Exception reached the top of main: " << e.what() << ", application will now exit" << std::endl;
|
LOG(ERROR) << "Unhandled Exception reached the top of main: " << e.what() << ", application will now exit" << std::endl;
|
||||||
return 2;
|
res=2;
|
||||||
}
|
}
|
||||||
|
// cleanup to let plugins report of needed
|
||||||
|
for(auto* p:plugin_list){
|
||||||
|
delete p;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,7 +63,7 @@ bool iss::plugin::cycle_estimate::registration(const char* const version, vm_if&
|
||||||
if(!arch_instr) return false;
|
if(!arch_instr) return false;
|
||||||
const std::string core_name = arch_instr->core_type_name();
|
const std::string core_name = arch_instr->core_type_name();
|
||||||
Json::Value &val = root[core_name];
|
Json::Value &val = root[core_name];
|
||||||
if(val.isArray()){
|
if(!val.isNull() && val.isArray()){
|
||||||
delays.reserve(val.size());
|
delays.reserve(val.size());
|
||||||
for(auto it:val){
|
for(auto it:val){
|
||||||
auto name = it["name"];
|
auto name = it["name"];
|
||||||
|
@ -76,6 +76,8 @@ bool iss::plugin::cycle_estimate::registration(const char* const version, vm_if&
|
||||||
delays.push_back(instr_desc{size.asUInt(), delay[0].asUInt(), delay[1].asUInt()});
|
delays.push_back(instr_desc{size.asUInt(), delay[0].asUInt(), delay[1].asUInt()});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
LOG(ERROR)<<"plugin cycle_estimate: could not find an entry for "<<core_name<<" in JSON file"<<std::endl;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -85,8 +87,6 @@ void iss::plugin::cycle_estimate::callback(instr_info_t instr_info) {
|
||||||
assert(arch_instr && "No instrumentation interface available but callback executed");
|
assert(arch_instr && "No instrumentation interface available but callback executed");
|
||||||
auto entry = delays[instr_info.instr_id];
|
auto entry = delays[instr_info.instr_id];
|
||||||
bool taken = (arch_instr->get_next_pc()-arch_instr->get_pc()) != (entry.size/8);
|
bool taken = (arch_instr->get_next_pc()-arch_instr->get_pc()) != (entry.size/8);
|
||||||
if(taken && entry.taken > 1 ) // 1 is the default increment per instruction
|
uint32_t delay = taken ? entry.taken : entry.not_taken;
|
||||||
arch_instr->set_curr_instr_cycles(entry.taken);
|
if(delay>1) arch_instr->set_curr_instr_cycles(delay);
|
||||||
if(!taken && entry.not_taken > 1) // 1 is the default increment per instruction
|
|
||||||
arch_instr->set_curr_instr_cycles(entry.not_taken);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,7 +68,7 @@ bool iss::plugin::instruction_count::registration(const char* const version, vm_
|
||||||
if(!instr_if) return false;
|
if(!instr_if) return false;
|
||||||
const std::string core_name = instr_if->core_type_name();
|
const std::string core_name = instr_if->core_type_name();
|
||||||
Json::Value &val = root[core_name];
|
Json::Value &val = root[core_name];
|
||||||
if(val.isArray()){
|
if(!val.isNull() && val.isArray()){
|
||||||
delays.reserve(val.size());
|
delays.reserve(val.size());
|
||||||
for(auto it:val){
|
for(auto it:val){
|
||||||
auto name = it["name"];
|
auto name = it["name"];
|
||||||
|
@ -84,6 +84,8 @@ bool iss::plugin::instruction_count::registration(const char* const version, vm_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rep_counts.resize(delays.size());
|
rep_counts.resize(delays.size());
|
||||||
|
} else {
|
||||||
|
LOG(ERROR)<<"plugin instruction_count: could not find an entry for "<<core_name<<" in JSON file"<<std::endl;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit b50df83ebfbf06299613a973552856954ed383c1
|
Subproject commit bab66d1744221fdce7d0634c08c5c21184539d2a
|
|
@ -0,0 +1,381 @@
|
||||||
|
cmake_minimum_required(VERSION 3.3)
|
||||||
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/../cmake) # main (top) cmake dir
|
||||||
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) # project specific cmake dir
|
||||||
|
|
||||||
|
# CMake useful variables
|
||||||
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
|
||||||
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
|
||||||
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
|
||||||
|
|
||||||
|
# Set the name of your project here
|
||||||
|
project("sotfloat")
|
||||||
|
|
||||||
|
# Set the version number of your project here (format is MAJOR.MINOR.PATCHLEVEL - e.g. 1.0.0)
|
||||||
|
#set(VERSION_MAJOR "3")
|
||||||
|
#set(VERSION_MINOR "0")
|
||||||
|
#set(VERSION_PATCH "0")
|
||||||
|
set(VERSION "3e")
|
||||||
|
|
||||||
|
include(Common)
|
||||||
|
|
||||||
|
set(SPECIALIZATION RISCV)
|
||||||
|
|
||||||
|
add_definitions(
|
||||||
|
-DSOFTFLOAT_ROUND_ODD
|
||||||
|
-DINLINE_LEVEL=5
|
||||||
|
-DSOFTFLOAT_FAST_DIV32TO16
|
||||||
|
-DSOFTFLOAT_FAST_DIV64TO32
|
||||||
|
-DSOFTFLOAT_FAST_INT64
|
||||||
|
# -DTHREAD_LOCAL=__thread
|
||||||
|
)
|
||||||
|
|
||||||
|
set(SOFTFLOAT_INCLUDE_DIRS
|
||||||
|
${PROJECT_SOURCE_DIR}/build/Linux-x86_64-GCC
|
||||||
|
${PROJECT_SOURCE_DIR}/source/include
|
||||||
|
${PROJECT_SOURCE_DIR}/source/${SPECIALIZATION}
|
||||||
|
)
|
||||||
|
|
||||||
|
include_directories(${SOFTFLOAT_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
set(LIB_HEADERS source/include/softfloat.h source/include/softfloat_types.h)
|
||||||
|
set(PRIMITIVES
|
||||||
|
source/s_eq128.c
|
||||||
|
source/s_le128.c
|
||||||
|
source/s_lt128.c
|
||||||
|
source/s_shortShiftLeft128.c
|
||||||
|
source/s_shortShiftRight128.c
|
||||||
|
source/s_shortShiftRightJam64.c
|
||||||
|
source/s_shortShiftRightJam64Extra.c
|
||||||
|
source/s_shortShiftRightJam128.c
|
||||||
|
source/s_shortShiftRightJam128Extra.c
|
||||||
|
source/s_shiftRightJam32.c
|
||||||
|
source/s_shiftRightJam64.c
|
||||||
|
source/s_shiftRightJam64Extra.c
|
||||||
|
source/s_shiftRightJam128.c
|
||||||
|
source/s_shiftRightJam128Extra.c
|
||||||
|
source/s_shiftRightJam256M.c
|
||||||
|
source/s_countLeadingZeros8.c
|
||||||
|
source/s_countLeadingZeros16.c
|
||||||
|
source/s_countLeadingZeros32.c
|
||||||
|
source/s_countLeadingZeros64.c
|
||||||
|
source/s_add128.c
|
||||||
|
source/s_add256M.c
|
||||||
|
source/s_sub128.c
|
||||||
|
source/s_sub256M.c
|
||||||
|
source/s_mul64ByShifted32To128.c
|
||||||
|
source/s_mul64To128.c
|
||||||
|
source/s_mul128By32.c
|
||||||
|
source/s_mul128To256M.c
|
||||||
|
source/s_approxRecip_1Ks.c
|
||||||
|
source/s_approxRecip32_1.c
|
||||||
|
source/s_approxRecipSqrt_1Ks.c
|
||||||
|
source/s_approxRecipSqrt32_1.c
|
||||||
|
)
|
||||||
|
|
||||||
|
set(SPECIALIZE
|
||||||
|
source/${SPECIALIZATION}/softfloat_raiseFlags.c
|
||||||
|
source/${SPECIALIZATION}/s_f16UIToCommonNaN.c
|
||||||
|
source/${SPECIALIZATION}/s_commonNaNToF16UI.c
|
||||||
|
source/${SPECIALIZATION}/s_propagateNaNF16UI.c
|
||||||
|
source/${SPECIALIZATION}/s_f32UIToCommonNaN.c
|
||||||
|
source/${SPECIALIZATION}/s_commonNaNToF32UI.c
|
||||||
|
source/${SPECIALIZATION}/s_propagateNaNF32UI.c
|
||||||
|
source/${SPECIALIZATION}/s_f64UIToCommonNaN.c
|
||||||
|
source/${SPECIALIZATION}/s_commonNaNToF64UI.c
|
||||||
|
source/${SPECIALIZATION}/s_propagateNaNF64UI.c
|
||||||
|
source/${SPECIALIZATION}/extF80M_isSignalingNaN.c
|
||||||
|
source/${SPECIALIZATION}/s_extF80UIToCommonNaN.c
|
||||||
|
source/${SPECIALIZATION}/s_commonNaNToExtF80UI.c
|
||||||
|
source/${SPECIALIZATION}/s_propagateNaNExtF80UI.c
|
||||||
|
source/${SPECIALIZATION}/f128M_isSignalingNaN.c
|
||||||
|
source/${SPECIALIZATION}/s_f128UIToCommonNaN.c
|
||||||
|
source/${SPECIALIZATION}/s_commonNaNToF128UI.c
|
||||||
|
source/${SPECIALIZATION}/s_propagateNaNF128UI.c
|
||||||
|
)
|
||||||
|
|
||||||
|
set(OTHERS
|
||||||
|
source/s_roundToUI32.c
|
||||||
|
source/s_roundToUI64.c
|
||||||
|
source/s_roundToI32.c
|
||||||
|
source/s_roundToI64.c
|
||||||
|
source/s_normSubnormalF16Sig.c
|
||||||
|
source/s_roundPackToF16.c
|
||||||
|
source/s_normRoundPackToF16.c
|
||||||
|
source/s_addMagsF16.c
|
||||||
|
source/s_subMagsF16.c
|
||||||
|
source/s_mulAddF16.c
|
||||||
|
source/s_normSubnormalF32Sig.c
|
||||||
|
source/s_roundPackToF32.c
|
||||||
|
source/s_normRoundPackToF32.c
|
||||||
|
source/s_addMagsF32.c
|
||||||
|
source/s_subMagsF32.c
|
||||||
|
source/s_mulAddF32.c
|
||||||
|
source/s_normSubnormalF64Sig.c
|
||||||
|
source/s_roundPackToF64.c
|
||||||
|
source/s_normRoundPackToF64.c
|
||||||
|
source/s_addMagsF64.c
|
||||||
|
source/s_subMagsF64.c
|
||||||
|
source/s_mulAddF64.c
|
||||||
|
source/s_normSubnormalExtF80Sig.c
|
||||||
|
source/s_roundPackToExtF80.c
|
||||||
|
source/s_normRoundPackToExtF80.c
|
||||||
|
source/s_addMagsExtF80.c
|
||||||
|
source/s_subMagsExtF80.c
|
||||||
|
source/s_normSubnormalF128Sig.c
|
||||||
|
source/s_roundPackToF128.c
|
||||||
|
source/s_normRoundPackToF128.c
|
||||||
|
source/s_addMagsF128.c
|
||||||
|
source/s_subMagsF128.c
|
||||||
|
source/s_mulAddF128.c
|
||||||
|
source/softfloat_state.c
|
||||||
|
source/ui32_to_f16.c
|
||||||
|
source/ui32_to_f32.c
|
||||||
|
source/ui32_to_f64.c
|
||||||
|
source/ui32_to_extF80.c
|
||||||
|
source/ui32_to_extF80M.c
|
||||||
|
source/ui32_to_f128.c
|
||||||
|
source/ui32_to_f128M.c
|
||||||
|
source/ui64_to_f16.c
|
||||||
|
source/ui64_to_f32.c
|
||||||
|
source/ui64_to_f64.c
|
||||||
|
source/ui64_to_extF80.c
|
||||||
|
source/ui64_to_extF80M.c
|
||||||
|
source/ui64_to_f128.c
|
||||||
|
source/ui64_to_f128M.c
|
||||||
|
source/i32_to_f16.c
|
||||||
|
source/i32_to_f32.c
|
||||||
|
source/i32_to_f64.c
|
||||||
|
source/i32_to_extF80.c
|
||||||
|
source/i32_to_extF80M.c
|
||||||
|
source/i32_to_f128.c
|
||||||
|
source/i32_to_f128M.c
|
||||||
|
source/i64_to_f16.c
|
||||||
|
source/i64_to_f32.c
|
||||||
|
source/i64_to_f64.c
|
||||||
|
source/i64_to_extF80.c
|
||||||
|
source/i64_to_extF80M.c
|
||||||
|
source/i64_to_f128.c
|
||||||
|
source/i64_to_f128M.c
|
||||||
|
source/f16_to_ui32.c
|
||||||
|
source/f16_to_ui64.c
|
||||||
|
source/f16_to_i32.c
|
||||||
|
source/f16_to_i64.c
|
||||||
|
source/f16_to_ui32_r_minMag.c
|
||||||
|
source/f16_to_ui64_r_minMag.c
|
||||||
|
source/f16_to_i32_r_minMag.c
|
||||||
|
source/f16_to_i64_r_minMag.c
|
||||||
|
source/f16_to_f32.c
|
||||||
|
source/f16_to_f64.c
|
||||||
|
source/f16_to_extF80.c
|
||||||
|
source/f16_to_extF80M.c
|
||||||
|
source/f16_to_f128.c
|
||||||
|
source/f16_to_f128M.c
|
||||||
|
source/f16_roundToInt.c
|
||||||
|
source/f16_add.c
|
||||||
|
source/f16_sub.c
|
||||||
|
source/f16_mul.c
|
||||||
|
source/f16_mulAdd.c
|
||||||
|
source/f16_div.c
|
||||||
|
source/f16_rem.c
|
||||||
|
source/f16_sqrt.c
|
||||||
|
source/f16_eq.c
|
||||||
|
source/f16_le.c
|
||||||
|
source/f16_lt.c
|
||||||
|
source/f16_eq_signaling.c
|
||||||
|
source/f16_le_quiet.c
|
||||||
|
source/f16_lt_quiet.c
|
||||||
|
source/f16_isSignalingNaN.c
|
||||||
|
source/f32_to_ui32.c
|
||||||
|
source/f32_to_ui64.c
|
||||||
|
source/f32_to_i32.c
|
||||||
|
source/f32_to_i64.c
|
||||||
|
source/f32_to_ui32_r_minMag.c
|
||||||
|
source/f32_to_ui64_r_minMag.c
|
||||||
|
source/f32_to_i32_r_minMag.c
|
||||||
|
source/f32_to_i64_r_minMag.c
|
||||||
|
source/f32_to_f16.c
|
||||||
|
source/f32_to_f64.c
|
||||||
|
source/f32_to_extF80.c
|
||||||
|
source/f32_to_extF80M.c
|
||||||
|
source/f32_to_f128.c
|
||||||
|
source/f32_to_f128M.c
|
||||||
|
source/f32_roundToInt.c
|
||||||
|
source/f32_add.c
|
||||||
|
source/f32_sub.c
|
||||||
|
source/f32_mul.c
|
||||||
|
source/f32_mulAdd.c
|
||||||
|
source/f32_div.c
|
||||||
|
source/f32_rem.c
|
||||||
|
source/f32_sqrt.c
|
||||||
|
source/f32_eq.c
|
||||||
|
source/f32_le.c
|
||||||
|
source/f32_lt.c
|
||||||
|
source/f32_eq_signaling.c
|
||||||
|
source/f32_le_quiet.c
|
||||||
|
source/f32_lt_quiet.c
|
||||||
|
source/f32_isSignalingNaN.c
|
||||||
|
source/f64_to_ui32.c
|
||||||
|
source/f64_to_ui64.c
|
||||||
|
source/f64_to_i32.c
|
||||||
|
source/f64_to_i64.c
|
||||||
|
source/f64_to_ui32_r_minMag.c
|
||||||
|
source/f64_to_ui64_r_minMag.c
|
||||||
|
source/f64_to_i32_r_minMag.c
|
||||||
|
source/f64_to_i64_r_minMag.c
|
||||||
|
source/f64_to_f16.c
|
||||||
|
source/f64_to_f32.c
|
||||||
|
source/f64_to_extF80.c
|
||||||
|
source/f64_to_extF80M.c
|
||||||
|
source/f64_to_f128.c
|
||||||
|
source/f64_to_f128M.c
|
||||||
|
source/f64_roundToInt.c
|
||||||
|
source/f64_add.c
|
||||||
|
source/f64_sub.c
|
||||||
|
source/f64_mul.c
|
||||||
|
source/f64_mulAdd.c
|
||||||
|
source/f64_div.c
|
||||||
|
source/f64_rem.c
|
||||||
|
source/f64_sqrt.c
|
||||||
|
source/f64_eq.c
|
||||||
|
source/f64_le.c
|
||||||
|
source/f64_lt.c
|
||||||
|
source/f64_eq_signaling.c
|
||||||
|
source/f64_le_quiet.c
|
||||||
|
source/f64_lt_quiet.c
|
||||||
|
source/f64_isSignalingNaN.c
|
||||||
|
source/extF80_to_ui32.c
|
||||||
|
source/extF80_to_ui64.c
|
||||||
|
source/extF80_to_i32.c
|
||||||
|
source/extF80_to_i64.c
|
||||||
|
source/extF80_to_ui32_r_minMag.c
|
||||||
|
source/extF80_to_ui64_r_minMag.c
|
||||||
|
source/extF80_to_i32_r_minMag.c
|
||||||
|
source/extF80_to_i64_r_minMag.c
|
||||||
|
source/extF80_to_f16.c
|
||||||
|
source/extF80_to_f32.c
|
||||||
|
source/extF80_to_f64.c
|
||||||
|
source/extF80_to_f128.c
|
||||||
|
source/extF80_roundToInt.c
|
||||||
|
source/extF80_add.c
|
||||||
|
source/extF80_sub.c
|
||||||
|
source/extF80_mul.c
|
||||||
|
source/extF80_div.c
|
||||||
|
source/extF80_rem.c
|
||||||
|
source/extF80_sqrt.c
|
||||||
|
source/extF80_eq.c
|
||||||
|
source/extF80_le.c
|
||||||
|
source/extF80_lt.c
|
||||||
|
source/extF80_eq_signaling.c
|
||||||
|
source/extF80_le_quiet.c
|
||||||
|
source/extF80_lt_quiet.c
|
||||||
|
source/extF80_isSignalingNaN.c
|
||||||
|
source/extF80M_to_ui32.c
|
||||||
|
source/extF80M_to_ui64.c
|
||||||
|
source/extF80M_to_i32.c
|
||||||
|
source/extF80M_to_i64.c
|
||||||
|
source/extF80M_to_ui32_r_minMag.c
|
||||||
|
source/extF80M_to_ui64_r_minMag.c
|
||||||
|
source/extF80M_to_i32_r_minMag.c
|
||||||
|
source/extF80M_to_i64_r_minMag.c
|
||||||
|
source/extF80M_to_f16.c
|
||||||
|
source/extF80M_to_f32.c
|
||||||
|
source/extF80M_to_f64.c
|
||||||
|
source/extF80M_to_f128M.c
|
||||||
|
source/extF80M_roundToInt.c
|
||||||
|
source/extF80M_add.c
|
||||||
|
source/extF80M_sub.c
|
||||||
|
source/extF80M_mul.c
|
||||||
|
source/extF80M_div.c
|
||||||
|
source/extF80M_rem.c
|
||||||
|
source/extF80M_sqrt.c
|
||||||
|
source/extF80M_eq.c
|
||||||
|
source/extF80M_le.c
|
||||||
|
source/extF80M_lt.c
|
||||||
|
source/extF80M_eq_signaling.c
|
||||||
|
source/extF80M_le_quiet.c
|
||||||
|
source/extF80M_lt_quiet.c
|
||||||
|
source/f128_to_ui32.c
|
||||||
|
source/f128_to_ui64.c
|
||||||
|
source/f128_to_i32.c
|
||||||
|
source/f128_to_i64.c
|
||||||
|
source/f128_to_ui32_r_minMag.c
|
||||||
|
source/f128_to_ui64_r_minMag.c
|
||||||
|
source/f128_to_i32_r_minMag.c
|
||||||
|
source/f128_to_i64_r_minMag.c
|
||||||
|
source/f128_to_f16.c
|
||||||
|
source/f128_to_f32.c
|
||||||
|
source/f128_to_extF80.c
|
||||||
|
source/f128_to_f64.c
|
||||||
|
source/f128_roundToInt.c
|
||||||
|
source/f128_add.c
|
||||||
|
source/f128_sub.c
|
||||||
|
source/f128_mul.c
|
||||||
|
source/f128_mulAdd.c
|
||||||
|
source/f128_div.c
|
||||||
|
source/f128_rem.c
|
||||||
|
source/f128_sqrt.c
|
||||||
|
source/f128_eq.c
|
||||||
|
source/f128_le.c
|
||||||
|
source/f128_lt.c
|
||||||
|
source/f128_eq_signaling.c
|
||||||
|
source/f128_le_quiet.c
|
||||||
|
source/f128_lt_quiet.c
|
||||||
|
source/f128_isSignalingNaN.c
|
||||||
|
source/f128M_to_ui32.c
|
||||||
|
source/f128M_to_ui64.c
|
||||||
|
source/f128M_to_i32.c
|
||||||
|
source/f128M_to_i64.c
|
||||||
|
source/f128M_to_ui32_r_minMag.c
|
||||||
|
source/f128M_to_ui64_r_minMag.c
|
||||||
|
source/f128M_to_i32_r_minMag.c
|
||||||
|
source/f128M_to_i64_r_minMag.c
|
||||||
|
source/f128M_to_f16.c
|
||||||
|
source/f128M_to_f32.c
|
||||||
|
source/f128M_to_extF80M.c
|
||||||
|
source/f128M_to_f64.c
|
||||||
|
source/f128M_roundToInt.c
|
||||||
|
source/f128M_add.c
|
||||||
|
source/f128M_sub.c
|
||||||
|
source/f128M_mul.c
|
||||||
|
source/f128M_mulAdd.c
|
||||||
|
source/f128M_div.c
|
||||||
|
source/f128M_rem.c
|
||||||
|
source/f128M_sqrt.c
|
||||||
|
source/f128M_eq.c
|
||||||
|
source/f128M_le.c
|
||||||
|
source/f128M_lt.c
|
||||||
|
source/f128M_eq_signaling.c
|
||||||
|
source/f128M_le_quiet.c
|
||||||
|
source/f128M_lt_quiet.c
|
||||||
|
)
|
||||||
|
|
||||||
|
set(LIB_SOURCES ${PRIMITIVES} ${SPECIALIZE} ${OTHERS})
|
||||||
|
|
||||||
|
# Define two variables in order not to repeat ourselves.
|
||||||
|
set(LIBRARY_NAME softfloat)
|
||||||
|
|
||||||
|
# Define the library
|
||||||
|
add_library(${LIBRARY_NAME} ${LIB_SOURCES})
|
||||||
|
set_property(TARGET ${LIBRARY_NAME} PROPERTY C_STANDARD 99)
|
||||||
|
# Set the build version. It will be used in the name of the lib, with corresponding
|
||||||
|
# symlinks created. SOVERSION could also be specified for api version.
|
||||||
|
set_target_properties(${LIBRARY_NAME} PROPERTIES
|
||||||
|
VERSION ${VERSION}
|
||||||
|
FRAMEWORK FALSE
|
||||||
|
PUBLIC_HEADER "${LIB_HEADERS}"
|
||||||
|
)
|
||||||
|
target_include_directories (softfloat PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/source/include)
|
||||||
|
|
||||||
|
# Says how and where to install software
|
||||||
|
# Targets:
|
||||||
|
# * <prefix>/lib/<libraries>
|
||||||
|
# * header location after install: <prefix>/include/<project>/*.h
|
||||||
|
# * headers can be included by C++ code `#<project>/Bar.hpp>`
|
||||||
|
install(TARGETS ${LIBRARY_NAME}
|
||||||
|
EXPORT ${PROJECT_NAME}Targets # for downstream dependencies
|
||||||
|
ARCHIVE DESTINATION lib COMPONENT libs # static lib
|
||||||
|
LIBRARY DESTINATION lib COMPONENT libs # shared lib
|
||||||
|
FRAMEWORK DESTINATION bin COMPONENT libs # for mac
|
||||||
|
PUBLIC_HEADER DESTINATION include COMPONENT devel # headers for mac (note the different component -> different package)
|
||||||
|
INCLUDES DESTINATION include # headers
|
||||||
|
)
|
|
@ -0,0 +1,37 @@
|
||||||
|
|
||||||
|
License for Berkeley SoftFloat Release 3e
|
||||||
|
|
||||||
|
John R. Hauser
|
||||||
|
2018 January 20
|
||||||
|
|
||||||
|
The following applies to the whole of SoftFloat Release 3e as well as to
|
||||||
|
each source file individually.
|
||||||
|
|
||||||
|
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 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.
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
|
||||||
|
<HTML>
|
||||||
|
|
||||||
|
<HEAD>
|
||||||
|
<TITLE>Berkeley SoftFloat Package Overview</TITLE>
|
||||||
|
</HEAD>
|
||||||
|
|
||||||
|
<BODY>
|
||||||
|
|
||||||
|
<H1>Package Overview for Berkeley SoftFloat Release 3e</H1>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
John R. Hauser<BR>
|
||||||
|
2018 January 20<BR>
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
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
|
||||||
|
<CODE>softfloat.a</CODE> or <CODE>libsoftfloat.a</CODE>) containing the
|
||||||
|
floating-point subroutines.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
The SoftFloat package is documented in the following files in the
|
||||||
|
<CODE>doc</CODE> subdirectory:
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<TABLE>
|
||||||
|
<TR>
|
||||||
|
<TD><A HREF="doc/SoftFloat.html"><NOBR><CODE>SoftFloat.html</CODE></NOBR></A></TD>
|
||||||
|
<TD>Documentation for using the SoftFloat functions.</TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD><A HREF="doc/SoftFloat-source.html"><NOBR><CODE>SoftFloat-source.html</CODE></NOBR></A></TD>
|
||||||
|
<TD>Documentation for building SoftFloat.</TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD><A HREF="doc/SoftFloat-history.html"><NOBR><CODE>SoftFloat-history.html</CODE></A><CODE> </CODE></NOBR></TD>
|
||||||
|
<TD>History of the major changes to SoftFloat.</TD>
|
||||||
|
</TR>
|
||||||
|
</TABLE>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
Other files in the package comprise the source code for SoftFloat.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
</BODY>
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
|
||||||
|
Package Overview for Berkeley SoftFloat Release 3e
|
||||||
|
|
||||||
|
John R. Hauser
|
||||||
|
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 Documentation for using the SoftFloat functions.
|
||||||
|
SoftFloat-source.html Documentation for building SoftFloat.
|
||||||
|
SoftFloat-history.html History of the major changes to SoftFloat.
|
||||||
|
|
||||||
|
Other files in the package comprise the source code for SoftFloat.
|
||||||
|
|
|
@ -0,0 +1,325 @@
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
#
|
||||||
|
# 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 ?= 8086
|
||||||
|
|
||||||
|
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 = \
|
||||||
|
gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \
|
||||||
|
$(C_INCLUDES) -O2 -o $@
|
||||||
|
MAKELIB = ar crs $@
|
||||||
|
|
||||||
|
OBJ = .o
|
||||||
|
LIB = .a
|
||||||
|
|
||||||
|
OTHER_HEADERS =
|
||||||
|
|
||||||
|
.PHONY: all
|
||||||
|
all: softfloat$(LIB)
|
||||||
|
|
||||||
|
OBJS_PRIMITIVES = \
|
||||||
|
s_compare96M$(OBJ) \
|
||||||
|
s_compare128M$(OBJ) \
|
||||||
|
s_shortShiftLeft64To96M$(OBJ) \
|
||||||
|
s_shortShiftLeftM$(OBJ) \
|
||||||
|
s_shiftLeftM$(OBJ) \
|
||||||
|
s_shortShiftRightM$(OBJ) \
|
||||||
|
s_shortShiftRightJam64$(OBJ) \
|
||||||
|
s_shortShiftRightJamM$(OBJ) \
|
||||||
|
s_shiftRightJam32$(OBJ) \
|
||||||
|
s_shiftRightJam64$(OBJ) \
|
||||||
|
s_shiftRightJamM$(OBJ) \
|
||||||
|
s_shiftRightM$(OBJ) \
|
||||||
|
s_countLeadingZeros8$(OBJ) \
|
||||||
|
s_countLeadingZeros16$(OBJ) \
|
||||||
|
s_countLeadingZeros32$(OBJ) \
|
||||||
|
s_countLeadingZeros64$(OBJ) \
|
||||||
|
s_addM$(OBJ) \
|
||||||
|
s_addCarryM$(OBJ) \
|
||||||
|
s_addComplCarryM$(OBJ) \
|
||||||
|
s_negXM$(OBJ) \
|
||||||
|
s_sub1XM$(OBJ) \
|
||||||
|
s_subM$(OBJ) \
|
||||||
|
s_mul64To128M$(OBJ) \
|
||||||
|
s_mul128MTo256M$(OBJ) \
|
||||||
|
s_approxRecip_1Ks$(OBJ) \
|
||||||
|
s_approxRecip32_1$(OBJ) \
|
||||||
|
s_approxRecipSqrt_1Ks$(OBJ) \
|
||||||
|
s_approxRecipSqrt32_1$(OBJ) \
|
||||||
|
s_remStepMBy32$(OBJ) \
|
||||||
|
|
||||||
|
OBJS_SPECIALIZE = \
|
||||||
|
softfloat_raiseFlags$(OBJ) \
|
||||||
|
s_f16UIToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF16UI$(OBJ) \
|
||||||
|
s_propagateNaNF16UI$(OBJ) \
|
||||||
|
s_f32UIToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF32UI$(OBJ) \
|
||||||
|
s_propagateNaNF32UI$(OBJ) \
|
||||||
|
s_f64UIToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF64UI$(OBJ) \
|
||||||
|
s_propagateNaNF64UI$(OBJ) \
|
||||||
|
extF80M_isSignalingNaN$(OBJ) \
|
||||||
|
s_extF80MToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToExtF80M$(OBJ) \
|
||||||
|
s_propagateNaNExtF80M$(OBJ) \
|
||||||
|
f128M_isSignalingNaN$(OBJ) \
|
||||||
|
s_f128MToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF128M$(OBJ) \
|
||||||
|
s_propagateNaNF128M$(OBJ) \
|
||||||
|
|
||||||
|
OBJS_OTHERS = \
|
||||||
|
s_roundToUI32$(OBJ) \
|
||||||
|
s_roundMToUI64$(OBJ) \
|
||||||
|
s_roundToI32$(OBJ) \
|
||||||
|
s_roundMToI64$(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_tryPropagateNaNExtF80M$(OBJ) \
|
||||||
|
s_invalidExtF80M$(OBJ) \
|
||||||
|
s_normExtF80SigM$(OBJ) \
|
||||||
|
s_roundPackMToExtF80M$(OBJ) \
|
||||||
|
s_normRoundPackMToExtF80M$(OBJ) \
|
||||||
|
s_addExtF80M$(OBJ) \
|
||||||
|
s_compareNonnormExtF80M$(OBJ) \
|
||||||
|
s_isNaNF128M$(OBJ) \
|
||||||
|
s_tryPropagateNaNF128M$(OBJ) \
|
||||||
|
s_invalidF128M$(OBJ) \
|
||||||
|
s_shiftNormSigF128M$(OBJ) \
|
||||||
|
s_roundPackMToF128M$(OBJ) \
|
||||||
|
s_normRoundPackMToF128M$(OBJ) \
|
||||||
|
s_addF128M$(OBJ) \
|
||||||
|
s_mulAddF128M$(OBJ) \
|
||||||
|
softfloat_state$(OBJ) \
|
||||||
|
ui32_to_f16$(OBJ) \
|
||||||
|
ui32_to_f32$(OBJ) \
|
||||||
|
ui32_to_f64$(OBJ) \
|
||||||
|
ui32_to_extF80M$(OBJ) \
|
||||||
|
ui32_to_f128M$(OBJ) \
|
||||||
|
ui64_to_f16$(OBJ) \
|
||||||
|
ui64_to_f32$(OBJ) \
|
||||||
|
ui64_to_f64$(OBJ) \
|
||||||
|
ui64_to_extF80M$(OBJ) \
|
||||||
|
ui64_to_f128M$(OBJ) \
|
||||||
|
i32_to_f16$(OBJ) \
|
||||||
|
i32_to_f32$(OBJ) \
|
||||||
|
i32_to_f64$(OBJ) \
|
||||||
|
i32_to_extF80M$(OBJ) \
|
||||||
|
i32_to_f128M$(OBJ) \
|
||||||
|
i64_to_f16$(OBJ) \
|
||||||
|
i64_to_f32$(OBJ) \
|
||||||
|
i64_to_f64$(OBJ) \
|
||||||
|
i64_to_extF80M$(OBJ) \
|
||||||
|
i64_to_f128M$(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_extF80M$(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_f16$(OBJ) \
|
||||||
|
f32_to_f64$(OBJ) \
|
||||||
|
f32_to_extF80M$(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_extF80M$(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) \
|
||||||
|
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) \
|
||||||
|
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_f64$(OBJ) \
|
||||||
|
f128M_to_extF80M$(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)
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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
|
||||||
|
#include "opts-GCC.h"
|
||||||
|
|
|
@ -0,0 +1,325 @@
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
#
|
||||||
|
# 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 ?= 8086-SSE
|
||||||
|
|
||||||
|
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 = \
|
||||||
|
gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \
|
||||||
|
$(C_INCLUDES) -O2 -o $@
|
||||||
|
MAKELIB = ar crs $@
|
||||||
|
|
||||||
|
OBJ = .o
|
||||||
|
LIB = .a
|
||||||
|
|
||||||
|
OTHER_HEADERS =
|
||||||
|
|
||||||
|
.PHONY: all
|
||||||
|
all: softfloat$(LIB)
|
||||||
|
|
||||||
|
OBJS_PRIMITIVES = \
|
||||||
|
s_compare96M$(OBJ) \
|
||||||
|
s_compare128M$(OBJ) \
|
||||||
|
s_shortShiftLeft64To96M$(OBJ) \
|
||||||
|
s_shortShiftLeftM$(OBJ) \
|
||||||
|
s_shiftLeftM$(OBJ) \
|
||||||
|
s_shortShiftRightM$(OBJ) \
|
||||||
|
s_shortShiftRightJam64$(OBJ) \
|
||||||
|
s_shortShiftRightJamM$(OBJ) \
|
||||||
|
s_shiftRightJam32$(OBJ) \
|
||||||
|
s_shiftRightJam64$(OBJ) \
|
||||||
|
s_shiftRightJamM$(OBJ) \
|
||||||
|
s_shiftRightM$(OBJ) \
|
||||||
|
s_countLeadingZeros8$(OBJ) \
|
||||||
|
s_countLeadingZeros16$(OBJ) \
|
||||||
|
s_countLeadingZeros32$(OBJ) \
|
||||||
|
s_countLeadingZeros64$(OBJ) \
|
||||||
|
s_addM$(OBJ) \
|
||||||
|
s_addCarryM$(OBJ) \
|
||||||
|
s_addComplCarryM$(OBJ) \
|
||||||
|
s_negXM$(OBJ) \
|
||||||
|
s_sub1XM$(OBJ) \
|
||||||
|
s_subM$(OBJ) \
|
||||||
|
s_mul64To128M$(OBJ) \
|
||||||
|
s_mul128MTo256M$(OBJ) \
|
||||||
|
s_approxRecip_1Ks$(OBJ) \
|
||||||
|
s_approxRecip32_1$(OBJ) \
|
||||||
|
s_approxRecipSqrt_1Ks$(OBJ) \
|
||||||
|
s_approxRecipSqrt32_1$(OBJ) \
|
||||||
|
s_remStepMBy32$(OBJ) \
|
||||||
|
|
||||||
|
OBJS_SPECIALIZE = \
|
||||||
|
softfloat_raiseFlags$(OBJ) \
|
||||||
|
s_f16UIToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF16UI$(OBJ) \
|
||||||
|
s_propagateNaNF16UI$(OBJ) \
|
||||||
|
s_f32UIToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF32UI$(OBJ) \
|
||||||
|
s_propagateNaNF32UI$(OBJ) \
|
||||||
|
s_f64UIToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF64UI$(OBJ) \
|
||||||
|
s_propagateNaNF64UI$(OBJ) \
|
||||||
|
extF80M_isSignalingNaN$(OBJ) \
|
||||||
|
s_extF80MToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToExtF80M$(OBJ) \
|
||||||
|
s_propagateNaNExtF80M$(OBJ) \
|
||||||
|
f128M_isSignalingNaN$(OBJ) \
|
||||||
|
s_f128MToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF128M$(OBJ) \
|
||||||
|
s_propagateNaNF128M$(OBJ) \
|
||||||
|
|
||||||
|
OBJS_OTHERS = \
|
||||||
|
s_roundToUI32$(OBJ) \
|
||||||
|
s_roundMToUI64$(OBJ) \
|
||||||
|
s_roundToI32$(OBJ) \
|
||||||
|
s_roundMToI64$(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_tryPropagateNaNExtF80M$(OBJ) \
|
||||||
|
s_invalidExtF80M$(OBJ) \
|
||||||
|
s_normExtF80SigM$(OBJ) \
|
||||||
|
s_roundPackMToExtF80M$(OBJ) \
|
||||||
|
s_normRoundPackMToExtF80M$(OBJ) \
|
||||||
|
s_addExtF80M$(OBJ) \
|
||||||
|
s_compareNonnormExtF80M$(OBJ) \
|
||||||
|
s_isNaNF128M$(OBJ) \
|
||||||
|
s_tryPropagateNaNF128M$(OBJ) \
|
||||||
|
s_invalidF128M$(OBJ) \
|
||||||
|
s_shiftNormSigF128M$(OBJ) \
|
||||||
|
s_roundPackMToF128M$(OBJ) \
|
||||||
|
s_normRoundPackMToF128M$(OBJ) \
|
||||||
|
s_addF128M$(OBJ) \
|
||||||
|
s_mulAddF128M$(OBJ) \
|
||||||
|
softfloat_state$(OBJ) \
|
||||||
|
ui32_to_f16$(OBJ) \
|
||||||
|
ui32_to_f32$(OBJ) \
|
||||||
|
ui32_to_f64$(OBJ) \
|
||||||
|
ui32_to_extF80M$(OBJ) \
|
||||||
|
ui32_to_f128M$(OBJ) \
|
||||||
|
ui64_to_f16$(OBJ) \
|
||||||
|
ui64_to_f32$(OBJ) \
|
||||||
|
ui64_to_f64$(OBJ) \
|
||||||
|
ui64_to_extF80M$(OBJ) \
|
||||||
|
ui64_to_f128M$(OBJ) \
|
||||||
|
i32_to_f16$(OBJ) \
|
||||||
|
i32_to_f32$(OBJ) \
|
||||||
|
i32_to_f64$(OBJ) \
|
||||||
|
i32_to_extF80M$(OBJ) \
|
||||||
|
i32_to_f128M$(OBJ) \
|
||||||
|
i64_to_f16$(OBJ) \
|
||||||
|
i64_to_f32$(OBJ) \
|
||||||
|
i64_to_f64$(OBJ) \
|
||||||
|
i64_to_extF80M$(OBJ) \
|
||||||
|
i64_to_f128M$(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_extF80M$(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_f16$(OBJ) \
|
||||||
|
f32_to_f64$(OBJ) \
|
||||||
|
f32_to_extF80M$(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_extF80M$(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) \
|
||||||
|
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) \
|
||||||
|
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_f64$(OBJ) \
|
||||||
|
f128M_to_extF80M$(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)
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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
|
||||||
|
#include "opts-GCC.h"
|
||||||
|
|
|
@ -0,0 +1,323 @@
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
#
|
||||||
|
# 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 ?= ARM-VFPv2
|
||||||
|
|
||||||
|
SOFTFLOAT_OPTS ?= -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5
|
||||||
|
|
||||||
|
DELETE = rm -f
|
||||||
|
C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
|
||||||
|
COMPILE_C = \
|
||||||
|
gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \
|
||||||
|
$(C_INCLUDES) -O2 -o $@
|
||||||
|
MAKELIB = ar crs $@
|
||||||
|
|
||||||
|
OBJ = .o
|
||||||
|
LIB = .a
|
||||||
|
|
||||||
|
OTHER_HEADERS =
|
||||||
|
|
||||||
|
.PHONY: all
|
||||||
|
all: softfloat$(LIB)
|
||||||
|
|
||||||
|
OBJS_PRIMITIVES = \
|
||||||
|
s_compare96M$(OBJ) \
|
||||||
|
s_compare128M$(OBJ) \
|
||||||
|
s_shortShiftLeft64To96M$(OBJ) \
|
||||||
|
s_shortShiftLeftM$(OBJ) \
|
||||||
|
s_shiftLeftM$(OBJ) \
|
||||||
|
s_shortShiftRightM$(OBJ) \
|
||||||
|
s_shortShiftRightJam64$(OBJ) \
|
||||||
|
s_shortShiftRightJamM$(OBJ) \
|
||||||
|
s_shiftRightJam32$(OBJ) \
|
||||||
|
s_shiftRightJam64$(OBJ) \
|
||||||
|
s_shiftRightJamM$(OBJ) \
|
||||||
|
s_shiftRightM$(OBJ) \
|
||||||
|
s_countLeadingZeros8$(OBJ) \
|
||||||
|
s_countLeadingZeros16$(OBJ) \
|
||||||
|
s_countLeadingZeros32$(OBJ) \
|
||||||
|
s_countLeadingZeros64$(OBJ) \
|
||||||
|
s_addM$(OBJ) \
|
||||||
|
s_addCarryM$(OBJ) \
|
||||||
|
s_addComplCarryM$(OBJ) \
|
||||||
|
s_negXM$(OBJ) \
|
||||||
|
s_sub1XM$(OBJ) \
|
||||||
|
s_subM$(OBJ) \
|
||||||
|
s_mul64To128M$(OBJ) \
|
||||||
|
s_mul128MTo256M$(OBJ) \
|
||||||
|
s_approxRecip_1Ks$(OBJ) \
|
||||||
|
s_approxRecip32_1$(OBJ) \
|
||||||
|
s_approxRecipSqrt_1Ks$(OBJ) \
|
||||||
|
s_approxRecipSqrt32_1$(OBJ) \
|
||||||
|
s_remStepMBy32$(OBJ) \
|
||||||
|
|
||||||
|
OBJS_SPECIALIZE = \
|
||||||
|
softfloat_raiseFlags$(OBJ) \
|
||||||
|
s_f16UIToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF16UI$(OBJ) \
|
||||||
|
s_propagateNaNF16UI$(OBJ) \
|
||||||
|
s_f32UIToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF32UI$(OBJ) \
|
||||||
|
s_propagateNaNF32UI$(OBJ) \
|
||||||
|
s_f64UIToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF64UI$(OBJ) \
|
||||||
|
s_propagateNaNF64UI$(OBJ) \
|
||||||
|
extF80M_isSignalingNaN$(OBJ) \
|
||||||
|
s_extF80MToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToExtF80M$(OBJ) \
|
||||||
|
s_propagateNaNExtF80M$(OBJ) \
|
||||||
|
f128M_isSignalingNaN$(OBJ) \
|
||||||
|
s_f128MToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF128M$(OBJ) \
|
||||||
|
s_propagateNaNF128M$(OBJ) \
|
||||||
|
|
||||||
|
OBJS_OTHERS = \
|
||||||
|
s_roundToUI32$(OBJ) \
|
||||||
|
s_roundMToUI64$(OBJ) \
|
||||||
|
s_roundToI32$(OBJ) \
|
||||||
|
s_roundMToI64$(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_tryPropagateNaNExtF80M$(OBJ) \
|
||||||
|
s_invalidExtF80M$(OBJ) \
|
||||||
|
s_normExtF80SigM$(OBJ) \
|
||||||
|
s_roundPackMToExtF80M$(OBJ) \
|
||||||
|
s_normRoundPackMToExtF80M$(OBJ) \
|
||||||
|
s_addExtF80M$(OBJ) \
|
||||||
|
s_compareNonnormExtF80M$(OBJ) \
|
||||||
|
s_isNaNF128M$(OBJ) \
|
||||||
|
s_tryPropagateNaNF128M$(OBJ) \
|
||||||
|
s_invalidF128M$(OBJ) \
|
||||||
|
s_shiftNormSigF128M$(OBJ) \
|
||||||
|
s_roundPackMToF128M$(OBJ) \
|
||||||
|
s_normRoundPackMToF128M$(OBJ) \
|
||||||
|
s_addF128M$(OBJ) \
|
||||||
|
s_mulAddF128M$(OBJ) \
|
||||||
|
softfloat_state$(OBJ) \
|
||||||
|
ui32_to_f16$(OBJ) \
|
||||||
|
ui32_to_f32$(OBJ) \
|
||||||
|
ui32_to_f64$(OBJ) \
|
||||||
|
ui32_to_extF80M$(OBJ) \
|
||||||
|
ui32_to_f128M$(OBJ) \
|
||||||
|
ui64_to_f16$(OBJ) \
|
||||||
|
ui64_to_f32$(OBJ) \
|
||||||
|
ui64_to_f64$(OBJ) \
|
||||||
|
ui64_to_extF80M$(OBJ) \
|
||||||
|
ui64_to_f128M$(OBJ) \
|
||||||
|
i32_to_f16$(OBJ) \
|
||||||
|
i32_to_f32$(OBJ) \
|
||||||
|
i32_to_f64$(OBJ) \
|
||||||
|
i32_to_extF80M$(OBJ) \
|
||||||
|
i32_to_f128M$(OBJ) \
|
||||||
|
i64_to_f16$(OBJ) \
|
||||||
|
i64_to_f32$(OBJ) \
|
||||||
|
i64_to_f64$(OBJ) \
|
||||||
|
i64_to_extF80M$(OBJ) \
|
||||||
|
i64_to_f128M$(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_extF80M$(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_f16$(OBJ) \
|
||||||
|
f32_to_f64$(OBJ) \
|
||||||
|
f32_to_extF80M$(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_extF80M$(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) \
|
||||||
|
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) \
|
||||||
|
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_f64$(OBJ) \
|
||||||
|
f128M_to_extF80M$(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)
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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
|
||||||
|
#include "opts-GCC.h"
|
||||||
|
|
|
@ -0,0 +1,390 @@
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
#
|
||||||
|
# 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 ?= 8086-SSE
|
||||||
|
|
||||||
|
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 = \
|
||||||
|
gcc -c -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_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_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) \
|
||||||
|
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_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)
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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
|
||||||
|
#define INLINE static
|
||||||
|
#else
|
||||||
|
#define INLINE extern inline
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
#define SOFTFLOAT_BUILTIN_CLZ 1
|
||||||
|
#define SOFTFLOAT_INTRINSIC_INT128 1
|
||||||
|
#include "opts-GCC.h"
|
||||||
|
|
|
@ -0,0 +1,325 @@
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
#
|
||||||
|
# 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 ?= 8086
|
||||||
|
|
||||||
|
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 = \
|
||||||
|
gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \
|
||||||
|
$(C_INCLUDES) -O2 -o $@
|
||||||
|
MAKELIB = ar crs $@
|
||||||
|
|
||||||
|
OBJ = .o
|
||||||
|
LIB = .a
|
||||||
|
|
||||||
|
OTHER_HEADERS =
|
||||||
|
|
||||||
|
.PHONY: all
|
||||||
|
all: softfloat$(LIB)
|
||||||
|
|
||||||
|
OBJS_PRIMITIVES = \
|
||||||
|
s_compare96M$(OBJ) \
|
||||||
|
s_compare128M$(OBJ) \
|
||||||
|
s_shortShiftLeft64To96M$(OBJ) \
|
||||||
|
s_shortShiftLeftM$(OBJ) \
|
||||||
|
s_shiftLeftM$(OBJ) \
|
||||||
|
s_shortShiftRightM$(OBJ) \
|
||||||
|
s_shortShiftRightJam64$(OBJ) \
|
||||||
|
s_shortShiftRightJamM$(OBJ) \
|
||||||
|
s_shiftRightJam32$(OBJ) \
|
||||||
|
s_shiftRightJam64$(OBJ) \
|
||||||
|
s_shiftRightJamM$(OBJ) \
|
||||||
|
s_shiftRightM$(OBJ) \
|
||||||
|
s_countLeadingZeros8$(OBJ) \
|
||||||
|
s_countLeadingZeros16$(OBJ) \
|
||||||
|
s_countLeadingZeros32$(OBJ) \
|
||||||
|
s_countLeadingZeros64$(OBJ) \
|
||||||
|
s_addM$(OBJ) \
|
||||||
|
s_addCarryM$(OBJ) \
|
||||||
|
s_addComplCarryM$(OBJ) \
|
||||||
|
s_negXM$(OBJ) \
|
||||||
|
s_sub1XM$(OBJ) \
|
||||||
|
s_subM$(OBJ) \
|
||||||
|
s_mul64To128M$(OBJ) \
|
||||||
|
s_mul128MTo256M$(OBJ) \
|
||||||
|
s_approxRecip_1Ks$(OBJ) \
|
||||||
|
s_approxRecip32_1$(OBJ) \
|
||||||
|
s_approxRecipSqrt_1Ks$(OBJ) \
|
||||||
|
s_approxRecipSqrt32_1$(OBJ) \
|
||||||
|
s_remStepMBy32$(OBJ) \
|
||||||
|
|
||||||
|
OBJS_SPECIALIZE = \
|
||||||
|
softfloat_raiseFlags$(OBJ) \
|
||||||
|
s_f16UIToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF16UI$(OBJ) \
|
||||||
|
s_propagateNaNF16UI$(OBJ) \
|
||||||
|
s_f32UIToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF32UI$(OBJ) \
|
||||||
|
s_propagateNaNF32UI$(OBJ) \
|
||||||
|
s_f64UIToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF64UI$(OBJ) \
|
||||||
|
s_propagateNaNF64UI$(OBJ) \
|
||||||
|
extF80M_isSignalingNaN$(OBJ) \
|
||||||
|
s_extF80MToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToExtF80M$(OBJ) \
|
||||||
|
s_propagateNaNExtF80M$(OBJ) \
|
||||||
|
f128M_isSignalingNaN$(OBJ) \
|
||||||
|
s_f128MToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF128M$(OBJ) \
|
||||||
|
s_propagateNaNF128M$(OBJ) \
|
||||||
|
|
||||||
|
OBJS_OTHERS = \
|
||||||
|
s_roundToUI32$(OBJ) \
|
||||||
|
s_roundMToUI64$(OBJ) \
|
||||||
|
s_roundToI32$(OBJ) \
|
||||||
|
s_roundMToI64$(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_tryPropagateNaNExtF80M$(OBJ) \
|
||||||
|
s_invalidExtF80M$(OBJ) \
|
||||||
|
s_normExtF80SigM$(OBJ) \
|
||||||
|
s_roundPackMToExtF80M$(OBJ) \
|
||||||
|
s_normRoundPackMToExtF80M$(OBJ) \
|
||||||
|
s_addExtF80M$(OBJ) \
|
||||||
|
s_compareNonnormExtF80M$(OBJ) \
|
||||||
|
s_isNaNF128M$(OBJ) \
|
||||||
|
s_tryPropagateNaNF128M$(OBJ) \
|
||||||
|
s_invalidF128M$(OBJ) \
|
||||||
|
s_shiftNormSigF128M$(OBJ) \
|
||||||
|
s_roundPackMToF128M$(OBJ) \
|
||||||
|
s_normRoundPackMToF128M$(OBJ) \
|
||||||
|
s_addF128M$(OBJ) \
|
||||||
|
s_mulAddF128M$(OBJ) \
|
||||||
|
softfloat_state$(OBJ) \
|
||||||
|
ui32_to_f16$(OBJ) \
|
||||||
|
ui32_to_f32$(OBJ) \
|
||||||
|
ui32_to_f64$(OBJ) \
|
||||||
|
ui32_to_extF80M$(OBJ) \
|
||||||
|
ui32_to_f128M$(OBJ) \
|
||||||
|
ui64_to_f16$(OBJ) \
|
||||||
|
ui64_to_f32$(OBJ) \
|
||||||
|
ui64_to_f64$(OBJ) \
|
||||||
|
ui64_to_extF80M$(OBJ) \
|
||||||
|
ui64_to_f128M$(OBJ) \
|
||||||
|
i32_to_f16$(OBJ) \
|
||||||
|
i32_to_f32$(OBJ) \
|
||||||
|
i32_to_f64$(OBJ) \
|
||||||
|
i32_to_extF80M$(OBJ) \
|
||||||
|
i32_to_f128M$(OBJ) \
|
||||||
|
i64_to_f16$(OBJ) \
|
||||||
|
i64_to_f32$(OBJ) \
|
||||||
|
i64_to_f64$(OBJ) \
|
||||||
|
i64_to_extF80M$(OBJ) \
|
||||||
|
i64_to_f128M$(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_extF80M$(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_f16$(OBJ) \
|
||||||
|
f32_to_f64$(OBJ) \
|
||||||
|
f32_to_extF80M$(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_extF80M$(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) \
|
||||||
|
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) \
|
||||||
|
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_f64$(OBJ) \
|
||||||
|
f128M_to_extF80M$(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)
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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
|
||||||
|
#include "opts-GCC.h"
|
||||||
|
|
|
@ -0,0 +1,325 @@
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
#
|
||||||
|
# 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 ?= 8086-SSE
|
||||||
|
|
||||||
|
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 = \
|
||||||
|
gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \
|
||||||
|
$(C_INCLUDES) -O2 -o $@
|
||||||
|
MAKELIB = ar crs $@
|
||||||
|
|
||||||
|
OBJ = .o
|
||||||
|
LIB = .a
|
||||||
|
|
||||||
|
OTHER_HEADERS =
|
||||||
|
|
||||||
|
.PHONY: all
|
||||||
|
all: softfloat$(LIB)
|
||||||
|
|
||||||
|
OBJS_PRIMITIVES = \
|
||||||
|
s_compare96M$(OBJ) \
|
||||||
|
s_compare128M$(OBJ) \
|
||||||
|
s_shortShiftLeft64To96M$(OBJ) \
|
||||||
|
s_shortShiftLeftM$(OBJ) \
|
||||||
|
s_shiftLeftM$(OBJ) \
|
||||||
|
s_shortShiftRightM$(OBJ) \
|
||||||
|
s_shortShiftRightJam64$(OBJ) \
|
||||||
|
s_shortShiftRightJamM$(OBJ) \
|
||||||
|
s_shiftRightJam32$(OBJ) \
|
||||||
|
s_shiftRightJam64$(OBJ) \
|
||||||
|
s_shiftRightJamM$(OBJ) \
|
||||||
|
s_shiftRightM$(OBJ) \
|
||||||
|
s_countLeadingZeros8$(OBJ) \
|
||||||
|
s_countLeadingZeros16$(OBJ) \
|
||||||
|
s_countLeadingZeros32$(OBJ) \
|
||||||
|
s_countLeadingZeros64$(OBJ) \
|
||||||
|
s_addM$(OBJ) \
|
||||||
|
s_addCarryM$(OBJ) \
|
||||||
|
s_addComplCarryM$(OBJ) \
|
||||||
|
s_negXM$(OBJ) \
|
||||||
|
s_sub1XM$(OBJ) \
|
||||||
|
s_subM$(OBJ) \
|
||||||
|
s_mul64To128M$(OBJ) \
|
||||||
|
s_mul128MTo256M$(OBJ) \
|
||||||
|
s_approxRecip_1Ks$(OBJ) \
|
||||||
|
s_approxRecip32_1$(OBJ) \
|
||||||
|
s_approxRecipSqrt_1Ks$(OBJ) \
|
||||||
|
s_approxRecipSqrt32_1$(OBJ) \
|
||||||
|
s_remStepMBy32$(OBJ) \
|
||||||
|
|
||||||
|
OBJS_SPECIALIZE = \
|
||||||
|
softfloat_raiseFlags$(OBJ) \
|
||||||
|
s_f16UIToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF16UI$(OBJ) \
|
||||||
|
s_propagateNaNF16UI$(OBJ) \
|
||||||
|
s_f32UIToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF32UI$(OBJ) \
|
||||||
|
s_propagateNaNF32UI$(OBJ) \
|
||||||
|
s_f64UIToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF64UI$(OBJ) \
|
||||||
|
s_propagateNaNF64UI$(OBJ) \
|
||||||
|
extF80M_isSignalingNaN$(OBJ) \
|
||||||
|
s_extF80MToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToExtF80M$(OBJ) \
|
||||||
|
s_propagateNaNExtF80M$(OBJ) \
|
||||||
|
f128M_isSignalingNaN$(OBJ) \
|
||||||
|
s_f128MToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF128M$(OBJ) \
|
||||||
|
s_propagateNaNF128M$(OBJ) \
|
||||||
|
|
||||||
|
OBJS_OTHERS = \
|
||||||
|
s_roundToUI32$(OBJ) \
|
||||||
|
s_roundMToUI64$(OBJ) \
|
||||||
|
s_roundToI32$(OBJ) \
|
||||||
|
s_roundMToI64$(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_tryPropagateNaNExtF80M$(OBJ) \
|
||||||
|
s_invalidExtF80M$(OBJ) \
|
||||||
|
s_normExtF80SigM$(OBJ) \
|
||||||
|
s_roundPackMToExtF80M$(OBJ) \
|
||||||
|
s_normRoundPackMToExtF80M$(OBJ) \
|
||||||
|
s_addExtF80M$(OBJ) \
|
||||||
|
s_compareNonnormExtF80M$(OBJ) \
|
||||||
|
s_isNaNF128M$(OBJ) \
|
||||||
|
s_tryPropagateNaNF128M$(OBJ) \
|
||||||
|
s_invalidF128M$(OBJ) \
|
||||||
|
s_shiftNormSigF128M$(OBJ) \
|
||||||
|
s_roundPackMToF128M$(OBJ) \
|
||||||
|
s_normRoundPackMToF128M$(OBJ) \
|
||||||
|
s_addF128M$(OBJ) \
|
||||||
|
s_mulAddF128M$(OBJ) \
|
||||||
|
softfloat_state$(OBJ) \
|
||||||
|
ui32_to_f16$(OBJ) \
|
||||||
|
ui32_to_f32$(OBJ) \
|
||||||
|
ui32_to_f64$(OBJ) \
|
||||||
|
ui32_to_extF80M$(OBJ) \
|
||||||
|
ui32_to_f128M$(OBJ) \
|
||||||
|
ui64_to_f16$(OBJ) \
|
||||||
|
ui64_to_f32$(OBJ) \
|
||||||
|
ui64_to_f64$(OBJ) \
|
||||||
|
ui64_to_extF80M$(OBJ) \
|
||||||
|
ui64_to_f128M$(OBJ) \
|
||||||
|
i32_to_f16$(OBJ) \
|
||||||
|
i32_to_f32$(OBJ) \
|
||||||
|
i32_to_f64$(OBJ) \
|
||||||
|
i32_to_extF80M$(OBJ) \
|
||||||
|
i32_to_f128M$(OBJ) \
|
||||||
|
i64_to_f16$(OBJ) \
|
||||||
|
i64_to_f32$(OBJ) \
|
||||||
|
i64_to_f64$(OBJ) \
|
||||||
|
i64_to_extF80M$(OBJ) \
|
||||||
|
i64_to_f128M$(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_extF80M$(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_f16$(OBJ) \
|
||||||
|
f32_to_f64$(OBJ) \
|
||||||
|
f32_to_extF80M$(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_extF80M$(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) \
|
||||||
|
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) \
|
||||||
|
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_f64$(OBJ) \
|
||||||
|
f128M_to_extF80M$(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)
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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
|
||||||
|
#include "opts-GCC.h"
|
||||||
|
|
|
@ -0,0 +1,390 @@
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
#
|
||||||
|
# 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 ?= 8086-SSE
|
||||||
|
|
||||||
|
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 = \
|
||||||
|
x86_64-w64-mingw32-gcc -c -Werror-implicit-function-declaration \
|
||||||
|
-DSOFTFLOAT_FAST_INT64 $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@
|
||||||
|
MAKELIB = x86_64-w64-mingw32-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_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_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) \
|
||||||
|
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_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)
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -0,0 +1,391 @@
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
#
|
||||||
|
# This Makefile template 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.
|
||||||
|
#
|
||||||
|
#=============================================================================
|
||||||
|
|
||||||
|
# Edit lines marked with `==>'. See "SoftFloat-source.html".
|
||||||
|
|
||||||
|
==> SOURCE_DIR ?= ../../source
|
||||||
|
==> SPECIALIZE_TYPE ?= 8086
|
||||||
|
|
||||||
|
==> 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 = \
|
||||||
|
==> cc -c -DSOFTFLOAT_FAST_INT64 $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@
|
||||||
|
==> MAKELIB = ar crs $@
|
||||||
|
|
||||||
|
==> OBJ = .o
|
||||||
|
==> LIB = .a
|
||||||
|
|
||||||
|
==> OTHER_HEADERS =
|
||||||
|
|
||||||
|
.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_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_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) \
|
||||||
|
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_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)
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
This C header template is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||||
|
Package, Release 3e, by John R. Hauser.
|
||||||
|
|
||||||
|
Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
||||||
|
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
// Edit lines marked with `==>'. See "SoftFloat-source.html".
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
==> #define LITTLEENDIAN 1
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
==> #define INLINE inline
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
==> #define THREAD_LOCAL _Thread_local
|
||||||
|
|
|
@ -0,0 +1,325 @@
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
#
|
||||||
|
# This Makefile template 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.
|
||||||
|
#
|
||||||
|
#=============================================================================
|
||||||
|
|
||||||
|
# Edit lines marked with `==>'. See "SoftFloat-source.html".
|
||||||
|
|
||||||
|
==> SOURCE_DIR ?= ../../source
|
||||||
|
==> SPECIALIZE_TYPE ?= 8086
|
||||||
|
|
||||||
|
==> 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 = cc -c $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@
|
||||||
|
==> MAKELIB = ar crs $@
|
||||||
|
|
||||||
|
==> OBJ = .o
|
||||||
|
==> LIB = .a
|
||||||
|
|
||||||
|
==> OTHER_HEADERS =
|
||||||
|
|
||||||
|
.PHONY: all
|
||||||
|
all: softfloat$(LIB)
|
||||||
|
|
||||||
|
OBJS_PRIMITIVES = \
|
||||||
|
s_compare96M$(OBJ) \
|
||||||
|
s_compare128M$(OBJ) \
|
||||||
|
s_shortShiftLeft64To96M$(OBJ) \
|
||||||
|
s_shortShiftLeftM$(OBJ) \
|
||||||
|
s_shiftLeftM$(OBJ) \
|
||||||
|
s_shortShiftRightM$(OBJ) \
|
||||||
|
s_shortShiftRightJam64$(OBJ) \
|
||||||
|
s_shortShiftRightJamM$(OBJ) \
|
||||||
|
s_shiftRightJam32$(OBJ) \
|
||||||
|
s_shiftRightJam64$(OBJ) \
|
||||||
|
s_shiftRightJamM$(OBJ) \
|
||||||
|
s_shiftRightM$(OBJ) \
|
||||||
|
s_countLeadingZeros8$(OBJ) \
|
||||||
|
s_countLeadingZeros16$(OBJ) \
|
||||||
|
s_countLeadingZeros32$(OBJ) \
|
||||||
|
s_countLeadingZeros64$(OBJ) \
|
||||||
|
s_addM$(OBJ) \
|
||||||
|
s_addCarryM$(OBJ) \
|
||||||
|
s_addComplCarryM$(OBJ) \
|
||||||
|
s_negXM$(OBJ) \
|
||||||
|
s_sub1XM$(OBJ) \
|
||||||
|
s_subM$(OBJ) \
|
||||||
|
s_mul64To128M$(OBJ) \
|
||||||
|
s_mul128MTo256M$(OBJ) \
|
||||||
|
s_approxRecip_1Ks$(OBJ) \
|
||||||
|
s_approxRecip32_1$(OBJ) \
|
||||||
|
s_approxRecipSqrt_1Ks$(OBJ) \
|
||||||
|
s_approxRecipSqrt32_1$(OBJ) \
|
||||||
|
s_remStepMBy32$(OBJ) \
|
||||||
|
|
||||||
|
OBJS_SPECIALIZE = \
|
||||||
|
softfloat_raiseFlags$(OBJ) \
|
||||||
|
s_f16UIToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF16UI$(OBJ) \
|
||||||
|
s_propagateNaNF16UI$(OBJ) \
|
||||||
|
s_f32UIToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF32UI$(OBJ) \
|
||||||
|
s_propagateNaNF32UI$(OBJ) \
|
||||||
|
s_f64UIToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF64UI$(OBJ) \
|
||||||
|
s_propagateNaNF64UI$(OBJ) \
|
||||||
|
extF80M_isSignalingNaN$(OBJ) \
|
||||||
|
s_extF80MToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToExtF80M$(OBJ) \
|
||||||
|
s_propagateNaNExtF80M$(OBJ) \
|
||||||
|
f128M_isSignalingNaN$(OBJ) \
|
||||||
|
s_f128MToCommonNaN$(OBJ) \
|
||||||
|
s_commonNaNToF128M$(OBJ) \
|
||||||
|
s_propagateNaNF128M$(OBJ) \
|
||||||
|
|
||||||
|
OBJS_OTHERS = \
|
||||||
|
s_roundToUI32$(OBJ) \
|
||||||
|
s_roundMToUI64$(OBJ) \
|
||||||
|
s_roundToI32$(OBJ) \
|
||||||
|
s_roundMToI64$(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_tryPropagateNaNExtF80M$(OBJ) \
|
||||||
|
s_invalidExtF80M$(OBJ) \
|
||||||
|
s_normExtF80SigM$(OBJ) \
|
||||||
|
s_roundPackMToExtF80M$(OBJ) \
|
||||||
|
s_normRoundPackMToExtF80M$(OBJ) \
|
||||||
|
s_addExtF80M$(OBJ) \
|
||||||
|
s_compareNonnormExtF80M$(OBJ) \
|
||||||
|
s_isNaNF128M$(OBJ) \
|
||||||
|
s_tryPropagateNaNF128M$(OBJ) \
|
||||||
|
s_invalidF128M$(OBJ) \
|
||||||
|
s_shiftNormSigF128M$(OBJ) \
|
||||||
|
s_roundPackMToF128M$(OBJ) \
|
||||||
|
s_normRoundPackMToF128M$(OBJ) \
|
||||||
|
s_addF128M$(OBJ) \
|
||||||
|
s_mulAddF128M$(OBJ) \
|
||||||
|
softfloat_state$(OBJ) \
|
||||||
|
ui32_to_f16$(OBJ) \
|
||||||
|
ui32_to_f32$(OBJ) \
|
||||||
|
ui32_to_f64$(OBJ) \
|
||||||
|
ui32_to_extF80M$(OBJ) \
|
||||||
|
ui32_to_f128M$(OBJ) \
|
||||||
|
ui64_to_f16$(OBJ) \
|
||||||
|
ui64_to_f32$(OBJ) \
|
||||||
|
ui64_to_f64$(OBJ) \
|
||||||
|
ui64_to_extF80M$(OBJ) \
|
||||||
|
ui64_to_f128M$(OBJ) \
|
||||||
|
i32_to_f16$(OBJ) \
|
||||||
|
i32_to_f32$(OBJ) \
|
||||||
|
i32_to_f64$(OBJ) \
|
||||||
|
i32_to_extF80M$(OBJ) \
|
||||||
|
i32_to_f128M$(OBJ) \
|
||||||
|
i64_to_f16$(OBJ) \
|
||||||
|
i64_to_f32$(OBJ) \
|
||||||
|
i64_to_f64$(OBJ) \
|
||||||
|
i64_to_extF80M$(OBJ) \
|
||||||
|
i64_to_f128M$(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_extF80M$(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_f16$(OBJ) \
|
||||||
|
f32_to_f64$(OBJ) \
|
||||||
|
f32_to_extF80M$(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_extF80M$(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) \
|
||||||
|
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) \
|
||||||
|
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_f64$(OBJ) \
|
||||||
|
f128M_to_extF80M$(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)
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
This C header template is part of the SoftFloat IEEE Floating-Point Arithmetic
|
||||||
|
Package, Release 3e, by John R. Hauser.
|
||||||
|
|
||||||
|
Copyright 2011, 2012, 2013, 2014, 2015, 2016 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.
|
||||||
|
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
// Edit lines marked with `==>'. See "SoftFloat-source.html".
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
==> #define LITTLEENDIAN 1
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
==> #define INLINE inline
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
==> #define THREAD_LOCAL _Thread_local
|
||||||
|
|
|
@ -0,0 +1,258 @@
|
||||||
|
|
||||||
|
<HTML>
|
||||||
|
|
||||||
|
<HEAD>
|
||||||
|
<TITLE>Berkeley SoftFloat History</TITLE>
|
||||||
|
</HEAD>
|
||||||
|
|
||||||
|
<BODY>
|
||||||
|
|
||||||
|
<H1>History of Berkeley SoftFloat, to Release 3e</H1>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
John R. Hauser<BR>
|
||||||
|
2018 January 20<BR>
|
||||||
|
</P>
|
||||||
|
|
||||||
|
|
||||||
|
<H3>Release 3e (2018 January)</H3>
|
||||||
|
|
||||||
|
<UL>
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
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.
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Modified the behavior of rounding mode <CODE>odd</CODE> when rounding to an
|
||||||
|
integer value (either conversion to an integer format or a
|
||||||
|
‘<CODE>roundToInt</CODE>’ function).
|
||||||
|
Previously, for those cases only, rounding mode <CODE>odd</CODE> acted the same
|
||||||
|
as rounding to minimum magnitude.
|
||||||
|
Now all operations are rounded consistently.
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Fixed some errors in the specialization code modeling Intel x86 floating-point,
|
||||||
|
specifically the integers returned on invalid operations and the propagation of
|
||||||
|
NaN payloads in a few rare cases.
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Added specialization code modeling ARM floating-point, conforming to VFPv2 or
|
||||||
|
later.
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Added an example target for ARM processors.
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
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
|
||||||
|
negative.
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Added example target-specific optimization for GCC, employing GCC instrinsics
|
||||||
|
and support for <NOBR>128-bit</NOBR> integer arithmetic.
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Made other minor improvements.
|
||||||
|
|
||||||
|
</UL>
|
||||||
|
|
||||||
|
|
||||||
|
<H3>Release 3d (2017 August)</H3>
|
||||||
|
|
||||||
|
<UL>
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Fixed bugs in the square root functions for <NOBR>64-bit</NOBR>
|
||||||
|
double-precision, <NOBR>80-bit</NOBR> double-extended-precision, and
|
||||||
|
<NOBR>128-bit</NOBR> quadruple-precision.
|
||||||
|
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
|
||||||
|
(<NOBR>1 ulp</NOBR>) from what it should be.
|
||||||
|
For the larger formats, the square root could be wrong in a large portion of
|
||||||
|
the less-significant bits.
|
||||||
|
(A bug in <CODE>f128_sqrt</CODE> was first reported by Alexei Sibidanov.)
|
||||||
|
|
||||||
|
</UL>
|
||||||
|
|
||||||
|
|
||||||
|
<H3>Release 3c (2017 February)</H3>
|
||||||
|
|
||||||
|
<UL>
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Added optional rounding mode <CODE>odd</CODE> (round to odd, also known as
|
||||||
|
<EM>jamming</EM>).
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Corrected the documentation concerning non-canonical representations in
|
||||||
|
<NOBR>80-bit</NOBR> double-extended-precision.
|
||||||
|
|
||||||
|
</UL>
|
||||||
|
|
||||||
|
|
||||||
|
<H3>Release 3b (2016 July)</H3>
|
||||||
|
|
||||||
|
<UL>
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Implemented the common <NOBR>16-bit</NOBR> “half-precision”
|
||||||
|
floating-point format (<CODE>float16_t</CODE>).
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Made the integer values returned on invalid conversions to integer formats
|
||||||
|
be determined by the port-specific specialization instead of being the same for
|
||||||
|
all ports.
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Added preprocessor macro <CODE>THREAD_LOCAL</CODE> to allow the floating-point
|
||||||
|
state (modes and exception flags) to be made per-thread.
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Modified the provided Makefiles to allow some options to be overridden from the
|
||||||
|
<CODE>make</CODE> command.
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Made other minor improvements.
|
||||||
|
|
||||||
|
</UL>
|
||||||
|
|
||||||
|
|
||||||
|
<H3>Release 3a (2015 October)</H3>
|
||||||
|
|
||||||
|
<UL>
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Replaced the license text supplied by the University of California, Berkeley.
|
||||||
|
|
||||||
|
</UL>
|
||||||
|
|
||||||
|
|
||||||
|
<H3>Release 3 (2015 February)</H3>
|
||||||
|
|
||||||
|
<UL>
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Complete rewrite, funded by the University of California, Berkeley, and
|
||||||
|
consequently having a different use license than earlier releases.
|
||||||
|
Major changes included renaming most types and functions, upgrading some
|
||||||
|
algorithms, restructuring the source files, and making SoftFloat into a true
|
||||||
|
library.
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
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
|
||||||
|
<CODE>uint64_t</CODE>).
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Added functions for fused multiply-add, for all supported floating-point
|
||||||
|
formats except <NOBR>80-bit</NOBR> double-extended-precision.
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Added support for a fifth rounding mode, <CODE>near_maxMag</CODE> (round to
|
||||||
|
nearest, with ties to maximum magnitude, away from zero).
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Dropped the <CODE>timesoftfloat</CODE> program (now part of the Berkeley
|
||||||
|
TestFloat package).
|
||||||
|
|
||||||
|
</UL>
|
||||||
|
|
||||||
|
|
||||||
|
<H3>Release 2c (2015 January)</H3>
|
||||||
|
|
||||||
|
<UL>
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Fixed mistakes affecting some <NOBR>64-bit</NOBR> processors.
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Further improved the documentation and the wording for the legal restrictions
|
||||||
|
on using SoftFloat releases <NOBR>through 2c</NOBR> (not applicable to
|
||||||
|
<NOBR>Release 3</NOBR> or later).
|
||||||
|
|
||||||
|
</UL>
|
||||||
|
|
||||||
|
|
||||||
|
<H3>Release 2b (2002 May)</H3>
|
||||||
|
|
||||||
|
<UL>
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Made minor updates to the documentation, including improved wording for the
|
||||||
|
legal restrictions on using SoftFloat.
|
||||||
|
|
||||||
|
</UL>
|
||||||
|
|
||||||
|
|
||||||
|
<H3>Release 2a (1998 December)</H3>
|
||||||
|
|
||||||
|
<UL>
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Added functions to convert between <NOBR>64-bit</NOBR> integers
|
||||||
|
(<CODE>int64</CODE>) and all supported floating-point formats.
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
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
|
||||||
|
<NOBR>1 unit</NOBR> in the last place (<NOBR>1 ulp</NOBR>) from what it should
|
||||||
|
be.
|
||||||
|
(Bug discovered by Paul Donahue.)
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Improved the Makefiles.
|
||||||
|
</UL>
|
||||||
|
|
||||||
|
|
||||||
|
<H3>Release 2 (1997 June)</H3>
|
||||||
|
|
||||||
|
<UL>
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Created the <NOBR>64-bit</NOBR> (<CODE>bits64</CODE>) version, adding the
|
||||||
|
<CODE>floatx80</CODE> and <CODE>float128</CODE> formats.
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Changed the source directory structure, splitting the sources into a
|
||||||
|
<CODE>bits32</CODE> and a <CODE>bits64</CODE> version.
|
||||||
|
Renamed <CODE>environment.h</CODE> to <CODE>milieu.h</CODE> to avoid confusion
|
||||||
|
with environment variables.
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
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
|
||||||
|
2<SUP>20</SUP> and 2<SUP>21</SUP> and halfway between two integers.
|
||||||
|
|
||||||
|
</UL>
|
||||||
|
|
||||||
|
|
||||||
|
<H3>Release 1a (1996 July)</H3>
|
||||||
|
|
||||||
|
<UL>
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Corrected a mistake that caused borderline underflow cases not to raise the
|
||||||
|
underflow flag when they should have.
|
||||||
|
(Problem reported by Doug Priest.)
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Added the <CODE>float_detect_tininess</CODE> variable to control whether
|
||||||
|
tininess is detected before or after rounding.
|
||||||
|
|
||||||
|
</UL>
|
||||||
|
|
||||||
|
|
||||||
|
<H3>Release 1 (1996 July)</H3>
|
||||||
|
|
||||||
|
<UL>
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
Original release, based on work done for the International Computer Science
|
||||||
|
Institute (ICSI) in Berkeley, California.
|
||||||
|
|
||||||
|
</UL>
|
||||||
|
|
||||||
|
|
||||||
|
</BODY>
|
||||||
|
|
|
@ -0,0 +1,686 @@
|
||||||
|
|
||||||
|
<HTML>
|
||||||
|
|
||||||
|
<HEAD>
|
||||||
|
<TITLE>Berkeley SoftFloat Source Documentation</TITLE>
|
||||||
|
</HEAD>
|
||||||
|
|
||||||
|
<BODY>
|
||||||
|
|
||||||
|
<H1>Berkeley SoftFloat Release 3e: Source Documentation</H1>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
John R. Hauser<BR>
|
||||||
|
2018 January 20<BR>
|
||||||
|
</P>
|
||||||
|
|
||||||
|
|
||||||
|
<H2>Contents</H2>
|
||||||
|
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>
|
||||||
|
<COL WIDTH=25>
|
||||||
|
<COL WIDTH=*>
|
||||||
|
<TR><TD COLSPAN=2>1. Introduction</TD></TR>
|
||||||
|
<TR><TD COLSPAN=2>2. Limitations</TD></TR>
|
||||||
|
<TR><TD COLSPAN=2>3. Acknowledgments and License</TD></TR>
|
||||||
|
<TR><TD COLSPAN=2>4. SoftFloat Package Directory Structure</TD></TR>
|
||||||
|
<TR><TD COLSPAN=2>5. Issues for Porting SoftFloat to a New Target</TD></TR>
|
||||||
|
<TR>
|
||||||
|
<TD></TD>
|
||||||
|
<TD>5.1. Standard Headers <CODE><stdbool.h></CODE> and
|
||||||
|
<CODE><stdint.h></CODE></TD>
|
||||||
|
</TR>
|
||||||
|
<TR><TD></TD><TD>5.2. Specializing Floating-Point Behavior</TD></TR>
|
||||||
|
<TR><TD></TD><TD>5.3. Macros for Build Options</TD></TR>
|
||||||
|
<TR><TD></TD><TD>5.4. Adapting a Template Target Directory</TD></TR>
|
||||||
|
<TR>
|
||||||
|
<TD></TD><TD>5.5. Target-Specific Optimization of Primitive Functions</TD>
|
||||||
|
</TR>
|
||||||
|
<TR><TD COLSPAN=2>6. Testing SoftFloat</TD></TR>
|
||||||
|
<TR>
|
||||||
|
<TD COLSPAN=2>7. Providing SoftFloat as a Common Library for Applications</TD>
|
||||||
|
</TR>
|
||||||
|
<TR><TD COLSPAN=2>8. Contact Information</TD></TR>
|
||||||
|
</TABLE>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
|
||||||
|
|
||||||
|
<H2>1. Introduction</H2>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
This document gives information needed for compiling and/or porting Berkeley
|
||||||
|
SoftFloat, a library of C functions implementing binary floating-point
|
||||||
|
conforming to the IEEE Standard for Floating-Point Arithmetic.
|
||||||
|
For basic documentation about SoftFloat refer to
|
||||||
|
<A HREF="SoftFloat.html"><NOBR><CODE>SoftFloat.html</CODE></NOBR></A>.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
The source code for SoftFloat is intended to be relatively machine-independent
|
||||||
|
and should be compilable with any ISO-Standard C compiler that also supports
|
||||||
|
<NOBR>64-bit</NOBR> integers.
|
||||||
|
SoftFloat has been successfully compiled with the GNU C Compiler
|
||||||
|
(<CODE>gcc</CODE>) for several platforms.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
<NOBR>Release 3</NOBR> of SoftFloat was a complete rewrite relative to
|
||||||
|
<NOBR>Release 2</NOBR> or earlier.
|
||||||
|
Changes to the interface of SoftFloat functions are documented in
|
||||||
|
<A HREF="SoftFloat.html"><NOBR><CODE>SoftFloat.html</CODE></NOBR></A>.
|
||||||
|
The current version of SoftFloat is <NOBR>Release 3e</NOBR>.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
|
||||||
|
<H2>2. Limitations</H2>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
SoftFloat assumes the computer has an addressable byte size of either 8 or
|
||||||
|
<NOBR>16 bits</NOBR>.
|
||||||
|
(Nearly all computers in use today have <NOBR>8-bit</NOBR> bytes.)
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
SoftFloat is written in C and is designed to work with other C code.
|
||||||
|
The C compiler used must conform at a minimum to the 1989 ANSI standard for the
|
||||||
|
C language (same as the 1990 ISO standard) and must in addition support basic
|
||||||
|
arithmetic on <NOBR>64-bit</NOBR> integers.
|
||||||
|
Earlier releases of SoftFloat included implementations of <NOBR>32-bit</NOBR>
|
||||||
|
single-precision and <NOBR>64-bit</NOBR> double-precision floating-point that
|
||||||
|
did not require <NOBR>64-bit</NOBR> integers, but this option is not supported
|
||||||
|
starting with <NOBR>Release 3</NOBR>.
|
||||||
|
Since 1999, ISO standards for C have mandated compiler support for
|
||||||
|
<NOBR>64-bit</NOBR> integers.
|
||||||
|
A compiler conforming to the 1999 C Standard or later is recommended but not
|
||||||
|
strictly required.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
<NOBR>C Standard</NOBR> header files <CODE><stdbool.h></CODE> and
|
||||||
|
<CODE><stdint.h></CODE> are required for defining standard Boolean and
|
||||||
|
integer types.
|
||||||
|
If these headers are not supplied with the C compiler, minimal substitutes must
|
||||||
|
be provided.
|
||||||
|
SoftFloat’s dependence on these headers is detailed later in
|
||||||
|
<NOBR>section 5.1</NOBR>, <I>Standard Headers <CODE><stdbool.h></CODE>
|
||||||
|
and <CODE><stdint.h></CODE></I>.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
|
||||||
|
<H2>3. Acknowledgments and License</H2>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
The SoftFloat package was written by me, <NOBR>John R.</NOBR> Hauser.
|
||||||
|
<NOBR>Release 3</NOBR> of SoftFloat was a completely new implementation
|
||||||
|
supplanting earlier releases.
|
||||||
|
The project to create <NOBR>Release 3</NOBR> (now <NOBR>through 3e</NOBR>) was
|
||||||
|
done in the employ of the University of California, Berkeley, within the
|
||||||
|
Department of Electrical Engineering and Computer Sciences, first for the
|
||||||
|
Parallel Computing Laboratory (Par Lab) and then for the ASPIRE Lab.
|
||||||
|
The work was officially overseen by Prof. Krste Asanovic, with funding provided
|
||||||
|
by these sources:
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<TABLE>
|
||||||
|
<COL>
|
||||||
|
<COL WIDTH=10>
|
||||||
|
<COL>
|
||||||
|
<TR>
|
||||||
|
<TD VALIGN=TOP><NOBR>Par Lab:</NOBR></TD>
|
||||||
|
<TD></TD>
|
||||||
|
<TD>
|
||||||
|
Microsoft (Award #024263), Intel (Award #024894), and U.C. Discovery
|
||||||
|
(Award #DIG07-10227), with additional support from Par Lab affiliates Nokia,
|
||||||
|
NVIDIA, Oracle, and Samsung.
|
||||||
|
</TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD VALIGN=TOP><NOBR>ASPIRE Lab:</NOBR></TD>
|
||||||
|
<TD></TD>
|
||||||
|
<TD>
|
||||||
|
DARPA PERFECT program (Award #HR0011-12-2-0016), with additional support from
|
||||||
|
ASPIRE industrial sponsor Intel and ASPIRE affiliates Google, Nokia, NVIDIA,
|
||||||
|
Oracle, and Samsung.
|
||||||
|
</TD>
|
||||||
|
</TR>
|
||||||
|
</TABLE>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
The following applies to the whole of SoftFloat <NOBR>Release 3e</NOBR> as well
|
||||||
|
as to each source file individually.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the
|
||||||
|
University of California.
|
||||||
|
All rights reserved.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
<OL>
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
<P>
|
||||||
|
Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions, and the following disclaimer.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
<P>
|
||||||
|
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.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<LI>
|
||||||
|
<P>
|
||||||
|
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.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
</OL>
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
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.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
|
||||||
|
<H2>4. SoftFloat Package Directory Structure</H2>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
Because SoftFloat is targeted to multiple platforms, its source code is
|
||||||
|
slightly scattered between target-specific and target-independent directories
|
||||||
|
and files.
|
||||||
|
The supplied directory structure is as follows:
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<PRE>
|
||||||
|
doc
|
||||||
|
source
|
||||||
|
include
|
||||||
|
8086
|
||||||
|
8086-SSE
|
||||||
|
ARM-VFPv2
|
||||||
|
ARM-VFPv2-defaultNaN
|
||||||
|
build
|
||||||
|
template-FAST_INT64
|
||||||
|
template-not-FAST_INT64
|
||||||
|
Linux-386-GCC
|
||||||
|
Linux-386-SSE2-GCC
|
||||||
|
Linux-x86_64-GCC
|
||||||
|
Linux-ARM-VFPv2-GCC
|
||||||
|
Win32-MinGW
|
||||||
|
Win32-SSE2-MinGW
|
||||||
|
Win64-MinGW-w64
|
||||||
|
</PRE>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
The majority of the SoftFloat sources are provided in the <CODE>source</CODE>
|
||||||
|
directory.
|
||||||
|
The <CODE>include</CODE> subdirectory contains several header files
|
||||||
|
(unsurprisingly), while the other subdirectories of <CODE>source</CODE> contain
|
||||||
|
source files that specialize the floating-point behavior to match particular
|
||||||
|
processor families:
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<DL>
|
||||||
|
<DT><CODE>8086</CODE></DT>
|
||||||
|
<DD>
|
||||||
|
Intel’s older, 8087-derived floating-point, extended to all supported
|
||||||
|
floating-point types
|
||||||
|
</DD>
|
||||||
|
<DT><CODE>8086-SSE</CODE></DT>
|
||||||
|
<DD>
|
||||||
|
Intel’s x86 processors with Streaming SIMD Extensions (SSE) and later
|
||||||
|
compatible extensions, having 8087 behavior for <NOBR>80-bit</NOBR>
|
||||||
|
double-extended-precision (<CODE>extFloat80_t</CODE>) and SSE behavior for
|
||||||
|
other floating-point types
|
||||||
|
</DD>
|
||||||
|
<DT><CODE>ARM-VFPv2</CODE></DT>
|
||||||
|
<DD>
|
||||||
|
ARM’s VFPv2 or later floating-point, with NaN payload propagation
|
||||||
|
</DD>
|
||||||
|
<DT><CODE>ARM-VFPv2-defaultNaN</CODE></DT>
|
||||||
|
<DD>
|
||||||
|
ARM’s VFPv2 or later floating-point, with the “default NaN”
|
||||||
|
option
|
||||||
|
</DD>
|
||||||
|
</DL>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
If other specializations are attempted, these would be expected to be other
|
||||||
|
subdirectories of <CODE>source</CODE> alongside the ones listed above.
|
||||||
|
Specialization is covered later, in <NOBR>section 5.2</NOBR>, <I>Specializing
|
||||||
|
Floating-Point Behavior</I>.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
The <CODE>build</CODE> directory is intended to contain a subdirectory for each
|
||||||
|
target platform for which a build of the SoftFloat library may be created.
|
||||||
|
For each build target, the target’s subdirectory is where all derived
|
||||||
|
object files and the completed SoftFloat library (typically
|
||||||
|
<CODE>softfloat.a</CODE> or <CODE>libsoftfloat.a</CODE>) are created.
|
||||||
|
The two <CODE>template</CODE> subdirectories are not actual build targets but
|
||||||
|
contain sample files for creating new target directories.
|
||||||
|
(The meaning of <CODE>FAST_INT64</CODE> will be explained later.)
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
Ignoring the <CODE>template</CODE> directories, the supplied target directories
|
||||||
|
are intended to follow a naming system of
|
||||||
|
<NOBR><CODE><<I>execution-environment</I>>-<<I>compiler</I>></CODE></NOBR>.
|
||||||
|
For the example targets,
|
||||||
|
<NOBR><CODE><<I>execution-environment</I>></CODE></NOBR> is
|
||||||
|
<NOBR><CODE>Linux-386</CODE></NOBR>, <NOBR><CODE>Linux-386-SSE2</CODE></NOBR>,
|
||||||
|
<NOBR><CODE>Linux-x86_64</CODE></NOBR>,
|
||||||
|
<NOBR><CODE>Linux-ARM-VFPv2</CODE></NOBR>, <CODE>Win32</CODE>,
|
||||||
|
<NOBR><CODE>Win32-SSE2</CODE></NOBR>, or <CODE>Win64</CODE>, and
|
||||||
|
<NOBR><CODE><<I>compiler</I>></CODE></NOBR> is <CODE>GCC</CODE>,
|
||||||
|
<CODE>MinGW</CODE>, or <NOBR><CODE>MinGW-w64</CODE></NOBR>.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
All of the supplied target directories are merely examples that may or may not
|
||||||
|
be correct for compiling on any particular system.
|
||||||
|
Despite requests, there are currently no plans to include and maintain in the
|
||||||
|
SoftFloat package the build files needed for a great many users’
|
||||||
|
compilation environments, which can span a huge range of operating systems,
|
||||||
|
compilers, and other tools.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
As supplied, each target directory contains two files:
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<PRE>
|
||||||
|
Makefile
|
||||||
|
platform.h
|
||||||
|
</PRE>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
The provided <CODE>Makefile</CODE> is written for GNU <CODE>make</CODE>.
|
||||||
|
A build of SoftFloat for the specific target is begun by executing the
|
||||||
|
<CODE>make</CODE> command with the target directory as the current directory.
|
||||||
|
A completely different build tool can be used if an appropriate
|
||||||
|
<CODE>Makefile</CODE> equivalent is created.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
The <CODE>platform.h</CODE> header file exists to provide a location for
|
||||||
|
additional C declarations specific to the build target.
|
||||||
|
Every C source file of SoftFloat contains a <CODE>#include</CODE> for
|
||||||
|
<CODE>platform.h</CODE>.
|
||||||
|
In many cases, the contents of <CODE>platform.h</CODE> can be as simple as one
|
||||||
|
or two lines of code.
|
||||||
|
At the other extreme, to get maximal performance from SoftFloat, it may be
|
||||||
|
desirable to include in header <CODE>platform.h</CODE> (directly or via
|
||||||
|
<CODE>#include</CODE>) declarations for numerous target-specific optimizations.
|
||||||
|
Such possibilities are discussed in the next section, <I>Issues for Porting
|
||||||
|
SoftFloat to a New Target</I>.
|
||||||
|
If the target’s compiler or library has bugs or other shortcomings,
|
||||||
|
workarounds for these issues may also be possible with target-specific
|
||||||
|
declarations in <CODE>platform.h</CODE>, avoiding the need to modify the main
|
||||||
|
SoftFloat sources.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
|
||||||
|
<H2>5. Issues for Porting SoftFloat to a New Target</H2>
|
||||||
|
|
||||||
|
<H3>5.1. Standard Headers <CODE><stdbool.h></CODE> and <CODE><stdint.h></CODE></H3>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
The SoftFloat sources make use of standard headers
|
||||||
|
<CODE><stdbool.h></CODE> and <CODE><stdint.h></CODE>, which have
|
||||||
|
been part of the ISO C Standard Library since 1999.
|
||||||
|
With any recent compiler, these standard headers are likely to be supported,
|
||||||
|
even if the compiler does not claim complete conformance to the latest ISO C
|
||||||
|
Standard.
|
||||||
|
For older or nonstandard compilers, substitutes for
|
||||||
|
<CODE><stdbool.h></CODE> and <CODE><stdint.h></CODE> may need to be
|
||||||
|
created.
|
||||||
|
SoftFloat depends on these names from <CODE><stdbool.h></CODE>:
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<PRE>
|
||||||
|
bool
|
||||||
|
true
|
||||||
|
false
|
||||||
|
</PRE>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
and on these names from <CODE><stdint.h></CODE>:
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<PRE>
|
||||||
|
uint16_t
|
||||||
|
uint32_t
|
||||||
|
uint64_t
|
||||||
|
int32_t
|
||||||
|
int64_t
|
||||||
|
UINT64_C
|
||||||
|
INT64_C
|
||||||
|
uint_least8_t
|
||||||
|
uint_fast8_t
|
||||||
|
uint_fast16_t
|
||||||
|
uint_fast32_t
|
||||||
|
uint_fast64_t
|
||||||
|
int_fast8_t
|
||||||
|
int_fast16_t
|
||||||
|
int_fast32_t
|
||||||
|
int_fast64_t
|
||||||
|
</PRE>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
</P>
|
||||||
|
|
||||||
|
|
||||||
|
<H3>5.2. Specializing Floating-Point Behavior</H3>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
The IEEE Floating-Point Standard allows for some flexibility in a conforming
|
||||||
|
implementation, particularly concerning NaNs.
|
||||||
|
The SoftFloat <CODE>source</CODE> directory is supplied with some
|
||||||
|
<I>specialization</I> subdirectories containing possible definitions for this
|
||||||
|
implementation-specific behavior.
|
||||||
|
For example, the <CODE>8086</CODE> and <NOBR><CODE>8086-SSE</CODE></NOBR>
|
||||||
|
subdirectories have source files that specialize SoftFloat’s behavior to
|
||||||
|
match that of Intel’s x86 line of processors.
|
||||||
|
The files in a specialization subdirectory must determine:
|
||||||
|
<UL>
|
||||||
|
<LI>
|
||||||
|
whether tininess for underflow is detected before or after rounding by default;
|
||||||
|
<LI>
|
||||||
|
how signaling NaNs are distinguished from quiet NaNs;
|
||||||
|
<LI>
|
||||||
|
what (if anything) special happens when exceptions are raised;
|
||||||
|
<LI>
|
||||||
|
the default generated quiet NaNs;
|
||||||
|
<LI>
|
||||||
|
how NaNs are propagated from function inputs to output; and
|
||||||
|
<LI>
|
||||||
|
the integer results returned when conversions to integer type raise the
|
||||||
|
<I>invalid</I> exception.
|
||||||
|
</UL>
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
As provided, the build process for a target expects to involve exactly
|
||||||
|
<EM>one</EM> specialization directory that defines <EM>all</EM> of these
|
||||||
|
implementation-specific details for the target.
|
||||||
|
A specialization directory such as <CODE>8086</CODE> is expected to contain a
|
||||||
|
header file called <CODE>specialize.h</CODE>, together with whatever other
|
||||||
|
source files are needed to complete the specialization.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
A new build target may use an existing specialization, such as the ones
|
||||||
|
provided by the <CODE>8086</CODE> and <NOBR><CODE>8086-SSE</CODE></NOBR>
|
||||||
|
subdirectories.
|
||||||
|
If a build target needs a new specialization, different from any existing ones,
|
||||||
|
it is recommended that a new specialization directory be created for this
|
||||||
|
purpose.
|
||||||
|
The <CODE>specialize.h</CODE> header file from any of the provided
|
||||||
|
specialization subdirectories can be used as a model for what definitions are
|
||||||
|
needed.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
|
||||||
|
<H3>5.3. Macros for Build Options</H3>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
The SoftFloat source files adapt the floating-point implementation according to
|
||||||
|
several C preprocessor macros:
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<DL>
|
||||||
|
<DT><CODE>LITTLEENDIAN</CODE>
|
||||||
|
<DD>
|
||||||
|
Must be defined for little-endian machines; must not be defined for big-endian
|
||||||
|
machines.
|
||||||
|
<DT><CODE>INLINE</CODE>
|
||||||
|
<DD>
|
||||||
|
Specifies the sequence of tokens used to indicate that a C function should be
|
||||||
|
inlined.
|
||||||
|
If macro <CODE>INLINE_LEVEL</CODE> is defined with a value of 1 or higher, this
|
||||||
|
macro must be defined; otherwise, this macro is ignored and need not be
|
||||||
|
defined.
|
||||||
|
For compilers that conform to the C Standard’s rules for inline
|
||||||
|
functions, this macro can be defined as the single keyword <CODE>inline</CODE>.
|
||||||
|
For other compilers that follow a convention pre-dating the standardization of
|
||||||
|
<CODE>inline</CODE>, this macro may need to be defined to <CODE>extern</CODE>
|
||||||
|
<CODE>inline</CODE>.
|
||||||
|
<DT><CODE>THREAD_LOCAL</CODE>
|
||||||
|
<DD>
|
||||||
|
Can be defined to a sequence of tokens that, when appearing at the start of a
|
||||||
|
variable declaration, indicates to the C compiler that the variable is
|
||||||
|
<I>per-thread</I>, meaning that each execution thread gets its own separate
|
||||||
|
instance of the variable.
|
||||||
|
This macro is used in header <CODE>softfloat.h</CODE> in the declarations of
|
||||||
|
variables <CODE>softfloat_roundingMode</CODE>,
|
||||||
|
<CODE>softfloat_detectTininess</CODE>, <CODE>extF80_roundingPrecision</CODE>,
|
||||||
|
and <CODE>softfloat_exceptionFlags</CODE>.
|
||||||
|
If macro <CODE>THREAD_LOCAL</CODE> is left undefined, these variables will
|
||||||
|
default to being ordinary global variables.
|
||||||
|
Depending on the compiler, possible valid definitions of this macro include
|
||||||
|
<CODE>_Thread_local</CODE> and <CODE>__thread</CODE>.
|
||||||
|
</DL>
|
||||||
|
<DL>
|
||||||
|
<DT><CODE>SOFTFLOAT_ROUND_ODD</CODE>
|
||||||
|
<DD>
|
||||||
|
Can be defined to enable support for optional rounding mode
|
||||||
|
<CODE>softfloat_round_odd</CODE>.
|
||||||
|
</DL>
|
||||||
|
<DL>
|
||||||
|
<DT><CODE>INLINE_LEVEL</CODE>
|
||||||
|
<DD>
|
||||||
|
Can be defined to an integer to determine the degree of inlining requested of
|
||||||
|
the compiler.
|
||||||
|
Larger numbers request that more inlining be done.
|
||||||
|
If this macro is not defined or is defined to a value less <NOBR>than 1</NOBR>
|
||||||
|
(zero or negative), no inlining is requested.
|
||||||
|
The maximum effective value is no higher <NOBR>than 5</NOBR>.
|
||||||
|
Defining this macro to a value greater than 5 is the same as defining it
|
||||||
|
<NOBR>to 5</NOBR>.
|
||||||
|
<DT><CODE>SOFTFLOAT_FAST_INT64</CODE>
|
||||||
|
<DD>
|
||||||
|
Can be defined to indicate that the build target’s implementation of
|
||||||
|
<NOBR>64-bit</NOBR> arithmetic is efficient.
|
||||||
|
For newer <NOBR>64-bit</NOBR> processors, this macro should usually be defined.
|
||||||
|
For very small microprocessors whose buses and registers are <NOBR>8-bit</NOBR>
|
||||||
|
or <NOBR>16-bit</NOBR> in size, this macro should usually not be defined.
|
||||||
|
Whether this macro should be defined for a <NOBR>32-bit</NOBR> processor may
|
||||||
|
depend on the target machine and the applications that will use SoftFloat.
|
||||||
|
<DT><CODE>SOFTFLOAT_FAST_DIV32TO16</CODE>
|
||||||
|
<DD>
|
||||||
|
Can be defined to indicate that the target’s division operator
|
||||||
|
<NOBR>in C</NOBR> (written as <CODE>/</CODE>) is reasonably efficient for
|
||||||
|
dividing a <NOBR>32-bit</NOBR> unsigned integer by a <NOBR>16-bit</NOBR>
|
||||||
|
unsigned integer.
|
||||||
|
Setting this macro may affect the performance of function <CODE>f16_div</CODE>.
|
||||||
|
<DT><CODE>SOFTFLOAT_FAST_DIV64TO32</CODE>
|
||||||
|
<DD>
|
||||||
|
Can be defined to indicate that the target’s division operator
|
||||||
|
<NOBR>in C</NOBR> (written as <CODE>/</CODE>) is reasonably efficient for
|
||||||
|
dividing a <NOBR>64-bit</NOBR> unsigned integer by a <NOBR>32-bit</NOBR>
|
||||||
|
unsigned integer.
|
||||||
|
Setting this macro may affect the performance of division, remainder, and
|
||||||
|
square root operations other than <CODE>f16_div</CODE>.
|
||||||
|
</DL>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
Following the usual custom <NOBR>for C</NOBR>, for most of these macros (all
|
||||||
|
except <CODE>INLINE</CODE>, <CODE>THREAD_LOCAL</CODE>, and
|
||||||
|
<CODE>INLINE_LEVEL</CODE>), the content of any definition is irrelevant;
|
||||||
|
what matters is a macro’s effect on <CODE>#ifdef</CODE> directives.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
It is recommended that any definitions of macros <CODE>LITTLEENDIAN</CODE>,
|
||||||
|
<CODE>INLINE</CODE>, and <CODE>THREAD_LOCAL</CODE> be made in a build
|
||||||
|
target’s <CODE>platform.h</CODE> header file, because these macros are
|
||||||
|
expected to be determined inflexibly by the target machine and compiler.
|
||||||
|
The other five macros select options and control optimization, and thus might
|
||||||
|
be better located in the target’s Makefile (or its equivalent).
|
||||||
|
</P>
|
||||||
|
|
||||||
|
|
||||||
|
<H3>5.4. Adapting a Template Target Directory</H3>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
In the <CODE>build</CODE> directory, two <CODE>template</CODE> subdirectories
|
||||||
|
provide models for new target directories.
|
||||||
|
Two different templates exist because different functions are needed in the
|
||||||
|
SoftFloat library depending on whether macro <CODE>SOFTFLOAT_FAST_INT64</CODE>
|
||||||
|
is defined.
|
||||||
|
If macro <CODE>SOFTFLOAT_FAST_INT64</CODE> will be defined,
|
||||||
|
<NOBR><CODE>template-FAST_INT64</CODE></NOBR> is the template to use;
|
||||||
|
otherwise, <NOBR><CODE>template-not-FAST_INT64</CODE></NOBR> is the appropriate
|
||||||
|
template.
|
||||||
|
A new target directory can be created by copying the correct template directory
|
||||||
|
and editing the files inside.
|
||||||
|
To avoid confusion, it would be wise to refrain from editing the files within a
|
||||||
|
template directory directly.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
|
||||||
|
<H3>5.5. Target-Specific Optimization of Primitive Functions</H3>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
Header file <CODE>primitives.h</CODE> (in directory
|
||||||
|
<CODE>source/include</CODE>) declares macros and functions for numerous
|
||||||
|
underlying arithmetic operations upon which many of SoftFloat’s
|
||||||
|
floating-point functions are ultimately built.
|
||||||
|
The SoftFloat sources include implementations of all of these functions/macros,
|
||||||
|
written as standard C code, so a complete and correct SoftFloat library can be
|
||||||
|
created using only the supplied code for all functions.
|
||||||
|
However, for many targets, SoftFloat’s performance can be improved by
|
||||||
|
substituting target-specific implementations of some of the functions/macros
|
||||||
|
declared in <CODE>primitives.h</CODE>.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
For example, <CODE>primitives.h</CODE> declares a function called
|
||||||
|
<CODE>softfloat_countLeadingZeros32</CODE> that takes an unsigned
|
||||||
|
<NOBR>32-bit</NOBR> integer as an argument and returns the number of the
|
||||||
|
integer’s most-significant bits that are zeros.
|
||||||
|
While the SoftFloat sources include an implementation of this function written
|
||||||
|
in <NOBR>standard C</NOBR>, many processors can perform this same function
|
||||||
|
directly in only one or two machine instructions.
|
||||||
|
An alternative, target-specific implementation that maps to those instructions
|
||||||
|
is likely to be more efficient than the generic C code from the SoftFloat
|
||||||
|
package.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
A build target can replace the supplied version of any function or macro of
|
||||||
|
<CODE>primitives.h</CODE> by defining a macro with the same name in the
|
||||||
|
target’s <CODE>platform.h</CODE> header file.
|
||||||
|
For this purpose, it may be helpful for <CODE>platform.h</CODE> to
|
||||||
|
<CODE>#include</CODE> header file <CODE>primitiveTypes.h</CODE>, which defines
|
||||||
|
types used for arguments and results of functions declared in
|
||||||
|
<CODE>primitives.h</CODE>.
|
||||||
|
When a desired replacement implementation is a function, not a macro, it is
|
||||||
|
sufficient for <CODE>platform.h</CODE> to include the line
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<PRE>
|
||||||
|
#define <<I>function-name</I>> <<I>function-name</I>>
|
||||||
|
</PRE>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
where <NOBR><CODE><<I>function-name</I>></CODE></NOBR> is the name of the
|
||||||
|
function.
|
||||||
|
This technically defines <NOBR><CODE><<I>function-name</I>></CODE></NOBR>
|
||||||
|
as a macro, but one that resolves to the same name, which may then be a
|
||||||
|
function.
|
||||||
|
(A preprocessor that conforms to the C Standard is required to limit recursive
|
||||||
|
macro expansion from being applied more than once.)
|
||||||
|
</P>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
The supplied header file <CODE>opts-GCC.h</CODE> (in directory
|
||||||
|
<CODE>source/include</CODE>) provides an example of target-specific
|
||||||
|
optimization for the GCC compiler.
|
||||||
|
Each GCC target example in the <CODE>build</CODE> directory has
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<CODE>#include "opts-GCC.h"</CODE>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
in its <CODE>platform.h</CODE> header file.
|
||||||
|
Before <CODE>opts-GCC.h</CODE> is included, the following macros must be
|
||||||
|
defined (or not) to control which features are invoked:
|
||||||
|
<BLOCKQUOTE>
|
||||||
|
<DL>
|
||||||
|
<DT><CODE>SOFTFLOAT_BUILTIN_CLZ</CODE></DT>
|
||||||
|
<DD>
|
||||||
|
If defined, SoftFloat’s internal
|
||||||
|
‘<CODE>countLeadingZeros</CODE>’ functions use intrinsics
|
||||||
|
<CODE>__builtin_clz</CODE> and <CODE>__builtin_clzll</CODE>.
|
||||||
|
</DD>
|
||||||
|
<DT><CODE>SOFTFLOAT_INTRINSIC_INT128</CODE></DT>
|
||||||
|
<DD>
|
||||||
|
If defined, SoftFloat makes use of GCC’s nonstandard <NOBR>128-bit</NOBR>
|
||||||
|
integer type <CODE>__int128</CODE>.
|
||||||
|
</DD>
|
||||||
|
</DL>
|
||||||
|
</BLOCKQUOTE>
|
||||||
|
On some machines, these improvements are observed to increase the speeds of
|
||||||
|
<CODE>f64_mul</CODE> and <CODE>f128_mul</CODE> by around 20 to 25%, although
|
||||||
|
other functions receive less dramatic boosts, or none at all.
|
||||||
|
Results can vary greatly across different platforms.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
|
||||||
|
<H2>6. Testing SoftFloat</H2>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
SoftFloat can be tested using the <CODE>testsoftfloat</CODE> program by the
|
||||||
|
same author.
|
||||||
|
This program is part of the Berkeley TestFloat package available at the Web
|
||||||
|
page
|
||||||
|
<A HREF="http://www.jhauser.us/arithmetic/TestFloat.html"><NOBR><CODE>http://www.jhauser.us/arithmetic/TestFloat.html</CODE></NOBR></A>.
|
||||||
|
The TestFloat package also has a program called <CODE>timesoftfloat</CODE> that
|
||||||
|
measures the speed of SoftFloat’s floating-point functions.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
|
||||||
|
<H2>7. Providing SoftFloat as a Common Library for Applications</H2>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
Header file <CODE>softfloat.h</CODE> defines the SoftFloat interface as seen by
|
||||||
|
clients.
|
||||||
|
If the SoftFloat library will be made a common library for programs on a
|
||||||
|
system, the supplied <CODE>softfloat.h</CODE> has a couple of deficiencies for
|
||||||
|
this purpose:
|
||||||
|
<UL>
|
||||||
|
<LI>
|
||||||
|
As supplied, <CODE>softfloat.h</CODE> depends on another header,
|
||||||
|
<CODE>softfloat_types.h</CODE>, that is not intended for public use but which
|
||||||
|
must also be visible to the programmer’s compiler.
|
||||||
|
<LI>
|
||||||
|
More troubling, at the time <CODE>softfloat.h</CODE> is included in a C source
|
||||||
|
file, macros <CODE>SOFTFLOAT_FAST_INT64</CODE> and <CODE>THREAD_LOCAL</CODE>
|
||||||
|
must be defined, or not defined, consistent with how these macro were defined
|
||||||
|
when the SoftFloat library was built.
|
||||||
|
</UL>
|
||||||
|
In the situation that new programs may regularly <CODE>#include</CODE> header
|
||||||
|
file <CODE>softfloat.h</CODE>, it is recommended that a custom, self-contained
|
||||||
|
version of this header file be created that eliminates these issues.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
|
||||||
|
<H2>8. Contact Information</H2>
|
||||||
|
|
||||||
|
<P>
|
||||||
|
At the time of this writing, the most up-to-date information about SoftFloat
|
||||||
|
and the latest release can be found at the Web page
|
||||||
|
<A HREF="http://www.jhauser.us/arithmetic/SoftFloat.html"><NOBR><CODE>http://www.jhauser.us/arithmetic/SoftFloat.html</CODE></NOBR></A>.
|
||||||
|
</P>
|
||||||
|
|
||||||
|
|
||||||
|
</BODY>
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,57 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "platform.h"
|
||||||
|
#include "softfloat.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool extF80M_isSignalingNaN( const extFloat80_t *aPtr )
|
||||||
|
{
|
||||||
|
const struct extFloat80M *aSPtr;
|
||||||
|
uint64_t uiA0;
|
||||||
|
|
||||||
|
aSPtr = (const struct extFloat80M *) aPtr;
|
||||||
|
if ( (aSPtr->signExp & 0x7FFF) != 0x7FFF ) return false;
|
||||||
|
uiA0 = aSPtr->signif;
|
||||||
|
return
|
||||||
|
! (uiA0 & UINT64_C( 0x4000000000000000 ))
|
||||||
|
&& (uiA0 & UINT64_C( 0x3FFFFFFFFFFFFFFF));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "platform.h"
|
||||||
|
#include "primitives.h"
|
||||||
|
#include "softfloat.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool f128M_isSignalingNaN( const float128_t *aPtr )
|
||||||
|
{
|
||||||
|
const uint32_t *aWPtr;
|
||||||
|
uint32_t uiA96;
|
||||||
|
|
||||||
|
aWPtr = (const uint32_t *) aPtr;
|
||||||
|
uiA96 = aWPtr[indexWordHi( 4 )];
|
||||||
|
if ( (uiA96 & 0x7FFF8000) != 0x7FFF0000 ) return false;
|
||||||
|
return
|
||||||
|
((uiA96 & 0x00007FFF) != 0)
|
||||||
|
|| ((aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
|
||||||
|
| aWPtr[indexWord( 4, 0 )])
|
||||||
|
!= 0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 "internals.h"
|
||||||
|
#include "specialize.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
| `zSPtr'.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
softfloat_commonNaNToExtF80M(
|
||||||
|
const struct commonNaN *aPtr, struct extFloat80M *zSPtr )
|
||||||
|
{
|
||||||
|
|
||||||
|
zSPtr->signExp = packToExtF80UI64( aPtr->sign, 0x7FFF );
|
||||||
|
zSPtr->signif = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 "primitives.h"
|
||||||
|
#include "specialize.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
struct uint128 softfloat_commonNaNToExtF80UI( const struct commonNaN *aPtr )
|
||||||
|
{
|
||||||
|
struct uint128 uiZ;
|
||||||
|
|
||||||
|
uiZ.v64 = (uint_fast16_t) aPtr->sign<<15 | 0x7FFF;
|
||||||
|
uiZ.v0 = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1;
|
||||||
|
return uiZ;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 "primitives.h"
|
||||||
|
#include "specialize.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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 )
|
||||||
|
{
|
||||||
|
|
||||||
|
softfloat_shortShiftRight128M( (const uint32_t *) &aPtr->v0, 16, zWPtr );
|
||||||
|
zWPtr[indexWordHi( 4 )] |= (uint32_t) aPtr->sign<<31 | 0x7FFF8000;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 "primitives.h"
|
||||||
|
#include "specialize.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
struct uint128 softfloat_commonNaNToF128UI( const struct commonNaN *aPtr )
|
||||||
|
{
|
||||||
|
struct uint128 uiZ;
|
||||||
|
|
||||||
|
uiZ = softfloat_shortShiftRight128( aPtr->v64, aPtr->v0, 16 );
|
||||||
|
uiZ.v64 |= (uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FFF800000000000 );
|
||||||
|
return uiZ;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -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, 2015 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 16-bit floating-point
|
||||||
|
| NaN, and returns the bit pattern of this value as an unsigned integer.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
uint_fast16_t softfloat_commonNaNToF16UI( const struct commonNaN *aPtr )
|
||||||
|
{
|
||||||
|
|
||||||
|
return (uint_fast16_t) aPtr->sign<<15 | 0x7E00 | aPtr->v64>>54;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -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 32-bit floating-point
|
||||||
|
| NaN, and returns the bit pattern of this value as an unsigned integer.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
uint_fast32_t softfloat_commonNaNToF32UI( const struct commonNaN *aPtr )
|
||||||
|
{
|
||||||
|
|
||||||
|
return (uint_fast32_t) aPtr->sign<<31 | 0x7FC00000 | aPtr->v64>>41;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 64-bit floating-point
|
||||||
|
| NaN, and returns the bit pattern of this value as an unsigned integer.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
uint_fast64_t softfloat_commonNaNToF64UI( const struct commonNaN *aPtr )
|
||||||
|
{
|
||||||
|
|
||||||
|
return
|
||||||
|
(uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FF8000000000000 )
|
||||||
|
| aPtr->v64>>12;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 "internals.h"
|
||||||
|
#include "specialize.h"
|
||||||
|
#include "softfloat.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
| common NaN at the location pointed to by `zPtr'. If the NaN is a signaling
|
||||||
|
| NaN, the invalid exception is raised.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
softfloat_extF80MToCommonNaN(
|
||||||
|
const struct extFloat80M *aSPtr, struct commonNaN *zPtr )
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( extF80M_isSignalingNaN( (const extFloat80_t *) aSPtr ) ) {
|
||||||
|
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||||
|
}
|
||||||
|
zPtr->sign = signExtF80UI64( aSPtr->signExp );
|
||||||
|
zPtr->v64 = aSPtr->signif<<1;
|
||||||
|
zPtr->v0 = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 the unsigned integer formed from concatenating `uiA64' and `uiA0'
|
||||||
|
| 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
|
||||||
|
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
|
||||||
|
| exception is raised.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
softfloat_extF80UIToCommonNaN(
|
||||||
|
uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr )
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) ) {
|
||||||
|
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||||
|
}
|
||||||
|
zPtr->sign = uiA64>>15;
|
||||||
|
zPtr->v64 = uiA0<<1;
|
||||||
|
zPtr->v0 = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 "primitives.h"
|
||||||
|
#include "specialize.h"
|
||||||
|
#include "softfloat.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
| 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
|
||||||
|
| four 32-bit elements that concatenate in the platform's normal endian order
|
||||||
|
| to form a 128-bit floating-point value.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
softfloat_f128MToCommonNaN( const uint32_t *aWPtr, struct commonNaN *zPtr )
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( f128M_isSignalingNaN( (const float128_t *) aWPtr ) ) {
|
||||||
|
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||||
|
}
|
||||||
|
zPtr->sign = aWPtr[indexWordHi( 4 )]>>31;
|
||||||
|
softfloat_shortShiftLeft128M( aWPtr, 16, (uint32_t *) &zPtr->v0 );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 "primitives.h"
|
||||||
|
#include "specialize.h"
|
||||||
|
#include "softfloat.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
| 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_f128UIToCommonNaN(
|
||||||
|
uint_fast64_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr )
|
||||||
|
{
|
||||||
|
struct uint128 NaNSig;
|
||||||
|
|
||||||
|
if ( softfloat_isSigNaNF128UI( uiA64, uiA0 ) ) {
|
||||||
|
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||||
|
}
|
||||||
|
NaNSig = softfloat_shortShiftLeft128( uiA64, uiA0, 16 );
|
||||||
|
zPtr->sign = uiA64>>63;
|
||||||
|
zPtr->v64 = NaNSig.v64;
|
||||||
|
zPtr->v0 = NaNSig.v0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -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, 2015 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 16-bit floating-point 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_f16UIToCommonNaN( uint_fast16_t uiA, struct commonNaN *zPtr )
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( softfloat_isSigNaNF16UI( uiA ) ) {
|
||||||
|
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||||
|
}
|
||||||
|
zPtr->sign = uiA>>15;
|
||||||
|
zPtr->v64 = (uint_fast64_t) uiA<<54;
|
||||||
|
zPtr->v0 = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -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 32-bit floating-point 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_f32UIToCommonNaN( uint_fast32_t uiA, struct commonNaN *zPtr )
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( softfloat_isSigNaNF32UI( uiA ) ) {
|
||||||
|
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||||
|
}
|
||||||
|
zPtr->sign = uiA>>31;
|
||||||
|
zPtr->v64 = (uint_fast64_t) uiA<<41;
|
||||||
|
zPtr->v0 = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -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 64-bit floating-point 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_f64UIToCommonNaN( uint_fast64_t uiA, struct commonNaN *zPtr )
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( softfloat_isSigNaNF64UI( uiA ) ) {
|
||||||
|
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||||
|
}
|
||||||
|
zPtr->sign = uiA>>63;
|
||||||
|
zPtr->v64 = uiA<<12;
|
||||||
|
zPtr->v0 = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,107 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "platform.h"
|
||||||
|
#include "internals.h"
|
||||||
|
#include "specialize.h"
|
||||||
|
#include "softfloat.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
| at the location pointed to by `zSPtr'. If either original floating-point
|
||||||
|
| value is a signaling NaN, the invalid exception is raised.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
softfloat_propagateNaNExtF80M(
|
||||||
|
const struct extFloat80M *aSPtr,
|
||||||
|
const struct extFloat80M *bSPtr,
|
||||||
|
struct extFloat80M *zSPtr
|
||||||
|
)
|
||||||
|
{
|
||||||
|
bool isSigNaNA;
|
||||||
|
const struct extFloat80M *sPtr;
|
||||||
|
bool isSigNaNB;
|
||||||
|
uint_fast16_t uiB64;
|
||||||
|
uint64_t uiB0;
|
||||||
|
uint_fast16_t uiA64;
|
||||||
|
uint64_t uiA0;
|
||||||
|
uint_fast16_t uiMagA64, uiMagB64;
|
||||||
|
|
||||||
|
isSigNaNA = extF80M_isSignalingNaN( (const extFloat80_t *) aSPtr );
|
||||||
|
sPtr = aSPtr;
|
||||||
|
if ( ! bSPtr ) {
|
||||||
|
if ( isSigNaNA ) softfloat_raiseFlags( softfloat_flag_invalid );
|
||||||
|
goto copy;
|
||||||
|
}
|
||||||
|
isSigNaNB = extF80M_isSignalingNaN( (const extFloat80_t *) bSPtr );
|
||||||
|
if ( isSigNaNA | isSigNaNB ) {
|
||||||
|
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||||
|
if ( isSigNaNA ) {
|
||||||
|
uiB64 = bSPtr->signExp;
|
||||||
|
if ( isSigNaNB ) goto returnLargerUIMag;
|
||||||
|
uiB0 = bSPtr->signif;
|
||||||
|
if ( isNaNExtF80UI( uiB64, uiB0 ) ) goto copyB;
|
||||||
|
goto copy;
|
||||||
|
} else {
|
||||||
|
uiA64 = aSPtr->signExp;
|
||||||
|
uiA0 = aSPtr->signif;
|
||||||
|
if ( isNaNExtF80UI( uiA64, uiA0 ) ) goto copy;
|
||||||
|
goto copyB;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
uiB64 = bSPtr->signExp;
|
||||||
|
returnLargerUIMag:
|
||||||
|
uiA64 = aSPtr->signExp;
|
||||||
|
uiMagA64 = uiA64 & 0x7FFF;
|
||||||
|
uiMagB64 = uiB64 & 0x7FFF;
|
||||||
|
if ( uiMagA64 < uiMagB64 ) goto copyB;
|
||||||
|
if ( uiMagB64 < uiMagA64 ) goto copy;
|
||||||
|
uiA0 = aSPtr->signif;
|
||||||
|
uiB0 = bSPtr->signif;
|
||||||
|
if ( uiA0 < uiB0 ) goto copyB;
|
||||||
|
if ( uiB0 < uiA0 ) goto copy;
|
||||||
|
if ( uiA64 < uiB64 ) goto copy;
|
||||||
|
copyB:
|
||||||
|
sPtr = bSPtr;
|
||||||
|
copy:
|
||||||
|
zSPtr->signExp = sPtr->signExp;
|
||||||
|
zSPtr->signif = sPtr->signif | UINT64_C( 0xC000000000000000 );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,106 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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, 2018 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 <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "platform.h"
|
||||||
|
#include "internals.h"
|
||||||
|
#include "specialize.h"
|
||||||
|
#include "softfloat.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| Interpreting the unsigned integer formed from concatenating 'uiA64' and
|
||||||
|
| 'uiA0' as an 80-bit extended floating-point value, and likewise interpreting
|
||||||
|
| 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
|
||||||
|
| invalid exception is raised.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
struct uint128
|
||||||
|
softfloat_propagateNaNExtF80UI(
|
||||||
|
uint_fast16_t uiA64,
|
||||||
|
uint_fast64_t uiA0,
|
||||||
|
uint_fast16_t uiB64,
|
||||||
|
uint_fast64_t uiB0
|
||||||
|
)
|
||||||
|
{
|
||||||
|
bool isSigNaNA, isSigNaNB;
|
||||||
|
uint_fast64_t uiNonsigA0, uiNonsigB0;
|
||||||
|
uint_fast16_t uiMagA64, uiMagB64;
|
||||||
|
struct uint128 uiZ;
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------
|
||||||
|
*------------------------------------------------------------------------*/
|
||||||
|
isSigNaNA = softfloat_isSigNaNExtF80UI( uiA64, uiA0 );
|
||||||
|
isSigNaNB = softfloat_isSigNaNExtF80UI( uiB64, uiB0 );
|
||||||
|
/*------------------------------------------------------------------------
|
||||||
|
| Make NaNs non-signaling.
|
||||||
|
*------------------------------------------------------------------------*/
|
||||||
|
uiNonsigA0 = uiA0 | UINT64_C( 0xC000000000000000 );
|
||||||
|
uiNonsigB0 = uiB0 | UINT64_C( 0xC000000000000000 );
|
||||||
|
/*------------------------------------------------------------------------
|
||||||
|
*------------------------------------------------------------------------*/
|
||||||
|
if ( isSigNaNA | isSigNaNB ) {
|
||||||
|
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||||
|
if ( isSigNaNA ) {
|
||||||
|
if ( isSigNaNB ) goto returnLargerMag;
|
||||||
|
if ( isNaNExtF80UI( uiB64, uiB0 ) ) goto returnB;
|
||||||
|
goto returnA;
|
||||||
|
} else {
|
||||||
|
if ( isNaNExtF80UI( uiA64, uiA0 ) ) goto returnA;
|
||||||
|
goto returnB;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
returnLargerMag:
|
||||||
|
uiMagA64 = uiA64 & 0x7FFF;
|
||||||
|
uiMagB64 = uiB64 & 0x7FFF;
|
||||||
|
if ( uiMagA64 < uiMagB64 ) goto returnB;
|
||||||
|
if ( uiMagB64 < uiMagA64 ) goto returnA;
|
||||||
|
if ( uiA0 < uiB0 ) goto returnB;
|
||||||
|
if ( uiB0 < uiA0 ) goto returnA;
|
||||||
|
if ( uiA64 < uiB64 ) goto returnA;
|
||||||
|
returnB:
|
||||||
|
uiZ.v64 = uiB64;
|
||||||
|
uiZ.v0 = uiNonsigB0;
|
||||||
|
return uiZ;
|
||||||
|
returnA:
|
||||||
|
uiZ.v64 = uiA64;
|
||||||
|
uiZ.v0 = uiNonsigA0;
|
||||||
|
return uiZ;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "platform.h"
|
||||||
|
#include "internals.h"
|
||||||
|
#include "specialize.h"
|
||||||
|
#include "softfloat.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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 )
|
||||||
|
{
|
||||||
|
bool isSigNaNA;
|
||||||
|
const uint32_t *ptr;
|
||||||
|
|
||||||
|
ptr = aWPtr;
|
||||||
|
isSigNaNA = f128M_isSignalingNaN( (const float128_t *) aWPtr );
|
||||||
|
if (
|
||||||
|
isSigNaNA
|
||||||
|
|| (bWPtr && f128M_isSignalingNaN( (const float128_t *) bWPtr ))
|
||||||
|
) {
|
||||||
|
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||||
|
if ( isSigNaNA ) goto copy;
|
||||||
|
}
|
||||||
|
if ( ! softfloat_isNaNF128M( aWPtr ) ) ptr = bWPtr;
|
||||||
|
copy:
|
||||||
|
zWPtr[indexWordHi( 4 )] = ptr[indexWordHi( 4 )] | 0x00008000;
|
||||||
|
zWPtr[indexWord( 4, 2 )] = ptr[indexWord( 4, 2 )];
|
||||||
|
zWPtr[indexWord( 4, 1 )] = ptr[indexWord( 4, 1 )];
|
||||||
|
zWPtr[indexWord( 4, 0 )] = ptr[indexWord( 4, 0 )];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "platform.h"
|
||||||
|
#include "internals.h"
|
||||||
|
#include "specialize.h"
|
||||||
|
#include "softfloat.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| Interpreting the unsigned integer formed from concatenating `uiA64' and
|
||||||
|
| `uiA0' as a 128-bit floating-point value, and likewise interpreting the
|
||||||
|
| 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.
|
||||||
|
| If either original floating-point value is a signaling NaN, the invalid
|
||||||
|
| exception is raised.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
struct uint128
|
||||||
|
softfloat_propagateNaNF128UI(
|
||||||
|
uint_fast64_t uiA64,
|
||||||
|
uint_fast64_t uiA0,
|
||||||
|
uint_fast64_t uiB64,
|
||||||
|
uint_fast64_t uiB0
|
||||||
|
)
|
||||||
|
{
|
||||||
|
bool isSigNaNA;
|
||||||
|
struct uint128 uiZ;
|
||||||
|
|
||||||
|
isSigNaNA = softfloat_isSigNaNF128UI( uiA64, uiA0 );
|
||||||
|
if ( isSigNaNA || softfloat_isSigNaNF128UI( uiB64, uiB0 ) ) {
|
||||||
|
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||||
|
if ( isSigNaNA ) goto returnNonsigA;
|
||||||
|
}
|
||||||
|
if ( isNaNF128UI( uiA64, uiA0 ) ) {
|
||||||
|
returnNonsigA:
|
||||||
|
uiZ.v64 = uiA64;
|
||||||
|
uiZ.v0 = uiA0;
|
||||||
|
} else {
|
||||||
|
uiZ.v64 = uiB64;
|
||||||
|
uiZ.v0 = uiB0;
|
||||||
|
}
|
||||||
|
uiZ.v64 |= UINT64_C( 0x0000800000000000 );
|
||||||
|
return uiZ;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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, 2015 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 <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "platform.h"
|
||||||
|
#include "internals.h"
|
||||||
|
#include "specialize.h"
|
||||||
|
#include "softfloat.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
| the combined NaN result. If either `uiA' or `uiB' has the pattern of a
|
||||||
|
| signaling NaN, the invalid exception is raised.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
uint_fast16_t
|
||||||
|
softfloat_propagateNaNF16UI( uint_fast16_t uiA, uint_fast16_t uiB )
|
||||||
|
{
|
||||||
|
bool isSigNaNA;
|
||||||
|
|
||||||
|
isSigNaNA = softfloat_isSigNaNF16UI( uiA );
|
||||||
|
if ( isSigNaNA || softfloat_isSigNaNF16UI( uiB ) ) {
|
||||||
|
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||||
|
if ( isSigNaNA ) return uiA | 0x0200;
|
||||||
|
}
|
||||||
|
return (isNaNF16UI( uiA ) ? uiA : uiB) | 0x0200;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "platform.h"
|
||||||
|
#include "internals.h"
|
||||||
|
#include "specialize.h"
|
||||||
|
#include "softfloat.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
| the combined NaN result. If either `uiA' or `uiB' has the pattern of a
|
||||||
|
| signaling NaN, the invalid exception is raised.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
uint_fast32_t
|
||||||
|
softfloat_propagateNaNF32UI( uint_fast32_t uiA, uint_fast32_t uiB )
|
||||||
|
{
|
||||||
|
bool isSigNaNA;
|
||||||
|
|
||||||
|
isSigNaNA = softfloat_isSigNaNF32UI( uiA );
|
||||||
|
if ( isSigNaNA || softfloat_isSigNaNF32UI( uiB ) ) {
|
||||||
|
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||||
|
if ( isSigNaNA ) return uiA | 0x00400000;
|
||||||
|
}
|
||||||
|
return (isNaNF32UI( uiA ) ? uiA : uiB) | 0x00400000;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "platform.h"
|
||||||
|
#include "internals.h"
|
||||||
|
#include "specialize.h"
|
||||||
|
#include "softfloat.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
| the combined NaN result. If either `uiA' or `uiB' has the pattern of a
|
||||||
|
| signaling NaN, the invalid exception is raised.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
uint_fast64_t
|
||||||
|
softfloat_propagateNaNF64UI( uint_fast64_t uiA, uint_fast64_t uiB )
|
||||||
|
{
|
||||||
|
bool isSigNaNA;
|
||||||
|
|
||||||
|
isSigNaNA = softfloat_isSigNaNF64UI( uiA );
|
||||||
|
if ( isSigNaNA || softfloat_isSigNaNF64UI( uiB ) ) {
|
||||||
|
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||||
|
if ( isSigNaNA ) return uiA | UINT64_C( 0x0008000000000000 );
|
||||||
|
}
|
||||||
|
return (isNaNF64UI( uiA ) ? uiA : uiB) | UINT64_C( 0x0008000000000000 );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 "platform.h"
|
||||||
|
#include "softfloat.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| Raises the exceptions specified by `flags'. Floating-point traps can be
|
||||||
|
| 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
|
||||||
|
| should be simply `softfloat_exceptionFlags |= flags;'.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void softfloat_raiseFlags( uint_fast8_t flags )
|
||||||
|
{
|
||||||
|
|
||||||
|
softfloat_exceptionFlags |= flags;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,376 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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, 2018 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.
|
||||||
|
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
#ifndef specialize_h
|
||||||
|
#define specialize_h 1
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "primitiveTypes.h"
|
||||||
|
#include "softfloat.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| Default value for 'softfloat_detectTininess'.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
#define init_detectTininess softfloat_tininess_afterRounding
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| The values to return on conversions to 32-bit integer formats that raise an
|
||||||
|
| invalid exception.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
#define ui32_fromPosOverflow 0xFFFFFFFF
|
||||||
|
#define ui32_fromNegOverflow 0xFFFFFFFF
|
||||||
|
#define ui32_fromNaN 0xFFFFFFFF
|
||||||
|
#define i32_fromPosOverflow (-0x7FFFFFFF - 1)
|
||||||
|
#define i32_fromNegOverflow (-0x7FFFFFFF - 1)
|
||||||
|
#define i32_fromNaN (-0x7FFFFFFF - 1)
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| The values to return on conversions to 64-bit integer formats that raise an
|
||||||
|
| invalid exception.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
#define ui64_fromPosOverflow UINT64_C( 0xFFFFFFFFFFFFFFFF )
|
||||||
|
#define ui64_fromNegOverflow UINT64_C( 0xFFFFFFFFFFFFFFFF )
|
||||||
|
#define ui64_fromNaN UINT64_C( 0xFFFFFFFFFFFFFFFF )
|
||||||
|
#define i64_fromPosOverflow (-INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1)
|
||||||
|
#define i64_fromNegOverflow (-INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1)
|
||||||
|
#define i64_fromNaN (-INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1)
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| "Common NaN" structure, used to transfer NaN representations from one format
|
||||||
|
| to another.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
struct commonNaN {
|
||||||
|
bool sign;
|
||||||
|
#ifdef LITTLEENDIAN
|
||||||
|
uint64_t v0, v64;
|
||||||
|
#else
|
||||||
|
uint64_t v64, v0;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| The bit pattern for a default generated 16-bit floating-point NaN.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
#define defaultNaNF16UI 0xFE00
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| Returns true when 16-bit unsigned integer 'uiA' has the bit pattern of a
|
||||||
|
| 16-bit floating-point signaling NaN.
|
||||||
|
| Note: This macro evaluates its argument more than once.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
#define softfloat_isSigNaNF16UI( uiA ) ((((uiA) & 0x7E00) == 0x7C00) && ((uiA) & 0x01FF))
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
| location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid
|
||||||
|
| exception is raised.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void softfloat_f16UIToCommonNaN( uint_fast16_t uiA, struct commonNaN *zPtr );
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
uint_fast16_t softfloat_commonNaNToF16UI( const struct commonNaN *aPtr );
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
| the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a
|
||||||
|
| signaling NaN, the invalid exception is raised.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
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.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
#define defaultNaNF32UI 0xFFC00000
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
#define softfloat_isSigNaNF32UI( uiA ) ((((uiA) & 0x7FC00000) == 0x7F800000) && ((uiA) & 0x003FFFFF))
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
| location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid
|
||||||
|
| exception is raised.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void softfloat_f32UIToCommonNaN( uint_fast32_t uiA, struct commonNaN *zPtr );
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
uint_fast32_t softfloat_commonNaNToF32UI( const struct commonNaN *aPtr );
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
| the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a
|
||||||
|
| signaling NaN, the invalid exception is raised.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
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.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
#define defaultNaNF64UI UINT64_C( 0xFFF8000000000000 )
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
#define softfloat_isSigNaNF64UI( uiA ) ((((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
|
||||||
|
| 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_f64UIToCommonNaN( uint_fast64_t uiA, struct commonNaN *zPtr );
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
uint_fast64_t softfloat_commonNaNToF64UI( const struct commonNaN *aPtr );
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
| the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a
|
||||||
|
| signaling NaN, the invalid exception is raised.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
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.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
#define defaultNaNExtF80UI64 0xFFFF
|
||||||
|
#define defaultNaNExtF80UI0 UINT64_C( 0xC000000000000000 )
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
| floating-point signaling NaN.
|
||||||
|
| Note: This macro evaluates its arguments more than once.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
#define softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) ((((uiA64) & 0x7FFF) == 0x7FFF) && ! ((uiA0) & UINT64_C( 0x4000000000000000 )) && ((uiA0) & UINT64_C( 0x3FFFFFFFFFFFFFFF )))
|
||||||
|
|
||||||
|
#ifdef SOFTFLOAT_FAST_INT64
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is
|
||||||
|
| defined.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| Assuming the unsigned integer formed from concatenating 'uiA64' and 'uiA0'
|
||||||
|
| 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
|
||||||
|
| location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid
|
||||||
|
| exception is raised.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
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
|
||||||
|
| floating-point NaN, and returns the bit pattern of this value as an unsigned
|
||||||
|
| integer.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
struct uint128 softfloat_commonNaNToExtF80UI( const struct commonNaN *aPtr );
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| Interpreting the unsigned integer formed from concatenating 'uiA64' and
|
||||||
|
| 'uiA0' as an 80-bit extended floating-point value, and likewise interpreting
|
||||||
|
| 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
|
||||||
|
| invalid exception is raised.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
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.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
#define defaultNaNF128UI64 UINT64_C( 0xFFFF800000000000 )
|
||||||
|
#define defaultNaNF128UI0 UINT64_C( 0 )
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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.
|
||||||
|
| Note: This macro evaluates its arguments more than once.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
#define softfloat_isSigNaNF128UI( uiA64, uiA0 ) ((((uiA64) & UINT64_C( 0x7FFF800000000000 )) == UINT64_C( 0x7FFF000000000000 )) && ((uiA0) || ((uiA64) & UINT64_C( 0x00007FFFFFFFFFFF ))))
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
| 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_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
|
||||||
|
| NaN, and returns the bit pattern of this value as an unsigned integer.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
struct uint128 softfloat_commonNaNToF128UI( const struct commonNaN * );
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| Interpreting the unsigned integer formed from concatenating 'uiA64' and
|
||||||
|
| 'uiA0' as a 128-bit floating-point value, and likewise interpreting the
|
||||||
|
| 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.
|
||||||
|
| If either original floating-point value is a signaling NaN, the invalid
|
||||||
|
| exception is raised.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
struct uint128
|
||||||
|
softfloat_propagateNaNF128UI(
|
||||||
|
uint_fast64_t uiA64,
|
||||||
|
uint_fast64_t uiA0,
|
||||||
|
uint_fast64_t uiB64,
|
||||||
|
uint_fast64_t uiB0
|
||||||
|
);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is not
|
||||||
|
| defined.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
| common NaN at the location pointed to by 'zPtr'. If the NaN is a signaling
|
||||||
|
| NaN, the invalid exception is raised.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
softfloat_extF80MToCommonNaN(
|
||||||
|
const struct extFloat80M *aSPtr, struct commonNaN *zPtr );
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
| 'zSPtr'.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
softfloat_commonNaNToExtF80M(
|
||||||
|
const struct commonNaN *aPtr, struct extFloat80M *zSPtr );
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
| at the location pointed to by 'zSPtr'. If either original floating-point
|
||||||
|
| value is a signaling NaN, the invalid exception is raised.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
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.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
#define defaultNaNF128UI96 0xFFFF8000
|
||||||
|
#define defaultNaNF128UI64 0
|
||||||
|
#define defaultNaNF128UI32 0
|
||||||
|
#define defaultNaNF128UI0 0
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
| 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
|
||||||
|
| four 32-bit elements that concatenate in the platform's normal endian order
|
||||||
|
| to form a 128-bit floating-point value.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
softfloat_f128MToCommonNaN( const uint32_t *aWPtr, struct commonNaN *zPtr );
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "platform.h"
|
||||||
|
#include "softfloat.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool extF80M_isSignalingNaN( const extFloat80_t *aPtr )
|
||||||
|
{
|
||||||
|
const struct extFloat80M *aSPtr;
|
||||||
|
uint64_t uiA0;
|
||||||
|
|
||||||
|
aSPtr = (const struct extFloat80M *) aPtr;
|
||||||
|
if ( (aSPtr->signExp & 0x7FFF) != 0x7FFF ) return false;
|
||||||
|
uiA0 = aSPtr->signif;
|
||||||
|
return
|
||||||
|
! (uiA0 & UINT64_C( 0x4000000000000000 ))
|
||||||
|
&& (uiA0 & UINT64_C( 0x3FFFFFFFFFFFFFFF));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "platform.h"
|
||||||
|
#include "primitives.h"
|
||||||
|
#include "softfloat.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
bool f128M_isSignalingNaN( const float128_t *aPtr )
|
||||||
|
{
|
||||||
|
const uint32_t *aWPtr;
|
||||||
|
uint32_t uiA96;
|
||||||
|
|
||||||
|
aWPtr = (const uint32_t *) aPtr;
|
||||||
|
uiA96 = aWPtr[indexWordHi( 4 )];
|
||||||
|
if ( (uiA96 & 0x7FFF8000) != 0x7FFF0000 ) return false;
|
||||||
|
return
|
||||||
|
((uiA96 & 0x00007FFF) != 0)
|
||||||
|
|| ((aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
|
||||||
|
| aWPtr[indexWord( 4, 0 )])
|
||||||
|
!= 0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 "internals.h"
|
||||||
|
#include "specialize.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
| `zSPtr'.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
softfloat_commonNaNToExtF80M(
|
||||||
|
const struct commonNaN *aPtr, struct extFloat80M *zSPtr )
|
||||||
|
{
|
||||||
|
|
||||||
|
zSPtr->signExp = packToExtF80UI64( aPtr->sign, 0x7FFF );
|
||||||
|
zSPtr->signif = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 "primitives.h"
|
||||||
|
#include "specialize.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
struct uint128 softfloat_commonNaNToExtF80UI( const struct commonNaN *aPtr )
|
||||||
|
{
|
||||||
|
struct uint128 uiZ;
|
||||||
|
|
||||||
|
uiZ.v64 = (uint_fast16_t) aPtr->sign<<15 | 0x7FFF;
|
||||||
|
uiZ.v0 = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1;
|
||||||
|
return uiZ;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 "primitives.h"
|
||||||
|
#include "specialize.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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 )
|
||||||
|
{
|
||||||
|
|
||||||
|
softfloat_shortShiftRight128M( (const uint32_t *) &aPtr->v0, 16, zWPtr );
|
||||||
|
zWPtr[indexWordHi( 4 )] |= (uint32_t) aPtr->sign<<31 | 0x7FFF8000;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 "primitives.h"
|
||||||
|
#include "specialize.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
struct uint128 softfloat_commonNaNToF128UI( const struct commonNaN *aPtr )
|
||||||
|
{
|
||||||
|
struct uint128 uiZ;
|
||||||
|
|
||||||
|
uiZ = softfloat_shortShiftRight128( aPtr->v64, aPtr->v0, 16 );
|
||||||
|
uiZ.v64 |= (uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FFF800000000000 );
|
||||||
|
return uiZ;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -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, 2015 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 16-bit floating-point
|
||||||
|
| NaN, and returns the bit pattern of this value as an unsigned integer.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
uint_fast16_t softfloat_commonNaNToF16UI( const struct commonNaN *aPtr )
|
||||||
|
{
|
||||||
|
|
||||||
|
return (uint_fast16_t) aPtr->sign<<15 | 0x7E00 | aPtr->v64>>54;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -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 32-bit floating-point
|
||||||
|
| NaN, and returns the bit pattern of this value as an unsigned integer.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
uint_fast32_t softfloat_commonNaNToF32UI( const struct commonNaN *aPtr )
|
||||||
|
{
|
||||||
|
|
||||||
|
return (uint_fast32_t) aPtr->sign<<31 | 0x7FC00000 | aPtr->v64>>41;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 64-bit floating-point
|
||||||
|
| NaN, and returns the bit pattern of this value as an unsigned integer.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
uint_fast64_t softfloat_commonNaNToF64UI( const struct commonNaN *aPtr )
|
||||||
|
{
|
||||||
|
|
||||||
|
return
|
||||||
|
(uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FF8000000000000 )
|
||||||
|
| aPtr->v64>>12;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 "internals.h"
|
||||||
|
#include "specialize.h"
|
||||||
|
#include "softfloat.h"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
| 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
|
||||||
|
| common NaN at the location pointed to by `zPtr'. If the NaN is a signaling
|
||||||
|
| NaN, the invalid exception is raised.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
softfloat_extF80MToCommonNaN(
|
||||||
|
const struct extFloat80M *aSPtr, struct commonNaN *zPtr )
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( extF80M_isSignalingNaN( (const extFloat80_t *) aSPtr ) ) {
|
||||||
|
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||||
|
}
|
||||||
|
zPtr->sign = signExtF80UI64( aSPtr->signExp );
|
||||||
|
zPtr->v64 = aSPtr->signif<<1;
|
||||||
|
zPtr->v0 = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
|
||||||
|
/*============================================================================
|
||||||
|
|
||||||
|
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 the unsigned integer formed from concatenating `uiA64' and `uiA0'
|
||||||
|
| 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
|
||||||
|
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
|
||||||
|
| exception is raised.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
softfloat_extF80UIToCommonNaN(
|
||||||
|
uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr )
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) ) {
|
||||||
|
softfloat_raiseFlags( softfloat_flag_invalid );
|
||||||
|
}
|
||||||
|
zPtr->sign = uiA64>>15;
|
||||||
|
zPtr->v64 = uiA0<<1;
|
||||||
|
zPtr->v0 = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue