Compare commits
	
		
			68 Commits
		
	
	
		
			48cfa8d868
			...
			develop
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 2e7ef7285e | |||
| dbb68b5fb1 | |||
| df513d4465 | |||
| 00ecea2bd6 | |||
| c068d6dbd3 | |||
| 578857997e | |||
| 56081dcb6f | |||
| b68c2226d9 | |||
| 925e312608 | |||
| 74275ddab4 | |||
| 0dafde8a4c | |||
| a5cf27744a | |||
| f46a211a8d | |||
| 57fff5c09b | |||
| e39264632f | |||
| 630f9993d6 | |||
| 9249f34038 | |||
| b14442d722 | |||
| 58e2dcfaf8 | |||
| a7559066f4 | |||
| 10eb3c88fc | |||
| 90720804ba | |||
| 4975a8273c | |||
| ed4ab31837 | |||
| 21391f1f01 | |||
| 21f97e9bc3 | |||
| d715d50dfb | |||
| a2cd38fbd5 | |||
| c7cd0843b8 | |||
| 83b2105c38 | |||
| 510695bf6e | |||
| 7258684a33 | |||
| 15cc2ece6f | |||
| 3e0eaba231 | |||
| 4bd2111c93 | |||
| f99db9409f | |||
| 87539a8433 | |||
| de4cf8f35a | |||
| 7d4bcea3ba | |||
| 74c2ec2014 | |||
| bccfc67926 | |||
| 8b3dc54e5c | |||
| 9909769c0a | |||
| 071d9cc8eb | |||
| a5825bfd67 | |||
| 36404dd7e0 | |||
| 658ffbb405 | |||
| c6bfaf0546 | |||
| e88c1148fb | |||
| 686d01ab3e | |||
| 339d6b0f2c | |||
| 884d445cb9 | |||
| eee14af478 | |||
| 727fdcb7bb | |||
| 36cb401420 | |||
| 3def42153f | |||
| 75ba2e7588 | |||
| 1629b165b5 | |||
| a2e932c56f | |||
| cde5ae627c | |||
| 85304d1a43 | |||
| fddf608418 | |||
| 90c45d7c3c | |||
| f3dc9aea54 | |||
| 2f675e9bdd | |||
| 3114cb265a | |||
| fca9f04264 | |||
| fe1136c7ce | 
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -151,6 +151,4 @@ compile_commands.json | |||||||
| CTestTestfile.cmake | CTestTestfile.cmake | ||||||
| *.dump | *.dump | ||||||
|  |  | ||||||
| .vscode/c_cpp_properties.json | build | ||||||
| semihosting_test/build/semihosting_test |  | ||||||
| semihosting_test/build/Makefile |  | ||||||
| @@ -4,8 +4,20 @@ endif() | |||||||
| if (NOT DEFINED ISA) | if (NOT DEFINED ISA) | ||||||
| 	set(ISA imc) | 	set(ISA imc) | ||||||
| endif() | endif() | ||||||
|  | if(DEFINED LINK_TARGET) | ||||||
|  |     set(LNK LINK_TARGET=${LINK_TARGET}) | ||||||
|  | endif() | ||||||
| message(STATUS "Building firmware using ${BOARD} board configuration and isa ${ISA}") | message(STATUS "Building firmware using ${BOARD} board configuration and isa ${ISA}") | ||||||
| add_custom_target(fw-common ALL  | add_custom_target(fw-common ALL  | ||||||
| 	COMMAND make -C hello-world BOARD=${BOARD} ISA=${ISA} && make -C benchmarks/dhrystone BOARD=${BOARD} ISA=${ISA} && make -C benchmarks/coremark BOARD=${BOARD} ISA=${ISA} | 	COMMAND make -C ${CMAKE_CURRENT_SOURCE_DIR}/hello-world BOARD=${BOARD} ISA=${ISA} ${LNK} | ||||||
|  | 	COMMAND make -C ${CMAKE_CURRENT_SOURCE_DIR}/benchmarks/dhrystone BOARD=${BOARD} ISA=${ISA} ${LNK} | ||||||
|  | 	COMMAND make -C ${CMAKE_CURRENT_SOURCE_DIR}/benchmarks/coremark BOARD=${BOARD} ISA=${ISA} ${LNK} | ||||||
|     USES_TERMINAL |     USES_TERMINAL | ||||||
|     WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) |     WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) | ||||||
|  | add_custom_target(fw-common-clean  | ||||||
|  | 	COMMAND make -C ${CMAKE_CURRENT_SOURCE_DIR}/hello-world BOARD=${BOARD} ISA=${ISA} ${LNK} clean | ||||||
|  | 	COMMAND make -C ${CMAKE_CURRENT_SOURCE_DIR}/benchmarks/dhrystone BOARD=${BOARD} ISA=${ISA} ${LNK} clean | ||||||
|  | 	COMMAND make -C ${CMAKE_CURRENT_SOURCE_DIR}/benchmarks/coremark BOARD=${BOARD} ISA=${ISA} ${LNK} clean | ||||||
|  |     USES_TERMINAL | ||||||
|  |     WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) | ||||||
|  |      | ||||||
							
								
								
									
										118
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										118
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
								
							| @@ -2,7 +2,7 @@ void checkout_project() { | |||||||
|     checkout([ |     checkout([ | ||||||
|         $class: 'GitSCM', |         $class: 'GitSCM', | ||||||
|         branches: [ |         branches: [ | ||||||
|             [name: '*/main'] |             [name: '*/develop'] | ||||||
|         ], |         ], | ||||||
|         extensions: [ |         extensions: [ | ||||||
|             [$class: 'CleanBeforeCheckout'], |             [$class: 'CleanBeforeCheckout'], | ||||||
| @@ -15,6 +15,24 @@ void checkout_project() { | |||||||
|     ]) |     ]) | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void checkout_iss_project(String repoUrl, String branch = 'develop') { | ||||||
|  |     checkout([ | ||||||
|  |         $class: 'GitSCM', | ||||||
|  |         branches: [ | ||||||
|  |             [name: "*/${branch}"] | ||||||
|  |         ], | ||||||
|  |         extensions: [ | ||||||
|  |             [$class: 'CleanBeforeCheckout'], | ||||||
|  |             [$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: true, recursiveSubmodules: true, reference: '', trackingSubmodules: false, shallow: true] | ||||||
|  |         ], | ||||||
|  |         submoduleCfg: [], | ||||||
|  |         userRemoteConfigs: [ | ||||||
|  |             [credentialsId: 'gitea-jenkins', url: repoUrl] | ||||||
|  |         ] | ||||||
|  |     ]) | ||||||
|  | } | ||||||
|  |  | ||||||
| void checkout_develop() { | void checkout_develop() { | ||||||
|     dir("bare-metal-bsp") { |     dir("bare-metal-bsp") { | ||||||
|         withCredentials([usernamePassword(credentialsId: 'gitea-jenkins', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD')]) { |         withCredentials([usernamePassword(credentialsId: 'gitea-jenkins', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD')]) { | ||||||
| @@ -29,6 +47,14 @@ void make_hello(board) { | |||||||
|     sh("make -C hello-world/ clean") |     sh("make -C hello-world/ clean") | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void cmake_hello(board,build_type,core_type) {   | ||||||
|  |     def flavor ="${board}_${build_type}_${core_type}" | ||||||
|  |     if (core_type=="32") | ||||||
|  |         flavor ="${board}_${build_type}" | ||||||
|  |     sh("cmake -B ${flavor}  --preset=${flavor}")  | ||||||
|  |     sh("cmake --build ${flavor}")     | ||||||
|  | } | ||||||
|  |  | ||||||
| pipeline { | pipeline { | ||||||
|     agent { docker {  |     agent { docker {  | ||||||
|         image 'ubuntu-riscv' |         image 'ubuntu-riscv' | ||||||
| @@ -48,12 +74,13 @@ pipeline { | |||||||
|         stage('make rtl') {steps { make_hello("rtl")}} |         stage('make rtl') {steps { make_hello("rtl")}} | ||||||
|         stage('make ehrenberg') {steps { make_hello("ehrenberg")}} |         stage('make ehrenberg') {steps { make_hello("ehrenberg")}} | ||||||
|         stage('make tgc_vp') {steps { make_hello("tgc_vp")}}*/ |         stage('make tgc_vp') {steps { make_hello("tgc_vp")}}*/ | ||||||
|  |          | ||||||
|         stage('make hello-world') { |         stage('make hello-world') { | ||||||
|             matrix { |             matrix { | ||||||
|                 axes { |                 axes { | ||||||
|                     axis{ |                     axis{ | ||||||
|                         name 'BOARD' |                         name 'BOARD' | ||||||
|                         values 'iss', 'hifive1', 'TGCP', 'ehrenberg', 'rtl', 'tgc_vp' |                         values 'iss',  'moonlight',  'tgc_vp' | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 stages { |                 stages { | ||||||
| @@ -72,10 +99,91 @@ pipeline { | |||||||
|                 } |                 } | ||||||
|             }  |             }  | ||||||
|         } |         } | ||||||
|  |          | ||||||
|  |         stage('CMAKE flow for hello-world') { | ||||||
|  |             matrix { | ||||||
|  |                 axes { | ||||||
|  |                     axis{ | ||||||
|  |                         name 'BOARD' | ||||||
|  |                         values 'ISS',  'Moonlight', 'TGC_VP' | ||||||
|  |                     } | ||||||
|  |                     axis{ | ||||||
|  |                         name 'BUILD_TYPE' | ||||||
|  |                         values 'Debug',  'Release' | ||||||
|  |                     } | ||||||
|  |                     axis{ | ||||||
|  |                         name 'CORE_TYPE' | ||||||
|  |                         values '32',  '64' | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 stages { | ||||||
|  |                     stage('Force sequential') { | ||||||
|  |                         options { | ||||||
|  |                             lock("One Board at a time") | ||||||
|  |                         } | ||||||
|  |                         when{ | ||||||
|  |                             not { | ||||||
|  |                                 anyOf { | ||||||
|  |                                     expression { BOARD == 'Moonlight' && CORE_TYPE =='64'} | ||||||
|  |                                     expression { BOARD == 'TGC_VP' && CORE_TYPE =='64'} | ||||||
|  |                                 }                                 | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  |                         stages { | ||||||
|  |                             stage("CMAKE") { | ||||||
|  |                                 steps { | ||||||
|  |                                     dir("hello-world"){ | ||||||
|  |                                         cmake_hello("${BOARD}","${BUILD_TYPE}","${CORE_TYPE}") | ||||||
|  |                                     } | ||||||
|  |                                 } | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }  | ||||||
|  |         } | ||||||
|  |         stage("Checkout TGC-ISS, TGC-Compliance and TGC-GEN"){ | ||||||
|  |             steps {                                        | ||||||
|  |                 dir("TGC-ISS"){                     | ||||||
|  |                     sh 'rm -rf * .??* ' | ||||||
|  |                     checkout_iss_project("https://git.minres.com/TGFS/TGC-ISS.git", "develop") | ||||||
|  |                     dir("TGC-COMPLIANCE"){                         | ||||||
|  |                         checkout_iss_project("https://git.minres.com/TGFS/TGC-COMPLIANCE.git", "master") | ||||||
|  |                     } | ||||||
|  |                     dir("TGC-GEN"){                         | ||||||
|  |                         checkout_iss_project("https://git.minres.com/TGFS/TGC-GEN.git", "develop") | ||||||
|  |                         }                             | ||||||
|  |                     }  | ||||||
|  |                 } | ||||||
|  |         } | ||||||
|  |         stage("Generate cores and build TGC-ISS"){ | ||||||
|  |             steps {                 | ||||||
|  |                 sh 'rm -rf *@tmp'                      | ||||||
|  |                 sh ''' | ||||||
|  |                 for core in RV32GC; do  | ||||||
|  |                     for backend in interp; do  | ||||||
|  |                             TGC-ISS/TGC-GEN/scripts/generate_iss.sh -o TGC-ISS/dbt-rise-tgc/ -c $core -b ${backend} TGC-ISS/TGC-GEN/CoreDSL/${core}.core_desc | ||||||
|  |                     done | ||||||
|  |                 done | ||||||
|  |                 for core in RV64GC; do | ||||||
|  |                     for backend in interp; do  | ||||||
|  |                         TGC-ISS/TGC-GEN/scripts/generate_iss.sh -o TGC-ISS/dbt-rise-tgc/ -c $core -b ${backend} TGC-ISS/TGC-GEN/CoreDSL/${core}.core_desc | ||||||
|  |                     done | ||||||
|  |                 done | ||||||
|  |                 ''' | ||||||
|  |                 sh 'conan profile detect --force' | ||||||
|  |                 sh 'rm -rf TGC-ISS/build' | ||||||
|  |                 sh 'cmake -S TGC-ISS/. -B TGC-ISS/build --preset Release -DWITH_ASMJIT=ON -DWITH_TCC=ON -DWITH_LLVM=OFF'                 | ||||||
|  |                 sh 'cmake --build TGC-ISS/build -j' | ||||||
|  |                 sh 'TGC-ISS/build/dbt-rise-tgc/tgc-sim --isa ?'                        | ||||||
|  |                 } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         stage("start to run hello FW on ISS") { | ||||||
|  |             steps {                 | ||||||
|  |                 sh 'TGC-ISS/build/dbt-rise-tgc/tgc-sim -f hello-world/ISS_Debug/hello.elf' | ||||||
|  |                 sh 'TGC-ISS/build/dbt-rise-tgc/tgc-sim -f hello-world/ISS_Debug_64/hello.elf --isa=rv64gc'                 | ||||||
|             } |             } | ||||||
|     post { |  | ||||||
|         failure { |  | ||||||
|             sh("make -C hello-world/ clean")        |  | ||||||
|         } |         } | ||||||
|     }     |     }     | ||||||
| } | } | ||||||
|   | |||||||
 Submodule bare-metal-bsp updated: 87dc0ec230...bf0e4ec057
									
								
							
							
								
								
									
										31
									
								
								benchmarks/coremark/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								benchmarks/coremark/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | cmake_minimum_required(VERSION 3.21) | ||||||
|  | project(coremark C) | ||||||
|  | set(TARGET coremark) | ||||||
|  | set(CMAKE_BUILD_TYPE Release) | ||||||
|  |  | ||||||
|  | # Source files | ||||||
|  | set(SOURCES | ||||||
|  |     core_portme.c | ||||||
|  |     cvt.c | ||||||
|  |     ee_printf.c | ||||||
|  |     cm/core_list_join.c | ||||||
|  |     cm/core_main.c | ||||||
|  |     cm/core_matrix.c | ||||||
|  |     cm/core_state.c | ||||||
|  |     cm/core_util.c | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | # Create executable | ||||||
|  | add_executable(coremark ${SOURCES}) | ||||||
|  | target_include_directories(${TARGET} PRIVATE ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_LIST_DIR}/cm) | ||||||
|  | target_compile_options(${TARGET} PRIVATE  -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -fno-builtin-strnlen -fno-common -funroll-loops -finline-functions -falign-functions=16 -falign-jumps=4 -falign-loops=4 -finline-limit=1000 -fno-if-conversion2 -fselective-scheduling -fno-crossjumping -freorder-blocks-and-partition -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -fno-common -funroll-loops -finline-functions -falign-functions=16 -falign-jumps=4 -falign-loops=4 -finline-limit=1000 -fno-if-conversion2 -fselective-scheduling -fno-crossjumping -freorder-blocks-and-partition ) | ||||||
|  | target_compile_definitions(${TARGET} PRIVATE PERFORMANCE_RUN=1 CLOCKS_PER_SEC=10000000 FLAGS_STR="" PERFORMANCE_RUN=1 CLOCKS_PER_SEC=10000000 ITERATIONS=600) | ||||||
|  |  | ||||||
|  | set(BOARD "iss" CACHE STRING "Target board") | ||||||
|  | add_subdirectory(../../bare-metal-bsp bsp) | ||||||
|  | target_link_libraries(${TARGET} PRIVATE bsp) | ||||||
|  | target_link_options(${TARGET} PRIVATE LINKER:-Map=${TARGET}.map)   | ||||||
|  |  | ||||||
|  | add_custom_command(TARGET ${TARGET} POST_BUILD | ||||||
|  |         COMMAND ${CMAKE_OBJDUMP} -S  ${TARGET}.elf > ${TARGET}.dis | ||||||
|  |         COMMENT "Creating disassembly for ${TARGET}") | ||||||
							
								
								
									
										118
									
								
								benchmarks/coremark/CMakePresets.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								benchmarks/coremark/CMakePresets.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,118 @@ | |||||||
|  | { | ||||||
|  |     "version": 3, | ||||||
|  |     "vendor": { | ||||||
|  |         "conan": {} | ||||||
|  |     }, | ||||||
|  |     "cmakeMinimumRequired": { | ||||||
|  |         "major": 3, | ||||||
|  |         "minor": 24, | ||||||
|  |         "patch": 0 | ||||||
|  |     }, | ||||||
|  |     "configurePresets": [ | ||||||
|  |         { | ||||||
|  |             "name": "32imc", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "64imc", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv64gc.cmake" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "iss", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "BOARD": "iss" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "moonlight", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "BOARD": "moonlight" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "tgc_vp", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "BOARD": "tgc_vp" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "rtl", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "BOARD": "rtl" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "debug", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "CMAKE_BUILD_TYPE": "Debug" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "release", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "CMAKE_BUILD_TYPE": "Release" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "ISS_Debug", | ||||||
|  |             "inherits": ["iss", "debug", "32imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "Moonlight_Debug", | ||||||
|  |             "inherits": ["moonlight", "debug", "32imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "TGC_VP_Debug", | ||||||
|  |             "inherits": ["tgc_vp", "debug", "32imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "ISS_Debug_64", | ||||||
|  |             "inherits": ["iss", "debug", "64imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "Moonlight_Debug_64", | ||||||
|  |             "inherits": ["moonlight", "debug", "64imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "TGC_VP_Debug_64", | ||||||
|  |             "inherits": ["tgc_vp", "debug", "64imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "ISS_Release", | ||||||
|  |             "inherits": ["iss", "release", "32imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "Moonlight_Release", | ||||||
|  |             "inherits": ["moonlight", "release", "32imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "TGC_VP_Release", | ||||||
|  |             "inherits": ["tgc_vp", "release", "32imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "ISS_Release_64", | ||||||
|  |             "inherits": ["iss", "release", "64imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "Moonlight_Release_64", | ||||||
|  |             "inherits": ["moonlight", "release", "64imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "TGC_VP_Release_64", | ||||||
|  |             "inherits": ["tgc_vp", "release", "64imc"] | ||||||
|  |         } | ||||||
|  |                   | ||||||
|  |     ] | ||||||
|  | } | ||||||
| @@ -15,55 +15,58 @@ limitations under the License. | |||||||
|  |  | ||||||
| Original Author: Shay Gal-on | Original Author: Shay Gal-on | ||||||
| */ | */ | ||||||
| #include "coremark.h" |  | ||||||
| #include "core_portme.h" | #include "core_portme.h" | ||||||
| //Read cycle CSR | #include "coremark.h" | ||||||
| unsigned long long _read_cycle() | #include <unistd.h> | ||||||
| { | // Read cycle CSR | ||||||
|  | unsigned long long _read_cycle() { | ||||||
|   unsigned long long result; |   unsigned long long result; | ||||||
|   unsigned long lower; |   unsigned long lower; | ||||||
|   unsigned long upper1; |   unsigned long upper1; | ||||||
|   unsigned long upper2; |   unsigned long upper2; | ||||||
|  |  | ||||||
|     asm volatile ( |   asm volatile("repeat_cycle_%=: csrr %0, cycleh;\n" | ||||||
|         "repeat_cycle_%=: csrr %0, cycleh;\n" |  | ||||||
|                "        csrr %1, cycle;\n" |                "        csrr %1, cycle;\n" | ||||||
|                "        csrr %2, cycleh;\n" |                "        csrr %2, cycleh;\n" | ||||||
|                "        bne %0, %2, repeat_cycle_%=;\n" |                "        bne %0, %2, repeat_cycle_%=;\n" | ||||||
|         : "=r" (upper1),"=r" (lower),"=r" (upper2)    // Outputs   : temp variable for load result |                : "=r"(upper1), "=r"(lower), | ||||||
|  |                  "=r"(upper2) // Outputs   : temp variable for load result | ||||||
|                : |                : | ||||||
|         : |                :); | ||||||
|     ); |  | ||||||
|   *(unsigned long *)(&result) = lower; |   *(unsigned long *)(&result) = lower; | ||||||
|     *((unsigned long *)(&result)+1) = upper1; |   *((unsigned long *)(&result) + 1) = upper1; | ||||||
|  |  | ||||||
|   return result; |   return result; | ||||||
| } | } | ||||||
|  |  | ||||||
| volatile int tohost; | // extern volatile int tohost; | ||||||
| volatile int fromhost; | // extern volatile int fromhost; | ||||||
|  |  | ||||||
| void exit(int n){ | void write_hex(int fd, uint32_t hex); | ||||||
|       tohost = 0x1; |  | ||||||
|       for (;;); | void exit(int n) { | ||||||
|  |   write_hex(STDERR_FILENO, 1); | ||||||
|  |   // tohost = 0x1; | ||||||
|  |   for (;;) | ||||||
|  |     ; | ||||||
| } | } | ||||||
|  |  | ||||||
| void __libc_init_array (void) { | void __libc_init_array(void) { | ||||||
| /* |   /* | ||||||
|       size_t count; |       size_t count; | ||||||
|       size_t i; |       size_t i; | ||||||
|       count = __preinit_array_end - __preinit_array_start; |       count = __preinit_array_end - __preinit_array_start; | ||||||
|       for (i = 0; i < count; i++) |       for (i = 0; i < count; i++) | ||||||
|           __preinit_array_start[i] (); |           __preinit_array_start[i] (); | ||||||
|  |  | ||||||
| #ifdef HAVE_INIT_FINI |   #ifdef HAVE_INIT_FINI | ||||||
|       _init (); |       _init (); | ||||||
| #endif |   #endif | ||||||
|  |  | ||||||
|       count = __init_array_end - __init_array_start; |       count = __init_array_end - __init_array_start; | ||||||
|       for (i = 0; i < count; i++) |       for (i = 0; i < count; i++) | ||||||
|       __init_array_start[i] (); |       __init_array_start[i] (); | ||||||
| */ |   */ | ||||||
| } | } | ||||||
| #if VALIDATION_RUN | #if VALIDATION_RUN | ||||||
| volatile ee_s32 seed1_volatile = 0x3415; | volatile ee_s32 seed1_volatile = 0x3415; | ||||||
| @@ -89,10 +92,7 @@ volatile ee_s32 seed5_volatile = 0; | |||||||
|    time.h and windows.h definitions included. |    time.h and windows.h definitions included. | ||||||
| */ | */ | ||||||
| CORETIMETYPE | CORETIMETYPE | ||||||
| barebones_clock() | barebones_clock() { return (CORETIMETYPE)_read_cycle(); } | ||||||
| { |  | ||||||
|     return (CORETIMETYPE)_read_cycle(); |  | ||||||
| } |  | ||||||
| /* Define : TIMER_RES_DIVIDER | /* Define : TIMER_RES_DIVIDER | ||||||
|         Divider to trade off timer resolution and total time that can be |         Divider to trade off timer resolution and total time that can be | ||||||
|    measured. |    measured. | ||||||
| @@ -118,11 +118,7 @@ static CORETIMETYPE start_time_val, stop_time_val; | |||||||
|    example code) or zeroing some system parameters - e.g. setting the cpu clocks |    example code) or zeroing some system parameters - e.g. setting the cpu clocks | ||||||
|    cycles to 0. |    cycles to 0. | ||||||
| */ | */ | ||||||
| void | void start_time(void) { GETMYTIME(&start_time_val); } | ||||||
| start_time(void) |  | ||||||
| { |  | ||||||
|     GETMYTIME(&start_time_val); |  | ||||||
| } |  | ||||||
| /* Function : stop_time | /* Function : stop_time | ||||||
|         This function will be called right after ending the timed portion of the |         This function will be called right after ending the timed portion of the | ||||||
|    benchmark. |    benchmark. | ||||||
| @@ -131,11 +127,7 @@ start_time(void) | |||||||
|    example code) or other system parameters - e.g. reading the current value of |    example code) or other system parameters - e.g. reading the current value of | ||||||
|    cpu cycles counter. |    cpu cycles counter. | ||||||
| */ | */ | ||||||
| void | void stop_time(void) { GETMYTIME(&stop_time_val); } | ||||||
| stop_time(void) |  | ||||||
| { |  | ||||||
|     GETMYTIME(&stop_time_val); |  | ||||||
| } |  | ||||||
| /* Function : get_time | /* Function : get_time | ||||||
|         Return an abstract "ticks" number that signifies time on the system. |         Return an abstract "ticks" number that signifies time on the system. | ||||||
|  |  | ||||||
| @@ -146,10 +138,8 @@ stop_time(void) | |||||||
|    controlled by <TIMER_RES_DIVIDER> |    controlled by <TIMER_RES_DIVIDER> | ||||||
| */ | */ | ||||||
| CORE_TICKS | CORE_TICKS | ||||||
| get_time(void) | get_time(void) { | ||||||
| { |   CORE_TICKS elapsed = (CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); | ||||||
|     CORE_TICKS elapsed |  | ||||||
|         = (CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); |  | ||||||
|   return elapsed; |   return elapsed; | ||||||
| } | } | ||||||
| /* Function : time_in_secs | /* Function : time_in_secs | ||||||
| @@ -159,9 +149,7 @@ get_time(void) | |||||||
|    floating point. Default implementation implemented by the EE_TICKS_PER_SEC |    floating point. Default implementation implemented by the EE_TICKS_PER_SEC | ||||||
|    macro above. |    macro above. | ||||||
| */ | */ | ||||||
| secs_ret | secs_ret time_in_secs(CORE_TICKS ticks) { | ||||||
| time_in_secs(CORE_TICKS ticks) |  | ||||||
| { |  | ||||||
|   secs_ret retval = ((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; |   secs_ret retval = ((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; | ||||||
|   return retval; |   return retval; | ||||||
| } | } | ||||||
| @@ -172,17 +160,12 @@ ee_u32 default_num_contexts = 1; | |||||||
|         Target specific initialization code |         Target specific initialization code | ||||||
|         Test for some common mistakes. |         Test for some common mistakes. | ||||||
| */ | */ | ||||||
| void | void portable_init(core_portable *p, int *argc, char *argv[]) { | ||||||
| portable_init(core_portable *p, int *argc, char *argv[]) |   if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { | ||||||
| { |     ee_printf("ERROR! Please define ee_ptr_int to a type that holds a " | ||||||
|     if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) |  | ||||||
|     { |  | ||||||
|         ee_printf( |  | ||||||
|             "ERROR! Please define ee_ptr_int to a type that holds a " |  | ||||||
|               "pointer!\n"); |               "pointer!\n"); | ||||||
|   } |   } | ||||||
|     if (sizeof(ee_u32) != 4) |   if (sizeof(ee_u32) != 4) { | ||||||
|     { |  | ||||||
|     ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); |     ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); | ||||||
|   } |   } | ||||||
|   p->portable_id = 1; |   p->portable_id = 1; | ||||||
| @@ -191,8 +174,4 @@ portable_init(core_portable *p, int *argc, char *argv[]) | |||||||
| /* Function : portable_fini | /* Function : portable_fini | ||||||
|         Target specific final code |         Target specific final code | ||||||
| */ | */ | ||||||
| void | void portable_fini(core_portable *p) { p->portable_id = 0; } | ||||||
| portable_fini(core_portable *p) |  | ||||||
| { |  | ||||||
|     p->portable_id = 0; |  | ||||||
| } |  | ||||||
|   | |||||||
| @@ -16,6 +16,7 @@ limitations under the License. | |||||||
|  |  | ||||||
| #include <coremark.h> | #include <coremark.h> | ||||||
| #include <stdarg.h> | #include <stdarg.h> | ||||||
|  | #include <unistd.h> | ||||||
|  |  | ||||||
| #define ZEROPAD (1 << 0)   /* Pad with zero */ | #define ZEROPAD (1 << 0)   /* Pad with zero */ | ||||||
| #define SIGN (1 << 1)      /* Unsigned/signed long */ | #define SIGN (1 << 1)      /* Unsigned/signed long */ | ||||||
| @@ -27,31 +28,26 @@ limitations under the License. | |||||||
|  |  | ||||||
| #define is_digit(c) ((c) >= '0' && (c) <= '9') | #define is_digit(c) ((c) >= '0' && (c) <= '9') | ||||||
|  |  | ||||||
| static char *    digits       = "0123456789abcdefghijklmnopqrstuvwxyz"; | static char *digits = "0123456789abcdefghijklmnopqrstuvwxyz"; | ||||||
| static char *    upper_digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; | static char *upper_digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; | ||||||
| static ee_size_t strnlen(const char *s, ee_size_t count); | static ee_size_t strnlen(const char *s, ee_size_t count); | ||||||
|  |  | ||||||
| static ee_size_t | static ee_size_t strnlen(const char *s, ee_size_t count) { | ||||||
| strnlen(const char *s, ee_size_t count) |  | ||||||
| { |  | ||||||
|   const char *sc; |   const char *sc; | ||||||
|   for (sc = s; *sc != '\0' && count--; ++sc) |   for (sc = s; *sc != '\0' && count--; ++sc) | ||||||
|     ; |     ; | ||||||
|   return sc - s; |   return sc - s; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int | static int skip_atoi(const char **s) { | ||||||
| skip_atoi(const char **s) |  | ||||||
| { |  | ||||||
|   int i = 0; |   int i = 0; | ||||||
|   while (is_digit(**s)) |   while (is_digit(**s)) | ||||||
|     i = i * 10 + *((*s)++) - '0'; |     i = i * 10 + *((*s)++) - '0'; | ||||||
|   return i; |   return i; | ||||||
| } | } | ||||||
|  |  | ||||||
| static char * | static char *number(char *str, long num, int base, int size, int precision, | ||||||
| number(char *str, long num, int base, int size, int precision, int type) |                     int type) { | ||||||
| { |  | ||||||
|   char c, sign, tmp[66]; |   char c, sign, tmp[66]; | ||||||
|   char *dig = digits; |   char *dig = digits; | ||||||
|   int i; |   int i; | ||||||
| @@ -65,28 +61,21 @@ number(char *str, long num, int base, int size, int precision, int type) | |||||||
|  |  | ||||||
|   c = (type & ZEROPAD) ? '0' : ' '; |   c = (type & ZEROPAD) ? '0' : ' '; | ||||||
|   sign = 0; |   sign = 0; | ||||||
|     if (type & SIGN) |   if (type & SIGN) { | ||||||
|     { |     if (num < 0) { | ||||||
|         if (num < 0) |  | ||||||
|         { |  | ||||||
|       sign = '-'; |       sign = '-'; | ||||||
|       num = -num; |       num = -num; | ||||||
|       size--; |       size--; | ||||||
|         } |     } else if (type & PLUS) { | ||||||
|         else if (type & PLUS) |  | ||||||
|         { |  | ||||||
|       sign = '+'; |       sign = '+'; | ||||||
|       size--; |       size--; | ||||||
|         } |     } else if (type & SPACE) { | ||||||
|         else if (type & SPACE) |  | ||||||
|         { |  | ||||||
|       sign = ' '; |       sign = ' '; | ||||||
|       size--; |       size--; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|     if (type & HEX_PREP) |   if (type & HEX_PREP) { | ||||||
|     { |  | ||||||
|     if (base == 16) |     if (base == 16) | ||||||
|       size -= 2; |       size -= 2; | ||||||
|     else if (base == 8) |     else if (base == 8) | ||||||
| @@ -97,10 +86,8 @@ number(char *str, long num, int base, int size, int precision, int type) | |||||||
|  |  | ||||||
|   if (num == 0) |   if (num == 0) | ||||||
|     tmp[i++] = '0'; |     tmp[i++] = '0'; | ||||||
|     else |   else { | ||||||
|     { |     while (num != 0) { | ||||||
|         while (num != 0) |  | ||||||
|         { |  | ||||||
|       tmp[i++] = dig[((unsigned long)num) % (unsigned)base]; |       tmp[i++] = dig[((unsigned long)num) % (unsigned)base]; | ||||||
|       num = ((unsigned long)num) / (unsigned)base; |       num = ((unsigned long)num) / (unsigned)base; | ||||||
|     } |     } | ||||||
| @@ -115,12 +102,10 @@ number(char *str, long num, int base, int size, int precision, int type) | |||||||
|   if (sign) |   if (sign) | ||||||
|     *str++ = sign; |     *str++ = sign; | ||||||
|  |  | ||||||
|     if (type & HEX_PREP) |   if (type & HEX_PREP) { | ||||||
|     { |  | ||||||
|     if (base == 8) |     if (base == 8) | ||||||
|       *str++ = '0'; |       *str++ = '0'; | ||||||
|         else if (base == 16) |     else if (base == 16) { | ||||||
|         { |  | ||||||
|       *str++ = '0'; |       *str++ = '0'; | ||||||
|       *str++ = digits[33]; |       *str++ = digits[33]; | ||||||
|     } |     } | ||||||
| @@ -139,9 +124,8 @@ number(char *str, long num, int base, int size, int precision, int type) | |||||||
|   return str; |   return str; | ||||||
| } | } | ||||||
|  |  | ||||||
| static char * | static char *eaddr(char *str, unsigned char *addr, int size, int precision, | ||||||
| eaddr(char *str, unsigned char *addr, int size, int precision, int type) |                    int type) { | ||||||
| { |  | ||||||
|   char tmp[24]; |   char tmp[24]; | ||||||
|   char *dig = digits; |   char *dig = digits; | ||||||
|   int i, len; |   int i, len; | ||||||
| @@ -149,8 +133,7 @@ eaddr(char *str, unsigned char *addr, int size, int precision, int type) | |||||||
|   if (type & UPPERCASE) |   if (type & UPPERCASE) | ||||||
|     dig = upper_digits; |     dig = upper_digits; | ||||||
|   len = 0; |   len = 0; | ||||||
|     for (i = 0; i < 6; i++) |   for (i = 0; i < 6; i++) { | ||||||
|     { |  | ||||||
|     if (i != 0) |     if (i != 0) | ||||||
|       tmp[len++] = ':'; |       tmp[len++] = ':'; | ||||||
|     tmp[len++] = dig[addr[i] >> 4]; |     tmp[len++] = dig[addr[i] >> 4]; | ||||||
| @@ -168,32 +151,26 @@ eaddr(char *str, unsigned char *addr, int size, int precision, int type) | |||||||
|   return str; |   return str; | ||||||
| } | } | ||||||
|  |  | ||||||
| static char * | static char *iaddr(char *str, unsigned char *addr, int size, int precision, | ||||||
| iaddr(char *str, unsigned char *addr, int size, int precision, int type) |                    int type) { | ||||||
| { |  | ||||||
|   char tmp[24]; |   char tmp[24]; | ||||||
|   int i, n, len; |   int i, n, len; | ||||||
|  |  | ||||||
|   len = 0; |   len = 0; | ||||||
|     for (i = 0; i < 4; i++) |   for (i = 0; i < 4; i++) { | ||||||
|     { |  | ||||||
|     if (i != 0) |     if (i != 0) | ||||||
|       tmp[len++] = '.'; |       tmp[len++] = '.'; | ||||||
|     n = addr[i]; |     n = addr[i]; | ||||||
|  |  | ||||||
|     if (n == 0) |     if (n == 0) | ||||||
|       tmp[len++] = digits[0]; |       tmp[len++] = digits[0]; | ||||||
|         else |     else { | ||||||
|         { |       if (n >= 100) { | ||||||
|             if (n >= 100) |  | ||||||
|             { |  | ||||||
|         tmp[len++] = digits[n / 100]; |         tmp[len++] = digits[n / 100]; | ||||||
|         n = n % 100; |         n = n % 100; | ||||||
|         tmp[len++] = digits[n / 10]; |         tmp[len++] = digits[n / 10]; | ||||||
|         n = n % 10; |         n = n % 10; | ||||||
|             } |       } else if (n >= 10) { | ||||||
|             else if (n >= 10) |  | ||||||
|             { |  | ||||||
|         tmp[len++] = digits[n / 10]; |         tmp[len++] = digits[n / 10]; | ||||||
|         n = n % 10; |         n = n % 10; | ||||||
|       } |       } | ||||||
| @@ -215,51 +192,41 @@ iaddr(char *str, unsigned char *addr, int size, int precision, int type) | |||||||
|  |  | ||||||
| #if HAS_FLOAT | #if HAS_FLOAT | ||||||
|  |  | ||||||
| char *      ecvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf); | char *ecvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf); | ||||||
| char *      fcvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf); | char *fcvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf); | ||||||
| static void ee_bufcpy(char *d, char *s, int count); | static void ee_bufcpy(char *d, char *s, int count); | ||||||
|  |  | ||||||
| void | void ee_bufcpy(char *pd, char *ps, int count) { | ||||||
| ee_bufcpy(char *pd, char *ps, int count) |  | ||||||
| { |  | ||||||
|   char *pe = ps + count; |   char *pe = ps + count; | ||||||
|   while (ps != pe) |   while (ps != pe) | ||||||
|     *pd++ = *ps++; |     *pd++ = *ps++; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void parse_float(double value, char *buffer, char fmt, int precision) { | ||||||
| parse_float(double value, char *buffer, char fmt, int precision) |  | ||||||
| { |  | ||||||
|   int decpt, sign, exp, pos; |   int decpt, sign, exp, pos; | ||||||
|   char *digits = NULL; |   char *digits = NULL; | ||||||
|   char cvtbuf[80]; |   char cvtbuf[80]; | ||||||
|   int capexp = 0; |   int capexp = 0; | ||||||
|   int magnitude; |   int magnitude; | ||||||
|  |  | ||||||
|     if (fmt == 'G' || fmt == 'E') |   if (fmt == 'G' || fmt == 'E') { | ||||||
|     { |  | ||||||
|     capexp = 1; |     capexp = 1; | ||||||
|     fmt += 'a' - 'A'; |     fmt += 'a' - 'A'; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|     if (fmt == 'g') |   if (fmt == 'g') { | ||||||
|     { |  | ||||||
|     digits = ecvtbuf(value, precision, &decpt, &sign, cvtbuf); |     digits = ecvtbuf(value, precision, &decpt, &sign, cvtbuf); | ||||||
|     magnitude = decpt - 1; |     magnitude = decpt - 1; | ||||||
|         if (magnitude < -4 || magnitude > precision - 1) |     if (magnitude < -4 || magnitude > precision - 1) { | ||||||
|         { |  | ||||||
|       fmt = 'e'; |       fmt = 'e'; | ||||||
|       precision -= 1; |       precision -= 1; | ||||||
|         } |     } else { | ||||||
|         else |  | ||||||
|         { |  | ||||||
|       fmt = 'f'; |       fmt = 'f'; | ||||||
|       precision -= decpt; |       precision -= decpt; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|     if (fmt == 'e') |   if (fmt == 'e') { | ||||||
|     { |  | ||||||
|     digits = ecvtbuf(value, precision + 1, &decpt, &sign, cvtbuf); |     digits = ecvtbuf(value, precision + 1, &decpt, &sign, cvtbuf); | ||||||
|  |  | ||||||
|     if (sign) |     if (sign) | ||||||
| @@ -271,22 +238,18 @@ parse_float(double value, char *buffer, char fmt, int precision) | |||||||
|     buffer += precision; |     buffer += precision; | ||||||
|     *buffer++ = capexp ? 'E' : 'e'; |     *buffer++ = capexp ? 'E' : 'e'; | ||||||
|  |  | ||||||
|         if (decpt == 0) |     if (decpt == 0) { | ||||||
|         { |  | ||||||
|       if (value == 0.0) |       if (value == 0.0) | ||||||
|         exp = 0; |         exp = 0; | ||||||
|       else |       else | ||||||
|         exp = -1; |         exp = -1; | ||||||
|         } |     } else | ||||||
|         else |  | ||||||
|       exp = decpt - 1; |       exp = decpt - 1; | ||||||
|  |  | ||||||
|         if (exp < 0) |     if (exp < 0) { | ||||||
|         { |  | ||||||
|       *buffer++ = '-'; |       *buffer++ = '-'; | ||||||
|       exp = -exp; |       exp = -exp; | ||||||
|         } |     } else | ||||||
|         else |  | ||||||
|       *buffer++ = '+'; |       *buffer++ = '+'; | ||||||
|  |  | ||||||
|     buffer[2] = (exp % 10) + '0'; |     buffer[2] = (exp % 10) + '0'; | ||||||
| @@ -295,39 +258,29 @@ parse_float(double value, char *buffer, char fmt, int precision) | |||||||
|     exp = exp / 10; |     exp = exp / 10; | ||||||
|     buffer[0] = (exp % 10) + '0'; |     buffer[0] = (exp % 10) + '0'; | ||||||
|     buffer += 3; |     buffer += 3; | ||||||
|     } |   } else if (fmt == 'f') { | ||||||
|     else if (fmt == 'f') |  | ||||||
|     { |  | ||||||
|     digits = fcvtbuf(value, precision, &decpt, &sign, cvtbuf); |     digits = fcvtbuf(value, precision, &decpt, &sign, cvtbuf); | ||||||
|     if (sign) |     if (sign) | ||||||
|       *buffer++ = '-'; |       *buffer++ = '-'; | ||||||
|         if (*digits) |     if (*digits) { | ||||||
|         { |       if (decpt <= 0) { | ||||||
|             if (decpt <= 0) |  | ||||||
|             { |  | ||||||
|         *buffer++ = '0'; |         *buffer++ = '0'; | ||||||
|         *buffer++ = '.'; |         *buffer++ = '.'; | ||||||
|         for (pos = 0; pos < -decpt; pos++) |         for (pos = 0; pos < -decpt; pos++) | ||||||
|           *buffer++ = '0'; |           *buffer++ = '0'; | ||||||
|         while (*digits) |         while (*digits) | ||||||
|           *buffer++ = *digits++; |           *buffer++ = *digits++; | ||||||
|             } |       } else { | ||||||
|             else |  | ||||||
|             { |  | ||||||
|         pos = 0; |         pos = 0; | ||||||
|                 while (*digits) |         while (*digits) { | ||||||
|                 { |  | ||||||
|           if (pos++ == decpt) |           if (pos++ == decpt) | ||||||
|             *buffer++ = '.'; |             *buffer++ = '.'; | ||||||
|           *buffer++ = *digits++; |           *buffer++ = *digits++; | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|         } |     } else { | ||||||
|         else |  | ||||||
|         { |  | ||||||
|       *buffer++ = '0'; |       *buffer++ = '0'; | ||||||
|             if (precision > 0) |       if (precision > 0) { | ||||||
|             { |  | ||||||
|         *buffer++ = '.'; |         *buffer++ = '.'; | ||||||
|         for (pos = 0; pos < precision; pos++) |         for (pos = 0; pos < precision; pos++) | ||||||
|           *buffer++ = '0'; |           *buffer++ = '0'; | ||||||
| @@ -338,11 +291,8 @@ parse_float(double value, char *buffer, char fmt, int precision) | |||||||
|   *buffer = '\0'; |   *buffer = '\0'; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void decimal_point(char *buffer) { | ||||||
| decimal_point(char *buffer) |   while (*buffer) { | ||||||
| { |  | ||||||
|     while (*buffer) |  | ||||||
|     { |  | ||||||
|     if (*buffer == '.') |     if (*buffer == '.') | ||||||
|       return; |       return; | ||||||
|     if (*buffer == 'e' || *buffer == 'E') |     if (*buffer == 'e' || *buffer == 'E') | ||||||
| @@ -350,33 +300,26 @@ decimal_point(char *buffer) | |||||||
|     buffer++; |     buffer++; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|     if (*buffer) |   if (*buffer) { | ||||||
|     { |  | ||||||
|     int n = strnlen(buffer, 256); |     int n = strnlen(buffer, 256); | ||||||
|         while (n > 0) |     while (n > 0) { | ||||||
|         { |  | ||||||
|       buffer[n + 1] = buffer[n]; |       buffer[n + 1] = buffer[n]; | ||||||
|       n--; |       n--; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     *buffer = '.'; |     *buffer = '.'; | ||||||
|     } |   } else { | ||||||
|     else |  | ||||||
|     { |  | ||||||
|     *buffer++ = '.'; |     *buffer++ = '.'; | ||||||
|     *buffer = '\0'; |     *buffer = '\0'; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void cropzeros(char *buffer) { | ||||||
| cropzeros(char *buffer) |  | ||||||
| { |  | ||||||
|   char *stop; |   char *stop; | ||||||
|  |  | ||||||
|   while (*buffer && *buffer != '.') |   while (*buffer && *buffer != '.') | ||||||
|     buffer++; |     buffer++; | ||||||
|     if (*buffer++) |   if (*buffer++) { | ||||||
|     { |  | ||||||
|     while (*buffer && *buffer != 'e' && *buffer != 'E') |     while (*buffer && *buffer != 'e' && *buffer != 'E') | ||||||
|       buffer++; |       buffer++; | ||||||
|     stop = buffer--; |     stop = buffer--; | ||||||
| @@ -389,9 +332,8 @@ cropzeros(char *buffer) | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| static char * | static char *flt(char *str, double num, int size, int precision, char fmt, | ||||||
| flt(char *str, double num, int size, int precision, char fmt, int flags) |                  int flags) { | ||||||
| { |  | ||||||
|   char tmp[80]; |   char tmp[80]; | ||||||
|   char c, sign; |   char c, sign; | ||||||
|   int n, i; |   int n, i; | ||||||
| @@ -403,21 +345,15 @@ flt(char *str, double num, int size, int precision, char fmt, int flags) | |||||||
|   // Determine padding and sign char |   // Determine padding and sign char | ||||||
|   c = (flags & ZEROPAD) ? '0' : ' '; |   c = (flags & ZEROPAD) ? '0' : ' '; | ||||||
|   sign = 0; |   sign = 0; | ||||||
|     if (flags & SIGN) |   if (flags & SIGN) { | ||||||
|     { |     if (num < 0.0) { | ||||||
|         if (num < 0.0) |  | ||||||
|         { |  | ||||||
|       sign = '-'; |       sign = '-'; | ||||||
|       num = -num; |       num = -num; | ||||||
|       size--; |       size--; | ||||||
|         } |     } else if (flags & PLUS) { | ||||||
|         else if (flags & PLUS) |  | ||||||
|         { |  | ||||||
|       sign = '+'; |       sign = '+'; | ||||||
|       size--; |       size--; | ||||||
|         } |     } else if (flags & SPACE) { | ||||||
|         else if (flags & SPACE) |  | ||||||
|         { |  | ||||||
|       sign = ' '; |       sign = ' '; | ||||||
|       size--; |       size--; | ||||||
|     } |     } | ||||||
| @@ -457,14 +393,12 @@ flt(char *str, double num, int size, int precision, char fmt, int flags) | |||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| static int | static int ee_vsprintf(char *buf, const char *fmt, va_list args) { | ||||||
| ee_vsprintf(char *buf, const char *fmt, va_list args) |  | ||||||
| { |  | ||||||
|   int len; |   int len; | ||||||
|   unsigned long num; |   unsigned long num; | ||||||
|   int i, base; |   int i, base; | ||||||
|     char *        str; |   char *str; | ||||||
|     char *        s; |   char *s; | ||||||
|  |  | ||||||
|   int flags; // Flags to number() |   int flags; // Flags to number() | ||||||
|  |  | ||||||
| @@ -473,10 +407,8 @@ ee_vsprintf(char *buf, const char *fmt, va_list args) | |||||||
|                    // from string |                    // from string | ||||||
|   int qualifier;   // 'h', 'l', or 'L' for integer fields |   int qualifier;   // 'h', 'l', or 'L' for integer fields | ||||||
|  |  | ||||||
|     for (str = buf; *fmt; fmt++) |   for (str = buf; *fmt; fmt++) { | ||||||
|     { |     if (*fmt != '%') { | ||||||
|         if (*fmt != '%') |  | ||||||
|         { |  | ||||||
|       *str++ = *fmt; |       *str++ = *fmt; | ||||||
|       continue; |       continue; | ||||||
|     } |     } | ||||||
| @@ -485,8 +417,7 @@ ee_vsprintf(char *buf, const char *fmt, va_list args) | |||||||
|     flags = 0; |     flags = 0; | ||||||
|   repeat: |   repeat: | ||||||
|     fmt++; // This also skips first '%' |     fmt++; // This also skips first '%' | ||||||
|         switch (*fmt) |     switch (*fmt) { | ||||||
|         { |  | ||||||
|     case '-': |     case '-': | ||||||
|       flags |= LEFT; |       flags |= LEFT; | ||||||
|       goto repeat; |       goto repeat; | ||||||
| @@ -508,12 +439,10 @@ ee_vsprintf(char *buf, const char *fmt, va_list args) | |||||||
|     field_width = -1; |     field_width = -1; | ||||||
|     if (is_digit(*fmt)) |     if (is_digit(*fmt)) | ||||||
|       field_width = skip_atoi(&fmt); |       field_width = skip_atoi(&fmt); | ||||||
|         else if (*fmt == '*') |     else if (*fmt == '*') { | ||||||
|         { |  | ||||||
|       fmt++; |       fmt++; | ||||||
|       field_width = va_arg(args, int); |       field_width = va_arg(args, int); | ||||||
|             if (field_width < 0) |       if (field_width < 0) { | ||||||
|             { |  | ||||||
|         field_width = -field_width; |         field_width = -field_width; | ||||||
|         flags |= LEFT; |         flags |= LEFT; | ||||||
|       } |       } | ||||||
| @@ -521,13 +450,11 @@ ee_vsprintf(char *buf, const char *fmt, va_list args) | |||||||
|  |  | ||||||
|     // Get the precision |     // Get the precision | ||||||
|     precision = -1; |     precision = -1; | ||||||
|         if (*fmt == '.') |     if (*fmt == '.') { | ||||||
|         { |  | ||||||
|       ++fmt; |       ++fmt; | ||||||
|       if (is_digit(*fmt)) |       if (is_digit(*fmt)) | ||||||
|         precision = skip_atoi(&fmt); |         precision = skip_atoi(&fmt); | ||||||
|             else if (*fmt == '*') |       else if (*fmt == '*') { | ||||||
|             { |  | ||||||
|         ++fmt; |         ++fmt; | ||||||
|         precision = va_arg(args, int); |         precision = va_arg(args, int); | ||||||
|       } |       } | ||||||
| @@ -537,8 +464,7 @@ ee_vsprintf(char *buf, const char *fmt, va_list args) | |||||||
|  |  | ||||||
|     // Get the conversion qualifier |     // Get the conversion qualifier | ||||||
|     qualifier = -1; |     qualifier = -1; | ||||||
|         if (*fmt == 'l' || *fmt == 'L') |     if (*fmt == 'l' || *fmt == 'L') { | ||||||
|         { |  | ||||||
|       qualifier = *fmt; |       qualifier = *fmt; | ||||||
|       fmt++; |       fmt++; | ||||||
|     } |     } | ||||||
| @@ -546,8 +472,7 @@ ee_vsprintf(char *buf, const char *fmt, va_list args) | |||||||
|     // Default base |     // Default base | ||||||
|     base = 10; |     base = 10; | ||||||
|  |  | ||||||
|         switch (*fmt) |     switch (*fmt) { | ||||||
|         { |  | ||||||
|     case 'c': |     case 'c': | ||||||
|       if (!(flags & LEFT)) |       if (!(flags & LEFT)) | ||||||
|         while (--field_width > 0) |         while (--field_width > 0) | ||||||
| @@ -572,17 +497,12 @@ ee_vsprintf(char *buf, const char *fmt, va_list args) | |||||||
|       continue; |       continue; | ||||||
|  |  | ||||||
|     case 'p': |     case 'p': | ||||||
|                 if (field_width == -1) |       if (field_width == -1) { | ||||||
|                 { |  | ||||||
|         field_width = 2 * sizeof(void *); |         field_width = 2 * sizeof(void *); | ||||||
|         flags |= ZEROPAD; |         flags |= ZEROPAD; | ||||||
|       } |       } | ||||||
|                 str = number(str, |       str = number(str, (unsigned long)va_arg(args, void *), 16, field_width, | ||||||
|                              (unsigned long)va_arg(args, void *), |                    precision, flags); | ||||||
|                              16, |  | ||||||
|                              field_width, |  | ||||||
|                              precision, |  | ||||||
|                              flags); |  | ||||||
|       continue; |       continue; | ||||||
|  |  | ||||||
|     case 'A': |     case 'A': | ||||||
| @@ -590,16 +510,10 @@ ee_vsprintf(char *buf, const char *fmt, va_list args) | |||||||
|  |  | ||||||
|     case 'a': |     case 'a': | ||||||
|       if (qualifier == 'l') |       if (qualifier == 'l') | ||||||
|                     str = eaddr(str, |         str = eaddr(str, va_arg(args, unsigned char *), field_width, precision, | ||||||
|                                 va_arg(args, unsigned char *), |  | ||||||
|                                 field_width, |  | ||||||
|                                 precision, |  | ||||||
|                     flags); |                     flags); | ||||||
|       else |       else | ||||||
|                     str = iaddr(str, |         str = iaddr(str, va_arg(args, unsigned char *), field_width, precision, | ||||||
|                                 va_arg(args, unsigned char *), |  | ||||||
|                                 field_width, |  | ||||||
|                                 precision, |  | ||||||
|                     flags); |                     flags); | ||||||
|       continue; |       continue; | ||||||
|  |  | ||||||
| @@ -625,11 +539,7 @@ ee_vsprintf(char *buf, const char *fmt, va_list args) | |||||||
| #if HAS_FLOAT | #if HAS_FLOAT | ||||||
|  |  | ||||||
|     case 'f': |     case 'f': | ||||||
|                 str = flt(str, |       str = flt(str, va_arg(args, double), field_width, precision, *fmt, | ||||||
|                           va_arg(args, double), |  | ||||||
|                           field_width, |  | ||||||
|                           precision, |  | ||||||
|                           *fmt, |  | ||||||
|                 flags | SIGN); |                 flags | SIGN); | ||||||
|       continue; |       continue; | ||||||
|  |  | ||||||
| @@ -661,31 +571,9 @@ ee_vsprintf(char *buf, const char *fmt, va_list args) | |||||||
|  |  | ||||||
| #include <platform.h> | #include <platform.h> | ||||||
|  |  | ||||||
| void | void uart_send_char(char c) { write(STDOUT_FILENO, &c, 1); } | ||||||
| uart_send_char(char c) |  | ||||||
| { |  | ||||||
| #if defined(BOARD_ehrenberg) |  | ||||||
|             while (get_uart_rx_tx_reg_tx_free(uart)==0) ; |  | ||||||
|             uart_write(uart, c); |  | ||||||
|             if (c == '\n') { |  | ||||||
|                 while (get_uart_rx_tx_reg_tx_free(uart)==0) ; |  | ||||||
|                 uart_write(uart, '\r'); |  | ||||||
|             } |  | ||||||
| #elif defined(BOARD_iss) |  | ||||||
|             *((uint32_t*) 0xFFFF0000) = c; |  | ||||||
| #else |  | ||||||
|             while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; |  | ||||||
|             UART0_REG(UART_REG_TXFIFO) = c; |  | ||||||
|             if (c == '\n') { |  | ||||||
|                 while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; |  | ||||||
|                 UART0_REG(UART_REG_TXFIFO) = '\r'; |  | ||||||
|             } |  | ||||||
| #endif |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int | int ee_printf(const char *fmt, ...) { | ||||||
| ee_printf(const char *fmt, ...) |  | ||||||
| { |  | ||||||
|   char buf[1024], *p; |   char buf[1024], *p; | ||||||
|   va_list args; |   va_list args; | ||||||
|   int n = 0; |   int n = 0; | ||||||
| @@ -694,8 +582,7 @@ ee_printf(const char *fmt, ...) | |||||||
|   ee_vsprintf(buf, fmt, args); |   ee_vsprintf(buf, fmt, args); | ||||||
|   va_end(args); |   va_end(args); | ||||||
|   p = buf; |   p = buf; | ||||||
|     while (*p) |   while (*p) { | ||||||
|     { |  | ||||||
|     uart_send_char(*p); |     uart_send_char(*p); | ||||||
|     n++; |     n++; | ||||||
|     p++; |     p++; | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								benchmarks/dhrystone/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								benchmarks/dhrystone/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,2 +1,3 @@ | |||||||
| dhrystone | dhrystone | ||||||
| /dhrystone.dis | /dhrystone.dis | ||||||
|  | build/ | ||||||
							
								
								
									
										28
									
								
								benchmarks/dhrystone/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								benchmarks/dhrystone/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | cmake_minimum_required(VERSION 3.21) | ||||||
|  | project(dhrystone C) | ||||||
|  | set(TARGET dhrystone) | ||||||
|  |  | ||||||
|  | set(ITERATIONS 50000 CACHE STRING "") | ||||||
|  | set(FREQ 100e6 CACHE STRING "") | ||||||
|  |  | ||||||
|  | set(CMAKE_C_FLAGS_RELEASE -O3) | ||||||
|  |  | ||||||
|  | add_executable(${TARGET} dhry_1.c dhry_2.c dhry_stubs.c) | ||||||
|  | target_include_directories(${TARGET} PRIVATE ${CMAKE_CURRENT_LIST_DIR}) | ||||||
|  | target_compile_options(${TARGET} PRIVATE  | ||||||
|  |         -Wno-implicit -fno-builtin-printf  | ||||||
|  |         -finline -fno-common -funroll-loops -fpeel-loops  | ||||||
|  |         -finline-functions -finline-limit=1000 | ||||||
|  |         -fgcse-sm -fgcse-las  | ||||||
|  |         -falign-functions=16 -falign-jumps=4 -falign-loops=4  | ||||||
|  |         -freorder-blocks-and-partition -fno-if-conversion2 -fno-crossjumping) | ||||||
|  | target_compile_definitions(${TARGET} PRIVATE ITERATIONS=${ITERATIONS} HZ=${FREQ} TIME NO_INIT) | ||||||
|  |  | ||||||
|  | set(BOARD "iss" CACHE STRING "Target board") | ||||||
|  | add_subdirectory(../../bare-metal-bsp bsp) | ||||||
|  | target_link_libraries(${TARGET} PRIVATE bsp) | ||||||
|  | target_link_options(${TARGET} PRIVATE LINKER:-Map=${TARGET}.map -Wl,--wrap=scanf) | ||||||
|  |  | ||||||
|  | add_custom_command(TARGET ${TARGET} POST_BUILD | ||||||
|  |         COMMAND ${CMAKE_OBJDUMP} -S ${TARGET}.elf > ${TARGET}.dis | ||||||
|  |         COMMENT "Creating disassembly for ${TARGET}") | ||||||
							
								
								
									
										118
									
								
								benchmarks/dhrystone/CMakePresets.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								benchmarks/dhrystone/CMakePresets.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,118 @@ | |||||||
|  | { | ||||||
|  |     "version": 3, | ||||||
|  |     "vendor": { | ||||||
|  |         "conan": {} | ||||||
|  |     }, | ||||||
|  |     "cmakeMinimumRequired": { | ||||||
|  |         "major": 3, | ||||||
|  |         "minor": 24, | ||||||
|  |         "patch": 0 | ||||||
|  |     }, | ||||||
|  |     "configurePresets": [ | ||||||
|  |         { | ||||||
|  |             "name": "32imc", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv32imc.cmake" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "64imc", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "CMAKE_TOOLCHAIN_FILE": "../../bare-metal-bsp/cmake/rv64gc.cmake" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "iss", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "BOARD": "iss" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "moonlight", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "BOARD": "moonlight" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "tgc_vp", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "BOARD": "tgc_vp" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "rtl", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "BOARD": "rtl" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "debug", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "CMAKE_BUILD_TYPE": "Debug" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "release", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "CMAKE_BUILD_TYPE": "Release" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "ISS_Debug", | ||||||
|  |             "inherits": ["iss", "debug", "32imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "Moonlight_Debug", | ||||||
|  |             "inherits": ["moonlight", "debug", "32imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "TGC_VP_Debug", | ||||||
|  |             "inherits": ["tgc_vp", "debug", "32imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "ISS_Debug_64", | ||||||
|  |             "inherits": ["iss", "debug", "64imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "Moonlight_Debug_64", | ||||||
|  |             "inherits": ["moonlight", "debug", "64imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "TGC_VP_Debug_64", | ||||||
|  |             "inherits": ["tgc_vp", "debug", "64imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "ISS_Release", | ||||||
|  |             "inherits": ["iss", "release", "32imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "Moonlight_Release", | ||||||
|  |             "inherits": ["moonlight", "release", "32imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "TGC_VP_Release", | ||||||
|  |             "inherits": ["tgc_vp", "release", "32imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "ISS_Release_64", | ||||||
|  |             "inherits": ["iss", "release", "64imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "Moonlight_Release_64", | ||||||
|  |             "inherits": ["moonlight", "release", "64imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "TGC_VP_Release_64", | ||||||
|  |             "inherits": ["tgc_vp", "release", "64imc"] | ||||||
|  |         } | ||||||
|  |                   | ||||||
|  |     ] | ||||||
|  | } | ||||||
| @@ -9,7 +9,7 @@ HEADERS := dhry.h | |||||||
| BOARD?=iss | BOARD?=iss | ||||||
| LINK_TARGET=link | LINK_TARGET=link | ||||||
| RISCV_ARCH:=rv32$(ISA) | RISCV_ARCH:=rv32$(ISA) | ||||||
| ifeq ($(ISA),e) | ifneq (,$(findstring e,$(ISA))) | ||||||
|     RISCV_ABI:=ilp32e |     RISCV_ABI:=ilp32e | ||||||
| else | else | ||||||
|     RISCV_ABI:=ilp32 |     RISCV_ABI:=ilp32 | ||||||
| @@ -17,7 +17,7 @@ endif | |||||||
| # '-lgcc -lm' are needed to add softfloat routines | # '-lgcc -lm' are needed to add softfloat routines | ||||||
| CFLAGS  := -g -O3 -DITERATIONS=$(ITERATIONS) -DHZ=32768 -DTIME -DNO_INIT -fno-inline -fno-builtin-printf -fno-common -Wno-implicit \ | CFLAGS  := -g -O3 -DITERATIONS=$(ITERATIONS) -DHZ=32768 -DTIME -DNO_INIT -fno-inline -fno-builtin-printf -fno-common -Wno-implicit \ | ||||||
|  -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las |  -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las | ||||||
|  | LDFLAGS := -Wl,--wrap=scanf | ||||||
| TOOL_DIR=$(dir $(compiler)) | TOOL_DIR=$(dir $(compiler)) | ||||||
|  |  | ||||||
| BSP_BASE = ../../bare-metal-bsp | BSP_BASE = ../../bare-metal-bsp | ||||||
|   | |||||||
| @@ -212,7 +212,7 @@ main () | |||||||
|   printf ("Arr_2_Glob[8][7]:    %d\n", Arr_2_Glob[8][7]); |   printf ("Arr_2_Glob[8][7]:    %d\n", Arr_2_Glob[8][7]); | ||||||
|   printf ("        should be:   Number_Of_Runs + 10\n"); |   printf ("        should be:   Number_Of_Runs + 10\n"); | ||||||
|   printf ("Ptr_Glob->\n"); |   printf ("Ptr_Glob->\n"); | ||||||
|   printf ("  Ptr_Comp:          %d\n", (int) Ptr_Glob->Ptr_Comp); |   printf ("  Ptr_Comp:          %d\n", (long) Ptr_Glob->Ptr_Comp); | ||||||
|   printf ("        should be:   (implementation-dependent)\n"); |   printf ("        should be:   (implementation-dependent)\n"); | ||||||
|   printf ("  Discr:             %d\n", Ptr_Glob->Discr); |   printf ("  Discr:             %d\n", Ptr_Glob->Discr); | ||||||
|   printf ("        should be:   %d\n", 0); |   printf ("        should be:   %d\n", 0); | ||||||
| @@ -223,7 +223,7 @@ main () | |||||||
|   printf ("  Str_Comp:          %s\n", Ptr_Glob->variant.var_1.Str_Comp); |   printf ("  Str_Comp:          %s\n", Ptr_Glob->variant.var_1.Str_Comp); | ||||||
|   printf ("        should be:   DHRYSTONE PROGRAM, SOME STRING\n"); |   printf ("        should be:   DHRYSTONE PROGRAM, SOME STRING\n"); | ||||||
|   printf ("Next_Ptr_Glob->\n"); |   printf ("Next_Ptr_Glob->\n"); | ||||||
|   printf ("  Ptr_Comp:          %d\n", (int) Next_Ptr_Glob->Ptr_Comp); |   printf ("  Ptr_Comp:          %d\n", (long) Next_Ptr_Glob->Ptr_Comp); | ||||||
|   printf ("        should be:   (implementation-dependent), same as above\n"); |   printf ("        should be:   (implementation-dependent), same as above\n"); | ||||||
|   printf ("  Discr:             %d\n", Next_Ptr_Glob->Discr); |   printf ("  Discr:             %d\n", Next_Ptr_Glob->Discr); | ||||||
|   printf ("        should be:   %d\n", 0); |   printf ("        should be:   %d\n", 0); | ||||||
|   | |||||||
| @@ -1,4 +1,5 @@ | |||||||
| #include "platform.h" | #include "platform.h" | ||||||
|  | #include <unistd.h> | ||||||
| #ifndef ITERATIONS | #ifndef ITERATIONS | ||||||
| #define ITERATIONS 20000 | #define ITERATIONS 20000 | ||||||
| #endif | #endif | ||||||
| @@ -6,20 +7,16 @@ | |||||||
| /* The functions in this file are only meant to support Dhrystone on an | /* The functions in this file are only meant to support Dhrystone on an | ||||||
|  * embedded RV32 system and are obviously incorrect in general. */ |  * embedded RV32 system and are obviously incorrect in general. */ | ||||||
|  |  | ||||||
| long time(void) | long time(void) { return get_timer_value(); } | ||||||
| { |  | ||||||
|   return get_timer_value(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // set the number of dhrystone iterations | // set the number of dhrystone iterations | ||||||
| void __wrap_scanf(const char* fmt, int* n) | void __wrap_scanf(const char *fmt, int *n) { *n = ITERATIONS; } | ||||||
| { |  | ||||||
|   *n = ITERATIONS; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| extern volatile uint32_t tohost; | // extern volatile uint64_t tohost; | ||||||
|  |  | ||||||
| void exit(int n){ | void exit(int n) { | ||||||
|       tohost = 0x1; |   // tohost = 0x1; | ||||||
|       for (;;); |   write_hex(STDERR_FILENO, 1); | ||||||
|  |   for (;;) | ||||||
|  |     ; | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								hello-world/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								hello-world/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,2 +1,3 @@ | |||||||
| /hello | /hello | ||||||
| /hello.dis | /hello.dis | ||||||
|  | build/ | ||||||
							
								
								
									
										13
									
								
								hello-world/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								hello-world/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | cmake_minimum_required(VERSION 3.21) | ||||||
|  | project(hello-world C) | ||||||
|  | set(TARGET hello) | ||||||
|  | add_executable(${TARGET} hello.c) | ||||||
|  |  | ||||||
|  | set(BOARD "iss" CACHE STRING "Target board") | ||||||
|  | add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../bare-metal-bsp bsp) | ||||||
|  | target_link_libraries(${TARGET} PRIVATE bsp) | ||||||
|  | target_link_options(${TARGET} PRIVATE LINKER:-Map=${TARGET}.map)   | ||||||
|  |  | ||||||
|  | add_custom_command(TARGET ${TARGET} POST_BUILD | ||||||
|  |         COMMAND ${CMAKE_OBJDUMP} -S  ${TARGET}.elf > ${TARGET}.dis | ||||||
|  |         COMMENT "Creating disassembly for ${TARGET}") | ||||||
							
								
								
									
										122
									
								
								hello-world/CMakePresets.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								hello-world/CMakePresets.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,122 @@ | |||||||
|  | { | ||||||
|  |     "version": 3, | ||||||
|  |     "vendor": { | ||||||
|  |         "conan": {} | ||||||
|  |     }, | ||||||
|  |     "cmakeMinimumRequired": { | ||||||
|  |         "major": 3, | ||||||
|  |         "minor": 24, | ||||||
|  |         "patch": 0 | ||||||
|  |     }, | ||||||
|  |     "configurePresets": [ | ||||||
|  |         { | ||||||
|  |             "name": "32imc", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../bare-metal-bsp/cmake/rv32imc.cmake" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "64imc", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/../bare-metal-bsp/cmake/rv64gc.cmake" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "iss", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "BOARD": "iss" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "moonlight", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "BOARD": "moonlight" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "tgc_vp", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "BOARD": "tgc_vp" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "rtl", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "BOARD": "rtl" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "debug", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "CMAKE_BUILD_TYPE": "Debug" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "release", | ||||||
|  |             "hidden": true, | ||||||
|  |             "cacheVariables": {     | ||||||
|  |                 "CMAKE_BUILD_TYPE": "Release" | ||||||
|  |             }   | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "ISS_Debug", | ||||||
|  |             "inherits": ["iss", "debug", "32imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "Moonlight_Debug", | ||||||
|  |             "inherits": ["moonlight", "debug", "32imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "TGC_VP_Debug", | ||||||
|  |             "inherits": ["tgc_vp", "debug", "32imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "ISS_Debug_64", | ||||||
|  |             "inherits": ["iss", "debug", "64imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "Moonlight_Debug_64", | ||||||
|  |             "hidden": true, | ||||||
|  |             "inherits": ["moonlight", "debug", "64imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "TGC_VP_Debug_64", | ||||||
|  |             "hidden": true, | ||||||
|  |             "inherits": ["tgc_vp", "debug", "64imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "ISS_Release", | ||||||
|  |             "inherits": ["iss", "release", "32imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "Moonlight_Release", | ||||||
|  |             "inherits": ["moonlight", "release", "32imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "TGC_VP_Release", | ||||||
|  |             "inherits": ["tgc_vp", "release", "32imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "ISS_Release_64",         | ||||||
|  |             "inherits": ["iss", "release", "64imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "Moonlight_Release_64", | ||||||
|  |             "hidden": true, | ||||||
|  |             "inherits": ["moonlight", "release", "64imc"] | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "name": "TGC_VP_Release_64", | ||||||
|  |             "hidden": true, | ||||||
|  |             "inherits": ["tgc_vp", "release", "64imc"] | ||||||
|  |         } | ||||||
|  |                   | ||||||
|  |     ] | ||||||
|  | } | ||||||
| @@ -1,4 +1,3 @@ | |||||||
|  |  | ||||||
| TARGET  = hello | TARGET  = hello | ||||||
| ISA?=imc | ISA?=imc | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,24 +1,21 @@ | |||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
|  | #include <sys/types.h> | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
|  |  | ||||||
| #include "platform.h" | #include "platform.h" | ||||||
| #include "encoding.h" | #include <string.h> | ||||||
|  |  | ||||||
| int factorial(int i){ |  | ||||||
|  |  | ||||||
|  | int factorial(int i) { | ||||||
|   volatile int result = 1; |   volatile int result = 1; | ||||||
|   for (int ii = 1; ii <= i; ii++) { |   for (int ii = 1; ii <= i; ii++) { | ||||||
|     result = result * ii; |     result = result * ii; | ||||||
|   } |   } | ||||||
|   return result; |   return result; | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| int main() | int main() { | ||||||
| { |   int result = factorial(10); | ||||||
| 	volatile int result = factorial (10); |   printf("Factorial is %d", result); | ||||||
| 	printf("Factorial is %d\n", result); |  | ||||||
| 	printf("End of execution"); |  | ||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user