Reorganized repo layout
This commit is contained in:
parent
eb8365f4c3
commit
19da33fb20
19
.cproject
19
.cproject
|
@ -17,7 +17,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.2135578907" keepEnvironmentInBuildfile="false" name="CMake Builder (portable)" parallelBuildOn="true" parallelizationNumber="optimal" superClass="de.marw.cdt.cmake.core.genscriptbuilder"/>
|
<builder buildPath="/RISCV-VP/build/Debug" id="de.marw.cdt.cmake.core.genscriptbuilder.2135578907" keepEnvironmentInBuildfile="false" name="CMake Builder (portable)" parallelBuildOn="false" superClass="de.marw.cdt.cmake.core.genscriptbuilder"/>
|
||||||
<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"/>
|
||||||
|
@ -48,9 +48,8 @@
|
||||||
<options/>
|
<options/>
|
||||||
<linux command="cmake" generator="UnixMakefiles" use-default="true">
|
<linux command="cmake" generator="UnixMakefiles" use-default="true">
|
||||||
<defs>
|
<defs>
|
||||||
<def name="CMAKE_VERBOSE_MAKEFILE" type="BOOL" val="OFF"/>
|
<def name="CMAKE_VERBOSE_MAKEFILE" type="BOOL" val="ON"/>
|
||||||
</defs>
|
</defs>
|
||||||
<undefs/>
|
|
||||||
</linux>
|
</linux>
|
||||||
<win32 command="cmake" generator="MinGWMakefiles" use-default="true">
|
<win32 command="cmake" generator="MinGWMakefiles" use-default="true">
|
||||||
<defs/>
|
<defs/>
|
||||||
|
@ -74,7 +73,7 @@
|
||||||
<folderInfo id="cdt.managedbuild.config.gnu.exe.release.1745230171." name="/" resourcePath="">
|
<folderInfo id="cdt.managedbuild.config.gnu.exe.release.1745230171." name="/" resourcePath="">
|
||||||
<toolChain id="cdt.managedbuild.toolchain.gnu.exe.release.2006835092" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.release">
|
<toolChain id="cdt.managedbuild.toolchain.gnu.exe.release.2006835092" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.release">
|
||||||
<targetPlatform binaryParser="org.eclipse.cdt.core.GNU_ELF;org.eclipse.cdt.core.ELF" id="cdt.managedbuild.target.gnu.platform.exe.release.1630517313" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.release"/>
|
<targetPlatform binaryParser="org.eclipse.cdt.core.GNU_ELF;org.eclipse.cdt.core.ELF" id="cdt.managedbuild.target.gnu.platform.exe.release.1630517313" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.release"/>
|
||||||
<builder buildPath="/DBT-RISE-RISCV/build/Release" id="de.marw.cdt.cmake.core.genscriptbuilder.1359576856" keepEnvironmentInBuildfile="false" name="CMake Builder (portable)" parallelBuildOn="true" parallelizationNumber="optimal" superClass="de.marw.cdt.cmake.core.genscriptbuilder"/>
|
<builder buildPath="/RISCV-VP/build/Release" id="de.marw.cdt.cmake.core.genscriptbuilder.1359576856" keepEnvironmentInBuildfile="false" name="CMake Builder (portable)" parallelBuildOn="true" parallelizationNumber="optimal" superClass="de.marw.cdt.cmake.core.genscriptbuilder"/>
|
||||||
<tool id="cdt.managedbuild.tool.gnu.archiver.base.1428458401" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
|
<tool id="cdt.managedbuild.tool.gnu.archiver.base.1428458401" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
|
||||||
<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.187095968" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release">
|
<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.187095968" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release">
|
||||||
<option id="gnu.cpp.compiler.exe.release.option.optimization.level.73514910" name="Optimization Level" superClass="gnu.cpp.compiler.exe.release.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
|
<option id="gnu.cpp.compiler.exe.release.option.optimization.level.73514910" name="Optimization Level" superClass="gnu.cpp.compiler.exe.release.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
|
||||||
|
@ -125,7 +124,7 @@
|
||||||
<folderInfo id="cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404." name="/" resourcePath="">
|
<folderInfo id="cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404." name="/" resourcePath="">
|
||||||
<toolChain id="cdt.managedbuild.toolchain.gnu.exe.release.1502160352" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.release">
|
<toolChain id="cdt.managedbuild.toolchain.gnu.exe.release.1502160352" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.release">
|
||||||
<targetPlatform binaryParser="org.eclipse.cdt.core.GNU_ELF;org.eclipse.cdt.core.ELF" id="cdt.managedbuild.target.gnu.platform.exe.release.689260696" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.release"/>
|
<targetPlatform binaryParser="org.eclipse.cdt.core.GNU_ELF;org.eclipse.cdt.core.ELF" id="cdt.managedbuild.target.gnu.platform.exe.release.689260696" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.release"/>
|
||||||
<builder buildPath="/DBT-RISE-RISCV/build/Release" id="de.marw.cdt.cmake.core.genscriptbuilder.775458297" keepEnvironmentInBuildfile="false" name="CMake Builder (portable)" parallelBuildOn="true" parallelizationNumber="optimal" superClass="de.marw.cdt.cmake.core.genscriptbuilder"/>
|
<builder buildPath="/RISCV-VP/build/Release" id="de.marw.cdt.cmake.core.genscriptbuilder.775458297" keepEnvironmentInBuildfile="false" name="CMake Builder (portable)" parallelBuildOn="true" parallelizationNumber="optimal" superClass="de.marw.cdt.cmake.core.genscriptbuilder"/>
|
||||||
<tool id="cdt.managedbuild.tool.gnu.archiver.base.1134372172" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
|
<tool id="cdt.managedbuild.tool.gnu.archiver.base.1134372172" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
|
||||||
<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.1556984395" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release">
|
<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.1556984395" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release">
|
||||||
<option id="gnu.cpp.compiler.exe.release.option.optimization.level.1353963182" name="Optimization Level" superClass="gnu.cpp.compiler.exe.release.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
|
<option id="gnu.cpp.compiler.exe.release.option.optimization.level.1353963182" name="Optimization Level" superClass="gnu.cpp.compiler.exe.release.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
|
||||||
|
@ -169,21 +168,21 @@
|
||||||
</cconfiguration>
|
</cconfiguration>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
<project id="DBT-RISE-RISCV.cdt.managedbuild.target.gnu.exe.1695631616" name="Executable" projectType="cdt.managedbuild.target.gnu.exe"/>
|
<project id="RISCV-VP.cdt.managedbuild.target.gnu.exe.1695631616" name="Executable" projectType="cdt.managedbuild.target.gnu.exe"/>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
||||||
<storageModule moduleId="refreshScope" versionNumber="2">
|
<storageModule moduleId="refreshScope" versionNumber="2">
|
||||||
<configuration configurationName="RelWithDebInfo">
|
<configuration configurationName="RelWithDebInfo">
|
||||||
<resource resourceType="PROJECT" workspacePath="/DBT-RISE-RISCV"/>
|
<resource resourceType="PROJECT" workspacePath="/RISCV-VP"/>
|
||||||
</configuration>
|
</configuration>
|
||||||
<configuration configurationName="Default">
|
<configuration configurationName="Default">
|
||||||
<resource resourceType="PROJECT" workspacePath="/DBT-RISE-RISCV"/>
|
<resource resourceType="PROJECT" workspacePath="/RISCV-VP"/>
|
||||||
</configuration>
|
</configuration>
|
||||||
<configuration configurationName="Debug">
|
<configuration configurationName="Debug">
|
||||||
<resource resourceType="PROJECT" workspacePath="/DBT-RISE-RISCV"/>
|
<resource resourceType="PROJECT" workspacePath="/RISCV-VP"/>
|
||||||
</configuration>
|
</configuration>
|
||||||
<configuration configurationName="Release">
|
<configuration configurationName="Release">
|
||||||
<resource resourceType="PROJECT" workspacePath="/DBT-RISE-RISCV"/>
|
<resource resourceType="PROJECT" workspacePath="/RISCV-VP"/>
|
||||||
</configuration>
|
</configuration>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
|
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
[submodule "dbt-core"]
|
[submodule "dbt-core"]
|
||||||
path = dbt-core
|
path = dbt-core
|
||||||
url = https://git.minres.com/DBT-RISE/DBT-RISE-Core.git
|
url = https://git.minres.com/DBT-RISE/DBT-RISE-Core.git
|
||||||
[submodule "sc-components"]
|
[submodule "scc"]
|
||||||
path = sc-components
|
path = scc
|
||||||
url = https://git.minres.com/SystemC/SystemC-Components.git
|
url = https://git.minres.com/SystemC/SystemC-Components.git
|
||||||
[submodule "external/elfio"]
|
[submodule "external/elfio"]
|
||||||
path = external/elfio
|
path = external/elfio
|
||||||
|
@ -10,3 +10,6 @@
|
||||||
[submodule "external/libGIS"]
|
[submodule "external/libGIS"]
|
||||||
path = external/libGIS
|
path = external/libGIS
|
||||||
url = https://github.com/vsergeev/libGIS.git
|
url = https://github.com/vsergeev/libGIS.git
|
||||||
|
[submodule "riscv"]
|
||||||
|
path = riscv
|
||||||
|
url = https://git.minres.com/DBT-RISE/DBT-RISE-RISCV.git
|
||||||
|
|
2
.project
2
.project
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<projectDescription>
|
<projectDescription>
|
||||||
<name>DBT-RISE-RISCV</name>
|
<name>RISCV-VP</name>
|
||||||
<comment></comment>
|
<comment></comment>
|
||||||
<projects>
|
<projects>
|
||||||
</projects>
|
</projects>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
cmake_minimum_required(VERSION 3.3)
|
cmake_minimum_required(VERSION 3.3)
|
||||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_CURRENT_SOURCE_DIR}/sc-components/cmake)
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_CURRENT_SOURCE_DIR}/scc/cmake)
|
||||||
|
|
||||||
set(ENABLE_SCV TRUE CACHE BOOL "Enable use of SCV")
|
set(ENABLE_SCV TRUE CACHE BOOL "Enable use of SCV")
|
||||||
set(ENABLE_SHARED TRUE CACHE BOOL "Build shared libraries")
|
set(ENABLE_SHARED TRUE CACHE BOOL "Build shared libraries")
|
||||||
|
@ -15,14 +15,16 @@ IF(NOT ${GIT_BRANCH} MATCHES "master")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
### set the directory names of the submodules
|
### set the directory names of the submodules
|
||||||
set(GIT_SUBMODULES elfio libGIS sc-components dbt-core)
|
set(GIT_SUBMODULES elfio libGIS scc dbt-core)
|
||||||
set(GIT_SUBMODULE_DIR_sc-components .)
|
set(GIT_SUBMODULE_DIR_scc .)
|
||||||
set(GIT_SUBMODULE_DIR_dbt-core .)
|
set(GIT_SUBMODULE_DIR_dbt-core .)
|
||||||
|
set(GIT_SUBMODULE_DIR_riscv .)
|
||||||
### set each submodules's commit or tag that is to be checked out
|
### set each submodules's commit or tag that is to be checked out
|
||||||
### (leave empty if you want master)
|
### (leave empty if you want master)
|
||||||
#set(GIT_SUBMODULE_VERSION_sc-comp 3af6b9836589b082c19d9131c5d0b7afa8ddd7cd)
|
#set(GIT_SUBMODULE_VERSION_sc-comp 3af6b9836589b082c19d9131c5d0b7afa8ddd7cd)
|
||||||
set(GIT_SUBMODULE_BRANCH_sc-components ${GIT_BRANCH})
|
set(GIT_SUBMODULE_BRANCH_scc ${GIT_BRANCH})
|
||||||
set(GIT_SUBMODULE_BRANCH_dbt-core ${GIT_BRANCH})
|
set(GIT_SUBMODULE_BRANCH_dbt-core ${GIT_BRANCH})
|
||||||
|
set(GIT_SUBMODULE_BRANCH_riscv ${GIT_BRANCH})
|
||||||
|
|
||||||
include(GNUInstallDirs)
|
include(GNUInstallDirs)
|
||||||
include(Submodules)
|
include(Submodules)
|
||||||
|
@ -110,10 +112,8 @@ set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})
|
||||||
|
|
||||||
add_subdirectory(external)
|
add_subdirectory(external)
|
||||||
add_subdirectory(dbt-core)
|
add_subdirectory(dbt-core)
|
||||||
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(scc)
|
||||||
add_subdirectory(platform)
|
add_subdirectory(platform)
|
||||||
|
|
||||||
message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}")
|
message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}")
|
||||||
|
|
2
dbt-core
2
dbt-core
|
@ -1 +1 @@
|
||||||
Subproject commit 2f4aab87b0f86504a26cd8a6e781fc43bfd6e00f
|
Subproject commit c449c3c0c8670addfa2e76cecd03d75764f17656
|
|
@ -3,6 +3,6 @@
|
||||||
<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/bin/java"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/java"/>
|
||||||
<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_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:RISCV-VP}/riscv/incl/iss/arch -s=${project_loc:RISCV-VP}/riscv/src/iss -v=${project_loc:RISCV-VP}/riscv/src/internal -t=${project_loc:RISCV-VP}/riscv/gen_input/templates ${project_loc:RISCV-VP}/riscv/gen_input/minres_rv.core_desc"/>
|
||||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/DBT-RISE-RISCV}/riscv/gen_input"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/RISCV-VP}/riscv/gen_input"/>
|
||||||
</launchConfiguration>
|
</launchConfiguration>
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
<booleanAttribute key="de.toem.impulse.launchrestart" value="true"/>
|
<booleanAttribute key="de.toem.impulse.launchrestart" value="true"/>
|
||||||
<intAttribute key="de.toem.impulse.launchterminate" value="1"/>
|
<intAttribute key="de.toem.impulse.launchterminate" value="1"/>
|
||||||
<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="${workspace_loc:/DBT-RISE-RISCV/etc/cmake.sh}"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${workspace_loc:/RISCV-VP/etc/cmake.sh}"/>
|
||||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-DCMAKE_BUILD_TYPE=Debug .."/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-DCMAKE_BUILD_TYPE=Debug .."/>
|
||||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/DBT-RISE-RISCV}"/>
|
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/DBT-RISE-RISCV}"/>
|
||||||
</launchConfiguration>
|
</launchConfiguration>
|
||||||
|
|
|
@ -28,11 +28,11 @@
|
||||||
<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="build/Debug/riscv/bin/riscv-sim"/>
|
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="build/Debug/riscv/bin/riscv-sim"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="DBT-RISE-RISCV"/>
|
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="RISCV-VP"/>
|
||||||
<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="cdt.managedbuild.config.gnu.exe.debug.1751741082"/>
|
<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">
|
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
||||||
<listEntry value="/DBT-RISE-RISCV"/>
|
<listEntry value="/RISCV-VP"/>
|
||||||
</listAttribute>
|
</listAttribute>
|
||||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
||||||
<listEntry value="4"/>
|
<listEntry value="4"/>
|
||||||
|
|
|
@ -26,13 +26,13 @@
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="run"/>
|
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="run"/>
|
||||||
<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 -p ic=${workspace_loc:DBT-RISE-RISCV}/cycles.txt ${project_loc:hello}/hello"/>
|
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="-v4 -p ic=${workspace_loc:RISCV-VP}/cycles.txt ${project_loc:hello}/hello"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="build/Debug/riscv/bin/riscv-sim"/>
|
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="build/Debug/riscv/bin/riscv-sim"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="DBT-RISE-RISCV"/>
|
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="RISCV-VP"/>
|
||||||
<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="cdt.managedbuild.config.gnu.exe.debug.1751741082"/>
|
<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">
|
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
||||||
<listEntry value="/DBT-RISE-RISCV"/>
|
<listEntry value="/RISCV-VP"/>
|
||||||
</listAttribute>
|
</listAttribute>
|
||||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
||||||
<listEntry value="4"/>
|
<listEntry value="4"/>
|
||||||
|
|
|
@ -0,0 +1,129 @@
|
||||||
|
https://elixir.bootlin.com/linux/latest/source/kernel/gcov/gcc_4_7.c
|
||||||
|
https://github.com/gcc-mirror/gcc/blob/master/gcc/gcov-io.c
|
||||||
|
https://github.com/gcc-mirror/gcc/blob/master/gcc/gcov-io.h
|
||||||
|
https://stackoverflow.com/questions/36839354/generating-gcda-coverage-files-via-qemu-gdb
|
||||||
|
http://blog.techveda.org/howsourcedebuggerswork/
|
||||||
|
|
||||||
|
Coverage information is held in two files. A notes file, which is
|
||||||
|
generated by the compiler, and a data file, which is generated by
|
||||||
|
the program under test. Both files use a similar structure. We do
|
||||||
|
not attempt to make these files backwards compatible with previous
|
||||||
|
versions, as you only need coverage information when developing a
|
||||||
|
program. We do hold version information, so that mismatches can be
|
||||||
|
detected, and we use a format that allows tools to skip information
|
||||||
|
they do not understand or are not interested in.
|
||||||
|
Numbers are recorded in the 32 bit unsigned binary form of the
|
||||||
|
endianness of the machine generating the file. 64 bit numbers are
|
||||||
|
stored as two 32 bit numbers, the low part first. Strings are
|
||||||
|
padded with 1 to 4 NUL bytes, to bring the length up to a multiple
|
||||||
|
of 4. The number of 4 bytes is stored, followed by the padded
|
||||||
|
string. Zero length and NULL strings are simply stored as a length
|
||||||
|
of zero (they have no trailing NUL or padding).
|
||||||
|
int32: byte3 byte2 byte1 byte0 | byte0 byte1 byte2 byte3
|
||||||
|
int64: int32:low int32:high
|
||||||
|
string: int32:0 | int32:length char* char:0 padding
|
||||||
|
padding: | char:0 | char:0 char:0 | char:0 char:0 char:0
|
||||||
|
item: int32 | int64 | string
|
||||||
|
The basic format of the notes file is
|
||||||
|
file : int32:magic int32:version int32:stamp int32:support_unexecuted_blocks record*
|
||||||
|
The basic format of the data file is
|
||||||
|
file : int32:magic int32:version int32:stamp record*
|
||||||
|
The magic ident is different for the notes and the data files. The
|
||||||
|
magic ident is used to determine the endianness of the file, when
|
||||||
|
reading. The version is the same for both files and is derived
|
||||||
|
from gcc's version number. The stamp value is used to synchronize
|
||||||
|
note and data files and to synchronize merging within a data
|
||||||
|
file. It need not be an absolute time stamp, merely a ticker that
|
||||||
|
increments fast enough and cycles slow enough to distinguish
|
||||||
|
different compile/run/compile cycles.
|
||||||
|
Although the ident and version are formally 32 bit numbers, they
|
||||||
|
are derived from 4 character ASCII strings. The version number
|
||||||
|
consists of a two character major version number
|
||||||
|
(first digit starts from 'A' letter to not to clash with the older
|
||||||
|
numbering scheme), the single character minor version number,
|
||||||
|
and a single character indicating the status of the release.
|
||||||
|
That will be 'e' experimental, 'p' prerelease and 'r' for release.
|
||||||
|
Because, by good fortune, these are in alphabetical order, string
|
||||||
|
collating can be used to compare version strings. Be aware that
|
||||||
|
the 'e' designation will (naturally) be unstable and might be
|
||||||
|
incompatible with itself. For gcc 17.0 experimental, it would be
|
||||||
|
'B70e' (0x42373065). As we currently do not release more than 5 minor
|
||||||
|
releases, the single character should be always fine. Major number
|
||||||
|
is currently changed roughly every year, which gives us space
|
||||||
|
for next 250 years (maximum allowed number would be 259.9).
|
||||||
|
A record has a tag, length and variable amount of data.
|
||||||
|
record: header data
|
||||||
|
header: int32:tag int32:length
|
||||||
|
data: item*
|
||||||
|
Records are not nested, but there is a record hierarchy. Tag
|
||||||
|
numbers reflect this hierarchy. Tags are unique across note and
|
||||||
|
data files. Some record types have a varying amount of data. The
|
||||||
|
LENGTH is the number of 4bytes that follow and is usually used to
|
||||||
|
determine how much data. The tag value is split into 4 8-bit
|
||||||
|
fields, one for each of four possible levels. The most significant
|
||||||
|
is allocated first. Unused levels are zero. Active levels are
|
||||||
|
odd-valued, so that the LSB of the level is one. A sub-level
|
||||||
|
incorporates the values of its superlevels. This formatting allows
|
||||||
|
you to determine the tag hierarchy, without understanding the tags
|
||||||
|
themselves, and is similar to the standard section numbering used
|
||||||
|
in technical documents. Level values [1..3f] are used for common
|
||||||
|
tags, values [41..9f] for the notes file and [a1..ff] for the data
|
||||||
|
file.
|
||||||
|
The notes file contains the following records
|
||||||
|
note: unit function-graph*
|
||||||
|
unit: header int32:checksum string:source
|
||||||
|
function-graph: announce_function basic_blocks {arcs | lines}*
|
||||||
|
announce_function: header int32:ident
|
||||||
|
int32:lineno_checksum int32:cfg_checksum
|
||||||
|
string:name string:source int32:start_lineno int32:start_column int32:end_lineno
|
||||||
|
basic_block: header int32:flags*
|
||||||
|
arcs: header int32:block_no arc*
|
||||||
|
arc: int32:dest_block int32:flags
|
||||||
|
lines: header int32:block_no line*
|
||||||
|
int32:0 string:NULL
|
||||||
|
line: int32:line_no | int32:0 string:filename
|
||||||
|
The BASIC_BLOCK record holds per-bb flags. The number of blocks
|
||||||
|
can be inferred from its data length. There is one ARCS record per
|
||||||
|
basic block. The number of arcs from a bb is implicit from the
|
||||||
|
data length. It enumerates the destination bb and per-arc flags.
|
||||||
|
There is one LINES record per basic block, it enumerates the source
|
||||||
|
lines which belong to that basic block. Source file names are
|
||||||
|
introduced by a line number of 0, following lines are from the new
|
||||||
|
source file. The initial source file for the function is NULL, but
|
||||||
|
the current source file should be remembered from one LINES record
|
||||||
|
to the next. The end of a block is indicated by an empty filename
|
||||||
|
- this does not reset the current source file. Note there is no
|
||||||
|
ordering of the ARCS and LINES records: they may be in any order,
|
||||||
|
interleaved in any manner. The current filename follows the order
|
||||||
|
the LINES records are stored in the file, *not* the ordering of the
|
||||||
|
blocks they are for.
|
||||||
|
The data file contains the following records.
|
||||||
|
data: {unit summary:object summary:program* function-data*}*
|
||||||
|
unit: header int32:checksum
|
||||||
|
function-data: announce_function present counts
|
||||||
|
announce_function: header int32:ident
|
||||||
|
int32:lineno_checksum int32:cfg_checksum
|
||||||
|
present: header int32:present
|
||||||
|
counts: header int64:count*
|
||||||
|
summary: int32:checksum {count-summary}GCOV_COUNTERS_SUMMABLE
|
||||||
|
count-summary: int32:num int32:runs int64:sum
|
||||||
|
int64:max int64:sum_max histogram
|
||||||
|
histogram: {int32:bitvector}8 histogram-buckets*
|
||||||
|
histogram-buckets: int32:num int64:min int64:sum
|
||||||
|
The ANNOUNCE_FUNCTION record is the same as that in the note file,
|
||||||
|
but without the source location. The COUNTS gives the
|
||||||
|
counter values for instrumented features. The about the whole
|
||||||
|
program. The checksum is used for whole program summaries, and
|
||||||
|
disambiguates different programs which include the same
|
||||||
|
instrumented object file. There may be several program summaries,
|
||||||
|
each with a unique checksum. The object summary's checksum is
|
||||||
|
zero. Note that the data file might contain information from
|
||||||
|
several runs concatenated, or the data might be merged.
|
||||||
|
This file is included by both the compiler, gcov tools and the
|
||||||
|
runtime support library libgcov. IN_LIBGCOV and IN_GCOV are used to
|
||||||
|
distinguish which case is which. If IN_LIBGCOV is nonzero,
|
||||||
|
libgcov is being built. If IN_GCOV is nonzero, the gcov tools are
|
||||||
|
being built. Otherwise the compiler is being built. IN_GCOV may be
|
||||||
|
positive or negative. If positive, we are compiling a tool that
|
||||||
|
requires additional functions (see the code for knowledge of what
|
||||||
|
those functions are).
|
|
@ -1 +1 @@
|
||||||
Subproject commit 1fdbb6423528684e7b5d6dd9095b64f5617b1434
|
Subproject commit 580da2467b3d7da4c817d45a99a367e4b0d6d326
|
|
@ -23,7 +23,7 @@ endif()
|
||||||
# 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.
|
||||||
|
|
||||||
add_dependent_subproject(dbt-core)
|
add_dependent_subproject(dbt-core)
|
||||||
add_dependent_subproject(sc-components)
|
add_dependent_subproject(scc)
|
||||||
add_dependent_subproject(riscv)
|
add_dependent_subproject(riscv)
|
||||||
|
|
||||||
include_directories(
|
include_directories(
|
||||||
|
|
|
@ -36,7 +36,7 @@ add_library(${LIBRARY_NAME} SHARED ${LIB_SOURCES})
|
||||||
target_link_libraries(${LIBRARY_NAME} riscv_sc)
|
target_link_libraries(${LIBRARY_NAME} riscv_sc)
|
||||||
target_link_libraries(${LIBRARY_NAME} dbt-core)
|
target_link_libraries(${LIBRARY_NAME} dbt-core)
|
||||||
target_link_libraries(${LIBRARY_NAME} softfloat)
|
target_link_libraries(${LIBRARY_NAME} softfloat)
|
||||||
target_link_libraries(${LIBRARY_NAME} sc-components)
|
target_link_libraries(${LIBRARY_NAME} scc)
|
||||||
target_link_libraries(${LIBRARY_NAME} ${CONAN_LIBS_SEASOCKS})
|
target_link_libraries(${LIBRARY_NAME} ${CONAN_LIBS_SEASOCKS})
|
||||||
target_link_libraries(${LIBRARY_NAME} external)
|
target_link_libraries(${LIBRARY_NAME} external)
|
||||||
target_link_libraries(${LIBRARY_NAME} ${llvm_libs})
|
target_link_libraries(${LIBRARY_NAME} ${llvm_libs})
|
||||||
|
@ -74,7 +74,7 @@ target_link_libraries(${APPLICATION_NAME} ${LIBRARY_NAME})
|
||||||
target_link_libraries(${APPLICATION_NAME} riscv_sc)
|
target_link_libraries(${APPLICATION_NAME} riscv_sc)
|
||||||
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} softfloat)
|
||||||
target_link_libraries(${APPLICATION_NAME} sc-components)
|
target_link_libraries(${APPLICATION_NAME} scc)
|
||||||
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)
|
||||||
target_link_libraries(${APPLICATION_NAME} ${llvm_libs})
|
target_link_libraries(${APPLICATION_NAME} ${llvm_libs})
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 2758933c16a6a0d8b5ade685b0ceb44a329343be
|
|
@ -1 +0,0 @@
|
||||||
/src-gen/
|
|
|
@ -1,52 +0,0 @@
|
||||||
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("riscv")
|
|
||||||
|
|
||||||
include(Common)
|
|
||||||
|
|
||||||
conan_basic_setup()
|
|
||||||
|
|
||||||
# This sets the include directory for the reference project. This is the -I flag in gcc.
|
|
||||||
include_directories(
|
|
||||||
${PROJECT_SOURCE_DIR}/incl
|
|
||||||
${SOFTFLOAT_INCLUDE_DIRS}
|
|
||||||
${LLVM_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
add_dependent_subproject(dbt-core)
|
|
||||||
add_dependent_subproject(sc-components)
|
|
||||||
include_directories(
|
|
||||||
${PROJECT_SOURCE_DIR}/incl
|
|
||||||
${PROJECT_SOURCE_DIR}/../external/elfio
|
|
||||||
${PROJECT_SOURCE_DIR}/../external/libGIS
|
|
||||||
${Boost_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
# Mac needed variables (adapt for your needs - http://www.cmake.org/Wiki/CMake_RPATH_handling#Mac_OS_X_and_the_RPATH)
|
|
||||||
set(CMAKE_MACOSX_RPATH ON)
|
|
||||||
set(CMAKE_SKIP_BUILD_RPATH FALSE)
|
|
||||||
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
|
|
||||||
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
|
|
||||||
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
|
|
||||||
|
|
||||||
add_subdirectory(src)
|
|
||||||
|
|
||||||
#
|
|
||||||
# SYSTEM PACKAGING (RPM, TGZ, ...)
|
|
||||||
# _____________________________________________________________________________
|
|
||||||
|
|
||||||
#include(CPackConfig)
|
|
||||||
|
|
||||||
#
|
|
||||||
# CMAKE PACKAGING (for other CMake projects to use this one easily)
|
|
||||||
# _____________________________________________________________________________
|
|
||||||
|
|
||||||
#include(PackageConfigurator)
|
|
|
@ -1 +0,0 @@
|
||||||
/src-gen/
|
|
|
@ -1,50 +0,0 @@
|
||||||
InsructionSet RISCVBase {
|
|
||||||
constants {
|
|
||||||
XLEN,
|
|
||||||
fence:=0,
|
|
||||||
fencei:=1,
|
|
||||||
fencevmal:=2,
|
|
||||||
fencevmau:=3
|
|
||||||
}
|
|
||||||
|
|
||||||
address_spaces {
|
|
||||||
MEM[8], CSR[XLEN], FENCE[XLEN], RES[8]
|
|
||||||
}
|
|
||||||
|
|
||||||
registers {
|
|
||||||
[31:0] X[XLEN],
|
|
||||||
PC[XLEN](is_pc),
|
|
||||||
alias ZERO[XLEN] is X[0],
|
|
||||||
alias RA[XLEN] is X[1],
|
|
||||||
alias SP[XLEN] is X[2],
|
|
||||||
alias GP[XLEN] is X[3],
|
|
||||||
alias TP[XLEN] is X[4],
|
|
||||||
alias T0[XLEN] is X[5],
|
|
||||||
alias T1[XLEN] is X[6],
|
|
||||||
alias T2[XLEN] is X[7],
|
|
||||||
alias S0[XLEN] is X[8],
|
|
||||||
alias S1[XLEN] is X[9],
|
|
||||||
alias A0[XLEN] is X[10],
|
|
||||||
alias A1[XLEN] is X[11],
|
|
||||||
alias A2[XLEN] is X[12],
|
|
||||||
alias A3[XLEN] is X[13],
|
|
||||||
alias A4[XLEN] is X[14],
|
|
||||||
alias A5[XLEN] is X[15],
|
|
||||||
alias A6[XLEN] is X[16],
|
|
||||||
alias A7[XLEN] is X[17],
|
|
||||||
alias S2[XLEN] is X[18],
|
|
||||||
alias S3[XLEN] is X[19],
|
|
||||||
alias S4[XLEN] is X[20],
|
|
||||||
alias S5[XLEN] is X[21],
|
|
||||||
alias S6[XLEN] is X[22],
|
|
||||||
alias S7[XLEN] is X[23],
|
|
||||||
alias S8[XLEN] is X[24],
|
|
||||||
alias S9[XLEN] is X[25],
|
|
||||||
alias S10[XLEN] is X[26],
|
|
||||||
alias S11[XLEN] is X[27],
|
|
||||||
alias T3[XLEN] is X[28],
|
|
||||||
alias T4[XLEN] is X[29],
|
|
||||||
alias T5[XLEN] is X[30],
|
|
||||||
alias T6[XLEN] is X[31]
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,309 +0,0 @@
|
||||||
import "RISCVBase.core_desc"
|
|
||||||
|
|
||||||
InsructionSet RV32I extends RISCVBase{
|
|
||||||
|
|
||||||
instructions {
|
|
||||||
LUI{
|
|
||||||
encoding: imm[31:12]s | rd[4:0] | b0110111;
|
|
||||||
args_disass: "{name(rd)}, {imm:#05x}";
|
|
||||||
if(rd!=0) X[rd] <= imm;
|
|
||||||
}
|
|
||||||
AUIPC{
|
|
||||||
encoding: imm[31:12]s | rd[4:0] | b0010111;
|
|
||||||
args_disass: "{name(rd)}, {imm:#08x}";
|
|
||||||
if(rd!=0) X[rd] <= PC's+imm;
|
|
||||||
}
|
|
||||||
JAL(no_cont){
|
|
||||||
encoding: imm[20:20]s | imm[10:1]s | imm[11:11]s | imm[19:12]s | rd[4:0] | b1101111;
|
|
||||||
args_disass: "{name(rd)}, {imm:#0x}";
|
|
||||||
if(rd!=0) X[rd] <= PC+4;
|
|
||||||
PC<=PC's+imm;
|
|
||||||
}
|
|
||||||
JALR(no_cont){
|
|
||||||
encoding: imm[11:0]s | rs1[4:0] | b000 | rd[4:0] | b1100111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {imm:#0x}";
|
|
||||||
val new_pc[XLEN] <= X[rs1]'s+ imm;
|
|
||||||
val align[XLEN] <= new_pc & 0x2;
|
|
||||||
if(align != 0){
|
|
||||||
raise(0, 0);
|
|
||||||
} else {
|
|
||||||
if(rd!=0) X[rd] <= PC+4;
|
|
||||||
PC<=new_pc & ~0x1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
BEQ(no_cont,cond){
|
|
||||||
encoding: imm[12:12]s |imm[10:5]s | rs2[4:0] | rs1[4:0] | b000 | imm[4:1]s | imm[11:11]s | b1100011;
|
|
||||||
args_disass:"{name(rs1)}, {name(rs2)}, {imm:#0x}";
|
|
||||||
PC<=choose(X[rs1]==X[rs2], PC's+imm, PC+4);
|
|
||||||
}
|
|
||||||
BNE(no_cont,cond){
|
|
||||||
encoding: imm[12:12]s |imm[10:5]s | rs2[4:0] | rs1[4:0] | b001 | imm[4:1]s | imm[11:11]s | b1100011;
|
|
||||||
args_disass:"{name(rs1)}, {name(rs2)}, {imm:#0x}";
|
|
||||||
PC<=choose(X[rs1]!=X[rs2], PC's+imm, PC+4);
|
|
||||||
}
|
|
||||||
BLT(no_cont,cond){
|
|
||||||
encoding: imm[12:12]s |imm[10:5]s | rs2[4:0] | rs1[4:0] | b100 | imm[4:1]s | imm[11:11]s | b1100011;
|
|
||||||
args_disass:"{name(rs1)}, {name(rs2)}, {imm:#0x}";
|
|
||||||
PC<=choose(X[rs1]s<X[rs2]s, PC's+imm, PC+4);
|
|
||||||
}
|
|
||||||
BGE(no_cont,cond) {
|
|
||||||
encoding: imm[12:12]s |imm[10:5]s | rs2[4:0] | rs1[4:0] | b101 | imm[4:1]s | imm[11:11]s | b1100011;
|
|
||||||
args_disass:"{name(rs1)}, {name(rs2)}, {imm:#0x}";
|
|
||||||
PC<=choose(X[rs1]s>=X[rs2]s, PC's+imm, PC+4);
|
|
||||||
}
|
|
||||||
BLTU(no_cont,cond) {
|
|
||||||
encoding: imm[12:12]s |imm[10:5]s | rs2[4:0] | rs1[4:0] | b110 | imm[4:1]s | imm[11:11]s | b1100011;
|
|
||||||
args_disass:"{name(rs1)}, {name(rs2)}, {imm:#0x}";
|
|
||||||
PC<=choose(X[rs1]<X[rs2],PC's+imm, PC+4);
|
|
||||||
}
|
|
||||||
BGEU(no_cont,cond) {
|
|
||||||
encoding: imm[12:12]s |imm[10:5]s | rs2[4:0] | rs1[4:0] | b111 | imm[4:1]s | imm[11:11]s | b1100011;
|
|
||||||
args_disass:"{name(rs1)}, {name(rs2)}, {imm:#0x}";
|
|
||||||
PC<=choose(X[rs1]>=X[rs2], PC's+imm, PC+4);
|
|
||||||
}
|
|
||||||
LB {
|
|
||||||
encoding: imm[11:0]s | rs1[4:0] | b000 | rd[4:0] | b0000011;
|
|
||||||
args_disass:"{name(rd)}, {imm}({name(rs1)})";
|
|
||||||
val offs[XLEN] <= X[rs1]'s+imm;
|
|
||||||
if(rd!=0) X[rd]<=sext(MEM[offs]);
|
|
||||||
}
|
|
||||||
LH {
|
|
||||||
encoding: imm[11:0]s | rs1[4:0] | b001 | rd[4:0] | b0000011;
|
|
||||||
args_disass:"{name(rd)}, {imm}({name(rs1)})";
|
|
||||||
val offs[XLEN] <= X[rs1]'s+imm;
|
|
||||||
if(rd!=0) X[rd]<=sext(MEM[offs]{16});
|
|
||||||
}
|
|
||||||
LW {
|
|
||||||
encoding: imm[11:0]s | rs1[4:0] | b010 | rd[4:0] | b0000011;
|
|
||||||
args_disass:"{name(rd)}, {imm}({name(rs1)})";
|
|
||||||
val offs[XLEN] <= X[rs1]'s+imm;
|
|
||||||
if(rd!=0) X[rd]<=sext(MEM[offs]{32});
|
|
||||||
}
|
|
||||||
LBU {
|
|
||||||
encoding: imm[11:0]s | rs1[4:0] | b100 | rd[4:0] | b0000011;
|
|
||||||
args_disass:"{name(rd)}, {imm}({name(rs1)})";
|
|
||||||
val offs[XLEN] <= X[rs1]'s+imm;
|
|
||||||
if(rd!=0) X[rd]<=zext(MEM[offs]);
|
|
||||||
}
|
|
||||||
LHU {
|
|
||||||
encoding: imm[11:0]s | rs1[4:0] | b101 | rd[4:0] | b0000011;
|
|
||||||
args_disass:"{name(rd)}, {imm}({name(rs1)})";
|
|
||||||
val offs[XLEN] <= X[rs1]'s+imm;
|
|
||||||
if(rd!=0) X[rd]<=zext(MEM[offs]{16});
|
|
||||||
}
|
|
||||||
SB {
|
|
||||||
encoding: imm[11:5]s | rs2[4:0] | rs1[4:0] | b000 | imm[4:0]s | b0100011;
|
|
||||||
args_disass:"{name(rs2)}, {imm}({name(rs1)})";
|
|
||||||
val offs[XLEN] <= X[rs1]'s + imm;
|
|
||||||
MEM[offs] <= X[rs2];
|
|
||||||
}
|
|
||||||
SH {
|
|
||||||
encoding: imm[11:5]s | rs2[4:0] | rs1[4:0] | b001 | imm[4:0]s | b0100011;
|
|
||||||
args_disass:"{name(rs2)}, {imm}({name(rs1)})";
|
|
||||||
val offs[XLEN] <= X[rs1]'s + imm;
|
|
||||||
MEM[offs]{16} <= X[rs2];
|
|
||||||
}
|
|
||||||
SW {
|
|
||||||
encoding: imm[11:5]s | rs2[4:0] | rs1[4:0] | b010 | imm[4:0]s | b0100011;
|
|
||||||
args_disass:"{name(rs2)}, {imm}({name(rs1)})";
|
|
||||||
val offs[XLEN] <= X[rs1]'s + imm;
|
|
||||||
MEM[offs]{32} <= X[rs2];
|
|
||||||
}
|
|
||||||
ADDI {
|
|
||||||
encoding: imm[11:0]s | rs1[4:0] | b000 | rd[4:0] | b0010011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {imm}";
|
|
||||||
if(rd != 0) X[rd] <= X[rs1]'s + imm;
|
|
||||||
}
|
|
||||||
SLTI {
|
|
||||||
encoding: imm[11:0]s | rs1[4:0] | b010 | rd[4:0] | b0010011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {imm}";
|
|
||||||
if (rd != 0) X[rd] <= choose(X[rs1]s < imm's, 1, 0);
|
|
||||||
}
|
|
||||||
SLTIU {
|
|
||||||
encoding: imm[11:0]s | rs1[4:0] | b011 | rd[4:0] | b0010011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {imm}";
|
|
||||||
val full_imm[XLEN] <= imm's;
|
|
||||||
if (rd != 0) X[rd] <= choose(X[rs1]'u < full_imm'u, 1, 0);
|
|
||||||
}
|
|
||||||
XORI {
|
|
||||||
encoding: imm[11:0]s | rs1[4:0] | b100 | rd[4:0] | b0010011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {imm}";
|
|
||||||
if(rd != 0) X[rd] <= X[rs1]s ^ imm;
|
|
||||||
}
|
|
||||||
ORI {
|
|
||||||
encoding: imm[11:0]s | rs1[4:0] | b110 | rd[4:0] | b0010011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {imm}";
|
|
||||||
if(rd != 0) X[rd] <= X[rs1]s | imm;
|
|
||||||
}
|
|
||||||
ANDI {
|
|
||||||
encoding: imm[11:0]s | rs1[4:0] | b111 | rd[4:0] | b0010011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {imm}";
|
|
||||||
if(rd != 0) X[rd] <= X[rs1]s & imm;
|
|
||||||
}
|
|
||||||
SLLI {
|
|
||||||
encoding: b0000000 | shamt[4:0] | rs1[4:0] | b001 | rd[4:0] | b0010011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {shamt}";
|
|
||||||
if(shamt > 31){
|
|
||||||
raise(0,0);
|
|
||||||
} else {
|
|
||||||
if(rd != 0) X[rd] <= shll(X[rs1], shamt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SRLI {
|
|
||||||
encoding: b0000000 | shamt[4:0] | rs1[4:0] | b101 | rd[4:0] | b0010011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {shamt}";
|
|
||||||
if(shamt > 31){
|
|
||||||
raise(0,0);
|
|
||||||
} else {
|
|
||||||
if(rd != 0) X[rd] <= shrl(X[rs1], shamt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SRAI {
|
|
||||||
encoding: b0100000 | shamt[4:0] | rs1[4:0] | b101 | rd[4:0] | b0010011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {shamt}";
|
|
||||||
if(shamt > 31){
|
|
||||||
raise(0,0);
|
|
||||||
} else {
|
|
||||||
if(rd != 0) X[rd] <= shra(X[rs1], shamt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ADD {
|
|
||||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b0110011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0) X[rd] <= X[rs1] + X[rs2];
|
|
||||||
}
|
|
||||||
SUB {
|
|
||||||
encoding: b0100000 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b0110011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0) X[rd] <= X[rs1] - X[rs2];
|
|
||||||
}
|
|
||||||
SLL {
|
|
||||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b0110011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0) X[rd] <= shll(X[rs1], X[rs2]&(XLEN-1));
|
|
||||||
}
|
|
||||||
SLT {
|
|
||||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0110011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if (rd != 0) X[rd] <= choose(X[rs1]s < X[rs2]s, 1, 0);
|
|
||||||
}
|
|
||||||
SLTU {
|
|
||||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0110011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if (rd != 0) X[rd] <= choose(zext(X[rs1]) < zext(X[rs2]), 1, 0);
|
|
||||||
}
|
|
||||||
XOR {
|
|
||||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b100 | rd[4:0] | b0110011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0) X[rd] <= X[rs1] ^ X[rs2];
|
|
||||||
}
|
|
||||||
SRL {
|
|
||||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b101 | rd[4:0] | b0110011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0) X[rd] <= shrl(X[rs1], X[rs2]&(XLEN-1));
|
|
||||||
}
|
|
||||||
SRA {
|
|
||||||
encoding: b0100000 | rs2[4:0] | rs1[4:0] | b101 | rd[4:0] | b0110011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0) X[rd] <= shra(X[rs1], X[rs2]&(XLEN-1));
|
|
||||||
}
|
|
||||||
OR {
|
|
||||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b110 | rd[4:0] | b0110011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0) X[rd] <= X[rs1] | X[rs2];
|
|
||||||
}
|
|
||||||
AND {
|
|
||||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b111 | rd[4:0] | b0110011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0) X[rd] <= X[rs1] & X[rs2];
|
|
||||||
}
|
|
||||||
FENCE {
|
|
||||||
encoding: b0000 | pred[3:0] | succ[3:0] | rs1[4:0] | b000 | rd[4:0] | b0001111;
|
|
||||||
FENCE[fence] <= pred<<4 | succ;
|
|
||||||
}
|
|
||||||
FENCE_I(flush) {
|
|
||||||
encoding: imm[11:0] | rs1[4:0] | b001 | rd[4:0] | b0001111 ;
|
|
||||||
FENCE[fencei] <= imm;
|
|
||||||
}
|
|
||||||
ECALL(no_cont) {
|
|
||||||
encoding: b000000000000 | b00000 | b000 | b00000 | b1110011;
|
|
||||||
raise(0, 11);
|
|
||||||
}
|
|
||||||
EBREAK(no_cont) {
|
|
||||||
encoding: b000000000001 | b00000 | b000 | b00000 | b1110011;
|
|
||||||
raise(0, 3);
|
|
||||||
}
|
|
||||||
URET(no_cont) {
|
|
||||||
encoding: b0000000 | b00010 | b00000 | b000 | b00000 | b1110011;
|
|
||||||
leave(0);
|
|
||||||
}
|
|
||||||
SRET(no_cont) {
|
|
||||||
encoding: b0001000 | b00010 | b00000 | b000 | b00000 | b1110011;
|
|
||||||
leave(1);
|
|
||||||
}
|
|
||||||
MRET(no_cont) {
|
|
||||||
encoding: b0011000 | b00010 | b00000 | b000 | b00000 | b1110011;
|
|
||||||
leave(3);
|
|
||||||
}
|
|
||||||
WFI {
|
|
||||||
encoding: b0001000 | b00101 | b00000 | b000 | b00000 | b1110011;
|
|
||||||
wait(1);
|
|
||||||
}
|
|
||||||
SFENCE.VMA {
|
|
||||||
encoding: b0001001 | rs2[4:0] | rs1[4:0] | b000 | b00000 | b1110011;
|
|
||||||
FENCE[fencevmal] <= rs1;
|
|
||||||
FENCE[fencevmau] <= rs2;
|
|
||||||
}
|
|
||||||
CSRRW {
|
|
||||||
encoding: csr[11:0] | rs1[4:0] | b001 | rd[4:0] | b1110011;
|
|
||||||
args_disass:"{name(rd)}, {csr}, {name(rs1)}";
|
|
||||||
val rs_val[XLEN] <= X[rs1];
|
|
||||||
if(rd!=0){
|
|
||||||
val csr_val[XLEN] <= CSR[csr];
|
|
||||||
CSR[csr] <= rs_val;
|
|
||||||
// make sure Xrd is updated once CSR write succeeds
|
|
||||||
X[rd] <= csr_val;
|
|
||||||
} else {
|
|
||||||
CSR[csr] <= rs_val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
CSRRS {
|
|
||||||
encoding: csr[11:0] | rs1[4:0] | b010 | rd[4:0] | b1110011;
|
|
||||||
args_disass:"{name(rd)}, {csr}, {name(rs1)}";
|
|
||||||
val xrd[XLEN] <= CSR[csr];
|
|
||||||
val xrs1[XLEN] <= X[rs1];
|
|
||||||
if(rd!=0) X[rd] <= xrd;
|
|
||||||
if(rs1!=0) CSR[csr] <= xrd | xrs1;
|
|
||||||
}
|
|
||||||
CSRRC {
|
|
||||||
encoding: csr[11:0] | rs1[4:0] | b011 | rd[4:0] | b1110011;
|
|
||||||
args_disass:"{name(rd)}, {csr}, {name(rs1)}";
|
|
||||||
val xrd[XLEN] <= CSR[csr];
|
|
||||||
val xrs1[XLEN] <= X[rs1];
|
|
||||||
if(rd!=0) X[rd] <= xrd;
|
|
||||||
if(rs1!=0) CSR[csr] <= xrd & ~xrs1;
|
|
||||||
}
|
|
||||||
CSRRWI {
|
|
||||||
encoding: csr[11:0] | zimm[4:0] | b101 | rd[4:0] | b1110011;
|
|
||||||
args_disass:"{name(rd)}, {csr}, {zimm:#0x}";
|
|
||||||
if(rd!=0) X[rd] <= CSR[csr];
|
|
||||||
CSR[csr] <= zext(zimm);
|
|
||||||
}
|
|
||||||
CSRRSI {
|
|
||||||
encoding: csr[11:0] | zimm[4:0] | b110 | rd[4:0] | b1110011;
|
|
||||||
args_disass:"{name(rd)}, {csr}, {zimm:#0x}";
|
|
||||||
val res[XLEN] <= CSR[csr];
|
|
||||||
if(zimm!=0) CSR[csr] <= res | zext(zimm);
|
|
||||||
// make sure rd is written after csr write succeeds
|
|
||||||
if(rd!=0) X[rd] <= res;
|
|
||||||
}
|
|
||||||
CSRRCI {
|
|
||||||
encoding: csr[11:0] | zimm[4:0] | b111 | rd[4:0] | b1110011;
|
|
||||||
args_disass:"{name(rd)}, {csr}, {zimm:#0x}";
|
|
||||||
val res[XLEN] <= CSR[csr];
|
|
||||||
if(rd!=0) X[rd] <= res;
|
|
||||||
if(zimm!=0) CSR[csr] <= res & ~zext(zimm, XLEN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,116 +0,0 @@
|
||||||
import "RV32I.core_desc"
|
|
||||||
|
|
||||||
InsructionSet RV64I extends RV32I {
|
|
||||||
instructions{
|
|
||||||
LWU { // 80000104: 0000ef03 lwu t5,0(ra)
|
|
||||||
encoding: imm[11:0]s | rs1[4:0] | b110 | rd[4:0] | b0000011;
|
|
||||||
args_disass:"{name(rd)}, {imm}({name(rs1)})";
|
|
||||||
val offs[XLEN] <= X[rs1]'s+imm;
|
|
||||||
if(rd!=0) X[rd]<=zext(MEM[offs]{32});
|
|
||||||
}
|
|
||||||
LD{
|
|
||||||
encoding: imm[11:0]s | rs1[4:0] | b011 | rd[4:0] | b0000011;
|
|
||||||
args_disass:"{name(rd)}, {imm}({name(rs1)})";
|
|
||||||
val offs[XLEN] <= X[rs1]'s + imm;
|
|
||||||
if(rd!=0) X[rd]<=sext(MEM[offs]{64});
|
|
||||||
}
|
|
||||||
SD{
|
|
||||||
encoding: imm[11:5]s | rs2[4:0] | rs1[4:0] | b011 | imm[4:0]s | b0100011;
|
|
||||||
args_disass:"{name(rs2)}, {imm}({name(rs1)})";
|
|
||||||
val offs[XLEN] <= X[rs1]'s + imm;
|
|
||||||
MEM[offs]{64} <= X[rs2];
|
|
||||||
}
|
|
||||||
SLLI {
|
|
||||||
encoding: b000000 | shamt[5:0] | rs1[4:0] | b001 | rd[4:0] | b0010011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {shamt}";
|
|
||||||
if(rd != 0) X[rd] <= shll(X[rs1], shamt);
|
|
||||||
}
|
|
||||||
SRLI {
|
|
||||||
encoding: b000000 | shamt[5:0] | rs1[4:0] | b101 | rd[4:0] | b0010011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {shamt}";
|
|
||||||
if(rd != 0) X[rd] <= shrl(X[rs1], shamt);
|
|
||||||
}
|
|
||||||
SRAI {
|
|
||||||
encoding: b010000 | shamt[5:0] | rs1[4:0] | b101 | rd[4:0] | b0010011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {shamt}";
|
|
||||||
if(rd != 0) X[rd] <= shra(X[rs1], shamt);
|
|
||||||
}
|
|
||||||
ADDIW {
|
|
||||||
encoding: imm[11:0]s | rs1[4:0] | b000 | rd[4:0] | b0011011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {imm}";
|
|
||||||
if(rd != 0){
|
|
||||||
val res[32] <= X[rs1]{32}'s + imm;
|
|
||||||
X[rd] <= sext(res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SLLIW {
|
|
||||||
encoding: b0000000 | shamt[4:0] | rs1[4:0] | b001 | rd[4:0] | b0011011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {shamt}";
|
|
||||||
if(rd != 0){
|
|
||||||
val sh_val[32] <= shll(X[rs1]{32}, shamt);
|
|
||||||
X[rd] <= sext(sh_val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SRLIW {
|
|
||||||
encoding: b0000000 | shamt[4:0] | rs1[4:0] | b101 | rd[4:0] | b0011011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {shamt}";
|
|
||||||
if(rd != 0){
|
|
||||||
val sh_val[32] <= shrl(X[rs1]{32}, shamt);
|
|
||||||
X[rd] <= sext(sh_val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SRAIW {
|
|
||||||
encoding: b0100000 | shamt[4:0] | rs1[4:0] | b101 | rd[4:0] | b0011011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {shamt}";
|
|
||||||
if(rd != 0){
|
|
||||||
val sh_val[32] <= shra(X[rs1]{32}, shamt);
|
|
||||||
X[rd] <= sext(sh_val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ADDW {
|
|
||||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b0111011;
|
|
||||||
if(rd != 0){
|
|
||||||
val res[32] <= X[rs1]{32} + X[rs2]{32};
|
|
||||||
X[rd] <= sext(res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SUBW {
|
|
||||||
encoding: b0100000 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b0111011;
|
|
||||||
if(rd != 0){
|
|
||||||
val res[32] <= X[rs1]{32} - X[rs2]{32};
|
|
||||||
X[rd] <= sext(res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SLLW {
|
|
||||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b0111011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0){
|
|
||||||
val mask[32] <= 0x1f;
|
|
||||||
val count[32] <= X[rs2]{32} & mask;
|
|
||||||
val sh_val[32] <= shll(X[rs1]{32}, count);
|
|
||||||
X[rd] <= sext(sh_val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SRLW {
|
|
||||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | b101 | rd[4:0] | b0111011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0){
|
|
||||||
val mask[32] <= 0x1f;
|
|
||||||
val count[32] <= X[rs2]{32} & mask;
|
|
||||||
val sh_val[32] <= shrl(X[rs1]{32}, count);
|
|
||||||
X[rd] <= sext(sh_val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SRAW {
|
|
||||||
encoding: b0100000 | rs2[4:0] | rs1[4:0] | b101 | rd[4:0] | b0111011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0){
|
|
||||||
val mask[32] <= 0x1f;
|
|
||||||
val count[32] <= X[rs2]{32} & mask;
|
|
||||||
val sh_val[32] <= shra(X[rs1]{32}, count);
|
|
||||||
X[rd] <= sext(sh_val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,210 +0,0 @@
|
||||||
import "RISCVBase.core_desc"
|
|
||||||
|
|
||||||
InsructionSet RV32A extends RISCVBase{
|
|
||||||
|
|
||||||
instructions{
|
|
||||||
LR.W {
|
|
||||||
encoding: b00010 | aq[0:0] | rl[0:0] | b00000 | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}";
|
|
||||||
if(rd!=0){
|
|
||||||
val offs[XLEN] <= X[rs1];
|
|
||||||
X[rd]<= sext(MEM[offs]{32}, XLEN);
|
|
||||||
RES[offs]{32}<=sext(-1, 32);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SC.W {
|
|
||||||
encoding: b00011 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
val offs[XLEN] <= X[rs1];
|
|
||||||
val res1[32] <= RES[offs]{32};
|
|
||||||
if(res1!=0)
|
|
||||||
MEM[offs]{32} <= X[rs2];
|
|
||||||
if(rd!=0) X[rd]<= choose(res1!=zext(0, 32), 0, 1);
|
|
||||||
}
|
|
||||||
AMOSWAP.W{
|
|
||||||
encoding: b00001 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu={aq},rel={rl})";
|
|
||||||
val offs[XLEN]<=X[rs1];
|
|
||||||
if(rd!=0) X[rd]<=sext(MEM[offs]{32});
|
|
||||||
MEM[offs]{32}<=X[rs2];
|
|
||||||
}
|
|
||||||
AMOADD.W{
|
|
||||||
encoding: b00000 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu={aq},rel={rl})";
|
|
||||||
val offs[XLEN]<=X[rs1];
|
|
||||||
val res1[XLEN] <= sext(MEM[offs]{32});
|
|
||||||
if(rd!=0) X[rd]<=res1;
|
|
||||||
val res2[XLEN]<=res1 + X[rs2];
|
|
||||||
MEM[offs]{32}<=res2;
|
|
||||||
}
|
|
||||||
AMOXOR.W{
|
|
||||||
encoding: b00100 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu={aq},rel={rl})";
|
|
||||||
val offs[XLEN]<=X[rs1];
|
|
||||||
val res1[XLEN] <= sext(MEM[offs]{32});
|
|
||||||
if(rd!=0) X[rd]<=res1;
|
|
||||||
val res2[XLEN]<=res1 ^ X[rs2];
|
|
||||||
MEM[offs]{32}<=res2;
|
|
||||||
}
|
|
||||||
AMOAND.W{
|
|
||||||
encoding: b01100 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu={aq},rel={rl})";
|
|
||||||
val offs[XLEN]<=X[rs1];
|
|
||||||
val res1[XLEN] <= sext(MEM[offs]{32});
|
|
||||||
if(rd!=0) X[rd]<=res1;
|
|
||||||
val res2[XLEN] <=res1 & X[rs2];
|
|
||||||
MEM[offs]{32}<=res2;
|
|
||||||
}
|
|
||||||
AMOOR.W {
|
|
||||||
encoding: b01000 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu={aq},rel={rl})";
|
|
||||||
val offs[XLEN]<=X[rs1];
|
|
||||||
val res1[XLEN] <= sext(MEM[offs]{32});
|
|
||||||
if(rd!=0) X[rd]<=res1;
|
|
||||||
val res2[XLEN]<=res1 | X[rs2];
|
|
||||||
MEM[offs]{32}<=res2;
|
|
||||||
}
|
|
||||||
AMOMIN.W{
|
|
||||||
encoding: b10000 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu={aq},rel={rl})";
|
|
||||||
val offs[XLEN]<=X[rs1];
|
|
||||||
val res1[XLEN] <= sext(MEM[offs]{32});
|
|
||||||
if(rd!=0) X[rd] <= res1;
|
|
||||||
val res2[XLEN] <= choose(res1's > X[rs2]s, X[rs2], res1);
|
|
||||||
MEM[offs]{32} <= res2;
|
|
||||||
}
|
|
||||||
AMOMAX.W{
|
|
||||||
encoding: b10100 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu={aq},rel={rl})";
|
|
||||||
val offs[XLEN]<=X[rs1];
|
|
||||||
val res1[XLEN] <= sext(MEM[offs]{32});
|
|
||||||
if(rd!=0) X[rd]<=res1;
|
|
||||||
val res2[XLEN]<= choose(res1's<X[rs2]s, X[rs2], res1);
|
|
||||||
MEM[offs]{32}<=res2;
|
|
||||||
}
|
|
||||||
AMOMINU.W{
|
|
||||||
encoding: b11000 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu={aq},rel={rl})";
|
|
||||||
val offs[XLEN]<=X[rs1];
|
|
||||||
val res1[XLEN] <= sext(MEM[offs]{32});
|
|
||||||
if(rd!=0) X[rd]<=res1;
|
|
||||||
val res2[XLEN]<= choose(res1>X[rs2], X[rs2], res1);
|
|
||||||
MEM[offs]{32}<=res2;
|
|
||||||
}
|
|
||||||
AMOMAXU.W{
|
|
||||||
encoding: b11100 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu={aq},rel={rl})";
|
|
||||||
val offs[XLEN]<=X[rs1];
|
|
||||||
val res1[XLEN] <= sext(MEM[offs]{32});
|
|
||||||
if(rd!=0) X[rd] <= res1;
|
|
||||||
val res2[XLEN] <= choose(res1 < X[rs2], X[rs2], res1);
|
|
||||||
MEM[offs]{32} <= res2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
InsructionSet RV64A extends RV32A {
|
|
||||||
|
|
||||||
instructions{
|
|
||||||
LR.D {
|
|
||||||
encoding: b00010 | aq[0:0] | rl[0:0] | b00000 | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}";
|
|
||||||
if(rd!=0){
|
|
||||||
val offs[XLEN] <= X[rs1];
|
|
||||||
X[rd]<= sext(MEM[offs]{64}, XLEN);
|
|
||||||
RES[offs]{64}<=sext(-1, 64);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SC.D {
|
|
||||||
encoding: b00011 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
val offs[XLEN] <= X[rs1];
|
|
||||||
val res[64] <= RES[offs];
|
|
||||||
if(res!=0){
|
|
||||||
MEM[offs]{64} <= X[rs2];
|
|
||||||
if(rd!=0) X[rd]<=0;
|
|
||||||
} else{
|
|
||||||
if(rd!=0) X[rd]<= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
AMOSWAP.D{
|
|
||||||
encoding: b00001 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu={aq},rel={rl})";
|
|
||||||
val offs[XLEN] <= X[rs1];
|
|
||||||
if(rd!=0) X[rd] <= sext(MEM[offs]{64});
|
|
||||||
MEM[offs]{64} <= X[rs2];
|
|
||||||
}
|
|
||||||
AMOADD.D{
|
|
||||||
encoding: b00000 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu={aq},rel={rl})";
|
|
||||||
val offs[XLEN] <= X[rs1];
|
|
||||||
val res[XLEN] <= sext(MEM[offs]{64});
|
|
||||||
if(rd!=0) X[rd]<=res;
|
|
||||||
val res2[XLEN] <= res + X[rs2];
|
|
||||||
MEM[offs]{64}<=res2;
|
|
||||||
}
|
|
||||||
AMOXOR.D{
|
|
||||||
encoding: b00100 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu={aq},rel={rl})";
|
|
||||||
val offs[XLEN] <= X[rs1];
|
|
||||||
val res[XLEN] <= sext(MEM[offs]{64});
|
|
||||||
if(rd!=0) X[rd] <= res;
|
|
||||||
val res2[XLEN] <= res ^ X[rs2];
|
|
||||||
MEM[offs]{64} <= res2;
|
|
||||||
}
|
|
||||||
AMOAND.D{
|
|
||||||
encoding: b01100 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu={aq},rel={rl})";
|
|
||||||
val offs[XLEN] <= X[rs1];
|
|
||||||
val res[XLEN] <= sext(MEM[offs]{64});
|
|
||||||
if(rd!=0) X[rd] <= res;
|
|
||||||
val res2[XLEN] <= res & X[rs2];
|
|
||||||
MEM[offs]{64} <= res2;
|
|
||||||
}
|
|
||||||
AMOOR.D {
|
|
||||||
encoding: b01000 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu={aq},rel={rl})";
|
|
||||||
val offs[XLEN] <= X[rs1];
|
|
||||||
val res[XLEN] <= sext(MEM[offs]{64});
|
|
||||||
if(rd!=0) X[rd] <= res;
|
|
||||||
val res2[XLEN] <= res | X[rs2];
|
|
||||||
MEM[offs]{64} <= res2;
|
|
||||||
}
|
|
||||||
AMOMIN.D{
|
|
||||||
encoding: b10000 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu={aq},rel={rl})";
|
|
||||||
val offs[XLEN] <= X[rs1];
|
|
||||||
val res1[XLEN] <= sext(MEM[offs]{64});
|
|
||||||
if(rd!=0) X[rd] <= res1;
|
|
||||||
val res2[XLEN] <= choose(res1's > X[rs2]s, X[rs2], res1);
|
|
||||||
MEM[offs]{64} <= res2;
|
|
||||||
}
|
|
||||||
AMOMAX.D{
|
|
||||||
encoding: b10100 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu={aq},rel={rl})";
|
|
||||||
val offs[XLEN] <= X[rs1];
|
|
||||||
val res[XLEN] <= sext(MEM[offs]{64});
|
|
||||||
if(rd!=0) X[rd] <= res;
|
|
||||||
val res2[XLEN] <= choose(res s < X[rs2]s, X[rs2], res);
|
|
||||||
MEM[offs]{64} <= res2;
|
|
||||||
}
|
|
||||||
AMOMINU.D{
|
|
||||||
encoding: b11000 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu={aq},rel={rl})";
|
|
||||||
val offs[XLEN] <= X[rs1];
|
|
||||||
val res[XLEN] <= sext(MEM[offs]{64});
|
|
||||||
if(rd!=0) X[rd] <= res;
|
|
||||||
val res2[XLEN] <= choose(res > X[rs2], X[rs2], res);
|
|
||||||
MEM[offs]{64} <= res2;
|
|
||||||
}
|
|
||||||
AMOMAXU.D{
|
|
||||||
encoding: b11100 | aq[0:0] | rl[0:0] | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0101111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu={aq},rel={rl})";
|
|
||||||
val offs[XLEN] <= X[rs1];
|
|
||||||
val res1[XLEN] <= sext(MEM[offs]{64});
|
|
||||||
if(rd!=0) X[rd] <= res1;
|
|
||||||
val res2[XLEN] <= choose(res1 < X[rs2], X[rs2], res1);
|
|
||||||
MEM[offs]{64} <= res2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,367 +0,0 @@
|
||||||
import "RISCVBase.core_desc"
|
|
||||||
|
|
||||||
InsructionSet RV32IC extends RISCVBase{
|
|
||||||
|
|
||||||
instructions{
|
|
||||||
JALR(no_cont){ // overwriting the implementation if rv32i, alignment does not need to be word
|
|
||||||
encoding: imm[11:0]s | rs1[4:0] | b000 | rd[4:0] | b1100111;
|
|
||||||
args_disass: "{name(rd)}, {name(rs1)}, {imm:#0x}";
|
|
||||||
val new_pc[XLEN] <= X[rs1]s + imm;
|
|
||||||
if(rd!=0) X[rd] <= PC+4;
|
|
||||||
PC<=new_pc & ~0x1;
|
|
||||||
}
|
|
||||||
C.ADDI4SPN { //(RES, imm=0)
|
|
||||||
encoding: b000 | imm[5:4] | imm[9:6] | imm[2:2] | imm[3:3] | rd[2:0] | b00;
|
|
||||||
args_disass: "{name(rd)}, {imm:#05x}";
|
|
||||||
if(imm == 0) raise(0, 2);
|
|
||||||
X[rd+8] <= X[2] + imm;
|
|
||||||
}
|
|
||||||
C.LW { // (RV32)
|
|
||||||
encoding: b010 | uimm[5:3] | rs1[2:0] | uimm[2:2] | uimm[6:6] | rd[2:0] | b00;
|
|
||||||
args_disass: "{name(8+rd)}, {uimm:#05x}({name(8+rs1)})";
|
|
||||||
val offs[XLEN] <= X[rs1+8]+uimm;
|
|
||||||
X[rd+8] <= sext(MEM[offs]{32});
|
|
||||||
}
|
|
||||||
C.SW {//(RV32)
|
|
||||||
encoding: b110 | uimm[5:3] | rs1[2:0] | uimm[2:2] | uimm[6:6] | rs2[2:0] | b00;
|
|
||||||
args_disass: "{name(8+rs2)}, {uimm:#05x}({name(8+rs1)})";
|
|
||||||
val offs[XLEN] <= X[rs1+8]+uimm;
|
|
||||||
MEM[offs]{32} <= X[rs2+8];
|
|
||||||
}
|
|
||||||
C.ADDI {//(RV32)
|
|
||||||
encoding:b000 | imm[5:5]s | rs1[4:0] | imm[4:0]s | b01;
|
|
||||||
args_disass: "{name(rs1)}, {imm:#05x}";
|
|
||||||
X[rs1] <= X[rs1]'s + imm;
|
|
||||||
}
|
|
||||||
C.NOP {
|
|
||||||
encoding:b000 | b0 | b00000 | b00000 | b01;
|
|
||||||
}
|
|
||||||
// C.JAL will be overwritten by C.ADDIW for RV64/128
|
|
||||||
C.JAL(no_cont) {//(RV32)
|
|
||||||
encoding: b001 | imm[11:11]s | imm[4:4]s | imm[9:8]s | imm[10:10]s | imm[6:6]s | imm[7:7]s | imm[3:1]s | imm[5:5]s | b01;
|
|
||||||
args_disass: "{imm:#05x}";
|
|
||||||
X[1] <= PC+2;
|
|
||||||
PC<=PC's+imm;
|
|
||||||
}
|
|
||||||
C.LI {//(RV32)
|
|
||||||
encoding:b010 | imm[5:5]s | rd[4:0] | imm[4:0]s | b01;
|
|
||||||
args_disass: "{name(rd)}, {imm:#05x}";
|
|
||||||
if(rd == 0) raise(0, 2); //TODO: should it be handled as trap?
|
|
||||||
X[rd] <= imm;
|
|
||||||
}
|
|
||||||
// order matters here as C.ADDI16SP overwrites C.LUI vor rd==2
|
|
||||||
C.LUI {//(RV32)
|
|
||||||
encoding:b011 | imm[17:17] | rd[4:0] | imm[16:12]s | b01;
|
|
||||||
args_disass: "{name(rd)}, {imm:#05x}";
|
|
||||||
if(rd == 0) raise(0, 2); //TODO: should it be handled as trap?
|
|
||||||
if(imm == 0) raise(0, 2); //TODO: should it be handled as trap?
|
|
||||||
X[rd] <= imm;
|
|
||||||
}
|
|
||||||
C.ADDI16SP {//(RV32)
|
|
||||||
encoding:b011 | imm[9:9]s | b00010 | imm[4:4]s | imm[6:6]s | imm[8:7]s | imm[5:5]s | b01;
|
|
||||||
args_disass: "{imm:#05x}";
|
|
||||||
X[2] <= X[2]s + imm;
|
|
||||||
}
|
|
||||||
C.SRLI {//(RV32 nse)
|
|
||||||
encoding:b100 | b0 | b00 | rs1[2:0] | shamt[4:0] | b01;
|
|
||||||
args_disass: "{name(8+rs1)}, {shamt}";
|
|
||||||
val rs1_idx[5] <= rs1+8;
|
|
||||||
X[rs1_idx] <= shrl(X[rs1_idx], shamt);
|
|
||||||
}
|
|
||||||
C.SRAI {//(RV32)
|
|
||||||
encoding:b100 | b0 | b01 | rs1[2:0] | shamt[4:0] | b01;
|
|
||||||
args_disass: "{name(8+rs1)}, {shamt}";
|
|
||||||
val rs1_idx[5] <= rs1+8;
|
|
||||||
X[rs1_idx] <= shra(X[rs1_idx], shamt);
|
|
||||||
}
|
|
||||||
C.ANDI {//(RV32)
|
|
||||||
encoding:b100 | imm[5:5]s | b10 | rs1[2:0] | imm[4:0]s | b01;
|
|
||||||
args_disass: "{name(8+rs1)}, {imm:#05x}";
|
|
||||||
val rs1_idx[5] <= rs1 + 8;
|
|
||||||
X[rs1_idx] <= X[rs1_idx]s & imm;
|
|
||||||
}
|
|
||||||
C.SUB {//(RV32)
|
|
||||||
encoding:b100 | b0 | b11 | rd[2:0] | b00 | rs2[2:0] | b01;
|
|
||||||
args_disass: "{name(8+rd)}, {name(8+rs2)}";
|
|
||||||
val rd_idx[5] <= rd + 8;
|
|
||||||
X[rd_idx] <= X[rd_idx] - X[rs2 + 8];
|
|
||||||
}
|
|
||||||
C.XOR {//(RV32)
|
|
||||||
encoding:b100 | b0 | b11 | rd[2:0] | b01 | rs2[2:0] | b01;
|
|
||||||
args_disass: "{name(8+rd)}, {name(8+rs2)}";
|
|
||||||
val rd_idx[5] <= rd + 8;
|
|
||||||
X[rd_idx] <= X[rd_idx] ^ X[rs2 + 8];
|
|
||||||
}
|
|
||||||
C.OR {//(RV32)
|
|
||||||
encoding:b100 | b0 | b11 | rd[2:0] | b10 | rs2[2:0] | b01;
|
|
||||||
args_disass: "{name(8+rd)}, {name(8+rs2)}";
|
|
||||||
val rd_idx[5] <= rd + 8;
|
|
||||||
X[rd_idx] <= X[rd_idx] | X[rs2 + 8];
|
|
||||||
}
|
|
||||||
C.AND {//(RV32)
|
|
||||||
encoding:b100 | b0 | b11 | rd[2:0] | b11 | rs2[2:0] | b01;
|
|
||||||
args_disass: "{name(8+rd)}, {name(8+rs2)}";
|
|
||||||
val rd_idx[5] <= rd + 8;
|
|
||||||
X[rd_idx] <= X[rd_idx] & X[rs2 + 8];
|
|
||||||
}
|
|
||||||
C.J(no_cont) {//(RV32)
|
|
||||||
encoding:b101 | imm[11:11]s | imm[4:4]s | imm[9:8]s | imm[10:10]s | imm[6:6]s | imm[7:7]s | imm[3:1]s | imm[5:5]s | b01;
|
|
||||||
args_disass: "{imm:#05x}";
|
|
||||||
PC<=PC's+imm;
|
|
||||||
}
|
|
||||||
C.BEQZ(no_cont,cond) {//(RV32)
|
|
||||||
encoding:b110 | imm[8:8]s | imm[4:3]s | rs1[2:0] | imm[7:6]s |imm[2:1]s | imm[5:5]s | b01;
|
|
||||||
args_disass: "{name(8+rs1)}, {imm:#05x}";
|
|
||||||
PC<=choose(X[rs1+8]==0, PC's+imm, PC+2);
|
|
||||||
}
|
|
||||||
C.BNEZ(no_cont,cond) {//(RV32)
|
|
||||||
encoding:b111 | imm[8:8]s | imm[4:3]s | rs1[2:0] | imm[7:6]s | imm[2:1]s | imm[5:5]s | b01;
|
|
||||||
args_disass: "{name(8+rs1)}, {imm:#05x}";
|
|
||||||
PC<=choose(X[rs1+8]!=0, PC's+imm, PC+2);
|
|
||||||
}
|
|
||||||
C.SLLI {//(RV32)
|
|
||||||
encoding:b000 | b0 | rs1[4:0] | shamt[4:0] | b10;
|
|
||||||
args_disass: "{name(rs1)}, {shamt}";
|
|
||||||
if(rs1 == 0) raise(0, 2);
|
|
||||||
X[rs1] <= shll(X[rs1], shamt);
|
|
||||||
}
|
|
||||||
C.LWSP {//
|
|
||||||
encoding:b010 | uimm[5:5] | rd[4:0] | uimm[4:2] | uimm[7:6] | b10;
|
|
||||||
args_disass: "{name(rd)}, sp, {uimm:#05x}";
|
|
||||||
val offs[XLEN] <= X[2] + uimm;
|
|
||||||
X[rd] <= sext(MEM[offs]{32});
|
|
||||||
}
|
|
||||||
// order matters as C.JR is a special case of C.MV
|
|
||||||
C.MV {//(RV32)
|
|
||||||
encoding:b100 | b0 | rd[4:0] | rs2[4:0] | b10;
|
|
||||||
args_disass: "{name(rd)}, {name(rs2)}";
|
|
||||||
X[rd] <= X[rs2];
|
|
||||||
}
|
|
||||||
C.JR(no_cont) {//(RV32)
|
|
||||||
encoding:b100 | b0 | rs1[4:0] | b00000 | b10;
|
|
||||||
args_disass: "{name(rs1)}";
|
|
||||||
PC <= X[rs1];
|
|
||||||
}
|
|
||||||
// order matters as C.EBREAK is a special case of C.JALR which is a special case of C.ADD
|
|
||||||
C.ADD {//(RV32)
|
|
||||||
encoding:b100 | b1 | rd[4:0] | rs2[4:0] | b10;
|
|
||||||
args_disass: "{name(rd)}, {name(rs2)}";
|
|
||||||
X[rd] <= X[rd] + X[rs2];
|
|
||||||
}
|
|
||||||
C.JALR(no_cont) {//(RV32)
|
|
||||||
encoding:b100 | b1 | rs1[4:0] | b00000 | b10;
|
|
||||||
args_disass: "{name(rs1)}";
|
|
||||||
X[1] <= PC+2;
|
|
||||||
PC<=X[rs1];
|
|
||||||
}
|
|
||||||
C.EBREAK(no_cont) {//(RV32)
|
|
||||||
encoding:b100 | b1 | b00000 | b00000 | b10;
|
|
||||||
raise(0, 3);
|
|
||||||
}
|
|
||||||
C.SWSP {//
|
|
||||||
encoding:b110 | uimm[5:2] | uimm[7:6] | rs2[4:0] | b10;
|
|
||||||
args_disass: "{name(rs2)}, {uimm:#05x}(sp)";
|
|
||||||
val offs[XLEN] <= X[2] + uimm;
|
|
||||||
MEM[offs]{32} <= X[rs2];
|
|
||||||
}
|
|
||||||
DII {
|
|
||||||
encoding:b000 | b0 | b00000 | b00000 | b00;
|
|
||||||
raise(0, 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
InsructionSet RV32FC extends RV32IC{
|
|
||||||
constants {
|
|
||||||
FLEN
|
|
||||||
}
|
|
||||||
registers {
|
|
||||||
[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}), {uimm}({name(8+rs1)})";
|
|
||||||
val offs[XLEN] <= X[rs1+8]+uimm;
|
|
||||||
val res[32] <= MEM[offs]{32};
|
|
||||||
if(FLEN==32)
|
|
||||||
F[rd+8] <= res;
|
|
||||||
else { // NaN boxing
|
|
||||||
val upper[FLEN] <= -1;
|
|
||||||
F[rd+8] <= (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}), {uimm}({name(8+rs1)})";
|
|
||||||
val offs[XLEN] <= X[rs1+8]+uimm;
|
|
||||||
MEM[offs]{32}<=F[rs2+8]{32};
|
|
||||||
}
|
|
||||||
C.FLWSP {
|
|
||||||
encoding:b011 | uimm[5:5] | rd[4:0] | uimm[4:2] | uimm[7:6] | b10;
|
|
||||||
args_disass:"f{rd}, {uimm}(x2)";
|
|
||||||
val offs[XLEN] <= X[2]+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}, {uimm}(x2), ";
|
|
||||||
val offs[XLEN] <= X[2]+uimm;
|
|
||||||
MEM[offs]{32}<=F[rs2]{32};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
InsructionSet RV32DC extends RV32IC{
|
|
||||||
constants {
|
|
||||||
FLEN
|
|
||||||
}
|
|
||||||
registers {
|
|
||||||
[31:0] F[FLEN]
|
|
||||||
}
|
|
||||||
instructions{
|
|
||||||
C.FLD { //(RV32/64)
|
|
||||||
encoding: b001 | uimm[5:3] | rs1[2:0] | uimm[7:6] | rd[2:0] | b00;
|
|
||||||
args_disass:"f(8+{rd}), {uimm}({name(8+rs1)})";
|
|
||||||
val offs[XLEN] <= X[rs1+8]+uimm;
|
|
||||||
val res[64] <= MEM[offs]{64};
|
|
||||||
if(FLEN==64)
|
|
||||||
F[rd+8] <= res;
|
|
||||||
else { // NaN boxing
|
|
||||||
val upper[FLEN] <= -1;
|
|
||||||
F[rd+8] <= (upper<<64) | res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
C.FSD { //(RV32/64)
|
|
||||||
encoding: b101 | uimm[5:3] | rs1[2:0] | uimm[7:6] | rs2[2:0] | b00;
|
|
||||||
args_disass:"f(8+{rs2}), {uimm}({name(8+rs1)})";
|
|
||||||
val offs[XLEN] <= X[rs1+8]+uimm;
|
|
||||||
MEM[offs]{64}<=F[rs2+8]{64};
|
|
||||||
}
|
|
||||||
C.FLDSP {//(RV32/64)
|
|
||||||
encoding:b001 | uimm[5:5] | rd[4:0] | uimm[4:3] | uimm[8:6] | b10;
|
|
||||||
args_disass:"f{rd}, {uimm}(x2)";
|
|
||||||
val offs[XLEN] <= X[2]+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.FSDSP {//(RV32/64)
|
|
||||||
encoding:b101 | uimm[5:3] | uimm[8:6] | rs2[4:0] | b10;
|
|
||||||
args_disass:"f{rs2}, {uimm}(x2), ";
|
|
||||||
val offs[XLEN] <= X[2]+uimm;
|
|
||||||
MEM[offs]{64}<=F[rs2]{64};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
InsructionSet RV64IC extends RV32IC {
|
|
||||||
|
|
||||||
instructions{
|
|
||||||
C.LD {//(RV64/128)
|
|
||||||
encoding:b011 | uimm[5:3] | rs1[2:0] | uimm[7:6] | rd[2:0] | b00;
|
|
||||||
args_disass: "{name(8+rd)}, {uimm},({name(8+rs1)})";
|
|
||||||
val offs[XLEN] <= X[rs1+8] + uimm;
|
|
||||||
X[rd+8]<=sext(MEM[offs]{64});
|
|
||||||
}
|
|
||||||
C.SD { //(RV64/128)
|
|
||||||
encoding:b111 | uimm[5:3] | rs1[2:0] | uimm[7:6] | rs2[2:0] | b00;
|
|
||||||
args_disass: "{name(8+rs2)}, {uimm},({name(8+rs1)})";
|
|
||||||
val offs[XLEN] <= X[rs1+8] + uimm;
|
|
||||||
MEM[offs]{64} <= X[rs2+8];
|
|
||||||
}
|
|
||||||
C.SUBW {//(RV64/128, RV32 res)
|
|
||||||
encoding:b100 | b1 | b11 | rd[2:0] | b00 | rs2[2:0] | b01;
|
|
||||||
args_disass: "{name(8+rd)}, {name(8+rd)}, {name(8+rs2)}";
|
|
||||||
val res[32] <= X[rd+8]{32} - X[rs2+8]{32};
|
|
||||||
X[rd+8] <= sext(res);
|
|
||||||
}
|
|
||||||
C.ADDW {//(RV64/128 RV32 res)
|
|
||||||
encoding:b100 | b1 | b11 | rd[2:0] | b01 | rs2[2:0] | b01;
|
|
||||||
args_disass: "{name(8+rd)}, {name(8+rd)}, {name(8+rs2)}";
|
|
||||||
val res[32] <= X[rd+8]{32} + X[rs2+8]{32};
|
|
||||||
X[rd+8] <= sext(res);
|
|
||||||
}
|
|
||||||
C.ADDIW {//(RV64/128)
|
|
||||||
encoding:b001 | imm[5:5]s | rs1[4:0] | imm[4:0]s | b01;
|
|
||||||
args_disass: "{name(rs1)}, {imm:#05x}";
|
|
||||||
if(rs1 != 0){
|
|
||||||
val res[32] <= X[rs1]{32}'s + imm;
|
|
||||||
X[rs1] <= sext(res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
C.SRLI {//(RV64)
|
|
||||||
encoding:b100 | shamt[5:5] | b00 | rs1[2:0] | shamt[4:0] | b01;
|
|
||||||
args_disass: "{name(8+rs1)}, {shamt}";
|
|
||||||
val rs1_idx[5] <= rs1+8;
|
|
||||||
X[rs1_idx] <= shrl(X[rs1_idx], shamt);
|
|
||||||
}
|
|
||||||
C.SRAI {//(RV64)
|
|
||||||
encoding:b100 | shamt[5:5] | b01 | rs1[2:0] | shamt[4:0] | b01;
|
|
||||||
args_disass: "{name(8+rs1)}, {shamt}";
|
|
||||||
val rs1_idx[5] <= rs1+8;
|
|
||||||
X[rs1_idx] <= shra(X[rs1_idx], shamt);
|
|
||||||
}
|
|
||||||
C.SLLI {//(RV64)
|
|
||||||
encoding:b000 | shamt[5:5] | rs1[4:0] | shamt[4:0] | b10;
|
|
||||||
args_disass: "{name(rs1)}, {shamt}";
|
|
||||||
if(rs1 == 0) raise(0, 2);
|
|
||||||
X[rs1] <= shll(X[rs1], shamt);
|
|
||||||
}
|
|
||||||
C.LDSP {//(RV64/128
|
|
||||||
encoding:b011 | uimm[5:5] | rd[4:0] | uimm[4:3] | uimm[8:6] | b10;
|
|
||||||
args_disass:"{name(rd)}, {uimm}(sp)";
|
|
||||||
val offs[XLEN] <= X[2] + uimm;
|
|
||||||
if(rd!=0) X[rd]<=sext(MEM[offs]{64});
|
|
||||||
}
|
|
||||||
C.SDSP {//(RV64/128)
|
|
||||||
encoding:b111 | uimm[5:3] | uimm[8:6] | rs2[4:0] | b10;
|
|
||||||
args_disass:"{name(rs2)}, {uimm}(sp)";
|
|
||||||
val offs[XLEN] <= X[2] + uimm;
|
|
||||||
MEM[offs]{64} <= X[rs2];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
InsructionSet RV128IC extends RV64IC {
|
|
||||||
|
|
||||||
instructions{
|
|
||||||
C.SRLI {//(RV128)
|
|
||||||
encoding:b100 | shamt[5:5] | b00 | rs1[2:0] | shamt[4:0] | b01;
|
|
||||||
args_disass: "{name(8+rs1)}, {shamt}";
|
|
||||||
val rs1_idx[5] <= rs1+8;
|
|
||||||
X[rs1_idx] <= shrl(X[rs1_idx], shamt);
|
|
||||||
}
|
|
||||||
C.SRAI {//(RV128)
|
|
||||||
encoding:b100 | shamt[5:5] | b01 | rs1[2:0] | shamt[4:0] | b01;
|
|
||||||
args_disass: "{name(8+rs1)}, {shamt}";
|
|
||||||
val rs1_idx[5] <= rs1+8;
|
|
||||||
X[rs1_idx] <= shra(X[rs1_idx], shamt);
|
|
||||||
}
|
|
||||||
C.SLLI {//(RV128)
|
|
||||||
encoding:b000 | shamt[5:5] | rs1[4:0] | shamt[4:0] | b10;
|
|
||||||
args_disass: "{name(rs1)}, {shamt}";
|
|
||||||
if(rs1 == 0) raise(0, 2);
|
|
||||||
X[rs1] <= shll(X[rs1], shamt);
|
|
||||||
}
|
|
||||||
C.LQ { //(RV128)
|
|
||||||
encoding:b001 | uimm[5:4] | uimm[8:8] | rs1[2:0] | uimm[7:6] | rd[2:0] | b00;
|
|
||||||
}
|
|
||||||
C.SQ { //(RV128)
|
|
||||||
encoding:b101 | uimm[5:4] | uimm[8:8] | rs1[2:0] | uimm[7:6] | rs2[2:0] | b00;
|
|
||||||
}
|
|
||||||
C.SQSP {//(RV128)
|
|
||||||
encoding:b101 | uimm[5:4] | uimm[9:6] | rs2[4:0] | b10;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,360 +0,0 @@
|
||||||
import "RISCVBase.core_desc"
|
|
||||||
|
|
||||||
InsructionSet RV32D extends RISCVBase{
|
|
||||||
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}, {imm}({name(rs1)})";
|
|
||||||
val offs[XLEN] <= X[rs1]'s + 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}, {imm}({name(rs1)})";
|
|
||||||
val offs[XLEN] <= X[rs1]'s + 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:"{name(rd)}, f{rs1}, f{rs2}, f{rs3}";
|
|
||||||
//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:"{name(rd)}, f{rs1}, f{rs2}, f{rs3}";
|
|
||||||
//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:"{name(rd)}, f{rs1}, f{rs2}, f{rs3}";
|
|
||||||
//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:"{name(rd)}, f{rs1}, f{rs2}, f{rs3}";
|
|
||||||
//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:"{name(rd)}, f{rs1}, f{rs2}";
|
|
||||||
// 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:"{name(rd)}, f{rs1}, f{rs2}";
|
|
||||||
// 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:"{name(rd)}, f{rs1}, f{rs2}";
|
|
||||||
// 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:"{name(rd)}, f{rs1}, f{rs2}";
|
|
||||||
// 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:"{name(rd)}, f{rs1}";
|
|
||||||
//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}, f{rs1}, f{rs2}";
|
|
||||||
val ONE[64] <= 1;
|
|
||||||
val MSK1[64] <= ONE<<63;
|
|
||||||
val MSK2[64] <= MSK1-1;
|
|
||||||
val res[64] <= (F[rs1]{64} & MSK2) | (F[rs2]{64} & MSK1);
|
|
||||||
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}, f{rs1}, f{rs2}";
|
|
||||||
val ONE[64] <= 1;
|
|
||||||
val MSK1[64] <= ONE<<63;
|
|
||||||
val MSK2[64] <= MSK1-1;
|
|
||||||
val res[64] <= (F[rs1]{64} & MSK2) | (~F[rs2]{64} & MSK1);
|
|
||||||
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}, f{rs1}, f{rs2}";
|
|
||||||
val ONE[64] <= 1;
|
|
||||||
val MSK1[64] <= ONE<<63;
|
|
||||||
val res[64] <= F[rs1]{64} ^ (F[rs2]{64} & MSK1);
|
|
||||||
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}, f{rs1}, f{rs2}";
|
|
||||||
//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}, f{rs1}, f{rs2}";
|
|
||||||
//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}, f{rs1}";
|
|
||||||
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}, f{rs1}";
|
|
||||||
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:"{name(rd)}, f{rs1}, f{rs2}";
|
|
||||||
X[rd]<=zext(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:"{name(rd)}, f{rs1}, f{rs2}";
|
|
||||||
X[rd]<=zext(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:"{name(rd)}, f{rs1}, f{rs2}";
|
|
||||||
X[rd]<=zext(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:"{name(rd)}, f{rs1}";
|
|
||||||
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:"{name(rd)}, f{rs1}";
|
|
||||||
X[rd]<= sext(fdispatch_fcvt_64_32(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:"{name(rd)}, f{rs1}";
|
|
||||||
//FIXME: should be zext accodring to spec but needs to be sext according to tests
|
|
||||||
X[rd]<= sext(fdispatch_fcvt_64_32(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}, {name(rs1)}";
|
|
||||||
val res[64] <= fdispatch_fcvt_32_64(sext(X[rs1]{32},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}, {name(rs1)}";
|
|
||||||
val res[64] <=fdispatch_fcvt_32_64(zext(X[rs1]{32},64), zext(3,32), rm{8});
|
|
||||||
if(FLEN==64)
|
|
||||||
F[rd] <= res;
|
|
||||||
else { // NaN boxing
|
|
||||||
val upper[FLEN] <= -1;
|
|
||||||
F[rd] <= (upper<<64) | res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
InsructionSet RV64D extends RV32D{
|
|
||||||
|
|
||||||
instructions{
|
|
||||||
FCVT.L.D {
|
|
||||||
encoding: b1100001 | b00010 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
|
||||||
args_disass:"{name(rd)}, f{rs1}";
|
|
||||||
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.LU.D {
|
|
||||||
encoding: b1100001 | b00011 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
|
||||||
args_disass:"{name(rd)}, f{rs1}";
|
|
||||||
X[rd]<= sext(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.L {
|
|
||||||
encoding: b1101001 | b00010 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
|
||||||
args_disass:"f{rd}, {name(rs1)}";
|
|
||||||
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.LU {
|
|
||||||
encoding: b1101001 | b00011 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
|
||||||
args_disass:"f{rd}, {name(rs1)}";
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FMV.X.D {
|
|
||||||
encoding: b1110001 | b00000 | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
|
||||||
args_disass:"{name(rd)}, f{rs1}";
|
|
||||||
X[rd]<=sext(F[rs1]);
|
|
||||||
}
|
|
||||||
FMV.D.X {
|
|
||||||
encoding: b1111001 | b00000 | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
|
||||||
args_disass:"f{rd}, {name(rs1)}";
|
|
||||||
F[rd] <= zext(X[rs1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,400 +0,0 @@
|
||||||
import "RV32I.core_desc"
|
|
||||||
|
|
||||||
InsructionSet RV32F extends RV32I{
|
|
||||||
constants {
|
|
||||||
FLEN, FFLAG_MASK := 0x1f
|
|
||||||
}
|
|
||||||
registers {
|
|
||||||
[31:0] F[FLEN], FCSR[32]
|
|
||||||
}
|
|
||||||
instructions{
|
|
||||||
FLW {
|
|
||||||
encoding: imm[11:0]s | rs1[4:0] | b010 | rd[4:0] | b0000111;
|
|
||||||
args_disass:"f{rd}, {imm}(x{rs1})";
|
|
||||||
val offs[XLEN] <= X[rs1]'s + imm;
|
|
||||||
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 {
|
|
||||||
encoding: imm[11:5]s | rs2[4:0] | rs1[4:0] | b010 | imm[4:0]s | b0100111;
|
|
||||||
args_disass:"f{rs2}, {imm}(x{rs1})";
|
|
||||||
val offs[XLEN] <= X[rs1]'s + imm;
|
|
||||||
MEM[offs]{32}<=F[rs2]{32};
|
|
||||||
}
|
|
||||||
FMADD.S {
|
|
||||||
encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1000011;
|
|
||||||
args_disass:"x{rd}, f{rs1}, f{rs2}, f{rs3}";
|
|
||||||
//F[rd]f<= F[rs1]f * F[rs2]f + F[rs3]f;
|
|
||||||
if(FLEN==32)
|
|
||||||
F[rd] <= fdispatch_fmadd_s(F[rs1], F[rs2], F[rs3], zext(0, 32), choose(rm<7, rm{8}, FCSR{8}));
|
|
||||||
else { // NaN boxing
|
|
||||||
val frs1[32] <= fdispatch_unbox_s(F[rs1]);
|
|
||||||
val frs2[32] <= fdispatch_unbox_s(F[rs2]);
|
|
||||||
val frs3[32] <= fdispatch_unbox_s(F[rs3]);
|
|
||||||
val res[32] <= fdispatch_fmadd_s(frs1, frs2, frs3, zext(0, 32), choose(rm<7, rm{8}, FCSR{8}));
|
|
||||||
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 {
|
|
||||||
encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1000111;
|
|
||||||
args_disass:"x{rd}, f{rs1}, f{rs2}, f{rs3}";
|
|
||||||
//F[rd]f<=F[rs1]f * F[rs2]f - F[rs3]f;
|
|
||||||
if(FLEN==32)
|
|
||||||
F[rd] <= fdispatch_fmadd_s(F[rs1], F[rs2], F[rs3], zext(1, 32), choose(rm<7, rm{8}, FCSR{8}));
|
|
||||||
else { // NaN boxing
|
|
||||||
val frs1[32] <= fdispatch_unbox_s(F[rs1]);
|
|
||||||
val frs2[32] <= fdispatch_unbox_s(F[rs2]);
|
|
||||||
val frs3[32] <= fdispatch_unbox_s(F[rs3]);
|
|
||||||
val res[32] <= fdispatch_fmadd_s(frs1, frs2, frs3, zext(1, 32), choose(rm<7, rm{8}, FCSR{8}));
|
|
||||||
val upper[FLEN] <= -1;
|
|
||||||
F[rd] <= (upper<<32) | zext(res, FLEN);
|
|
||||||
}
|
|
||||||
val flags[32] <= fdispatch_fget_flags();
|
|
||||||
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
|
||||||
}
|
|
||||||
FNMADD.S {
|
|
||||||
encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1001111;
|
|
||||||
args_disass:"x{rd}, f{rs1}, f{rs2}, f{rs3}";
|
|
||||||
//F[rd]f<=-F[rs1]f * F[rs2]f + F[rs3]f;
|
|
||||||
if(FLEN==32)
|
|
||||||
F[rd] <= fdispatch_fmadd_s(F[rs1], F[rs2], F[rs3], zext(2, 32), choose(rm<7, rm{8}, FCSR{8}));
|
|
||||||
else { // NaN boxing
|
|
||||||
val frs1[32] <= fdispatch_unbox_s(F[rs1]);
|
|
||||||
val frs2[32] <= fdispatch_unbox_s(F[rs2]);
|
|
||||||
val frs3[32] <= fdispatch_unbox_s(F[rs3]);
|
|
||||||
val res[32] <= fdispatch_fmadd_s(frs1, frs2, frs3, zext(2, 32), choose(rm<7, rm{8}, FCSR{8}));
|
|
||||||
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}, f{rs1}, f{rs2}, f{rs3}";
|
|
||||||
//F[rd]f<=-F[rs1]f * F[rs2]f - F[rs3]f;
|
|
||||||
if(FLEN==32)
|
|
||||||
F[rd] <= fdispatch_fmadd_s(F[rs1], F[rs2], F[rs3], zext(3, 32), choose(rm<7, rm{8}, FCSR{8}));
|
|
||||||
else { // NaN boxing
|
|
||||||
val frs1[32] <= fdispatch_unbox_s(F[rs1]);
|
|
||||||
val frs2[32] <= fdispatch_unbox_s(F[rs2]);
|
|
||||||
val frs3[32] <= fdispatch_unbox_s(F[rs3]);
|
|
||||||
val res[32] <= fdispatch_fmadd_s(frs1, frs2, frs3, zext(3, 32), choose(rm<7, rm{8}, FCSR{8}));
|
|
||||||
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 {
|
|
||||||
encoding: b0000000 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
|
||||||
args_disass:"f{rd}, f{rs1}, f{rs2}";
|
|
||||||
// F[rd]f <= F[rs1]f + F[rs2]f;
|
|
||||||
if(FLEN==32)
|
|
||||||
F[rd] <= fdispatch_fadd_s(F[rs1], F[rs2], choose(rm<7, rm{8}, FCSR{8}));
|
|
||||||
else { // NaN boxing
|
|
||||||
val frs1[32] <= fdispatch_unbox_s(F[rs1]);
|
|
||||||
val frs2[32] <= fdispatch_unbox_s(F[rs2]);
|
|
||||||
val res[32] <= fdispatch_fadd_s(frs1, frs2, choose(rm<7, rm{8}, FCSR{8}));
|
|
||||||
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 {
|
|
||||||
encoding: b0000100 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
|
||||||
args_disass:"f{rd}, f{rs1}, f{rs2}";
|
|
||||||
// F[rd]f <= F[rs1]f - F[rs2]f;
|
|
||||||
if(FLEN==32)
|
|
||||||
F[rd] <= fdispatch_fsub_s(F[rs1], F[rs2], choose(rm<7, rm{8}, FCSR{8}));
|
|
||||||
else { // NaN boxing
|
|
||||||
val frs1[32] <= fdispatch_unbox_s(F[rs1]);
|
|
||||||
val frs2[32] <= fdispatch_unbox_s(F[rs2]);
|
|
||||||
val res[32] <= fdispatch_fsub_s(frs1, frs2, choose(rm<7, rm{8}, FCSR{8}));
|
|
||||||
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 {
|
|
||||||
encoding: b0001000 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
|
||||||
args_disass:"f{rd}, f{rs1}, f{rs2}";
|
|
||||||
// F[rd]f <= F[rs1]f * F[rs2]f;
|
|
||||||
if(FLEN==32)
|
|
||||||
F[rd] <= fdispatch_fmul_s(F[rs1], F[rs2], choose(rm<7, rm{8}, FCSR{8}));
|
|
||||||
else { // NaN boxing
|
|
||||||
val frs1[32] <= fdispatch_unbox_s(F[rs1]);
|
|
||||||
val frs2[32] <= fdispatch_unbox_s(F[rs2]);
|
|
||||||
val res[32] <= fdispatch_fmul_s(frs1, frs2, choose(rm<7, rm{8}, FCSR{8}));
|
|
||||||
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 {
|
|
||||||
encoding: b0001100 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
|
||||||
args_disass:"f{rd}, f{rs1}, f{rs2}";
|
|
||||||
// F[rd]f <= F[rs1]f / F[rs2]f;
|
|
||||||
if(FLEN==32)
|
|
||||||
F[rd] <= fdispatch_fdiv_s(F[rs1], F[rs2], choose(rm<7, rm{8}, FCSR{8}));
|
|
||||||
else { // NaN boxing
|
|
||||||
val frs1[32] <= fdispatch_unbox_s(F[rs1]);
|
|
||||||
val frs2[32] <= fdispatch_unbox_s(F[rs2]);
|
|
||||||
val res[32] <= fdispatch_fdiv_s(frs1, frs2, choose(rm<7, rm{8}, FCSR{8}));
|
|
||||||
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 {
|
|
||||||
encoding: b0101100 | b00000 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
|
||||||
args_disass:"f{rd}, f{rs1}";
|
|
||||||
//F[rd]f<=sqrt(F[rs1]f);
|
|
||||||
if(FLEN==32)
|
|
||||||
F[rd] <= fdispatch_fsqrt_s(F[rs1], choose(rm<7, rm{8}, FCSR{8}));
|
|
||||||
else { // NaN boxing
|
|
||||||
val frs1[32] <= fdispatch_unbox_s(F[rs1]);
|
|
||||||
val res[32] <= fdispatch_fsqrt_s(frs1, choose(rm<7, rm{8}, FCSR{8}));
|
|
||||||
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 {
|
|
||||||
encoding: b0010000 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
|
||||||
args_disass:"f{rd}, f{rs1}, f{rs2}";
|
|
||||||
if(FLEN==32)
|
|
||||||
F[rd] <= (F[rs1] & 0x7fffffff) | (F[rs2] & 0x80000000);
|
|
||||||
else { // NaN boxing
|
|
||||||
val frs1[32] <= fdispatch_unbox_s(F[rs1]);
|
|
||||||
val frs2[32] <= fdispatch_unbox_s(F[rs2]);
|
|
||||||
val res[32] <= (frs1 & 0x7fffffff) | (frs2 & 0x80000000);
|
|
||||||
val upper[FLEN] <= -1;
|
|
||||||
F[rd] <= (upper<<32) | zext(res, FLEN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FSGNJN.S {
|
|
||||||
encoding: b0010000 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b1010011;
|
|
||||||
args_disass:"f{rd}, f{rs1}, f{rs2}";
|
|
||||||
if(FLEN==32)
|
|
||||||
F[rd] <= (F[rs1] & 0x7fffffff) | (~F[rs2] & 0x80000000);
|
|
||||||
else { // NaN boxing
|
|
||||||
val frs1[32] <= fdispatch_unbox_s(F[rs1]);
|
|
||||||
val frs2[32] <= fdispatch_unbox_s(F[rs2]);
|
|
||||||
val res[32] <= (frs1 & 0x7fffffff) | (~frs2 & 0x80000000);
|
|
||||||
val upper[FLEN] <= -1;
|
|
||||||
F[rd] <= (upper<<32) | zext(res, FLEN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FSGNJX.S {
|
|
||||||
encoding: b0010000 | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b1010011;
|
|
||||||
args_disass:"f{rd}, f{rs1}, f{rs2}";
|
|
||||||
if(FLEN==32)
|
|
||||||
F[rd] <= F[rs1] ^ (F[rs2] & 0x80000000);
|
|
||||||
else { // NaN boxing
|
|
||||||
val frs1[32] <= fdispatch_unbox_s(F[rs1]);
|
|
||||||
val frs2[32] <= fdispatch_unbox_s(F[rs2]);
|
|
||||||
val res[32] <= frs1 ^ (frs2 & 0x80000000);
|
|
||||||
val upper[FLEN] <= -1;
|
|
||||||
F[rd] <= (upper<<32) | zext(res, FLEN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FMIN.S {
|
|
||||||
encoding: b0010100 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
|
||||||
args_disass:"f{rd}, f{rs1}, f{rs2}";
|
|
||||||
//F[rd]f<= choose(F[rs1]f<F[rs2]f, F[rs1]f, F[rs2]f);
|
|
||||||
if(FLEN==32)
|
|
||||||
F[rd] <= fdispatch_fsel_s(F[rs1], F[rs2], zext(0, 32));
|
|
||||||
else { // NaN boxing
|
|
||||||
val frs1[32] <= fdispatch_unbox_s(F[rs1]);
|
|
||||||
val frs2[32] <= fdispatch_unbox_s(F[rs2]);
|
|
||||||
val res[32] <= fdispatch_fsel_s(frs1, frs2, zext(0, 32));
|
|
||||||
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 {
|
|
||||||
encoding: b0010100 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b1010011;
|
|
||||||
args_disass:"f{rd}, f{rs1}, f{rs2}";
|
|
||||||
//F[rd]f<= choose(F[rs1]f>F[rs2]f, F[rs1]f, F[rs2]f);
|
|
||||||
if(FLEN==32)
|
|
||||||
F[rd] <= fdispatch_fsel_s(F[rs1], F[rs2], zext(1, 32));
|
|
||||||
else { // NaN boxing
|
|
||||||
val frs1[32] <= fdispatch_unbox_s(F[rs1]);
|
|
||||||
val frs2[32] <= fdispatch_unbox_s(F[rs2]);
|
|
||||||
val res[32] <= fdispatch_fsel_s(frs1, frs2, zext(1, 32));
|
|
||||||
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 {
|
|
||||||
encoding: b1100000 | b00000 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
|
||||||
args_disass:"{name(rd)}, f{rs1}";
|
|
||||||
if(FLEN==32)
|
|
||||||
X[rd] <= sext(fdispatch_fcvt_s(F[rs1], zext(0, 32), rm{8}), XLEN);
|
|
||||||
else { // NaN boxing
|
|
||||||
val frs1[32] <= fdispatch_unbox_s(F[rs1]);
|
|
||||||
X[rd]<= sext(fdispatch_fcvt_s(frs1, zext(0, 32), rm{8}), XLEN);
|
|
||||||
}
|
|
||||||
val flags[32] <= fdispatch_fget_flags();
|
|
||||||
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
|
||||||
}
|
|
||||||
FCVT.WU.S {
|
|
||||||
encoding: b1100000 | b00001 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
|
||||||
args_disass:"{name(rd)}, f{rs1}";
|
|
||||||
//FIXME: according to the spec it should be zero-extended not sign extended
|
|
||||||
if(FLEN==32)
|
|
||||||
X[rd]<= sext(fdispatch_fcvt_s(F[rs1], zext(1, 32), rm{8}), XLEN);
|
|
||||||
else { // NaN boxing
|
|
||||||
val frs1[32] <= fdispatch_unbox_s(F[rs1]);
|
|
||||||
X[rd]<= sext(fdispatch_fcvt_s(frs1, zext(1, 32), rm{8}), XLEN);
|
|
||||||
}
|
|
||||||
val flags[32] <= fdispatch_fget_flags();
|
|
||||||
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
|
||||||
}
|
|
||||||
FEQ.S {
|
|
||||||
encoding: b1010000 | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b1010011;
|
|
||||||
args_disass:"{name(rd)}, f{rs1}, f{rs2}";
|
|
||||||
if(FLEN==32)
|
|
||||||
X[rd]<=zext(fdispatch_fcmp_s(F[rs1], F[rs2], zext(0, 32)));
|
|
||||||
else {
|
|
||||||
val frs1[32] <= fdispatch_unbox_s(F[rs1]);
|
|
||||||
val frs2[32] <= fdispatch_unbox_s(F[rs2]);
|
|
||||||
X[rd]<=zext(fdispatch_fcmp_s(frs1, frs2, zext(0, 32)));
|
|
||||||
}
|
|
||||||
val flags[32] <= fdispatch_fget_flags();
|
|
||||||
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
|
||||||
}
|
|
||||||
FLT.S {
|
|
||||||
encoding: b1010000 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b1010011;
|
|
||||||
args_disass:"{name(rd)}, f{rs1}, f{rs2}";
|
|
||||||
if(FLEN==32)
|
|
||||||
X[rd]<=zext(fdispatch_fcmp_s(F[rs1], F[rs2], zext(2, 32)));
|
|
||||||
else {
|
|
||||||
val frs1[32] <= fdispatch_unbox_s(F[rs1]);
|
|
||||||
val frs2[32] <= fdispatch_unbox_s(F[rs2]);
|
|
||||||
X[rd]<=zext(fdispatch_fcmp_s(frs1, frs2, zext(2, 32)));
|
|
||||||
}
|
|
||||||
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 {
|
|
||||||
encoding: b1010000 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
|
||||||
args_disass:"{name(rd)}, f{rs1}, f{rs2}";
|
|
||||||
if(FLEN==32)
|
|
||||||
X[rd]<=zext(fdispatch_fcmp_s(F[rs1], F[rs2], zext(1, 32)));
|
|
||||||
else {
|
|
||||||
val frs1[32] <= fdispatch_unbox_s(F[rs1]);
|
|
||||||
val frs2[32] <= fdispatch_unbox_s(F[rs2]);
|
|
||||||
X[rd]<=zext(fdispatch_fcmp_s(frs1, frs2, zext(1, 32)));
|
|
||||||
}
|
|
||||||
val flags[32] <= fdispatch_fget_flags();
|
|
||||||
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
|
||||||
}
|
|
||||||
FCLASS.S {
|
|
||||||
encoding: b1110000 | b00000 | rs1[4:0] | b001 | rd[4:0] | b1010011;
|
|
||||||
args_disass:"{name(rd)}, f{rs1}";
|
|
||||||
X[rd]<=fdispatch_fclass_s(fdispatch_unbox_s(F[rs1]));
|
|
||||||
}
|
|
||||||
FCVT.S.W {
|
|
||||||
encoding: b1101000 | b00000 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
|
||||||
args_disass:"f{rd}, {name(rs1)}";
|
|
||||||
if(FLEN==32)
|
|
||||||
F[rd] <= fdispatch_fcvt_s(X[rs1]{32}, zext(2, 32), rm{8});
|
|
||||||
else { // NaN boxing
|
|
||||||
val res[32] <= fdispatch_fcvt_s(X[rs1]{32}, zext(2, 32), rm{8});
|
|
||||||
val upper[FLEN] <= -1;
|
|
||||||
F[rd] <= (upper<<32) | zext(res, FLEN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FCVT.S.WU {
|
|
||||||
encoding: b1101000 | b00001 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
|
||||||
args_disass:"f{rd}, {name(rs1)}";
|
|
||||||
if(FLEN==32)
|
|
||||||
F[rd] <=fdispatch_fcvt_s(X[rs1]{32}, zext(3,32), rm{8});
|
|
||||||
else { // NaN boxing
|
|
||||||
val res[32] <=fdispatch_fcvt_s(X[rs1]{32}, zext(3,32), rm{8});
|
|
||||||
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:"{name(rd)}, f{rs1}";
|
|
||||||
X[rd]<=sext(F[rs1]{32});
|
|
||||||
}
|
|
||||||
FMV.W.X {
|
|
||||||
encoding: b1111000 | b00000 | rs1[4:0] | b000 | rd[4:0] | b1010011;
|
|
||||||
args_disass:"f{rd}, {name(rs1)}";
|
|
||||||
if(FLEN==32)
|
|
||||||
F[rd] <= X[rs1]{32};
|
|
||||||
else { // NaN boxing
|
|
||||||
val upper[FLEN] <= -1;
|
|
||||||
F[rd] <= (upper<<32) | zext(X[rs1]{32}, FLEN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
InsructionSet RV64F extends RV32F{
|
|
||||||
|
|
||||||
instructions{
|
|
||||||
FCVT.L.S { // fp to 64bit signed integer
|
|
||||||
encoding: b1100000 | b00010 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
|
||||||
args_disass:"x{rd}, f{rs1}";
|
|
||||||
val res[64] <= fdispatch_fcvt_32_64(fdispatch_unbox_s(F[rs1]), zext(0, 32), rm{8});
|
|
||||||
X[rd]<= sext(res);
|
|
||||||
val flags[32] <= fdispatch_fget_flags();
|
|
||||||
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
|
||||||
}
|
|
||||||
FCVT.LU.S { // fp to 64bit unsigned integer
|
|
||||||
encoding: b1100000 | b00011 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
|
||||||
args_disass:"x{rd}, f{rs1}";
|
|
||||||
val res[64] <= fdispatch_fcvt_32_64(fdispatch_unbox_s(F[rs1]), zext(1, 32), rm{8});
|
|
||||||
X[rd]<= zext(res);
|
|
||||||
val flags[32] <= fdispatch_fget_flags();
|
|
||||||
FCSR <= (FCSR & ~FFLAG_MASK) + flags{5};
|
|
||||||
}
|
|
||||||
FCVT.S.L { // 64bit signed int to to fp
|
|
||||||
encoding: b1101000 | b00010 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
|
||||||
args_disass:"f{rd}, x{rs1}";
|
|
||||||
val res[32] <= fdispatch_fcvt_64_32(X[rs1], zext(2, 32));
|
|
||||||
if(FLEN==32)
|
|
||||||
F[rd] <= res;
|
|
||||||
else { // NaN boxing
|
|
||||||
val upper[FLEN] <= -1;
|
|
||||||
F[rd] <= (upper<<32) | zext(res, FLEN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FCVT.S.LU { // 64bit unsigned int to to fp
|
|
||||||
encoding: b1101000 | b00011 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
|
|
||||||
args_disass:"f{rd}, x{rs1}";
|
|
||||||
val res[32] <=fdispatch_fcvt_64_32(X[rs1], zext(3,32));
|
|
||||||
if(FLEN==32)
|
|
||||||
F[rd] <= res;
|
|
||||||
else { // NaN boxing
|
|
||||||
val upper[FLEN] <= -1;
|
|
||||||
F[rd] <= (upper<<32) | zext(res, FLEN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,160 +0,0 @@
|
||||||
import "RISCVBase.core_desc"
|
|
||||||
|
|
||||||
InsructionSet RV32M extends RISCVBase {
|
|
||||||
constants {
|
|
||||||
MAXLEN:=128
|
|
||||||
}
|
|
||||||
instructions{
|
|
||||||
MUL{
|
|
||||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b0110011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0){
|
|
||||||
val res[MAXLEN] <= zext(X[rs1], MAXLEN) * zext(X[rs2], MAXLEN);
|
|
||||||
X[rd]<= zext(res , XLEN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MULH {
|
|
||||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b0110011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0){
|
|
||||||
val res[MAXLEN] <= sext(X[rs1], MAXLEN) * sext(X[rs2], MAXLEN);
|
|
||||||
X[rd]<= zext(res >> XLEN, XLEN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MULHSU {
|
|
||||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0110011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0){
|
|
||||||
val res[MAXLEN] <= sext(X[rs1], MAXLEN) * zext(X[rs2], MAXLEN);
|
|
||||||
X[rd]<= zext(res >> XLEN, XLEN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MULHU {
|
|
||||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0110011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0){
|
|
||||||
val res[MAXLEN] <= zext(X[rs1], MAXLEN) * zext(X[rs2], MAXLEN);
|
|
||||||
X[rd]<= zext(res >> XLEN, XLEN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DIV {
|
|
||||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b100 | rd[4:0] | b0110011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0){
|
|
||||||
if(X[rs2]!=0){
|
|
||||||
val M1[XLEN] <= -1;
|
|
||||||
val XLM1[8] <= XLEN-1;
|
|
||||||
val ONE[XLEN] <= 1;
|
|
||||||
val MMIN[XLEN] <= ONE<<XLM1;
|
|
||||||
if(X[rs1]==MMIN && X[rs2]==M1)
|
|
||||||
X[rd] <= MMIN;
|
|
||||||
else
|
|
||||||
X[rd] <= X[rs1]s / X[rs2]s;
|
|
||||||
}else
|
|
||||||
X[rd] <= -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DIVU {
|
|
||||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b101 | rd[4:0] | b0110011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0){
|
|
||||||
if(X[rs2]!=0)
|
|
||||||
X[rd] <= X[rs1] / X[rs2];
|
|
||||||
else
|
|
||||||
X[rd] <= -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
REM {
|
|
||||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b110 | rd[4:0] | b0110011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0){
|
|
||||||
if(X[rs2]!=0) {
|
|
||||||
val M1[XLEN] <= -1; // constant -1
|
|
||||||
val XLM1[32] <= XLEN-1;
|
|
||||||
val ONE[XLEN] <= 1;
|
|
||||||
val MMIN[XLEN] <= ONE<<XLM1; // -2^(XLEN-1)
|
|
||||||
if(X[rs1]==MMIN && X[rs2]==M1)
|
|
||||||
X[rd] <= 0;
|
|
||||||
else
|
|
||||||
X[rd] <= X[rs1]'s % X[rs2]'s;
|
|
||||||
} else
|
|
||||||
X[rd] <= X[rs1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
REMU {
|
|
||||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b111 | rd[4:0] | b0110011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0){
|
|
||||||
if(X[rs2]!=0)
|
|
||||||
X[rd] <= X[rs1] % X[rs2];
|
|
||||||
else
|
|
||||||
X[rd] <= X[rs1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
InsructionSet RV64M extends RV32M {
|
|
||||||
instructions{
|
|
||||||
MULW{
|
|
||||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b0111011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0){
|
|
||||||
X[rd]<= sext(X[rs1]{32} * X[rs2]{32});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DIVW {
|
|
||||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b100 | rd[4:0] | b0111011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0){
|
|
||||||
if(X[rs2]!=0){
|
|
||||||
val M1[32] <= -1;
|
|
||||||
val ONE[32] <= 1;
|
|
||||||
val MMIN[32] <= ONE<<31;
|
|
||||||
if(X[rs1]{32}==MMIN && X[rs2]{32}==M1)
|
|
||||||
X[rd] <= -1<<31;
|
|
||||||
else
|
|
||||||
X[rd] <= sext(X[rs1]{32}s / X[rs2]{32}s);
|
|
||||||
}else
|
|
||||||
X[rd] <= -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DIVUW {
|
|
||||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b101 | rd[4:0] | b0111011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0){
|
|
||||||
if(X[rs2]{32}!=0)
|
|
||||||
X[rd] <= sext(X[rs1]{32} / X[rs2]{32});
|
|
||||||
else
|
|
||||||
X[rd] <= -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
REMW {
|
|
||||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b110 | rd[4:0] | b0111011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0){
|
|
||||||
if(X[rs2]!=0) {
|
|
||||||
val M1[32] <= -1; // constant -1
|
|
||||||
val ONE[32] <= 1;
|
|
||||||
val MMIN[32] <= ONE<<31; // -2^(XLEN-1)
|
|
||||||
if(X[rs1]{32}==MMIN && X[rs2]==M1)
|
|
||||||
X[rd] <= 0;
|
|
||||||
else
|
|
||||||
X[rd] <= sext(X[rs1]{32}s % X[rs2]{32}s);
|
|
||||||
} else
|
|
||||||
X[rd] <= sext(X[rs1]{32});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
REMUW {
|
|
||||||
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b111 | rd[4:0] | b0111011;
|
|
||||||
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
|
|
||||||
if(rd != 0){
|
|
||||||
if(X[rs2]{32}!=0)
|
|
||||||
X[rd] <= sext(X[rs1]{32} % X[rs2]{32});
|
|
||||||
else
|
|
||||||
X[rd] <= sext(X[rs1]{32});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,58 +0,0 @@
|
||||||
import "RV32I.core_desc"
|
|
||||||
import "RV64I.core_desc"
|
|
||||||
import "RVM.core_desc"
|
|
||||||
import "RVA.core_desc"
|
|
||||||
import "RVC.core_desc"
|
|
||||||
import "RVF.core_desc"
|
|
||||||
import "RVD.core_desc"
|
|
||||||
|
|
||||||
Core RV32IMAC provides RV32I, RV32M, RV32A, RV32IC {
|
|
||||||
constants {
|
|
||||||
XLEN:=32;
|
|
||||||
PCLEN:=32;
|
|
||||||
// definitions for the architecture wrapper
|
|
||||||
// XL ZYXWVUTSRQPONMLKJIHGFEDCBA
|
|
||||||
MISA_VAL:=0b01000000000101000001000100000101;
|
|
||||||
PGSIZE := 0x1000; //1 << 12;
|
|
||||||
PGMASK := 0xfff; //PGSIZE-1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Core RV32GC provides RV32I, RV32M, RV32A, RV32F, RV32D, RV32IC, RV32FC, RV32DC {
|
|
||||||
constants {
|
|
||||||
XLEN:=32;
|
|
||||||
FLEN:=64;
|
|
||||||
PCLEN:=32;
|
|
||||||
// definitions for the architecture wrapper
|
|
||||||
// XL ZYXWVUTSRQPONMLKJIHGFEDCBA
|
|
||||||
MISA_VAL:=0b01000000000101000001000100101101;
|
|
||||||
PGSIZE := 0x1000; //1 << 12;
|
|
||||||
PGMASK := 0xfff; //PGSIZE-1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Core RV64I provides RV64I {
|
|
||||||
constants {
|
|
||||||
XLEN:=64;
|
|
||||||
PCLEN:=64;
|
|
||||||
// definitions for the architecture wrapper
|
|
||||||
// XL ZYXWVUTSRQPONMLKJIHGFEDCBA
|
|
||||||
MISA_VAL:=0b10000000000001000000000100000000;
|
|
||||||
PGSIZE := 0x1000; //1 << 12;
|
|
||||||
PGMASK := 0xfff; //PGSIZE-1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Core RV64GC provides RV64I, RV64M, RV64A, RV64F, RV64D, RV64IC, RV32FC, RV32DC {
|
|
||||||
constants {
|
|
||||||
XLEN:=64;
|
|
||||||
FLEN:=64;
|
|
||||||
PCLEN:=64;
|
|
||||||
// definitions for the architecture wrapper
|
|
||||||
// XL ZYXWVUTSRQPONMLKJIHGFEDCBA
|
|
||||||
MISA_VAL:=0b01000000000101000001000100101101;
|
|
||||||
PGSIZE := 0x1000; //1 << 12;
|
|
||||||
PGMASK := 0xfff; //PGSIZE-1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
{
|
|
||||||
"${coreDef.name}" : [<%instructions.eachWithIndex{instr,index -> %>${index==0?"":","}
|
|
||||||
{
|
|
||||||
"name" : "${instr.name}",
|
|
||||||
"size" : ${instr.length},
|
|
||||||
"delay" : ${generator.hasAttribute(instr.instruction, com.minres.coredsl.coreDsl.InstrAttribute.COND)?[1,1]:1}
|
|
||||||
}<%}%>
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -1,221 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2017, 2018 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.
|
|
||||||
*
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
<%
|
|
||||||
import com.minres.coredsl.coreDsl.Register
|
|
||||||
import com.minres.coredsl.coreDsl.RegisterFile
|
|
||||||
import com.minres.coredsl.coreDsl.RegisterAlias
|
|
||||||
def getTypeSize(size){
|
|
||||||
if(size > 32) 64 else if(size > 16) 32 else if(size > 8) 16 else 8
|
|
||||||
}
|
|
||||||
def getOriginalName(reg){
|
|
||||||
if( reg.original instanceof RegisterFile) {
|
|
||||||
if( reg.index != null ) {
|
|
||||||
return reg.original.name+generator.generateHostCode(reg.index)
|
|
||||||
} else {
|
|
||||||
return reg.original.name
|
|
||||||
}
|
|
||||||
} else if(reg.original instanceof Register){
|
|
||||||
return reg.original.name
|
|
||||||
}
|
|
||||||
}
|
|
||||||
def getRegisterNames(){
|
|
||||||
def regNames = []
|
|
||||||
allRegs.each { reg ->
|
|
||||||
if( reg instanceof RegisterFile) {
|
|
||||||
(reg.range.right..reg.range.left).each{
|
|
||||||
regNames+=reg.name.toLowerCase()+it
|
|
||||||
}
|
|
||||||
} else if(reg instanceof Register){
|
|
||||||
regNames+=reg.name.toLowerCase()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return regNames
|
|
||||||
}
|
|
||||||
def getRegisterAliasNames(){
|
|
||||||
def regMap = allRegs.findAll{it instanceof RegisterAlias }.collectEntries {[getOriginalName(it), it.name]}
|
|
||||||
return allRegs.findAll{it instanceof Register || it instanceof RegisterFile}.collect{reg ->
|
|
||||||
if( reg instanceof RegisterFile) {
|
|
||||||
return (reg.range.right..reg.range.left).collect{ (regMap[reg.name]?:regMap[reg.name+it]?:reg.name.toLowerCase()+it).toLowerCase() }
|
|
||||||
} else if(reg instanceof Register){
|
|
||||||
regMap[reg.name]?:reg.name.toLowerCase()
|
|
||||||
}
|
|
||||||
}.flatten()
|
|
||||||
}
|
|
||||||
%>
|
|
||||||
#ifndef _${coreDef.name.toUpperCase()}_H_
|
|
||||||
#define _${coreDef.name.toUpperCase()}_H_
|
|
||||||
|
|
||||||
#include <array>
|
|
||||||
#include <iss/arch/traits.h>
|
|
||||||
#include <iss/arch_if.h>
|
|
||||||
#include <iss/vm_if.h>
|
|
||||||
|
|
||||||
namespace iss {
|
|
||||||
namespace arch {
|
|
||||||
|
|
||||||
struct ${coreDef.name.toLowerCase()};
|
|
||||||
|
|
||||||
template <> struct traits<${coreDef.name.toLowerCase()}> {
|
|
||||||
|
|
||||||
constexpr static char const* const core_type = "${coreDef.name}";
|
|
||||||
|
|
||||||
static constexpr std::array<const char*, ${getRegisterNames().size}> reg_names{
|
|
||||||
{"${getRegisterNames().join("\", \"")}"}};
|
|
||||||
|
|
||||||
static constexpr std::array<const char*, ${getRegisterAliasNames().size}> reg_aliases{
|
|
||||||
{"${getRegisterAliasNames().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 {<%
|
|
||||||
allRegs.each { reg ->
|
|
||||||
if( reg instanceof RegisterFile) {
|
|
||||||
(reg.range.right..reg.range.left).each{%>
|
|
||||||
${reg.name}${it},<%
|
|
||||||
}
|
|
||||||
} else if(reg instanceof Register){ %>
|
|
||||||
${reg.name},<%
|
|
||||||
}
|
|
||||||
}%>
|
|
||||||
NUM_REGS,
|
|
||||||
NEXT_${pc.name}=NUM_REGS,
|
|
||||||
TRAP_STATE,
|
|
||||||
PENDING_TRAP,
|
|
||||||
MACHINE_STATE,
|
|
||||||
LAST_BRANCH,
|
|
||||||
ICOUNT<%
|
|
||||||
allRegs.each { reg ->
|
|
||||||
if(reg instanceof RegisterAlias){ def aliasname=getOriginalName(reg)%>,
|
|
||||||
${reg.name} = ${aliasname}<%
|
|
||||||
}
|
|
||||||
}%>
|
|
||||||
};
|
|
||||||
|
|
||||||
using reg_t = uint${regDataWidth}_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 phys_addr_t = iss::typed_addr_t<iss::address_type::PHYSICAL>;
|
|
||||||
|
|
||||||
static constexpr std::array<const uint32_t, ${regSizes.size}> reg_bit_widths{
|
|
||||||
{${regSizes.join(",")}}};
|
|
||||||
|
|
||||||
static constexpr std::array<const uint32_t, ${regOffsets.size}> reg_byte_offsets{
|
|
||||||
{${regOffsets.join(",")}}};
|
|
||||||
|
|
||||||
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 { ${allSpaces.collect{s -> s.name}.join(', ')} };
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ${coreDef.name.toLowerCase()}: public arch_if {
|
|
||||||
|
|
||||||
using virt_addr_t = typename traits<${coreDef.name.toLowerCase()}>::virt_addr_t;
|
|
||||||
using phys_addr_t = typename traits<${coreDef.name.toLowerCase()}>::phys_addr_t;
|
|
||||||
using reg_t = typename traits<${coreDef.name.toLowerCase()}>::reg_t;
|
|
||||||
using addr_t = typename traits<${coreDef.name.toLowerCase()}>::addr_t;
|
|
||||||
|
|
||||||
${coreDef.name.toLowerCase()}();
|
|
||||||
~${coreDef.name.toLowerCase()}();
|
|
||||||
|
|
||||||
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 {};
|
|
||||||
|
|
||||||
inline uint64_t get_icount() { return reg.icount; }
|
|
||||||
|
|
||||||
inline bool should_stop() { return interrupt_sim; }
|
|
||||||
|
|
||||||
inline phys_addr_t v2p(const iss::addr_t& addr){
|
|
||||||
if (addr.space != traits<${coreDef.name.toLowerCase()}>::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<${coreDef.name.toLowerCase()}>::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; }
|
|
||||||
|
|
||||||
inline uint32_t get_last_branch() { return reg.last_branch; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
struct ${coreDef.name}_regs {<%
|
|
||||||
allRegs.each { reg ->
|
|
||||||
if( reg instanceof RegisterFile) {
|
|
||||||
(reg.range.right..reg.range.left).each{%>
|
|
||||||
uint${generator.getSize(reg)}_t ${reg.name}${it} = 0;<%
|
|
||||||
}
|
|
||||||
} else if(reg instanceof Register){ %>
|
|
||||||
uint${generator.getSize(reg)}_t ${reg.name} = 0;<%
|
|
||||||
}
|
|
||||||
}%>
|
|
||||||
uint${generator.getSize(pc)}_t NEXT_${pc.name} = 0;
|
|
||||||
uint32_t trap_state = 0, pending_trap = 0, machine_state = 0, last_branch = 0;
|
|
||||||
uint64_t icount = 0;
|
|
||||||
} reg;
|
|
||||||
|
|
||||||
std::array<address_type, 4> addr_mode;
|
|
||||||
|
|
||||||
bool interrupt_sim=false;
|
|
||||||
<%
|
|
||||||
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){}
|
|
||||||
<%}%>
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* _${coreDef.name.toUpperCase()}_H_ */
|
|
|
@ -1,117 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2017, 2018 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.
|
|
||||||
*
|
|
||||||
*******************************************************************************/
|
|
||||||
<%
|
|
||||||
import com.minres.coredsl.coreDsl.Register
|
|
||||||
import com.minres.coredsl.coreDsl.RegisterFile
|
|
||||||
import com.minres.coredsl.coreDsl.RegisterAlias
|
|
||||||
def getOriginalName(reg){
|
|
||||||
if( reg.original instanceof RegisterFile) {
|
|
||||||
if( reg.index != null ) {
|
|
||||||
return reg.original.name+generator.generateHostCode(reg.index)
|
|
||||||
} else {
|
|
||||||
return reg.original.name
|
|
||||||
}
|
|
||||||
} else if(reg.original instanceof Register){
|
|
||||||
return reg.original.name
|
|
||||||
}
|
|
||||||
}
|
|
||||||
def getRegisterNames(){
|
|
||||||
def regNames = []
|
|
||||||
allRegs.each { reg ->
|
|
||||||
if( reg instanceof RegisterFile) {
|
|
||||||
(reg.range.right..reg.range.left).each{
|
|
||||||
regNames+=reg.name.toLowerCase()+it
|
|
||||||
}
|
|
||||||
} else if(reg instanceof Register){
|
|
||||||
regNames+=reg.name.toLowerCase()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return regNames
|
|
||||||
}
|
|
||||||
def getRegisterAliasNames(){
|
|
||||||
def regMap = allRegs.findAll{it instanceof RegisterAlias }.collectEntries {[getOriginalName(it), it.name]}
|
|
||||||
return allRegs.findAll{it instanceof Register || it instanceof RegisterFile}.collect{reg ->
|
|
||||||
if( reg instanceof RegisterFile) {
|
|
||||||
return (reg.range.right..reg.range.left).collect{ (regMap[reg.name]?:regMap[reg.name+it]?:reg.name.toLowerCase()+it).toLowerCase() }
|
|
||||||
} else if(reg instanceof Register){
|
|
||||||
regMap[reg.name]?:reg.name.toLowerCase()
|
|
||||||
}
|
|
||||||
}.flatten()
|
|
||||||
}
|
|
||||||
%>
|
|
||||||
#include "util/ities.h"
|
|
||||||
#include <util/logging.h>
|
|
||||||
|
|
||||||
#include <elfio/elfio.hpp>
|
|
||||||
#include <iss/arch/${coreDef.name.toLowerCase()}.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
#include <ihex.h>
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#include <cstdio>
|
|
||||||
#include <cstring>
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
using namespace iss::arch;
|
|
||||||
|
|
||||||
constexpr std::array<const char*, ${getRegisterNames().size}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_names;
|
|
||||||
constexpr std::array<const char*, ${getRegisterAliasNames().size}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_aliases;
|
|
||||||
constexpr std::array<const uint32_t, ${regSizes.size}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_bit_widths;
|
|
||||||
constexpr std::array<const uint32_t, ${regOffsets.size}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_byte_offsets;
|
|
||||||
|
|
||||||
${coreDef.name.toLowerCase()}::${coreDef.name.toLowerCase()}() {
|
|
||||||
reg.icount = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
${coreDef.name.toLowerCase()}::~${coreDef.name.toLowerCase()}() = default;
|
|
||||||
|
|
||||||
void ${coreDef.name.toLowerCase()}::reset(uint64_t address) {
|
|
||||||
for(size_t i=0; i<traits<${coreDef.name.toLowerCase()}>::NUM_REGS; ++i) set_reg(i, std::vector<uint8_t>(sizeof(traits<${coreDef.name.toLowerCase()}>::reg_t),0));
|
|
||||||
reg.PC=address;
|
|
||||||
reg.NEXT_PC=reg.PC;
|
|
||||||
reg.trap_state=0;
|
|
||||||
reg.machine_state=0x0;
|
|
||||||
reg.icount=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t *${coreDef.name.toLowerCase()}::get_regs_base_ptr() {
|
|
||||||
return reinterpret_cast<uint8_t*>(®);
|
|
||||||
}
|
|
||||||
|
|
||||||
${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
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,325 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2017, 2018 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 <iss/arch/${coreDef.name.toLowerCase()}.h>
|
|
||||||
#include <iss/arch/riscv_hart_msu_vp.h>
|
|
||||||
#include <iss/debugger/gdb_session.h>
|
|
||||||
#include <iss/debugger/server.h>
|
|
||||||
#include <iss/iss.h>
|
|
||||||
#include <iss/llvm/vm_base.h>
|
|
||||||
#include <util/logging.h>
|
|
||||||
|
|
||||||
#define FMT_HEADER_ONLY
|
|
||||||
#include <fmt/format.h>
|
|
||||||
|
|
||||||
#include <array>
|
|
||||||
#include <iss/debugger/riscv_target_adapter.h>
|
|
||||||
|
|
||||||
namespace iss {
|
|
||||||
namespace vm {
|
|
||||||
namespace fp_impl {
|
|
||||||
void add_fp_functions_2_module(llvm::Module *, unsigned, unsigned);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace ${coreDef.name.toLowerCase()} {
|
|
||||||
using namespace iss::arch;
|
|
||||||
using namespace llvm;
|
|
||||||
using namespace iss::debugger;
|
|
||||||
using namespace iss::vm::llvm;
|
|
||||||
|
|
||||||
template <typename ARCH> class vm_impl : public vm_base<ARCH> {
|
|
||||||
public:
|
|
||||||
using super = typename iss::vm::llvm::vm_base<ARCH>;
|
|
||||||
using virt_addr_t = typename super::virt_addr_t;
|
|
||||||
using phys_addr_t = typename super::phys_addr_t;
|
|
||||||
using code_word_t = typename super::code_word_t;
|
|
||||||
using addr_t = typename super::addr_t;
|
|
||||||
|
|
||||||
vm_impl();
|
|
||||||
|
|
||||||
vm_impl(ARCH &core, unsigned core_id = 0, unsigned cluster_id = 0);
|
|
||||||
|
|
||||||
void enableDebug(bool enable) { super::sync_exec = super::ALL_SYNC; }
|
|
||||||
|
|
||||||
target_adapter_if *accquire_target_adapter(server_if *srv) override {
|
|
||||||
debugger_if::dbg_enabled = true;
|
|
||||||
if (vm_base<ARCH>::tgt_adapter == nullptr)
|
|
||||||
vm_base<ARCH>::tgt_adapter = new riscv_target_adapter<ARCH>(srv, this->get_arch());
|
|
||||||
return vm_base<ARCH>::tgt_adapter;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
using vm_base<ARCH>::get_reg_ptr;
|
|
||||||
|
|
||||||
inline const char *name(size_t index){return traits<ARCH>::reg_aliases.at(index);}
|
|
||||||
|
|
||||||
template <typename T> inline ConstantInt *size(T type) {
|
|
||||||
return ConstantInt::get(getContext(), APInt(32, type->getType()->getScalarSizeInBits()));
|
|
||||||
}
|
|
||||||
|
|
||||||
void setup_module(Module* m) override {
|
|
||||||
super::setup_module(m);
|
|
||||||
iss::vm::fp_impl::add_fp_functions_2_module(m, traits<ARCH>::FP_REGS_SIZE, traits<ARCH>::XLEN);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline Value *gen_choose(Value *cond, Value *trueVal, Value *falseVal, unsigned size) {
|
|
||||||
return super::gen_cond_assign(cond, this->gen_ext(trueVal, size), this->gen_ext(falseVal, size));
|
|
||||||
}
|
|
||||||
|
|
||||||
std::tuple<continuation_e, BasicBlock *> gen_single_inst_behavior(virt_addr_t &, unsigned int &, BasicBlock *) override;
|
|
||||||
|
|
||||||
void gen_leave_behavior(BasicBlock *leave_blk) override;
|
|
||||||
|
|
||||||
void gen_raise_trap(uint16_t trap_id, uint16_t cause);
|
|
||||||
|
|
||||||
void gen_leave_trap(unsigned lvl);
|
|
||||||
|
|
||||||
void gen_wait(unsigned type);
|
|
||||||
|
|
||||||
void gen_trap_behavior(BasicBlock *) override;
|
|
||||||
|
|
||||||
void gen_trap_check(BasicBlock *bb);
|
|
||||||
|
|
||||||
inline Value *gen_reg_load(unsigned i, unsigned level = 0) {
|
|
||||||
return this->builder.CreateLoad(get_reg_ptr(i), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void gen_set_pc(virt_addr_t pc, unsigned reg_num) {
|
|
||||||
Value *next_pc_v = this->builder.CreateSExtOrTrunc(this->gen_const(traits<ARCH>::XLEN, pc.val),
|
|
||||||
this->get_type(traits<ARCH>::XLEN));
|
|
||||||
this->builder.CreateStore(next_pc_v, get_reg_ptr(reg_num), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// some compile time constants
|
|
||||||
// enum { MASK16 = 0b1111110001100011, MASK32 = 0b11111111111100000111000001111111 };
|
|
||||||
enum { MASK16 = 0b1111111111111111, MASK32 = 0b11111111111100000111000001111111 };
|
|
||||||
enum { EXTR_MASK16 = MASK16 >> 2, EXTR_MASK32 = MASK32 >> 2 };
|
|
||||||
enum { LUT_SIZE = 1 << util::bit_count(EXTR_MASK32), LUT_SIZE_C = 1 << util::bit_count(EXTR_MASK16) };
|
|
||||||
|
|
||||||
using this_class = vm_impl<ARCH>;
|
|
||||||
using compile_func = std::tuple<continuation_e, BasicBlock *> (this_class::*)(virt_addr_t &pc,
|
|
||||||
code_word_t instr,
|
|
||||||
BasicBlock *bb);
|
|
||||||
std::array<compile_func, LUT_SIZE> lut;
|
|
||||||
|
|
||||||
std::array<compile_func, LUT_SIZE_C> lut_00, lut_01, lut_10;
|
|
||||||
std::array<compile_func, LUT_SIZE> lut_11;
|
|
||||||
|
|
||||||
std::array<compile_func *, 4> qlut;
|
|
||||||
|
|
||||||
std::array<const uint32_t, 4> lutmasks = {{EXTR_MASK16, EXTR_MASK16, EXTR_MASK16, EXTR_MASK32}};
|
|
||||||
|
|
||||||
void expand_bit_mask(int pos, uint32_t mask, uint32_t value, uint32_t valid, uint32_t idx, compile_func lut[],
|
|
||||||
compile_func f) {
|
|
||||||
if (pos < 0) {
|
|
||||||
lut[idx] = f;
|
|
||||||
} else {
|
|
||||||
auto bitmask = 1UL << pos;
|
|
||||||
if ((mask & bitmask) == 0) {
|
|
||||||
expand_bit_mask(pos - 1, mask, value, valid, idx, lut, f);
|
|
||||||
} else {
|
|
||||||
if ((valid & bitmask) == 0) {
|
|
||||||
expand_bit_mask(pos - 1, mask, value, valid, (idx << 1), lut, f);
|
|
||||||
expand_bit_mask(pos - 1, mask, value, valid, (idx << 1) + 1, lut, f);
|
|
||||||
} else {
|
|
||||||
auto new_val = idx << 1;
|
|
||||||
if ((value & bitmask) != 0) new_val++;
|
|
||||||
expand_bit_mask(pos - 1, mask, value, valid, new_val, lut, f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline uint32_t extract_fields(uint32_t val) { return extract_fields(29, val >> 2, lutmasks[val & 0x3], 0); }
|
|
||||||
|
|
||||||
uint32_t extract_fields(int pos, uint32_t val, uint32_t mask, uint32_t lut_val) {
|
|
||||||
if (pos >= 0) {
|
|
||||||
auto bitmask = 1UL << pos;
|
|
||||||
if ((mask & bitmask) == 0) {
|
|
||||||
lut_val = extract_fields(pos - 1, val, mask, lut_val);
|
|
||||||
} else {
|
|
||||||
auto new_val = lut_val << 1;
|
|
||||||
if ((val & bitmask) != 0) new_val++;
|
|
||||||
lut_val = extract_fields(pos - 1, val, mask, new_val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return lut_val;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
/****************************************************************************
|
|
||||||
* start opcode definitions
|
|
||||||
****************************************************************************/
|
|
||||||
struct InstructionDesriptor {
|
|
||||||
size_t length;
|
|
||||||
uint32_t value;
|
|
||||||
uint32_t mask;
|
|
||||||
compile_func op;
|
|
||||||
};
|
|
||||||
|
|
||||||
const std::array<InstructionDesriptor, ${instructions.size}> instr_descr = {{
|
|
||||||
/* entries are: size, valid value, valid mask, function ptr */<%instructions.each{instr -> %>
|
|
||||||
/* instruction ${instr.instruction.name} */
|
|
||||||
{${instr.length}, ${instr.value}, ${instr.mask}, &this_class::__${generator.functionName(instr.name)}},<%}%>
|
|
||||||
}};
|
|
||||||
|
|
||||||
/* instruction definitions */<%instructions.eachWithIndex{instr, idx -> %>
|
|
||||||
/* instruction ${idx}: ${instr.name} */
|
|
||||||
std::tuple<continuation_e, BasicBlock*> __${generator.functionName(instr.name)}(virt_addr_t& pc, code_word_t instr, BasicBlock* bb){<%instr.code.eachLine{%>
|
|
||||||
${it}<%}%>
|
|
||||||
}
|
|
||||||
<%}%>
|
|
||||||
/****************************************************************************
|
|
||||||
* end opcode definitions
|
|
||||||
****************************************************************************/
|
|
||||||
std::tuple<continuation_e, BasicBlock *> illegal_intruction(virt_addr_t &pc, code_word_t instr, BasicBlock *bb) {
|
|
||||||
this->gen_sync(iss::PRE_SYNC, instr_descr.size());
|
|
||||||
this->builder.CreateStore(this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::NEXT_PC), true),
|
|
||||||
get_reg_ptr(traits<ARCH>::PC), true);
|
|
||||||
this->builder.CreateStore(
|
|
||||||
this->builder.CreateAdd(this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::ICOUNT), true),
|
|
||||||
this->gen_const(64U, 1)),
|
|
||||||
get_reg_ptr(traits<ARCH>::ICOUNT), true);
|
|
||||||
pc = pc + ((instr & 3) == 3 ? 4 : 2);
|
|
||||||
this->gen_raise_trap(0, 2); // illegal instruction trap
|
|
||||||
this->gen_sync(iss::POST_SYNC, instr_descr.size());
|
|
||||||
this->gen_trap_check(this->leave_blk);
|
|
||||||
return std::make_tuple(BRANCH, nullptr);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename CODE_WORD> void debug_fn(CODE_WORD insn) {
|
|
||||||
volatile CODE_WORD x = insn;
|
|
||||||
insn = 2 * x;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH> vm_impl<ARCH>::vm_impl() { this(new ARCH()); }
|
|
||||||
|
|
||||||
template <typename ARCH>
|
|
||||||
vm_impl<ARCH>::vm_impl(ARCH &core, unsigned core_id, unsigned cluster_id)
|
|
||||||
: vm_base<ARCH>(core, core_id, cluster_id) {
|
|
||||||
qlut[0] = lut_00.data();
|
|
||||||
qlut[1] = lut_01.data();
|
|
||||||
qlut[2] = lut_10.data();
|
|
||||||
qlut[3] = lut_11.data();
|
|
||||||
for (auto instr : instr_descr) {
|
|
||||||
auto quantrant = instr.value & 0x3;
|
|
||||||
expand_bit_mask(29, lutmasks[quantrant], instr.value >> 2, instr.mask >> 2, 0, qlut[quantrant], instr.op);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH>
|
|
||||||
std::tuple<continuation_e, BasicBlock *>
|
|
||||||
vm_impl<ARCH>::gen_single_inst_behavior(virt_addr_t &pc, unsigned int &inst_cnt, BasicBlock *this_block) {
|
|
||||||
// we fetch at max 4 byte, alignment is 2
|
|
||||||
enum {TRAP_ID=1<<16};
|
|
||||||
code_word_t insn = 0;
|
|
||||||
const typename traits<ARCH>::addr_t upper_bits = ~traits<ARCH>::PGMASK;
|
|
||||||
phys_addr_t paddr(pc);
|
|
||||||
auto *const data = (uint8_t *)&insn;
|
|
||||||
paddr = this->core.v2p(pc);
|
|
||||||
if ((pc.val & upper_bits) != ((pc.val + 2) & upper_bits)) { // we may cross a page boundary
|
|
||||||
auto res = this->core.read(paddr, 2, data);
|
|
||||||
if (res != iss::Ok) throw trap_access(TRAP_ID, pc.val);
|
|
||||||
if ((insn & 0x3) == 0x3) { // this is a 32bit instruction
|
|
||||||
res = this->core.read(this->core.v2p(pc + 2), 2, data + 2);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
auto res = this->core.read(paddr, 4, data);
|
|
||||||
if (res != iss::Ok) throw trap_access(TRAP_ID, pc.val);
|
|
||||||
}
|
|
||||||
if (insn == 0x0000006f || (insn&0xffff)==0xa001) throw simulation_stopped(0); // 'J 0' or 'C.J 0'
|
|
||||||
// curr pc on stack
|
|
||||||
++inst_cnt;
|
|
||||||
auto lut_val = extract_fields(insn);
|
|
||||||
auto f = qlut[insn & 0x3][lut_val];
|
|
||||||
if (f == nullptr) {
|
|
||||||
f = &this_class::illegal_intruction;
|
|
||||||
}
|
|
||||||
return (this->*f)(pc, insn, this_block);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH> void vm_impl<ARCH>::gen_leave_behavior(BasicBlock *leave_blk) {
|
|
||||||
this->builder.SetInsertPoint(leave_blk);
|
|
||||||
this->builder.CreateRet(this->builder.CreateLoad(get_reg_ptr(arch::traits<ARCH>::NEXT_PC), false));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH> void vm_impl<ARCH>::gen_raise_trap(uint16_t trap_id, uint16_t cause) {
|
|
||||||
auto *TRAP_val = this->gen_const(32, 0x80 << 24 | (cause << 16) | trap_id);
|
|
||||||
this->builder.CreateStore(TRAP_val, get_reg_ptr(traits<ARCH>::TRAP_STATE), true);
|
|
||||||
this->builder.CreateStore(this->gen_const(32U, std::numeric_limits<uint32_t>::max()), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH> void vm_impl<ARCH>::gen_leave_trap(unsigned lvl) {
|
|
||||||
std::vector<Value *> args{ this->core_ptr, ConstantInt::get(getContext(), APInt(64, lvl)) };
|
|
||||||
this->builder.CreateCall(this->mod->getFunction("leave_trap"), args);
|
|
||||||
auto *PC_val = this->gen_read_mem(traits<ARCH>::CSR, (lvl << 8) + 0x41, traits<ARCH>::XLEN / 8);
|
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
|
||||||
this->builder.CreateStore(this->gen_const(32U, std::numeric_limits<uint32_t>::max()), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH> void vm_impl<ARCH>::gen_wait(unsigned type) {
|
|
||||||
std::vector<Value *> args{ this->core_ptr, ConstantInt::get(getContext(), APInt(64, type)) };
|
|
||||||
this->builder.CreateCall(this->mod->getFunction("wait"), args);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH> void vm_impl<ARCH>::gen_trap_behavior(BasicBlock *trap_blk) {
|
|
||||||
this->builder.SetInsertPoint(trap_blk);
|
|
||||||
auto *trap_state_val = this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::TRAP_STATE), true);
|
|
||||||
this->builder.CreateStore(this->gen_const(32U, std::numeric_limits<uint32_t>::max()),
|
|
||||||
get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
|
||||||
std::vector<Value *> args{this->core_ptr, this->adj_to64(trap_state_val),
|
|
||||||
this->adj_to64(this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::PC), false))};
|
|
||||||
this->builder.CreateCall(this->mod->getFunction("enter_trap"), args);
|
|
||||||
auto *trap_addr_val = this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
|
||||||
this->builder.CreateRet(trap_addr_val);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH> inline void vm_impl<ARCH>::gen_trap_check(BasicBlock *bb) {
|
|
||||||
auto *v = this->builder.CreateLoad(get_reg_ptr(arch::traits<ARCH>::TRAP_STATE), true);
|
|
||||||
this->gen_cond_branch(this->builder.CreateICmp(
|
|
||||||
ICmpInst::ICMP_EQ, v,
|
|
||||||
ConstantInt::get(getContext(), APInt(v->getType()->getIntegerBitWidth(), 0))),
|
|
||||||
bb, this->trap_blk, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace ${coreDef.name.toLowerCase()}
|
|
||||||
|
|
||||||
template <>
|
|
||||||
std::unique_ptr<vm_if> create<arch::${coreDef.name.toLowerCase()}>(arch::${coreDef.name.toLowerCase()} *core, unsigned short port, bool dump) {
|
|
||||||
auto ret = new ${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*core, dump);
|
|
||||||
if (port != 0) debugger::server<debugger::gdb_session>::run_server(ret, port);
|
|
||||||
return std::unique_ptr<vm_if>(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace iss
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,316 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2017, 2018 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 <array>
|
|
||||||
#include <iss/arch/traits.h>
|
|
||||||
#include <iss/arch_if.h>
|
|
||||||
#include <iss/vm_if.h>
|
|
||||||
|
|
||||||
namespace iss {
|
|
||||||
namespace arch {
|
|
||||||
|
|
||||||
struct rv32gc;
|
|
||||||
|
|
||||||
template <> struct traits<rv32gc> {
|
|
||||||
|
|
||||||
constexpr static char const* const core_type = "RV32GC";
|
|
||||||
|
|
||||||
static constexpr std::array<const char*, 66> reg_names{
|
|
||||||
{"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"}};
|
|
||||||
|
|
||||||
static constexpr std::array<const char*, 66> reg_aliases{
|
|
||||||
{"zero", "ra", "sp", "gp", "tp", "t0", "t1", "t2", "s0", "s1", "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11", "t3", "t4", "t5", "t6", "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"}};
|
|
||||||
|
|
||||||
enum constants {XLEN=32, FLEN=64, PCLEN=32, MISA_VAL=0b1000000000101000001000100101101, PGSIZE=0x1000, PGMASK=0xfff};
|
|
||||||
|
|
||||||
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,
|
|
||||||
LAST_BRANCH,
|
|
||||||
ICOUNT,
|
|
||||||
ZERO = X0,
|
|
||||||
RA = X1,
|
|
||||||
SP = X2,
|
|
||||||
GP = X3,
|
|
||||||
TP = X4,
|
|
||||||
T0 = X5,
|
|
||||||
T1 = X6,
|
|
||||||
T2 = X7,
|
|
||||||
S0 = X8,
|
|
||||||
S1 = X9,
|
|
||||||
A0 = X10,
|
|
||||||
A1 = X11,
|
|
||||||
A2 = X12,
|
|
||||||
A3 = X13,
|
|
||||||
A4 = X14,
|
|
||||||
A5 = X15,
|
|
||||||
A6 = X16,
|
|
||||||
A7 = X17,
|
|
||||||
S2 = X18,
|
|
||||||
S3 = X19,
|
|
||||||
S4 = X20,
|
|
||||||
S5 = X21,
|
|
||||||
S6 = X22,
|
|
||||||
S7 = X23,
|
|
||||||
S8 = X24,
|
|
||||||
S9 = X25,
|
|
||||||
S10 = X26,
|
|
||||||
S11 = X27,
|
|
||||||
T3 = X28,
|
|
||||||
T4 = X29,
|
|
||||||
T5 = X30,
|
|
||||||
T6 = X31
|
|
||||||
};
|
|
||||||
|
|
||||||
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>;
|
|
||||||
|
|
||||||
static constexpr std::array<const uint32_t, 72> reg_bit_widths{
|
|
||||||
{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,32,64}};
|
|
||||||
|
|
||||||
static constexpr std::array<const uint32_t, 73> reg_byte_offsets{
|
|
||||||
{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,412,416,424}};
|
|
||||||
|
|
||||||
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 {};
|
|
||||||
|
|
||||||
inline uint64_t get_icount() { return reg.icount; }
|
|
||||||
|
|
||||||
inline bool should_stop() { return interrupt_sim; }
|
|
||||||
|
|
||||||
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; }
|
|
||||||
|
|
||||||
inline uint32_t get_last_branch() { return reg.last_branch; }
|
|
||||||
|
|
||||||
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, last_branch = 0;
|
|
||||||
uint64_t icount = 0;
|
|
||||||
} reg;
|
|
||||||
|
|
||||||
std::array<address_type, 4> addr_mode;
|
|
||||||
|
|
||||||
bool interrupt_sim=false;
|
|
||||||
|
|
||||||
uint32_t get_fcsr(){return reg.FCSR;}
|
|
||||||
void set_fcsr(uint32_t val){reg.FCSR = val;}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* _RV32GC_H_ */
|
|
|
@ -1,250 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2017, 2018 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 _RV32IMAC_H_
|
|
||||||
#define _RV32IMAC_H_
|
|
||||||
|
|
||||||
#include <array>
|
|
||||||
#include <iss/arch/traits.h>
|
|
||||||
#include <iss/arch_if.h>
|
|
||||||
#include <iss/vm_if.h>
|
|
||||||
|
|
||||||
namespace iss {
|
|
||||||
namespace arch {
|
|
||||||
|
|
||||||
struct rv32imac;
|
|
||||||
|
|
||||||
template <> struct traits<rv32imac> {
|
|
||||||
|
|
||||||
constexpr static char const* const core_type = "RV32IMAC";
|
|
||||||
|
|
||||||
static constexpr std::array<const char*, 33> reg_names{
|
|
||||||
{"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"}};
|
|
||||||
|
|
||||||
static constexpr std::array<const char*, 33> reg_aliases{
|
|
||||||
{"zero", "ra", "sp", "gp", "tp", "t0", "t1", "t2", "s0", "s1", "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11", "t3", "t4", "t5", "t6", "pc"}};
|
|
||||||
|
|
||||||
enum constants {XLEN=32, PCLEN=32, MISA_VAL=0b1000000000101000001000100000101, PGSIZE=0x1000, PGMASK=0xfff};
|
|
||||||
|
|
||||||
constexpr static unsigned FP_REGS_SIZE = 0;
|
|
||||||
|
|
||||||
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,
|
|
||||||
NUM_REGS,
|
|
||||||
NEXT_PC=NUM_REGS,
|
|
||||||
TRAP_STATE,
|
|
||||||
PENDING_TRAP,
|
|
||||||
MACHINE_STATE,
|
|
||||||
LAST_BRANCH,
|
|
||||||
ICOUNT,
|
|
||||||
ZERO = X0,
|
|
||||||
RA = X1,
|
|
||||||
SP = X2,
|
|
||||||
GP = X3,
|
|
||||||
TP = X4,
|
|
||||||
T0 = X5,
|
|
||||||
T1 = X6,
|
|
||||||
T2 = X7,
|
|
||||||
S0 = X8,
|
|
||||||
S1 = X9,
|
|
||||||
A0 = X10,
|
|
||||||
A1 = X11,
|
|
||||||
A2 = X12,
|
|
||||||
A3 = X13,
|
|
||||||
A4 = X14,
|
|
||||||
A5 = X15,
|
|
||||||
A6 = X16,
|
|
||||||
A7 = X17,
|
|
||||||
S2 = X18,
|
|
||||||
S3 = X19,
|
|
||||||
S4 = X20,
|
|
||||||
S5 = X21,
|
|
||||||
S6 = X22,
|
|
||||||
S7 = X23,
|
|
||||||
S8 = X24,
|
|
||||||
S9 = X25,
|
|
||||||
S10 = X26,
|
|
||||||
S11 = X27,
|
|
||||||
T3 = X28,
|
|
||||||
T4 = X29,
|
|
||||||
T5 = X30,
|
|
||||||
T6 = X31
|
|
||||||
};
|
|
||||||
|
|
||||||
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>;
|
|
||||||
|
|
||||||
static constexpr std::array<const uint32_t, 39> reg_bit_widths{
|
|
||||||
{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,32,32,32,32,32,64}};
|
|
||||||
|
|
||||||
static constexpr std::array<const uint32_t, 40> reg_byte_offsets{
|
|
||||||
{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,132,136,140,144,148,152,160}};
|
|
||||||
|
|
||||||
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 rv32imac: public arch_if {
|
|
||||||
|
|
||||||
using virt_addr_t = typename traits<rv32imac>::virt_addr_t;
|
|
||||||
using phys_addr_t = typename traits<rv32imac>::phys_addr_t;
|
|
||||||
using reg_t = typename traits<rv32imac>::reg_t;
|
|
||||||
using addr_t = typename traits<rv32imac>::addr_t;
|
|
||||||
|
|
||||||
rv32imac();
|
|
||||||
~rv32imac();
|
|
||||||
|
|
||||||
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 {};
|
|
||||||
|
|
||||||
inline uint64_t get_icount() { return reg.icount; }
|
|
||||||
|
|
||||||
inline bool should_stop() { return interrupt_sim; }
|
|
||||||
|
|
||||||
inline phys_addr_t v2p(const iss::addr_t& addr){
|
|
||||||
if (addr.space != traits<rv32imac>::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<rv32imac>::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; }
|
|
||||||
|
|
||||||
inline uint32_t get_last_branch() { return reg.last_branch; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
struct RV32IMAC_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;
|
|
||||||
uint32_t NEXT_PC = 0;
|
|
||||||
uint32_t trap_state = 0, pending_trap = 0, machine_state = 0, last_branch = 0;
|
|
||||||
uint64_t icount = 0;
|
|
||||||
} reg;
|
|
||||||
|
|
||||||
std::array<address_type, 4> addr_mode;
|
|
||||||
|
|
||||||
bool interrupt_sim=false;
|
|
||||||
|
|
||||||
uint32_t get_fcsr(){return 0;}
|
|
||||||
void set_fcsr(uint32_t val){}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* _RV32IMAC_H_ */
|
|
|
@ -1,316 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2017, 2018 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 _RV64GC_H_
|
|
||||||
#define _RV64GC_H_
|
|
||||||
|
|
||||||
#include <array>
|
|
||||||
#include <iss/arch/traits.h>
|
|
||||||
#include <iss/arch_if.h>
|
|
||||||
#include <iss/vm_if.h>
|
|
||||||
|
|
||||||
namespace iss {
|
|
||||||
namespace arch {
|
|
||||||
|
|
||||||
struct rv64gc;
|
|
||||||
|
|
||||||
template <> struct traits<rv64gc> {
|
|
||||||
|
|
||||||
constexpr static char const* const core_type = "RV64GC";
|
|
||||||
|
|
||||||
static constexpr std::array<const char*, 66> reg_names{
|
|
||||||
{"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"}};
|
|
||||||
|
|
||||||
static constexpr std::array<const char*, 66> reg_aliases{
|
|
||||||
{"zero", "ra", "sp", "gp", "tp", "t0", "t1", "t2", "s0", "s1", "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11", "t3", "t4", "t5", "t6", "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"}};
|
|
||||||
|
|
||||||
enum constants {XLEN=64, FLEN=64, PCLEN=64, MISA_VAL=0b1000000000101000001000100101101, PGSIZE=0x1000, PGMASK=0xfff};
|
|
||||||
|
|
||||||
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,
|
|
||||||
LAST_BRANCH,
|
|
||||||
ICOUNT,
|
|
||||||
ZERO = X0,
|
|
||||||
RA = X1,
|
|
||||||
SP = X2,
|
|
||||||
GP = X3,
|
|
||||||
TP = X4,
|
|
||||||
T0 = X5,
|
|
||||||
T1 = X6,
|
|
||||||
T2 = X7,
|
|
||||||
S0 = X8,
|
|
||||||
S1 = X9,
|
|
||||||
A0 = X10,
|
|
||||||
A1 = X11,
|
|
||||||
A2 = X12,
|
|
||||||
A3 = X13,
|
|
||||||
A4 = X14,
|
|
||||||
A5 = X15,
|
|
||||||
A6 = X16,
|
|
||||||
A7 = X17,
|
|
||||||
S2 = X18,
|
|
||||||
S3 = X19,
|
|
||||||
S4 = X20,
|
|
||||||
S5 = X21,
|
|
||||||
S6 = X22,
|
|
||||||
S7 = X23,
|
|
||||||
S8 = X24,
|
|
||||||
S9 = X25,
|
|
||||||
S10 = X26,
|
|
||||||
S11 = X27,
|
|
||||||
T3 = X28,
|
|
||||||
T4 = X29,
|
|
||||||
T5 = X30,
|
|
||||||
T6 = X31
|
|
||||||
};
|
|
||||||
|
|
||||||
using reg_t = uint64_t;
|
|
||||||
|
|
||||||
using addr_t = uint64_t;
|
|
||||||
|
|
||||||
using code_word_t = uint64_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>;
|
|
||||||
|
|
||||||
static constexpr std::array<const uint32_t, 72> reg_bit_widths{
|
|
||||||
{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,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,64,32,64,32,32,32,32,64}};
|
|
||||||
|
|
||||||
static constexpr std::array<const uint32_t, 73> reg_byte_offsets{
|
|
||||||
{0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,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,400,408,416,424,432,440,448,456,464,472,480,488,496,504,512,520,528,536,540,544,548,552,560}};
|
|
||||||
|
|
||||||
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 rv64gc: public arch_if {
|
|
||||||
|
|
||||||
using virt_addr_t = typename traits<rv64gc>::virt_addr_t;
|
|
||||||
using phys_addr_t = typename traits<rv64gc>::phys_addr_t;
|
|
||||||
using reg_t = typename traits<rv64gc>::reg_t;
|
|
||||||
using addr_t = typename traits<rv64gc>::addr_t;
|
|
||||||
|
|
||||||
rv64gc();
|
|
||||||
~rv64gc();
|
|
||||||
|
|
||||||
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 {};
|
|
||||||
|
|
||||||
inline uint64_t get_icount() { return reg.icount; }
|
|
||||||
|
|
||||||
inline bool should_stop() { return interrupt_sim; }
|
|
||||||
|
|
||||||
inline phys_addr_t v2p(const iss::addr_t& addr){
|
|
||||||
if (addr.space != traits<rv64gc>::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<rv64gc>::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; }
|
|
||||||
|
|
||||||
inline uint32_t get_last_branch() { return reg.last_branch; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
struct RV64GC_regs {
|
|
||||||
uint64_t X0 = 0;
|
|
||||||
uint64_t X1 = 0;
|
|
||||||
uint64_t X2 = 0;
|
|
||||||
uint64_t X3 = 0;
|
|
||||||
uint64_t X4 = 0;
|
|
||||||
uint64_t X5 = 0;
|
|
||||||
uint64_t X6 = 0;
|
|
||||||
uint64_t X7 = 0;
|
|
||||||
uint64_t X8 = 0;
|
|
||||||
uint64_t X9 = 0;
|
|
||||||
uint64_t X10 = 0;
|
|
||||||
uint64_t X11 = 0;
|
|
||||||
uint64_t X12 = 0;
|
|
||||||
uint64_t X13 = 0;
|
|
||||||
uint64_t X14 = 0;
|
|
||||||
uint64_t X15 = 0;
|
|
||||||
uint64_t X16 = 0;
|
|
||||||
uint64_t X17 = 0;
|
|
||||||
uint64_t X18 = 0;
|
|
||||||
uint64_t X19 = 0;
|
|
||||||
uint64_t X20 = 0;
|
|
||||||
uint64_t X21 = 0;
|
|
||||||
uint64_t X22 = 0;
|
|
||||||
uint64_t X23 = 0;
|
|
||||||
uint64_t X24 = 0;
|
|
||||||
uint64_t X25 = 0;
|
|
||||||
uint64_t X26 = 0;
|
|
||||||
uint64_t X27 = 0;
|
|
||||||
uint64_t X28 = 0;
|
|
||||||
uint64_t X29 = 0;
|
|
||||||
uint64_t X30 = 0;
|
|
||||||
uint64_t X31 = 0;
|
|
||||||
uint64_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;
|
|
||||||
uint64_t NEXT_PC = 0;
|
|
||||||
uint32_t trap_state = 0, pending_trap = 0, machine_state = 0, last_branch = 0;
|
|
||||||
uint64_t icount = 0;
|
|
||||||
} reg;
|
|
||||||
|
|
||||||
std::array<address_type, 4> addr_mode;
|
|
||||||
|
|
||||||
bool interrupt_sim=false;
|
|
||||||
|
|
||||||
uint32_t get_fcsr(){return reg.FCSR;}
|
|
||||||
void set_fcsr(uint32_t val){reg.FCSR = val;}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* _RV64GC_H_ */
|
|
|
@ -1,250 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2017, 2018 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 _RV64I_H_
|
|
||||||
#define _RV64I_H_
|
|
||||||
|
|
||||||
#include <array>
|
|
||||||
#include <iss/arch/traits.h>
|
|
||||||
#include <iss/arch_if.h>
|
|
||||||
#include <iss/vm_if.h>
|
|
||||||
|
|
||||||
namespace iss {
|
|
||||||
namespace arch {
|
|
||||||
|
|
||||||
struct rv64i;
|
|
||||||
|
|
||||||
template <> struct traits<rv64i> {
|
|
||||||
|
|
||||||
constexpr static char const* const core_type = "RV64I";
|
|
||||||
|
|
||||||
static constexpr std::array<const char*, 33> reg_names{
|
|
||||||
{"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"}};
|
|
||||||
|
|
||||||
static constexpr std::array<const char*, 33> reg_aliases{
|
|
||||||
{"zero", "ra", "sp", "gp", "tp", "t0", "t1", "t2", "s0", "s1", "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11", "t3", "t4", "t5", "t6", "pc"}};
|
|
||||||
|
|
||||||
enum constants {XLEN=64, PCLEN=64, MISA_VAL=0b10000000000001000000000100000000, PGSIZE=0x1000, PGMASK=0xfff};
|
|
||||||
|
|
||||||
constexpr static unsigned FP_REGS_SIZE = 0;
|
|
||||||
|
|
||||||
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,
|
|
||||||
NUM_REGS,
|
|
||||||
NEXT_PC=NUM_REGS,
|
|
||||||
TRAP_STATE,
|
|
||||||
PENDING_TRAP,
|
|
||||||
MACHINE_STATE,
|
|
||||||
LAST_BRANCH,
|
|
||||||
ICOUNT,
|
|
||||||
ZERO = X0,
|
|
||||||
RA = X1,
|
|
||||||
SP = X2,
|
|
||||||
GP = X3,
|
|
||||||
TP = X4,
|
|
||||||
T0 = X5,
|
|
||||||
T1 = X6,
|
|
||||||
T2 = X7,
|
|
||||||
S0 = X8,
|
|
||||||
S1 = X9,
|
|
||||||
A0 = X10,
|
|
||||||
A1 = X11,
|
|
||||||
A2 = X12,
|
|
||||||
A3 = X13,
|
|
||||||
A4 = X14,
|
|
||||||
A5 = X15,
|
|
||||||
A6 = X16,
|
|
||||||
A7 = X17,
|
|
||||||
S2 = X18,
|
|
||||||
S3 = X19,
|
|
||||||
S4 = X20,
|
|
||||||
S5 = X21,
|
|
||||||
S6 = X22,
|
|
||||||
S7 = X23,
|
|
||||||
S8 = X24,
|
|
||||||
S9 = X25,
|
|
||||||
S10 = X26,
|
|
||||||
S11 = X27,
|
|
||||||
T3 = X28,
|
|
||||||
T4 = X29,
|
|
||||||
T5 = X30,
|
|
||||||
T6 = X31
|
|
||||||
};
|
|
||||||
|
|
||||||
using reg_t = uint64_t;
|
|
||||||
|
|
||||||
using addr_t = uint64_t;
|
|
||||||
|
|
||||||
using code_word_t = uint64_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>;
|
|
||||||
|
|
||||||
static constexpr std::array<const uint32_t, 39> reg_bit_widths{
|
|
||||||
{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,64,64,32,32,32,32,64}};
|
|
||||||
|
|
||||||
static constexpr std::array<const uint32_t, 40> reg_byte_offsets{
|
|
||||||
{0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,256,264,272,276,280,284,288,296}};
|
|
||||||
|
|
||||||
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 rv64i: public arch_if {
|
|
||||||
|
|
||||||
using virt_addr_t = typename traits<rv64i>::virt_addr_t;
|
|
||||||
using phys_addr_t = typename traits<rv64i>::phys_addr_t;
|
|
||||||
using reg_t = typename traits<rv64i>::reg_t;
|
|
||||||
using addr_t = typename traits<rv64i>::addr_t;
|
|
||||||
|
|
||||||
rv64i();
|
|
||||||
~rv64i();
|
|
||||||
|
|
||||||
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 {};
|
|
||||||
|
|
||||||
inline uint64_t get_icount() { return reg.icount; }
|
|
||||||
|
|
||||||
inline bool should_stop() { return interrupt_sim; }
|
|
||||||
|
|
||||||
inline phys_addr_t v2p(const iss::addr_t& addr){
|
|
||||||
if (addr.space != traits<rv64i>::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<rv64i>::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; }
|
|
||||||
|
|
||||||
inline uint32_t get_last_branch() { return reg.last_branch; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
struct RV64I_regs {
|
|
||||||
uint64_t X0 = 0;
|
|
||||||
uint64_t X1 = 0;
|
|
||||||
uint64_t X2 = 0;
|
|
||||||
uint64_t X3 = 0;
|
|
||||||
uint64_t X4 = 0;
|
|
||||||
uint64_t X5 = 0;
|
|
||||||
uint64_t X6 = 0;
|
|
||||||
uint64_t X7 = 0;
|
|
||||||
uint64_t X8 = 0;
|
|
||||||
uint64_t X9 = 0;
|
|
||||||
uint64_t X10 = 0;
|
|
||||||
uint64_t X11 = 0;
|
|
||||||
uint64_t X12 = 0;
|
|
||||||
uint64_t X13 = 0;
|
|
||||||
uint64_t X14 = 0;
|
|
||||||
uint64_t X15 = 0;
|
|
||||||
uint64_t X16 = 0;
|
|
||||||
uint64_t X17 = 0;
|
|
||||||
uint64_t X18 = 0;
|
|
||||||
uint64_t X19 = 0;
|
|
||||||
uint64_t X20 = 0;
|
|
||||||
uint64_t X21 = 0;
|
|
||||||
uint64_t X22 = 0;
|
|
||||||
uint64_t X23 = 0;
|
|
||||||
uint64_t X24 = 0;
|
|
||||||
uint64_t X25 = 0;
|
|
||||||
uint64_t X26 = 0;
|
|
||||||
uint64_t X27 = 0;
|
|
||||||
uint64_t X28 = 0;
|
|
||||||
uint64_t X29 = 0;
|
|
||||||
uint64_t X30 = 0;
|
|
||||||
uint64_t X31 = 0;
|
|
||||||
uint64_t PC = 0;
|
|
||||||
uint64_t NEXT_PC = 0;
|
|
||||||
uint32_t trap_state = 0, pending_trap = 0, machine_state = 0, last_branch = 0;
|
|
||||||
uint64_t icount = 0;
|
|
||||||
} reg;
|
|
||||||
|
|
||||||
std::array<address_type, 4> addr_mode;
|
|
||||||
|
|
||||||
bool interrupt_sim=false;
|
|
||||||
|
|
||||||
uint32_t get_fcsr(){return 0;}
|
|
||||||
void set_fcsr(uint32_t val){}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* _RV64I_H_ */
|
|
|
@ -1,448 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2017, 2018 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 _ISS_DEBUGGER_RISCV_TARGET_ADAPTER_H_
|
|
||||||
#define _ISS_DEBUGGER_RISCV_TARGET_ADAPTER_H_
|
|
||||||
|
|
||||||
#include "iss/arch_if.h"
|
|
||||||
#include <iss/arch/traits.h>
|
|
||||||
#include <iss/debugger/target_adapter_base.h>
|
|
||||||
#include <iss/iss.h>
|
|
||||||
|
|
||||||
#include <array>
|
|
||||||
#include <memory>
|
|
||||||
#define FMT_HEADER_ONLY
|
|
||||||
#include <fmt/format.h>
|
|
||||||
#include <util/logging.h>
|
|
||||||
|
|
||||||
namespace iss {
|
|
||||||
namespace debugger {
|
|
||||||
using namespace iss::arch;
|
|
||||||
using namespace iss::debugger;
|
|
||||||
|
|
||||||
template <typename ARCH> class riscv_target_adapter : public target_adapter_base {
|
|
||||||
public:
|
|
||||||
riscv_target_adapter(server_if *srv, iss::arch_if *core)
|
|
||||||
: target_adapter_base(srv)
|
|
||||||
, core(core) {}
|
|
||||||
|
|
||||||
/*============== Thread Control ===============================*/
|
|
||||||
|
|
||||||
/* Set generic thread */
|
|
||||||
status set_gen_thread(rp_thread_ref &thread) override;
|
|
||||||
|
|
||||||
/* Set control thread */
|
|
||||||
status set_ctrl_thread(rp_thread_ref &thread) override;
|
|
||||||
|
|
||||||
/* Get thread status */
|
|
||||||
status is_thread_alive(rp_thread_ref &thread, bool &alive) override;
|
|
||||||
|
|
||||||
/*============= Register Access ================================*/
|
|
||||||
|
|
||||||
/* Read all registers. buf is 4-byte aligned and it is in
|
|
||||||
target byte order. If register is not available
|
|
||||||
corresponding bytes in avail_buf are 0, otherwise
|
|
||||||
avail buf is 1 */
|
|
||||||
status read_registers(std::vector<uint8_t> &data, std::vector<uint8_t> &avail) override;
|
|
||||||
|
|
||||||
/* Write all registers. buf is 4-byte aligned and it is in target
|
|
||||||
byte order */
|
|
||||||
status write_registers(const std::vector<uint8_t> &data) override;
|
|
||||||
|
|
||||||
/* Read one register. buf is 4-byte aligned and it is in
|
|
||||||
target byte order. If register is not available
|
|
||||||
corresponding bytes in avail_buf are 0, otherwise
|
|
||||||
avail buf is 1 */
|
|
||||||
status read_single_register(unsigned int reg_no, std::vector<uint8_t> &buf,
|
|
||||||
std::vector<uint8_t> &avail_buf) override;
|
|
||||||
|
|
||||||
/* Write one register. buf is 4-byte aligned and it is in target byte
|
|
||||||
order */
|
|
||||||
status write_single_register(unsigned int reg_no, const std::vector<uint8_t> &buf) override;
|
|
||||||
|
|
||||||
/*=================== Memory Access =====================*/
|
|
||||||
|
|
||||||
/* Read memory, buf is 4-bytes aligned and it is in target
|
|
||||||
byte order */
|
|
||||||
status read_mem(uint64_t addr, std::vector<uint8_t> &buf) override;
|
|
||||||
|
|
||||||
/* Write memory, buf is 4-bytes aligned and it is in target
|
|
||||||
byte order */
|
|
||||||
status write_mem(uint64_t addr, const std::vector<uint8_t> &buf) override;
|
|
||||||
|
|
||||||
status process_query(unsigned int &mask, const rp_thread_ref &arg, rp_thread_info &info) override;
|
|
||||||
|
|
||||||
status thread_list_query(int first, const rp_thread_ref &arg, std::vector<rp_thread_ref> &result, size_t max_num,
|
|
||||||
size_t &num, bool &done) override;
|
|
||||||
|
|
||||||
status current_thread_query(rp_thread_ref &thread) override;
|
|
||||||
|
|
||||||
status offsets_query(uint64_t &text, uint64_t &data, uint64_t &bss) override;
|
|
||||||
|
|
||||||
status crc_query(uint64_t addr, size_t len, uint32_t &val) override;
|
|
||||||
|
|
||||||
status raw_query(std::string in_buf, std::string &out_buf) override;
|
|
||||||
|
|
||||||
status threadinfo_query(int first, std::string &out_buf) override;
|
|
||||||
|
|
||||||
status threadextrainfo_query(const rp_thread_ref &thread, std::string &out_buf) override;
|
|
||||||
|
|
||||||
status packetsize_query(std::string &out_buf) override;
|
|
||||||
|
|
||||||
status add_break(int type, uint64_t addr, unsigned int length) override;
|
|
||||||
|
|
||||||
status remove_break(int type, uint64_t addr, unsigned int length) override;
|
|
||||||
|
|
||||||
status resume_from_addr(bool step, int sig, uint64_t addr, rp_thread_ref thread,
|
|
||||||
std::function<void(unsigned)> stop_callback) override;
|
|
||||||
|
|
||||||
status target_xml_query(std::string &out_buf) override;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
static inline constexpr addr_t map_addr(const addr_t &i) { return i; }
|
|
||||||
|
|
||||||
iss::arch_if *core;
|
|
||||||
rp_thread_ref thread_idx;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename ARCH> status riscv_target_adapter<ARCH>::set_gen_thread(rp_thread_ref &thread) {
|
|
||||||
thread_idx = thread;
|
|
||||||
return Ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH> status riscv_target_adapter<ARCH>::set_ctrl_thread(rp_thread_ref &thread) {
|
|
||||||
thread_idx = thread;
|
|
||||||
return Ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH> status riscv_target_adapter<ARCH>::is_thread_alive(rp_thread_ref &thread, bool &alive) {
|
|
||||||
alive = 1;
|
|
||||||
return Ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* List threads. If first is non-zero then start from the first thread,
|
|
||||||
* otherwise start from arg, result points to array of threads to be
|
|
||||||
* filled out, result size is number of elements in the result,
|
|
||||||
* num points to the actual number of threads found, done is
|
|
||||||
* set if all threads are processed.
|
|
||||||
*/
|
|
||||||
template <typename ARCH>
|
|
||||||
status riscv_target_adapter<ARCH>::thread_list_query(int first, const rp_thread_ref &arg,
|
|
||||||
std::vector<rp_thread_ref> &result, size_t max_num, size_t &num,
|
|
||||||
bool &done) {
|
|
||||||
if (first == 0) {
|
|
||||||
result.clear();
|
|
||||||
result.push_back(thread_idx);
|
|
||||||
num = 1;
|
|
||||||
done = true;
|
|
||||||
return Ok;
|
|
||||||
} else
|
|
||||||
return NotSupported;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH> status riscv_target_adapter<ARCH>::current_thread_query(rp_thread_ref &thread) {
|
|
||||||
thread = thread_idx;
|
|
||||||
return Ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH>
|
|
||||||
status riscv_target_adapter<ARCH>::read_registers(std::vector<uint8_t> &data, std::vector<uint8_t> &avail) {
|
|
||||||
LOG(TRACE) << "reading target registers";
|
|
||||||
// return idx<0?:;
|
|
||||||
data.clear();
|
|
||||||
avail.clear();
|
|
||||||
const uint8_t *reg_base = core->get_regs_base_ptr();
|
|
||||||
for (size_t reg_no = 0; reg_no < arch::traits<ARCH>::NUM_REGS; ++reg_no) {
|
|
||||||
auto reg_width = arch::traits<ARCH>::reg_bit_widths[static_cast<typename arch::traits<ARCH>::reg_e>(reg_no)] / 8;
|
|
||||||
unsigned offset = traits<ARCH>::reg_byte_offsets[reg_no];
|
|
||||||
for (size_t j = 0; j < reg_width; ++j) {
|
|
||||||
data.push_back(*(reg_base + offset + j));
|
|
||||||
avail.push_back(0xff);
|
|
||||||
}
|
|
||||||
// if(arch::traits<ARCH>::XLEN < 64)
|
|
||||||
// for(unsigned j=0; j<4; ++j){
|
|
||||||
// data.push_back(0);
|
|
||||||
// avail.push_back(0xff);
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
// work around fill with F type registers
|
|
||||||
if (arch::traits<ARCH>::NUM_REGS < 65) {
|
|
||||||
auto reg_width = sizeof(typename arch::traits<ARCH>::reg_t);
|
|
||||||
for (size_t reg_no = 0; reg_no < 33; ++reg_no) {
|
|
||||||
for (size_t j = 0; j < reg_width; ++j) {
|
|
||||||
data.push_back(0x0);
|
|
||||||
avail.push_back(0x00);
|
|
||||||
}
|
|
||||||
// if(arch::traits<ARCH>::XLEN < 64)
|
|
||||||
// for(unsigned j=0; j<4; ++j){
|
|
||||||
// data.push_back(0x0);
|
|
||||||
// avail.push_back(0x00);
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH> status riscv_target_adapter<ARCH>::write_registers(const std::vector<uint8_t> &data) {
|
|
||||||
auto reg_count = arch::traits<ARCH>::NUM_REGS;
|
|
||||||
auto *reg_base = core->get_regs_base_ptr();
|
|
||||||
auto iter = data.data();
|
|
||||||
for (size_t reg_no = 0; reg_no < reg_count; ++reg_no) {
|
|
||||||
auto reg_width = arch::traits<ARCH>::reg_bit_widths[static_cast<typename arch::traits<ARCH>::reg_e>(reg_no)] / 8;
|
|
||||||
auto offset = traits<ARCH>::reg_byte_offsets[reg_no];
|
|
||||||
std::copy(iter, iter + reg_width, reg_base);
|
|
||||||
iter += 4;
|
|
||||||
reg_base += offset;
|
|
||||||
}
|
|
||||||
return Ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH>
|
|
||||||
status riscv_target_adapter<ARCH>::read_single_register(unsigned int reg_no, std::vector<uint8_t> &data,
|
|
||||||
std::vector<uint8_t> &avail) {
|
|
||||||
if (reg_no < 65) {
|
|
||||||
// auto reg_size = arch::traits<ARCH>::reg_bit_width(static_cast<typename
|
|
||||||
// arch::traits<ARCH>::reg_e>(reg_no))/8;
|
|
||||||
auto *reg_base = core->get_regs_base_ptr();
|
|
||||||
auto reg_width = arch::traits<ARCH>::reg_bit_widths[reg_no] / 8;
|
|
||||||
data.resize(reg_width);
|
|
||||||
avail.resize(reg_width);
|
|
||||||
auto offset = traits<ARCH>::reg_byte_offsets[reg_no];
|
|
||||||
std::copy(reg_base + offset, reg_base + offset + reg_width, data.begin());
|
|
||||||
std::fill(avail.begin(), avail.end(), 0xff);
|
|
||||||
} else {
|
|
||||||
typed_addr_t<iss::address_type::PHYSICAL> a(iss::access_type::DEBUG_READ, traits<ARCH>::CSR, reg_no - 65);
|
|
||||||
data.resize(sizeof(typename traits<ARCH>::reg_t));
|
|
||||||
avail.resize(sizeof(typename traits<ARCH>::reg_t));
|
|
||||||
std::fill(avail.begin(), avail.end(), 0xff);
|
|
||||||
core->read(a, data.size(), data.data());
|
|
||||||
}
|
|
||||||
return data.size() > 0 ? Ok : Err;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH>
|
|
||||||
status riscv_target_adapter<ARCH>::write_single_register(unsigned int reg_no, const std::vector<uint8_t> &data) {
|
|
||||||
if (reg_no < 65) {
|
|
||||||
auto *reg_base = core->get_regs_base_ptr();
|
|
||||||
auto reg_width = arch::traits<ARCH>::reg_bit_widths[static_cast<typename arch::traits<ARCH>::reg_e>(reg_no)] / 8;
|
|
||||||
auto offset = traits<ARCH>::reg_byte_offsets[reg_no];
|
|
||||||
std::copy(data.begin(), data.begin() + reg_width, reg_base + offset);
|
|
||||||
} else {
|
|
||||||
typed_addr_t<iss::address_type::PHYSICAL> a(iss::access_type::DEBUG_WRITE, traits<ARCH>::CSR, reg_no - 65);
|
|
||||||
core->write(a, data.size(), data.data());
|
|
||||||
}
|
|
||||||
return Ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH> status riscv_target_adapter<ARCH>::read_mem(uint64_t addr, std::vector<uint8_t> &data) {
|
|
||||||
auto a = map_addr({iss::access_type::DEBUG_READ, iss::address_type::VIRTUAL, 0, addr});
|
|
||||||
auto f = [&]() -> status { return core->read(a, data.size(), data.data()); };
|
|
||||||
return srv->execute_syncronized(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH> status riscv_target_adapter<ARCH>::write_mem(uint64_t addr, const std::vector<uint8_t> &data) {
|
|
||||||
auto a = map_addr({iss::access_type::DEBUG_READ, iss::address_type::VIRTUAL, 0, addr});
|
|
||||||
auto f = [&]() -> status { return core->write(a, data.size(), data.data()); };
|
|
||||||
return srv->execute_syncronized(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH>
|
|
||||||
status riscv_target_adapter<ARCH>::process_query(unsigned int &mask, const rp_thread_ref &arg, rp_thread_info &info) {
|
|
||||||
return NotSupported;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH>
|
|
||||||
status riscv_target_adapter<ARCH>::offsets_query(uint64_t &text, uint64_t &data, uint64_t &bss) {
|
|
||||||
text = 0;
|
|
||||||
data = 0;
|
|
||||||
bss = 0;
|
|
||||||
return Ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH> status riscv_target_adapter<ARCH>::crc_query(uint64_t addr, size_t len, uint32_t &val) {
|
|
||||||
return NotSupported;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH> status riscv_target_adapter<ARCH>::raw_query(std::string in_buf, std::string &out_buf) {
|
|
||||||
return NotSupported;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH> status riscv_target_adapter<ARCH>::threadinfo_query(int first, std::string &out_buf) {
|
|
||||||
if (first) {
|
|
||||||
out_buf = fmt::format("m{:x}", thread_idx.val);
|
|
||||||
} else {
|
|
||||||
out_buf = "l";
|
|
||||||
}
|
|
||||||
return Ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH>
|
|
||||||
status riscv_target_adapter<ARCH>::threadextrainfo_query(const rp_thread_ref &thread, std::string &out_buf) {
|
|
||||||
std::array<char, 20> buf;
|
|
||||||
memset(buf.data(), 0, 20);
|
|
||||||
sprintf(buf.data(), "%02x%02x%02x%02x%02x%02x%02x%02x%02x", 'R', 'u', 'n', 'n', 'a', 'b', 'l', 'e', 0);
|
|
||||||
out_buf = buf.data();
|
|
||||||
return Ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH> status riscv_target_adapter<ARCH>::packetsize_query(std::string &out_buf) {
|
|
||||||
out_buf = "PacketSize=1000";
|
|
||||||
return Ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH> status riscv_target_adapter<ARCH>::add_break(int type, uint64_t addr, unsigned int length) {
|
|
||||||
auto saddr = map_addr({iss::access_type::FETCH, iss::address_type::PHYSICAL, 0, addr});
|
|
||||||
auto eaddr = map_addr({iss::access_type::FETCH, iss::address_type::PHYSICAL, 0, addr + length});
|
|
||||||
target_adapter_base::bp_lut.addEntry(++target_adapter_base::bp_count, saddr.val, eaddr.val - saddr.val);
|
|
||||||
LOG(TRACE) << "Adding breakpoint with handle " << target_adapter_base::bp_count << " for addr 0x" << std::hex
|
|
||||||
<< saddr.val << std::dec;
|
|
||||||
LOG(TRACE) << "Now having " << target_adapter_base::bp_lut.size() << " breakpoints";
|
|
||||||
return Ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH> status riscv_target_adapter<ARCH>::remove_break(int type, uint64_t addr, unsigned int length) {
|
|
||||||
auto saddr = map_addr({iss::access_type::FETCH, iss::address_type::PHYSICAL, 0, addr});
|
|
||||||
unsigned handle = target_adapter_base::bp_lut.getEntry(saddr.val);
|
|
||||||
if (handle) {
|
|
||||||
LOG(TRACE) << "Removing breakpoint with handle " << handle << " for addr 0x" << std::hex << saddr.val
|
|
||||||
<< std::dec;
|
|
||||||
// TODO: check length of addr range
|
|
||||||
target_adapter_base::bp_lut.removeEntry(handle);
|
|
||||||
LOG(TRACE) << "Now having " << target_adapter_base::bp_lut.size() << " breakpoints";
|
|
||||||
return Ok;
|
|
||||||
}
|
|
||||||
LOG(TRACE) << "Now having " << target_adapter_base::bp_lut.size() << " breakpoints";
|
|
||||||
return Err;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH>
|
|
||||||
status riscv_target_adapter<ARCH>::resume_from_addr(bool step, int sig, uint64_t addr, rp_thread_ref thread,
|
|
||||||
std::function<void(unsigned)> stop_callback) {
|
|
||||||
auto *reg_base = core->get_regs_base_ptr();
|
|
||||||
auto reg_width = arch::traits<ARCH>::reg_bit_widths[arch::traits<ARCH>::PC] / 8;
|
|
||||||
auto offset = traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC];
|
|
||||||
const uint8_t *iter = reinterpret_cast<const uint8_t *>(&addr);
|
|
||||||
std::copy(iter, iter + reg_width, reg_base);
|
|
||||||
return resume_from_current(step, sig, thread, stop_callback);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename ARCH> status riscv_target_adapter<ARCH>::target_xml_query(std::string &out_buf) {
|
|
||||||
const std::string res{"<?xml version=\"1.0\"?><!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
|
|
||||||
"<target><architecture>riscv:rv32</architecture>"
|
|
||||||
//" <feature name=\"org.gnu.gdb.riscv.rv32i\">\n"
|
|
||||||
//" <reg name=\"x0\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x1\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x2\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x3\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x4\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x5\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x6\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x7\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x8\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x9\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x10\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x11\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x12\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x13\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x14\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x15\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x16\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x17\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x18\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x19\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x20\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x21\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x22\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x23\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x24\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x25\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x26\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x27\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x28\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x29\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x30\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" <reg name=\"x31\" bitsize=\"32\" group=\"general\"/>\n"
|
|
||||||
//" </feature>\n"
|
|
||||||
"</target>"};
|
|
||||||
out_buf = res;
|
|
||||||
return Ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
<?xml version="1.0"?>
|
|
||||||
<!DOCTYPE target SYSTEM "gdb-target.dtd">
|
|
||||||
<target>
|
|
||||||
<architecture>riscv:rv32</architecture>
|
|
||||||
|
|
||||||
<feature name="org.gnu.gdb.riscv.rv32i">
|
|
||||||
<reg name="x0" bitsize="32" group="general"/>
|
|
||||||
<reg name="x1" bitsize="32" group="general"/>
|
|
||||||
<reg name="x2" bitsize="32" group="general"/>
|
|
||||||
<reg name="x3" bitsize="32" group="general"/>
|
|
||||||
<reg name="x4" bitsize="32" group="general"/>
|
|
||||||
<reg name="x5" bitsize="32" group="general"/>
|
|
||||||
<reg name="x6" bitsize="32" group="general"/>
|
|
||||||
<reg name="x7" bitsize="32" group="general"/>
|
|
||||||
<reg name="x8" bitsize="32" group="general"/>
|
|
||||||
<reg name="x9" bitsize="32" group="general"/>
|
|
||||||
<reg name="x10" bitsize="32" group="general"/>
|
|
||||||
<reg name="x11" bitsize="32" group="general"/>
|
|
||||||
<reg name="x12" bitsize="32" group="general"/>
|
|
||||||
<reg name="x13" bitsize="32" group="general"/>
|
|
||||||
<reg name="x14" bitsize="32" group="general"/>
|
|
||||||
<reg name="x15" bitsize="32" group="general"/>
|
|
||||||
<reg name="x16" bitsize="32" group="general"/>
|
|
||||||
<reg name="x17" bitsize="32" group="general"/>
|
|
||||||
<reg name="x18" bitsize="32" group="general"/>
|
|
||||||
<reg name="x19" bitsize="32" group="general"/>
|
|
||||||
<reg name="x20" bitsize="32" group="general"/>
|
|
||||||
<reg name="x21" bitsize="32" group="general"/>
|
|
||||||
<reg name="x22" bitsize="32" group="general"/>
|
|
||||||
<reg name="x23" bitsize="32" group="general"/>
|
|
||||||
<reg name="x24" bitsize="32" group="general"/>
|
|
||||||
<reg name="x25" bitsize="32" group="general"/>
|
|
||||||
<reg name="x26" bitsize="32" group="general"/>
|
|
||||||
<reg name="x27" bitsize="32" group="general"/>
|
|
||||||
<reg name="x28" bitsize="32" group="general"/>
|
|
||||||
<reg name="x29" bitsize="32" group="general"/>
|
|
||||||
<reg name="x30" bitsize="32" group="general"/>
|
|
||||||
<reg name="x31" bitsize="32" group="general"/>
|
|
||||||
</feature>
|
|
||||||
|
|
||||||
</target>
|
|
||||||
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* _ISS_DEBUGGER_RISCV_TARGET_ADAPTER_H_ */
|
|
|
@ -1,96 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2017, 2018, 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
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
#ifndef _ISS_PLUGIN_CYCLE_ESTIMATE_H_
|
|
||||||
#define _ISS_PLUGIN_CYCLE_ESTIMATE_H_
|
|
||||||
|
|
||||||
#include "iss/instrumentation_if.h"
|
|
||||||
#include "iss/vm_plugin.h"
|
|
||||||
#include <json/json.h>
|
|
||||||
#include <string>
|
|
||||||
#include <unordered_map>
|
|
||||||
|
|
||||||
namespace iss {
|
|
||||||
|
|
||||||
namespace plugin {
|
|
||||||
|
|
||||||
class cycle_estimate: public iss::vm_plugin {
|
|
||||||
BEGIN_BF_DECL(instr_desc, uint32_t)
|
|
||||||
BF_FIELD(taken, 24, 8)
|
|
||||||
BF_FIELD(not_taken, 16, 8)
|
|
||||||
BF_FIELD(size, 0, 16)
|
|
||||||
instr_desc(uint32_t size, uint32_t taken, uint32_t not_taken): instr_desc() {
|
|
||||||
this->size=size;
|
|
||||||
this->taken=taken;
|
|
||||||
this->not_taken=not_taken;
|
|
||||||
}
|
|
||||||
END_BF_DECL();
|
|
||||||
|
|
||||||
public:
|
|
||||||
cycle_estimate() = delete;
|
|
||||||
|
|
||||||
cycle_estimate(const cycle_estimate &) = delete;
|
|
||||||
|
|
||||||
cycle_estimate(const cycle_estimate &&) = delete;
|
|
||||||
|
|
||||||
cycle_estimate(std::string config_file_name);
|
|
||||||
|
|
||||||
virtual ~cycle_estimate();
|
|
||||||
|
|
||||||
cycle_estimate &operator=(const cycle_estimate &) = delete;
|
|
||||||
|
|
||||||
cycle_estimate &operator=(const cycle_estimate &&) = delete;
|
|
||||||
|
|
||||||
bool registration(const char *const version, vm_if &arch) override;
|
|
||||||
|
|
||||||
sync_type get_sync() override { return POST_SYNC; };
|
|
||||||
|
|
||||||
void callback(instr_info_t instr_info) override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
iss::instrumentation_if *arch_instr;
|
|
||||||
std::vector<instr_desc> delays;
|
|
||||||
struct pair_hash {
|
|
||||||
size_t operator()(const std::pair<uint64_t, uint64_t> &p) const {
|
|
||||||
std::hash<uint64_t> hash;
|
|
||||||
return hash(p.first) + hash(p.second);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
std::unordered_map<std::pair<uint64_t, uint64_t>, uint64_t, pair_hash> blocks;
|
|
||||||
Json::Value root;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* _ISS_PLUGIN_CYCLE_ESTIMATE_H_ */
|
|
|
@ -1,82 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2017, 2018, 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
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
#ifndef _ISS_PLUGIN_INSTRUCTION_COUNTER_H_
|
|
||||||
#define _ISS_PLUGIN_INSTRUCTION_COUNTER_H_
|
|
||||||
|
|
||||||
#include <iss/vm_plugin.h>
|
|
||||||
#include <json/json.h>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace iss {
|
|
||||||
namespace plugin {
|
|
||||||
|
|
||||||
class instruction_count : public iss::vm_plugin {
|
|
||||||
struct instr_delay {
|
|
||||||
std::string instr_name;
|
|
||||||
size_t size;
|
|
||||||
size_t not_taken_delay;
|
|
||||||
size_t taken_delay;
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
|
||||||
instruction_count() = delete;
|
|
||||||
|
|
||||||
instruction_count(const instruction_count &) = delete;
|
|
||||||
|
|
||||||
instruction_count(const instruction_count &&) = delete;
|
|
||||||
|
|
||||||
instruction_count(std::string config_file_name);
|
|
||||||
|
|
||||||
virtual ~instruction_count();
|
|
||||||
|
|
||||||
instruction_count &operator=(const instruction_count &) = delete;
|
|
||||||
|
|
||||||
instruction_count &operator=(const instruction_count &&) = delete;
|
|
||||||
|
|
||||||
bool registration(const char *const version, vm_if &arch) override;
|
|
||||||
|
|
||||||
sync_type get_sync() override { return POST_SYNC; };
|
|
||||||
|
|
||||||
void callback(instr_info_t instr_info) override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
Json::Value root;
|
|
||||||
std::vector<instr_delay> delays;
|
|
||||||
std::vector<uint64_t> rep_counts;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* _ISS_PLUGIN_INSTRUCTION_COUNTER_H_ */
|
|
|
@ -1,161 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2017, 2018 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 _SYSC_SIFIVE_FE310_H_
|
|
||||||
#define _SYSC_SIFIVE_FE310_H_
|
|
||||||
|
|
||||||
#include "scc/initiator_mixin.h"
|
|
||||||
#include "scc/traceable.h"
|
|
||||||
#include "scc/utilities.h"
|
|
||||||
#include "scv4tlm/tlm_rec_initiator_socket.h"
|
|
||||||
#include <cci_configuration>
|
|
||||||
#include <tlm>
|
|
||||||
#include <tlm_utils/tlm_quantumkeeper.h>
|
|
||||||
#include <util/range_lut.h>
|
|
||||||
|
|
||||||
class scv_tr_db;
|
|
||||||
class scv_tr_stream;
|
|
||||||
struct _scv_tr_generator_default_data;
|
|
||||||
template <class T_begin, class T_end> class scv_tr_generator;
|
|
||||||
|
|
||||||
namespace iss {
|
|
||||||
class vm_if;
|
|
||||||
namespace arch {
|
|
||||||
template <typename BASE> class riscv_hart_msu_vp;
|
|
||||||
}
|
|
||||||
namespace debugger {
|
|
||||||
class target_adapter_if;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace sysc {
|
|
||||||
|
|
||||||
class tlm_dmi_ext : public tlm::tlm_dmi {
|
|
||||||
public:
|
|
||||||
bool operator==(const tlm_dmi_ext &o) const {
|
|
||||||
return this->get_granted_access() == o.get_granted_access() &&
|
|
||||||
this->get_start_address() == o.get_start_address() && this->get_end_address() == o.get_end_address();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!=(const tlm_dmi_ext &o) const { return !operator==(o); }
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace SiFive {
|
|
||||||
class core_wrapper;
|
|
||||||
|
|
||||||
class core_complex : public sc_core::sc_module, public scc::traceable {
|
|
||||||
public:
|
|
||||||
SC_HAS_PROCESS(core_complex);// NOLINT
|
|
||||||
|
|
||||||
scc::initiator_mixin<scv4tlm::tlm_rec_initiator_socket<32>> initiator;
|
|
||||||
|
|
||||||
sc_core::sc_in<sc_core::sc_time> clk_i;
|
|
||||||
|
|
||||||
sc_core::sc_in<bool> rst_i;
|
|
||||||
|
|
||||||
sc_core::sc_in<bool> global_irq_i;
|
|
||||||
|
|
||||||
sc_core::sc_in<bool> timer_irq_i;
|
|
||||||
|
|
||||||
sc_core::sc_in<bool> sw_irq_i;
|
|
||||||
|
|
||||||
sc_core::sc_vector<sc_core::sc_in<bool>> local_irq_i;
|
|
||||||
|
|
||||||
cci::cci_param<std::string> elf_file;
|
|
||||||
|
|
||||||
cci::cci_param<bool> enable_disass;
|
|
||||||
|
|
||||||
cci::cci_param<uint64_t> reset_address;
|
|
||||||
|
|
||||||
cci::cci_param<unsigned short> gdb_server_port;
|
|
||||||
|
|
||||||
cci::cci_param<bool> dump_ir;
|
|
||||||
|
|
||||||
core_complex(sc_core::sc_module_name name);
|
|
||||||
|
|
||||||
~core_complex();
|
|
||||||
|
|
||||||
inline void sync(uint64_t cycle) {
|
|
||||||
auto time = curr_clk * (cycle - last_sync_cycle);
|
|
||||||
quantum_keeper.inc(time);
|
|
||||||
if (quantum_keeper.need_sync()) {
|
|
||||||
wait(quantum_keeper.get_local_time());
|
|
||||||
quantum_keeper.reset();
|
|
||||||
}
|
|
||||||
last_sync_cycle = cycle;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool read_mem(uint64_t addr, unsigned length, uint8_t *const data, bool is_fetch);
|
|
||||||
|
|
||||||
bool write_mem(uint64_t addr, unsigned length, const uint8_t *const data);
|
|
||||||
|
|
||||||
bool read_mem_dbg(uint64_t addr, unsigned length, uint8_t *const data);
|
|
||||||
|
|
||||||
bool write_mem_dbg(uint64_t addr, unsigned length, const uint8_t *const data);
|
|
||||||
|
|
||||||
void trace(sc_core::sc_trace_file *trf) const override;
|
|
||||||
|
|
||||||
void disass_output(uint64_t pc, const std::string instr);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void before_end_of_elaboration();
|
|
||||||
void start_of_simulation();
|
|
||||||
void run();
|
|
||||||
void clk_cb();
|
|
||||||
void rst_cb();
|
|
||||||
void sw_irq_cb();
|
|
||||||
void timer_irq_cb();
|
|
||||||
void global_irq_cb();
|
|
||||||
uint64_t last_sync_cycle = 0;
|
|
||||||
util::range_lut<tlm_dmi_ext> read_lut, write_lut;
|
|
||||||
tlm_utils::tlm_quantumkeeper quantum_keeper;
|
|
||||||
std::vector<uint8_t> write_buf;
|
|
||||||
std::unique_ptr<core_wrapper> cpu;
|
|
||||||
std::unique_ptr<iss::vm_if> vm;
|
|
||||||
sc_core::sc_time curr_clk;
|
|
||||||
iss::debugger::target_adapter_if *tgt_adapter;
|
|
||||||
#ifdef WITH_SCV
|
|
||||||
//! transaction recording database
|
|
||||||
scv_tr_db *m_db;
|
|
||||||
//! blocking transaction recording stream handle
|
|
||||||
scv_tr_stream *stream_handle;
|
|
||||||
//! transaction generator handle for blocking transactions
|
|
||||||
scv_tr_generator<_scv_tr_generator_default_data, _scv_tr_generator_default_data> *instr_tr_handle;
|
|
||||||
scv_tr_generator<uint64_t, _scv_tr_generator_default_data> *fetch_tr_handle;
|
|
||||||
scv_tr_handle tr_handle;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
} /* namespace SiFive */
|
|
||||||
} /* namespace sysc */
|
|
||||||
|
|
||||||
#endif /* _SYSC_SIFIVE_FE310_H_ */
|
|
|
@ -1,87 +0,0 @@
|
||||||
# library files
|
|
||||||
FILE(GLOB RiscVSCHeaders ${PROJECT_SOURCE_DIR}/incl/sysc/*.h ${PROJECT_SOURCE_DIR}/incl/sysc/*/*.h)
|
|
||||||
set(LIB_HEADERS ${RiscVSCHeaders} )
|
|
||||||
set(LIB_SOURCES
|
|
||||||
iss/rv32gc.cpp
|
|
||||||
iss/rv32imac.cpp
|
|
||||||
iss/rv64i.cpp
|
|
||||||
iss/rv64gc.cpp
|
|
||||||
internal/fp_functions.cpp
|
|
||||||
internal/vm_rv32gc.cpp
|
|
||||||
internal/vm_rv32imac.cpp
|
|
||||||
internal/vm_rv64i.cpp
|
|
||||||
internal/vm_rv64gc.cpp
|
|
||||||
plugin/instruction_count.cpp
|
|
||||||
plugin/cycle_estimate.cpp)
|
|
||||||
|
|
||||||
# Define two variables in order not to repeat ourselves.
|
|
||||||
set(LIBRARY_NAME riscv)
|
|
||||||
|
|
||||||
# Define the library
|
|
||||||
add_library(${LIBRARY_NAME} ${LIB_SOURCES})
|
|
||||||
SET(${LIBRARY_NAME} -Wl,-whole-archive -l${LIBRARY_NAME} -Wl,-no-whole-archive)
|
|
||||||
set_target_properties(${LIBRARY_NAME} PROPERTIES
|
|
||||||
VERSION ${VERSION} # ${VERSION} was defined in the main CMakeLists.
|
|
||||||
FRAMEWORK FALSE
|
|
||||||
PUBLIC_HEADER "${LIB_HEADERS}" # specify the public headers
|
|
||||||
)
|
|
||||||
#set_property(TARGET ${LIBRARY_NAME} PROPERTY POSITION_INDEPENDENT_CODE ON)
|
|
||||||
|
|
||||||
if(SystemC_FOUND)
|
|
||||||
set(SC_LIBRARY_NAME riscv_sc)
|
|
||||||
add_library(${SC_LIBRARY_NAME} SHARED sysc/core_complex.cpp)
|
|
||||||
add_definitions(-DWITH_SYSTEMC)
|
|
||||||
include_directories(${SystemC_INCLUDE_DIRS})
|
|
||||||
|
|
||||||
include_directories(${CCI_INCLUDE_DIRS})
|
|
||||||
|
|
||||||
if(SCV_FOUND)
|
|
||||||
add_definitions(-DWITH_SCV)
|
|
||||||
include_directories(${SCV_INCLUDE_DIRS})
|
|
||||||
endif()
|
|
||||||
set_target_properties(${SC_LIBRARY_NAME} PROPERTIES
|
|
||||||
VERSION ${VERSION} # ${VERSION} was defined in the main CMakeLists.
|
|
||||||
FRAMEWORK FALSE
|
|
||||||
PUBLIC_HEADER "${LIB_HEADERS}" # specify the public headers
|
|
||||||
)
|
|
||||||
target_link_libraries(${SC_LIBRARY_NAME} ${LIBRARY_NAME})
|
|
||||||
target_link_libraries(${SC_LIBRARY_NAME} dbt-core)
|
|
||||||
target_link_libraries(${SC_LIBRARY_NAME} softfloat)
|
|
||||||
target_link_libraries(${SC_LIBRARY_NAME} sc-components)
|
|
||||||
target_link_libraries(${SC_LIBRARY_NAME} external)
|
|
||||||
target_link_libraries(${SC_LIBRARY_NAME} ${llvm_libs})
|
|
||||||
target_link_libraries(${SC_LIBRARY_NAME} ${Boost_LIBRARIES} )
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# This is a make target, so you can do a "make riscv-sc"
|
|
||||||
set(APPLICATION_NAME riscv-sim)
|
|
||||||
|
|
||||||
add_executable(${APPLICATION_NAME} main.cpp)
|
|
||||||
|
|
||||||
# Links the target exe against the libraries
|
|
||||||
target_link_libraries(${APPLICATION_NAME} ${LIBRARY_NAME})
|
|
||||||
target_link_libraries(${APPLICATION_NAME} jsoncpp)
|
|
||||||
target_link_libraries(${APPLICATION_NAME} dbt-core)
|
|
||||||
target_link_libraries(${APPLICATION_NAME} softfloat)
|
|
||||||
target_link_libraries(${APPLICATION_NAME} external)
|
|
||||||
target_link_libraries(${APPLICATION_NAME} ${llvm_libs})
|
|
||||||
target_link_libraries(${APPLICATION_NAME} ${Boost_LIBRARIES} )
|
|
||||||
if (Tcmalloc_FOUND)
|
|
||||||
target_link_libraries(${APPLICATION_NAME} ${Tcmalloc_LIBRARIES})
|
|
||||||
endif(Tcmalloc_FOUND)
|
|
||||||
|
|
||||||
# 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} ${APPLICATION_NAME}
|
|
||||||
EXPORT ${PROJECT_NAME}Targets # for downstream dependencies
|
|
||||||
ARCHIVE DESTINATION lib COMPONENT libs # static lib
|
|
||||||
RUNTIME DESTINATION bin COMPONENT libs # binaries
|
|
||||||
LIBRARY DESTINATION lib COMPONENT libs # shared lib
|
|
||||||
FRAMEWORK DESTINATION bin COMPONENT libs # for mac
|
|
||||||
PUBLIC_HEADER DESTINATION incl/${PROJECT_NAME} COMPONENT devel # headers for mac (note the different component -> different package)
|
|
||||||
INCLUDES DESTINATION incl # headers
|
|
||||||
)
|
|
||||||
|
|
|
@ -1,514 +0,0 @@
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// 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/llvm/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, uint32_t xlen) {
|
|
||||||
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));
|
|
||||||
FDECL(fcvt_32_64, INT_TYPE(64), INT_TYPE(32), INT_TYPE(32), INT_TYPE(8));
|
|
||||||
FDECL(fcvt_64_32, INT_TYPE(32), INT_TYPE(64), INT_TYPE(32), INT_TYPE(8));
|
|
||||||
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));
|
|
||||||
FDECL(unbox_s, INT_TYPE(32), 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;
|
|
||||||
switch(op){
|
|
||||||
case 0:{ //w->s, fp to int32
|
|
||||||
uint_fast32_t res = f32_to_i32(v1f,rmm_map[mode&0x7],true);
|
|
||||||
return (uint32_t)res;
|
|
||||||
}
|
|
||||||
case 1:{ //wu->s
|
|
||||||
uint_fast32_t res = f32_to_ui32(v1f,rmm_map[mode&0x7],true);
|
|
||||||
return (uint32_t)res;
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
switch(op){
|
|
||||||
case 0:{ //l->d, fp to int32
|
|
||||||
int64_t res = f64_to_i64(v1f,rmm_map[mode&0x7],true);
|
|
||||||
return (uint64_t)res;
|
|
||||||
}
|
|
||||||
case 1:{ //lu->s
|
|
||||||
uint64_t res = f64_to_ui64(v1f,rmm_map[mode&0x7],true);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
case 2: //s->l
|
|
||||||
r=i64_to_f64(v1);
|
|
||||||
return r.v;
|
|
||||||
case 3: //s->lu
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t fcvt_32_64(uint32_t v1, uint32_t op, uint8_t mode) {
|
|
||||||
float32_t v1f{v1};
|
|
||||||
softfloat_exceptionFlags=0;
|
|
||||||
float64_t r;
|
|
||||||
switch(op){
|
|
||||||
case 0: //l->s, fp to int32
|
|
||||||
return f32_to_i64(v1f,rmm_map[mode&0x7],true);
|
|
||||||
case 1: //wu->s
|
|
||||||
return f32_to_ui64(v1f,rmm_map[mode&0x7],true);
|
|
||||||
case 2: //s->w
|
|
||||||
r=i32_to_f64(v1);
|
|
||||||
return r.v;
|
|
||||||
case 3: //s->wu
|
|
||||||
r=ui32_to_f64(v1);
|
|
||||||
return r.v;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t fcvt_64_32(uint64_t v1, uint32_t op, uint8_t mode) {
|
|
||||||
softfloat_exceptionFlags=0;
|
|
||||||
float32_t r;
|
|
||||||
switch(op){
|
|
||||||
case 0:{ //wu->s
|
|
||||||
int32_t r=f64_to_i32(float64_t{v1}, rmm_map[mode&0x7],true);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
case 1:{ //wu->s
|
|
||||||
uint32_t r=f64_to_ui32(float64_t{v1}, rmm_map[mode&0x7],true);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
case 2: //l->s, fp to int32
|
|
||||||
r=i64_to_f32(v1);
|
|
||||||
return r.v;
|
|
||||||
case 3: //wu->s
|
|
||||||
r=ui64_to_f32(v1);
|
|
||||||
return r.v;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t unbox_s(uint64_t v){
|
|
||||||
constexpr uint64_t mask = std::numeric_limits<uint64_t>::max() & ~((uint64_t)std::numeric_limits<uint32_t>::max());
|
|
||||||
if((v & mask) != mask)
|
|
||||||
return 0x7fc00000;
|
|
||||||
else
|
|
||||||
return v & std::numeric_limits<uint32_t>::max();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
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
File diff suppressed because it is too large
Load Diff
|
@ -1,80 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2017, 2018 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;
|
|
||||||
|
|
||||||
constexpr std::array<const char*, 66> iss::arch::traits<iss::arch::rv32gc>::reg_names;
|
|
||||||
constexpr std::array<const char*, 66> iss::arch::traits<iss::arch::rv32gc>::reg_aliases;
|
|
||||||
constexpr std::array<const uint32_t, 72> iss::arch::traits<iss::arch::rv32gc>::reg_bit_widths;
|
|
||||||
constexpr std::array<const uint32_t, 73> iss::arch::traits<iss::arch::rv32gc>::reg_byte_offsets;
|
|
||||||
|
|
||||||
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;
|
|
||||||
reg.icount=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,77 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2017, 2018 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/rv32imac.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
#include <ihex.h>
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#include <cstdio>
|
|
||||||
#include <cstring>
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
using namespace iss::arch;
|
|
||||||
|
|
||||||
constexpr std::array<const char*, 33> iss::arch::traits<iss::arch::rv32imac>::reg_names;
|
|
||||||
constexpr std::array<const char*, 33> iss::arch::traits<iss::arch::rv32imac>::reg_aliases;
|
|
||||||
constexpr std::array<const uint32_t, 39> iss::arch::traits<iss::arch::rv32imac>::reg_bit_widths;
|
|
||||||
constexpr std::array<const uint32_t, 40> iss::arch::traits<iss::arch::rv32imac>::reg_byte_offsets;
|
|
||||||
|
|
||||||
rv32imac::rv32imac() {
|
|
||||||
reg.icount = 0;
|
|
||||||
reg.machine_state = 0x3;
|
|
||||||
}
|
|
||||||
|
|
||||||
rv32imac::~rv32imac() = default;
|
|
||||||
|
|
||||||
void rv32imac::reset(uint64_t address) {
|
|
||||||
for (size_t i = 0; i < traits<rv32imac>::NUM_REGS; ++i)
|
|
||||||
set_reg(i, std::vector<uint8_t>(sizeof(traits<rv32imac>::reg_t), 0));
|
|
||||||
reg.PC = address;
|
|
||||||
reg.NEXT_PC = reg.PC;
|
|
||||||
reg.trap_state = 0;
|
|
||||||
reg.machine_state = 0x3;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t *rv32imac::get_regs_base_ptr() { return reinterpret_cast<uint8_t *>(®); }
|
|
||||||
|
|
||||||
rv32imac::phys_addr_t rv32imac::virt2phys(const iss::addr_t &pc) {
|
|
||||||
return phys_addr_t(pc); // change logical address to physical address
|
|
||||||
}
|
|
|
@ -1,81 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2017, 2018 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/rv64gc.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
#include <ihex.h>
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#include <cstdio>
|
|
||||||
#include <cstring>
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
using namespace iss::arch;
|
|
||||||
|
|
||||||
constexpr std::array<const char*, 66> iss::arch::traits<iss::arch::rv64gc>::reg_names;
|
|
||||||
constexpr std::array<const char*, 66> iss::arch::traits<iss::arch::rv64gc>::reg_aliases;
|
|
||||||
constexpr std::array<const uint32_t, 72> iss::arch::traits<iss::arch::rv64gc>::reg_bit_widths;
|
|
||||||
constexpr std::array<const uint32_t, 73> iss::arch::traits<iss::arch::rv64gc>::reg_byte_offsets;
|
|
||||||
|
|
||||||
rv64gc::rv64gc() {
|
|
||||||
reg.icount = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
rv64gc::~rv64gc() = default;
|
|
||||||
|
|
||||||
void rv64gc::reset(uint64_t address) {
|
|
||||||
for(size_t i=0; i<traits<rv64gc>::NUM_REGS; ++i) set_reg(i, std::vector<uint8_t>(sizeof(traits<rv64gc>::reg_t),0));
|
|
||||||
reg.PC=address;
|
|
||||||
reg.NEXT_PC=reg.PC;
|
|
||||||
reg.trap_state=0;
|
|
||||||
reg.machine_state=0x0;
|
|
||||||
reg.icount=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t *rv64gc::get_regs_base_ptr() {
|
|
||||||
return reinterpret_cast<uint8_t*>(®);
|
|
||||||
}
|
|
||||||
|
|
||||||
rv64gc::phys_addr_t rv64gc::virt2phys(const iss::addr_t &pc) {
|
|
||||||
return phys_addr_t(pc); // change logical address to physical address
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,79 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2017, 2018 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/rv64i.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
#include <ihex.h>
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#include <cstdio>
|
|
||||||
#include <cstring>
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
using namespace iss::arch;
|
|
||||||
|
|
||||||
constexpr std::array<const char*, 33> iss::arch::traits<iss::arch::rv64i>::reg_names;
|
|
||||||
constexpr std::array<const char*, 33> iss::arch::traits<iss::arch::rv64i>::reg_aliases;
|
|
||||||
constexpr std::array<const uint32_t, 39> iss::arch::traits<iss::arch::rv64i>::reg_bit_widths;
|
|
||||||
constexpr std::array<const uint32_t, 40> iss::arch::traits<iss::arch::rv64i>::reg_byte_offsets;
|
|
||||||
|
|
||||||
rv64i::rv64i() {
|
|
||||||
reg.icount = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
rv64i::~rv64i() = default;
|
|
||||||
|
|
||||||
void rv64i::reset(uint64_t address) {
|
|
||||||
for(size_t i=0; i<traits<rv64i>::NUM_REGS; ++i) set_reg(i, std::vector<uint8_t>(sizeof(traits<rv64i>::reg_t),0));
|
|
||||||
reg.PC=address;
|
|
||||||
reg.NEXT_PC=reg.PC;
|
|
||||||
reg.trap_state=0;
|
|
||||||
reg.machine_state=0x0;
|
|
||||||
reg.icount=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t *rv64i::get_regs_base_ptr() {
|
|
||||||
return reinterpret_cast<uint8_t*>(®);
|
|
||||||
}
|
|
||||||
|
|
||||||
rv64i::phys_addr_t rv64i::virt2phys(const iss::addr_t &pc) {
|
|
||||||
return phys_addr_t(pc); // change logical address to physical address
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,192 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2017, 2018 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 <iostream>
|
|
||||||
#include <iss/iss.h>
|
|
||||||
|
|
||||||
#include <boost/lexical_cast.hpp>
|
|
||||||
#include <boost/program_options.hpp>
|
|
||||||
#include <iss/arch/riscv_hart_msu_vp.h>
|
|
||||||
#include <iss/arch/rv32imac.h>
|
|
||||||
#include <iss/arch/rv32gc.h>
|
|
||||||
#include <iss/arch/rv64gc.h>
|
|
||||||
#include <iss/arch/rv64i.h>
|
|
||||||
#include <iss/llvm/jit_helper.h>
|
|
||||||
#include <iss/log_categories.h>
|
|
||||||
#include <iss/plugin/cycle_estimate.h>
|
|
||||||
#include <iss/plugin/instruction_count.h>
|
|
||||||
|
|
||||||
namespace po = boost::program_options;
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
/*
|
|
||||||
* Define and parse the program options
|
|
||||||
*/
|
|
||||||
po::variables_map clim;
|
|
||||||
po::options_description desc("Options");
|
|
||||||
// clang-format off
|
|
||||||
desc.add_options()
|
|
||||||
("help,h", "Print help message")
|
|
||||||
("verbose,v", po::value<int>()->implicit_value(0), "Sets logging verbosity")
|
|
||||||
("logfile,f", po::value<std::string>(), "Sets default log file.")
|
|
||||||
("disass,d", po::value<std::string>()->implicit_value(""), "Enables disassembly")
|
|
||||||
("gdb-port,g", po::value<unsigned>()->default_value(0), "enable gdb server and specify port to use")
|
|
||||||
("instructions,i", po::value<uint64_t>()->default_value(std::numeric_limits<uint64_t>::max()), "max. number of instructions to simulate")
|
|
||||||
("reset,r", po::value<std::string>(), "reset address")
|
|
||||||
("dump-ir", "dump the intermediate representation")
|
|
||||||
("elf", po::value<std::vector<std::string>>(), "ELF file(s) to load")
|
|
||||||
("mem,m", po::value<std::string>(), "the memory input file")
|
|
||||||
("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
|
|
||||||
auto parsed = po::command_line_parser(argc, argv).options(desc).allow_unregistered().run();
|
|
||||||
try {
|
|
||||||
po::store(parsed, clim); // can throw
|
|
||||||
// --help option
|
|
||||||
if (clim.count("help")) {
|
|
||||||
std::cout << "DBT-RISE-RiscV simulator for RISC-V" << std::endl << desc << std::endl;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
po::notify(clim); // throws on error, so do after help in case
|
|
||||||
} catch (po::error &e) {
|
|
||||||
// there are problems
|
|
||||||
std::cerr << "ERROR: " << e.what() << std::endl << std::endl;
|
|
||||||
std::cerr << desc << std::endl;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
std::vector<std::string> args = collect_unrecognized(parsed.options, po::include_positional);
|
|
||||||
|
|
||||||
if (clim.count("verbose")) {
|
|
||||||
auto l = logging::as_log_level(clim["verbose"].as<int>());
|
|
||||||
LOGGER(DEFAULT)::reporting_level() = l;
|
|
||||||
LOGGER(connection)::reporting_level() = l;
|
|
||||||
}
|
|
||||||
if (clim.count("logfile")) {
|
|
||||||
// configure the connection logger
|
|
||||||
auto f = fopen(clim["logfile"].as<std::string>().c_str(), "w");
|
|
||||||
LOG_OUTPUT(DEFAULT)::stream() = f;
|
|
||||||
LOG_OUTPUT(connection)::stream() = f;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<iss::vm_plugin *> plugin_list;
|
|
||||||
auto res = 0;
|
|
||||||
try {
|
|
||||||
// application code comes here //
|
|
||||||
iss::init_jit(argc, argv);
|
|
||||||
bool dump = clim.count("dump-ir");
|
|
||||||
// instantiate the simulator
|
|
||||||
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>());
|
|
||||||
if (isa_opt=="rv64ia") {
|
|
||||||
iss::arch::rv64i* lcpu = new iss::arch::riscv_hart_msu_vp<iss::arch::rv64i>();
|
|
||||||
vm = iss::create(lcpu, clim["gdb-port"].as<unsigned>());
|
|
||||||
cpu.reset(lcpu);
|
|
||||||
} else if (isa_opt=="rv64gc") {
|
|
||||||
iss::arch::rv64gc* lcpu = new iss::arch::riscv_hart_msu_vp<iss::arch::rv64gc>();
|
|
||||||
vm = iss::create(lcpu, clim["gdb-port"].as<unsigned>());
|
|
||||||
cpu.reset(lcpu);
|
|
||||||
} else if (isa_opt=="rv32imac") {
|
|
||||||
iss::arch::rv32imac* lcpu = new iss::arch::riscv_hart_msu_vp<iss::arch::rv32imac>();
|
|
||||||
vm = iss::create(lcpu, clim["gdb-port"].as<unsigned>());
|
|
||||||
cpu.reset(lcpu);
|
|
||||||
} 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 {
|
|
||||||
LOG(ERROR) << "Illegal argument value for '--isa': " << clim["isa"].as<std::string>() << std::endl;
|
|
||||||
return 127;
|
|
||||||
}
|
|
||||||
if (clim.count("plugin")) {
|
|
||||||
for (std::string opt_val : clim["plugin"].as<std::vector<std::string>>()) {
|
|
||||||
std::string 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")) {
|
|
||||||
vm->setDisassEnabled(true);
|
|
||||||
LOGGER(disass)::reporting_level() = logging::INFO;
|
|
||||||
auto file_name = clim["disass"].as<std::string>();
|
|
||||||
if (file_name.length() > 0) {
|
|
||||||
LOG_OUTPUT(disass)::stream() = fopen(file_name.c_str(), "w");
|
|
||||||
LOGGER(disass)::print_time() = false;
|
|
||||||
LOGGER(disass)::print_severity() = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
uint64_t start_address = 0;
|
|
||||||
if (clim.count("mem"))
|
|
||||||
vm->get_arch()->load_file(clim["mem"].as<std::string>(), iss::arch::traits<iss::arch::rv32imac>::MEM);
|
|
||||||
if (clim.count("elf"))
|
|
||||||
for (std::string input : clim["elf"].as<std::vector<std::string>>()) {
|
|
||||||
auto start_addr = vm->get_arch()->load_file(input);
|
|
||||||
if (start_addr.second) start_address = start_addr.first;
|
|
||||||
}
|
|
||||||
for (std::string input : args) {
|
|
||||||
auto start_addr = vm->get_arch()->load_file(input); // treat remaining arguments as elf files
|
|
||||||
if (start_addr.second) start_address = start_addr.first;
|
|
||||||
}
|
|
||||||
if (clim.count("reset")) {
|
|
||||||
auto str = clim["reset"].as<std::string>();
|
|
||||||
start_address = str.find("0x") == 0 ? std::stoull(str.substr(2), nullptr, 16) : std::stoull(str, nullptr, 10);
|
|
||||||
}
|
|
||||||
vm->reset(start_address);
|
|
||||||
auto cycles = clim["instructions"].as<uint64_t>();
|
|
||||||
res = vm->start(cycles, dump);
|
|
||||||
} catch (std::exception &e) {
|
|
||||||
LOG(ERROR) << "Unhandled Exception reached the top of main: " << e.what() << ", application will now exit"
|
|
||||||
<< std::endl;
|
|
||||||
res = 2;
|
|
||||||
}
|
|
||||||
// cleanup to let plugins report of needed
|
|
||||||
for (auto *p : plugin_list) {
|
|
||||||
delete p;
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
|
@ -1,92 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* 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/plugin/cycle_estimate.h"
|
|
||||||
|
|
||||||
#include <iss/arch_if.h>
|
|
||||||
#include <util/logging.h>
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
iss::plugin::cycle_estimate::cycle_estimate(std::string config_file_name)
|
|
||||||
: arch_instr(nullptr)
|
|
||||||
{
|
|
||||||
if (config_file_name.length() > 0) {
|
|
||||||
std::ifstream is(config_file_name);
|
|
||||||
if (is.is_open()) {
|
|
||||||
try {
|
|
||||||
is >> root;
|
|
||||||
} catch (Json::RuntimeError &e) {
|
|
||||||
LOG(ERROR) << "Could not parse input file " << config_file_name << ", reason: " << e.what();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
LOG(ERROR) << "Could not open input file " << config_file_name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
iss::plugin::cycle_estimate::~cycle_estimate() {
|
|
||||||
}
|
|
||||||
|
|
||||||
bool iss::plugin::cycle_estimate::registration(const char* const version, vm_if& vm) {
|
|
||||||
arch_instr = vm.get_arch()->get_instrumentation_if();
|
|
||||||
if(!arch_instr) return false;
|
|
||||||
const std::string core_name = arch_instr->core_type_name();
|
|
||||||
Json::Value &val = root[core_name];
|
|
||||||
if(!val.isNull() && val.isArray()){
|
|
||||||
delays.reserve(val.size());
|
|
||||||
for(auto it:val){
|
|
||||||
auto name = it["name"];
|
|
||||||
auto size = it["size"];
|
|
||||||
auto delay = it["delay"];
|
|
||||||
if(!name.isString() || !size.isUInt() || !(delay.isUInt() || delay.isArray())) throw std::runtime_error("JSON parse error");
|
|
||||||
if(delay.isUInt()){
|
|
||||||
delays.push_back(instr_desc{size.asUInt(), delay.asUInt(), 0});
|
|
||||||
} else {
|
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void iss::plugin::cycle_estimate::callback(instr_info_t instr_info) {
|
|
||||||
assert(arch_instr && "No instrumentation interface available but callback executed");
|
|
||||||
auto entry = delays[instr_info.instr_id];
|
|
||||||
bool taken = (arch_instr->get_next_pc()-arch_instr->get_pc()) != (entry.size/8);
|
|
||||||
uint32_t delay = taken ? entry.taken : entry.not_taken;
|
|
||||||
if(delay>1) arch_instr->set_curr_instr_cycles(delay);
|
|
||||||
}
|
|
|
@ -1,95 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* 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/plugin/instruction_count.h"
|
|
||||||
#include "iss/instrumentation_if.h"
|
|
||||||
|
|
||||||
#include <iss/arch_if.h>
|
|
||||||
#include <util/logging.h>
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
iss::plugin::instruction_count::instruction_count(std::string config_file_name) {
|
|
||||||
if (config_file_name.length() > 0) {
|
|
||||||
std::ifstream is(config_file_name);
|
|
||||||
if (is.is_open()) {
|
|
||||||
try {
|
|
||||||
is >> root;
|
|
||||||
} catch (Json::RuntimeError &e) {
|
|
||||||
LOG(ERROR) << "Could not parse input file " << config_file_name << ", reason: " << e.what();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
LOG(ERROR) << "Could not open input file " << config_file_name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
iss::plugin::instruction_count::~instruction_count() {
|
|
||||||
size_t idx=0;
|
|
||||||
for(auto it:delays){
|
|
||||||
if(rep_counts[idx]>0)
|
|
||||||
LOG(INFO)<<it.instr_name<<";"<<rep_counts[idx];
|
|
||||||
idx++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool iss::plugin::instruction_count::registration(const char* const version, vm_if& vm) {
|
|
||||||
auto instr_if = vm.get_arch()->get_instrumentation_if();
|
|
||||||
if(!instr_if) return false;
|
|
||||||
const std::string core_name = instr_if->core_type_name();
|
|
||||||
Json::Value &val = root[core_name];
|
|
||||||
if(!val.isNull() && val.isArray()){
|
|
||||||
delays.reserve(val.size());
|
|
||||||
for(auto it:val){
|
|
||||||
auto name = it["name"];
|
|
||||||
auto size = it["size"];
|
|
||||||
auto delay = it["delay"];
|
|
||||||
if(!name.isString() || !size.isUInt() || !(delay.isUInt() || delay.isArray())) throw std::runtime_error("JSON parse error");
|
|
||||||
if(delay.isUInt()){
|
|
||||||
const instr_delay entry{name.asCString(), size.asUInt(), delay.asUInt(), 0};
|
|
||||||
delays.push_back(entry);
|
|
||||||
} else {
|
|
||||||
const instr_delay entry{name.asCString(), size.asUInt(), delay[0].asUInt(), delay[1].asUInt()};
|
|
||||||
delays.push_back(entry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
void iss::plugin::instruction_count::callback(instr_info_t instr_info) {
|
|
||||||
rep_counts[instr_info.instr_id]++;
|
|
||||||
}
|
|
|
@ -1,483 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
* Copyright (C) 2017, 2018 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 "sysc/core_complex.h"
|
|
||||||
#include "iss/arch/riscv_hart_msu_vp.h"
|
|
||||||
#include "iss/arch/rv32imac.h"
|
|
||||||
#include "iss/debugger/encoderdecoder.h"
|
|
||||||
#include "iss/debugger/gdb_session.h"
|
|
||||||
#include "iss/debugger/server.h"
|
|
||||||
#include "iss/debugger/target_adapter_if.h"
|
|
||||||
#include "iss/iss.h"
|
|
||||||
#include "iss/vm_types.h"
|
|
||||||
#include "scc/report.h"
|
|
||||||
#include <sstream>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#ifdef WITH_SCV
|
|
||||||
#include <array>
|
|
||||||
#include <scv.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace sysc {
|
|
||||||
namespace SiFive {
|
|
||||||
using namespace std;
|
|
||||||
using namespace iss;
|
|
||||||
using namespace logging;
|
|
||||||
using namespace sc_core;
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
iss::debugger::encoder_decoder encdec;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
std::array<const char, 4> lvl = {{'U', 'S', 'H', 'M'}};
|
|
||||||
|
|
||||||
std::array<const char*, 16> trap_str = { {
|
|
||||||
"Instruction address misaligned",
|
|
||||||
"Instruction access fault",
|
|
||||||
"Illegal instruction",
|
|
||||||
"Breakpoint",
|
|
||||||
"Load address misaligned",
|
|
||||||
"Load access fault",
|
|
||||||
"Store/AMO address misaligned",
|
|
||||||
"Store/AMO access fault",
|
|
||||||
"Environment call from U-mode",
|
|
||||||
"Environment call from S-mode",
|
|
||||||
"Reserved",
|
|
||||||
"Environment call from M-mode",
|
|
||||||
"Instruction page fault",
|
|
||||||
"Load page fault",
|
|
||||||
"Reserved",
|
|
||||||
"Store/AMO page fault"
|
|
||||||
} };
|
|
||||||
std::array<const char*, 12> irq_str = { {
|
|
||||||
"User software interrupt", "Supervisor software interrupt", "Reserved", "Machine software interrupt",
|
|
||||||
"User timer interrupt", "Supervisor timer interrupt", "Reserved", "Machine timer interrupt",
|
|
||||||
"User external interrupt", "Supervisor external interrupt", "Reserved", "Machine external interrupt" } };
|
|
||||||
}
|
|
||||||
|
|
||||||
class core_wrapper : public iss::arch::riscv_hart_msu_vp<iss::arch::rv32imac> {
|
|
||||||
public:
|
|
||||||
using core_type = arch::rv32imac;
|
|
||||||
using base_type = arch::riscv_hart_msu_vp<arch::rv32imac>;
|
|
||||||
using phys_addr_t = typename arch::traits<arch::rv32imac>::phys_addr_t;
|
|
||||||
core_wrapper(core_complex *owner)
|
|
||||||
: owner(owner) {}
|
|
||||||
|
|
||||||
uint32_t get_mode() { return this->reg.machine_state; }
|
|
||||||
|
|
||||||
inline void set_interrupt_execution(bool v) { this->interrupt_sim = v; }
|
|
||||||
|
|
||||||
inline bool get_interrupt_execution() { return this->interrupt_sim; }
|
|
||||||
|
|
||||||
base_type::hart_state<base_type::reg_t> &get_state() { return this->state; }
|
|
||||||
|
|
||||||
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; }
|
|
||||||
|
|
||||||
void disass_output(uint64_t pc, const std::string instr) override {
|
|
||||||
if (INFO <= Log<Output2FILE<disass>>::reporting_level() && Output2FILE<disass>::stream()) {
|
|
||||||
std::stringstream s;
|
|
||||||
s << "[p:" << lvl[this->reg.machine_state] << ";s:0x" << std::hex << std::setfill('0')
|
|
||||||
<< std::setw(sizeof(reg_t) * 2) << (reg_t)state.mstatus << std::dec << ";c:" << this->reg.icount << "]";
|
|
||||||
Log<Output2FILE<disass>>().get(INFO, "disass")
|
|
||||||
<< "0x" << std::setw(16) << std::right << std::setfill('0') << std::hex << pc << "\t\t" << std::setw(40)
|
|
||||||
<< std::setfill(' ') << std::left << instr << s.str();
|
|
||||||
}
|
|
||||||
owner->disass_output(pc, instr);
|
|
||||||
};
|
|
||||||
|
|
||||||
status read_mem(phys_addr_t addr, unsigned length, uint8_t *const data) override {
|
|
||||||
if (addr.access && access_type::DEBUG)
|
|
||||||
return owner->read_mem_dbg(addr.val, length, data) ? Ok : Err;
|
|
||||||
else {
|
|
||||||
return owner->read_mem(addr.val, length, data, addr.access && access_type::FETCH) ? Ok : Err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
status write_mem(phys_addr_t addr, unsigned length, const uint8_t *const data) override {
|
|
||||||
if (addr.access && access_type::DEBUG)
|
|
||||||
return owner->write_mem_dbg(addr.val, length, data) ? Ok : Err;
|
|
||||||
else {
|
|
||||||
auto res = owner->write_mem(addr.val, length, data) ? Ok : Err;
|
|
||||||
// clear MTIP on mtimecmp write
|
|
||||||
if (addr.val == 0x2004000) {
|
|
||||||
reg_t val;
|
|
||||||
this->read_csr(arch::mip, val);
|
|
||||||
if (val & (1ULL << 7)) this->write_csr(arch::mip, val & ~(1ULL << 7));
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void wait_until(uint64_t flags) override {
|
|
||||||
SCDEBUG(owner->name()) << "Sleeping until interrupt";
|
|
||||||
do {
|
|
||||||
wait(wfi_evt);
|
|
||||||
} while (this->reg.pending_trap == 0);
|
|
||||||
base_type::wait_until(flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
void local_irq(short id, bool value) {
|
|
||||||
base_type::reg_t mask = 0;
|
|
||||||
switch (id) {
|
|
||||||
case 16: // SW
|
|
||||||
mask = 1 << 3;
|
|
||||||
break;
|
|
||||||
case 17: // timer
|
|
||||||
mask = 1 << 7;
|
|
||||||
break;
|
|
||||||
case 18: // external
|
|
||||||
mask = 1 << 11;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* do nothing*/
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (value) {
|
|
||||||
this->csr[arch::mip] |= mask;
|
|
||||||
wfi_evt.notify();
|
|
||||||
} else
|
|
||||||
this->csr[arch::mip] &= ~mask;
|
|
||||||
this->check_interrupt();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
core_complex *const owner;
|
|
||||||
sc_event wfi_evt;
|
|
||||||
};
|
|
||||||
|
|
||||||
int cmd_sysc(int argc, char *argv[], debugger::out_func of, debugger::data_func df,
|
|
||||||
debugger::target_adapter_if *tgt_adapter) {
|
|
||||||
if (argc > 1) {
|
|
||||||
if (strcasecmp(argv[1], "print_time") == 0) {
|
|
||||||
std::string t = sc_time_stamp().to_string();
|
|
||||||
of(t.c_str());
|
|
||||||
std::array<char, 64> buf;
|
|
||||||
encdec.enc_string(t.c_str(), buf.data(), 63);
|
|
||||||
df(buf.data());
|
|
||||||
return Ok;
|
|
||||||
} else if (strcasecmp(argv[1], "break") == 0) {
|
|
||||||
sc_time t;
|
|
||||||
if (argc == 4) {
|
|
||||||
t = scc::parse_from_string(argv[2], argv[3]);
|
|
||||||
} else if (argc == 3) {
|
|
||||||
t = scc::parse_from_string(argv[2]);
|
|
||||||
} else
|
|
||||||
return Err;
|
|
||||||
// no check needed as it is only called if debug server is active
|
|
||||||
tgt_adapter->add_break_condition([t]() -> unsigned {
|
|
||||||
SCTRACE() << "Checking condition at " << sc_time_stamp();
|
|
||||||
return sc_time_stamp() >= t ? std::numeric_limits<unsigned>::max() : 0;
|
|
||||||
});
|
|
||||||
return Ok;
|
|
||||||
}
|
|
||||||
return Err;
|
|
||||||
}
|
|
||||||
return Err;
|
|
||||||
}
|
|
||||||
|
|
||||||
core_complex::core_complex(sc_module_name name)
|
|
||||||
: sc_module(name)
|
|
||||||
, NAMED(initiator)
|
|
||||||
, NAMED(clk_i)
|
|
||||||
, NAMED(rst_i)
|
|
||||||
, NAMED(global_irq_i)
|
|
||||||
, NAMED(timer_irq_i)
|
|
||||||
, NAMED(local_irq_i, 16)
|
|
||||||
, NAMED(elf_file, "")
|
|
||||||
, NAMED(enable_disass, false)
|
|
||||||
, NAMED(reset_address, 0ULL)
|
|
||||||
, NAMED(gdb_server_port, 0)
|
|
||||||
, NAMED(dump_ir, false)
|
|
||||||
, read_lut(tlm_dmi_ext())
|
|
||||||
, write_lut(tlm_dmi_ext())
|
|
||||||
, tgt_adapter(nullptr)
|
|
||||||
#ifdef WITH_SCV
|
|
||||||
, m_db(scv_tr_db::get_default_db())
|
|
||||||
, stream_handle(nullptr)
|
|
||||||
, instr_tr_handle(nullptr)
|
|
||||||
, fetch_tr_handle(nullptr)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
|
|
||||||
initiator.register_invalidate_direct_mem_ptr([=](uint64_t start, uint64_t end) -> void {
|
|
||||||
auto lut_entry = read_lut.getEntry(start);
|
|
||||||
if (lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && end <= lut_entry.get_end_address() + 1) {
|
|
||||||
read_lut.removeEntry(lut_entry);
|
|
||||||
}
|
|
||||||
lut_entry = write_lut.getEntry(start);
|
|
||||||
if (lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && end <= lut_entry.get_end_address() + 1) {
|
|
||||||
write_lut.removeEntry(lut_entry);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
SC_THREAD(run);
|
|
||||||
SC_METHOD(clk_cb);
|
|
||||||
sensitive << clk_i;
|
|
||||||
SC_METHOD(rst_cb);
|
|
||||||
sensitive << rst_i;
|
|
||||||
SC_METHOD(sw_irq_cb);
|
|
||||||
sensitive << sw_irq_i;
|
|
||||||
SC_METHOD(timer_irq_cb);
|
|
||||||
sensitive << timer_irq_i;
|
|
||||||
SC_METHOD(global_irq_cb);
|
|
||||||
sensitive << global_irq_i;
|
|
||||||
}
|
|
||||||
|
|
||||||
core_complex::~core_complex() = default;
|
|
||||||
|
|
||||||
void core_complex::trace(sc_trace_file *trf) const {}
|
|
||||||
|
|
||||||
void core_complex::before_end_of_elaboration() {
|
|
||||||
cpu = std::make_unique<core_wrapper>(this);
|
|
||||||
vm = create<arch::rv32imac>(cpu.get(), gdb_server_port.get_value(), dump_ir.get_value());
|
|
||||||
#ifdef WITH_SCV
|
|
||||||
vm->setDisassEnabled(enable_disass.get_value() || m_db != nullptr);
|
|
||||||
#else
|
|
||||||
vm->setDisassEnabled(enable_disass.get_value());
|
|
||||||
#endif
|
|
||||||
auto *srv = debugger::server<debugger::gdb_session>::get();
|
|
||||||
if (srv) tgt_adapter = srv->get_target();
|
|
||||||
if (tgt_adapter)
|
|
||||||
tgt_adapter->add_custom_command(
|
|
||||||
{"sysc", [this](int argc, char *argv[], debugger::out_func of,
|
|
||||||
debugger::data_func df) -> int { return cmd_sysc(argc, argv, of, df, tgt_adapter); },
|
|
||||||
"SystemC sub-commands: break <time>, print_time"});
|
|
||||||
}
|
|
||||||
|
|
||||||
void core_complex::start_of_simulation() {
|
|
||||||
quantum_keeper.reset();
|
|
||||||
if (elf_file.get_value().size() > 0) {
|
|
||||||
istringstream is(elf_file.get_value());
|
|
||||||
string s;
|
|
||||||
while (getline(is, s, ',')) {
|
|
||||||
std::pair<uint64_t, bool> start_addr = cpu->load_file(s);
|
|
||||||
if (reset_address.is_default_value() && start_addr.second == true)
|
|
||||||
reset_address.set_value(start_addr.first);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef WITH_SCV
|
|
||||||
if (m_db != nullptr && stream_handle == nullptr) {
|
|
||||||
string basename(this->name());
|
|
||||||
stream_handle = new scv_tr_stream((basename + ".instr").c_str(), "TRANSACTOR", m_db);
|
|
||||||
instr_tr_handle = new scv_tr_generator<>("execute", *stream_handle);
|
|
||||||
fetch_tr_handle = new scv_tr_generator<uint64_t>("fetch", *stream_handle);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void core_complex::disass_output(uint64_t pc, const std::string instr_str) {
|
|
||||||
#ifdef WITH_SCV
|
|
||||||
if (m_db == nullptr) return;
|
|
||||||
if (tr_handle.is_active()) tr_handle.end_transaction();
|
|
||||||
tr_handle = instr_tr_handle->begin_transaction();
|
|
||||||
tr_handle.record_attribute("PC", pc);
|
|
||||||
tr_handle.record_attribute("INSTR", instr_str);
|
|
||||||
tr_handle.record_attribute("MODE", lvl[cpu->get_mode()]);
|
|
||||||
tr_handle.record_attribute("MSTATUS", cpu->get_state().mstatus.st.value);
|
|
||||||
tr_handle.record_attribute("LTIME_START", quantum_keeper.get_current_time().value() / 1000);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void core_complex::clk_cb() {
|
|
||||||
curr_clk = clk_i.read();
|
|
||||||
if (curr_clk == SC_ZERO_TIME) cpu->set_interrupt_execution(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void core_complex::rst_cb() {
|
|
||||||
if (rst_i.read()) cpu->set_interrupt_execution(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void core_complex::sw_irq_cb() { cpu->local_irq(16, sw_irq_i.read()); }
|
|
||||||
|
|
||||||
void core_complex::timer_irq_cb() { cpu->local_irq(17, timer_irq_i.read()); }
|
|
||||||
|
|
||||||
void core_complex::global_irq_cb() { cpu->local_irq(18, global_irq_i.read()); }
|
|
||||||
|
|
||||||
void core_complex::run() {
|
|
||||||
wait(SC_ZERO_TIME); // separate from elaboration phase
|
|
||||||
do {
|
|
||||||
if (rst_i.read()) {
|
|
||||||
cpu->reset(reset_address.get_value());
|
|
||||||
wait(rst_i.negedge_event());
|
|
||||||
}
|
|
||||||
while (clk_i.read() == SC_ZERO_TIME) {
|
|
||||||
wait(clk_i.value_changed_event());
|
|
||||||
}
|
|
||||||
cpu->set_interrupt_execution(false);
|
|
||||||
vm->start();
|
|
||||||
} while (cpu->get_interrupt_execution());
|
|
||||||
sc_stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool core_complex::read_mem(uint64_t addr, unsigned length, uint8_t *const data, bool is_fetch) {
|
|
||||||
auto lut_entry = read_lut.getEntry(addr);
|
|
||||||
if (lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE &&
|
|
||||||
addr + length <= lut_entry.get_end_address() + 1) {
|
|
||||||
auto offset = addr - lut_entry.get_start_address();
|
|
||||||
std::copy(lut_entry.get_dmi_ptr() + offset, lut_entry.get_dmi_ptr() + offset + length, data);
|
|
||||||
quantum_keeper.inc(lut_entry.get_read_latency());
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
tlm::tlm_generic_payload gp;
|
|
||||||
gp.set_command(tlm::TLM_READ_COMMAND);
|
|
||||||
gp.set_address(addr);
|
|
||||||
gp.set_data_ptr(data);
|
|
||||||
gp.set_data_length(length);
|
|
||||||
gp.set_streaming_width(length);
|
|
||||||
sc_time delay{quantum_keeper.get_local_time()};
|
|
||||||
#ifdef WITH_SCV
|
|
||||||
if (m_db != nullptr && tr_handle.is_valid()) {
|
|
||||||
if (is_fetch && tr_handle.is_active()) {
|
|
||||||
tr_handle.end_transaction();
|
|
||||||
}
|
|
||||||
auto preExt = new scv4tlm::tlm_recording_extension(tr_handle, this);
|
|
||||||
gp.set_extension(preExt);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
initiator->b_transport(gp, delay);
|
|
||||||
SCTRACE(this->name()) << "read_mem(0x" << std::hex << addr << ") : " << data;
|
|
||||||
if (gp.get_response_status() != tlm::TLM_OK_RESPONSE) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (gp.is_dmi_allowed()) {
|
|
||||||
gp.set_command(tlm::TLM_READ_COMMAND);
|
|
||||||
gp.set_address(addr);
|
|
||||||
tlm_dmi_ext dmi_data;
|
|
||||||
if (initiator->get_direct_mem_ptr(gp, dmi_data)) {
|
|
||||||
if (dmi_data.is_read_allowed())
|
|
||||||
read_lut.addEntry(dmi_data, dmi_data.get_start_address(),
|
|
||||||
dmi_data.get_end_address() - dmi_data.get_start_address() + 1);
|
|
||||||
if (dmi_data.is_write_allowed())
|
|
||||||
write_lut.addEntry(dmi_data, dmi_data.get_start_address(),
|
|
||||||
dmi_data.get_end_address() - dmi_data.get_start_address() + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool core_complex::write_mem(uint64_t addr, unsigned length, const uint8_t *const data) {
|
|
||||||
auto lut_entry = write_lut.getEntry(addr);
|
|
||||||
if (lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE &&
|
|
||||||
addr + length <= lut_entry.get_end_address() + 1) {
|
|
||||||
auto offset = addr - lut_entry.get_start_address();
|
|
||||||
std::copy(data, data + length, lut_entry.get_dmi_ptr() + offset);
|
|
||||||
quantum_keeper.inc(lut_entry.get_read_latency());
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
write_buf.resize(length);
|
|
||||||
std::copy(data, data + length, write_buf.begin()); // need to copy as TLM does not guarantee data integrity
|
|
||||||
tlm::tlm_generic_payload gp;
|
|
||||||
gp.set_command(tlm::TLM_WRITE_COMMAND);
|
|
||||||
gp.set_address(addr);
|
|
||||||
gp.set_data_ptr(write_buf.data());
|
|
||||||
gp.set_data_length(length);
|
|
||||||
gp.set_streaming_width(length);
|
|
||||||
sc_time delay{quantum_keeper.get_local_time()};
|
|
||||||
#ifdef WITH_SCV
|
|
||||||
if (m_db != nullptr && tr_handle.is_valid()) {
|
|
||||||
auto preExt = new scv4tlm::tlm_recording_extension(tr_handle, this);
|
|
||||||
gp.set_extension(preExt);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
initiator->b_transport(gp, delay);
|
|
||||||
quantum_keeper.set(delay);
|
|
||||||
SCTRACE() << "write_mem(0x" << std::hex << addr << ") : " << data;
|
|
||||||
if (gp.get_response_status() != tlm::TLM_OK_RESPONSE) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (gp.is_dmi_allowed()) {
|
|
||||||
gp.set_command(tlm::TLM_READ_COMMAND);
|
|
||||||
gp.set_address(addr);
|
|
||||||
tlm_dmi_ext dmi_data;
|
|
||||||
if (initiator->get_direct_mem_ptr(gp, dmi_data)) {
|
|
||||||
if (dmi_data.is_read_allowed())
|
|
||||||
read_lut.addEntry(dmi_data, dmi_data.get_start_address(),
|
|
||||||
dmi_data.get_end_address() - dmi_data.get_start_address() + 1);
|
|
||||||
if (dmi_data.is_write_allowed())
|
|
||||||
write_lut.addEntry(dmi_data, dmi_data.get_start_address(),
|
|
||||||
dmi_data.get_end_address() - dmi_data.get_start_address() + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool core_complex::read_mem_dbg(uint64_t addr, unsigned length, uint8_t *const data) {
|
|
||||||
auto lut_entry = read_lut.getEntry(addr);
|
|
||||||
if (lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE &&
|
|
||||||
addr + length <= lut_entry.get_end_address() + 1) {
|
|
||||||
auto offset = addr - lut_entry.get_start_address();
|
|
||||||
std::copy(lut_entry.get_dmi_ptr() + offset, lut_entry.get_dmi_ptr() + offset + length, data);
|
|
||||||
quantum_keeper.inc(lut_entry.get_read_latency());
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
tlm::tlm_generic_payload gp;
|
|
||||||
gp.set_command(tlm::TLM_READ_COMMAND);
|
|
||||||
gp.set_address(addr);
|
|
||||||
gp.set_data_ptr(data);
|
|
||||||
gp.set_data_length(length);
|
|
||||||
gp.set_streaming_width(length);
|
|
||||||
return initiator->transport_dbg(gp) == length;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool core_complex::write_mem_dbg(uint64_t addr, unsigned length, const uint8_t *const data) {
|
|
||||||
auto lut_entry = write_lut.getEntry(addr);
|
|
||||||
if (lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE &&
|
|
||||||
addr + length <= lut_entry.get_end_address() + 1) {
|
|
||||||
auto offset = addr - lut_entry.get_start_address();
|
|
||||||
std::copy(data, data + length, lut_entry.get_dmi_ptr() + offset);
|
|
||||||
quantum_keeper.inc(lut_entry.get_read_latency());
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
write_buf.resize(length);
|
|
||||||
std::copy(data, data + length, write_buf.begin()); // need to copy as TLM does not guarantee data integrity
|
|
||||||
tlm::tlm_generic_payload gp;
|
|
||||||
gp.set_command(tlm::TLM_WRITE_COMMAND);
|
|
||||||
gp.set_address(addr);
|
|
||||||
gp.set_data_ptr(write_buf.data());
|
|
||||||
gp.set_data_length(length);
|
|
||||||
gp.set_streaming_width(length);
|
|
||||||
return initiator->transport_dbg(gp) == length;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} /* namespace SiFive */
|
|
||||||
} /* namespace sysc */
|
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit 7c989da05673bb40e1358561d51b86e71c1ac68c
|
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit e0d61e70ed65a582b348dea473ca05130f4baa34
|
|
@ -1,378 +0,0 @@
|
||||||
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 "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
|
|
||||||
)
|
|
|
@ -1,37 +0,0 @@
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
|
|
||||||
<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>
|
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
|
@ -1,325 +0,0 @@
|
||||||
|
|
||||||
#=============================================================================
|
|
||||||
#
|
|
||||||
# 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)
|
|
||||||
|
|
|
@ -1,53 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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"
|
|
||||||
|
|
|
@ -1,325 +0,0 @@
|
||||||
|
|
||||||
#=============================================================================
|
|
||||||
#
|
|
||||||
# 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)
|
|
||||||
|
|
|
@ -1,53 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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"
|
|
||||||
|
|
|
@ -1,323 +0,0 @@
|
||||||
|
|
||||||
#=============================================================================
|
|
||||||
#
|
|
||||||
# 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)
|
|
||||||
|
|
|
@ -1,53 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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"
|
|
||||||
|
|
|
@ -1,390 +0,0 @@
|
||||||
|
|
||||||
#=============================================================================
|
|
||||||
#
|
|
||||||
# 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)
|
|
||||||
|
|
|
@ -1,55 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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"
|
|
||||||
|
|
|
@ -1,325 +0,0 @@
|
||||||
|
|
||||||
#=============================================================================
|
|
||||||
#
|
|
||||||
# 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)
|
|
||||||
|
|
|
@ -1,53 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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"
|
|
||||||
|
|
|
@ -1,325 +0,0 @@
|
||||||
|
|
||||||
#=============================================================================
|
|
||||||
#
|
|
||||||
# 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)
|
|
||||||
|
|
|
@ -1,53 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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"
|
|
||||||
|
|
|
@ -1,390 +0,0 @@
|
||||||
|
|
||||||
#=============================================================================
|
|
||||||
#
|
|
||||||
# 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)
|
|
||||||
|
|
|
@ -1,54 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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"
|
|
||||||
|
|
|
@ -1,391 +0,0 @@
|
||||||
|
|
||||||
#=============================================================================
|
|
||||||
#
|
|
||||||
# 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)
|
|
||||||
|
|
|
@ -1,50 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
|
@ -1,325 +0,0 @@
|
||||||
|
|
||||||
#=============================================================================
|
|
||||||
#
|
|
||||||
# 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)
|
|
||||||
|
|
|
@ -1,50 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
|
@ -1,258 +0,0 @@
|
||||||
|
|
||||||
<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>
|
|
||||||
|
|
|
@ -1,686 +0,0 @@
|
||||||
|
|
||||||
<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
|
@ -1,57 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,60 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,56 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,56 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,56 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,55 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,51 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,51 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,53 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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 );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,65 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,59 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,59 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,59 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,107 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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 );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,106 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,76 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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 )];
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,81 +0,0 @@
|
||||||
|
|
||||||
/*============================================================================
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue