Adapted generated code to support translation block linking
This commit is contained in:
parent
5b6dc36c9d
commit
dfcc3ace66
61
.cproject
61
.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="false" superClass="de.marw.cdt.cmake.core.genscriptbuilder"/>
|
<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"/>
|
||||||
<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"/>
|
||||||
|
@ -70,7 +70,7 @@
|
||||||
</extensions>
|
</extensions>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.exe.release.1745230171" name="Release" optionalBuildProperties="" parent="cdt.managedbuild.config.gnu.exe.release">
|
<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.exe.release.1745230171" name="Release" optionalBuildProperties="org.eclipse.cdt.docker.launcher.containerbuild.property.volumes=,org.eclipse.cdt.docker.launcher.containerbuild.property.selectedvolumes=" parent="cdt.managedbuild.config.gnu.exe.release">
|
||||||
<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"/>
|
||||||
|
@ -101,6 +101,57 @@
|
||||||
</configuration>
|
</configuration>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||||
|
<storageModule buildDir="build/${ConfigName}" moduleId="de.marw.cdt.cmake.core.settings">
|
||||||
|
<options/>
|
||||||
|
<linux command="cmake" generator="UnixMakefiles" use-default="true">
|
||||||
|
</linux>
|
||||||
|
<win32 command="cmake" generator="MinGWMakefiles" use-default="true">
|
||||||
|
</win32>
|
||||||
|
</storageModule>
|
||||||
|
</cconfiguration>
|
||||||
|
<cconfiguration id="cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404">
|
||||||
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404" moduleId="org.eclipse.cdt.core.settings" name="RelWithDebInfo">
|
||||||
|
<externalSettings/>
|
||||||
|
<extensions>
|
||||||
|
<extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
|
</extensions>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
|
<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404" name="RelWithDebInfo" optionalBuildProperties="" parent="cdt.managedbuild.config.gnu.exe.release">
|
||||||
|
<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">
|
||||||
|
<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"/>
|
||||||
|
<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">
|
||||||
|
<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.debugging.level.1769987567" name="Debug Level" superClass="gnu.cpp.compiler.exe.release.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
|
||||||
|
<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.228859511" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
|
||||||
|
</tool>
|
||||||
|
<tool id="cdt.managedbuild.tool.gnu.c.compiler.exe.release.1020243188" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.exe.release">
|
||||||
|
<option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.exe.release.option.optimization.level.681548571" name="Optimization Level" superClass="gnu.c.compiler.exe.release.option.optimization.level" useByScannerDiscovery="false" valueType="enumerated"/>
|
||||||
|
<option id="gnu.c.compiler.exe.release.option.debugging.level.987899513" name="Debug Level" superClass="gnu.c.compiler.exe.release.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.none" valueType="enumerated"/>
|
||||||
|
<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.693742822" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
|
||||||
|
</tool>
|
||||||
|
<tool id="cdt.managedbuild.tool.gnu.c.linker.exe.release.1626150212" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.release"/>
|
||||||
|
<tool id="cdt.managedbuild.tool.gnu.cpp.linker.exe.release.1878716058" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.exe.release">
|
||||||
|
<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.471741232" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
|
||||||
|
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
||||||
|
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
||||||
|
</inputType>
|
||||||
|
</tool>
|
||||||
|
<tool id="cdt.managedbuild.tool.gnu.assembler.exe.release.1237246932" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.exe.release">
|
||||||
|
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1692363597" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
|
||||||
|
</tool>
|
||||||
|
</toolChain>
|
||||||
|
</folderInfo>
|
||||||
|
</configuration>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||||
<storageModule buildDir="build/${ConfigName}" moduleId="de.marw.cdt.cmake.core.settings">
|
<storageModule buildDir="build/${ConfigName}" moduleId="de.marw.cdt.cmake.core.settings">
|
||||||
<options/>
|
<options/>
|
||||||
<linux command="cmake" generator="UnixMakefiles" use-default="true">
|
<linux command="cmake" generator="UnixMakefiles" use-default="true">
|
||||||
|
@ -111,6 +162,9 @@
|
||||||
<defs/>
|
<defs/>
|
||||||
<undefs/>
|
<undefs/>
|
||||||
</win32>
|
</win32>
|
||||||
|
<defs>
|
||||||
|
<def name="CMAKE_BUILD_TYPE" type="STRING" val="RelWithDebInfo"/>
|
||||||
|
</defs>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
</cconfiguration>
|
</cconfiguration>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
|
@ -176,6 +230,9 @@
|
||||||
</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">
|
||||||
|
<resource resourceType="PROJECT" workspacePath="/DBT-RISE-RISCV"/>
|
||||||
|
</configuration>
|
||||||
<configuration configurationName="Default">
|
<configuration configurationName="Default">
|
||||||
<resource resourceType="PROJECT" workspacePath="/DBT-RISE-RISCV"/>
|
<resource resourceType="PROJECT" workspacePath="/DBT-RISE-RISCV"/>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
eclipse.preferences.version=1
|
eclipse.preferences.version=1
|
||||||
environment/project/cdt.managedbuild.config.gnu.exe.debug.1751741082/append=true
|
environment/project/cdt.managedbuild.config.gnu.exe.debug.1751741082/append=true
|
||||||
environment/project/cdt.managedbuild.config.gnu.exe.debug.1751741082/appendContributed=true
|
environment/project/cdt.managedbuild.config.gnu.exe.debug.1751741082/appendContributed=true
|
||||||
|
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/LLVM_HOME/delimiter=\:
|
||||||
|
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/LLVM_HOME/operation=append
|
||||||
|
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/LLVM_HOME/value=/usr/lib/llvm-6.0
|
||||||
|
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/append=true
|
||||||
|
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/appendContributed=true
|
||||||
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171/LLVM_HOME/delimiter=\:
|
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171/LLVM_HOME/delimiter=\:
|
||||||
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171/LLVM_HOME/operation=append
|
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171/LLVM_HOME/operation=append
|
||||||
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171/LLVM_HOME/value=/usr/lib/llvm-6.0
|
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171/LLVM_HOME/value=/usr/lib/llvm-6.0
|
||||||
|
|
|
@ -7,6 +7,14 @@ environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.debug.175174
|
||||||
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.debug.1751741082/C_INCLUDE_PATH/operation=remove
|
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.debug.1751741082/C_INCLUDE_PATH/operation=remove
|
||||||
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.debug.1751741082/append=true
|
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.debug.1751741082/append=true
|
||||||
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.debug.1751741082/appendContributed=true
|
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.debug.1751741082/appendContributed=true
|
||||||
|
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/CPATH/delimiter=\:
|
||||||
|
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/CPATH/operation=remove
|
||||||
|
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/CPLUS_INCLUDE_PATH/delimiter=\:
|
||||||
|
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/CPLUS_INCLUDE_PATH/operation=remove
|
||||||
|
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/C_INCLUDE_PATH/delimiter=\:
|
||||||
|
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/C_INCLUDE_PATH/operation=remove
|
||||||
|
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/append=true
|
||||||
|
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/appendContributed=true
|
||||||
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171/CPATH/delimiter=\:
|
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171/CPATH/delimiter=\:
|
||||||
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171/CPATH/operation=remove
|
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171/CPATH/operation=remove
|
||||||
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171/CPLUS_INCLUDE_PATH/delimiter=\:
|
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171/CPLUS_INCLUDE_PATH/delimiter=\:
|
||||||
|
@ -19,6 +27,10 @@ environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.debug.175174
|
||||||
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.debug.1751741082/LIBRARY_PATH/operation=remove
|
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.debug.1751741082/LIBRARY_PATH/operation=remove
|
||||||
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.debug.1751741082/append=true
|
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.debug.1751741082/append=true
|
||||||
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.debug.1751741082/appendContributed=true
|
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.debug.1751741082/appendContributed=true
|
||||||
|
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/LIBRARY_PATH/delimiter=\:
|
||||||
|
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/LIBRARY_PATH/operation=remove
|
||||||
|
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/append=true
|
||||||
|
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/appendContributed=true
|
||||||
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.release.1745230171/LIBRARY_PATH/delimiter=\:
|
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.release.1745230171/LIBRARY_PATH/delimiter=\:
|
||||||
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.release.1745230171/LIBRARY_PATH/operation=remove
|
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.release.1745230171/LIBRARY_PATH/operation=remove
|
||||||
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.release.1745230171/append=true
|
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.release.1745230171/append=true
|
||||||
|
|
|
@ -26,7 +26,7 @@ set(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
|
|
||||||
include(CheckCXXCompilerFlag)
|
include(CheckCXXCompilerFlag)
|
||||||
CHECK_CXX_COMPILER_FLAG("-march=native" COMPILER_SUPPORTS_MARCH_NATIVE)
|
CHECK_CXX_COMPILER_FLAG("-march=native" COMPILER_SUPPORTS_MARCH_NATIVE)
|
||||||
if(COMPILER_SUPPORTS_MARCH_NATIVE)
|
if(NOT(${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo") AND COMPILER_SUPPORTS_MARCH_NATIVE)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
2
dbt-core
2
dbt-core
|
@ -1 +1 @@
|
||||||
Subproject commit 23dbab0b768d122c492110d1db34408e9ae787f3
|
Subproject commit b7e5fd5113ff8383668c4ad77b18b4370237f9f0
|
|
@ -23,6 +23,7 @@
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="DBT-RISE-RISCV"/>
|
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="DBT-RISE-RISCV"/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
|
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="cdt.managedbuild.config.gnu.exe.release.1745230171"/>
|
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="cdt.managedbuild.config.gnu.exe.release.1745230171"/>
|
||||||
|
<booleanAttribute key="org.eclipse.cdt.launch.use_terminal" value="true"/>
|
||||||
<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="/DBT-RISE-RISCV"/>
|
||||||
</listAttribute>
|
</listAttribute>
|
||||||
|
@ -30,5 +31,91 @@
|
||||||
<listEntry value="4"/>
|
<listEntry value="4"/>
|
||||||
</listAttribute>
|
</listAttribute>
|
||||||
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="reserved-for-future-use"/> "/>
|
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="reserved-for-future-use"/> "/>
|
||||||
|
<stringAttribute key="org.eclipse.linuxtools.callgraph.launch.ARGUMENTS" value=""/>
|
||||||
|
<stringAttribute key="org.eclipse.linuxtools.callgraph.launch.BINARY_ARGUMENTS" value=""/>
|
||||||
|
<stringAttribute key="org.eclipse.linuxtools.callgraph.launch.BINARY_PATH" value=""/>
|
||||||
|
<intAttribute key="org.eclipse.linuxtools.callgraph.launch.BUFFER_BYTES" value="0"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.callgraph.launch.BULK_MODE" value="false"/>
|
||||||
|
<intAttribute key="org.eclipse.linuxtools.callgraph.launch.COMMAND_VERBOSE" value="0"/>
|
||||||
|
<stringAttribute key="org.eclipse.linuxtools.callgraph.launch.C_DIRECTIVES" value=""/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.callgraph.launch.DISABLE_WARNINGS" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.callgraph.launch.GURU" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.callgraph.launch.IGNORE_DWARF" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.callgraph.launch.KEEP_TEMPORARY" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.callgraph.launch.LEAVE_RUNNING" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.callgraph.launch.NO_CODE_ELISION" value="false"/>
|
||||||
|
<stringAttribute key="org.eclipse.linuxtools.callgraph.launch.OUTPUT_PATH" value=""/>
|
||||||
|
<stringAttribute key="org.eclipse.linuxtools.callgraph.launch.PARSER_CLASS" value=""/>
|
||||||
|
<intAttribute key="org.eclipse.linuxtools.callgraph.launch.PASS" value="0"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.callgraph.launch.PROLOGUE_SEARCH" value="false"/>
|
||||||
|
<stringAttribute key="org.eclipse.linuxtools.callgraph.launch.SCRIPT_PATH" value=""/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.callgraph.launch.SKIP_BADVARS" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.callgraph.launch.TAPSET_COVERAGE" value="false"/>
|
||||||
|
<intAttribute key="org.eclipse.linuxtools.callgraph.launch.TARGET_PID" value="0"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.callgraph.launch.TIMING_INFO" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.callgraph.launch.USE_COLOUR" value="false"/>
|
||||||
|
<stringAttribute key="org.eclipse.linuxtools.callgraph.launch.VIEW_CLASS" value=""/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.DefaultEvent" value="true"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.HideUnresolvedSymbols" value="true"/>
|
||||||
|
<stringAttribute key="org.eclipse.linuxtools.internal.perf.attr.Kernel.Location" value=""/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Kernel.SourceLineNumbers" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ModuleSymbols" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.MultipleEvents" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Realtime" value="false"/>
|
||||||
|
<intAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Realtime.Priority" value="1"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Verbose" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ShowSourceDisassembly" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ShowStat" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.SourceLineNumbers" value="true"/>
|
||||||
|
<intAttribute key="org.eclipse.linuxtools.internal.perf.attr.StatRunCount" value="1"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.cachegrind.BRANCH_SIM" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.cachegrind.CACHE_SIM" value="true"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.cachegrind.D1" value="false"/>
|
||||||
|
<intAttribute key="org.eclipse.linuxtools.valgrind.cachegrind.D1_ASSOC" value="0"/>
|
||||||
|
<intAttribute key="org.eclipse.linuxtools.valgrind.cachegrind.D1_LSIZE" value="0"/>
|
||||||
|
<intAttribute key="org.eclipse.linuxtools.valgrind.cachegrind.D1_SIZE" value="0"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.cachegrind.I1" value="false"/>
|
||||||
|
<intAttribute key="org.eclipse.linuxtools.valgrind.cachegrind.I1_ASSOC" value="0"/>
|
||||||
|
<intAttribute key="org.eclipse.linuxtools.valgrind.cachegrind.I1_LSIZE" value="0"/>
|
||||||
|
<intAttribute key="org.eclipse.linuxtools.valgrind.cachegrind.I1_SIZE" value="0"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.cachegrind.L2" value="false"/>
|
||||||
|
<intAttribute key="org.eclipse.linuxtools.valgrind.cachegrind.L2_ASSOC" value="0"/>
|
||||||
|
<intAttribute key="org.eclipse.linuxtools.valgrind.cachegrind.L2_LSIZE" value="0"/>
|
||||||
|
<intAttribute key="org.eclipse.linuxtools.valgrind.cachegrind.L2_SIZE" value="0"/>
|
||||||
|
<intAttribute key="org.eclipse.linuxtools.valgrind.helgrind.HELGRIND_CACHESIZE" value="1000000"/>
|
||||||
|
<stringAttribute key="org.eclipse.linuxtools.valgrind.helgrind.HELGRIND_HISTORYLEVEL" value="full"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.helgrind.HELGRIND_LOCKORDERS" value="true"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.launch.FULLPATH_AFTER" value="true"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.launch.GENERAL_BELOWMAIN" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.launch.GENERAL_DEMANGLE" value="true"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.launch.GENERAL_DSYMUTIL" value="true"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.launch.GENERAL_ERRLIMIT" value="true"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.launch.GENERAL_FREERES" value="true"/>
|
||||||
|
<intAttribute key="org.eclipse.linuxtools.valgrind.launch.GENERAL_MAINSTACK" value="0"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.launch.GENERAL_MAINSTACK_BOOL" value="false"/>
|
||||||
|
<intAttribute key="org.eclipse.linuxtools.valgrind.launch.GENERAL_MAXFRAME" value="2000000"/>
|
||||||
|
<intAttribute key="org.eclipse.linuxtools.valgrind.launch.GENERAL_NUMCALLERS" value="12"/>
|
||||||
|
<stringAttribute key="org.eclipse.linuxtools.valgrind.launch.GENERAL_OTHER_OPTIONS" value=""/>
|
||||||
|
<listAttribute key="org.eclipse.linuxtools.valgrind.launch.GENERAL_SUPPFILES"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.launch.GENERAL_TRACECHILD" value="false"/>
|
||||||
|
<stringAttribute key="org.eclipse.linuxtools.valgrind.launch.OUTPUT_DIR" value="/home/eyck/workspaces/cdt/.metadata/.plugins/org.eclipse.linuxtools.valgrind.launch"/>
|
||||||
|
<stringAttribute key="org.eclipse.linuxtools.valgrind.launch.TOOL" value="org.eclipse.linuxtools.valgrind.launch.cachegrind"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.memcheck.MEMCHECK_ALIGNMENT_BOOL" value="false"/>
|
||||||
|
<intAttribute key="org.eclipse.linuxtools.valgrind.memcheck.MEMCHECK_ALIGNMENT_VAL" value="0"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.memcheck.MEMCHECK_FREEFILL_BOOL" value="false"/>
|
||||||
|
<stringAttribute key="org.eclipse.linuxtools.valgrind.memcheck.MEMCHECK_FREEFILL_VAL" value=""/>
|
||||||
|
<intAttribute key="org.eclipse.linuxtools.valgrind.memcheck.MEMCHECK_FREELIST" value="10000000"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.memcheck.MEMCHECK_GCCWORK" value="false"/>
|
||||||
|
<listAttribute key="org.eclipse.linuxtools.valgrind.memcheck.MEMCHECK_IGNORE_RANGES"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.memcheck.MEMCHECK_LEAKCHECK" value="true"/>
|
||||||
|
<stringAttribute key="org.eclipse.linuxtools.valgrind.memcheck.MEMCHECK_LEAKRES" value="high"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.memcheck.MEMCHECK_MALLOCFILL_BOOL" value="false"/>
|
||||||
|
<stringAttribute key="org.eclipse.linuxtools.valgrind.memcheck.MEMCHECK_MALLOCFILL_VAL" value=""/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.memcheck.MEMCHECK_PARTIAL" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.memcheck.MEMCHECK_POSSIBLY_LOST" value="true"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.memcheck.MEMCHECK_SHOWREACH" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.memcheck.MEMCHECK_TRACKORIGINS" value="false"/>
|
||||||
|
<booleanAttribute key="org.eclipse.linuxtools.valgrind.memcheck.MEMCHECK_UNDEF" value="true"/>
|
||||||
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
|
||||||
|
<stringAttribute key="provider" value="org.eclipse.linuxtools.profiling.provider.valgrind.cachegrind"/>
|
||||||
</launchConfiguration>
|
</launchConfiguration>
|
||||||
|
|
|
@ -35,7 +35,6 @@
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#include <boost/program_options.hpp>
|
#include <boost/program_options.hpp>
|
||||||
#include <iss/jit/MCJIThelper.h>
|
|
||||||
#include <iss/log_categories.h>
|
#include <iss/log_categories.h>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <sysc/SiFive/platform.h>
|
#include <sysc/SiFive/platform.h>
|
||||||
|
@ -44,6 +43,7 @@
|
||||||
#include "scc/scv_tr_db.h"
|
#include "scc/scv_tr_db.h"
|
||||||
#include "scc/tracer.h"
|
#include "scc/tracer.h"
|
||||||
#include <cci_utils/broker.h>
|
#include <cci_utils/broker.h>
|
||||||
|
#include <iss/jit/jit_helper.h>
|
||||||
|
|
||||||
using namespace sysc;
|
using namespace sysc;
|
||||||
namespace po = boost::program_options;
|
namespace po = boost::program_options;
|
||||||
|
|
|
@ -73,6 +73,7 @@ struct traits<${coreDef.name.toLowerCase()}> {
|
||||||
TRAP_STATE,
|
TRAP_STATE,
|
||||||
PENDING_TRAP,
|
PENDING_TRAP,
|
||||||
MACHINE_STATE,
|
MACHINE_STATE,
|
||||||
|
LAST_BRANCH,
|
||||||
ICOUNT
|
ICOUNT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -140,6 +141,9 @@ struct ${coreDef.name.toLowerCase()}: public arch_if {
|
||||||
|
|
||||||
virtual iss::sync_type needed_sync() const { return iss::NO_SYNC; }
|
virtual iss::sync_type needed_sync() const { return iss::NO_SYNC; }
|
||||||
|
|
||||||
|
inline
|
||||||
|
uint32_t get_last_branch(){return reg.last_branch;}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
struct ${coreDef.name}_regs {<%
|
struct ${coreDef.name}_regs {<%
|
||||||
allRegs.each { reg ->
|
allRegs.each { reg ->
|
||||||
|
@ -152,7 +156,7 @@ protected:
|
||||||
}
|
}
|
||||||
}%>
|
}%>
|
||||||
uint${generator.getSize(pc)}_t NEXT_${pc.name} = 0;
|
uint${generator.getSize(pc)}_t NEXT_${pc.name} = 0;
|
||||||
uint32_t trap_state = 0, pending_trap = 0, machine_state = 0;
|
uint32_t trap_state = 0, pending_trap = 0, machine_state = 0, last_branch = 0;
|
||||||
uint64_t icount = 0;
|
uint64_t icount = 0;
|
||||||
} reg;
|
} reg;
|
||||||
|
|
||||||
|
|
|
@ -92,8 +92,7 @@ protected:
|
||||||
vm::fp_impl::add_fp_functions_2_module(m, traits<ARCH>::FP_REGS_SIZE);
|
vm::fp_impl::add_fp_functions_2_module(m, traits<ARCH>::FP_REGS_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline llvm::Value *gen_choose(llvm::Value *cond, llvm::Value *trueVal, llvm::Value *falseVal,
|
inline llvm::Value *gen_choose(llvm::Value *cond, llvm::Value *trueVal, llvm::Value *falseVal, unsigned size) {
|
||||||
unsigned size) const {
|
|
||||||
return super::gen_cond_assign(cond, this->gen_ext(trueVal, size), this->gen_ext(falseVal, size));
|
return super::gen_cond_assign(cond, this->gen_ext(trueVal, size), this->gen_ext(falseVal, size));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -266,7 +265,6 @@ vm_impl<ARCH>::gen_single_inst_behavior(virt_addr_t &pc, unsigned int &inst_cnt,
|
||||||
}
|
}
|
||||||
if (insn == 0x0000006f || (insn&0xffff)==0xa001) throw simulation_stopped(0); // 'J 0' or 'C.J 0'
|
if (insn == 0x0000006f || (insn&0xffff)==0xa001) throw simulation_stopped(0); // 'J 0' or 'C.J 0'
|
||||||
// curr pc on stack
|
// curr pc on stack
|
||||||
typename vm_impl<ARCH>::processing_pc_entry addr(*this, pc, paddr);
|
|
||||||
++inst_cnt;
|
++inst_cnt;
|
||||||
auto lut_val = extract_fields(insn);
|
auto lut_val = extract_fields(insn);
|
||||||
auto f = qlut[insn & 0x3][lut_val];
|
auto f = qlut[insn & 0x3][lut_val];
|
||||||
|
@ -284,6 +282,7 @@ template <typename ARCH> void vm_impl<ARCH>::gen_leave_behavior(llvm::BasicBlock
|
||||||
template <typename ARCH> void vm_impl<ARCH>::gen_raise_trap(uint16_t trap_id, uint16_t cause) {
|
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);
|
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(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) {
|
template <typename ARCH> void vm_impl<ARCH>::gen_leave_trap(unsigned lvl) {
|
||||||
|
@ -293,6 +292,7 @@ template <typename ARCH> void vm_impl<ARCH>::gen_leave_trap(unsigned lvl) {
|
||||||
this->builder.CreateCall(this->mod->getFunction("leave_trap"), args);
|
this->builder.CreateCall(this->mod->getFunction("leave_trap"), args);
|
||||||
auto *PC_val = this->gen_read_mem(traits<ARCH>::CSR, (lvl << 8) + 0x41, traits<ARCH>::XLEN / 8);
|
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(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) {
|
template <typename ARCH> void vm_impl<ARCH>::gen_wait(unsigned type) {
|
||||||
|
@ -305,7 +305,10 @@ template <typename ARCH> void vm_impl<ARCH>::gen_wait(unsigned type) {
|
||||||
template <typename ARCH> void vm_impl<ARCH>::gen_trap_behavior(llvm::BasicBlock *trap_blk) {
|
template <typename ARCH> void vm_impl<ARCH>::gen_trap_behavior(llvm::BasicBlock *trap_blk) {
|
||||||
this->builder.SetInsertPoint(trap_blk);
|
this->builder.SetInsertPoint(trap_blk);
|
||||||
auto *trap_state_val = this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::TRAP_STATE), true);
|
auto *trap_state_val = this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::TRAP_STATE), true);
|
||||||
std::vector<llvm::Value *> args{this->core_ptr, this->adj_to64(trap_state_val),
|
this->builder.CreateStore(this->gen_const(32U, std::numeric_limits<uint32_t>::max()), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
|
std::vector<llvm::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->adj_to64(this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::PC), false))};
|
||||||
this->builder.CreateCall(this->mod->getFunction("enter_trap"), args);
|
this->builder.CreateCall(this->mod->getFunction("enter_trap"), args);
|
||||||
auto *trap_addr_val = this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
auto *trap_addr_val = this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
|
|
@ -50,6 +50,9 @@
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
|
#define likely(x) __builtin_expect(!!(x), 1)
|
||||||
|
#define unlikely(x) __builtin_expect(!!(x), 0)
|
||||||
|
|
||||||
namespace iss {
|
namespace iss {
|
||||||
namespace arch {
|
namespace arch {
|
||||||
|
|
||||||
|
@ -647,14 +650,14 @@ iss::status riscv_hart_msu_vp<BASE>::read(const iss::addr_t &addr, unsigned leng
|
||||||
try {
|
try {
|
||||||
switch (addr.space) {
|
switch (addr.space) {
|
||||||
case traits<BASE>::MEM: {
|
case traits<BASE>::MEM: {
|
||||||
if ((addr.access == iss::access_type::FETCH || addr.access == iss::access_type::DEBUG_FETCH) && (addr.val & 0x1) == 1) {
|
if (unlikely((addr.access == iss::access_type::FETCH || addr.access == iss::access_type::DEBUG_FETCH) && (addr.val & 0x1) == 1)) {
|
||||||
fault_data = addr.val;
|
fault_data = addr.val;
|
||||||
if (addr.access && iss::access_type::DEBUG) throw trap_access(0, addr.val);
|
if (addr.access && iss::access_type::DEBUG) throw trap_access(0, addr.val);
|
||||||
this->reg.trap_state = (1 << 31); // issue trap 0
|
this->reg.trap_state = (1 << 31); // issue trap 0
|
||||||
return iss::Err;
|
return iss::Err;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
if ((addr.val & ~PGMASK) != ((addr.val + length - 1) & ~PGMASK)) { // we may cross a page boundary
|
if (unlikely((addr.val & ~PGMASK) != ((addr.val + length - 1) & ~PGMASK))) { // we may cross a page boundary
|
||||||
vm_info vm = hart_state<reg_t>::decode_vm_info(this->reg.machine_state, state.satp);
|
vm_info vm = hart_state<reg_t>::decode_vm_info(this->reg.machine_state, state.satp);
|
||||||
if (vm.levels != 0) { // VM is active
|
if (vm.levels != 0) { // VM is active
|
||||||
auto split_addr = (addr.val + length) & ~PGMASK;
|
auto split_addr = (addr.val + length) & ~PGMASK;
|
||||||
|
@ -666,7 +669,7 @@ iss::status riscv_hart_msu_vp<BASE>::read(const iss::addr_t &addr, unsigned leng
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto res = read_mem( BASE::v2p(addr), length, data);
|
auto res = read_mem( BASE::v2p(addr), length, data);
|
||||||
if (res != iss::Ok) this->reg.trap_state = (1 << 31) | (5 << 16); // issue trap 5 (load access fault
|
if (unlikely(res != iss::Ok)) this->reg.trap_state = (1 << 31) | (5 << 16); // issue trap 5 (load access fault
|
||||||
return res;
|
return res;
|
||||||
} catch (trap_access &ta) {
|
} catch (trap_access &ta) {
|
||||||
this->reg.trap_state = (1 << 31) | ta.id;
|
this->reg.trap_state = (1 << 31) | ta.id;
|
||||||
|
@ -738,14 +741,14 @@ iss::status riscv_hart_msu_vp<BASE>::write(const iss::addr_t &addr, unsigned len
|
||||||
try {
|
try {
|
||||||
switch (addr.space) {
|
switch (addr.space) {
|
||||||
case traits<BASE>::MEM: {
|
case traits<BASE>::MEM: {
|
||||||
if ((addr.access && iss::access_type::FETCH) && (addr.val & 0x1) == 1) {
|
if (unlikely((addr.access && iss::access_type::FETCH) && (addr.val & 0x1) == 1)) {
|
||||||
fault_data = addr.val;
|
fault_data = addr.val;
|
||||||
if (addr.access && iss::access_type::DEBUG) throw trap_access(0, addr.val);
|
if (addr.access && iss::access_type::DEBUG) throw trap_access(0, addr.val);
|
||||||
this->reg.trap_state = (1 << 31); // issue trap 0
|
this->reg.trap_state = (1 << 31); // issue trap 0
|
||||||
return iss::Err;
|
return iss::Err;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
if ((addr.val & ~PGMASK) != ((addr.val + length - 1) & ~PGMASK)) { // we may cross a page boundary
|
if (unlikely((addr.val & ~PGMASK) != ((addr.val + length - 1) & ~PGMASK))) { // we may cross a page boundary
|
||||||
vm_info vm = hart_state<reg_t>::decode_vm_info(this->reg.machine_state, state.satp);
|
vm_info vm = hart_state<reg_t>::decode_vm_info(this->reg.machine_state, state.satp);
|
||||||
if (vm.levels != 0) { // VM is active
|
if (vm.levels != 0) { // VM is active
|
||||||
auto split_addr = (addr.val + length) & ~PGMASK;
|
auto split_addr = (addr.val + length) & ~PGMASK;
|
||||||
|
@ -757,7 +760,7 @@ iss::status riscv_hart_msu_vp<BASE>::write(const iss::addr_t &addr, unsigned len
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto res = write_mem(BASE::v2p(addr), length, data);
|
auto res = write_mem(BASE::v2p(addr), length, data);
|
||||||
if (res != iss::Ok) this->reg.trap_state = (1 << 31) | (5 << 16); // issue trap 7 (Store/AMO access fault)
|
if (unlikely(res != iss::Ok)) this->reg.trap_state = (1 << 31) | (5 << 16); // issue trap 7 (Store/AMO access fault)
|
||||||
return res;
|
return res;
|
||||||
} catch (trap_access &ta) {
|
} catch (trap_access &ta) {
|
||||||
this->reg.trap_state = (1 << 31) | ta.id;
|
this->reg.trap_state = (1 << 31) | ta.id;
|
||||||
|
|
|
@ -124,6 +124,7 @@ struct traits<rv32gc> {
|
||||||
TRAP_STATE,
|
TRAP_STATE,
|
||||||
PENDING_TRAP,
|
PENDING_TRAP,
|
||||||
MACHINE_STATE,
|
MACHINE_STATE,
|
||||||
|
LAST_BRANCH,
|
||||||
ICOUNT
|
ICOUNT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -138,12 +139,12 @@ struct traits<rv32gc> {
|
||||||
using phys_addr_t = iss::typed_addr_t<iss::address_type::PHYSICAL>;
|
using phys_addr_t = iss::typed_addr_t<iss::address_type::PHYSICAL>;
|
||||||
|
|
||||||
constexpr static unsigned reg_bit_width(unsigned r) {
|
constexpr static unsigned reg_bit_width(unsigned r) {
|
||||||
constexpr std::array<const uint32_t, 71> RV32GC_reg_size{{32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,32,32,32,32,32,64}};
|
constexpr std::array<const uint32_t, 72> RV32GC_reg_size{{32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,32,32,32,32,32,32,64}};
|
||||||
return RV32GC_reg_size[r];
|
return RV32GC_reg_size[r];
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr static unsigned reg_byte_offset(unsigned r) {
|
constexpr static unsigned reg_byte_offset(unsigned r) {
|
||||||
constexpr std::array<const uint32_t, 72> RV32GC_reg_byte_offset{{0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,256,264,272,280,288,296,304,312,320,328,336,344,352,360,368,376,384,392,396,400,404,408,416,424}};
|
constexpr std::array<const uint32_t, 73> RV32GC_reg_byte_offset{{0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,256,264,272,280,288,296,304,312,320,328,336,344,352,360,368,376,384,392,396,400,404,408,412,416,424}};
|
||||||
return RV32GC_reg_byte_offset[r];
|
return RV32GC_reg_byte_offset[r];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,6 +192,9 @@ struct rv32gc: public arch_if {
|
||||||
|
|
||||||
virtual iss::sync_type needed_sync() const { return iss::NO_SYNC; }
|
virtual iss::sync_type needed_sync() const { return iss::NO_SYNC; }
|
||||||
|
|
||||||
|
inline
|
||||||
|
uint32_t get_last_branch(){return reg.last_branch;}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
struct RV32GC_regs {
|
struct RV32GC_regs {
|
||||||
uint32_t X0 = 0;
|
uint32_t X0 = 0;
|
||||||
|
@ -260,7 +264,7 @@ protected:
|
||||||
uint64_t F31 = 0;
|
uint64_t F31 = 0;
|
||||||
uint32_t FCSR = 0;
|
uint32_t FCSR = 0;
|
||||||
uint32_t NEXT_PC = 0;
|
uint32_t NEXT_PC = 0;
|
||||||
uint32_t trap_state = 0, pending_trap = 0, machine_state = 0;
|
uint32_t trap_state = 0, pending_trap = 0, machine_state = 0, last_branch = 0;
|
||||||
uint64_t icount = 0;
|
uint64_t icount = 0;
|
||||||
} reg;
|
} reg;
|
||||||
|
|
||||||
|
|
|
@ -91,6 +91,7 @@ struct traits<rv32imac> {
|
||||||
TRAP_STATE,
|
TRAP_STATE,
|
||||||
PENDING_TRAP,
|
PENDING_TRAP,
|
||||||
MACHINE_STATE,
|
MACHINE_STATE,
|
||||||
|
LAST_BRANCH,
|
||||||
ICOUNT
|
ICOUNT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -105,12 +106,12 @@ struct traits<rv32imac> {
|
||||||
using phys_addr_t = iss::typed_addr_t<iss::address_type::PHYSICAL>;
|
using phys_addr_t = iss::typed_addr_t<iss::address_type::PHYSICAL>;
|
||||||
|
|
||||||
constexpr static unsigned reg_bit_width(unsigned r) {
|
constexpr static unsigned reg_bit_width(unsigned r) {
|
||||||
constexpr std::array<const uint32_t, 38> RV32IMAC_reg_size{{32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,64}};
|
constexpr std::array<const uint32_t, 39> RV32IMAC_reg_size{{32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,64}};
|
||||||
return RV32IMAC_reg_size[r];
|
return RV32IMAC_reg_size[r];
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr static unsigned reg_byte_offset(unsigned r) {
|
constexpr static unsigned reg_byte_offset(unsigned r) {
|
||||||
constexpr std::array<const uint32_t, 39> RV32IMAC_reg_byte_offset{{0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,152,160}};
|
constexpr std::array<const uint32_t, 40> RV32IMAC_reg_byte_offset{{0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,160}};
|
||||||
return RV32IMAC_reg_byte_offset[r];
|
return RV32IMAC_reg_byte_offset[r];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,6 +159,9 @@ struct rv32imac: public arch_if {
|
||||||
|
|
||||||
virtual iss::sync_type needed_sync() const { return iss::NO_SYNC; }
|
virtual iss::sync_type needed_sync() const { return iss::NO_SYNC; }
|
||||||
|
|
||||||
|
inline
|
||||||
|
uint32_t get_last_branch(){return reg.last_branch;}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
struct RV32IMAC_regs {
|
struct RV32IMAC_regs {
|
||||||
uint32_t X0 = 0;
|
uint32_t X0 = 0;
|
||||||
|
@ -194,7 +198,7 @@ protected:
|
||||||
uint32_t X31 = 0;
|
uint32_t X31 = 0;
|
||||||
uint32_t PC = 0;
|
uint32_t PC = 0;
|
||||||
uint32_t NEXT_PC = 0;
|
uint32_t NEXT_PC = 0;
|
||||||
uint32_t trap_state = 0, pending_trap = 0, machine_state = 0;
|
uint32_t trap_state = 0, pending_trap = 0, machine_state = 0, last_branch = 0;
|
||||||
uint64_t icount = 0;
|
uint64_t icount = 0;
|
||||||
} reg;
|
} reg;
|
||||||
|
|
||||||
|
|
|
@ -91,6 +91,7 @@ struct traits<rv64ia> {
|
||||||
TRAP_STATE,
|
TRAP_STATE,
|
||||||
PENDING_TRAP,
|
PENDING_TRAP,
|
||||||
MACHINE_STATE,
|
MACHINE_STATE,
|
||||||
|
LAST_BRANCH,
|
||||||
ICOUNT
|
ICOUNT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -105,12 +106,12 @@ struct traits<rv64ia> {
|
||||||
using phys_addr_t = iss::typed_addr_t<iss::address_type::PHYSICAL>;
|
using phys_addr_t = iss::typed_addr_t<iss::address_type::PHYSICAL>;
|
||||||
|
|
||||||
constexpr static unsigned reg_bit_width(unsigned r) {
|
constexpr static unsigned reg_bit_width(unsigned r) {
|
||||||
constexpr std::array<const uint32_t, 38> RV64IA_reg_size{{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,64}};
|
constexpr std::array<const uint32_t, 39> RV64IA_reg_size{{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}};
|
||||||
return RV64IA_reg_size[r];
|
return RV64IA_reg_size[r];
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr static unsigned reg_byte_offset(unsigned r) {
|
constexpr static unsigned reg_byte_offset(unsigned r) {
|
||||||
constexpr std::array<const uint32_t, 39> RV64IA_reg_byte_offset{{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,288,296}};
|
constexpr std::array<const uint32_t, 40> RV64IA_reg_byte_offset{{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}};
|
||||||
return RV64IA_reg_byte_offset[r];
|
return RV64IA_reg_byte_offset[r];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,6 +159,9 @@ struct rv64ia: public arch_if {
|
||||||
|
|
||||||
virtual iss::sync_type needed_sync() const { return iss::NO_SYNC; }
|
virtual iss::sync_type needed_sync() const { return iss::NO_SYNC; }
|
||||||
|
|
||||||
|
inline
|
||||||
|
uint32_t get_last_branch(){return reg.last_branch;}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
struct RV64IA_regs {
|
struct RV64IA_regs {
|
||||||
uint64_t X0 = 0;
|
uint64_t X0 = 0;
|
||||||
|
@ -194,7 +198,7 @@ protected:
|
||||||
uint64_t X31 = 0;
|
uint64_t X31 = 0;
|
||||||
uint64_t PC = 0;
|
uint64_t PC = 0;
|
||||||
uint64_t NEXT_PC = 0;
|
uint64_t NEXT_PC = 0;
|
||||||
uint32_t trap_state = 0, pending_trap = 0, machine_state = 0;
|
uint32_t trap_state = 0, pending_trap = 0, machine_state = 0, last_branch = 0;
|
||||||
uint64_t icount = 0;
|
uint64_t icount = 0;
|
||||||
} reg;
|
} reg;
|
||||||
|
|
||||||
|
|
|
@ -92,8 +92,7 @@ protected:
|
||||||
vm::fp_impl::add_fp_functions_2_module(m, traits<ARCH>::FP_REGS_SIZE);
|
vm::fp_impl::add_fp_functions_2_module(m, traits<ARCH>::FP_REGS_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline llvm::Value *gen_choose(llvm::Value *cond, llvm::Value *trueVal, llvm::Value *falseVal,
|
inline llvm::Value *gen_choose(llvm::Value *cond, llvm::Value *trueVal, llvm::Value *falseVal, unsigned size) {
|
||||||
unsigned size) const {
|
|
||||||
return super::gen_cond_assign(cond, this->gen_ext(trueVal, size), this->gen_ext(falseVal, size));
|
return super::gen_cond_assign(cond, this->gen_ext(trueVal, size), this->gen_ext(falseVal, size));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -619,6 +618,8 @@ private:
|
||||||
32, true),
|
32, true),
|
||||||
this->gen_const(32U, fld_imm_val));
|
this->gen_const(32U, fld_imm_val));
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 2);
|
this->gen_sync(iss::POST_SYNC, 2);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -664,7 +665,7 @@ private:
|
||||||
this->gen_cond_branch(this->builder.CreateICmp(
|
this->gen_cond_branch(this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_NE,
|
ICmpInst::ICMP_NE,
|
||||||
align_val,
|
align_val,
|
||||||
this->gen_const(64U, 0)),
|
this->gen_const(32U, 0)),
|
||||||
bb_then,
|
bb_then,
|
||||||
bb_else);
|
bb_else);
|
||||||
this->builder.SetInsertPoint(bb_then);
|
this->builder.SetInsertPoint(bb_then);
|
||||||
|
@ -684,6 +685,7 @@ private:
|
||||||
new_pc_val,
|
new_pc_val,
|
||||||
this->builder.CreateNot(this->gen_const(32U, 0x1)));
|
this->builder.CreateNot(this->gen_const(32U, 0x1)));
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
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);
|
||||||
}
|
}
|
||||||
this->builder.CreateBr(bbnext);
|
this->builder.CreateBr(bbnext);
|
||||||
bb=bbnext;
|
bb=bbnext;
|
||||||
|
@ -733,6 +735,8 @@ private:
|
||||||
this->gen_const(32U, 4)),
|
this->gen_const(32U, 4)),
|
||||||
32);
|
32);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 4);
|
this->gen_sync(iss::POST_SYNC, 4);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -777,6 +781,8 @@ private:
|
||||||
this->gen_const(32U, 4)),
|
this->gen_const(32U, 4)),
|
||||||
32);
|
32);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 5);
|
this->gen_sync(iss::POST_SYNC, 5);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -825,6 +831,8 @@ private:
|
||||||
this->gen_const(32U, 4)),
|
this->gen_const(32U, 4)),
|
||||||
32);
|
32);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 6);
|
this->gen_sync(iss::POST_SYNC, 6);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -873,6 +881,8 @@ private:
|
||||||
this->gen_const(32U, 4)),
|
this->gen_const(32U, 4)),
|
||||||
32);
|
32);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 7);
|
this->gen_sync(iss::POST_SYNC, 7);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -917,6 +927,8 @@ private:
|
||||||
this->gen_const(32U, 4)),
|
this->gen_const(32U, 4)),
|
||||||
32);
|
32);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 8);
|
this->gen_sync(iss::POST_SYNC, 8);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -961,6 +973,8 @@ private:
|
||||||
this->gen_const(32U, 4)),
|
this->gen_const(32U, 4)),
|
||||||
32);
|
32);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 9);
|
this->gen_sync(iss::POST_SYNC, 9);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -2126,6 +2140,7 @@ private:
|
||||||
traits<ARCH>::FENCE,
|
traits<ARCH>::FENCE,
|
||||||
this->gen_const(64U, 1),
|
this->gen_const(64U, 1),
|
||||||
this->builder.CreateZExtOrTrunc(FENCEtmp0_val,this->get_type(32)));
|
this->builder.CreateZExtOrTrunc(FENCEtmp0_val,this->get_type(32)));
|
||||||
|
this->builder.CreateStore(this->gen_const(32U, std::numeric_limits<uint32_t>::max()), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_set_pc(pc, traits<ARCH>::NEXT_PC);
|
this->gen_set_pc(pc, traits<ARCH>::NEXT_PC);
|
||||||
this->gen_sync(iss::POST_SYNC, 38);
|
this->gen_sync(iss::POST_SYNC, 38);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
|
@ -2834,7 +2849,7 @@ private:
|
||||||
this->gen_cond_branch(this->builder.CreateICmp(
|
this->gen_cond_branch(this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_NE,
|
ICmpInst::ICMP_NE,
|
||||||
this->gen_reg_load(fld_rs2_val + traits<ARCH>::X0, 0),
|
this->gen_reg_load(fld_rs2_val + traits<ARCH>::X0, 0),
|
||||||
this->gen_const(64U, 0)),
|
this->gen_const(32U, 0)),
|
||||||
bb_then,
|
bb_then,
|
||||||
bb_else);
|
bb_else);
|
||||||
this->builder.SetInsertPoint(bb_then);
|
this->builder.SetInsertPoint(bb_then);
|
||||||
|
@ -2963,7 +2978,7 @@ private:
|
||||||
this->gen_cond_branch(this->builder.CreateICmp(
|
this->gen_cond_branch(this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_NE,
|
ICmpInst::ICMP_NE,
|
||||||
this->gen_reg_load(fld_rs2_val + traits<ARCH>::X0, 0),
|
this->gen_reg_load(fld_rs2_val + traits<ARCH>::X0, 0),
|
||||||
this->gen_const(64U, 0)),
|
this->gen_const(32U, 0)),
|
||||||
bb_then,
|
bb_then,
|
||||||
bb_else);
|
bb_else);
|
||||||
this->builder.SetInsertPoint(bb_then);
|
this->builder.SetInsertPoint(bb_then);
|
||||||
|
@ -3030,7 +3045,7 @@ private:
|
||||||
this->gen_cond_branch(this->builder.CreateICmp(
|
this->gen_cond_branch(this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_NE,
|
ICmpInst::ICMP_NE,
|
||||||
this->gen_reg_load(fld_rs2_val + traits<ARCH>::X0, 0),
|
this->gen_reg_load(fld_rs2_val + traits<ARCH>::X0, 0),
|
||||||
this->gen_const(64U, 0)),
|
this->gen_const(32U, 0)),
|
||||||
bb_then,
|
bb_then,
|
||||||
bb_else);
|
bb_else);
|
||||||
this->builder.SetInsertPoint(bb_then);
|
this->builder.SetInsertPoint(bb_then);
|
||||||
|
@ -3163,7 +3178,7 @@ private:
|
||||||
this->gen_cond_branch(this->builder.CreateICmp(
|
this->gen_cond_branch(this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_NE,
|
ICmpInst::ICMP_NE,
|
||||||
this->gen_reg_load(fld_rs2_val + traits<ARCH>::X0, 0),
|
this->gen_reg_load(fld_rs2_val + traits<ARCH>::X0, 0),
|
||||||
this->gen_const(64U, 0)),
|
this->gen_const(32U, 0)),
|
||||||
bb_then,
|
bb_then,
|
||||||
bb_else);
|
bb_else);
|
||||||
this->builder.SetInsertPoint(bb_then);
|
this->builder.SetInsertPoint(bb_then);
|
||||||
|
@ -3280,7 +3295,7 @@ private:
|
||||||
this->gen_cond_branch(this->builder.CreateICmp(
|
this->gen_cond_branch(this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_NE,
|
ICmpInst::ICMP_NE,
|
||||||
res1_val,
|
res1_val,
|
||||||
this->gen_const(64U, 0)),
|
this->gen_const(32U, 0)),
|
||||||
bb_then,
|
bb_then,
|
||||||
bbnext);
|
bbnext);
|
||||||
this->builder.SetInsertPoint(bb_then);
|
this->builder.SetInsertPoint(bb_then);
|
||||||
|
@ -3995,6 +4010,8 @@ private:
|
||||||
32, true),
|
32, true),
|
||||||
this->gen_const(32U, fld_imm_val));
|
this->gen_const(32U, fld_imm_val));
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 76);
|
this->gen_sync(iss::POST_SYNC, 76);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -4381,6 +4398,8 @@ private:
|
||||||
32, true),
|
32, true),
|
||||||
this->gen_const(32U, fld_imm_val));
|
this->gen_const(32U, fld_imm_val));
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 87);
|
this->gen_sync(iss::POST_SYNC, 87);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -4424,6 +4443,8 @@ private:
|
||||||
this->gen_const(32U, 2)),
|
this->gen_const(32U, 2)),
|
||||||
32);
|
32);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 88);
|
this->gen_sync(iss::POST_SYNC, 88);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -4467,6 +4488,8 @@ private:
|
||||||
this->gen_const(32U, 2)),
|
this->gen_const(32U, 2)),
|
||||||
32);
|
32);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 89);
|
this->gen_sync(iss::POST_SYNC, 89);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -4600,6 +4623,7 @@ private:
|
||||||
|
|
||||||
Value* PC_val = this->gen_reg_load(fld_rs1_val + traits<ARCH>::X0, 0);
|
Value* PC_val = this->gen_reg_load(fld_rs1_val + traits<ARCH>::X0, 0);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
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);
|
||||||
this->gen_sync(iss::POST_SYNC, 93);
|
this->gen_sync(iss::POST_SYNC, 93);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -4667,6 +4691,7 @@ private:
|
||||||
this->builder.CreateStore(Xtmp0_val, get_reg_ptr(1 + traits<ARCH>::X0), false);
|
this->builder.CreateStore(Xtmp0_val, get_reg_ptr(1 + traits<ARCH>::X0), false);
|
||||||
Value* PC_val = this->gen_reg_load(fld_rs1_val + traits<ARCH>::X0, 0);
|
Value* PC_val = this->gen_reg_load(fld_rs1_val + traits<ARCH>::X0, 0);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
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);
|
||||||
this->gen_sync(iss::POST_SYNC, 95);
|
this->gen_sync(iss::POST_SYNC, 95);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -4906,8 +4931,8 @@ private:
|
||||||
this->gen_choose(
|
this->gen_choose(
|
||||||
this->builder.CreateICmp(
|
this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_ULT,
|
ICmpInst::ICMP_ULT,
|
||||||
this->gen_const(64U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->gen_const(64U, 7)),
|
this->gen_const(8U, 7)),
|
||||||
this->gen_const(8U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->builder.CreateTrunc(
|
this->builder.CreateTrunc(
|
||||||
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
||||||
|
@ -4991,8 +5016,8 @@ private:
|
||||||
this->gen_choose(
|
this->gen_choose(
|
||||||
this->builder.CreateICmp(
|
this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_ULT,
|
ICmpInst::ICMP_ULT,
|
||||||
this->gen_const(64U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->gen_const(64U, 7)),
|
this->gen_const(8U, 7)),
|
||||||
this->gen_const(8U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->builder.CreateTrunc(
|
this->builder.CreateTrunc(
|
||||||
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
||||||
|
@ -5076,8 +5101,8 @@ private:
|
||||||
this->gen_choose(
|
this->gen_choose(
|
||||||
this->builder.CreateICmp(
|
this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_ULT,
|
ICmpInst::ICMP_ULT,
|
||||||
this->gen_const(64U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->gen_const(64U, 7)),
|
this->gen_const(8U, 7)),
|
||||||
this->gen_const(8U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->builder.CreateTrunc(
|
this->builder.CreateTrunc(
|
||||||
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
||||||
|
@ -5161,8 +5186,8 @@ private:
|
||||||
this->gen_choose(
|
this->gen_choose(
|
||||||
this->builder.CreateICmp(
|
this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_ULT,
|
ICmpInst::ICMP_ULT,
|
||||||
this->gen_const(64U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->gen_const(64U, 7)),
|
this->gen_const(8U, 7)),
|
||||||
this->gen_const(8U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->builder.CreateTrunc(
|
this->builder.CreateTrunc(
|
||||||
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
||||||
|
@ -5237,8 +5262,8 @@ private:
|
||||||
this->gen_choose(
|
this->gen_choose(
|
||||||
this->builder.CreateICmp(
|
this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_ULT,
|
ICmpInst::ICMP_ULT,
|
||||||
this->gen_const(64U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->gen_const(64U, 7)),
|
this->gen_const(8U, 7)),
|
||||||
this->gen_const(8U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->builder.CreateTrunc(
|
this->builder.CreateTrunc(
|
||||||
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
||||||
|
@ -5313,8 +5338,8 @@ private:
|
||||||
this->gen_choose(
|
this->gen_choose(
|
||||||
this->builder.CreateICmp(
|
this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_ULT,
|
ICmpInst::ICMP_ULT,
|
||||||
this->gen_const(64U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->gen_const(64U, 7)),
|
this->gen_const(8U, 7)),
|
||||||
this->gen_const(8U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->builder.CreateTrunc(
|
this->builder.CreateTrunc(
|
||||||
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
||||||
|
@ -5389,8 +5414,8 @@ private:
|
||||||
this->gen_choose(
|
this->gen_choose(
|
||||||
this->builder.CreateICmp(
|
this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_ULT,
|
ICmpInst::ICMP_ULT,
|
||||||
this->gen_const(64U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->gen_const(64U, 7)),
|
this->gen_const(8U, 7)),
|
||||||
this->gen_const(8U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->builder.CreateTrunc(
|
this->builder.CreateTrunc(
|
||||||
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
||||||
|
@ -5465,8 +5490,8 @@ private:
|
||||||
this->gen_choose(
|
this->gen_choose(
|
||||||
this->builder.CreateICmp(
|
this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_ULT,
|
ICmpInst::ICMP_ULT,
|
||||||
this->gen_const(64U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->gen_const(64U, 7)),
|
this->gen_const(8U, 7)),
|
||||||
this->gen_const(8U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->builder.CreateTrunc(
|
this->builder.CreateTrunc(
|
||||||
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
||||||
|
@ -5536,8 +5561,8 @@ private:
|
||||||
this->gen_choose(
|
this->gen_choose(
|
||||||
this->builder.CreateICmp(
|
this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_ULT,
|
ICmpInst::ICMP_ULT,
|
||||||
this->gen_const(64U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->gen_const(64U, 7)),
|
this->gen_const(8U, 7)),
|
||||||
this->gen_const(8U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->builder.CreateTrunc(
|
this->builder.CreateTrunc(
|
||||||
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
||||||
|
@ -6711,8 +6736,8 @@ private:
|
||||||
this->gen_choose(
|
this->gen_choose(
|
||||||
this->builder.CreateICmp(
|
this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_ULT,
|
ICmpInst::ICMP_ULT,
|
||||||
this->gen_const(64U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->gen_const(64U, 7)),
|
this->gen_const(8U, 7)),
|
||||||
this->gen_const(8U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->builder.CreateTrunc(
|
this->builder.CreateTrunc(
|
||||||
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
||||||
|
@ -6793,8 +6818,8 @@ private:
|
||||||
this->gen_choose(
|
this->gen_choose(
|
||||||
this->builder.CreateICmp(
|
this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_ULT,
|
ICmpInst::ICMP_ULT,
|
||||||
this->gen_const(64U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->gen_const(64U, 7)),
|
this->gen_const(8U, 7)),
|
||||||
this->gen_const(8U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->builder.CreateTrunc(
|
this->builder.CreateTrunc(
|
||||||
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
||||||
|
@ -6875,8 +6900,8 @@ private:
|
||||||
this->gen_choose(
|
this->gen_choose(
|
||||||
this->builder.CreateICmp(
|
this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_ULT,
|
ICmpInst::ICMP_ULT,
|
||||||
this->gen_const(64U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->gen_const(64U, 7)),
|
this->gen_const(8U, 7)),
|
||||||
this->gen_const(8U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->builder.CreateTrunc(
|
this->builder.CreateTrunc(
|
||||||
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
||||||
|
@ -6957,8 +6982,8 @@ private:
|
||||||
this->gen_choose(
|
this->gen_choose(
|
||||||
this->builder.CreateICmp(
|
this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_ULT,
|
ICmpInst::ICMP_ULT,
|
||||||
this->gen_const(64U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->gen_const(64U, 7)),
|
this->gen_const(8U, 7)),
|
||||||
this->gen_const(8U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->builder.CreateTrunc(
|
this->builder.CreateTrunc(
|
||||||
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
||||||
|
@ -7030,8 +7055,8 @@ private:
|
||||||
this->gen_choose(
|
this->gen_choose(
|
||||||
this->builder.CreateICmp(
|
this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_ULT,
|
ICmpInst::ICMP_ULT,
|
||||||
this->gen_const(64U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->gen_const(64U, 7)),
|
this->gen_const(8U, 7)),
|
||||||
this->gen_const(8U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->builder.CreateTrunc(
|
this->builder.CreateTrunc(
|
||||||
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
||||||
|
@ -7103,8 +7128,8 @@ private:
|
||||||
this->gen_choose(
|
this->gen_choose(
|
||||||
this->builder.CreateICmp(
|
this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_ULT,
|
ICmpInst::ICMP_ULT,
|
||||||
this->gen_const(64U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->gen_const(64U, 7)),
|
this->gen_const(8U, 7)),
|
||||||
this->gen_const(8U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->builder.CreateTrunc(
|
this->builder.CreateTrunc(
|
||||||
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
||||||
|
@ -7176,8 +7201,8 @@ private:
|
||||||
this->gen_choose(
|
this->gen_choose(
|
||||||
this->builder.CreateICmp(
|
this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_ULT,
|
ICmpInst::ICMP_ULT,
|
||||||
this->gen_const(64U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->gen_const(64U, 7)),
|
this->gen_const(8U, 7)),
|
||||||
this->gen_const(8U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->builder.CreateTrunc(
|
this->builder.CreateTrunc(
|
||||||
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
||||||
|
@ -7249,8 +7274,8 @@ private:
|
||||||
this->gen_choose(
|
this->gen_choose(
|
||||||
this->builder.CreateICmp(
|
this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_ULT,
|
ICmpInst::ICMP_ULT,
|
||||||
this->gen_const(64U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->gen_const(64U, 7)),
|
this->gen_const(8U, 7)),
|
||||||
this->gen_const(8U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->builder.CreateTrunc(
|
this->builder.CreateTrunc(
|
||||||
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
||||||
|
@ -7317,8 +7342,8 @@ private:
|
||||||
this->gen_choose(
|
this->gen_choose(
|
||||||
this->builder.CreateICmp(
|
this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_ULT,
|
ICmpInst::ICMP_ULT,
|
||||||
this->gen_const(64U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->gen_const(64U, 7)),
|
this->gen_const(8U, 7)),
|
||||||
this->gen_const(8U, fld_rm_val),
|
this->gen_const(8U, fld_rm_val),
|
||||||
this->builder.CreateTrunc(
|
this->builder.CreateTrunc(
|
||||||
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
this->gen_reg_load(traits<ARCH>::FCSR, 0),
|
||||||
|
@ -8403,7 +8428,6 @@ vm_impl<ARCH>::gen_single_inst_behavior(virt_addr_t &pc, unsigned int &inst_cnt,
|
||||||
}
|
}
|
||||||
if (insn == 0x0000006f || (insn&0xffff)==0xa001) throw simulation_stopped(0); // 'J 0' or 'C.J 0'
|
if (insn == 0x0000006f || (insn&0xffff)==0xa001) throw simulation_stopped(0); // 'J 0' or 'C.J 0'
|
||||||
// curr pc on stack
|
// curr pc on stack
|
||||||
typename vm_impl<ARCH>::processing_pc_entry addr(*this, pc, paddr);
|
|
||||||
++inst_cnt;
|
++inst_cnt;
|
||||||
auto lut_val = extract_fields(insn);
|
auto lut_val = extract_fields(insn);
|
||||||
auto f = qlut[insn & 0x3][lut_val];
|
auto f = qlut[insn & 0x3][lut_val];
|
||||||
|
@ -8421,6 +8445,7 @@ template <typename ARCH> void vm_impl<ARCH>::gen_leave_behavior(llvm::BasicBlock
|
||||||
template <typename ARCH> void vm_impl<ARCH>::gen_raise_trap(uint16_t trap_id, uint16_t cause) {
|
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);
|
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(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) {
|
template <typename ARCH> void vm_impl<ARCH>::gen_leave_trap(unsigned lvl) {
|
||||||
|
@ -8430,6 +8455,7 @@ template <typename ARCH> void vm_impl<ARCH>::gen_leave_trap(unsigned lvl) {
|
||||||
this->builder.CreateCall(this->mod->getFunction("leave_trap"), args);
|
this->builder.CreateCall(this->mod->getFunction("leave_trap"), args);
|
||||||
auto *PC_val = this->gen_read_mem(traits<ARCH>::CSR, (lvl << 8) + 0x41, traits<ARCH>::XLEN / 8);
|
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(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) {
|
template <typename ARCH> void vm_impl<ARCH>::gen_wait(unsigned type) {
|
||||||
|
@ -8442,7 +8468,10 @@ template <typename ARCH> void vm_impl<ARCH>::gen_wait(unsigned type) {
|
||||||
template <typename ARCH> void vm_impl<ARCH>::gen_trap_behavior(llvm::BasicBlock *trap_blk) {
|
template <typename ARCH> void vm_impl<ARCH>::gen_trap_behavior(llvm::BasicBlock *trap_blk) {
|
||||||
this->builder.SetInsertPoint(trap_blk);
|
this->builder.SetInsertPoint(trap_blk);
|
||||||
auto *trap_state_val = this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::TRAP_STATE), true);
|
auto *trap_state_val = this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::TRAP_STATE), true);
|
||||||
std::vector<llvm::Value *> args{this->core_ptr, this->adj_to64(trap_state_val),
|
this->builder.CreateStore(this->gen_const(32U, std::numeric_limits<uint32_t>::max()), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
|
std::vector<llvm::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->adj_to64(this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::PC), false))};
|
||||||
this->builder.CreateCall(this->mod->getFunction("enter_trap"), args);
|
this->builder.CreateCall(this->mod->getFunction("enter_trap"), args);
|
||||||
auto *trap_addr_val = this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
auto *trap_addr_val = this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
|
|
@ -92,8 +92,7 @@ protected:
|
||||||
vm::fp_impl::add_fp_functions_2_module(m, traits<ARCH>::FP_REGS_SIZE);
|
vm::fp_impl::add_fp_functions_2_module(m, traits<ARCH>::FP_REGS_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline llvm::Value *gen_choose(llvm::Value *cond, llvm::Value *trueVal, llvm::Value *falseVal,
|
inline llvm::Value *gen_choose(llvm::Value *cond, llvm::Value *trueVal, llvm::Value *falseVal, unsigned size) {
|
||||||
unsigned size) const {
|
|
||||||
return super::gen_cond_assign(cond, this->gen_ext(trueVal, size), this->gen_ext(falseVal, size));
|
return super::gen_cond_assign(cond, this->gen_ext(trueVal, size), this->gen_ext(falseVal, size));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -499,6 +498,8 @@ private:
|
||||||
32, true),
|
32, true),
|
||||||
this->gen_const(32U, fld_imm_val));
|
this->gen_const(32U, fld_imm_val));
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 2);
|
this->gen_sync(iss::POST_SYNC, 2);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -544,7 +545,7 @@ private:
|
||||||
this->gen_cond_branch(this->builder.CreateICmp(
|
this->gen_cond_branch(this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_NE,
|
ICmpInst::ICMP_NE,
|
||||||
align_val,
|
align_val,
|
||||||
this->gen_const(64U, 0)),
|
this->gen_const(32U, 0)),
|
||||||
bb_then,
|
bb_then,
|
||||||
bb_else);
|
bb_else);
|
||||||
this->builder.SetInsertPoint(bb_then);
|
this->builder.SetInsertPoint(bb_then);
|
||||||
|
@ -564,6 +565,7 @@ private:
|
||||||
new_pc_val,
|
new_pc_val,
|
||||||
this->builder.CreateNot(this->gen_const(32U, 0x1)));
|
this->builder.CreateNot(this->gen_const(32U, 0x1)));
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
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);
|
||||||
}
|
}
|
||||||
this->builder.CreateBr(bbnext);
|
this->builder.CreateBr(bbnext);
|
||||||
bb=bbnext;
|
bb=bbnext;
|
||||||
|
@ -613,6 +615,8 @@ private:
|
||||||
this->gen_const(32U, 4)),
|
this->gen_const(32U, 4)),
|
||||||
32);
|
32);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 4);
|
this->gen_sync(iss::POST_SYNC, 4);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -657,6 +661,8 @@ private:
|
||||||
this->gen_const(32U, 4)),
|
this->gen_const(32U, 4)),
|
||||||
32);
|
32);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 5);
|
this->gen_sync(iss::POST_SYNC, 5);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -705,6 +711,8 @@ private:
|
||||||
this->gen_const(32U, 4)),
|
this->gen_const(32U, 4)),
|
||||||
32);
|
32);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 6);
|
this->gen_sync(iss::POST_SYNC, 6);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -753,6 +761,8 @@ private:
|
||||||
this->gen_const(32U, 4)),
|
this->gen_const(32U, 4)),
|
||||||
32);
|
32);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 7);
|
this->gen_sync(iss::POST_SYNC, 7);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -797,6 +807,8 @@ private:
|
||||||
this->gen_const(32U, 4)),
|
this->gen_const(32U, 4)),
|
||||||
32);
|
32);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 8);
|
this->gen_sync(iss::POST_SYNC, 8);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -841,6 +853,8 @@ private:
|
||||||
this->gen_const(32U, 4)),
|
this->gen_const(32U, 4)),
|
||||||
32);
|
32);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 9);
|
this->gen_sync(iss::POST_SYNC, 9);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -2006,6 +2020,7 @@ private:
|
||||||
traits<ARCH>::FENCE,
|
traits<ARCH>::FENCE,
|
||||||
this->gen_const(64U, 1),
|
this->gen_const(64U, 1),
|
||||||
this->builder.CreateZExtOrTrunc(FENCEtmp0_val,this->get_type(32)));
|
this->builder.CreateZExtOrTrunc(FENCEtmp0_val,this->get_type(32)));
|
||||||
|
this->builder.CreateStore(this->gen_const(32U, std::numeric_limits<uint32_t>::max()), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_set_pc(pc, traits<ARCH>::NEXT_PC);
|
this->gen_set_pc(pc, traits<ARCH>::NEXT_PC);
|
||||||
this->gen_sync(iss::POST_SYNC, 38);
|
this->gen_sync(iss::POST_SYNC, 38);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
|
@ -2714,7 +2729,7 @@ private:
|
||||||
this->gen_cond_branch(this->builder.CreateICmp(
|
this->gen_cond_branch(this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_NE,
|
ICmpInst::ICMP_NE,
|
||||||
this->gen_reg_load(fld_rs2_val + traits<ARCH>::X0, 0),
|
this->gen_reg_load(fld_rs2_val + traits<ARCH>::X0, 0),
|
||||||
this->gen_const(64U, 0)),
|
this->gen_const(32U, 0)),
|
||||||
bb_then,
|
bb_then,
|
||||||
bb_else);
|
bb_else);
|
||||||
this->builder.SetInsertPoint(bb_then);
|
this->builder.SetInsertPoint(bb_then);
|
||||||
|
@ -2843,7 +2858,7 @@ private:
|
||||||
this->gen_cond_branch(this->builder.CreateICmp(
|
this->gen_cond_branch(this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_NE,
|
ICmpInst::ICMP_NE,
|
||||||
this->gen_reg_load(fld_rs2_val + traits<ARCH>::X0, 0),
|
this->gen_reg_load(fld_rs2_val + traits<ARCH>::X0, 0),
|
||||||
this->gen_const(64U, 0)),
|
this->gen_const(32U, 0)),
|
||||||
bb_then,
|
bb_then,
|
||||||
bb_else);
|
bb_else);
|
||||||
this->builder.SetInsertPoint(bb_then);
|
this->builder.SetInsertPoint(bb_then);
|
||||||
|
@ -2910,7 +2925,7 @@ private:
|
||||||
this->gen_cond_branch(this->builder.CreateICmp(
|
this->gen_cond_branch(this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_NE,
|
ICmpInst::ICMP_NE,
|
||||||
this->gen_reg_load(fld_rs2_val + traits<ARCH>::X0, 0),
|
this->gen_reg_load(fld_rs2_val + traits<ARCH>::X0, 0),
|
||||||
this->gen_const(64U, 0)),
|
this->gen_const(32U, 0)),
|
||||||
bb_then,
|
bb_then,
|
||||||
bb_else);
|
bb_else);
|
||||||
this->builder.SetInsertPoint(bb_then);
|
this->builder.SetInsertPoint(bb_then);
|
||||||
|
@ -3043,7 +3058,7 @@ private:
|
||||||
this->gen_cond_branch(this->builder.CreateICmp(
|
this->gen_cond_branch(this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_NE,
|
ICmpInst::ICMP_NE,
|
||||||
this->gen_reg_load(fld_rs2_val + traits<ARCH>::X0, 0),
|
this->gen_reg_load(fld_rs2_val + traits<ARCH>::X0, 0),
|
||||||
this->gen_const(64U, 0)),
|
this->gen_const(32U, 0)),
|
||||||
bb_then,
|
bb_then,
|
||||||
bb_else);
|
bb_else);
|
||||||
this->builder.SetInsertPoint(bb_then);
|
this->builder.SetInsertPoint(bb_then);
|
||||||
|
@ -3160,7 +3175,7 @@ private:
|
||||||
this->gen_cond_branch(this->builder.CreateICmp(
|
this->gen_cond_branch(this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_NE,
|
ICmpInst::ICMP_NE,
|
||||||
res1_val,
|
res1_val,
|
||||||
this->gen_const(64U, 0)),
|
this->gen_const(32U, 0)),
|
||||||
bb_then,
|
bb_then,
|
||||||
bbnext);
|
bbnext);
|
||||||
this->builder.SetInsertPoint(bb_then);
|
this->builder.SetInsertPoint(bb_then);
|
||||||
|
@ -3875,6 +3890,8 @@ private:
|
||||||
32, true),
|
32, true),
|
||||||
this->gen_const(32U, fld_imm_val));
|
this->gen_const(32U, fld_imm_val));
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 76);
|
this->gen_sync(iss::POST_SYNC, 76);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -4261,6 +4278,8 @@ private:
|
||||||
32, true),
|
32, true),
|
||||||
this->gen_const(32U, fld_imm_val));
|
this->gen_const(32U, fld_imm_val));
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 87);
|
this->gen_sync(iss::POST_SYNC, 87);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -4304,6 +4323,8 @@ private:
|
||||||
this->gen_const(32U, 2)),
|
this->gen_const(32U, 2)),
|
||||||
32);
|
32);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 88);
|
this->gen_sync(iss::POST_SYNC, 88);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -4347,6 +4368,8 @@ private:
|
||||||
this->gen_const(32U, 2)),
|
this->gen_const(32U, 2)),
|
||||||
32);
|
32);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(32U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 89);
|
this->gen_sync(iss::POST_SYNC, 89);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -4480,6 +4503,7 @@ private:
|
||||||
|
|
||||||
Value* PC_val = this->gen_reg_load(fld_rs1_val + traits<ARCH>::X0, 0);
|
Value* PC_val = this->gen_reg_load(fld_rs1_val + traits<ARCH>::X0, 0);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
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);
|
||||||
this->gen_sync(iss::POST_SYNC, 93);
|
this->gen_sync(iss::POST_SYNC, 93);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -4547,6 +4571,7 @@ private:
|
||||||
this->builder.CreateStore(Xtmp0_val, get_reg_ptr(1 + traits<ARCH>::X0), false);
|
this->builder.CreateStore(Xtmp0_val, get_reg_ptr(1 + traits<ARCH>::X0), false);
|
||||||
Value* PC_val = this->gen_reg_load(fld_rs1_val + traits<ARCH>::X0, 0);
|
Value* PC_val = this->gen_reg_load(fld_rs1_val + traits<ARCH>::X0, 0);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
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);
|
||||||
this->gen_sync(iss::POST_SYNC, 95);
|
this->gen_sync(iss::POST_SYNC, 95);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -4709,7 +4734,6 @@ vm_impl<ARCH>::gen_single_inst_behavior(virt_addr_t &pc, unsigned int &inst_cnt,
|
||||||
}
|
}
|
||||||
if (insn == 0x0000006f || (insn&0xffff)==0xa001) throw simulation_stopped(0); // 'J 0' or 'C.J 0'
|
if (insn == 0x0000006f || (insn&0xffff)==0xa001) throw simulation_stopped(0); // 'J 0' or 'C.J 0'
|
||||||
// curr pc on stack
|
// curr pc on stack
|
||||||
typename vm_impl<ARCH>::processing_pc_entry addr(*this, pc, paddr);
|
|
||||||
++inst_cnt;
|
++inst_cnt;
|
||||||
auto lut_val = extract_fields(insn);
|
auto lut_val = extract_fields(insn);
|
||||||
auto f = qlut[insn & 0x3][lut_val];
|
auto f = qlut[insn & 0x3][lut_val];
|
||||||
|
@ -4727,6 +4751,7 @@ template <typename ARCH> void vm_impl<ARCH>::gen_leave_behavior(llvm::BasicBlock
|
||||||
template <typename ARCH> void vm_impl<ARCH>::gen_raise_trap(uint16_t trap_id, uint16_t cause) {
|
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);
|
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(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) {
|
template <typename ARCH> void vm_impl<ARCH>::gen_leave_trap(unsigned lvl) {
|
||||||
|
@ -4736,6 +4761,7 @@ template <typename ARCH> void vm_impl<ARCH>::gen_leave_trap(unsigned lvl) {
|
||||||
this->builder.CreateCall(this->mod->getFunction("leave_trap"), args);
|
this->builder.CreateCall(this->mod->getFunction("leave_trap"), args);
|
||||||
auto *PC_val = this->gen_read_mem(traits<ARCH>::CSR, (lvl << 8) + 0x41, traits<ARCH>::XLEN / 8);
|
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(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) {
|
template <typename ARCH> void vm_impl<ARCH>::gen_wait(unsigned type) {
|
||||||
|
@ -4748,7 +4774,10 @@ template <typename ARCH> void vm_impl<ARCH>::gen_wait(unsigned type) {
|
||||||
template <typename ARCH> void vm_impl<ARCH>::gen_trap_behavior(llvm::BasicBlock *trap_blk) {
|
template <typename ARCH> void vm_impl<ARCH>::gen_trap_behavior(llvm::BasicBlock *trap_blk) {
|
||||||
this->builder.SetInsertPoint(trap_blk);
|
this->builder.SetInsertPoint(trap_blk);
|
||||||
auto *trap_state_val = this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::TRAP_STATE), true);
|
auto *trap_state_val = this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::TRAP_STATE), true);
|
||||||
std::vector<llvm::Value *> args{this->core_ptr, this->adj_to64(trap_state_val),
|
this->builder.CreateStore(this->gen_const(32U, std::numeric_limits<uint32_t>::max()), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
|
std::vector<llvm::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->adj_to64(this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::PC), false))};
|
||||||
this->builder.CreateCall(this->mod->getFunction("enter_trap"), args);
|
this->builder.CreateCall(this->mod->getFunction("enter_trap"), args);
|
||||||
auto *trap_addr_val = this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
auto *trap_addr_val = this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
|
|
@ -92,8 +92,7 @@ protected:
|
||||||
vm::fp_impl::add_fp_functions_2_module(m, traits<ARCH>::FP_REGS_SIZE);
|
vm::fp_impl::add_fp_functions_2_module(m, traits<ARCH>::FP_REGS_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline llvm::Value *gen_choose(llvm::Value *cond, llvm::Value *trueVal, llvm::Value *falseVal,
|
inline llvm::Value *gen_choose(llvm::Value *cond, llvm::Value *trueVal, llvm::Value *falseVal, unsigned size) {
|
||||||
unsigned size) const {
|
|
||||||
return super::gen_cond_assign(cond, this->gen_ext(trueVal, size), this->gen_ext(falseVal, size));
|
return super::gen_cond_assign(cond, this->gen_ext(trueVal, size), this->gen_ext(falseVal, size));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1144,6 +1143,8 @@ private:
|
||||||
64, true),
|
64, true),
|
||||||
this->gen_const(64U, fld_imm_val));
|
this->gen_const(64U, fld_imm_val));
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(64U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 17);
|
this->gen_sync(iss::POST_SYNC, 17);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -1209,6 +1210,7 @@ private:
|
||||||
new_pc_val,
|
new_pc_val,
|
||||||
this->builder.CreateNot(this->gen_const(64U, 0x1)));
|
this->builder.CreateNot(this->gen_const(64U, 0x1)));
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
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);
|
||||||
}
|
}
|
||||||
this->builder.CreateBr(bbnext);
|
this->builder.CreateBr(bbnext);
|
||||||
bb=bbnext;
|
bb=bbnext;
|
||||||
|
@ -1258,6 +1260,8 @@ private:
|
||||||
this->gen_const(64U, 4)),
|
this->gen_const(64U, 4)),
|
||||||
64);
|
64);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(64U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 19);
|
this->gen_sync(iss::POST_SYNC, 19);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -1302,6 +1306,8 @@ private:
|
||||||
this->gen_const(64U, 4)),
|
this->gen_const(64U, 4)),
|
||||||
64);
|
64);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(64U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 20);
|
this->gen_sync(iss::POST_SYNC, 20);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -1350,6 +1356,8 @@ private:
|
||||||
this->gen_const(64U, 4)),
|
this->gen_const(64U, 4)),
|
||||||
64);
|
64);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(64U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 21);
|
this->gen_sync(iss::POST_SYNC, 21);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -1398,6 +1406,8 @@ private:
|
||||||
this->gen_const(64U, 4)),
|
this->gen_const(64U, 4)),
|
||||||
64);
|
64);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(64U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 22);
|
this->gen_sync(iss::POST_SYNC, 22);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -1442,6 +1452,8 @@ private:
|
||||||
this->gen_const(64U, 4)),
|
this->gen_const(64U, 4)),
|
||||||
64);
|
64);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(64U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 23);
|
this->gen_sync(iss::POST_SYNC, 23);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -1486,6 +1498,8 @@ private:
|
||||||
this->gen_const(64U, 4)),
|
this->gen_const(64U, 4)),
|
||||||
64);
|
64);
|
||||||
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
Value* is_cont_v = this->builder.CreateICmp(ICmpInst::ICMP_NE, PC_val, this->gen_const(64U, pc.val), "is_cont_v");
|
||||||
|
this->builder.CreateStore(this->gen_ext(is_cont_v, 32U, false), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_sync(iss::POST_SYNC, 24);
|
this->gen_sync(iss::POST_SYNC, 24);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
return std::make_tuple(iss::vm::BRANCH, nullptr);
|
||||||
|
@ -2528,6 +2542,7 @@ private:
|
||||||
traits<ARCH>::FENCE,
|
traits<ARCH>::FENCE,
|
||||||
this->gen_const(64U, 1),
|
this->gen_const(64U, 1),
|
||||||
this->builder.CreateZExtOrTrunc(FENCEtmp0_val,this->get_type(64)));
|
this->builder.CreateZExtOrTrunc(FENCEtmp0_val,this->get_type(64)));
|
||||||
|
this->builder.CreateStore(this->gen_const(32U, std::numeric_limits<uint32_t>::max()), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
this->gen_set_pc(pc, traits<ARCH>::NEXT_PC);
|
this->gen_set_pc(pc, traits<ARCH>::NEXT_PC);
|
||||||
this->gen_sync(iss::POST_SYNC, 50);
|
this->gen_sync(iss::POST_SYNC, 50);
|
||||||
this->gen_trap_check(this->leave_blk);
|
this->gen_trap_check(this->leave_blk);
|
||||||
|
@ -3683,7 +3698,7 @@ private:
|
||||||
this->gen_cond_branch(this->builder.CreateICmp(
|
this->gen_cond_branch(this->builder.CreateICmp(
|
||||||
ICmpInst::ICMP_NE,
|
ICmpInst::ICMP_NE,
|
||||||
res1_val,
|
res1_val,
|
||||||
this->gen_const(64U, 0)),
|
this->gen_const(32U, 0)),
|
||||||
bb_then,
|
bb_then,
|
||||||
bbnext);
|
bbnext);
|
||||||
this->builder.SetInsertPoint(bb_then);
|
this->builder.SetInsertPoint(bb_then);
|
||||||
|
@ -4255,7 +4270,6 @@ vm_impl<ARCH>::gen_single_inst_behavior(virt_addr_t &pc, unsigned int &inst_cnt,
|
||||||
}
|
}
|
||||||
if (insn == 0x0000006f || (insn&0xffff)==0xa001) throw simulation_stopped(0); // 'J 0' or 'C.J 0'
|
if (insn == 0x0000006f || (insn&0xffff)==0xa001) throw simulation_stopped(0); // 'J 0' or 'C.J 0'
|
||||||
// curr pc on stack
|
// curr pc on stack
|
||||||
typename vm_impl<ARCH>::processing_pc_entry addr(*this, pc, paddr);
|
|
||||||
++inst_cnt;
|
++inst_cnt;
|
||||||
auto lut_val = extract_fields(insn);
|
auto lut_val = extract_fields(insn);
|
||||||
auto f = qlut[insn & 0x3][lut_val];
|
auto f = qlut[insn & 0x3][lut_val];
|
||||||
|
@ -4273,6 +4287,7 @@ template <typename ARCH> void vm_impl<ARCH>::gen_leave_behavior(llvm::BasicBlock
|
||||||
template <typename ARCH> void vm_impl<ARCH>::gen_raise_trap(uint16_t trap_id, uint16_t cause) {
|
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);
|
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(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) {
|
template <typename ARCH> void vm_impl<ARCH>::gen_leave_trap(unsigned lvl) {
|
||||||
|
@ -4282,6 +4297,7 @@ template <typename ARCH> void vm_impl<ARCH>::gen_leave_trap(unsigned lvl) {
|
||||||
this->builder.CreateCall(this->mod->getFunction("leave_trap"), args);
|
this->builder.CreateCall(this->mod->getFunction("leave_trap"), args);
|
||||||
auto *PC_val = this->gen_read_mem(traits<ARCH>::CSR, (lvl << 8) + 0x41, traits<ARCH>::XLEN / 8);
|
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(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) {
|
template <typename ARCH> void vm_impl<ARCH>::gen_wait(unsigned type) {
|
||||||
|
@ -4294,7 +4310,10 @@ template <typename ARCH> void vm_impl<ARCH>::gen_wait(unsigned type) {
|
||||||
template <typename ARCH> void vm_impl<ARCH>::gen_trap_behavior(llvm::BasicBlock *trap_blk) {
|
template <typename ARCH> void vm_impl<ARCH>::gen_trap_behavior(llvm::BasicBlock *trap_blk) {
|
||||||
this->builder.SetInsertPoint(trap_blk);
|
this->builder.SetInsertPoint(trap_blk);
|
||||||
auto *trap_state_val = this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::TRAP_STATE), true);
|
auto *trap_state_val = this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::TRAP_STATE), true);
|
||||||
std::vector<llvm::Value *> args{this->core_ptr, this->adj_to64(trap_state_val),
|
this->builder.CreateStore(this->gen_const(32U, std::numeric_limits<uint32_t>::max()), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
|
||||||
|
std::vector<llvm::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->adj_to64(this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::PC), false))};
|
||||||
this->builder.CreateCall(this->mod->getFunction("enter_trap"), args);
|
this->builder.CreateCall(this->mod->getFunction("enter_trap"), args);
|
||||||
auto *trap_addr_val = this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
auto *trap_addr_val = this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::NEXT_PC), false);
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
#include <iss/arch/rv32imac.h>
|
#include <iss/arch/rv32imac.h>
|
||||||
#include <iss/arch/rv32gc.h>
|
#include <iss/arch/rv32gc.h>
|
||||||
#include <iss/arch/rv64ia.h>
|
#include <iss/arch/rv64ia.h>
|
||||||
#include <iss/jit/MCJIThelper.h>
|
#include <iss/jit/jit_helper.h>
|
||||||
#include <iss/log_categories.h>
|
#include <iss/log_categories.h>
|
||||||
#include <iss/plugin/instruction_count.h>
|
#include <iss/plugin/instruction_count.h>
|
||||||
#include <iss/plugin/cycle_estimate.h>
|
#include <iss/plugin/cycle_estimate.h>
|
||||||
|
@ -61,7 +61,7 @@ int main(int argc, char *argv[]) {
|
||||||
("logfile,f", po::value<std::string>(), "Sets default log file.")
|
("logfile,f", po::value<std::string>(), "Sets default log file.")
|
||||||
("disass,d", po::value<std::string>()->implicit_value(""), "Enables disassembly")
|
("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")
|
("gdb-port,g", po::value<unsigned>()->default_value(0), "enable gdb server and specify port to use")
|
||||||
("instructions,i", po::value<int64_t>()->default_value(-1), "max. number of instructions to simulate")
|
("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")
|
("reset,r", po::value<std::string>(), "reset address")
|
||||||
("dump-ir", "dump the intermediate representation")
|
("dump-ir", "dump the intermediate representation")
|
||||||
("elf", po::value<std::vector<std::string>>(), "ELF file(s) to load")
|
("elf", po::value<std::vector<std::string>>(), "ELF file(s) to load")
|
||||||
|
@ -176,7 +176,7 @@ int main(int argc, char *argv[]) {
|
||||||
start_address = str.find("0x") == 0 ? std::stoull(str.substr(2), 0, 16) : std::stoull(str, 0, 10);
|
start_address = str.find("0x") == 0 ? std::stoull(str.substr(2), 0, 16) : std::stoull(str, 0, 10);
|
||||||
}
|
}
|
||||||
vm->reset(start_address);
|
vm->reset(start_address);
|
||||||
auto cycles = clim["instructions"].as<int64_t>();
|
auto cycles = clim["instructions"].as<uint64_t>();
|
||||||
res = vm->start(cycles, dump);
|
res = vm->start(cycles, dump);
|
||||||
} catch (std::exception &e) {
|
} catch (std::exception &e) {
|
||||||
LOG(ERROR) << "Unhandled Exception reached the top of main: " << e.what() << ", application will now exit" << std::endl;
|
LOG(ERROR) << "Unhandled Exception reached the top of main: " << e.what() << ", application will now exit" << std::endl;
|
||||||
|
|
Loading…
Reference in New Issue